diff --git a/src/assets/art/texture_sheet_default_dark.webp b/src/assets/art/texture_sheet_default_dark.webp new file mode 100644 index 00000000..68873b9e Binary files /dev/null and b/src/assets/art/texture_sheet_default_dark.webp differ diff --git a/src/assets/art/texture_sheet_default_light.webp b/src/assets/art/texture_sheet_default_light.webp new file mode 100644 index 00000000..1c8a5aec Binary files /dev/null and b/src/assets/art/texture_sheet_default_light.webp differ diff --git a/src/assets/icons/the-metalworks.png b/src/assets/art/the-metalworks.png similarity index 100% rename from src/assets/icons/the-metalworks.png rename to src/assets/art/the-metalworks.png diff --git a/src/assets/fonts/roboto-slab/LICENSE b/src/assets/fonts/roboto-slab/LICENSE deleted file mode 100644 index c2d27cb3..00000000 --- a/src/assets/fonts/roboto-slab/LICENSE +++ /dev/null @@ -1,192 +0,0 @@ -Copyright 2011-2024 The Roboto Slab Project Authors (https://github.com/googlefonts/robotoslab) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -------------------------------------------------------------------------- - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/src/assets/fonts/roboto-slab/RobotoSlab-Bold.ttf b/src/assets/fonts/roboto-slab/RobotoSlab-Bold.ttf deleted file mode 100644 index 8a597f2d..00000000 Binary files a/src/assets/fonts/roboto-slab/RobotoSlab-Bold.ttf and /dev/null differ diff --git a/src/assets/fonts/roboto-slab/RobotoSlab-Regular.ttf b/src/assets/fonts/roboto-slab/RobotoSlab-Regular.ttf deleted file mode 100644 index faaa4463..00000000 Binary files a/src/assets/fonts/roboto-slab/RobotoSlab-Regular.ttf and /dev/null differ diff --git a/src/assets/fonts/roboto/LICENSE b/src/assets/fonts/roboto/LICENSE deleted file mode 100644 index e5d1dbc0..00000000 --- a/src/assets/fonts/roboto/LICENSE +++ /dev/null @@ -1,192 +0,0 @@ -Copyright 2011-2024 The Roboto Project Authors (https://github.com/googlefonts/roboto) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -------------------------------------------------------------------------- - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/src/assets/fonts/roboto/Roboto-Bold.woff2 b/src/assets/fonts/roboto/Roboto-Bold.woff2 deleted file mode 100644 index a73ce84a..00000000 Binary files a/src/assets/fonts/roboto/Roboto-Bold.woff2 and /dev/null differ diff --git a/src/assets/fonts/roboto/Roboto-BoldItalic.woff2 b/src/assets/fonts/roboto/Roboto-BoldItalic.woff2 deleted file mode 100644 index fa0f28a5..00000000 Binary files a/src/assets/fonts/roboto/Roboto-BoldItalic.woff2 and /dev/null differ diff --git a/src/assets/fonts/roboto/Roboto-Italic.woff2 b/src/assets/fonts/roboto/Roboto-Italic.woff2 deleted file mode 100644 index 5ec46a3c..00000000 Binary files a/src/assets/fonts/roboto/Roboto-Italic.woff2 and /dev/null differ diff --git a/src/assets/fonts/roboto/Roboto-Regular.woff2 b/src/assets/fonts/roboto/Roboto-Regular.woff2 deleted file mode 100644 index 49713b47..00000000 Binary files a/src/assets/fonts/roboto/Roboto-Regular.woff2 and /dev/null differ diff --git a/src/assets/icons/dice/d20white.svg b/src/assets/icons/svg/dice/d20white.svg similarity index 100% rename from src/assets/icons/dice/d20white.svg rename to src/assets/icons/svg/dice/d20white.svg diff --git a/src/assets/icons/svg/sheet/border_bar.svg b/src/assets/icons/svg/sheet/border_bar.svg index 01fea917..3bffa2cf 100644 --- a/src/assets/icons/svg/sheet/border_bar.svg +++ b/src/assets/icons/svg/sheet/border_bar.svg @@ -1,8 +1,8 @@ - - + - - + diff --git a/src/assets/icons/svg/sheet/border_deflect.svg b/src/assets/icons/svg/sheet/border_deflect.svg index 714fbb2f..a712032a 100644 --- a/src/assets/icons/svg/sheet/border_deflect.svg +++ b/src/assets/icons/svg/sheet/border_deflect.svg @@ -2,7 +2,7 @@ - diff --git a/src/assets/icons/svg/sheet/border_sheet_corner.svg b/src/assets/icons/svg/sheet/border_sheet_corner.svg index e8b2932b..0e07aea5 100644 --- a/src/assets/icons/svg/sheet/border_sheet_corner.svg +++ b/src/assets/icons/svg/sheet/border_sheet_corner.svg @@ -2,7 +2,7 @@ - - + + + + diff --git a/src/assets/icons/svg/sheet/mask_attribute_right.svg b/src/assets/icons/svg/sheet/mask_attribute_right.svg new file mode 100644 index 00000000..8b1a1e0d --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_attribute_right.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/mask_bar.svg b/src/assets/icons/svg/sheet/mask_bar.svg new file mode 100644 index 00000000..264a1b53 --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_bar.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/mask_defense.svg b/src/assets/icons/svg/sheet/mask_defense.svg new file mode 100644 index 00000000..7446842d --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_defense.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/mask_deflect.svg b/src/assets/icons/svg/sheet/mask_deflect.svg new file mode 100644 index 00000000..f97b0504 --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_deflect.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/mask_equip_1h_bot.svg b/src/assets/icons/svg/sheet/mask_equip_1h_bot.svg new file mode 100644 index 00000000..1d4c79c8 --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_equip_1h_bot.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/mask_equip_1h_top.svg b/src/assets/icons/svg/sheet/mask_equip_1h_top.svg new file mode 100644 index 00000000..8a538831 --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_equip_1h_top.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/mask_equip_2h.svg b/src/assets/icons/svg/sheet/mask_equip_2h.svg new file mode 100644 index 00000000..9550f2c0 --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_equip_2h.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/mask_level.svg b/src/assets/icons/svg/sheet/mask_level.svg new file mode 100644 index 00000000..c434b13b --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_level.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/src/assets/icons/svg/sheet/mask_stat.svg b/src/assets/icons/svg/sheet/mask_stat.svg new file mode 100644 index 00000000..c2eb5f3c --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_stat.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/mask_tab_closed.svg b/src/assets/icons/svg/sheet/mask_tab_closed.svg new file mode 100644 index 00000000..e656e719 --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_tab_closed.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/mask_tab_open.svg b/src/assets/icons/svg/sheet/mask_tab_open.svg new file mode 100644 index 00000000..9f65bb5f --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_tab_open.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/mask_tier.svg b/src/assets/icons/svg/sheet/mask_tier.svg new file mode 100644 index 00000000..0e349606 --- /dev/null +++ b/src/assets/icons/svg/sheet/mask_tier.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/src/assets/icons/svg/sheet/rest_button_long.svg b/src/assets/icons/svg/sheet/rest_button_long.svg new file mode 100644 index 00000000..2f776332 --- /dev/null +++ b/src/assets/icons/svg/sheet/rest_button_long.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/sheet/rest_button_scene.svg b/src/assets/icons/svg/sheet/rest_button_scene.svg new file mode 100644 index 00000000..3f745604 --- /dev/null +++ b/src/assets/icons/svg/sheet/rest_button_scene.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/sheet/rest_button_short.svg b/src/assets/icons/svg/sheet/rest_button_short.svg new file mode 100644 index 00000000..28dfca62 --- /dev/null +++ b/src/assets/icons/svg/sheet/rest_button_short.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/sheet/star_cosmere.svg b/src/assets/icons/svg/sheet/star_cosmere.svg index 8329639c..deb63c15 100644 --- a/src/assets/icons/svg/sheet/star_cosmere.svg +++ b/src/assets/icons/svg/sheet/star_cosmere.svg @@ -1,8 +1,8 @@ - - + - - - - - - - - - - diff --git a/src/assets/icons/ui/border_attribute_right.svg b/src/assets/icons/ui/border_attribute_right.svg deleted file mode 100644 index bd1fa0c4..00000000 --- a/src/assets/icons/ui/border_attribute_right.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - diff --git a/src/assets/icons/ui/border_bar.svg b/src/assets/icons/ui/border_bar.svg deleted file mode 100644 index 01fea917..00000000 --- a/src/assets/icons/ui/border_bar.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/src/assets/icons/ui/border_full_100x100.svg b/src/assets/icons/ui/border_full_100x100.svg deleted file mode 100644 index 87d471c5..00000000 --- a/src/assets/icons/ui/border_full_100x100.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/src/assets/icons/ui/border_level.svg b/src/assets/icons/ui/border_level.svg deleted file mode 100644 index b321f520..00000000 --- a/src/assets/icons/ui/border_level.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/src/assets/icons/ui/border_tier.svg b/src/assets/icons/ui/border_tier.svg deleted file mode 100644 index b07b73a4..00000000 --- a/src/assets/icons/ui/border_tier.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - diff --git a/src/assets/icons/ui/equip-1h-bottom.svg b/src/assets/icons/ui/equip-1h-bottom.svg deleted file mode 100644 index 58c20556..00000000 --- a/src/assets/icons/ui/equip-1h-bottom.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/assets/icons/ui/equip-1h-top.svg b/src/assets/icons/ui/equip-1h-top.svg deleted file mode 100644 index 2261aaa1..00000000 --- a/src/assets/icons/ui/equip-1h-top.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/assets/icons/ui/equip-2h.svg b/src/assets/icons/ui/equip-2h.svg deleted file mode 100644 index a89dabe7..00000000 --- a/src/assets/icons/ui/equip-2h.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index b359830f..60e99413 100644 --- a/src/index.ts +++ b/src/index.ts @@ -178,29 +178,42 @@ function registerItemSheet( */ function configureFonts() { Object.assign(CONFIG.fontDefinitions, { - Roboto: { + 'Laski Sans': { editor: true, fonts: [ { urls: [ - `systems/${SYSTEM_ID}/assets/fonts/roboto/Roboto-Regular.woff2`, + 'https://dl.dropboxusercontent.com/scl/fi/hurpbzjvud4y79wzo1qmy/laskisans-regular.woff2?rlkey=x0zcwzfm6eebo32sspe2k4vaf&st=an65ir3o&raw=1&t=.woff2', ], }, { urls: [ - `systems/${SYSTEM_ID}/assets/fonts/roboto/Roboto-Bold.woff2`, + 'https://dl.dropboxusercontent.com/scl/fi/bjc6al0vethbf2iuzwyyx/laskisans-regular-italic.woff2?rlkey=jhzcjg9lhtz2i2txqalo99gli&st=66dgwytm&raw=1&t=.woff2', ], - weight: 'bold', + style: 'italic', + }, + { + urls: [ + 'https://dl.dropboxusercontent.com/scl/fi/a4jijkz42ipmdyitpmbxd/laskisans-semibold.woff2?rlkey=wbluvl1zwltyo3q9bu3jrvg0y&st=ce9ca470&raw=1&t=.woff2', + ], + weight: 600, }, { urls: [ - `systems/${SYSTEM_ID}/assets/fonts/roboto/Roboto-Italic.woff2`, + 'https://dl.dropboxusercontent.com/scl/fi/e5wxxfoi8mdsgegune2xj/laskisans-semibold-italic.woff2?rlkey=y6kqrwr8bmnidc2ekk5ki0pa8&st=p8sdfoqw&raw=1&t=.woff2', ], + weight: 600, style: 'italic', }, { urls: [ - `systems/${SYSTEM_ID}/assets/fonts/roboto/Roboto-BoldItalic.woff2`, + 'https://dl.dropboxusercontent.com/scl/fi/hkmjpw6sw4pyezj557h78/laskisans-bold.woff2?rlkey=lhw92l3utcsi5hjgxylap7clq&st=8h5hzj3k&raw=1&t=.woff2', + ], + weight: 'bold', + }, + { + urls: [ + 'https://dl.dropboxusercontent.com/scl/fi/vr2aztvrotqq1kfvte764/laskisans-bold-italic.woff2?rlkey=xpcjdvbpt29z3vhj5p6gyk2a1&st=ae1h3tg0&raw=1&t=.woff2', ], weight: 'bold', style: 'italic', @@ -236,29 +249,31 @@ function configureFonts() { }, ], }, - 'Roboto Slab': { + 'Penumbra Serif Std': { editor: true, fonts: [ { urls: [ - `systems/${SYSTEM_ID}/assets/fonts/roboto-slab/RobotoSlab-Regular.ttf`, + 'https://dl.dropboxusercontent.com/scl/fi/2j1lf6u9bomt98kczfp6y/penumbraserifstd-semibold.woff2?rlkey=bokq6lhb03ykbev021r897ek8&st=338qxdqi&raw=1&t=.woff2', ], + weight: 600, }, { urls: [ - `systems/${SYSTEM_ID}/assets/fonts/roboto-slab/RobotoSlab-Bold.ttf`, + 'https://dl.dropboxusercontent.com/scl/fi/xuudjnlwwgznlofmgsv3o/penumbraserifstd-bold.woff2?rlkey=lqvjr1dsdnrph2dux1kocltgo&st=61a55kr9&raw=1&t=.woff2', ], weight: 'bold', }, ], }, - 'Penumbra Web Pro': { - editor: true, + 'Penumbra Serif Std SC': { + editor: false, fonts: [ { urls: [ - `https://fonts.cdnfonts.com/s/56565/PenumbraWebPro-Serif.woff`, + 'https://dl.dropboxusercontent.com/scl/fi/42lf0vdev5a3fu61fxgfn/penumbraserifstd-smallcaps.woff2?rlkey=6tbcbf7kx43mb8pjpi9rr6rfy&st=hcfdsj9s&raw=1&t=.woff2', ], + weight: 600, }, ], }, @@ -267,7 +282,17 @@ function configureFonts() { fonts: [ { urls: [ - `https://dl.dropboxusercontent.com/scl/fi/9909gen4fd0oveyzfposx/CosmereDingbats-Regular.otf?rlkey=ig6odq9hxyo1st8kt3ujp1czz&st=72qrads3&raw=1`, + 'https://dl.dropboxusercontent.com/scl/fi/e9olw2h4gnnxue5utcv0b/cosmeredingbats-regular.woff2?rlkey=ff8qwiubwtsno06cwtrow68z3&st=gulsaibc&raw=1&t=.woff2', + ], + }, + ], + }, + 'Shally Handwritten': { + editor: true, + fonts: [ + { + urls: [ + 'https://dl.dropboxusercontent.com/scl/fi/xogyrq7wvzbhc77nlv0fx/shally-regular.woff2?rlkey=2eui52g7ervpt0n0wj7calg3a&st=mi4swhe8&raw=1&t=.woff2', ], }, ], diff --git a/src/lang/en.json b/src/lang/en.json index 8bbed73f..3775b548 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -152,15 +152,15 @@ }, "Item": { "Edit": "Edit", - "Details": "View details", + "Details": "View/Hide Details", "Remove": "Remove" }, "Actions": { "label": "Actions", - "Activation": "Use", + "Activation": "Action", "Consume": "Cost", "Uses": "Uses", - "Use": "Use action", + "Use": "Use Action", "Strike": "Strike", "BaseSectionName": "{type} Actions", "MiscSectionName": "Miscellaneous Actions", @@ -208,8 +208,9 @@ "AncestryPlaceholder": "Add Ancestry", "CulturePlaceholder": "Add Culture", "PathPlaceholder": "Add Path", - "ShortRest": "Short rest", - "LongRest": "Long rest", + "EndScene": "End Scene", + "ShortRest": "Short Rest", + "LongRest": "Long Rest", "ToggleShowSkills": "Show skills without ranks", "ToggleCollapseSkills": "Hide skills without ranks", "ConfigureDefense": "Configure Defense", @@ -227,16 +228,18 @@ }, "Search": { "Item": { - "Placeholder": "Search Actions" + "Placeholder": "Search actions" }, "Equipment": { - "Placeholder": "Search Items" + "Placeholder": "Search items" }, "Effects": { - "Placeholder": "Search Effects" + "Placeholder": "Search effects" }, - "Clear": "Clear search", - "ChangeSortDirection": "Change sort direction" + "Clear": "Clear Filters", + "Filter": "Filter By", + "SortManually": "Sort Manually", + "SortAlphabetically": "Sort Alphabetically" }, "Details": { "Purpose": "Purpose", @@ -881,8 +884,7 @@ "Welcome": "

Welcome to the Cosmere RPG System!

Thank you for trying out the community-developed Cosmere Roleplaying Game system! You're currently using version {version}. As this is an early release, some bugs or missing features are to be expected, but your feedback will help us improve the system.

For discussions, updates, and support, join us on the Metalworks Discord server.

If you encounter any issues or have suggestions, we'd love to hear from you! Please report them on our GitHub Issues page or on the Metalworks Discord. Be sure to review the contribution guidelines if you'd like to get involved in development.

We're excited to have you on board and hope you enjoy playing in the Cosmere!

" }, "Theme": { - "Default": "Default", - "Stormlight": "Stormlight Archive" + "Default": "Default" } }, "DICE": { diff --git a/src/style.scss b/src/style.scss index 05a2b2f6..fb3fc9a8 100644 --- a/src/style.scss +++ b/src/style.scss @@ -4,55 +4,67 @@ /* Globals */ /* ----------------------------------------- */ :root { - --plotweaver-color-black: #000; - --plotweaver-color-dark-1: #111; - --plotweaver-color-dark-2: #222; - --plotweaver-color-dark-3: #333; - --plotweaver-color-dark-4: #444; - --plotweaver-color-dark-5: #555; - --plotweaver-color-dark-6: #666; - --plotweaver-color-dark-7: #777; - --plotweaver-color-light-1: #888; - --plotweaver-color-light-2: #999; - --plotweaver-color-light-3: #aaa; - --plotweaver-color-light-4: #bbb; - --plotweaver-color-light-5: #ccc; - --plotweaver-color-light-6: #ddd; - --plotweaver-color-light-7: #eee; - --plotweaver-color-white: #fff; - - --plotweaver-color-off-white-1: #f8f4f1; - --plotweaver-color-off-white-2: #f0f0e0; - - --plotweaver-color-complication: #ab3d38; - --plotweaver-color-complication-text: #ab3d38; - --plotweaver-color-complication-background: #ffdddd; - --plotweaver-color-opportunity: #1e3c60; - --plotweaver-color-opportunity-text: #7fa4e9; - --plotweaver-color-opportunity-background: #dde5ff; - --plotweaver-color-parchment: #f1ebe8; - - --plotweaver-color-health-front: #286f3e; - --plotweaver-color-health-back: #6b1b2a; - --plotweaver-color-focus-front: #6e45e4; - --plotweaver-color-focus-back: #281c4a; - --plotweaver-color-invest-front: #3e6abb; - --plotweaver-color-invest-back: #182845; - - --plotweaver-background-25: rgb(0 0 0 / 25%); - --plotweaver-background-10: rgb(0 0 0 / 10%); - --plotweaver-background-5: rgb(0 0 0 / 5%); - - --plotweaver-shadow-15: rgba(0, 0, 0, 0.15); - --plotweaver-shadow-45: rgba(0, 0, 0, 0.45); - --plotweaver-shadow-85: rgba(0, 0, 0, 0.85); - - --plotweaver-shadow-svg: drop-shadow(0 0 4px rgba(255, 0, 0, 0.6)); - - --plotweaver-font-normal: "Roboto", sans-serif; - --plotweaver-font-header: "Roboto Slab", serif; - --plotweaver-font-condensed: "Roboto Condensed", sans-serif; - --plotweaver-font-icons: "Cosmere Dingbats"; + --cosmere-color-black: #000; + --cosmere-color-dark-1: #111; + --cosmere-color-dark-2: #222; + --cosmere-color-dark-3: #333; + --cosmere-color-dark-4: #444; + --cosmere-color-dark-5: #555; + --cosmere-color-dark-6: #666; + --cosmere-color-dark-7: #777; + --cosmere-color-light-1: #888; + --cosmere-color-light-2: #999; + --cosmere-color-light-3: #aaa; + --cosmere-color-light-4: #bbb; + --cosmere-color-light-5: #ccc; + --cosmere-color-light-6: #ddd; + --cosmere-color-light-7: #eee; + --cosmere-color-white: #fff; + + --cosmere-color-off-white-1: #f8f4f1; + --cosmere-color-off-white-2: #f0f0e0; + + --cosmere-color-complication: #ab3d38; + --cosmere-color-complication-text: #ab3d38; + --cosmere-color-complication-background: #ffdddd; + --cosmere-color-opportunity: #1e3c60; + --cosmere-color-opportunity-text: #7fa4e9; + --cosmere-color-opportunity-background: #dde5ff; + --cosmere-color-parchment: #f1ebe8; + + --cosmere-color-health-front: #286f3e; + --cosmere-color-health-back: #6b1b2a; + --cosmere-color-focus-front: #6e45e4; + --cosmere-color-focus-back: #281c4a; + --cosmere-color-invest-front: #3e6abb; + --cosmere-color-invest-back: #182845; + + --cosmere-background-25: rgb(0 0 0 / 25%); + --cosmere-background-10: rgb(0 0 0 / 10%); + --cosmere-background-5: rgb(0 0 0 / 5%); + + --cosmere-shadow-15: rgba(0, 0, 0, 0.15); + --cosmere-shadow-25: rgba(0, 0, 0, 0.25); + --cosmere-shadow-35: rgba(0, 0, 0, 0.35); + --cosmere-shadow-45: rgba(0, 0, 0, 0.45); + --cosmere-shadow-55: rgba(0, 0, 0, 0.55); + --cosmere-shadow-65: rgba(0, 0, 0, 0.65); + --cosmere-shadow-75: rgba(0, 0, 0, 0.75); + --cosmere-shadow-85: rgba(0, 0, 0, 0.85); + + --cosmere-shadow-svg: drop-shadow(0 0 4px rgba(255, 0, 0, 0.6)); + --cosmere-drop-shadow: drop-shadow(0px 0px 8px var(--cosmere-shadow-55)); + --cosmere-sheet-shadow: drop-shadow(0px 0px 10px var(--cosmere-shadow-85)); + + --cosmere-font-normal: "Laski Sans", sans-serif; + --cosmere-font-header: "Penumbra Serif Std", serif; + --cosmere-font-header-sc: "Penumbra Serif Std SC", serif; + --cosmere-font-condensed: "Roboto Condensed", sans-serif; + --cosmere-font-icons: "Cosmere Dingbats"; + + --font-size-8: 0.5rem; + --font-size-9: 0.563rem; + --font-size-22: 1.375rem; /* ----------------------------------------- */ /* Default Generic Theme */ @@ -60,63 +72,43 @@ .cosmere-theme-default { //TO-DO: Replace with Plotweaver colours &.theme-dark { - --plotweaver-color-accent : #ffcb74; - --plotweaver-color-accent-filter: invert(87%) sepia(11%) saturate(2171%) hue-rotate(332deg) brightness(101%) contrast(102%); - --plotweaver-color-faded: #f6f6f6; - --plotweaver-color-sheet: #111111; - - --plotweaver-color-base-1: #000000; - --plotweaver-color-base-2: #1f1f1f; - --plotweaver-color-base-3: #2f2f2f; - --plotweaver-color-base-4: #3f3f3f; - --plotweaver-color-base-5: #4f4f4f; - --plotweaver-color-base-6: #5f5f5f; + --cosmere-sheet-texture: url('assets/art/texture_sheet_default_dark.webp'); + + --cosmere-color-accent : #888888; + --cosmere-color-faded: #646464; + --cosmere-color-sheet: #111111; + --cosmere-color-neutral: var(--cosmere-color-dark-1); + + --cosmere-color-base-1: #171717; + --cosmere-color-base-2: #1f1f1f; + --cosmere-color-base-3: #2f2f2f; + --cosmere-color-base-4: #3f3f3f; + --cosmere-color-base-5: #4f4f4f; + --cosmere-color-base-6: #5f5f5f; + + --cosmere-color-text-main: var(--cosmere-color-white); + --cosmere-color-text-sub: var(--cosmere-color-off-white-2); + --cosmere-color-text-accent: var(--cosmere-color-accent); } - &.theme-light { - --plotweaver-color-accent: #fff; - --plotweaver-color-faded: #fff; - --plotweaver-color-sheet: #fff; - - --plotweaver-color-base-1: #fff; - --plotweaver-color-base-2: #fff; - --plotweaver-color-base-3: #fff; - --plotweaver-color-base-4: #fff; - --plotweaver-color-base-5: #fff; - --plotweaver-color-base-6: #fff; - } - } + &.theme-light { + --cosmere-sheet-texture: url('assets/art/texture_sheet_default_light.webp'); - /* ----------------------------------------- */ - /* Stormlight Archive Theme */ - /* ----------------------------------------- */ - .cosmere-theme-stormlight { - //TO-DO: Move to Stormlight Archive module - &.theme-dark { - --plotweaver-color-accent: #c9a760; - --plotweaver-color-accent-filter: invert(83%) sepia(4%) saturate(4272%) hue-rotate(356deg) brightness(85%) contrast(83%); - --plotweaver-color-faded: #5e6c7e; - --plotweaver-color-sheet: #132137; - - --plotweaver-color-base-1: #010e2d; - --plotweaver-color-base-2: #10213e; - --plotweaver-color-base-3: #1b2d49; - --plotweaver-color-base-4: #263c5e; - --plotweaver-color-base-5: #456a95; - --plotweaver-color-base-6: #506684; - } + --cosmere-color-accent: #1f1f1f; + --cosmere-color-faded: #707070; + --cosmere-color-sheet: #e3e3e3; + --cosmere-color-neutral: var(--cosmere-color-light-2); + + --cosmere-color-base-1: #bababa; + --cosmere-color-base-2: #e3e3e3; + --cosmere-color-base-3: #e3e3e3; + --cosmere-color-base-4: #adadad; + --cosmere-color-base-5: #777777; + --cosmere-color-base-6: #878787; - &.theme-light { - --plotweaver-color-accent: #ff0000; - --plotweaver-color-faded: #fff; - --plotweaver-color-sheet: #fff; - - --plotweaver-color-base-1: #fff; - --plotweaver-color-base-2: #fff; - --plotweaver-color-base-3: #fff; - --plotweaver-color-base-4: #fff; - --plotweaver-color-base-5: #fff; - --plotweaver-color-base-6: #fff; + --cosmere-color-text-main: var(--cosmere-color-accent); + --cosmere-color-text-sub: #2f2f2f; + --cosmere-color-text-accent: #030303; } } } @@ -124,43 +116,35 @@ /* ----------------------------------------- */ /* Fonts */ /* ----------------------------------------- */ -@import url('https://fonts.googleapis.com/css2?family=Didact+Gothic&display=swap'); -@import url('https://fonts.cdnfonts.com/css/penumbra-web-pro'); .application h1, -span.document-name { - font-family: 'Penumbra Web Pro'; - font-variant: small-caps; - - input { - font-variant: inherit; - } -} - -.application h4 { - font-family: "Didact Gothic", sans-serif; +.application h4, +.application h5, +span.document-name { + font-family: var(--cosmere-font-normal); } -.application h5 { - font-family: "Didact Gothic", sans-serif; +.application { + font-family: var(--cosmere-font-normal); + box-shadow: none; + filter: var(--cosmere-sheet-shadow); } -.application { - font-family: "Didact Gothic", sans-serif; - font-size: 10pt; +.application p { + font-size: var(--font-size-12); } span.cosmere-icon, em.cosmere-icon, i.cosmere-icon { - font-family: var(--plotweaver-font-icons) !important; + font-family: var(--cosmere-font-icons) !important; &.complication-color { - color: var(--plotweaver-color-complication-text); + color: var(--cosmere-color-complication-text); } &.complication { - color: var(--plotweaver-color-complication); + color: var(--cosmere-color-complication); &::after { content: 'C'; @@ -168,11 +152,11 @@ i.cosmere-icon { } &.opportunity-color { - color: var(--plotweaver-color-opportunity-text); + color: var(--cosmere-color-opportunity-text); } &.opportunity { - color: var(--plotweaver-color-opportunity); + color: var(--cosmere-color-opportunity); &::after { content: 'O'; diff --git a/src/style/chat/module.scss b/src/style/chat/module.scss index 06a09995..85c4f890 100644 --- a/src/style/chat/module.scss +++ b/src/style/chat/module.scss @@ -3,10 +3,11 @@ border-width: 1px; border-block-end-width: 2px; border-radius: 6px; - font-family: var(--plotweaver-font-normal); + font-family: var(--cosmere-font-normal); font-size: var(--font-size-13); + font-variant: lining-nums; position: relative; - background: var(--plotweaver-color-parchment); + background: var(--cosmere-color-parchment); .overlay { text-align: center !important; @@ -32,7 +33,7 @@ &:hover { cursor: pointer; - filter: var(--plotweaver-shadow-svg); + filter: var(--cosmere-shadow-svg); } } } @@ -51,6 +52,10 @@ } } + .cosmere-icon + .overlay { + bottom: 0; + } + .message-header { margin-bottom: 0.5rem; position: relative; @@ -75,12 +80,12 @@ width: 38px; height: 38px; border-radius: 100%; - box-shadow: 0 0 6px var(--plotweaver-shadow-85); + box-shadow: 0 0 6px var(--cosmere-shadow-85); object-fit: cover; object-position: top; border: none; flex: none; - background: var(--plotweaver-color-dark-3); + background: var(--cosmere-color-dark-3); } } @@ -94,24 +99,28 @@ } .title { - font-family: var(--plotweaver-font-header); + font-family: var(--cosmere-font-normal); font-size: var(--font-size-16); + line-height: 16px; + padding-top: 0.25rem; font-weight: bold; - color: var(--plotweaver-color-dark-3); + color: var(--cosmere-color-dark-3); } .subtitle { font-size: var(--font-size-11); - color: var(--plotweaver-color-dark-6); + color: var(--cosmere-color-dark-6); } .message-metadata { font-size: var(--font-size-10); transform: translate(2px, -4px); flex: none; + gap: 0.25rem; + display: flex; time { - color: var(--plotweaver-color-dark-6); + color: var(--cosmere-color-dark-6); } } } @@ -126,13 +135,13 @@ .chat-card-section { padding: 0.5rem; - border: 1px solid var(--plotweaver-color-light-1); + border: 1px solid var(--cosmere-color-light-1); border-radius: 3px; - background: var(--plotweaver-color-off-white-1); + background: var(--cosmere-color-off-white-1); overflow: hidden; &.critical { - border: 3px double var(--plotweaver-color-opportunity); + border: 3px double var(--cosmere-color-opportunity); } &.description { @@ -144,22 +153,22 @@ & > img { width: 32px; height: 32px; - border: 2px solid var(--plotweaver-color-dark-3); - box-shadow: 0 0 4px var(--plotweaver-shadow-45); + border: 2px solid var(--cosmere-color-dark-3); + box-shadow: 0 0 4px var(--cosmere-shadow-45); border-radius: 0; - background-color: var(--plotweaver-color-dark-6); + background-color: var(--cosmere-color-dark-6); object-fit: cover; object-position: top; } & > .icon { font-size: var(--font-size-16); - color: var(--plotweaver-color-opportunity); + color: var(--cosmere-color-opportunity); padding-right: 0.25rem; &.clickable:hover { cursor: pointer; - filter: var(--plotweaver-shadow-svg); + filter: var(--cosmere-shadow-svg); } } @@ -170,10 +179,10 @@ flex-direction: column; .title { - font-family: var(--plotweaver-font-header); - font-size: var(--font-size-14); + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-15); font-weight: bold; - color: var(--plotweaver-color-dark-1); + color: var(--cosmere-color-dark-1); &.undone { strong { @@ -184,15 +193,15 @@ .subtitle { font-size: var(--font-size-10); - color: var(--plotweaver-color-dark-6); + color: var(--cosmere-color-dark-6); } .traits { font-size: var(--font-size-10); - color: var(--plotweaver-color-dark-6); + color: var(--cosmere-color-dark-6); strong { - color: var(--plotweaver-color-opportunity); + color: var(--cosmere-color-opportunity); font-weight: 600; } } @@ -200,7 +209,7 @@ } .details { - font-family: var(--plotweaver-font-normal); + font-family: var(--cosmere-font-normal); font-size: var(--font-size-11); padding: 0; @@ -225,10 +234,10 @@ .summary { .name-stacked { .title { - font-size: var(--font-size-13); + font-size: var(--font-size-14); strong { - color: var(--plotweaver-color-complication); + color: var(--cosmere-color-complication); } } } @@ -239,10 +248,10 @@ .summary { .name-stacked { .title { - font-size: var(--font-size-13); + font-size: var(--font-size-14); strong { - color: var(--plotweaver-color-health-front); + color: var(--cosmere-color-health-front); } } } @@ -251,7 +260,7 @@ .section-header { margin-bottom: 0.25rem; - font-family: var(--plotweaver-font-normal); + font-family: var(--cosmere-font-normal); display: flex; justify-content: space-between; align-items: flex-start; @@ -267,8 +276,9 @@ margin-bottom: 0.1rem; } - .subtitle { - font-size: var(--font-size-12); + .subtitle { + font-weight: 600; + font-size: var(--font-size-13); display: flex; justify-content: flex-end; align-items: center; @@ -276,20 +286,20 @@ font-style: italic; .skill { - font-weight: 600; - color: var(--plotweaver-color-opportunity); + font-weight: bold; + color: var(--cosmere-color-opportunity); } .attribute { - color: var(--plotweaver-color-light-2); + color: var(--cosmere-color-light-2); text-transform: uppercase; } } .types { font-size: var(--font-size-10); - font-family: var(--plotweaver-font-condensed); - color: var(--plotweaver-color-dark-6) !important; + font-family: var(--cosmere-font-condensed); + color: var(--cosmere-color-dark-6) !important; font-weight: 600; text-transform: uppercase; } @@ -302,17 +312,10 @@ .dice-result { .dice-roll-injury, - .dice-roll-d20 { - height: 32px; - } - - .dice-roll-damage { - height: 36px; - } - .dice-roll-d20, .dice-roll-damage { display: flex; + height: 36px; } .dice-tooltip { @@ -354,12 +357,12 @@ margin: 0; &.success, &.max { - color: var(--plotweaver-color-opportunity); + color: var(--cosmere-color-opportunity); filter: sepia(1) hue-rotate(180deg); } &.failure, &.min { - color: var(--plotweaver-color-complication); + color: var(--cosmere-color-complication); filter: sepia(0.8) hue-rotate(-50deg); } @@ -377,13 +380,13 @@ } .constant { - font-family: var(--plotweaver-font-normal); + font-family: var(--cosmere-font-normal); font-weight: bold; font-size: var(--font-size-16); margin-left: 0.25rem; .sign { - color: var(--plotweaver-color-light-2); + color: var(--cosmere-color-light-2); font-weight: normal; margin-right: 2px; } @@ -398,22 +401,22 @@ position: relative; .label { - font-family: var(--plotweaver-font-condensed); + font-family: var(--cosmere-font-condensed); font-size: var(--font-size-10); - color: var(--plotweaver-color-dark-6); + color: var(--cosmere-color-dark-6); text-transform: uppercase; text-align: center; } .value { - font-family: var(--plotweaver-font-normal); - color: var(--plotweaver-color-dark-1); + font-family: var(--cosmere-font-normal); + color: var(--cosmere-color-dark-1); font-weight: bold; font-size: var(--font-size-20); } .sign { - color: var(--plotweaver-color-light-2); + color: var(--cosmere-color-light-2); font-weight: normal; margin-right: 2px; } @@ -423,7 +426,8 @@ .dice-formula, .dice-total { border-radius: 3px; - background: var(--plotweaver-background-5); + background: var(--cosmere-background-5); + font-weight: 600; padding: 0.25rem; line-height: normal; flex: auto; @@ -432,10 +436,10 @@ } .dice-formula.graze::before { - font-family: var(--plotweaver-font-normal); + font-family: var(--cosmere-font-normal); font-size: var(--font-size-10); font-weight: 600; - color: var(--plotweaver-color-light-2); + color: var(--cosmere-color-light-2); text-align: left !important; flex-grow: 1; @@ -455,10 +459,11 @@ .dice-total { font-weight: bold; - font-size: var(--font-size-24); - font-family: var(--plotweaver-font-normal); - color: var(--plotweaver-color-dark-1); - padding: 0; + font-size: var(--font-size-22); + font-family: var(--cosmere-font-header); + line-height: 36px; + color: var(--cosmere-color-dark-1); + padding: 0.125rem; position: relative; &.ignored { @@ -466,15 +471,24 @@ } &.opportunity { - color: var(--plotweaver-color-opportunity); - background: var(--plotweaver-color-opportunity-background); - border-color: var(--plotweaver-color-opportunity); + color: var(--cosmere-color-opportunity); + background: var(--cosmere-color-opportunity-background); + border-color: var(--cosmere-color-opportunity); } &.complication { - color: var(--plotweaver-color-complication); - background: var(--plotweaver-color-complication-background); - border-color: var(--plotweaver-color-complication); + color: var(--cosmere-color-complication); + background: var(--cosmere-color-complication-background); + border-color: var(--cosmere-color-complication); + } + + &:has(.cosmere-icon) { + line-height: 32px; + } + + .cosmere-icon { + vertical-align: middle; + font-size: var(--font-size-18); } } @@ -486,6 +500,7 @@ .dice-subtotal { transition: all 200ms ease; + line-height: normal; padding: 0 0.5rem; font-weight: 600; display: flex; @@ -493,15 +508,15 @@ width: 20%; .value { - color: var(--plotweaver-color-dark-6); + color: var(--cosmere-color-dark-6); font-size: var(--font-size-12); - font-family: var(--plotweaver-font-normal); + font-family: var(--cosmere-font-normal); } .label { - color: var(--plotweaver-color-light-1); + color: var(--cosmere-color-light-1); font-size: var(--font-size-10); - font-family: var(--plotweaver-font-condensed); + font-family: var(--cosmere-font-condensed); text-transform: uppercase; } @@ -514,18 +529,19 @@ &.left { padding-left: 20%; - border-right: 1px solid var(--plotweaver-color-light-4); + border-right: 1px solid var(--cosmere-color-light-4); } &.right { padding-right: 20%; - border-left: 1px solid var(--plotweaver-color-light-4); + border-left: 1px solid var(--cosmere-color-light-4); } .value { - color: var(--plotweaver-color-dark-1); - font-size: var(--font-size-24); - font-family: var(--plotweaver-font-normal); + color: var(--cosmere-color-dark-1); + font-size: var(--font-size-22); + font-family: var(--cosmere-font-header); + padding-top: 0.375rem; } .label { @@ -535,7 +551,7 @@ } .dice-total.opportunity .dice-subtotal.active .value { - color: var(--plotweaver-color-opportunity); + color: var(--cosmere-color-opportunity); } } } @@ -548,7 +564,7 @@ align-items: center; gap: 0.25rem; font-size: var(--font-size-11); - font-family: var(--plotweaver-font-normal); + font-family: var(--cosmere-font-normal); font-weight: bold; text-transform: uppercase; @@ -557,7 +573,7 @@ } & > i:first-of-type { - color: var(--plotweaver-color-light-2); + color: var(--cosmere-color-light-2); } } @@ -565,14 +581,14 @@ & > label::after { content: ""; flex-basis: 50%; - border-top: 1px dotted var(--plotweaver-color-dark-6); + border-top: 1px dotted var(--cosmere-color-dark-6); align-self: center; } .target-headers { - color: var(--plotweaver-color-light-2); + color: var(--cosmere-color-light-2); font-size: var(--font-size-10); - font-family: var(--plotweaver-font-condensed); + font-family: var(--cosmere-font-condensed); font-weight: 600; text-transform: uppercase; display: flex; @@ -599,25 +615,25 @@ align-items: center; cursor: pointer; font-size: var(--font-size-13); - font-family: var(--plotweaver-font-normal); + font-family: var(--cosmere-font-normal); font-weight: bold; .name { - color: var(--plotweaver-color-dark-1); + color: var(--cosmere-color-dark-1); width: 55%; } .result { - color: var(--plotweaver-color-dark-4); + color: var(--cosmere-color-dark-4); width: 15%; text-align: center; .success { - color: var(--plotweaver-color-health-front) + color: var(--cosmere-color-health-front) } .failure { - color: var(--plotweaver-color-complication) + color: var(--cosmere-color-complication) } } } @@ -660,7 +676,7 @@ padding-top: 5px; text-align: right !important; display: flex; - font-family: var(--plotweaver-font-normal); + font-family: var(--cosmere-font-normal); position: static; button { @@ -681,15 +697,15 @@ } &.damage { - color: var(--plotweaver-color-complication); + color: var(--cosmere-color-complication); } &.healing { - color: var(--plotweaver-color-health-front); + color: var(--cosmere-color-health-front); } &.focus { - color: var(--plotweaver-color-focus-front); + color: var(--cosmere-color-focus-front); } } } diff --git a/src/style/sheets/actor/adversary.scss b/src/style/sheets/actor/adversary.scss index a4f424ee..c9467bf2 100644 --- a/src/style/sheets/actor/adversary.scss +++ b/src/style/sheets/actor/adversary.scss @@ -1,254 +1,59 @@ -.sheet.actor.adversary.minimized {border: none;} - .sheet.actor.adversary { - border: 3px solid var(--plotweaver-color-accent); - background: var(--plotweaver-color-sheet); - - nav { - >a { - left: -2px; - } - } - - .decorations { - position: absolute; - top: 0; - left: 0; - z-index: -1; - - width: 100%; - height: 100%; - border: none; - - .top.left { - position: absolute; - width: 50px; - height: 50px; - - top: calc(-2.25rem - 3px); - left: -3px; - - path { - fill: var(--plotweaver-color-accent); - } - } - - .top.right { - position: absolute; - width: 50px; - height: 50px; - transform: scale(-1, 1); - - top: calc(-2.25rem - 3px); - right: -3px; - - path { - fill: var(--plotweaver-color-accent); - } - } - - .bot.left { - position: absolute; - width: 50px; - height: 50px; - transform: scale(1, -1); + --border-tier-svg: url('assets/icons/svg/sheet/border_tier.svg'); + --mask-tier-svg: url('assets/icons/svg/sheet/mask_tier.svg'); - bottom: -3px; - left: -3px; - - path { - fill: var(--plotweaver-color-accent); - } - } - - .bot.right { - position: absolute; - width: 50px; - height: 50px; - transform: scale(-1, -1); - - bottom: -3px; - right: -3px; - - path { - fill: var(--plotweaver-color-accent); - } - } - } + max-width: 800px; + max-height: 800px; .sheet-header { .title { - .document-name{ - text-transform: capitalize; - color: var(--plotweaver-color-accent); - } - - .details { - text-transform: uppercase; - color: var(--plotweaver-color-faded); + .details { + color: var(--cosmere-color-text-sub); + display: flex; + align-items: center; + gap: 0.375rem; + + select { + text-transform: uppercase; + width: auto; + height: auto; + line-height: normal; + } } } - .level-details { - .level { - .container { - width: 42px; - height: 42px; + .level { + .container { + width: 42px; + height: 42px; - .border { - position: absolute; - left: -2px; - top: -2px; - width: calc(100% + 4px); - height: calc(100% + 4px); - border-image: url("/systems/cosmere-rpg/assets/icons/ui/border_level.svg") fill 21 / 42px; - filter: var(--plotweaver-color-accent-filter); - pointer-events: none; - z-index: 1; - } + .background { + mask: var(--mask-tier-svg) no-repeat center; + } + + .border { + mask: var(--border-tier-svg) no-repeat center; + } - svg { - path { - fill: var(--plotweaver-color-base-4); - } - } + .value { + font-size: var(--font-size-24); + line-height: 46px; } } } } - section.skills { - margin-top: 1rem; - min-height: 0; + .skills-column { display: flex; flex-direction: column; - - header { - display: flex; - margin-bottom: 0.25rem; - - span { - flex: 1; - } - - a { - width: 1rem; - margin-left: 0.25rem; - } - } - - section { - min-height: 0; - overflow-y: auto; - padding: 3px; - } - } - - /* --- Components --- */ - - app-adversary-header { - margin-top: 1rem; + gap: 0.675rem; } - app-actor-attributes { - margin-top: 0.5rem; - } - - app-adversary-skills-group { - position: relative; - - &:has(> *) { - display: flex; - padding: 0.4rem 0.2rem; - margin-bottom: calc(1.25rem - 1px); - - background: var(--plotweaver-color-base-1); - - .border { - position: absolute; - left: -3px; - top: -3px; - width: calc(100% + 6px); - height: calc(100% + 6px); - pointer-events: none; - border-image: none; - filter: none; - - .corner{ - position: absolute; - width: 10px; - height: 10px; - - &.top { - top: 0; - - &.right { - right: 0; - transform: scale(-1, 1); - } - } - - &.bot { - bottom: 0; - transform: scale(1, -1); - - &.right { - right: 0; - transform: scale(-1, -1); - } - } - - &.left { - left: 0; - } - - path { - fill: var(--plotweaver-color-accent); - } - } - - .block { - position: absolute; - width: 10px; - height: 10px; - - &.top { - top: 0; - right: 9px; - width: calc(100% - 18px); - } - - &.bot { - bottom: 0; - right: 9px; - width: calc(100% - 18px); - transform: scale(1, -1); - } - - &.right { - right: 0; - top: 9px; - height: calc(100% - 18px); - transform: scale(-1, 1); - } - - &.left { - left: 0; - top: 9px; - height: calc(100% - 18px); - } - - path { - fill: var(--plotweaver-color-accent); - } - } - } - } - - app-actor-skill { - .name { - white-space: nowrap; - } + .adversary-expertises { + margin-top: 0.675rem; + + .icon-header { + color: var(--cosmere-color-faded); } } } diff --git a/src/style/sheets/actor/character.scss b/src/style/sheets/actor/character.scss index be9eaacd..308ed869 100644 --- a/src/style/sheets/actor/character.scss +++ b/src/style/sheets/actor/character.scss @@ -1,718 +1,310 @@ -.sheet.actor.character.minimized {border: none;} - .sheet.actor.character { - border: 3px solid var(--plotweaver-color-accent); - background: var(--plotweaver-color-sheet); + --border-level-svg: url('assets/icons/svg/sheet/border_level.svg'); + --mask-level-svg: url('assets/icons/svg/sheet/mask_level.svg'); - .minimized { - border: none; - } + max-width: 800px; + max-height: 900px; .sheet-header { .title { - padding-left: 1rem; - } - - .document-name { - text-transform: capitalize; - - margin: 0; - border-bottom: none; - } - } - - .cultures-placeholder { - border: 1px dashed; - align-items: center; - justify-content: center; - padding: 0.5rem 1rem; - opacity: 0.5; - box-shadow: 0 0 1rem 0.1rem black; - background: #00000036; - text-align: center; - border-radius: 0.3rem; - margin-bottom: 1rem; - } - - /* --- Tabs --- */ + padding-left: 1.25rem; - .tab.split { - flex-direction: row; - - > section { - flex: 1; - - &:not(:first-child) { - margin-left: 0.25rem; - } - - &:not(:last-child) { - margin-right: 0.25rem; + .details { + color: var(--cosmere-color-text-accent); } } - } - .tab[data-tab='goals'] { - .details-text { - .label { - color: var(--plotweaver-color-off-white-1); - opacity: 0.5; - } + .level { + .container { + width: 58px; + height: 58px; - textarea { - color: var(--plotweaver-color-off-white-1); - margin-top: 0.5rem; - background: var(--plotweaver-color-base-3); - padding: 0.3rem 0.5rem; - min-height: 5rem; - font-family: inherit; - border: 1px solid var(--plotweaver-color-accent); - - &:read-only { - background: var(--plotweaver-color-base-4); - border: none; + .background { + mask: var(--mask-level-svg) no-repeat center; + } + + .border { + mask: var(--border-level-svg) no-repeat center; } - } - } - } - - /* --- Components --- */ - - app-actor-details { - .derived-statistics { - margin-top: 1.75rem; - gap: 0.25rem; - } - } - - app-actor-attributes { - margin: 1rem 0; - } - - app-character-expertises { - .header { - display: flex; - flex-direction: row; - align-items: center; - margin-top: 1rem; - - .title { - flex: 1; - color: var(--plotweaver-color-off-white-1); - } - } - - .expertises { - display: flex; - flex-direction: row; - flex-wrap: wrap; - margin-top: 0.2rem; - gap: 0.25rem; - .expertise { - color: var(--plotweaver-color-off-white-1); - border: 1px solid var(--plotweaver-color-off-white-1); - padding: 0.15rem 0.6rem; - border-radius: 1rem; - margin: 0.2rem; - font-size: 8pt; + .value { + font-size: var(--font-size-28); + line-height: 62px; + } } } } - app-character-ancestry, app-character-culture { - position: relative; - display: flex; - margin-bottom: 1rem; + .drop-area { display: flex; - flex-direction: row; align-items: center; - text-shadow: 0 0 0.5rem black; - - background: var(--plotweaver-color-base-1); - - .ancestry, .culture { - display: flex; - flex-direction: column; - flex: 1; - z-index: 1; - cursor: pointer; - padding: 0.2rem 1rem 0.1rem 1rem; - - .border { - position: absolute; - left: -2px; - top: -2px; - width: calc(100% + 4px); - height: calc(100% + 4px); - pointer-events: none; - border-image: none; - filter: none; - - .corner{ - position: absolute; - width: 10px; - height: 10px; - - &.top { - top: 0; - - &.right { - right: 0; - transform: scale(-1, 1); - } - } - - &.bot { - bottom: 0; - transform: scale(1, -1); - - &.right { - right: 0; - transform: scale(-1, -1); - } - } - - &.left { - left: 0; - } - - path { - fill: var(--plotweaver-color-accent); - } - } - - .block { - position: absolute; - width: 10px; - height: 10px; - - &.top { - top: 0; - right: 9px; - width: calc(100% - 18px); - } - - &.bot { - bottom: 0; - right: 9px; - width: calc(100% - 18px); - transform: scale(1, -1); - } - - &.right { - right: 0; - top: 9px; - height: calc(100% - 18px); - transform: scale(-1, 1); - } - - &.left { - left: 0; - top: 9px; - height: calc(100% - 18px); - } - - path { - fill: var(--plotweaver-color-accent); - } - } - } - - .name { - font-size: 13pt; - font-weight: bold; - color: var(--plotweaver-color-off-white-1); - text-transform: uppercase; - } + justify-content: center; + height: 32px; + border: 2px dotted var(--cosmere-color-faded); + border-radius: 4px; + background-color: var(--cosmere-color-sheet); + + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-12); + font-weight: 600; + color: var(--cosmere-color-faded); + text-transform: uppercase; + filter: var(--cosmere-drop-shadow); - .item-type { - font-size: 9pt; - opacity: 0.75; - color: var(--plotweaver-color-accent); - text-transform: uppercase; - } + opacity: 0.5; - &:not(.placeholder):hover { - text-shadow: 0 0 8px var(--color-shadow-primary); - } + &.dropping { + opacity: 1; } + } - .controls { - margin-right: 1rem; - z-index: 1; + .details-text { + .icon-header { + color: var(--cosmere-color-faded); } - .background-img { - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - opacity: 0.25; - overflow: hidden; - - img { - position: relative; - width: 100%; - top: -6rem; - } - } - - &:has(> .placeholder) { - border: 1px dashed; - align-items: center; - justify-content: center; - padding: 0.5rem 1rem; - opacity: 0.5; - box-shadow: 0 0 1rem 0.1rem black; - background: #00000036; - text-align: center; + textarea { + border: none; + outline: 0; + box-shadow: none; + border-radius: 6px; + background-color: var(--cosmere-color-base-3); + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-11); + font-weight: 600; + color: var(--cosmere-color-text-sub); + min-height: 80px; + padding: 0.375rem; + margin-top: 0.375rem; + scrollbar-color: var(--cosmere-color-base-6) var(--color-scrollbar-track); } } - app-character-paths-list { - .path { - position: relative; - margin-bottom: 1rem; - - display: flex; - flex-direction: column; + .bullet-list { + .bullet { + font-size: 0.375rem; + } - background: var(--plotweaver-color-base-2); - text-shadow: 0 0 0.5rem black; - box-shadow: 0 0 0.5rem black; - - .border { - position: absolute; - left: -2px; - top: -2px; - width: calc(100% + 4px); - height: calc(100% + 4px); - pointer-events: none; - border-image: none; - filter: none; - - .corner{ - position: absolute; - width: 10px; - height: 10px; - - &.top { - top: 0; - - &.right { - right: 0; - transform: scale(-1, 1); - } - } - - &.bot { - bottom: 0; - transform: scale(1, -1); - - &.right { - right: 0; - transform: scale(-1, -1); - } - } - - &.left { - left: 0; - } - - path { - fill: var(--plotweaver-color-accent); - } - } + .item { + padding: 0 0.375rem; - .block { - position: absolute; - width: 10px; - height: 10px; - - &.top { - top: 0; - right: 9px; - width: calc(100% - 18px); - } - - &.bot { - bottom: 0; - right: 9px; - width: calc(100% - 18px); - transform: scale(1, -1); - } - - &.right { - right: 0; - top: 9px; - height: calc(100% - 18px); - transform: scale(-1, 1); - } - - &.left { - left: 0; - top: 9px; - height: calc(100% - 18px); - } - - path { - fill: var(--plotweaver-color-accent); - } - } + &.achieved .fade { + opacity: 0.4; } .details { - display: flex; - flex-direction: row; - align-items: center; - padding: 0.2rem 1rem 0 1rem; - z-index: 1; - cursor: pointer; - - .name { - display: flex; - flex-direction: column; - flex: 1; - z-index: 1; - color: var(--plotweaver-color-accent); - text-transform: uppercase; - - .label { - font-size: 13pt; - font-weight: bold; - color: var(--plotweaver-color-off-white-1); - text-transform: uppercase; - } - - .item-type { - font-size: 9pt; - opacity: 0.75; - } - } - - .level { - font-size: 14pt; - font-weight: bold; - z-index: 1; - } - - .name, - .level { - &:hover { - text-shadow: 0 0 8px var(--color-shadow-primary); - } - } + gap: 0.375rem; .controls { - margin-left: 1rem; - z-index: 1; + width: auto; } - - &:not(:has(+ .skill-list)) { - padding-bottom: 0.2rem; - } - } - - .skill-list { - list-style: none; - margin: 0; - padding: 0; - padding-top: 0.8rem; - padding-bottom: 0.3rem; - background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, .4) 40%); - z-index: 1; } - .background-img { - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - opacity: 0.25; - overflow: hidden; - - img { - position: relative; - width: 100%; - top: -6rem; - } + &.new { + min-height: 30px; + background-color: color(from var(--cosmere-color-base-3) srgb r g b / 0.4); + border-radius: 0 0 6px 6px; + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-11); + font-weight: 600; + color: var(--cosmere-color-faded); } } } - app-character-goals-list, - app-character-connections-list { - position: relative; - margin-top: 1rem; - display: flex; - flex-direction: column; - - .goals-list, - .connections-list { - list-style: none; - padding: 0; - margin: 0 0 0.3rem 0; - - .goal, - .connection { - display: flex; - align-items: center; - - margin: 0; - padding: 0 0.5rem; - - background: var(--plotweaver-color-base-4); + .hide-completed { + margin-top: 0.375rem; + font-size: var(--font-size-10); + font-weight: 600; + color: var(--cosmere-color-faded); + text-align: right; + } - &:not(.collapsed):not(:first-child):not(:last-child) { - border-bottom: 1px dashed var(--plotweaver-color-base-6); - height:auto; - min-height: 1.5rem; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - } + /* --- Components --- */ - &:not(.details) { - height: 2rem; - } + app-character-favorites { + display: flex; + flex-direction: column; + margin-top: 0.5rem; - &.details { - font-size: 10pt; + .icon-header { + color: var(--cosmere-color-faded); + } - > *:first-child { - margin-top: 0; - } - } + .favorite-list { + margin-top: 0.375rem; - &.header { - background: var(--plotweaver-color-base-1); - border-top-left-radius: 0.3rem; - border-top-right-radius: 0.3rem; - } + & > li { + margin-bottom: 0.375rem; + } - &.collapsed { - visibility: hidden; - height: 0; - } + .item { + padding: 0; + background-color: transparent; - &:last-child { - border-bottom-left-radius: 0.3rem; - border-bottom-right-radius: 0.3rem; + .detail { + width: auto; } - &.new { - background: var(--plotweaver-color-base-2); - justify-content: center; - - a { - opacity: 0.6; - - &:hover { - opacity: 1; - } - } + .controls { + width: auto; } + } + } + } - &.achieved { - > * { - opacity: 0.5; - } - - > i { - opacity: 0.25; - } - } + app-character-expertises { + .icon-header { + color: var(--cosmere-color-faded); + } - > i { - font-size: 5pt; - opacity: 0.5; - } + .expertises { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 0.25rem; + margin-top: 0.375rem; + } - .title { - flex: 1; - margin-left: 0.5rem; + .expertise { + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-11); + font-weight: 600; + color: var(--cosmere-color-faded); + border: 1px solid var(--cosmere-color-faded); + padding: 0.15rem 0.4rem; + border-radius: 10px; + background-color: var(--cosmere-color-base-2); + } + } - &.toggle-details { - cursor: pointer; - } + app-character-ancestry, + app-character-culture { + .border-box { + background-color: var(--cosmere-color-neutral); + } + } - &.inactive { - display: none; - } - } + app-character-paths-list { + display: flex; + flex-direction: column; + gap: 0.625rem; + } - .progress-pips { - list-style: none; - flex-direction: row; - display: flex; - margin: 0; - padding: 0; - width: 3rem; - - li { - border: 1px solid var(--plotweaver-color-faded); - width: 0.75rem; - height: 0.75rem; - border-radius: 50%; - background: var(--plotweaver-color-base-1); - margin: 0 0.1rem; - - &.active { - background: currentColor; - } - } - } + app-character-paths-list .path { + .border-box { + background-color: var(--cosmere-color-base-2); + } + } - .controls { - display: flex; + app-character-ancestry, + app-character-culture, + app-character-paths-list .path { + position: relative; - a { - width: 1rem; - display: block; - text-align: center; - } - } - } + .border-box { + mask: radial-gradient(8px at 8px 8px, transparent 98%, black) -8px -8px; } - .goals-list { - .goal { - &:not(:first-child):not(:last-child) { - border-bottom: 1px solid #463a47 !important; - height: auto; - min-height: 1.5rem; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - } - } - } + .wrapper { + border: 2px solid var(--cosmere-color-accent); + border-radius: 0; + z-index: 1; + position: relative; + } - .connections-list { - .connection { - &:nth-child(even):not(:last-child) { - border-bottom: 1px solid #463a47 !important; - height: auto; - min-height: 1.5rem; - padding-top: 0.25rem; - padding-bottom: 0.25rem; - } - } + .details { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; } - .bottom-controls { + .title { display: flex; - justify-content: flex-end; + padding: 0.375rem 1.125rem; + flex-direction: column; + cursor: pointer; + text-transform: uppercase; - a:not(.active) { - opacity: 0.5; + .name { + font-family: var(--cosmere-font-header); + font-size: var(--font-size-14); + line-height: 14px; + padding-top: 0.25rem; + color: var(--cosmere-color-text-main); - &:hover { - opacity: 1; - } + display: flex; + align-items: flex-start; + justify-content: space-between; } - .label { - margin-right: 0.2rem; + .controls { + margin-left: 0.125rem; + font-size: var(--font-size-10); + color: var(--cosmere-color-text-sub); } - } - } - - app-character-favorites.list-component { - margin-top: 1rem; - display: flex; - flex-direction: column; - .header { - font-size: 12pt; - color: #f7d856; - } - - .drop-area { - display: flex; - align-items: center; - justify-content: center; - height: 2rem; - border: 1px dashed; - opacity: 0.5; - border-radius: 0.3rem; - box-shadow: 0 0 1rem 0.1rem black; - margin-top: 0.5rem; - - &.dropping { - opacity: 1; + .item-type { + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-10); + font-weight: bold; + color: var(--cosmere-color-text-accent); } } - .favorites-list { + .skill-list { + display: flex; + flex-direction: column; margin: 0; + padding: 0 0.625rem 0.375rem; + list-style: none; - .favorite { - background: unset; - padding: 0; - border-bottom: none !important; - - .col.name { - font-size: 10pt; - margin-left: 0; - padding-left: 0.5rem; - min-width: 0; - - .subtitle { - font-size: 6.5pt; - white-space: nowrap; - width: 100%; - text-overflow: ellipsis; - overflow: hidden; - } - } - - .col.activation { - width: 2rem; - text-align: right; + .skill { + list-style: none; + } + } - .cosmere-icon { - opacity: 1; - } - } + .level { + .container { + width: 44px; + height: 44px; - .col.controls { - width: unset; - margin-left: 0.5rem; + .star { + position: absolute; + left: 1px; + top: 1px; + width: calc(100% - 2px); + height: calc(100% - 2px); + background-color: var(--cosmere-color-faded); + mask: var(--star-cosmere-svg) no-repeat center; + opacity: 0.5; } - &.usable { - .img:hover, - .img:has(+ .name:hover), - .img:has(+ .activation:hover) { - .roll-icon { - display: block; - opacity: 0.6; - animation: rotating 2s linear infinite; - width: 90%; - height: 90%; - } - } + .value { + font-size: var(--font-size-20); + line-height: 48px; } } + } + + .background-img { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + right: 0; + opacity: 0.3; + overflow: hidden; + pointer-events: none; + filter: saturate(0); - .drop-indicator { - height: 1px; - background: #af38d4; - border-radius: 1px; - box-shadow: 0 0 0.3rem 0 #af38d4; - opacity: 0.75; + img { + position: relative; + width: 100%; + top: -80px; } } } -} - -@keyframes rotating { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} +} \ No newline at end of file diff --git a/src/style/sheets/actor/module.scss b/src/style/sheets/actor/module.scss index 1356c17b..2c8b99bf 100644 --- a/src/style/sheets/actor/module.scss +++ b/src/style/sheets/actor/module.scss @@ -2,279 +2,241 @@ @import './adversary.scss'; .sheet.actor { - overflow: visible; + --border-sheet-corner-svg: url('assets/icons/svg/sheet/border_sheet_corner.svg'); + --border-corner-svg: url('assets/icons/svg/sheet/border_corner.svg'); + --star-cosmere-svg: url('assets/icons/svg/sheet/star_cosmere.svg'); + + --border-tab-closed-svg: url('assets/icons/svg/sheet/border_tab_closed.svg'); + --mask-tab-closed-svg: url('assets/icons/svg/sheet/mask_tab_closed.svg'); + --border-tab-open-svg: url('assets/icons/svg/sheet/border_tab_open.svg'); + --mask-tab-open-svg: url('assets/icons/svg/sheet/mask_tab_open.svg'); + + --border-deflect-svg: url('assets/icons/svg/sheet/border_deflect.svg'); + --mask-deflect-svg: url('assets/icons/svg/sheet/mask_deflect.svg'); + --border-stat-svg: url('assets/icons/svg/sheet/border_stat.svg'); + --mask-stat-svg: url('assets/icons/svg/sheet/mask_stat.svg'); + --border-bar-svg: url('assets/icons/svg/sheet/border_bar.svg'); + --mask-bar-svg: url('assets/icons/svg/sheet/mask_bar.svg'); + --border-attribute-left-svg: url('assets/icons/svg/sheet/border_attribute_left.svg'); + --mask-attribute-left-svg: url('assets/icons/svg/sheet/mask_attribute_left.svg'); + --border-attribute-right-svg: url('assets/icons/svg/sheet/border_attribute_right.svg'); + --mask-attribute-right-svg: url('assets/icons/svg/sheet/mask_attribute_right.svg'); + --border-defense-svg: url('assets/icons/svg/sheet/border_defense.svg'); + --mask-defense-svg: url('assets/icons/svg/sheet/mask_defense.svg'); + + --mask-equip-2h-svg: url('assets/icons/svg/sheet/mask_equip_2h.svg'); + --mask-equip-1h-top-svg: url('assets/icons/svg/sheet/mask_equip_1h_top.svg'); + --mask-equip-1h-bot-svg: url('assets/icons/svg/sheet/mask_equip_1h_bot.svg'); + + --rest-long-svg: url('assets/icons/svg/sheet/rest_button_long.svg'); + --rest-short-svg: url('assets/icons/svg/sheet/rest_button_short.svg'); + --rest-scene-svg: url('assets/icons/svg/sheet/rest_button_scene.svg'); - .decorations { - position: absolute; - top: 0; - left: 0; - z-index: -1; + overflow: visible; + border: 3px solid var(--cosmere-color-accent); + border-radius: 0; + background-color: var(--cosmere-color-sheet); - width: 100%; - height: 100%; + &.minimized { border: none; - .top.left { - position: absolute; - width: 50px; - height: 50px; - - top: calc(-2.25rem - 3px); - left: -3px; - - path { - fill: var(--plotweaver-color-accent); - } + > .window-corners { + display: none; } - .top.right { - position: absolute; - width: 50px; - height: 50px; - transform: scale(-1, 1); - - top: calc(-2.25rem - 3px); - right: -3px; - - path { - fill: var(--plotweaver-color-accent); - } + > .window-background { + display: none; } - .bot.left { - position: absolute; - width: 50px; - height: 50px; - transform: scale(1, -1); - - bottom: -3px; - left: -3px; + > .window-header { + padding: 0 0.5rem; + } + } - path { - fill: var(--plotweaver-color-accent); + &:not(.minimized) { + > .window-header { + padding: 0 1.875rem; + + #mode-toggle { + display: unset; + } + + .window-title { + visibility: hidden; } } + } - .bot.right { - position: absolute; - width: 50px; - height: 50px; - transform: scale(-1, -1); + > .window-header { + background: transparent; + position: relative; + z-index: 1; + border: none; + align-items: center; + filter: var(--cosmere-drop-shadow); - bottom: -3px; - right: -3px; + button.header-control { + color: var(--cosmere-color-text-sub); + + &:hover { + box-shadow: none; + text-shadow: 0 0 5px var(--color-shadow-primary); + } - path { - fill: var(--plotweaver-color-accent); + &:focus { + outline: none; + box-shadow: none; } } - } - .window-content { - overflow: visible; + #mode-toggle { + display: none; + } } - > .window-header { + > .window-corners { + position: absolute; + top: -3px; + left: -3px; + right: -3px; + bottom: -3px; border: none; - background: none; + display: flex; + flex-direction: column; + justify-content: space-between; + filter: var(--cosmere-drop-shadow); - #mode-toggle { - display: none; + .corner { + width: 50px; + height: 50px; + background-color: var(--cosmere-color-accent); + mask: var(--border-sheet-corner-svg) no-repeat center; } - } - &:not(.minimized) > .window-header { - #mode-toggle { - display: unset; + .corner-pair { + display: flex; + justify-content: space-between; } - .window-title { - visibility: hidden; + .bot { + transform: scaleY(-1); } - } - > *:not(.window-header) { - .controls-dropdown.expanded { - max-height: unset; + .right { + transform: scaleX(-1); } } - nav { - // Tab icons and navigation - border: none; - flex-direction: column; + > .window-background { position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: none; - left: calc(100% + 2px); - top: 20%; - gap: calc(0.75rem + 3px); - - > a { - position: relative; - width: 34px; - height: 36px; - left: -1px; + .texture { + background-image: var(--cosmere-sheet-texture); + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + } + .banners { display: flex; - align-items: center; - justify-content: center; - transition: 0s; - - color: var(--plotweaver-color-accent); - background: var(--plotweaver-color-sheet); - - .border { - position: absolute; - left: -2px; - top: -2px; - width: calc(100% + 4px); - height: calc(100% + 4px); - border-image: url("/systems/cosmere-rpg/assets/icons/ui/border_tab_closed.svg") fill 16 / 32px; - filter: var(--plotweaver-color-accent-filter); - pointer-events: none; - } - - &.active { - width: 39px; - background-color: var(--plotweaver-color-base-4); - left: 1px; + flex-direction: column; + justify-content: space-between; + width: 100%; + height: 100%; + position: relative; - .border { - position: absolute; - left: -2px; - top: -2px; - width: calc(100% + 4px); - height: calc(100% + 4px); - filter: var(--plotweaver-color-accent-filter); - pointer-events: none; - } + .top, .bot { + height: 200px; } - label { - position: absolute; - z-index: 1; - padding: 3px; - top: 85%; - - visibility: hidden; - text-shadow: none; + .top { + background-image: var(--cosmere-banner-top); } - &:hover { - label { - transition-delay: 1s; - visibility: visible; - padding: 3px; - - color: var(--plotweaver-color-off-white-1); - background-color: var(--plotweaver-color-sheet); - border: 1px solid var(--plotweaver-color-faded); - border-radius: 3px; - } + .bot { + background-image: var(--cosmere-banner-bot); } } } + > .window-content { + backdrop-filter: blur(0rem); + overflow: visible; + padding: 0 1.875rem; + } + + input[type="text"], + input[type="number"], + select { + margin: 0; + padding: 0; + text-align: left; + font-size: inherit; + font-weight: inherit; + font-variant: inherit; + color: inherit; + background: transparent; + border: none; + border-radius: 0; + outline: none; + box-shadow: none; + } + .sheet-header { - width: 100%; - padding: 0 0.5rem; - margin-bottom: 1rem; + margin-top: 0.5rem; .title { flex-direction: column; align-items: flex-start; - .document-name > input { - margin: 0; - text-align: left; - font-size: inherit; - background-color: var(--plotweaver-color-base-3); - color: var(--plotweaver-color-off-white-1); - } - - .document-name{ + .document-name { + font-family: var(--cosmere-font-header-sc); + font-weight: 600; + font-size: var(--font-size-48); text-transform: capitalize; - color: var(--plotweaver-color-off-white-1); + color: var(--cosmere-color-text-main); } .details { + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-15); + font-weight: bold; text-transform: uppercase; - color: var(--plotweaver-color-accent); - font-size: 10pt; - margin-top: 0.3rem; + display: flex; + align-items: center; + justify-content: flex-start; + flex-wrap: wrap; + gap: 0.25rem; .delim { - color: var(--plotweaver-color-off-white-1); - opacity: 0.5; - } - - select { - width: unset; + color: var(--cosmere-color-faded); } } } - .level-details { + .level-details { flex: unset; display: flex; align-items: center; - .advance { - margin-top: 1rem; - font-size: 13pt; - } - .level { - display: flex; - flex-direction: column; - align-items: center; - margin-top: -0.5rem; - - .label { - color: var(--plotweaver-color-off-white-1); - text-transform: uppercase; - font-size: 8pt; - z-index: 1; - margin-bottom: 2px; - } - - .container { - position: relative; - display: flex; - align-items: center; - text-align: center; - - background-color: var(--plotweaver-color-sheet); - - width: 58px; - height: 58px; - - .border { - position: absolute; - left: -2px; - top: -2px; - width: calc(100% + 4px); - height: calc(100% + 4px); - border-image: url("/systems/cosmere-rpg/assets/icons/ui/border_level.svg") fill 29 / 58px; - filter: var(--plotweaver-color-accent-filter); - pointer-events: none; - z-index: 1; - } - - svg { + .container { + .star { position: absolute; - - path { - fill: var(--plotweaver-color-base-4); - } - } - - .value { - color: var(--plotweaver-color-off-white-1); - z-index: 1; - font-size: 2rem; - - margin-bottom: 2px; + left: 1px; + top: 1px; + width: calc(100% - 2px); + height: calc(100% - 2px); + background-color: var(--cosmere-color-faded); + mask: var(--star-cosmere-svg) no-repeat center; + opacity: 0.5; } } } @@ -282,1064 +244,1081 @@ } .sheet-content { - // Positioning of content - width: 100%; - padding: 0.5rem; + margin-top: 1.5rem; + display: flex; + align-content: flex-start; align-items: flex-start; - flex: 1; + gap: 1.125rem; .col-left { + width: 180px; height: 100%; display: flex; flex-direction: column; - - width: 26%; flex: unset; + padding-bottom: 0.75rem; + + .scroll-container { + width: calc(100% + 0.875rem); + padding-right: 0.25rem; + overflow-y: auto; + overflow-x: hidden; + scrollbar-color: var(--cosmere-color-base-6) var(--color-scrollbar-track); + scrollbar-gutter: stable; + filter: var(--cosmere-drop-shadow); + + .scroll-body { + overflow: visible; + } + } } .col-main { - flex: 1; + height: 100%; display: flex; flex-direction: column; - margin-left: 1rem; - height: 100%; - - .tab-body { + padding-bottom: 0.75rem; + + .scroll-container { + margin-top: 1.375rem; + width: calc(100% + 0.875rem); + padding-right: 0.25rem; + overflow-y: auto; + overflow-x: hidden; + scrollbar-color: var(--cosmere-color-base-6) var(--color-scrollbar-track); + scrollbar-gutter: stable; flex: 1; - display: flex; - padding-top: 0.25rem; + filter: var(--cosmere-drop-shadow); - .tab { - flex: 1; + .tab-body { + overflow: visible; } } + } + } - .tab-content.active { - flex: 1; - display: flex; - align-items: flex-start; + .sheet-stack { + display: flex; + flex-direction: column; + align-items: center; + + .label { + font-family: var(--cosmere-font-header); + font-size: var(--font-size-9); + font-weight: 600; + color: var(--cosmere-color-text-sub); + text-transform: uppercase; + text-align: center; + } + + .container { + filter: var(--cosmere-drop-shadow); + position: relative; + text-align: center; + + .background { + position: absolute; + left: 0px; + top: 0px; width: 100%; + height: 100%; + background-color: var(--cosmere-color-base-2); + } - section.skills { - margin: 0 0.5rem; - } + .border { + position: absolute; + left: 0px; + top: 0px; + width: 100%; + height: 100%; + background-color: var(--cosmere-color-accent); + } - section.paths { - display: flex; - flex-direction: column; - height: 100%; - margin: 0 0.5rem; - } + .value { + position: relative; + font-family: var(--cosmere-font-header); + font-weight: 600; + color: var(--cosmere-color-text-main); + z-index: 1; } } } - .value { - text-align: center; - font-size: 18pt; - font-weight: bold; - width: 100%; - } - - /* --- Tabs --- */ - .tab[data-tab] { + display: flex; flex-direction: column; + gap: 0.75rem; + + &.split { + flex-direction: row; + gap: 1.25rem; + + > section { + display: flex; + flex-direction: column; + flex: 1; + gap: 0.625rem; + } + } + + &:not(.active) { + display: none; + } } -} -/* --- Components --- */ + .icon { + &.active { + color: var(--cosmere-color-text-sub); + } -.application { - app-actor-details { - // Actor image and derived statistics + &.faded { + color: var(--cosmere-color-faded); + } + } + + .icon-header { + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-12); + font-weight: bold; + text-transform: uppercase; display: flex; - flex-direction: column; - margin-bottom: 8px; + flex-direction: row; + align-items: center; + justify-content: space-between; - .portrait-info { - // Character sheet portrait values + .title { display: flex; - position: relative; - justify-content: center; + flex-direction: row; + align-items: center; + gap: 0.25rem; + } + } - .portrait { - display: flex; + .collapsible { + .collapsible-content { + display: grid; + grid-template-rows: 0fr; + transition: grid-template-rows 250ms ease; - width: 100%; - aspect-ratio: 1 / 1; + & > .wrapper { overflow: hidden; - - border: 0.3rem solid; - border-radius: 50%; - filter: drop-shadow(2px 4px 6px black); - border-color: var(--plotweaver-color-accent); - - img { - min-width: 100%; - object-fit: cover; - object-position: top; - border: none; - } } + } + + &.expanded .collapsible-content{ + grid-template-rows: 1fr; + } + } - a.rest { - // Short and Long Rest buttons - position: absolute; - width: 1.3rem; - height: 1.3rem; + nav { + border: none; + position: absolute; + flex-direction: column; + align-items: flex-start; + gap: 0.625rem; - color: var(--plotweaver-color-black); - background-color: var(--plotweaver-color-off-white-1); + left: calc(100% + 3px); + top: 20%; - display: flex; - align-items: center; - justify-content: center; - border-radius: 50%; - font-size: 9.5pt; + &.sheet-tabs > [data-tab] { + padding: 0; + } - &.short-rest { - top: 2px; - right: 18px; - } + .sheet-stack { + .container { + width: 32px; + height: 36px; - &.long-rest { - top: 20px; - right: 0; + .background { + mask: var(--mask-tab-closed-svg) no-repeat center; + background-color: var(--cosmere-color-sheet); + } + + .border { + mask: var(--border-tab-closed-svg) no-repeat center; + } + + .value { + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-13); + text-align: center; + color: var(--cosmere-color-text-accent); + line-height: 36px; } } - .deflect { - position: absolute; - top: calc(100% - 1rem); + &.active { + .container { + width: 38px; + height: 36px; + + .background { + mask: var(--mask-tab-open-svg) no-repeat center; + background-color: var(--cosmere-color-base-4); + } + + .border { + mask: var(--border-tab-open-svg) no-repeat center; + } + } } } + } - .derived-statistics { - // Movement, Recover and Sense derived statistics - margin-top: 1.75rem; - gap: 0.25rem; + .item-list { + list-style-type: none; + margin: 0; + padding: 0; - .derived-stat { - display: flex; - flex-direction: column; - align-items: center; - - &.movement, - &.senses { - transform: translateY(-1.20rem); - } - - .container { - width: 54px; - height: 26px; - display: flex; - align-items: center; - justify-content: center; - padding: 0.1rem 0.4rem; - - background-color: var(--plotweaver-color-sheet); - - svg { - position: absolute; - width: 58px; - height: 30px; - pointer-events: none; - - path { - fill: var(--plotweaver-color-accent); - } - } - - .value { - color: var(--plotweaver-color-off-white-1); - font-size: 14pt; - } + & > li { + margin: 0; + list-style-type: none; - .unit { - color: var(--plotweaver-color-faded); - text-transform: uppercase; - font-size: 8pt; + &:not(.favorite) { + &:not(:first-child):not(:last-child) { + border-bottom: 1px dotted var(--cosmere-color-faded); + } + + &:last-child { + border-radius: 0 0 6px 6px; + + &:first-child { + border-radius: 6px; } } - - .label { - text-transform: uppercase; - font-size: 9pt; - margin-top: 0.1rem; - } - } + } } - .deflect { - // Deflect shield + .item { display: flex; - align-items: center; + flex-direction: column; + overflow: hidden; + text-align: center; justify-content: center; - background-color: var(--plotweaver-color-sheet); // url("/systems/cosmere-rpg/assets/icons/ui/border_deflect.svg"); + padding: 0.375rem; + background-color: var(--cosmere-color-base-3); - // Approximation of background - width: calc(2rem - 3px); - height: calc(2.25rem - 3px); - border-bottom-left-radius: 50%; - border-bottom-right-radius: 50%; - - span { - margin: -0.1rem 0 0.3rem 0 !important + .details { + display: flex; + flex-direction: row; + align-items: center; + gap: 0.75rem; } - a[data-action="configure-deflect"] { - position: absolute; - font-size: 6pt; - left: 1.2rem; - top: 0; + .description { + text-align: left; } + + .img { + width: 28px; + height: 28px; + border: 2px solid var(--cosmere-color-accent); + border-radius: 0; - svg { - position: absolute; - width: 32px; - height: 38px; + display: flex; + position: relative; + align-items: center; + justify-content: center; - path { - fill: var(--plotweaver-color-accent); + .roll-icon { + display: none; + position: absolute; + z-index: 1; + border: none; } } - } - } - - app-actor-resource { - display: flex; - flex-direction: column; - position: relative; - - .resource { - display: flex; - flex-direction: column; - align-items: flex-start; - margin-bottom: 8px; - .header { - display: flex; - align-items: center; - width: 100%; - height: 18px; - padding-right: 0.5rem; - - .label { - color: var(--plotweaver-color-faded); - flex: 1; - text-transform: uppercase; - font-size: 8pt; - margin-left: 0.6rem; - height: 18px; + &.usable .img { + cursor: pointer; + + &:hover { + .roll-icon { + display: block; + opacity: 0.6; + animation: rotating 2s linear infinite; + width: 22px; + height: 22px; + } } } - .border { - position: absolute; - top: 18px; - width: 100%; - height: 28px; - border-image: url("/systems/cosmere-rpg/assets/icons/ui/border_bar.svg") fill 14/180px; - filter: var(--plotweaver-color-accent-filter); - z-index: 3; - pointer-events: none; + .title, + .name { + font-family: var(--cosmere-font-normal); + text-align: left; + flex: 1; } - .bar { - width: calc(100% - 3px); - height: 24px; + .title { + margin-left: 0.25rem; + font-size: var(--font-size-15); + font-weight: 600; + color: var(--cosmere-color-text-main); + } + + .name { + font-size: var(--font-size-13); + font-weight: 600; + color: var(--cosmere-color-text-sub); display: flex; - position: relative; - margin: 2px; + flex-direction: column; - &.editable { - cursor: pointer; - } + .traits { + font-size: var(--font-size-10); + font-weight: bold; + font-variant: lining-nums; + color: var(--cosmere-color-faded); - .value { - position: relative; - z-index: 1; - margin-left: 1rem; - text-align: left; - text-shadow: 0 0 0.3rem black; - bottom: 3px; - font-size: 16pt; - - .delim { - font-weight: normal; + .highlight { + color: var(--cosmere-color-text-accent); } } + } - .inner-bar { - position: absolute; - height: 100%; - top: 0; - left: 0; - } - - input { - display: none; - - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - text-align: center; - z-index: 2; + .subtitle, + .detail { + width: 48px; + color: var(--cosmere-color-text-sub); + text-transform: uppercase; - font-weight: bold; - font-size: 18pt; - background: none; - color: inherit; + &.wide { + width: 76px; } - &.editing { - .value { - display: none; - } - - input { - display: block; - } + &.thin { + width: 16px; } } - &.hea { - .bar { - background: var(--plotweaver-color-health-back); + .subtitle { + font-family: var(--cosmere-font-header); + font-size: var(--font-size-8); + } - .inner-bar { - background: var(--plotweaver-color-health-front); - } + .detail { + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-10); + font-weight: 600; + font-variant: lining-nums; + } + + .controls { + width: 34px; + text-align: center; + display: flex; + gap: 0.375rem; + justify-content: flex-end; + + a { + width: 14px; } } - &.foc { - .bar { - background: var(--plotweaver-color-focus-back); + .action, + .quantity { + font-size: var(--font-size-12); + } - .inner-bar { - background: var(--plotweaver-color-focus-front); - } + .quantity, + .duration { + display: flex; + justify-content: space-evenly; + + & > a { + color: var(--cosmere-color-faded); } } - &.inv { - .bar { - background: var(--plotweaver-color-invest-back); - - .inner-bar { - background: var(--plotweaver-color-invest-front); - } + .weight { + & > i { + color: var(--cosmere-color-faded); } } - } - } - app-actor-attributes { - .attribute-group { - display: flex; - flex-direction: column; - margin: 0 5pt; - height: 100%; + .none { + color: var(--cosmere-color-faded); + } - > .label { - margin-bottom: 0.25rem; + .equip { + & > a { + display: flex; + flex-direction: column; + align-items: center; - color: var(--plotweaver-color-off-white-1); - text-align: center; - font-size: 12pt; - text-transform: uppercase; - font-weight: bold; - } + & > i { + font-size: var(--font-size-12); + color: var(--cosmere-color-faded); + + &.equipped { + color: var(--cosmere-color-text-sub); + } + } + } - .attributes { - .attribute { - position: relative; - width: 58px; - height: 50px; + .hold-2h { + width: 48px; + height: 20px; + mask: var(--mask-equip-2h-svg) no-repeat center; + } - .border.right { - position: absolute; - top: 0; - width: 58px; - height: 54px; + .hold-1h { + width: 48px; + height: 10px; - border-image: url("/systems/cosmere-rpg/assets/icons/ui/border_attribute_right.svg") fill 20 / 58px; - filter: var(--plotweaver-color-accent-filter); - pointer-events: none; + &.main-hand { + mask: var(--mask-equip-1h-top-svg) no-repeat center; } - .border.left { - position: absolute; - top: 0; - width: 58px; - height: 54px; + &.off-hand { + mask: var(--mask-equip-1h-bot-svg) no-repeat center; + } + } - border-image: url("/systems/cosmere-rpg/assets/icons/ui/border_attribute_left.svg") fill 20 / 58px; - filter: var(--plotweaver-color-accent-filter); - pointer-events: none; + .hold-2h, + .hold-1h { + background-color: var(--cosmere-color-faded); + + &.equipped { + background-color: var(--cosmere-color-text-sub); } } } + } - > section { - margin-bottom: 0.5rem; + .header { + min-height: 30px; + background-color: var(--cosmere-color-base-1); + border-radius: 6px 6px 0 0; + padding: 0 0.375rem; + + &.basic { + background-color: var(--cosmere-color-dark-1); } } + } - .attribute { - padding: 8px 0; + .conditions-set { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + overflow: hidden; + background-color: var(--cosmere-color-base-3); + border-radius: 0 0 6px 6px; - .box-title { - width: 58px; - margin-bottom: -1.2rem; - z-index: 1; - font-size: 8pt; + &:not(.editable) { + pointer-events: none; + } - color: var(--plotweaver-color-off-white-1); - } + .condition { + padding: 0.375rem; + font-size: var(--font-size-12); - .value { - display: flex; - width: 52px; - height: 48px; - margin-left: 3px; - color: var(--plotweaver-color-off-white-1); + &:is(.active) { + color: var(--cosmere-color-text-sub); - input { - padding-top: 20px; - height: 100%; - font-size: 20pt !important; - padding-bottom: 0.5rem; - background-color: var(--plotweaver-color-sheet); - border: none; + & .condition-icon { + background-color: var(--cosmere-color-text-sub); } } - &:first-child, &:last-child { - .value input { - font-weight: bold; + &:not(.active) { + color: var(--cosmere-color-faded); + + & .condition-icon { + background-color: var(--cosmere-color-faded); } } - } - - .defense { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - svg { - position: absolute; - width: 40px; - height: 50px; - margin-top: 2px; - pointer-events: none; + &:not(:nth-last-child(-n + 3)) { + border-bottom: 1pt dashed var(--cosmere-color-faded); + } - path { - fill: var(--plotweaver-color-accent) - } + &:not(:nth-child(3n)) { + border-right: 1pt dashed var(--cosmere-color-faded); } - .defense-box { + & > a { display: flex; + flex-direction: row; align-items: center; - justify-content: center; - position: relative; - margin-top: 1rem; - - // approximation for the background - background-color: var(--plotweaver-color-base-1); - border-bottom-left-radius: 50%; - border-bottom-right-radius: 50%; - padding-bottom: 0.2rem; - width: calc(40px - 0.2rem); - height: calc(50px - 0.2rem); + gap: 0.375rem; + } - .value { - font-size: 13pt; - } + .name { + font-family: var(--cosmere-font-normal); + text-align: left; + flex: 1; + } - > a { - font-size: 6pt; - position: absolute; - top: 0.1rem; - right: 0.1rem; - } + .condition-icon { + height: 18px; + width: 18px; } } } - app-adversary-actions-list, - app-actor-actions-list, - app-actor-equipment-list { + .pip-list { display: flex; - flex-direction: column; - - color: var(--plotweaver-color-off-white-1); - overflow: hidden; - - .actions-list { - border-radius: 0.3rem; - - .item.header { - height: 2rem; - background: var(--plotweaver-color-base-1) !important; - display: flex; - align-items: center; - padding: 0 0.5rem; + flex-direction: row; + list-style-type: none; + padding: 0; + margin: 0; + gap: 0.25rem; + + .pip { + > div { + width: 10px; + height: 10px; + border: 1px solid var(--cosmere-color-base-5); + border-radius: 50%; } - .item.usable, - .details.expanded { - background: var(--plotweaver-color-base-3); + &.active > div { + background-color: var(--cosmere-color-text-main); } - } - } - - .list-component { - overflow: visible; - position: relative; - width: 100%; - - [class*='-list'] { - list-style: none; - margin: 0; - padding: 0; - margin-top: 1rem; - li { - margin: 0; + &:not(.active) > div { + background-color: var(--cosmere-color-base-1); } + } + } - .item, - .injury, - .effect { - background: #302831; - height: 2.3rem; - display: flex; - flex-direction: row; - align-items: center; - padding: 0 0.5rem; - - &.header { - background: #0f0610; - border-top-left-radius: 0.3rem; - border-top-right-radius: 0.3rem; - } + .box-corners { + pointer-events: none; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: none; + display: flex; + flex-direction: column; + justify-content: space-between; - &:nth-last-child(2):not(.expanded), - &:nth-last-child(2).expanded + li { - border-bottom-left-radius: 0.3rem; - border-bottom-right-radius: 0.3rem; - } + .corner { + width: 10px; + height: 10px; + background-color: var(--cosmere-color-accent); + mask: var(--border-corner-svg) no-repeat center; + } - &:not(:first-child):not(:nth-last-child(2)) { - border-bottom: 1px dashed var(--plotweaver-color-base-6); + .corner-pair { + display: flex; + justify-content: space-between; + } - &.expanded { - border-bottom-color: transparent; - } - } + .bot { + transform: scaleY(-1); + } - &:not(.header) { - .name { - margin-left: 0.5rem; - } - } + .right { + transform: scaleX(-1); + } + } - .img { - display: flex; - cursor: pointer; - position: relative; - align-items: center; - justify-content: center; + .sidebar-header { + display: flex; + align-items: center; + justify-content: space-between; + font-size: var(--font-size-10); + color: var(--cosmere-color-text-sub); + width: 100%; + height: 14px; + margin-bottom: 0.125rem; - > img { - width: 1.85rem; - height: 1.85rem; - } + .label { + font-family: var(--cosmere-font-header); + text-transform: uppercase; + text-align: left; + } - .roll-icon { - display: none; - position: absolute; - z-index: 1; - border: none; - } - } + .controls { + text-align: right; + } + } - &.usable .img { - &:hover { - .roll-icon { - display: block; - opacity: 0.6; - animation: rotating 2s linear infinite; - width: 90%; - height: 90%; - } - } - } + /* --- Components --- */ - .col:not(.controls) { - > a { - width: 2rem; + app-actor-details { + display: flex; + flex-direction: column; - &:hover i { - opacity: 1; - } - } + .portrait-info { + display: flex; + flex-direction: column; + position: relative; + align-items: center; - i { - opacity: 0.3; - } - } + .portrait { + width: 100%; + aspect-ratio: 1 / 1; + overflow: hidden; - .name { - flex: 1; - cursor: pointer; - height: 100%; - display: flex; - flex-direction: column; - align-items: flex-start; - justify-content: center; + border: 4px solid var(--cosmere-color-accent); + border-radius: 50%; + filter: var(--cosmere-drop-shadow); - .subtitle { - font-size: 7.5pt; + img { + width: 100%; + object-fit: cover; + object-position: center; + border: none; - span:not(.highlight) { - opacity: 0.4; - } + &:hover { + cursor: pointer; } } - .activation, - .consume, - .uses, - .weight, - .quantity, - .duration, - .source { - text-align: center; - - .val.none { - opacity: 0.3; - } + &::after { + box-shadow: inset 0 0 60px var(--cosmere-shadow-85); + content: ''; + display: block; + position: absolute; + top: 0; + width: 100%; + height: 100%; + pointer-events: none; } + } - .activation { - width: 3rem; + a.rest { + position: absolute; + width: 22px; + height: 22px; + background-color: var(--cosmere-color-text-sub); + + &.end-scene { + top: -11px; + right: 27px; + mask: var(--rest-scene-svg) no-repeat center; + } - i { - opacity: 1 !important; - } + &.short-rest { + top: 4px; + right: 4px; + mask: var(--rest-short-svg) no-repeat center; } - .consume { - width: 6.5rem; + &.long-rest { + top: 27px; + right: -11px; + mask: var(--rest-long-svg) no-repeat center; } + } - .uses { - width: 6.5rem; + .deflect { + margin-top: -19px; + } + } - .inactive { - opacity: 0.3; - } + .deflect { + .container { + width: 32px; + height: 38px; + + .background { + mask: var(--mask-deflect-svg) no-repeat center; + } + + .border { + mask: var(--border-deflect-svg) no-repeat center; } - .quantity { - width: 5rem; - display: flex; - justify-content: center; + .value { + font-size: var(--font-size-18); + line-height: 40px; } + } - .weight { - width: 4rem; + .label { + margin-top: 0.25rem; + } + } - i { - opacity: 0.3; - } - } + .derived-stat { + margin-bottom: 1.75rem; - .equip { - width: 4rem; - display: flex; - align-items: center; - justify-content: center; - height: 100%; + &.recovery { + transform: translateY(0.875rem); + } - img { - border: none; - } + .container { + width: 58px; + height: 30px; + + .background { + mask: var(--mask-stat-svg) no-repeat center; + } + + .border { + mask: var(--border-stat-svg) no-repeat center; + } - a { - position: relative; - display: flex; - align-items: center; - justify-content: center; - height: 100%; + .value, + .unit { + font-family: var(--cosmere-font-header); + color: var(--cosmere-color-text-main); + font-size: var(--font-size-14); + line-height: 34px; + } - img { - opacity: 0.3; + .unit { + font-variant: small-caps; + position: relative; + z-index: 1; + } + } - &.hold-2h { - width: 2rem; - transform: rotate(25deg); - } - } + .label { + margin-top: 0.25rem; + } + } + } - &.compound { - width: 2rem; + app-actor-resource { + display: flex; + flex-direction: column; + position: relative; - > img { - opacity: 1; - position: absolute; - width: 1.7rem; + .resource { + display: flex; + flex-direction: column; + align-items: flex-start; + margin-bottom: 0.625rem; - &.inactive { - opacity: 0.3; - } - } - } + .bar { + .container { + width: 180px; + height: 24px; + + .background { + mask: var(--mask-bar-svg) no-repeat center; } - &.equipped { - a:not(.compound) .icon { - opacity: 1; - } + .inner { + mask: var(--mask-bar-svg) no-repeat center; + position: absolute; + left: 0px; + top: 0px; + width: 100%; + height: 100%; } - &:not(.equipped) { - a.compound > img { - opacity: 0.3; - } + .inner-bar { + position: absolute; + height: 100%; + top: 0; + left: 0; } - } - - .duration, - .source { - width: 10rem; - display: flex; - justify-content: center; - } - - .action { - > a.active i { - opacity: 1; + + .border { + mask: var(--border-bar-svg) no-repeat center; } - } - .action { - width: 3rem; - } + .value { + padding-left: 0.75rem; + + font-weight: bold; + font-size: var(--font-size-14); + line-height: 28px; + text-align: left; + color: var(--cosmere-color-white); + + .delim { + color: var(--cosmere-color-accent); + } + } - .controls { - height: 100%; + input { + display: none; + padding-left: 0.75rem; - > * { - display: flex; - width: 1rem; - text-align: center; - justify-content: center; - align-items: center; + position: absolute; + top: 0; + left: 0; + width: 100%; height: 100%; - } - - &.edit { - width: 5rem; + + font-family: var(--cosmere-font-header); + font-weight: bold; + font-size: var(--font-size-14); + line-height: 24px; + text-align: left; } } - &:not(.header) .controls { - color: rgba(231, 209, 177, 0.3); - } - - &:not(.expanded) { - .controls - > a[data-action='toggle-action-details'] - .icon-expanded { + &.editing .container { + .value { display: none; } - } - &.expanded { - .controls > a[data-action='toggle-action-details'] .icon { - display: none; + input { + display: block; } } } - .details { - background: #302831; - display: none; - - &.expanded { - display: flex; - padding: 0 0.5rem; + &.hea { + .bar .container { + .background { + background-color: var(--cosmere-color-health-back); + } - &:not(:last-child) { - border-bottom: 1px dashed var(--plotweaver-color-base-6); + .inner-bar { + background-color: var(--cosmere-color-health-front); } } } - } - } - - app-actor-search-bar { - display: flex; - width: 100%; - - .search-bar { - position: relative; - padding-right: 0.5rem; - background: var(--plotweaver-color-base-1); - display: flex; - align-items: center; - border-radius: 0.3rem; - width: 100%; - color: #e7d1b14a; - - > i { - position: absolute; - left: 0.5rem; - } - input { - // gets overwritten - padding-left: 2rem !important; - color: var(--plotweaver-color-off-white-1) !important; - background-color: var(--plotweaver-color-base-1) !important; - - &::placeholder { - color: #e7d1b14a; + &.foc { + .bar .container { + .background { + background-color: var(--cosmere-color-focus-back); + } + + .inner-bar { + background-color: var(--cosmere-color-focus-front); + } } } - .controls { - > a { - text-align: center; - width: 2rem; + &.inv { + .bar .container { + .background { + background-color: var(--cosmere-color-invest-back); + } - &.active { - color: #d0b8a3; + .inner-bar { + background-color: var(--cosmere-color-invest-front); } } } } } - app-actor-conditions { - display: flex; - flex-direction: column; - width: 100%; - - margin-top: 1rem; - border-radius: 0.3rem; - overflow: hidden; - border: 1px solid var(--plotweaver-color-base-4); - - .header { - height: 2rem; - background: var(--plotweaver-color-base-1); - display: flex; - align-items: center; - padding: 0 0.5rem; - } - - .conditions-set { - display: grid; - grid-template-columns: 33.3% 33.3% 33.4%; - - &:not(.editable) { - pointer-events: none; - } + app-actor-attributes { + .attribute-groups { + margin-top: 1.375rem; + gap: 0.75rem; } - .condition { - color: var(--plotweaver-color-accent); - background-color: var(--plotweaver-color-base-3); - display: flex; - height: 2rem; - align-items: center; - padding: 0 0.5rem; - - &:not(:nth-last-child(-n + 3)) { - border-bottom: 1pt dashed var(--plotweaver-color-base-6); - } + .attribute-group { + display: flex; + flex-direction: column; - &:not(:nth-child(3n)) { - border-right: 1pt dashed var(--plotweaver-color-base-6); + > .label { + font-family: var(--cosmere-font-header); + font-size: var(--font-size-12); + color: var(--cosmere-color-text-sub); + text-transform: uppercase; + text-align: center; + margin-bottom: 0.25rem; } - &:not(.active) > a { - opacity: 0.3; - color: var(--plotweaver-color-off-white-1); - - &:hover { - opacity: 1; - } - } + .attributes { + align-items: flex-start; - a { - flex: 1; - display: flex; - align-items: center; - } + .attribute { + .container { + width: 58px; + height: 50px; + padding-top: 0.25rem; - .icon { - border: none; - width: 1.2rem; - height: 1.2rem; - margin-right: 0.5rem; - } + &.left { + .background { + mask: var(--mask-attribute-left-svg) no-repeat center; + } + + .border { + mask: var(--border-attribute-left-svg) no-repeat center; + } + } - .name { - flex: 1; - } - } - } + &.right { + .background { + mask: var(--mask-attribute-right-svg) no-repeat center; + } + + .border { + mask: var(--border-attribute-right-svg) no-repeat center; + } + } - app-actor-injuries-list, - app-actor-equipment-list { - display: flex; - flex-direction: column; + .title { + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-11); + font-weight: bold; + text-transform: uppercase; + color: var(--cosmere-color-text-sub); + z-index: 1; + position: relative; + } + + .value { + font-size: var(--font-size-24); + text-align: center; + height: 1.25rem; + padding-top: 0.25rem; + } + } - color: var(--plotweaver-color-off-white-1); - overflow: hidden; + } - .injuries-list, - .equipment-list { - border-radius: 0.3rem; + .defense { + .label { + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-11); + font-weight: bold; + text-transform: uppercase; + } - .injury.header, - .item.header { - height: 2rem; - background: var(--plotweaver-color-base-1) !important; - display: flex; - align-items: center; - padding: 0 0.5rem; - } + .container { + width: 40px; + height: 50px; + + .background { + mask: var(--mask-defense-svg) no-repeat center; + } + + .border { + mask: var(--border-defense-svg) no-repeat center; + } - .injury.item, - .item, - .item.usable, - .details.expanded { - background: var(--plotweaver-color-base-3) !important; + .config-icon { + position: absolute; + width: 100%; + bottom: 4px; + left: 0; + font-size: var(--font-size-10); + } + + .value { + font-size: var(--font-size-20); + line-height: 46px; + } + } + } } } } - app-actor-effects-list { - .effects-list:not(.editable) { - pointer-events: none; - } - } - app-actor-skills-group, app-adversary-skills-group { position: relative; - &:has(> *) { - display: flex; - padding: 0.4rem 0.2rem; - margin-bottom: calc(1.25rem - 1px); - - background: var(--plotweaver-color-base-1); - - .border { - position: absolute; - left: -3px; - top: -3px; - width: calc(100% + 6px); - height: calc(100% + 6px); - border-image: url("/systems/cosmere-rpg/assets/icons/ui/border_full_100x100.svg") fill 80 / 58px; - filter: var(--plotweaver-color-accent-filter); - pointer-events: none; - } + &:not(:has(*)) { + display: none; } .skill-list { - color: var(--plotweaver-color-off-white-1); - flex: 1; display: flex; flex-direction: column; margin: 0; - padding: 6px 0; - gap: 2px; - } - } + padding: 0.625rem; + border: 2px solid var(--cosmere-color-accent); + border-radius: 0; + background-color: var(--cosmere-color-base-2); + mask: radial-gradient(8px at 8px 8px, transparent 98%, black) -8px -8px; + list-style: none; - app-adversary-skills-group { - font-size: 9.6pt; + .skill { + list-style: none; + margin-bottom: 0.125rem; + } + } } app-actor-skill { display: flex; flex-direction: row; align-items: center; - text-shadow: 0 0 0.2rem black; - - &:hover { - text-shadow: 0 0 8px var(--color-shadow-primary); - } + gap: 0.375rem; + + font-family: var(--cosmere-font-normal); + font-size: var(--font-size-10); + font-weight: bold; + text-transform: uppercase; [data-action] { cursor: pointer; } .mod { - width: 2rem; + font-family: var(--cosmere-font-header); + font-size: var(--font-size-12); + font-weight: 600; + padding-top: 0.25rem; + width: 20px; text-align: center; - margin: 0 0.3rem; .operator { - opacity: .5; + color: var(--cosmere-color-faded); } - .val { - font-weight: bold; + .val { + color: var(--cosmere-color-text-main); } } .name { + color: var(--cosmere-color-text-sub); + text-align: left; flex: 1; } - .attribute { - width: 3rem; - text-align: center; - margin: 0 0.3rem; - color: var(--plotweaver-color-accent); - } + .attribute { + color: var(--cosmere-color-text-accent); + width: 24px; + text-align: center; + } + } + + app-actor-search-bar { + .search-bar { + height: 40px; + background-color: var(--cosmere-color-base-3); + border-radius: 6px; + padding: 0 0.75rem; + + font-size: var(--font-size-13); + font-family: var(--cosmere-font-normal); - .pip-list { display: flex; - flex-direction: row; - list-style-type: none; - padding: 0; - margin: 0 0.3rem 0 0; - - .pip { - > div { - width: 0.65rem; - height: 0.65rem; - border: 1px solid var(--color-dark-6); - border-radius: 50%; - margin: 0.1rem; - } + align-items: center; + gap: 0.75rem; - &.active { - > div { - background-color: white; - } - } + input { + color: var(--cosmere-color-text-sub); + text-align: left; + flex: 1; - &:not(.active) > div { - opacity: .5; + &::placeholder { + color: var(--cosmere-color-faded); } } + + .controls { + font-size: var(--font-size-16); + display: flex; + align-items: center; + gap: 0.75rem; + } } } + + app-actor-actions-list, + app-actor-equipment-list, + app-adversary-actions-list { + display: flex; + flex-direction: column; + gap: 0.75rem; + } +} + +@keyframes rotating { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } } diff --git a/src/style/sheets/item/module.scss b/src/style/sheets/item/module.scss index 66e9c114..6739ddc4 100644 --- a/src/style/sheets/item/module.scss +++ b/src/style/sheets/item/module.scss @@ -11,7 +11,7 @@ } .sheet-header { - border-bottom: 1px solid var(--plotweaver-color-grey-5); + border-bottom: 1px solid var(--cosmere-color-grey-5); } nav { diff --git a/src/style/sheets/module.scss b/src/style/sheets/module.scss index 0853217d..58bda89a 100644 --- a/src/style/sheets/module.scss +++ b/src/style/sheets/module.scss @@ -3,43 +3,3 @@ @import './actor/module.scss'; @import './item/module.scss'; - -ul.list-table { - list-style: none; - padding: 0; - margin: 0; - - li { - display: flex; - align-items: center; - background: #302831; - height: 2rem; - padding: 0 0.5rem; - margin: 0; - - &.header { - background: #0f0610; - border-top-left-radius: 0.3rem; - border-top-right-radius: 0.3rem; - font-weight: bold; - } - - &:not(.header):not(:last-child) { - border-bottom: 1px solid #463a47; - } - - &:last-child { - border-bottom-left-radius: 0.3rem; - border-bottom-right-radius: 0.3rem; - } - - .col.controls { - margin-left: 1rem; - - > * { - width: 1rem; - text-align: center; - } - } - } -} diff --git a/src/system/api.ts b/src/system/api.ts index 52ce00e1..c37bb03f 100644 --- a/src/system/api.ts +++ b/src/system/api.ts @@ -6,6 +6,7 @@ import { PathType, PowerType, ActionType, + Theme, } from '@system/types/cosmere'; import { @@ -286,6 +287,26 @@ export function registerCurrency(data: CurrencyConfigData, force = false) { }; } +interface ThemeConfigData { + id: string; + label: string; +} + +export function registerTheme(data: ThemeConfigData, force = false) { + if (!CONFIG.COSMERE) + throw new Error('Cannot access api until after system is initialized.'); + + if (data.id in CONFIG.COSMERE.themes && !force) + throw new Error('Cannot override existing theme config.'); + + if (force) { + console.warn('Registering theme with force=true.'); + } + + // Add to themes config + CONFIG.COSMERE.themes[data.id as Theme] = data.label; +} + /* --- Default Export --- */ export default { @@ -299,4 +320,5 @@ export default { registerCulture, registerAncestry, registerCurrency, + registerTheme, }; diff --git a/src/system/applications/actor/adversary-sheet.ts b/src/system/applications/actor/adversary-sheet.ts index 05333573..5122f041 100644 --- a/src/system/applications/actor/adversary-sheet.ts +++ b/src/system/applications/actor/adversary-sheet.ts @@ -10,6 +10,7 @@ import { EditExpertisesDialog } from './dialogs/edit-expertises'; // Base import { BaseActorSheet, BaseActorSheetRenderContext } from './base'; +import { TEMPLATES } from '@src/system/utils/templates'; export type AdversarySheetRenderContext = Omit< BaseActorSheetRenderContext, @@ -49,9 +50,8 @@ export class AdversarySheet extends BaseActorSheet static PARTS = foundry.utils.mergeObject( foundry.utils.deepClone(super.PARTS), { - 'sheet-content': { - template: - 'systems/cosmere-rpg/templates/actors/adversary/parts/sheet-content.hbs', + content: { + template: `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_ADVERSARY_CONTENT}`, }, }, ); diff --git a/src/system/applications/actor/base.ts b/src/system/applications/actor/base.ts index 0a0bedd6..66c15e81 100644 --- a/src/system/applications/actor/base.ts +++ b/src/system/applications/actor/base.ts @@ -21,7 +21,8 @@ import { } from '@system/applications/mixins'; // Components -import { SortDirection, SearchBarInputEvent } from './components'; +import { SortMode, SearchBarInputEvent } from './components'; +import { renderSystemTemplate, TEMPLATES } from '@src/system/utils/templates'; const { ActorSheetV2 } = foundry.applications.sheets; @@ -67,8 +68,7 @@ export class BaseActorSheet< static PARTS = foundry.utils.mergeObject(super.PARTS, { navigation: { - template: - 'systems/cosmere-rpg/templates/actors/parts/navigation.hbs', + template: `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_NAVIGATION}`, }, }); @@ -92,13 +92,13 @@ export class BaseActorSheet< } protected actionsSearchText = ''; - protected actionsSearchSort: SortDirection = SortDirection.Descending; + protected actionsSearchSort: SortMode = SortMode.Alphabetic; protected equipmentSearchText = ''; - protected equipmentSearchSort: SortDirection = SortDirection.Descending; + protected equipmentSearchSort: SortMode = SortMode.Alphabetic; protected effectsSearchText = ''; - protected effectsSearchSort: SortDirection = SortDirection.Descending; + protected effectsSearchSort: SortMode = SortMode.Alphabetic; /* --- Accessors --- */ @@ -248,6 +248,18 @@ export class BaseActorSheet< ): Promise { const frame = await super._renderFrame(options); + const corners = await renderSystemTemplate( + TEMPLATES.ACTOR_BASE_SHEET_CORNERS, + {}, + ); + $(frame).prepend(corners); + + const banners = await renderSystemTemplate( + TEMPLATES.ACTOR_BASE_SHEET_BACKGROUND, + {}, + ); + $(frame).prepend(banners); + // Insert mode toggle if (this.isEditable) { $(this.window.title!).before(` diff --git a/src/system/applications/actor/character-sheet.ts b/src/system/applications/actor/character-sheet.ts index ca0e58f5..1ae239b8 100644 --- a/src/system/applications/actor/character-sheet.ts +++ b/src/system/applications/actor/character-sheet.ts @@ -6,6 +6,7 @@ import { SYSTEM_ID } from '@src/system/constants'; // Base import { BaseActorSheet } from './base'; +import { TEMPLATES } from '@src/system/utils/templates'; const enum CharacterSheetTab { Details = 'details', @@ -28,12 +29,10 @@ export class CharacterSheet extends BaseActorSheet { foundry.utils.deepClone(super.PARTS), { header: { - template: - 'systems/cosmere-rpg/templates/actors/character/parts/header.hbs', + template: `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_CHARACTER_HEADER}`, }, - 'sheet-content': { - template: - 'systems/cosmere-rpg/templates/actors/character/parts/sheet-content.hbs', + content: { + template: `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_CHARACTER_CONTENT}`, }, }, ); diff --git a/src/system/applications/actor/components/actions-list.ts b/src/system/applications/actor/components/actions-list.ts index 77330909..abb0c3b1 100644 --- a/src/system/applications/actor/components/actions-list.ts +++ b/src/system/applications/actor/components/actions-list.ts @@ -10,8 +10,9 @@ import { import { CosmereItem } from '@system/documents/item'; import { CosmereActor } from '@system/documents'; import { ConstructorOf } from '@system/types/utils'; - import { AppContextMenu } from '@system/applications/utils/context-menu'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Utils import AppUtils from '@system/applications/utils'; @@ -19,7 +20,7 @@ import AppUtils from '@system/applications/utils'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; import { BaseActorSheet, BaseActorSheetRenderContext } from '../base'; -import { SortDirection } from './search-bar'; +import { SortMode } from './search-bar'; interface ActionItemState { expanded?: boolean; @@ -66,7 +67,7 @@ export interface ActorActionsListComponentRenderContext extends BaseActorSheetRenderContext { actionsSearch?: { text: string; - sort: SortDirection; + sort: SortMode; }; } @@ -159,8 +160,7 @@ const STATIC_SECTIONS = { export class ActorActionsListComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/actions-list.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_ACTIONS_LIST}`; /** * NOTE: Unbound methods is the standard for defining actions @@ -198,9 +198,15 @@ export class ActorActionsListComponent extends HandlebarsApplicationComponent< // Set classes itemElement.toggleClass('expanded', this.itemState[itemId].expanded); - $(this.element!) - .find(`.details[data-item-id="${itemId}"]`) - .toggleClass('expanded', this.itemState[itemId].expanded); + + itemElement + .find('a[data-action="toggle-action-details"') + .empty() + .append( + this.itemState[itemId].expanded + ? '' + : '', + ); } public static onUseItem(this: ActorActionsListComponent, event: Event) { @@ -259,7 +265,7 @@ export class ActorActionsListComponent extends HandlebarsApplicationComponent< }); const searchText = context.actionsSearch?.text ?? ''; - const sortDir = context.actionsSearch?.sort ?? SortDirection.Descending; + const sortMode = context.actionsSearch?.sort ?? SortMode.Alphabetic; // Prepare sections this.sections = this.prepareSections(); @@ -269,7 +275,7 @@ export class ActorActionsListComponent extends HandlebarsApplicationComponent< this.sections, activatableItems, searchText, - sortDir, + sortMode, ); return { @@ -427,7 +433,7 @@ export class ActorActionsListComponent extends HandlebarsApplicationComponent< sections: ListSection[], items: CosmereItem[], searchText: string, - sort: SortDirection, + sort: SortMode, ): Promise { // Filter items into sections, putting all items that don't fit into a section into a "Misc" section const itemsBySectionId = items.reduce( @@ -450,13 +456,15 @@ export class ActorActionsListComponent extends HandlebarsApplicationComponent< return await Promise.all( sections.map(async (section) => { // Get items for section, filter by search text, and sort - const sectionItems = (itemsBySectionId[section.id] ?? []) - .filter((i) => i.name.toLowerCase().includes(searchText)) - .sort( - (a, b) => - a.name.compare(b.name) * - (sort === SortDirection.Descending ? 1 : -1), + let sectionItems = (itemsBySectionId[section.id] ?? []).filter( + (i) => i.name.toLowerCase().includes(searchText), + ); + + if (sort === SortMode.Alphabetic) { + sectionItems = sectionItems.sort( + (a, b) => a.name.compare(b.name) * -1, ); + } return { ...section, diff --git a/src/system/applications/actor/components/adversary/actions-list.ts b/src/system/applications/actor/components/adversary/actions-list.ts index aa9361d0..709aa1b7 100644 --- a/src/system/applications/actor/components/adversary/actions-list.ts +++ b/src/system/applications/actor/components/adversary/actions-list.ts @@ -12,7 +12,7 @@ import { ActorActionsListComponentRenderContext, ListSection, } from '../actions-list'; -import { SortDirection } from '../search-bar'; +import { SortMode } from '../search-bar'; // Constants @@ -50,7 +50,7 @@ export class AdversaryActionsListComponent extends ActorActionsListComponent { ]; const searchText = context.actionsSearch?.text ?? ''; - const sortDir = context.actionsSearch?.sort ?? SortDirection.Descending; + const sortMode = context.actionsSearch?.sort ?? SortMode.Alphabetic; return { ...context, @@ -60,19 +60,19 @@ export class AdversaryActionsListComponent extends ActorActionsListComponent { this.sections[0], activatableItems, searchText, - sortDir, + sortMode, ), await this.prepareSectionData( this.sections[1], activatableItems, searchText, - sortDir, + sortMode, ), await this.prepareSectionData( this.sections[2], activatableItems, searchText, - sortDir, + sortMode, ), ].filter( (section) => @@ -124,17 +124,18 @@ export class AdversaryActionsListComponent extends ActorActionsListComponent { section: ListSection, items: CosmereItem[], searchText: string, - sort: SortDirection, + sort: SortMode, ) { // Get items for section, filter by search text, and sort - const sectionItems = items + let sectionItems = items .filter(section.filter) - .filter((i) => i.name.toLowerCase().includes(searchText)) - .sort( - (a, b) => - a.name.compare(b.name) * - (sort === SortDirection.Descending ? 1 : -1), + .filter((i) => i.name.toLowerCase().includes(searchText)); + + if (sort === SortMode.Alphabetic) { + sectionItems = sectionItems.sort( + (a, b) => a.name.compare(b.name) * -1, ); + } return { ...section, diff --git a/src/system/applications/actor/components/adversary/header.ts b/src/system/applications/actor/components/adversary/header.ts index bb7589d2..7cf36630 100644 --- a/src/system/applications/actor/components/adversary/header.ts +++ b/src/system/applications/actor/components/adversary/header.ts @@ -1,4 +1,6 @@ import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Dialogs import { EditCreatureTypeDialog } from '@system/applications/actor/dialogs/edit-creature-type'; @@ -16,8 +18,7 @@ import { export class AdversaryHeaderComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/adversary/components/header.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_ADVERSARY_HEADER}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/adversary/skills-group.ts b/src/system/applications/actor/components/adversary/skills-group.ts index 8534057d..43cea95f 100644 --- a/src/system/applications/actor/components/adversary/skills-group.ts +++ b/src/system/applications/actor/components/adversary/skills-group.ts @@ -1,5 +1,7 @@ import { AttributeGroup, Skill } from '@system/types/cosmere'; import { ConstructorOf, MouseButton } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; @@ -19,8 +21,7 @@ export class AdversarySkillsGroupComponent extends HandlebarsApplicationComponen ConstructorOf, Params > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/adversary/components/skills-group.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_ADVERSARY_SKILLS_GROUP}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/attributes.ts b/src/system/applications/actor/components/attributes.ts index be401318..4a6fb79e 100644 --- a/src/system/applications/actor/components/attributes.ts +++ b/src/system/applications/actor/components/attributes.ts @@ -1,5 +1,7 @@ import { AttributeGroup, Attribute } from '@system/types/cosmere'; import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Dialogs import { ConfigureDefenseDialog } from '@system/applications/actor/dialogs/configure-defense'; @@ -11,8 +13,7 @@ import { BaseActorSheet, BaseActorSheetRenderContext } from '../base'; export class ActorAttributesComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/attributes.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_ATTRIBUTES}`; /** * NOTE: Unbound methods is the standard for defining actions and forms diff --git a/src/system/applications/actor/components/character/ancestry.ts b/src/system/applications/actor/components/character/ancestry.ts index 99ec1c64..75fdd43a 100644 --- a/src/system/applications/actor/components/character/ancestry.ts +++ b/src/system/applications/actor/components/character/ancestry.ts @@ -1,5 +1,7 @@ import { ItemType } from '@system/types/cosmere'; import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; @@ -8,8 +10,7 @@ import { BaseActorSheet, BaseActorSheetRenderContext } from '../../base'; export class CharacterAncestryComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/character/components/ancestry.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_CHARACTER_ANCESTRY}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/character/connections-list.ts b/src/system/applications/actor/components/character/connections-list.ts index 0b7b4c3a..5d478dee 100644 --- a/src/system/applications/actor/components/character/connections-list.ts +++ b/src/system/applications/actor/components/character/connections-list.ts @@ -2,6 +2,8 @@ import { ItemType } from '@system/types/cosmere'; import { CosmereItem } from '@system/documents'; import { ConnectionItemDataModel } from '@system/data/item'; import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; @@ -14,8 +16,7 @@ interface ConnectionItemState { export class CharacterConnectionsListComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/character/components/connections-list.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_CHARACTER_CONNECTIONS_LIST}`; /** * NOTE: Unbound methods is the standard for defining actions @@ -54,7 +55,7 @@ export class CharacterConnectionsListComponent extends HandlebarsApplicationComp this.contextConnectionId = connectionId; const target = (event.currentTarget as HTMLElement).closest( - '.connection', + '.item', )!; const targetRect = target.getBoundingClientRect(); const rootRect = this.element!.getBoundingClientRect(); diff --git a/src/system/applications/actor/components/character/culture.ts b/src/system/applications/actor/components/character/culture.ts index 94d1987f..9fe9128d 100644 --- a/src/system/applications/actor/components/character/culture.ts +++ b/src/system/applications/actor/components/character/culture.ts @@ -1,6 +1,7 @@ import { CultureItem } from '@system/documents/item'; - import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; @@ -17,8 +18,7 @@ export class CharacterCultureComponent extends HandlebarsApplicationComponent< ConstructorOf, Params > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/character/components/culture.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_CHARACTER_CULTURE}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/character/expertises.ts b/src/system/applications/actor/components/character/expertises.ts index 9c28972b..db9f2759 100644 --- a/src/system/applications/actor/components/character/expertises.ts +++ b/src/system/applications/actor/components/character/expertises.ts @@ -1,4 +1,6 @@ import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Dialog import { EditExpertisesDialog } from '../../dialogs/edit-expertises'; @@ -10,8 +12,7 @@ import { BaseActorSheet, BaseActorSheetRenderContext } from '../../base'; export class CharacterExpertisesComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/character/components/expertises.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_CHARACTER_EXPERTISES}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/character/favorites.ts b/src/system/applications/actor/components/character/favorites.ts index 9f0d972e..134e002a 100644 --- a/src/system/applications/actor/components/character/favorites.ts +++ b/src/system/applications/actor/components/character/favorites.ts @@ -1,5 +1,7 @@ import { CosmereActor, CosmereItem } from '@system/documents'; import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Mixins import { DragDropComponentMixin } from '@system/applications/mixins/drag-drop'; @@ -15,8 +17,7 @@ import { BaseActorSheetRenderContext } from '../../base'; export class CharacterFavoritesComponent extends DragDropComponentMixin( HandlebarsApplicationComponent, )> { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/character/components/favorites.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_CHARACTER_FAVORITES}`; static DRAG_DROP = [ { diff --git a/src/system/applications/actor/components/character/goals-list.ts b/src/system/applications/actor/components/character/goals-list.ts index bf24a428..88b3e737 100644 --- a/src/system/applications/actor/components/character/goals-list.ts +++ b/src/system/applications/actor/components/character/goals-list.ts @@ -2,6 +2,7 @@ import { ItemType } from '@system/types/cosmere'; import { GoalItem } from '@system/documents/item'; import { ConstructorOf, MouseButton } from '@system/types/utils'; import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; @@ -14,8 +15,7 @@ const HIDE_COMPLETED_FLAG = 'goals.hide-completed'; export class CharacterGoalsListComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/character/components/goals-list.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_CHARACTER_GOALS_LIST}`; /** * NOTE: Unbound methods is the standard for defining actions @@ -56,7 +56,7 @@ export class CharacterGoalsListComponent extends HandlebarsApplicationComponent< this.contextGoalId = goalId; const target = (event.currentTarget as HTMLElement).closest( - '.goal', + '.item', )!; const targetRect = target.getBoundingClientRect(); const rootRect = this.element!.getBoundingClientRect(); diff --git a/src/system/applications/actor/components/character/paths.ts b/src/system/applications/actor/components/character/paths.ts index 67f92d68..4d32c9dd 100644 --- a/src/system/applications/actor/components/character/paths.ts +++ b/src/system/applications/actor/components/character/paths.ts @@ -1,4 +1,6 @@ import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; @@ -8,8 +10,7 @@ import { CharacterSheet } from '../../character-sheet'; export class CharacterPathsComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static readonly TEMPLATE = - 'systems/cosmere-rpg/templates/actors/character/components/paths.hbs'; + static readonly TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_CHARACTER_PATHS}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/conditions.ts b/src/system/applications/actor/components/conditions.ts index 049fcbb6..914d2c9d 100644 --- a/src/system/applications/actor/components/conditions.ts +++ b/src/system/applications/actor/components/conditions.ts @@ -1,5 +1,7 @@ import { Condition } from '@system/types/cosmere'; import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; @@ -9,8 +11,7 @@ import { BaseActorSheet } from '../base'; export class ActorConditionsComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static readonly TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/conditions.hbs'; + static readonly TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_CONDITIONS}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/details.ts b/src/system/applications/actor/components/details.ts index 46575498..0b5f6d7b 100644 --- a/src/system/applications/actor/components/details.ts +++ b/src/system/applications/actor/components/details.ts @@ -1,5 +1,7 @@ import { ActorType } from '@system/types/cosmere'; import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Dialogs import { ConfigureMovementRateDialog } from '@system/applications/actor/dialogs/configure-movement-rate'; @@ -15,8 +17,7 @@ import { CosmereActor } from '@src/system/documents'; export class ActorDetailsComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/details.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_DETAILS}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/effects-list.ts b/src/system/applications/actor/components/effects-list.ts index 0b874b26..5e778cb6 100644 --- a/src/system/applications/actor/components/effects-list.ts +++ b/src/system/applications/actor/components/effects-list.ts @@ -1,12 +1,13 @@ import { ConstructorOf } from '@system/types/utils'; import { CosmereItem } from '@system/documents'; - import { AppContextMenu } from '@system/applications/utils/context-menu'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; import { BaseActorSheet, BaseActorSheetRenderContext } from '../base'; -import { SortDirection } from './search-bar'; +import { SortMode } from './search-bar'; type EffectListType = 'inactive' | 'passive' | 'temporary'; @@ -19,7 +20,7 @@ type Params = { interface RenderContext extends BaseActorSheetRenderContext { effectsSearch: { text: string; - sort: SortDirection; + sort: SortMode; }; } @@ -34,8 +35,7 @@ export class ActorEffectsListComponent extends HandlebarsApplicationComponent< ConstructorOf, Params > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/effects-list.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_EFFECTS_LIST}`; /** * NOTE: Unbound methods is the standard for defining actions @@ -70,15 +70,12 @@ export class ActorEffectsListComponent extends HandlebarsApplicationComponent< .filter((effect) => !effect.id.startsWith('cond')) .filter((effect) => effect.name.toLowerCase().includes(context.effectsSearch.text), - ) - .sort( - (a, b) => - a.name.compare(b.name) * - (context.effectsSearch.sort === SortDirection.Descending - ? 1 - : -1), ); + if (context.effectsSearch.sort === SortMode.Alphabetic) { + effects = effects.sort((a, b) => a.name.compare(b.name) * -1); + } + // Filter effects down to the correct type if (params.type === 'inactive') { effects = effects.filter((effect) => !effect.active); diff --git a/src/system/applications/actor/components/equipment-list.ts b/src/system/applications/actor/components/equipment-list.ts index 36a1da01..2dcf5d71 100644 --- a/src/system/applications/actor/components/equipment-list.ts +++ b/src/system/applications/actor/components/equipment-list.ts @@ -2,8 +2,9 @@ import { EquipHand, ItemType } from '@system/types/cosmere'; import { CosmereItem } from '@system/documents/item'; import { CosmereActor } from '@system/documents/actor'; import { ConstructorOf } from '@system/types/utils'; - import { AppContextMenu } from '@system/applications/utils/context-menu'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Utils import AppUtils from '@system/applications/utils'; @@ -11,7 +12,7 @@ import AppUtils from '@system/applications/utils'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; import { BaseActorSheet, BaseActorSheetRenderContext } from '../base'; -import { SortDirection } from './search-bar'; +import { SortMode } from './search-bar'; interface EquipmentItemState { expanded?: boolean; @@ -57,15 +58,14 @@ export interface ListSectionData extends ListSection { interface RenderContext extends BaseActorSheetRenderContext { equipmentSearch: { text: string; - sort: SortDirection; + sort: SortMode; }; } export class ActorEquipmentListComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/equipment-list.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_EQUIPMENT_LIST}`; /** * NOTE: Unbound methods is the standard for defining actions @@ -107,9 +107,15 @@ export class ActorEquipmentListComponent extends HandlebarsApplicationComponent< // Set classes itemElement.toggleClass('expanded', this.itemState[itemId].expanded); - $(this.element!) - .find(`.details[data-item-id="${itemId}"]`) - .toggleClass('expanded', this.itemState[itemId].expanded); + + itemElement + .find('a[data-action="toggle-action-details"') + .empty() + .append( + this.itemState[itemId].expanded + ? '' + : '', + ); } public static onUseItem(this: ActorEquipmentListComponent, event: Event) { @@ -296,17 +302,18 @@ export class ActorEquipmentListComponent extends HandlebarsApplicationComponent< section: ListSection, items: CosmereItem[], filterText: string, - sort: SortDirection, + sort: SortMode, ) { // Get items for section, filter by search text, and sort - const sectionItems = items + let sectionItems = items .filter(section.filter) - .filter((i) => i.name.toLowerCase().includes(filterText)) - .sort( - (a, b) => - a.name.compare(b.name) * - (sort === SortDirection.Descending ? 1 : -1), + .filter((i) => i.name.toLowerCase().includes(filterText)); + + if (sort === SortMode.Alphabetic) { + sectionItems = sectionItems.sort( + (a, b) => a.name.compare(b.name) * -1, ); + } return { ...section, diff --git a/src/system/applications/actor/components/index.ts b/src/system/applications/actor/components/index.ts index b5b9a2ba..51b02f04 100644 --- a/src/system/applications/actor/components/index.ts +++ b/src/system/applications/actor/components/index.ts @@ -16,5 +16,5 @@ import './adversary'; export { SearchBarInputEvent, SearchBarInputEventDetail, - SortDirection, + SortMode, } from './search-bar'; diff --git a/src/system/applications/actor/components/injuries-list.ts b/src/system/applications/actor/components/injuries-list.ts index 46efcb6a..1128e59c 100644 --- a/src/system/applications/actor/components/injuries-list.ts +++ b/src/system/applications/actor/components/injuries-list.ts @@ -2,6 +2,8 @@ import { InjuryType, ItemType } from '@system/types/cosmere'; import { ConstructorOf } from '@system/types/utils'; import { CosmereItem } from '@system/documents'; import { InjuryItemDataModel } from '@system/data/item'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; import AppUtils from '@system/applications/utils'; @@ -12,8 +14,7 @@ import { BaseActorSheet, BaseActorSheetRenderContext } from '../base'; export class ActorInjuriesListComponent extends HandlebarsApplicationComponent< ConstructorOf > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/injuries-list.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_INJURIES_LIST}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/resource.ts b/src/system/applications/actor/components/resource.ts index ed81a08c..f63a7466 100644 --- a/src/system/applications/actor/components/resource.ts +++ b/src/system/applications/actor/components/resource.ts @@ -1,7 +1,8 @@ import { Resource } from '@system/types/cosmere'; import { ConstructorOf } from '@system/types/utils'; - import { Derived } from '@system/data/fields'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Dialog import { ConfigureResourceDialog } from '../dialogs/configure-resource'; @@ -20,8 +21,7 @@ export class ActorResourceComponent extends HandlebarsApplicationComponent< ConstructorOf, Params > { - static readonly TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/resource.hbs'; + static readonly TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_RESOURCE}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/search-bar.ts b/src/system/applications/actor/components/search-bar.ts index 193d32ba..17a3cc51 100644 --- a/src/system/applications/actor/components/search-bar.ts +++ b/src/system/applications/actor/components/search-bar.ts @@ -3,17 +3,19 @@ import { ConstructorOf } from '@system/types/utils'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; import { BaseActorSheet } from '../base'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; export interface SearchBarInputEventDetail { text: string; - sort: SortDirection; + sort: SortMode; } export type SearchBarInputEvent = CustomEvent; -export const enum SortDirection { - Ascending = 'asc', - Descending = 'desc', +export const enum SortMode { + Manual = 'manual', + Alphabetic = 'alphabetic', } // NOTE: Must use type here instead of interface as an interface doesn't match AnyObject type @@ -26,8 +28,13 @@ export class ActorSearchBarComponent extends HandlebarsApplicationComponent< ConstructorOf, Params > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/search-bar.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_SEARCH_BAR}`; + + /** + * The amount of time to wait after a user's keypress before the name search filter is applied, in milliseconds. + * @type {number} + */ + static FILTER_DEBOUNCE_MS = 200; /** * NOTE: Unbound methods is the standard for defining actions @@ -35,28 +42,31 @@ export class ActorSearchBarComponent extends HandlebarsApplicationComponent< */ /* eslint-disable @typescript-eslint/unbound-method */ static readonly ACTIONS = { - 'clear-actions-search': this.onClearActionsSearch, - 'toggle-actions-search-sort-direction': this.onToggleActionsSearchSort, + 'actions-clear-filter': this.onClearFilter, + 'actions-filter-by': this.onFilterBy, + 'actions-toggle-sort': this.onToggleSort, }; /* eslint-enable @typescript-eslint/unbound-method */ private searchText = ''; - private sortDirection: SortDirection = SortDirection.Descending; + private sortDirection: SortMode = SortMode.Alphabetic; /* --- Actions --- */ - public static onClearActionsSearch(this: ActorSearchBarComponent) { + public static onClearFilter(this: ActorSearchBarComponent) { this.searchText = ''; void this.render(); this.triggerChange(); } - public static onToggleActionsSearchSort(this: ActorSearchBarComponent) { + public static onFilterBy(this: ActorSearchBarComponent) {} + + public static onToggleSort(this: ActorSearchBarComponent) { this.sortDirection = - this.sortDirection === SortDirection.Ascending - ? SortDirection.Descending - : SortDirection.Ascending; + this.sortDirection === SortMode.Alphabetic + ? SortMode.Manual + : SortMode.Alphabetic; void this.render(); this.triggerChange(); @@ -65,14 +75,16 @@ export class ActorSearchBarComponent extends HandlebarsApplicationComponent< /* --- Life cycle --- */ public _onAttachListeners(): void { - $(this.element!) - .find('input') - .on('input', this.onActionsSearchChange.bind(this)); + const debounceSearch = foundry.utils.debounce( + this.onSearchInput.bind(this), + ActorSearchBarComponent.FILTER_DEBOUNCE_MS, + ); + $(this.element!).find('input').on('input', debounceSearch); } /* --- Event handlers --- */ - private onActionsSearchChange(event: Event) { + private onSearchInput(event: Event) { if (event.type !== 'input') return; event.preventDefault(); event.stopPropagation(); @@ -80,6 +92,8 @@ export class ActorSearchBarComponent extends HandlebarsApplicationComponent< this.searchText = ( event.target as HTMLInputElement ).value.toLowerCase(); + + void this.render(); this.triggerChange(); } diff --git a/src/system/applications/actor/components/skill.ts b/src/system/applications/actor/components/skill.ts index 3747c42d..e89abd1e 100644 --- a/src/system/applications/actor/components/skill.ts +++ b/src/system/applications/actor/components/skill.ts @@ -1,5 +1,7 @@ import { Skill } from '@system/types/cosmere'; import { ConstructorOf, MouseButton } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; @@ -32,8 +34,7 @@ export class ActorSkillComponent extends HandlebarsApplicationComponent< ConstructorOf, Params > { - static readonly TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/skill.hbs'; + static readonly TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_SKILL}`; /** * NOTE: Unbound methods is the standard for defining actions diff --git a/src/system/applications/actor/components/skills-group.ts b/src/system/applications/actor/components/skills-group.ts index b6cf7591..a581ae78 100644 --- a/src/system/applications/actor/components/skills-group.ts +++ b/src/system/applications/actor/components/skills-group.ts @@ -1,5 +1,7 @@ import { AttributeGroup, Skill } from '@system/types/cosmere'; import { ConstructorOf } from '@system/types/utils'; +import { SYSTEM_ID } from '@src/system/constants'; +import { TEMPLATES } from '@src/system/utils/templates'; // Component imports import { HandlebarsApplicationComponent } from '@system/applications/component-system'; @@ -22,8 +24,7 @@ export class ActorSkillsGroupComponent extends HandlebarsApplicationComponent< ConstructorOf, Params > { - static TEMPLATE = - 'systems/cosmere-rpg/templates/actors/components/skills-group.hbs'; + static TEMPLATE = `systems/${SYSTEM_ID}/templates/${TEMPLATES.ACTOR_BASE_SKILLS_GROUP}`; /* --- Context --- */ diff --git a/src/system/config.ts b/src/system/config.ts index 2eb58be4..f16059b7 100644 --- a/src/system/config.ts +++ b/src/system/config.ts @@ -79,7 +79,6 @@ const COSMERE: CosmereRPGConfig = { themes: { [Theme.Default]: 'COSMERE.Theme.Default', - [Theme.Stormlight]: 'COSMERE.Theme.Stormlight', }, conditions: { diff --git a/src/system/hooks/index.ts b/src/system/hooks/index.ts index c397abe4..45b29610 100644 --- a/src/system/hooks/index.ts +++ b/src/system/hooks/index.ts @@ -1,4 +1,3 @@ import './modules/dice-so-nice'; import './welcome'; import './sheets'; -import './theme'; diff --git a/src/system/hooks/welcome.ts b/src/system/hooks/welcome.ts index 9db80c4f..2bd00efe 100644 --- a/src/system/hooks/welcome.ts +++ b/src/system/hooks/welcome.ts @@ -30,7 +30,7 @@ Hooks.on('ready', async () => { }, flags: { [SYSTEM_ID]: { - headerImg: `systems/${SYSTEM_ID}/assets/icons/the-metalworks.png`, + headerImg: `systems/${SYSTEM_ID}/assets/art/the-metalworks.png`, }, }, }); diff --git a/src/system/types/cosmere.ts b/src/system/types/cosmere.ts index 66e52bab..746c7e59 100644 --- a/src/system/types/cosmere.ts +++ b/src/system/types/cosmere.ts @@ -288,6 +288,4 @@ export const enum TurnSpeed { export const enum Theme { Default = 'default', - //TODO: Move to stormlight module - Stormlight = 'stormlight', } diff --git a/src/system/utils/templates.ts b/src/system/utils/templates.ts index 54ccafb4..69f98920 100644 --- a/src/system/utils/templates.ts +++ b/src/system/utils/templates.ts @@ -8,7 +8,26 @@ export const TEMPLATES = { GENERAL_TABS: 'general/tabs.hbs', COMBAT_COMBATANT: 'combat/combatant.hbs', - // ACTOR + // ACTOR BASE + ACTOR_BASE_NAVIGATION: 'actors/parts/navigation.hbs', + ACTOR_BASE_SHEET_CORNERS: 'actors/parts/sheet-corners.hbs', + ACTOR_BASE_SHEET_BACKGROUND: 'actors/parts/sheet-background.hbs', + ACTOR_BASE_BOX_CORNERS: 'actors/parts/box-corners.hbs', + ACTOR_BASE_SEARCH_BAR: 'actors/components/search-bar.hbs', + ACTOR_BASE_ACTIONS_LIST: 'actors/components/actions-list.hbs', + ACTOR_BASE_EFFECTS_LIST: 'actors/components/effects-list.hbs', + ACTOR_BASE_EQUIPMENT_LIST: 'actors/components/equipment-list.hbs', + ACTOR_BASE_INJURIES_LIST: 'actors/components/injuries-list.hbs', + ACTOR_BASE_ATTRIBUTES: 'actors/components/attributes.hbs', + ACTOR_BASE_CONDITIONS: 'actors/components/conditions.hbs', + ACTOR_BASE_DETAILS: 'actors/components/details.hbs', + ACTOR_BASE_RESOURCE: 'actors/components/resource.hbs', + ACTOR_BASE_SKILL: 'actors/components/skill.hbs', + ACTOR_BASE_SKILLS_GROUP: 'actors/components/skills-group.hbs', + + // ACTOR CHARACTER + ACTOR_CHARACTER_HEADER: 'actors/character/parts/header.hbs', + ACTOR_CHARACTER_CONTENT: 'actors/character/parts/content.hbs', ACTOR_CHARACTER_DETAILS_TAB: 'actors/character/partials/char-details-tab.hbs', ACTOR_CHARACTER_ACTIONS_TAB: @@ -18,12 +37,26 @@ export const TEMPLATES = { ACTOR_CHARACTER_GOALS_TAB: 'actors/character/partials/char-goals-tab.hbs', ACTOR_CHARACTER_EFFECTS_TAB: 'actors/character/partials/char-effects-tab.hbs', + ACTOR_CHARACTER_ANCESTRY: 'actors/character/components/ancestry.hbs', + ACTOR_CHARACTER_CULTURE: 'actors/character/components/culture.hbs', + ACTOR_CHARACTER_EXPERTISES: 'actors/character/components/expertises.hbs', + ACTOR_CHARACTER_FAVORITES: 'actors/character/components/favorites.hbs', + ACTOR_CHARACTER_PATHS: 'actors/character/components/paths.hbs', + ACTOR_CHARACTER_CONNECTIONS_LIST: + 'actors/character/components/connections-list.hbs', + ACTOR_CHARACTER_GOALS_LIST: 'actors/character/components/goals-list.hbs', + + // ACTOR ADVERSARY + ACTOR_ADVERSARY_HEADER: 'actors/adversary/parts/header.hbs', + ACTOR_ADVERSARY_CONTENT: 'actors/adversary/parts/content.hbs', ACTOR_ADVERSARY_ACTIONS_TAB: 'actors/adversary/partials/adv-actions-tab.hbs', ACTOR_ADVERSARY_EQUIPMENT_TAB: 'actors/adversary/partials/adv-equipment-tab.hbs', ACTOR_ADVERSARY_EFFECTS_TAB: 'actors/adversary/partials/adv-effects-tab.hbs', + ACTOR_ADVERSARY_SKILLS_GROUP: + 'actors/adversary/components/skills-group.hbs', //ITEM ITEM_DESCRIPTION_TAB: 'item/partials/item-description-tab.hbs', diff --git a/src/templates/actors/adversary/components/header.hbs b/src/templates/actors/adversary/components/header.hbs deleted file mode 100644 index 9fb37175..00000000 --- a/src/templates/actors/adversary/components/header.hbs +++ /dev/null @@ -1,57 +0,0 @@ -
-
-

- {{#if isEditMode}} - - {{else}} - {{actor.name}} - {{/if}} -

-
- {{#if isEditMode}} - - {{else}} - {{localize roleLabel}} - {{/if}} - o - {{#if isEditMode}} - - {{else}} - {{localize sizeLabel}} - {{/if}} - - {{localize typeLabel}} - {{#if isEditMode}} - - - - {{/if}} -
-
- -
-
- {{localize "COSMERE.Actor.Sheet.Tier"}} -
-
- - - - {{actor.system.tier}} -
-
-
-
\ No newline at end of file diff --git a/src/templates/actors/adversary/components/skills-group.hbs b/src/templates/actors/adversary/components/skills-group.hbs index c40f9ca4..a5c59180 100644 --- a/src/templates/actors/adversary/components/skills-group.hbs +++ b/src/templates/actors/adversary/components/skills-group.hbs @@ -1,71 +1,18 @@ {{#if hasActiveSkills}} -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    - {{#each skills as |skill|}} + {{#if skill.active}} - -
  • +
  • {{app-actor-skill skill=skill.id readonly=(not @root.isEditMode) pips=false }}
  • - {{/if}} + {{/each}}
- +{{> box-corners }} {{/if}} \ No newline at end of file diff --git a/src/templates/actors/adversary/parts/content.hbs b/src/templates/actors/adversary/parts/content.hbs new file mode 100644 index 00000000..ba1513ce --- /dev/null +++ b/src/templates/actors/adversary/parts/content.hbs @@ -0,0 +1,74 @@ +
+
+ {{app-actor-details}} + {{#each resources as |resourceId|}} + {{app-actor-resource resource=resourceId}} + {{/each}} + +
+
+
+ +
+ {{#each attributeGroups as |group|}} + {{app-adversary-skills-group collapsed=@root.skillsCollapsed group-id=group}} + {{/each}} +
+
+ + {{#if isEditMode}} +
+
+
+ + {{localize "COSMERE.Actor.Sheet.Expertises"}} +
+
+ {{#if isEditMode}} + + + + {{/if}} +
+
+
+ {{/if}} +
+
+
+
+ {{app-adversary-header}} + {{app-actor-attributes}} +
+
+ {{> adv-actions-tab}} + {{> adv-equipment-tab}} + {{> adv-effects-tab}} +
+
+
+
\ No newline at end of file diff --git a/src/templates/actors/adversary/parts/header.hbs b/src/templates/actors/adversary/parts/header.hbs new file mode 100644 index 00000000..b82442f9 --- /dev/null +++ b/src/templates/actors/adversary/parts/header.hbs @@ -0,0 +1,47 @@ +
+
+

+ +

+
+ {{#if isEditMode}} + + {{else}} + {{localize roleLabel}} + {{/if}} + o +
+ {{#if isEditMode}} + + {{else}} + {{localize sizeLabel}} + {{/if}} + + {{localize typeLabel}} + {{#if isEditMode}} + + + + {{/if}} + +
+
+
+
+
+ {{localize "COSMERE.Actor.Sheet.Tier"}} +
+
+
+
+ {{actor.system.tier}} +
+
+
+
\ No newline at end of file diff --git a/src/templates/actors/adversary/parts/sheet-content.hbs b/src/templates/actors/adversary/parts/sheet-content.hbs deleted file mode 100644 index caed8592..00000000 --- a/src/templates/actors/adversary/parts/sheet-content.hbs +++ /dev/null @@ -1,132 +0,0 @@ -
-
- - - - - - - - - - - - -
-
- {{app-actor-details}} - {{#each resources as |resourceId|}} - {{app-actor-resource resource=resourceId}} - {{/each}} - - {{#if isEditMode}} -
- {{localize "COSMERE.Actor.Sheet.Expertises"}} - - - -
- {{/if}} - -
-
- {{localize "COSMERE.Actor.Skill.label_p"}} - - - {{#if skillsCollapsed}} - - {{else}} - - {{/if}} - - - {{#if isEditMode}} - - - - {{/if}} -
- -
- {{#each attributeGroups as |group|}} - {{app-adversary-skills-group collapsed=@root.skillsCollapsed group-id=group}} - {{/each}} -
-
-
-
- {{app-adversary-header}} - {{app-actor-attributes}} -
- {{> adv-actions-tab}} - {{> adv-equipment-tab}} - {{> adv-effects-tab}} -
-
-
\ No newline at end of file diff --git a/src/templates/actors/character/components/ancestry.hbs b/src/templates/actors/character/components/ancestry.hbs index 9646cd59..23f157f4 100644 --- a/src/templates/actors/character/components/ancestry.hbs +++ b/src/templates/actors/character/components/ancestry.hbs @@ -1,76 +1,33 @@ {{#if ancestry}} -
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
- {{ancestry.label}} - {{localize "COSMERE.Item.Type.Ancestry.label"}} +
+
+
+
+ + {{ancestry.label}} + {{#if isEditMode}} +
+ + + +
+ {{/if}} +
+ {{localize "COSMERE.Item.Type.Ancestry.label"}} +
+
- {{#if isEditMode}} -
- - - -
- {{/if}} - {{#if ancestry.img}}
- {{/if}} + {{/if}} +
+{{> box-corners }} {{else}} -
+
{{localize "COSMERE.Actor.Sheet.AncestryPlaceholder"}}
{{/if}} \ No newline at end of file diff --git a/src/templates/actors/character/components/connections-list.hbs b/src/templates/actors/character/components/connections-list.hbs index e85a8394..24affc86 100644 --- a/src/templates/actors/character/components/connections-list.hbs +++ b/src/templates/actors/character/components/connections-list.hbs @@ -1,58 +1,51 @@ -
    -
  • - {{localize "COSMERE.Actor.Sheet.Details.Connections.Label"}} +
      +
    • +
      + {{localize "COSMERE.Actor.Sheet.Details.Connections.Label"}} +
    • {{#each connections as |connection|}} - {{#if connection.expanded}} - - {{/if}} - -
    • - - - {{connection.name}} - +
    • +
      + + -
      - + + {{#if connection.expanded}} + + {{else}} + + {{/if}} + + {{#if @root.editable}} + + + {{/if}} - > - {{#if connection.expanded}} - - {{else}} - - {{/if}} - - - {{#if @root.editable}} - - - - {{/if}} -
      -
    • - -
    • - {{{connection.descriptionHTML}}} -
    • - - {{#if connection.expanded}} - - {{/if}} - +
+ +
+
+ {{{connection.descriptionHTML}}} +
+
+ {{/each}} {{#if editable}} -
  • +
  • diff --git a/src/templates/actors/character/components/culture.hbs b/src/templates/actors/character/components/culture.hbs index 33ab777b..f02f4911 100644 --- a/src/templates/actors/character/components/culture.hbs +++ b/src/templates/actors/character/components/culture.hbs @@ -1,79 +1,36 @@ {{#if culture}} -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - +
    +
    +
    +
    + + {{culture.label}} + {{#if isEditMode}} + + {{/if}} + + {{localize "TYPES.Item.culture"}} +
    +
    +
    + {{!-- NOTE: Currently available culture images are too low resolution to use here. + Uncomment the following block if higher resolution images are available + --}} + {{!-- {{#if culture.img}} +
    +
    - {{culture.label}} - {{localize "TYPES.Item.culture"}} -
    -{{#if isEditMode}} - -{{/if}} - -{{!-- NOTE: Currently available culture images are too low resolution to use here. - Uncomment the following block if higher resolution images are available - --}} -{{!-- {{#if culture.img}} -
    - -
    -{{/if}} --}} + {{/if}} --}} +
    +{{> box-corners }} {{else}} -
    - {{localize "COSMERE.Actor.Sheet.CulturePlaceholder"}} -
    +
    + {{localize "COSMERE.Actor.Sheet.CulturePlaceholder"}} +
    {{/if}} \ No newline at end of file diff --git a/src/templates/actors/character/components/expertises.hbs b/src/templates/actors/character/components/expertises.hbs index 56c36125..f76da602 100644 --- a/src/templates/actors/character/components/expertises.hbs +++ b/src/templates/actors/character/components/expertises.hbs @@ -1,4 +1,4 @@ -
    +
    {{localize "COSMERE.Actor.Sheet.Expertises"}} diff --git a/src/templates/actors/character/components/favorites.hbs b/src/templates/actors/character/components/favorites.hbs index 0503465b..95e94119 100644 --- a/src/templates/actors/character/components/favorites.hbs +++ b/src/templates/actors/character/components/favorites.hbs @@ -1,54 +1,59 @@ -
    - - {{localize "COSMERE.Actor.Sheet.Favorites"}} +
    +
    + + {{localize "COSMERE.Actor.Sheet.Favorites"}} +
    -
      +
        {{#each favorites as |item|}} {{#with (itemContext item) as |ctx|}} - -
      • - {{!-- Image --}} -
        - - -
        +
        + {{!-- Image --}} +
        + + +
        - {{!-- Name --}} -
        - {{item.name}} - {{{ctx.subtitle}}} -
        + {{!-- Name --}} +
        + {{item.name}} + {{{ctx.subtitle}}} +
        - {{!-- Activation --}} -
        - {{#if ctx.hasActivation}} - {{#if ctx.activation.hasCost}} - - {{#if (eq ctx.activation.cost.type "act")}} - {{ ctx.activation.cost.value }} - {{else}} - {{cosmereDingbat ctx.activation.cost.type}} + {{!-- Activation --}} +
        + {{#if ctx.hasActivation}} + {{#if ctx.activation.hasCost}} + + {{#if (eq ctx.activation.cost.type "act")}} + {{ ctx.activation.cost.value }} + {{else}} + {{cosmereDingbat ctx.activation.cost.type}} + {{/if}} + + {{else}} + + {{/if}} {{/if}} - - {{/if}} - {{/if}} -
        +
        - {{!-- Controls --}} -
        + {{!-- Controls --}} {{#if @root.isEditMode}} - - - +
        + + + +
        {{/if}} -
        +
      • {{/with}} {{/each}} diff --git a/src/templates/actors/character/components/goals-list.hbs b/src/templates/actors/character/components/goals-list.hbs index 0eff1c4f..3f1a8b87 100644 --- a/src/templates/actors/character/components/goals-list.hbs +++ b/src/templates/actors/character/components/goals-list.hbs @@ -1,45 +1,51 @@ -
          -
        • - {{localize "COSMERE.Actor.Sheet.Details.Goals.Label"}} + {{#if editable}} -
          +
          diff --git a/src/templates/actors/character/components/paths.hbs b/src/templates/actors/character/components/paths.hbs index 1d60ef78..0934a60c 100644 --- a/src/templates/actors/character/components/paths.hbs +++ b/src/templates/actors/character/components/paths.hbs @@ -2,108 +2,60 @@
          - {{!-- Details --}} -
          -
          - - - - - - - - - - - - - - - - - - - - - - - - - -
          -
          - {{path.name}} - {{localize path.typeLabel}} Path -
          +
          +
          + {{!-- Details --}} +
          +
          + {{path.name}} + {{#if @root.isEditMode}} + + {{/if}} + + {{localize path.typeLabel}} Path +
          +
          +
          +
          + {{#if path.level}}{{path.level}}{{else}}0{{/if}} +
          +
          +
          -
          - {{path.level}} -
          + {{!-- Skills --}} + {{#if (gt path.skills.length 0)}} +
            + {{#each path.skills as |skill|}} +
          • + {{app-actor-skill + skill=skill.id + readonly=(not @root.isEditMode) + pips=true + }} +
          • + {{/each}} +
          + {{/if}} +
          - {{#if @root.isEditMode}} -
          - - - + {{!-- Background image --}} + {{#if img}} +
          +
          {{/if}}
          - - {{!-- Skills --}} - {{#if (gt path.skills.length 0)}} -
            - {{#each path.skills as |skill|}} -
          • - {{app-actor-skill - skill=skill.id - readonly=(not @root.isEditMode) - pips=true - }} -
          • - {{/each}} -
          - {{/if}} - - {{!-- Background image --}} - {{#if img}} -
          - -
          - {{/if}} + {{> box-corners }}
          {{/each}} {{#if (eq paths.length 0)}} -
          +
          {{localize "COSMERE.Actor.Sheet.PathPlaceholder"}}
          {{/if}} \ No newline at end of file diff --git a/src/templates/actors/character/partials/char-details-tab.hbs b/src/templates/actors/character/partials/char-details-tab.hbs index e3aea737..29eb6f80 100644 --- a/src/templates/actors/character/partials/char-details-tab.hbs +++ b/src/templates/actors/character/partials/char-details-tab.hbs @@ -1,27 +1,31 @@ {{#with (lookup tabsMap "details") as |tab|}} -
          +
          {{#each @root.attributeGroups as |group|}} - {{app-actor-skills-group group-id=group}} + {{app-actor-skills-group group-id=group}} {{/each}} {{app-character-expertises}}
          - {{app-character-ancestry}} + {{#if @root.actor.ancestry}} + {{app-character-ancestry}} + {{else}} +
          + {{localize "COSMERE.Actor.Sheet.AncestryPlaceholder"}} +
          + {{/if}} - {{!-- Cultures --}} {{#if (gt @root.actor.cultures.length 0)}} {{#each @root.actor.cultures as |culture|}} {{app-character-culture culture=culture}} {{/each}} {{else}} -
          +
          {{localize "COSMERE.Actor.Sheet.CulturePlaceholder"}}
          {{/if}} - - {{!-- Paths --}} + {{app-character-paths-list}}
          diff --git a/src/templates/actors/character/partials/char-goals-tab.hbs b/src/templates/actors/character/partials/char-goals-tab.hbs index 105b1dc2..0fb7cc93 100644 --- a/src/templates/actors/character/partials/char-goals-tab.hbs +++ b/src/templates/actors/character/partials/char-goals-tab.hbs @@ -1,14 +1,14 @@ {{#with (lookup tabsMap "goals") as |tab|}} -
          +
          -
          - - - {{localize "COSMERE.Actor.Sheet.Details.Purpose"}} - -
          +
          +
          + + {{localize "COSMERE.Actor.Sheet.Details.Purpose"}} +
          +
          @@ -16,12 +16,12 @@
          -
          - - - {{localize "COSMERE.Actor.Sheet.Details.Obstacle"}} - -
          +
          +
          + + {{localize "COSMERE.Actor.Sheet.Details.Obstacle"}} +
          +
          diff --git a/src/templates/actors/character/parts/content.hbs b/src/templates/actors/character/parts/content.hbs new file mode 100644 index 00000000..44b09310 --- /dev/null +++ b/src/templates/actors/character/parts/content.hbs @@ -0,0 +1,26 @@ +
          +
          + {{app-actor-details}} + {{#each @root.resources as |resourceId|}} + {{app-actor-resource resource=resourceId}} + {{/each}} + +
          +
          + {{app-character-favorites class="list-component"}} +
          +
          +
          +
          + {{app-actor-attributes}} +
          +
          + {{> char-details-tab}} + {{> char-actions-tab}} + {{> char-equipment-tab}} + {{> char-goals-tab}} + {{> char-effects-tab}} +
          +
          +
          +
          \ No newline at end of file diff --git a/src/templates/actors/character/parts/header.hbs b/src/templates/actors/character/parts/header.hbs index 69ff3761..76bb33ac 100644 --- a/src/templates/actors/character/parts/header.hbs +++ b/src/templates/actors/character/parts/header.hbs @@ -1,49 +1,7 @@
          -
          - - - - - - -
          -

          - {{#if isEditMode}} - - {{else}} - {{actor.name}} - {{/if}} +

          +

          {{ localize ancestryLabel }} @@ -78,20 +36,12 @@
          -
          +
          {{localize "COSMERE.Actor.Sheet.Level"}}
          +
          +
          - - - {{derived actor.system.level.total}}
          diff --git a/src/templates/actors/character/parts/sheet-content.hbs b/src/templates/actors/character/parts/sheet-content.hbs deleted file mode 100644 index d15022ed..00000000 --- a/src/templates/actors/character/parts/sheet-content.hbs +++ /dev/null @@ -1,60 +0,0 @@ -
          -
          - - - - - - -
          -
          - {{app-actor-details}} - {{#each @root.resources as |resourceId|}} - {{app-actor-resource resource=resourceId}} - {{/each}} - - {{app-character-favorites class="list-component"}} -
          -
          - {{app-actor-attributes}} -
          - {{> char-details-tab}} - {{> char-actions-tab}} - {{> char-equipment-tab}} - {{> char-goals-tab}} - {{> char-effects-tab}} -
          -
          -
          \ No newline at end of file diff --git a/src/templates/actors/components/actions-list.hbs b/src/templates/actors/components/actions-list.hbs index 384ac586..5fcfa18d 100644 --- a/src/templates/actors/components/actions-list.hbs +++ b/src/templates/actors/components/actions-list.hbs @@ -1,144 +1,152 @@ {{#each sections as |section|}} -
            +
            • - {{localize section.label}} - - {{localize "COSMERE.Actor.Sheet.Actions.Activation"}} - - - {{localize "COSMERE.Actor.Sheet.Actions.Consume"}} - - - {{localize "COSMERE.Actor.Sheet.Actions.Uses"}} - -
              -
              - {{#if @root.editable}} - {{#if section.canAddNewItems}} - - - - {{else}} -
              +
              + {{localize section.label}} + + {{localize "COSMERE.Actor.Sheet.Actions.Activation"}} + + + {{localize "COSMERE.Actor.Sheet.Actions.Consume"}} + + + {{localize "COSMERE.Actor.Sheet.Actions.Uses"}} + +
              + {{#if @root.editable}} + {{#if section.canAddNewItems}} + + + + {{else}} +
              + {{/if}} {{/if}} - {{/if}} -
              +
              +
        • {{#each section.items as |item|}} {{#with (lookup @root.itemState item.id) as |state|}} - {{#with (itemContext item) as |ctx|}} + {{#with (itemContext item) as |ctx|}} + {{#with (lookup section.itemData item.id) as |data|}} -
        • - {{!-- Image --}} -
          - - -
          +
          + {{!-- Image --}} +
          + + +
          - {{!-- Name --}} -
          - + {{!-- Name --}} + {{#if ctx.isWeapon}}{{localize "COSMERE.Item.Weapon.Strike"}}: {{/if}}{{item.name}} -
          - {{!-- Activation --}} -
          - {{#if ctx.hasActivation}} - {{#if ctx.activation.hasCost}} - - {{#if (eq ctx.activation.cost.type "act")}} - {{ ctx.activation.cost.value }} - {{else}} - {{cosmereDingbat ctx.activation.cost.type}} + {{!-- Activation --}} +
          + {{#if ctx.hasActivation}} + {{#if ctx.activation.hasCost}} + + {{#if (eq ctx.activation.cost.type "act")}} + {{ ctx.activation.cost.value }} + {{else}} + {{cosmereDingbat ctx.activation.cost.type}} + {{/if}} + + {{else}} + + {{/if}} {{/if}} - - {{/if}} - {{/if}} -
          +
          - {{!-- Consume --}} -
          {{!-- Consume --}} - {{#if ctx.hasConsume}} +
          + {{!-- Consume --}} + {{#if ctx.hasConsume}} - {{#if ctx.consume.consumesResource}} - {{ ctx.consume.value }} {{localize ctx.consume.resourceLabel }} - {{/if}} - - {{!-- TODO: Item consume --}} - {{#if ctx.consume.consumesItem}} - - {{/if}} - - {{else}} - - {{/if}} -
          + {{#if ctx.consume.consumesResource}} + {{ ctx.consume.value }} {{localize ctx.consume.resourceLabel }} + {{/if}} - {{!-- Uses --}} -
          - {{#if ctx.hasUses}} + {{!-- TODO: Item consume --}} + {{#if ctx.consume.consumesItem}} + + {{/if}} - {{#if (or (gt ctx.uses.max 1) (not ctx.uses.hasRecharge))}} - - {{ ctx.uses.value }} / {{ctx.uses.max}} - {{#if ctx.uses.hasRecharge}} - {{localize ctx.uses.rechargeLabel }} + {{else}} + {{/if}} - - {{else}} - - {{#if ctx.uses.hasRecharge}} - {{localize ctx.uses.rechargeLabel }} +
          + + {{!-- Uses --}} +
          + {{#if ctx.hasUses}} + + {{#if (or (gt ctx.uses.max 1) (not ctx.uses.hasRecharge))}} + + {{ ctx.uses.value }} / {{ctx.uses.max}} + {{#if ctx.uses.hasRecharge}} + {{localize ctx.uses.rechargeLabel }} + {{/if}} + + {{else}} + + {{#if ctx.uses.hasRecharge}} + {{localize ctx.uses.rechargeLabel }} + {{/if}} + {{/if}} - - {{/if}} - {{else}} - - {{/if}} -
          - - {{!-- Controls --}} -
          - - - - - {{#if @root.editable}} - - - - {{/if}} -
          + {{else}} + + {{/if}} +
          + + {{!-- Controls --}} +
          + + {{#if state.expanded}} + + {{else}} + + {{/if}} + + {{#if @root.editable}} + + + + {{/if}} +
          +
          + +
          +
          + {{{default data.descriptionHTML '

          '}}} +
          +
        • - - {{#with (lookup section.itemData item.id) as |data|}} - -
        • -
          - {{{default data.descriptionHTML '

          '}}} -
          -
        • {{/with}} - {{/with}} {{/with}} {{/each}} diff --git a/src/templates/actors/components/attributes.hbs b/src/templates/actors/components/attributes.hbs index 9b17a94e..02077a8d 100644 --- a/src/templates/actors/components/attributes.hbs +++ b/src/templates/actors/components/attributes.hbs @@ -9,66 +9,64 @@ {{!-- Attributes and defense --}}
          {{#with attrGroup.attributes.[0] as |attribute|}} -
          -
          - - {{ localize attribute.config.labelShort }} - - +
          +
          +
          +
          + + {{ localize attribute.config.labelShort }} + {{#if (not @root.isEditMode)}} - {{else}} - {{/if}} - +
          {{/with}} {{#with attrGroup.defense as |defense|}} -
          -
          - - - - {{ derived defense.value }} +
          + DEF +
          +
          +
          {{#if @root.isEditMode}} - - {{/if}} + {{/if}} + {{ derived defense.value }}
          {{/with}} {{#with attrGroup.attributes.[1] as |attribute|}} -
          -
          - - {{ localize attribute.config.labelShort }} - - +
          +
          +
          +
          + + {{ localize attribute.config.labelShort }} + {{#if (not @root.isEditMode)}} - {{else}} - {{/if}} - +
          {{/with}}
          diff --git a/src/templates/actors/components/conditions.hbs b/src/templates/actors/components/conditions.hbs index d0a6f697..9206a610 100644 --- a/src/templates/actors/components/conditions.hbs +++ b/src/templates/actors/components/conditions.hbs @@ -1,22 +1,26 @@ -
          - {{localize "COSMERE.Actor.Sheet.Conditions"}} -
          -
          - {{#each conditions as |condition|}} - - {{/each}} +
          +
        diff --git a/src/templates/actors/components/details.hbs b/src/templates/actors/components/details.hbs index decb9878..c7c14858 100644 --- a/src/templates/actors/components/details.hbs +++ b/src/templates/actors/components/details.hbs @@ -3,68 +3,60 @@
    - {{#if (and editable displayRestButtons)}} + {{#if (and editable displayRestButtons)}} + + + - - {{/if}} - {{#if displayRecovery}} -
    - - - - {{#with actor.system.deflect as |deflect|}} - - {{derived deflect}} - - {{/with}} - - {{#if isEditMode}} - - - - {{/if}} + {{#if displayRecovery}} +
    +
    +
    +
    + {{#with actor.system.deflect as |deflect|}} + {{derived deflect}} + {{/with}} +
    + + {{localize "COSMERE.Actor.Statistics.Deflect"}} + {{#if isEditMode}} + + + + {{/if}} +
    {{/if}}
    {{!-- Movement --}} -
    +
    - - - +
    +
    {{derived actor.system.movement.rate}} ft
    {{localize "COSMERE.Actor.Statistics.MovementRate"}} - {{#if isEditMode}} + {{else}} -
    - {{/if}} {{!-- Senses --}} -
    +
    - - - +
    +
    {{#with (derived actor.system.senses.range) as |range|}} {{#if (isNumMax range)}} @@ -151,7 +125,6 @@
    {{localize "COSMERE.Actor.Statistics.SensesRange"}} - {{#if isEditMode}} -
  • -
    - {{localize effectsTitle}} -
    -
    - {{localize "COSMERE.Sheet.Effects.Source"}} -
    -
    -
    - {{#if @root.editable}} -
    - {{/if}} -
    +
    -{{/if}} \ No newline at end of file + \ No newline at end of file diff --git a/src/templates/actors/components/equipment-list.hbs b/src/templates/actors/components/equipment-list.hbs index 3f7d492c..fd16d5b2 100644 --- a/src/templates/actors/components/equipment-list.hbs +++ b/src/templates/actors/components/equipment-list.hbs @@ -1,176 +1,175 @@ {{#each sections as |section|}} -
      +
      • - {{localize section.label}} - - {{localize "COSMERE.Actor.Sheet.Equipment.Quantity"}} - - - {{localize "COSMERE.Actor.Sheet.Equipment.Weight"}} - -
        -
        -
        - {{#if @root.editable}} - {{#if section.canAddNewItems}} - - - - {{else}} -
        +
        + {{localize section.label}} + + {{localize "COSMERE.Actor.Sheet.Equipment.Quantity"}} + + + {{localize "COSMERE.Actor.Sheet.Equipment.Weight"}} + +
        +
        + {{#if @root.editable}} + {{#if section.canAddNewItems}} + + + + {{else}} +
        + {{/if}} {{/if}} - {{/if}} -
        +
        +
      • {{#each section.items as |item|}} {{#with (lookup @root.itemState item.id) as |state|}} {{#with (itemContext item) as |ctx|}} + {{#with (lookup section.itemData item.id) as |data|}} -
      • - {{!-- Image --}} -
        - - -
        - - {{!-- Name --}} -
        - {{item.name}} - {{{ctx.subtitle}}} -
        - - {{!-- Quantity --}} -
        - {{#if ctx.hasQuantity}} - {{#if @root.editable}} - - - - {{/if}} - {{ctx.quantity}} - {{#if @root.editable}} - + {{!-- Image --}} +
        - - - {{/if}} - {{else}} - - {{/if}} -
        - - {{!-- Weight --}} -
        - {{#if ctx.hasWeight}} - - {{ctx.weight.total}} - {{else}} - - {{/if}} -
        - - {{!-- Equipped --}} -
        - {{#if ctx.isEquippable}} + + +
        - {{#if (eq ctx.equip.type 'hold')}} - {{!-- Items equipped by holding them --}} + {{!-- Name --}} +
        + {{item.name}} + {{{ctx.subtitle}}} +
        - {{#if (eq ctx.equip.hold 'two_handed')}} - {{!-- Two handed item --}} - + {{#if ctx.hasQuantity}} + {{#if @root.editable}} + + + + {{/if}} + {{ctx.quantity}} + {{#if @root.editable}} + + + {{/if}} - > - - - - {{else}} - {{!-- One handed item --}} - — {{/if}} - > - - - -
        - {{/if}} - {{else}} - {{!-- Items equipped by wearing them --}} - + {{#if ctx.hasWeight}} + + {{ctx.weight.total}} {{else}} - data-tooltip="COSMERE.Item.Equip.Unequipped.Label" + {{/if}} - > - - - - {{/if}} - - {{/if}} +
  • - + {{!-- Equipped --}} +
    + {{#if ctx.isEquippable}} + {{#if (eq ctx.equip.type 'hold')}} + {{!-- Items equipped by holding them --}} + {{#if (eq ctx.equip.hold 'two_handed')}} + {{!-- Two handed item --}} + +
    +
    + {{else}} + {{!-- One handed item --}} + +
    +
    +
    + {{/if}} - {{!-- Controls --}} -
    - - - - - {{#if @root.editable}} - - - + {{else}} + {{!-- Items equipped by wearing them --}} + + + + {{/if}} {{/if}} -
    - - +
    - {{#with (lookup section.itemData item.id) as |data|}} + {{!-- Controls --}} +
    + + {{#if state.expanded}} + + {{else}} + + {{/if}} + + {{#if @root.editable}} + + + + {{/if}} +
    + -
  • -
    - {{{default data.descriptionHTML '

    '}}} -
    +
    +
    + {{{default data.descriptionHTML '

    '}}} +
    +
  • {{/with}} - {{/with}} {{/with}} {{/each}} diff --git a/src/templates/actors/components/injuries-list.hbs b/src/templates/actors/components/injuries-list.hbs index 47e6ff78..953bda07 100644 --- a/src/templates/actors/components/injuries-list.hbs +++ b/src/templates/actors/components/injuries-list.hbs @@ -1,70 +1,69 @@ -
      -
    • -
      +
        +
      • +
        {{localize "COSMERE.Actor.Sheet.Injuries.Label"}} -
      -
      - {{localize "COSMERE.Actor.Sheet.Injuries.Duration"}} -
      -
      -
      - {{#if editable}} - - - - {{else}} -
      - {{/if}} -
      + + {{localize "COSMERE.Actor.Sheet.Injuries.Duration"}} + +
      +
      + {{#if editable}} + + + + {{else}} +
      + {{/if}} +
      +
    • {{#each injuries as |injury|}} -
    • -
      - -
      -
      - {{injury.name}} -
      -
      - {{#if injury.isPermanent}} - {{localize "COSMERE.Actor.Sheet.Injuries.Permanent"}} - {{else}} - {{#if @root.editable}} - - - - {{/if}} - {{injury.duration.remaining}} {{localize "COSMERE.Actor.Sheet.Injuries.Days"}} - {{#if @root.editable}} - - - - {{/if}} - {{/if}} -
      -
      -
      - {{#if @root.editable}} - - - - {{/if}} -
      +
      +
      + +
      +
      + {{injury.name}} +
      +
      + {{#if injury.isPermanent}} + {{localize "COSMERE.Actor.Sheet.Injuries.Permanent"}} + {{else}} + {{#if @root.editable}} + + + + {{/if}} + {{injury.duration.remaining}} {{localize "COSMERE.Actor.Sheet.Injuries.Days"}} + {{#if @root.editable}} + + + + {{/if}} + {{/if}} +
      +
      +
      + {{#if @root.editable}} + + + + {{/if}} +
      +
    • - - {{/each}}
    diff --git a/src/templates/actors/components/resource.hbs b/src/templates/actors/components/resource.hbs index 7a1efe2b..136079f5 100644 --- a/src/templates/actors/components/resource.hbs +++ b/src/templates/actors/components/resource.hbs @@ -1,7 +1,15 @@
    -
    +