diff --git a/ADnD_1E_Revised/.gitignore b/ADnD_1E_Revised/.gitignore new file mode 100644 index 0000000000..4104261373 --- /dev/null +++ b/ADnD_1E_Revised/.gitignore @@ -0,0 +1,11 @@ +# Root level ignores +node_modules/ +dev/ +prod/ +.vscode/ + +# src/ folder ignores +src/node_modules/ +src/dev/ +src/prod/ +src/.vscode/ \ No newline at end of file diff --git a/ADnD_1E_Revised/1ESheet.html b/ADnD_1E_Revised/1ESheet.html index 92ec80864f..bea48a1a8c 100644 --- a/ADnD_1E_Revised/1ESheet.html +++ b/ADnD_1E_Revised/1ESheet.html @@ -1,13686 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
- - Monster - -
- -
-
- - - - - - - - - - - - -
- - i -
- -

Important Sheet Announcements

-
- - v - - • 11/21/25' -
-
    -
    Latest
    -
  • Fixed a layout alignment glitch with the Equipment sorting option buttons when viewed in FF.
  • -
  • Added a couple sorting options to Equipment. Sort AZ and Sort by Location, then Item AZ. Includes an "Undo" option that will restore the previous natural order.
  • -
  • Added a couple sorting options to Spells. Sort AZ and Sort by Level, then Spell AZ. Includes an "Undo" option that will restore the previous natural order.
  • -
  • Update to Spells; adding new spells will automatically set a Spell's caster class and level based on the current Caster and Spell Level tabs selected. example; If the current Spell Tab is set to show "3rd" level spells and a new spell is added "+", entering a spell name will trigger the sheet to set the Spell's level to "3". If the tab is set to "All" or if the Spell's level has already been set, the Spell's level will not be changed. If the spell is added using an API mod, the Spell's level will not be changed. Caster Class selected acts similarly.
  • -
  • "Spell Lvl" is now shown with the Spell Name and #Memorized/Prepared. Hidden when the Spell details is expanded.
  • -
  • Made a correction with the Spell Level Tab behavior when editing a Spell's Level while showing "All" levels. Tab would incorrectly change the Spell Level Tab to match the new Spell Level. Expected behavior is to stay on "All".
  • -
  • Updated the Thief Skills Dex and Race auto-fill option. Expanded the Dex Thief skill adjustments up to DEX 25.
  • -
  • Updated dependencies used to bundle the sheet. Impacts dev environment only.
  • -
  • Updated title text on max fields from '..._max' to '...|max'. Macros and token bars need to use '...|max'
  • -
  • Added "Roll Template Color" selector to the sheet's default settings options.
  • - -
    Previous
    -
  • Updated the 'Equipment|Weapon|+Add' button to set all default weapon values for the attack row instead of just those synced from the Equipment's row. Fixes default hit-table info not being posted to chat (unless the selector was manually set) if the attack was created using the Equipment button.
  • -
  • Added a very subtle linear-gradient background(top transparent to bottom light gray) to a few sections to help introduce a little contrast between sections.
  • -
  • Fixed Equipment tabs for Carried|Not Carried|Mount|All not filtering.
  • -
  • Updated sheetworker logic used when creating new repeating rows. Allows API mods to detect the default values.
  • -
  • Updated the NWP title-text, inverting the +/- appropriately so it makes sense. Added an additional option in the NWP row dropdown to include a "vs Base" (which will give a roll-time query to enter a base/target value) to accommodate anyone that is using OA's version of NWP.
  • -
  • Open Doors changed from percentage roll to d6 (or larger die for demi-god level STR values).
  • -
  • Added additional logic to auto-fill bonus languages as per PHB. Previously the sheet only auto-filled Humans. This update will only effect new characters going forward. @{bonuslanguages} will remain unchanged for existing characters unless Race or INT are changed.
  • -
  • Added setting the NWP default values using sheetworkers upon row creation to help with API attribute recognition. ie ScriptCards. Also added a "Val." column to show the current value of the Ability selected.
  • -
  • Added a "Magical" column and checkbox to equipment. Check this box if an item has magical properties. Items that are checked will also be displayed when the "Magic" tab is selected regardless of their type category.
  • -
  • Added options to autofill Thief Skills racial and Dex modifiers.
  • -
  • Added an option to the Thief Skills to sync to a class. Base value will continue to auto-adjust whenever the class level changes.
  • -
  • Added an option to the Attack Matrix/THAC0 section to sync to-Hit values to a class. Table data will continue to auto-adjust whenever the class level changes. Multi/Dual-class characters should choose the most favorable class. Class names entered on the sheet need to match one of the core 1e classes in order for this option to work.
  • -
  • Added an option to use a 5% progression based to-Hit table for Fighters. (DMG p74) Use 5% checkbox added to Settings|Misc. Options and inside the Attack/THAC0 Matrix window.
  • -
  • Attack/THACO Matrix section has been updated so that it's opened/closed state will remain persistent. It will be open by default on new sheets.
  • -
  • Removed the character_name validation warning for the use of commas within a character's name.
  • -
- -
- -
-
-
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - -
- - - - - -
-
- - - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- - - -
-
-
- - - - - - - -
-
- -
- -
- -
- - - - - - - - - -
- -
- -   - - -   - - - - - - - Class Details - - - - Armor Details - - - - - - - -
- -
- -
- - -
-
-
- -
- -
CLASS DETAILS
- -
- - Class - Lvl - HD - HP/Level - - HP+Con - - XP - Next Level - +10% - - - - - - - = - - - - - - - - - - - - - = - - - - - - - - - - - - - = - - - - - - - -
- - - - - - - - - - - - - - -
-
- -
- -
ARMOR DETAILS
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Armor Type - In Use - Name - AC - AR - Magic - Misc - Carried - Bulk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - More - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- -
PERSONAL ATTRIBUTES
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Character History/Bio - - - - - - - -
-
-
- -
- -
ABILITIES
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - = - Base COM - - + - CHA Adj. - - + - Racial Adj. - - - - -
- -
- Speed and Movement - - Adjusted Speed - - Explore/Map - Known Route - Run/Flee - - - - - - -

Move/Round

- - - - - - - - - - - -
-
-
-
- -
- -
SAVES
-
- - - - - - -
-
- - - TOTAL - - Base/Class - - Racial Adj. - - Ability Adj. - - Misc. Adj. - - Temp. Adj. - - - - - = - - ± - - - - ± - - - - ± - - - - ± - - - - - - - - = - - ± - - - - ± - - - - ± - - - - ± - - - - - - - - = - - ± - - - - ± - - - - ± - - - - ± - - - - - - - - = - - ± - - - - ± - - - - ± - - - - ± - - - - - - - - = - - ± - - - - ± - - - - ± - - - - ± - - - - - - Custom Saves -
- -
- - - - - -
- - = - - ± - - - - ± - - - - ± - - - - ± - - - -
- -
- - - - - -
- - = - - ± - - - - ± - - - - ± - - - - ± - - - -
- -
- - - - - -
- - = - - ± - - - - ± - - - - ± - - - - ± - - - -
-
- - - - - - - - -
-
-
- -
- -
- ATTACKS - ATTACKS -
- - -
-

Weapon Proficiency:

- - - - - -

Weapons:

- - - - - - - - - - - - -
- - -
- - nearby_error - - -
- - ATTACK MATRIX - THAC0 -
- -
- - - - -
- - - - - - - - - - - - - - - - - - - - -
- -
-
- - -10 - -9 - -8 - -7 - -6 - -5 - -4 - -3 - -2 - -1 - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
-
- - -10 - -9 - -8 - -7 - -6 - -5 - -4 - -3 - -2 - -1 - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- -
- -
- - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - -
- - - - -
-
- - - - - - - - - -
Armor Type:
- 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - - -
- - - - - -
Adjustment:
- - - - - - - - - - - - -
-
- - -
-
-
-
-
- -
- -
EQUIPMENT
-
- - - - -
-
- Gear - Weapon - Armor - Magic - Other - All - - Carried - Not Carried - Mount - All -
-
- - - - - Item - Location - Type - Magical - Uses - / - Max - Carried? - Qty - / - Max - Wt - Cost - -
- - -
-
- - - - - - - - - / - - - - - / - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
-
- -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
- Wealth -
- - Copper - Silver - Electrum - Gold - Platinum -
-
- - - - - - - -
-
-
- - - - - - -
- -
- -
- Carrying Capacity -
- Strength Adj. - - Current Encumbrance - (gp)(lbs) - -
-
- - - - - - - -
-
-
-
- -
- -
- SPECIAL ABILITIES - SPECIAL ABILITIES -
- -
-
-

Psionics

- - - - - - - - - - - -
- - - - Name - Short Description - Uses - - - - Name - Uses - - Name - Uses - -
- - - - - - - - -
- - - -
- - - -
-
- - - - - - - - -
- - - - - -
-
- - -
-
-
- -
- -
NON WEAPON PROFICIENCIES
-
- - - Proficiency - Short Description - Attribute/Base - Val. - Adj. - Slots - -
- - - - - - - - - -
- - - - - - - - -
-
-
-
-
- -
- -
THIEF SKILLS
- -
- - - - - - - - - - - - - - -
-
- - Function - TOTAL - - Base/Level - - Dex Adj. - - Racial Adj. - - Magic/Item - - - - - - = - - ± - - ± - - ± - - - - - - = - - ± - - ± - - ± - - - - - - = - - ± - - ± - - ± - - - - - - = - - ± - - ± - - ± - - - - - - = - - ± - - ± - - ± - - - - - - = - - ± - - ± - - ± - - - - - - - = - - ± - - ± - - ± - - - - - - = - - ± - - ± - - ± - - - - Custom Functions -
- -
- - - - - -
- - = - - ± - - ± - - ± - -
- -
- - - - - -
- - = - - ± - - ± - - ± - -
- -
- - - - - -
- - = - - ± - - ± - - ± - -
-
- -

Backstab:

- - -
-
-
-
- -
- -
SPELLS
-
-
- - - - - - - Cur / Max - Cur / Max - Cur / Max - Cur / Max - Cur / Max - Cur / Max - Cur / Max - Cur / Max - Cur / Max - Cur / Max - - - - - - - - - - - - - - - - - - - - - - - - - Cantrips - 1st - 2nd - 3rd - 4th - 5th - 6th - 7th - 8th - 9th - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cantrips - 1st - 2nd - 3rd - 4th - 5th - 6th - 7th - 8th - 9th - -
-
-
- Caster 1 - Caster 2 - All -
- - - - - - - - -
-
- Cantrips - 1st - 2nd - 3rd - 4th - 5th - 6th - 7th - 8th - 9th - All -
-
-
- - - - - - - - - - - - - - -
- - - -
- - - - - - - - - - - - - -
- - - - - - -
-
-
- - Spells Notes -
- -
-
-
-
- -
- -
NOTES
-
- - - - - - - - - - - - -
-
-
- - - - - - - -
- - - - -
-
-
-
-
- -
- -
SETTINGS
-
-

Reminder: these are per-sheet settings only. DM's that would like to set their own defaults for new characters can do so using the Default Settings section found in the main Game Settings page. If you would also like to apply these settings to all existing characters in the game follow the wiki instructions:

- - - - - -

Sheet Image:

- -
- -

Surprise die:

- - -
- -

Surprise Others die:

- - -
- -

Initiative die:

- - -
- -

Misc. Options:

- - - - - - -
- - -

- Cleric: -

-

Standard Turn Undead:

- - - - -

Alternate Turn Undead:

- - - -
- -

Hide Areas:

- - - - - - - - - - -
- -

Whisper Options:

- - -
- -

ADVANCED Options:

- - - - - - - - - - - - - - - - - - -
-
- -
- -
CUSTOM ATTRIBUTES
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
- - -
-
- - - -
- - -
- - {{#bigname}} - {{bigname}} - {{/bigname}} - - - {{#name}} - {{name}} - {{/name}} - {{#subtag}} - {{subtag}}{{#dual}} ({{dual}}){{/dual}} - {{/subtag}} - - - {{#bigtext1}}{{bigtext1}}{{/bigtext1}} - {{#bigtext2}}{{bigtext2}}{{/bigtext2}} - {{#bigtext3}}{{bigtext3}}{{/bigtext3}} - {{#bigtext4}}{{bigtext4}}{{/bigtext4}} - {{#bigtext5}}{{bigtext5}}{{/bigtext5}} - {{#bigtext6}}{{bigtext6}}{{/bigtext6}} - {{#bigtext7}}{{bigtext7}}{{/bigtext7}} - {{#bigtext8}}{{bigtext8}}{{/bigtext8}} - {{#bigtext9}}{{bigtext9}}{{/bigtext9}} - {{#bigtext10}}{{bigtext10}}{{/bigtext10}} - {{#bigtext11}}{{bigtext11}}{{/bigtext11}} - {{#bigtext12}}{{bigtext12}}{{/bigtext12}} - {{#attack1}} - - Attack = {{attack1}} - {{#rollWasCrit() attack1}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - {{/rollWasCrit() attack1}} - - - {{#^rollGreater() crit 0}} - {{#crit}} - {{#damagevsSMchatmenu}}{{#damagevsLchatmenu}} - - - {{damagevsSMchatmenu}}{{damagevsLchatmenu}} - - - {{/damagevsLchatmenu}}{{/damagevsSMchatmenu}} - {{/crit}} - {{/^rollGreater() crit 0}} - - {{#rollGreater() crit 0}} - {{#crit}} - {{#^rollWasCrit() attack1}} - {{#damagevsSMchatmenu}}{{#damagevsLchatmenu}} - - - {{damagevsSMchatmenu}}{{damagevsLchatmenu}} - - - {{/damagevsLchatmenu}}{{/damagevsSMchatmenu}} - {{/^rollWasCrit() attack1}} - {{#rollWasCrit() attack1}} - {{#critdamagevsSMchatmenu}}{{#critdamagevsLchatmenu}} - - - {{critdamagevsSMchatmenu}}{{critdamagevsLchatmenu}} - - - {{/critdamagevsLchatmenu}}{{/critdamagevsSMchatmenu}} - {{/rollWasCrit() attack1}} - {{/crit}} - {{/rollGreater() crit 0}} - {{/attack1}} - - {{#attack2}} - - Attack 2 = {{attack2}} - {{#rollWasCrit() attack2}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - {{/rollWasCrit() attack2}} - - - {{#rollGreater() crit 0}} - {{#crit}} - {{#^rollWasCrit() attack2}} - {{#damagevsSMchatmenu}}{{#damagevsLchatmenu}} - - - {{damagevsSMchatmenu}}{{damagevsLchatmenu}} - - - {{/damagevsLchatmenu}}{{/damagevsSMchatmenu}} - {{/^rollWasCrit() attack2}} - {{#rollWasCrit() attack2}} - {{#critdamagevsSMchatmenu}}{{#critdamagevsLchatmenu}} - - - {{critdamagevsSMchatmenu}}{{critdamagevsLchatmenu}} - - - {{/critdamagevsLchatmenu}}{{/critdamagevsSMchatmenu}} - {{/rollWasCrit() attack2}} - {{/crit}} - {{/rollGreater() crit 0}} - {{/attack2}} - - {{#attack3}} - - Attack 3 = {{attack3}} - {{#rollWasCrit() attack3}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - {{/rollWasCrit() attack3}} - - - {{#rollGreater() crit 0}} - {{#crit}} - {{#^rollWasCrit() attack3}} - {{#damagevsSMchatmenu}}{{#damagevsLchatmenu}} - - - {{damagevsSMchatmenu}}{{damagevsLchatmenu}} - - - {{/damagevsLchatmenu}}{{/damagevsSMchatmenu}} - {{/^rollWasCrit() attack3}} - {{#rollWasCrit() attack3}} - {{#critdamagevsSMchatmenu}}{{#critdamagevsLchatmenu}} - - - {{critdamagevsSMchatmenu}}{{critdamagevsLchatmenu}} - - - {{/critdamagevsLchatmenu}}{{/critdamagevsSMchatmenu}} - {{/rollWasCrit() attack3}} - {{/crit}} - {{/rollGreater() crit 0}} - {{/attack3}} - - {{#attack4}} - - Attack 4 = {{attack4}} - {{#rollWasCrit() attack4}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - {{/rollWasCrit() attack4}} - - - {{#rollGreater() crit 0}} - {{#crit}} - {{#^rollWasCrit() attack4}} - {{#damagevsSMchatmenu}}{{#damagevsLchatmenu}} - - - {{damagevsSMchatmenu}}{{damagevsLchatmenu}} - - - {{/damagevsLchatmenu}}{{/damagevsSMchatmenu}} - {{/^rollWasCrit() attack4}} - {{#rollWasCrit() attack4}} - {{#critdamagevsSMchatmenu}}{{#critdamagevsLchatmenu}} - - - {{critdamagevsSMchatmenu}}{{critdamagevsLchatmenu}} - - - {{/critdamagevsLchatmenu}}{{/critdamagevsSMchatmenu}} - {{/rollWasCrit() attack4}} - {{/crit}} - {{/rollGreater() crit 0}} - {{/attack4}} - - {{#damage1vsSM}} - - Damage = {{damage1vsSM}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - - - {{/damage1vsSM}} - {{#damage1vsL}} - - Damage vs LG = {{damage1vsL}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - - - {{/damage1vsL}} - - {{#damage2vsSM}} - - Damage 2 = {{damage2vsSM}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - - - {{/damage2vsSM}} - {{#damage2vsL}} - - Damage 2 vs LG = {{damage2vsL}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - - - {{/damage2vsL}} - - {{#damage3vsSM}} - - Damage 3 = {{damage3vsSM}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - - - {{/damage3vsSM}} - {{#damage3vsL}} - - Damage 3 vs LG = {{damage3vsL}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - - - {{/damage3vsL}} - - {{#damage4vsSM}} - - Damage 4 = {{damage4vsSM}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - - - {{/damage4vsSM}} - {{#damage4vsL}} - - Damage 4 vs LG = {{damage4vsL}} - - {{#rollGreater() crit 0}} - {{#crit}}CRIT!{{/crit}} - {{/rollGreater() crit 0}} - - - {{/damage4vsL}} - - - - {{#rollGreater() backstab 1}} - {{#backstab}}Backstab Attack!!!{{/backstab}} - {{/rollGreater() backstab 1}} - - - - - - {{#damagetype}}Type: {{damagetype}} {{/damagetype}} - {{#rate}}RoF: {{rate}} {{/rate}} - {{#range}}Range: {{range}} {{/range}} - {{#length}}Length: {{length}} {{/length}} - {{#space}}Space: {{space}} {{/space}} - {{#speed}}Speed: {{speed}} {{/speed}} - {{#range}} - {{#rollGreater() ammo 0}} - {{#ammo}}Ammo: {{ammo}} {{/ammo}} - {{/rollGreater() ammo 0}} - {{#rollTotal() ammo 0}} - {{#ammo}}No Ammo! {{/ammo}} - {{/rollTotal() ammo 0}} - {{/range}} - - - - {{#ToHitAC-10to0}} - AC:-10|-9|-8|-7|-6|-5|-4|-3|-2|-1| **0**
{{ToHitAC-10to0}}
- {{/ToHitAC-10to0}} - {{#ToHitAC1to10}} - AC: **0**| 1| 2| 3| 4| 5| 6| 7| 8| 9|10
{{ToHitAC1to10}}
- {{/ToHitAC1to10}} - - {{#allprops() name subtag bigname bigtext1 bigtext2 bigtext3 bigtext4 bigtext5 bigtext6 bigtext7 bigtext8 bigtext9 bigtext10 bigtext11 bigtext12 footer backstab crit dual color attack1 attack2 attack3 attack4 damagevsSMchatmenu damagevsLchatmenu critdamagevsSMchatmenu critdamagevsLchatmenu damage1vsSM damage2vsSM damage3vsSM damage4vsSM damage1vsL damage2vsL damage3vsL damage4vsL damage1 ToHitACadj2to10 ToHitAC-10to0 ToHitAC1to10 WeaponNotes freetext damagetype rate range length space speed ammo whisper}} - - {{key}} - {{value}} - - {{/allprops() name subtag bigname bigtext1 bigtext2 bigtext3 bigtext4 bigtext5 bigtext6 bigtext7 bigtext8 bigtext9 bigtext10 bigtext11 bigtext12 footer backstab crit dual color attack1 attack2 attack3 attack4 damagevsSMchatmenu damagevsLchatmenu critdamagevsSMchatmenu critdamagevsLchatmenu damage1vsSM damage2vsSM damage3vsSM damage4vsSM damage1vsL damage2vsL damage3vsL damage4vsL damage1 ToHitACadj2to10 ToHitAC-10to0 ToHitAC1to10 WeaponNotes freetext damagetype rate range length space speed ammo whisper}} - - {{#WeaponNotes}} - - Notes: {{WeaponNotes}} - - {{/WeaponNotes}} - {{#freetext}} - - {{freetext}} - - {{/freetext}} - {{#ToHitACadj2to10}} - - ACtype: 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10
{{ToHitACadj2to10}}
-
- {{/ToHitACadj2to10}} - - {{#footer}}{{footer}}{{/footer}} - -
-
- - - -
- - {{#name}} - {{name}} - {{/name}} - {{#subtag}} - {{subtag}} - {{/subtag}} - - {{#ToHitAC-10to0}} - AC:-10|-9|-8|-7|-6|-5|-4|-3|-2|-1| **0**
{{ToHitAC-10to0}}
- {{/ToHitAC-10to0}} - {{#ToHitAC1to10}} - AC: **0**| 1| 2| 3| 4| 5| 6| 7| 8| 9|10
{{ToHitAC1to10}}
- {{/ToHitAC1to10}} -
-
- - - -
- - {{#bigname}} - {{bigname}} - {{/bigname}} - - - {{#name}} - {{name}} - {{/name}} - {{#subtag}} - {{subtag}} - {{/subtag}} - - - {{#bigtext1}}{{bigtext1}}{{/bigtext1}} - {{#bigtext2}}{{bigtext2}}{{/bigtext2}} - {{#bigtext3}}{{bigtext3}}{{/bigtext3}} - {{#bigtext4}}{{bigtext4}}{{/bigtext4}} - {{#bigtext5}}{{bigtext5}}{{/bigtext5}} - {{#bigtext6}}{{bigtext6}}{{/bigtext6}} - {{#bigtext7}}{{bigtext7}}{{/bigtext7}} - {{#bigtext8}}{{bigtext8}}{{/bigtext8}} - {{#bigtext9}}{{bigtext9}}{{/bigtext9}} - {{#bigtext10}}{{bigtext10}}{{/bigtext10}} - {{#bigtext11}}{{bigtext11}}{{/bigtext11}} - {{#bigtext12}}{{bigtext12}}{{/bigtext12}} - - {{#roll_high}} - {{#^rollLess() roll_high roll_target}} - - Success! - {{/^rollLess() roll_high roll_target}} - {{#rollLess() roll_high roll_target}} - Failure... - {{/rollLess() roll_high roll_target}} - - Roll = {{roll_high}} vs {{roll_target}} - {{/roll_high}} - - {{#roll_low}} - {{#^rollGreater() roll_low roll_target}} - - Success! - {{/^rollGreater() roll_low roll_target}} - {{#rollGreater() roll_low roll_target}} - Failure... - {{/rollGreater() roll_low roll_target}} - - Roll = {{roll_low}} vs {{roll_target}} - {{#^rollGreater() roll_low roll_target2}} - - {{/^rollGreater() roll_low roll_target2}} - {{#rollGreater() roll_low roll_target2}} - Detected - roll is >= +21% failure - - {{roll_low}} vs {{roll_target2}} - {{/rollGreater() roll_low roll_target2}} - {{/roll_low}} - {{#^rollTotal() roll 0}} - Roll = {{roll}} - {{/^rollTotal() roll 0}} - - {{#effect_type}} - - Effect Type - {{effect_type}} - - {{/effect_type}} - {{#spell_class}} - - {{spell_class}} - {{#spell_class_level}}Level:{{spell_class_level}}{{/spell_class_level}} - - {{/spell_class}} - {{#school}} - - Type - {{school}} - - {{/school}} - {{#spell_level}} - - Spell Level - {{spell_level}} - - {{/spell_level}} - {{#range}} - - Range - {{range}} - - {{/range}} - {{#duration}} - - Duration - {{duration}} - - {{/duration}} - {{#area_of_effect}} - - Area of Effect - {{area_of_effect}} - - {{/area_of_effect}} - {{#components}} - - Components - {{components}} - - {{/components}} - {{#casting_time}} - - Casting Time - {{casting_time}} - - {{/casting_time}} - {{#saving_throw}} - - Saving Throw - {{saving_throw}} - - {{/saving_throw}} - {{#save_type}} - - Save Type - {{save_type}} - - {{/save_type}} - {{#type}} - - Type: - {{type}} - - {{/type}} - - {{#attribute_mod_1_name}} - - attribute_mod_1 - {{attribute_mod_1_name}}: {{#attribute_mod_1}}{{attribute_mod_1}}{{/attribute_mod_1}}{{#attribute_mod_1_max}}/{{attribute_mod_1_max}}{{/attribute_mod_1_max}} - - {{/attribute_mod_1_name}} - {{#attribute_mod_2_name}} - - attribute_mod_2 - {{attribute_mod_2_name}}: {{#attribute_mod_2}}{{attribute_mod_2}}{{/attribute_mod_2}}{{#attribute_mod_2_max}}/{{attribute_mod_2_max}}{{/attribute_mod_2_max}} - - {{/attribute_mod_2_name}} - {{#attribute_mod_3_name}} - - attribute_mod_3 - {{attribute_mod_3_name}}: {{#attribute_mod_3}}{{attribute_mod_3}}{{/attribute_mod_3}}{{#attribute_mod_3_max}}/{{attribute_mod_3_max}}{{/attribute_mod_3_max}} - - {{/attribute_mod_3_name}} - {{#attribute_mod_4_name}} - - attribute_mod_4 - {{attribute_mod_4_name}}: {{#attribute_mod_4}}{{attribute_mod_4}}{{/attribute_mod_4}}{{#attribute_mod_4_max}}/{{attribute_mod_4_max}}{{/attribute_mod_4_max}} - - {{/attribute_mod_4_name}} - {{#attribute_mod_5_name}} - - attribute_mod_5 - {{attribute_mod_5_name}}: {{#attribute_mod_5}}{{attribute_mod_5}}{{/attribute_mod_5}}{{#attribute_mod_5_max}}/{{attribute_mod_5_max}}{{/attribute_mod_5_max}} - - {{/attribute_mod_5_name}} - {{#attribute_mod_6_name}} - - attribute_mod_6 - {{attribute_mod_6_name}}: {{#attribute_mod_6}}{{attribute_mod_6}}{{/attribute_mod_6}}{{#attribute_mod_6_max}}/{{attribute_mod_6_max}}{{/attribute_mod_6_max}} - - {{/attribute_mod_6_name}} - - - {{#rollGreater() locked_doors 0}} - {{#locked_doors}} - {{locked_doors}} - {{/locked_doors}} - {{/rollGreater() locked_doors 0}} - - - - {{#uses_max}} - {{#^rollTotal() uses_max 0}} - {{#uses}} - Uses:{{uses}}/{{uses_max}} - {{/uses}} - {{/^rollTotal() uses_max 0}} - {{/uses_max}} - {{#quantity_max}} - {{#quantity}} - Qty:{{quantity}}/{{quantity_max}} - {{/quantity}} - {{/quantity_max}} - - - - {{#allprops() name subtag bigname bigtext1 bigtext2 bigtext3 bigtext4 bigtext5 bigtext6 bigtext7 bigtext8 bigtext9 bigtext10 bigtext11 bigtext12 footer freetext color effect_type school spell_level spell_class spell_class_level range duration area_of_effect components casting_time saving_throw save_type link type roll roll_high roll_low roll_target roll_target2 rolldecimal nwp_mod_applied mod_applied wis_applied current_encumbrance dex_adjustment quantity quantity_max uses uses_max whisper attribute_mod_1_name attribute_mod_1 attribute_mod_1_max attribute_mod_2_name attribute_mod_2 attribute_mod_2_max attribute_mod_3_name attribute_mod_3 attribute_mod_3_max attribute_mod_4_name attribute_mod_4 attribute_mod_4_max attribute_mod_5_name attribute_mod_5 attribute_mod_5_max attribute_mod_6_name attribute_mod_6 attribute_mod_6_max notes locked_doors}} - - - {{key}} - {{value}} - - {{/allprops() name subtag bigname bigtext1 bigtext2 bigtext3 bigtext4 bigtext5 bigtext6 bigtext7 bigtext8 bigtext9 bigtext10 bigtext11 bigtext12 footer freetext color effect_type school spell_level spell_class spell_class_level range duration area_of_effect components casting_time saving_throw save_type link type roll roll_high roll_low roll_target roll_target2 rolldecimal nwp_mod_applied mod_applied wis_applied current_encumbrance dex_adjustment quantity quantity_max uses uses_max whisper attribute_mod_1_name attribute_mod_1 attribute_mod_1_max attribute_mod_2_name attribute_mod_2 attribute_mod_2_max attribute_mod_3_name attribute_mod_3 attribute_mod_3_max attribute_mod_4_name attribute_mod_4 attribute_mod_4_max attribute_mod_5_name attribute_mod_5 attribute_mod_5_max attribute_mod_6_name attribute_mod_6 attribute_mod_6_max notes locked_doors}} - - - - {{#nwp_mod_applied}} - NWP Mod Applied:{{nwp_mod_applied}} {{/nwp_mod_applied}}{{#mod_applied}} - Mod Applied:{{mod_applied}} {{/mod_applied}}{{#wis_applied}} - Wis Applied:{{wis_applied}} {{/wis_applied}}{{#dex_adjustment}} - Dex Adj:{{dex_adjustment}} {{/dex_adjustment}}{{#encumbrance}} - Encumbrance:{{encumbrance}} {{/encumbrance}}{{#rollTotal() current_encumbrance 0}}{{#current_encumbrance}} - Encum/Bulk - Normal  - None{{/current_encumbrance}}{{/rollTotal() current_encumbrance 0}}{{#rollTotal() current_encumbrance 1}}{{#current_encumbrance}} - Encum/Bulk - Heavy  - No DEX Bonus to Init.{{/current_encumbrance}}{{/rollTotal() current_encumbrance 1}}{{#rollTotal() current_encumbrance 2}}{{#current_encumbrance}} - Encum/Bulk - Very Heavy  - No DEX Bonus to Init, Delayed, +1 Segment if Surprised.{{/current_encumbrance}}{{/rollTotal() current_encumbrance 2}}{{#rollTotal() current_encumbrance 3}}{{#current_encumbrance}} - Encum/Bulk - Encumbered  - No DEX Bonus to Init or AC, Go Last in Init, +2 Segments if Surprised, Cannot Charge, Enemies get +2 to-hit.{{/current_encumbrance}}{{/rollTotal() current_encumbrance 3}} - - - {{#notes}} - - Notes: - {{notes}} - - {{/notes}} - {{#freetext}} - - {{freetext}} - - {{/freetext}} - {{#link}} - - [LINK]({{link}}) - - {{/link}} - - {{#footer}}{{footer}}{{/footer}} - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +
Monster
i

Important Sheet Announcements

v • 11/23/25'
    Latest
  • Fixed a layout alignment glitch with the Equipment sorting option buttons when viewed in FF.
  • Added title text to Armor Details item name that gives some explanation on how Armor Details and Equipment|Armor interact.
  • Fixed armor row columns display/alignment if armor is marked as "magical" and Equipment tab was filtered to show "Magic" items only.
  • Added a couple sorting options to Equipment. Sort AZ and Sort by Location, then Item AZ. Includes an "Undo" option that will restore the previous natural order.
  • Added a couple sorting options to Spells. Sort AZ and Sort by Level, then Spell AZ. Includes an "Undo" option that will restore the previous natural order.
  • Update to Spells; adding new spells will automatically set a Spell's caster class and level based on the current Caster and Spell Level tabs selected. example; If the current Spell Tab is set to show "3rd" level spells and a new spell is added "+", entering a spell name will trigger the sheet to set the Spell's level to "3". If the tab is set to "All" or if the Spell's level has already been set, the Spell's level will not be changed. If the spell is added using an API mod, the Spell's level will not be changed. Caster Class selected acts similarly.
  • "Spell Lvl" is now shown with the Spell Name and #Memorized/Prepared. Hidden when the Spell details is expanded.
  • Made a correction with the Spell Level Tab behavior when editing a Spell's Level while showing "All" levels. Tab would incorrectly change the Spell Level Tab to match the new Spell Level. Expected behavior is to stay on "All".
  • Updated the Thief Skills Dex and Race auto-fill option. Expanded the Dex Thief skill adjustments up to DEX 25.
  • Updated dependencies used to bundle the sheet. Impacts dev environment only.
  • Updated title text on max fields from '..._max' to '...|max'. Macros and token bars need to use '...|max'
  • Added "Roll Template Color" selector to the sheet's default settings options.
  • Previous
  • Updated the 'Equipment|Weapon|+Add' button to set all default weapon values for the attack row instead of just those synced from the Equipment's row. Fixes default hit-table info not being posted to chat (unless the selector was manually set) if the attack was created using the Equipment button.
  • Added a very subtle linear-gradient background(top transparent to bottom light gray) to a few sections to help introduce a little contrast between sections.
  • Fixed Equipment tabs for Carried|Not Carried|Mount|All not filtering.
  • Updated sheetworker logic used when creating new repeating rows. Allows API mods to detect the default values.
  • Updated the NWP title-text, inverting the +/- appropriately so it makes sense. Added an additional option in the NWP row dropdown to include a "vs Base" (which will give a roll-time query to enter a base/target value) to accommodate anyone that is using OA's version of NWP.
  • Open Doors changed from percentage roll to d6 (or larger die for demi-god level STR values).
  • Added additional logic to auto-fill bonus languages as per PHB. Previously the sheet only auto-filled Humans. This update will only effect new characters going forward. @{bonuslanguages} will remain unchanged for existing characters unless Race or INT are changed.
  • Added setting the NWP default values using sheetworkers upon row creation to help with API attribute recognition. ie ScriptCards. Also added a "Val." column to show the current value of the Ability selected.
  • Added a "Magical" column and checkbox to equipment. Check this box if an item has magical properties. Items that are checked will also be displayed when the "Magic" tab is selected regardless of their type category.
  • Added options to autofill Thief Skills racial and Dex modifiers.
  • Added an option to the Thief Skills to sync to a class. Base value will continue to auto-adjust whenever the class level changes.
  • Added an option to the Attack Matrix/THAC0 section to sync to-Hit values to a class. Table data will continue to auto-adjust whenever the class level changes. Multi/Dual-class characters should choose the most favorable class. Class names entered on the sheet need to match one of the core 1e classes in order for this option to work.
  • Added an option to use a 5% progression based to-Hit table for Fighters. (DMG p74) Use 5% checkbox added to Settings|Misc. Options and inside the Attack/THAC0 Matrix window.
  • Attack/THACO Matrix section has been updated so that it's opened/closed state will remain persistent. It will be open by default on new sheets.
  • Removed the character_name validation warning for the use of commas within a character's name.
    Class Details Armor Details
CLASS DETAILS
Class Lvl HD HP/Level HP+Con XP Next Level +10% = = =
ARMOR DETAILS
Armor Type In Use Name AC AR Magic Misc Carried Bulk More
PERSONAL ATTRIBUTES
Character History/Bio

ABILITIES
= Base COM + CHA Adj. + Racial Adj.
Speed and Movement Adjusted Speed Explore/Map Known Route Run/Flee

Move/Round


SAVES
TOTAL Base/Class Racial Adj. Ability Adj. Misc. Adj. Temp. Adj. = ± ± ± ± = ± ± ± ± = ± ± ± ± = ± ± ± ± = ± ± ± ± Custom Saves
= ± ± ± ±
= ± ± ± ±
= ± ± ± ±

ATTACKS ATTACKS

Weapon Proficiency:

Weapons:

nearby_error
ATTACK MATRIX THAC0
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10
Armor Type:
0 1 2 3 4 5 6 7 8 9 10
Adjustment:

EQUIPMENT
Gear Weapon Armor Magic Other All Carried Not Carried Mount All
Item Location Type Magical Uses / Max Carried? Qty / Max Wt Cost
/ /
Wealth
Copper Silver Electrum Gold Platinum

Carrying Capacity
Strength Adj. Current Encumbrance (gp)(lbs)

SPECIAL ABILITIES SPECIAL ABILITIES

Psionics

Name Short Description Uses Name Uses Name Uses

NON WEAPON PROFICIENCIES
Proficiency Short Description Attribute/Base Val. Adj. Slots

THIEF SKILLS
Function TOTAL Base/Level Dex Adj. Racial Adj. Magic/Item = ± ± ± = ± ± ± = ± ± ± = ± ± ± = ± ± ± = ± ± ± = ± ± ± = ± ± ± Custom Functions
= ± ± ±
= ± ± ±
= ± ± ±

Backstab:


SPELLS
Cur / Max Cur / Max Cur / Max Cur / Max Cur / Max Cur / Max Cur / Max Cur / Max Cur / Max Cur / Max Cantrips 1st 2nd 3rd 4th 5th 6th 7th 8th 9th Cantrips 1st 2nd 3rd 4th 5th 6th 7th 8th 9th
Caster 1 Caster 2 All
Cantrips 1st 2nd 3rd 4th 5th 6th 7th 8th 9th All
Spells Notes

NOTES

SETTINGS

Reminder: these are per-sheet settings only. DM's that would like to set their own defaults for new characters can do so using the Default Settings section found in the main Game Settings page. If you would also like to apply these settings to all existing characters in the game follow the wiki instructions:

Sheet Image:

Surprise die:

Surprise Others die:

Initiative die:

Misc. Options:

Cleric:

Standard Turn Undead:

Alternate Turn Undead:

Hide Areas:

Whisper Options:

ADVANCED Options:

CUSTOM ATTRIBUTES

{{#bigname}} {{bigname}} {{/bigname}} {{#name}} {{name}} {{/name}} {{#subtag}} {{subtag}}{{#dual}} ({{dual}}){{/dual}} {{/subtag}} {{#bigtext1}}{{bigtext1}}{{/bigtext1}} {{#bigtext2}}{{bigtext2}}{{/bigtext2}} {{#bigtext3}}{{bigtext3}}{{/bigtext3}} {{#bigtext4}}{{bigtext4}}{{/bigtext4}} {{#bigtext5}}{{bigtext5}}{{/bigtext5}} {{#bigtext6}}{{bigtext6}}{{/bigtext6}} {{#bigtext7}}{{bigtext7}}{{/bigtext7}} {{#bigtext8}}{{bigtext8}}{{/bigtext8}} {{#bigtext9}}{{bigtext9}}{{/bigtext9}} {{#bigtext10}}{{bigtext10}}{{/bigtext10}} {{#bigtext11}}{{bigtext11}}{{/bigtext11}} {{#bigtext12}}{{bigtext12}}{{/bigtext12}} {{#attack1}} Attack = {{attack1}} {{#rollWasCrit() attack1}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/rollWasCrit() attack1}} {{#^rollGreater() crit 0}} {{#crit}} {{#damagevsSMchatmenu}}{{#damagevsLchatmenu}} {{damagevsSMchatmenu}}{{damagevsLchatmenu}} {{/damagevsLchatmenu}}{{/damagevsSMchatmenu}} {{/crit}} {{/^rollGreater() crit 0}} {{#rollGreater() crit 0}} {{#crit}} {{#^rollWasCrit() attack1}} {{#damagevsSMchatmenu}}{{#damagevsLchatmenu}} {{damagevsSMchatmenu}}{{damagevsLchatmenu}} {{/damagevsLchatmenu}}{{/damagevsSMchatmenu}} {{/^rollWasCrit() attack1}} {{#rollWasCrit() attack1}} {{#critdamagevsSMchatmenu}}{{#critdamagevsLchatmenu}} {{critdamagevsSMchatmenu}}{{critdamagevsLchatmenu}} {{/critdamagevsLchatmenu}}{{/critdamagevsSMchatmenu}} {{/rollWasCrit() attack1}} {{/crit}} {{/rollGreater() crit 0}} {{/attack1}} {{#attack2}} Attack 2 = {{attack2}} {{#rollWasCrit() attack2}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/rollWasCrit() attack2}} {{#rollGreater() crit 0}} {{#crit}} {{#^rollWasCrit() attack2}} {{#damagevsSMchatmenu}}{{#damagevsLchatmenu}} {{damagevsSMchatmenu}}{{damagevsLchatmenu}} {{/damagevsLchatmenu}}{{/damagevsSMchatmenu}} {{/^rollWasCrit() attack2}} {{#rollWasCrit() attack2}} {{#critdamagevsSMchatmenu}}{{#critdamagevsLchatmenu}} {{critdamagevsSMchatmenu}}{{critdamagevsLchatmenu}} {{/critdamagevsLchatmenu}}{{/critdamagevsSMchatmenu}} {{/rollWasCrit() attack2}} {{/crit}} {{/rollGreater() crit 0}} {{/attack2}} {{#attack3}} Attack 3 = {{attack3}} {{#rollWasCrit() attack3}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/rollWasCrit() attack3}} {{#rollGreater() crit 0}} {{#crit}} {{#^rollWasCrit() attack3}} {{#damagevsSMchatmenu}}{{#damagevsLchatmenu}} {{damagevsSMchatmenu}}{{damagevsLchatmenu}} {{/damagevsLchatmenu}}{{/damagevsSMchatmenu}} {{/^rollWasCrit() attack3}} {{#rollWasCrit() attack3}} {{#critdamagevsSMchatmenu}}{{#critdamagevsLchatmenu}} {{critdamagevsSMchatmenu}}{{critdamagevsLchatmenu}} {{/critdamagevsLchatmenu}}{{/critdamagevsSMchatmenu}} {{/rollWasCrit() attack3}} {{/crit}} {{/rollGreater() crit 0}} {{/attack3}} {{#attack4}} Attack 4 = {{attack4}} {{#rollWasCrit() attack4}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/rollWasCrit() attack4}} {{#rollGreater() crit 0}} {{#crit}} {{#^rollWasCrit() attack4}} {{#damagevsSMchatmenu}}{{#damagevsLchatmenu}} {{damagevsSMchatmenu}}{{damagevsLchatmenu}} {{/damagevsLchatmenu}}{{/damagevsSMchatmenu}} {{/^rollWasCrit() attack4}} {{#rollWasCrit() attack4}} {{#critdamagevsSMchatmenu}}{{#critdamagevsLchatmenu}} {{critdamagevsSMchatmenu}}{{critdamagevsLchatmenu}} {{/critdamagevsLchatmenu}}{{/critdamagevsSMchatmenu}} {{/rollWasCrit() attack4}} {{/crit}} {{/rollGreater() crit 0}} {{/attack4}} {{#damage1vsSM}} Damage = {{damage1vsSM}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/damage1vsSM}} {{#damage1vsL}} Damage vs LG = {{damage1vsL}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/damage1vsL}} {{#damage2vsSM}} Damage 2 = {{damage2vsSM}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/damage2vsSM}} {{#damage2vsL}} Damage 2 vs LG = {{damage2vsL}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/damage2vsL}} {{#damage3vsSM}} Damage 3 = {{damage3vsSM}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/damage3vsSM}} {{#damage3vsL}} Damage 3 vs LG = {{damage3vsL}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/damage3vsL}} {{#damage4vsSM}} Damage 4 = {{damage4vsSM}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/damage4vsSM}} {{#damage4vsL}} Damage 4 vs LG = {{damage4vsL}} {{#rollGreater() crit 0}} {{#crit}}CRIT!{{/crit}} {{/rollGreater() crit 0}} {{/damage4vsL}} {{#rollGreater() backstab 1}} {{#backstab}}Backstab Attack!!!{{/backstab}} {{/rollGreater() backstab 1}} {{#damagetype}}Type: {{damagetype}} {{/damagetype}} {{#rate}}RoF: {{rate}} {{/rate}} {{#range}}Range: {{range}} {{/range}} {{#length}}Length: {{length}} {{/length}} {{#space}}Space: {{space}} {{/space}} {{#speed}}Speed: {{speed}} {{/speed}} {{#range}} {{#rollGreater() ammo 0}} {{#ammo}}Ammo: {{ammo}} {{/ammo}} {{/rollGreater() ammo 0}} {{#rollTotal() ammo 0}} {{#ammo}}No Ammo! {{/ammo}} {{/rollTotal() ammo 0}} {{/range}} {{#ToHitAC-10to0}} AC:-10|-9|-8|-7|-6|-5|-4|-3|-2|-1| **0**
{{ToHitAC-10to0}}
{{/ToHitAC-10to0}} {{#ToHitAC1to10}} AC: **0**| 1| 2| 3| 4| 5| 6| 7| 8| 9|10
{{ToHitAC1to10}}
{{/ToHitAC1to10}} {{#allprops() name subtag bigname bigtext1 bigtext2 bigtext3 bigtext4 bigtext5 bigtext6 bigtext7 bigtext8 bigtext9 bigtext10 bigtext11 bigtext12 footer backstab crit dual color attack1 attack2 attack3 attack4 damagevsSMchatmenu damagevsLchatmenu critdamagevsSMchatmenu critdamagevsLchatmenu damage1vsSM damage2vsSM damage3vsSM damage4vsSM damage1vsL damage2vsL damage3vsL damage4vsL damage1 ToHitACadj2to10 ToHitAC-10to0 ToHitAC1to10 WeaponNotes freetext damagetype rate range length space speed ammo whisper}} {{key}} {{value}} {{/allprops() name subtag bigname bigtext1 bigtext2 bigtext3 bigtext4 bigtext5 bigtext6 bigtext7 bigtext8 bigtext9 bigtext10 bigtext11 bigtext12 footer backstab crit dual color attack1 attack2 attack3 attack4 damagevsSMchatmenu damagevsLchatmenu critdamagevsSMchatmenu critdamagevsLchatmenu damage1vsSM damage2vsSM damage3vsSM damage4vsSM damage1vsL damage2vsL damage3vsL damage4vsL damage1 ToHitACadj2to10 ToHitAC-10to0 ToHitAC1to10 WeaponNotes freetext damagetype rate range length space speed ammo whisper}} {{#WeaponNotes}} Notes: {{WeaponNotes}} {{/WeaponNotes}} {{#freetext}} {{freetext}} {{/freetext}} {{#ToHitACadj2to10}} ACtype: 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10
{{ToHitACadj2to10}}
{{/ToHitACadj2to10}} {{#footer}}{{footer}}{{/footer}}
{{#name}} {{name}} {{/name}} {{#subtag}} {{subtag}} {{/subtag}} {{#ToHitAC-10to0}} AC:-10|-9|-8|-7|-6|-5|-4|-3|-2|-1| **0**
{{ToHitAC-10to0}}
{{/ToHitAC-10to0}} {{#ToHitAC1to10}} AC: **0**| 1| 2| 3| 4| 5| 6| 7| 8| 9|10
{{ToHitAC1to10}}
{{/ToHitAC1to10}}
{{#bigname}} {{bigname}} {{/bigname}} {{#name}} {{name}} {{/name}} {{#subtag}} {{subtag}} {{/subtag}} {{#bigtext1}}{{bigtext1}}{{/bigtext1}} {{#bigtext2}}{{bigtext2}}{{/bigtext2}} {{#bigtext3}}{{bigtext3}}{{/bigtext3}} {{#bigtext4}}{{bigtext4}}{{/bigtext4}} {{#bigtext5}}{{bigtext5}}{{/bigtext5}} {{#bigtext6}}{{bigtext6}}{{/bigtext6}} {{#bigtext7}}{{bigtext7}}{{/bigtext7}} {{#bigtext8}}{{bigtext8}}{{/bigtext8}} {{#bigtext9}}{{bigtext9}}{{/bigtext9}} {{#bigtext10}}{{bigtext10}}{{/bigtext10}} {{#bigtext11}}{{bigtext11}}{{/bigtext11}} {{#bigtext12}}{{bigtext12}}{{/bigtext12}}{{#roll_high}} {{#^rollLess() roll_high roll_target}} Success! {{/^rollLess() roll_high roll_target}} {{#rollLess() roll_high roll_target}} Failure... {{/rollLess() roll_high roll_target}} Roll = {{roll_high}} vs {{roll_target}} {{/roll_high}} {{#roll_low}} {{#^rollGreater() roll_low roll_target}} Success! {{/^rollGreater() roll_low roll_target}} {{#rollGreater() roll_low roll_target}} Failure... {{/rollGreater() roll_low roll_target}} Roll = {{roll_low}} vs {{roll_target}} {{#^rollGreater() roll_low roll_target2}} {{/^rollGreater() roll_low roll_target2}} {{#rollGreater() roll_low roll_target2}} Detected roll is >= +21% failure {{roll_low}} vs {{roll_target2}} {{/rollGreater() roll_low roll_target2}} {{/roll_low}} {{#^rollTotal() roll 0}} Roll = {{roll}} {{/^rollTotal() roll 0}} {{#effect_type}} Effect Type {{effect_type}} {{/effect_type}} {{#spell_class}} {{spell_class}} {{#spell_class_level}}Level:{{spell_class_level}}{{/spell_class_level}} {{/spell_class}} {{#school}} Type {{school}} {{/school}} {{#spell_level}} Spell Level {{spell_level}} {{/spell_level}} {{#range}} Range {{range}} {{/range}} {{#duration}} Duration {{duration}} {{/duration}} {{#area_of_effect}} Area of Effect {{area_of_effect}} {{/area_of_effect}} {{#components}} Components {{components}} {{/components}} {{#casting_time}} Casting Time {{casting_time}} {{/casting_time}} {{#saving_throw}} Saving Throw {{saving_throw}} {{/saving_throw}} {{#save_type}} Save Type {{save_type}} {{/save_type}} {{#type}} Type: {{type}} {{/type}} {{#attribute_mod_1_name}} attribute_mod_1 {{attribute_mod_1_name}}: {{#attribute_mod_1}}{{attribute_mod_1}}{{/attribute_mod_1}}{{#attribute_mod_1_max}}/{{attribute_mod_1_max}}{{/attribute_mod_1_max}} {{/attribute_mod_1_name}} {{#attribute_mod_2_name}} attribute_mod_2 {{attribute_mod_2_name}}: {{#attribute_mod_2}}{{attribute_mod_2}}{{/attribute_mod_2}}{{#attribute_mod_2_max}}/{{attribute_mod_2_max}}{{/attribute_mod_2_max}} {{/attribute_mod_2_name}} {{#attribute_mod_3_name}} attribute_mod_3 {{attribute_mod_3_name}}: {{#attribute_mod_3}}{{attribute_mod_3}}{{/attribute_mod_3}}{{#attribute_mod_3_max}}/{{attribute_mod_3_max}}{{/attribute_mod_3_max}} {{/attribute_mod_3_name}} {{#attribute_mod_4_name}} attribute_mod_4 {{attribute_mod_4_name}}: {{#attribute_mod_4}}{{attribute_mod_4}}{{/attribute_mod_4}}{{#attribute_mod_4_max}}/{{attribute_mod_4_max}}{{/attribute_mod_4_max}} {{/attribute_mod_4_name}} {{#attribute_mod_5_name}} attribute_mod_5 {{attribute_mod_5_name}}: {{#attribute_mod_5}}{{attribute_mod_5}}{{/attribute_mod_5}}{{#attribute_mod_5_max}}/{{attribute_mod_5_max}}{{/attribute_mod_5_max}} {{/attribute_mod_5_name}} {{#attribute_mod_6_name}} attribute_mod_6 {{attribute_mod_6_name}}: {{#attribute_mod_6}}{{attribute_mod_6}}{{/attribute_mod_6}}{{#attribute_mod_6_max}}/{{attribute_mod_6_max}}{{/attribute_mod_6_max}} {{/attribute_mod_6_name}} {{#rollGreater() locked_doors 0}} {{#locked_doors}} {{locked_doors}} {{/locked_doors}} {{/rollGreater() locked_doors 0}} {{#uses_max}} {{#^rollTotal() uses_max 0}} {{#uses}} Uses:{{uses}}/{{uses_max}} {{/uses}} {{/^rollTotal() uses_max 0}} {{/uses_max}} {{#quantity_max}} {{#quantity}} Qty:{{quantity}}/{{quantity_max}} {{/quantity}} {{/quantity_max}} {{#allprops() name subtag bigname bigtext1 bigtext2 bigtext3 bigtext4 bigtext5 bigtext6 bigtext7 bigtext8 bigtext9 bigtext10 bigtext11 bigtext12 footer freetext color effect_type school spell_level spell_class spell_class_level range duration area_of_effect components casting_time saving_throw save_type link type roll roll_high roll_low roll_target roll_target2 rolldecimal nwp_mod_applied mod_applied wis_applied current_encumbrance dex_adjustment quantity quantity_max uses uses_max whisper attribute_mod_1_name attribute_mod_1 attribute_mod_1_max attribute_mod_2_name attribute_mod_2 attribute_mod_2_max attribute_mod_3_name attribute_mod_3 attribute_mod_3_max attribute_mod_4_name attribute_mod_4 attribute_mod_4_max attribute_mod_5_name attribute_mod_5 attribute_mod_5_max attribute_mod_6_name attribute_mod_6 attribute_mod_6_max notes locked_doors}} {{key}} {{value}} {{/allprops() name subtag bigname bigtext1 bigtext2 bigtext3 bigtext4 bigtext5 bigtext6 bigtext7 bigtext8 bigtext9 bigtext10 bigtext11 bigtext12 footer freetext color effect_type school spell_level spell_class spell_class_level range duration area_of_effect components casting_time saving_throw save_type link type roll roll_high roll_low roll_target roll_target2 rolldecimal nwp_mod_applied mod_applied wis_applied current_encumbrance dex_adjustment quantity quantity_max uses uses_max whisper attribute_mod_1_name attribute_mod_1 attribute_mod_1_max attribute_mod_2_name attribute_mod_2 attribute_mod_2_max attribute_mod_3_name attribute_mod_3 attribute_mod_3_max attribute_mod_4_name attribute_mod_4 attribute_mod_4_max attribute_mod_5_name attribute_mod_5 attribute_mod_5_max attribute_mod_6_name attribute_mod_6 attribute_mod_6_max notes locked_doors}} {{#nwp_mod_applied}} NWP Mod Applied:{{nwp_mod_applied}} {{/nwp_mod_applied}}{{#mod_applied}} Mod Applied:{{mod_applied}} {{/mod_applied}}{{#wis_applied}} Wis Applied:{{wis_applied}} {{/wis_applied}}{{#dex_adjustment}} Dex Adj:{{dex_adjustment}} {{/dex_adjustment}}{{#encumbrance}} Encumbrance:{{encumbrance}} {{/encumbrance}}{{#rollTotal() current_encumbrance 0}}{{#current_encumbrance}} Encum/Bulk - Normal  None{{/current_encumbrance}}{{/rollTotal() current_encumbrance 0}}{{#rollTotal() current_encumbrance 1}}{{#current_encumbrance}} Encum/Bulk - Heavy  No DEX Bonus to Init.{{/current_encumbrance}}{{/rollTotal() current_encumbrance 1}}{{#rollTotal() current_encumbrance 2}}{{#current_encumbrance}} Encum/Bulk - Very Heavy  No DEX Bonus to Init, Delayed, +1 Segment if Surprised.{{/current_encumbrance}}{{/rollTotal() current_encumbrance 2}}{{#rollTotal() current_encumbrance 3}}{{#current_encumbrance}} Encum/Bulk - Encumbered  No DEX Bonus to Init or AC, Go Last in Init, +2 Segments if Surprised, Cannot Charge, Enemies get +2 to-hit.{{/current_encumbrance}}{{/rollTotal() current_encumbrance 3}} {{#notes}} Notes: {{notes}} {{/notes}} {{#freetext}} {{freetext}} {{/freetext}} {{#link}} [LINK]({{link}}) {{/link}} {{#footer}}{{footer}}{{/footer}}
\ No newline at end of file diff --git a/ADnD_1E_Revised/src/1ESheet.css b/ADnD_1E_Revised/src/1ESheet.css new file mode 100644 index 0000000000..ea79514a38 --- /dev/null +++ b/ADnD_1E_Revised/src/1ESheet.css @@ -0,0 +1,5065 @@ +@import url('https://fonts.googleapis.com/css2?family=Caladea:ital,wght@0,400;0,700;1,400;1,700&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Raleway:ital,wght@0,100..900;1,100..900&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Material+Icons&display=swap'); + +/* +@import url('https://fonts.googleapis.com/css2?family=Fira+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Fira+Sans+Condensed:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Rye:wght@400;600&display=swap'); +*/ + +/* Misc variables Custom colors for Roll Template */ +:root, +.sheet-rolltemplate-attacks, +.sheet-rolltemplate-attacks-table, +.sheet-rolltemplate-general { + --black: rgb(0, 0, 0); + --blue: rgb(50, 94, 255); + --dark-accent: #702c91; + --dark-accent-alpha: rgb(112 44 145 / 22%); + --darkblue: rgb(0, 24, 150); + --darkgreen: rgb(11, 112, 0); + --darkgrey: rgb(90, 89, 87); + --darkorange: rgb(108, 53, 0); + --darkpink: rgb(172, 0, 172); + --darkpurple: rgb(67, 0, 84); + --darkred: rgb(133, 0, 10); + --darkyellow: rgb(153, 153, 0); + --font-base: 'Poppins', system-ui; + --font-headers: 'Caladea', serif; + --font-inputs: 'Poppins', system-ui; + --font-monster: 'Raleway', serif; + --green: rgb(17, 180, 0); + --grey: rgb(163, 163, 163); + --link-hover: #005ea2; + --orange: rgb(220, 107, 0); + --pink: rgb(255, 0, 255); + --portrait-min-xy: 130px; + --purple: rgb(116, 0, 145); + --red: rgb(214, 0, 16); + --white: rgb(255, 255, 255); + --yellow: rgb(252, 237, 36); + + --text-sm: 1rem; /* 10px based on :root */ + --text-med: 1.2rem; + --text-lg: 1.4rem; + --text-xl: 1.6rem; + --text-xxl: 1.8rem; + --text-xxxl: 2.4rem; + + --font-buttons1: 'Poppins', system-ui; + --font-buttons2: 'Caladea', serif; + --text-wt100: 100; + --text-wt200: 200; + --text-wt300: 300; + --text-wt400: 400; + --text-wt500: 500; + --text-wt600: 600; + --text-wt700: 700; + --text-wt800: 800; + --text-wt900: 900; + --color-white1: #f5f5f5; + --color-white2: #e1e1e1; + --color-white3: #b3b3b3; + --color-lightgrey1: #999999; + --color-lightgrey2: #666666; + --color-darkgrey1: #333; + --color-black1: #222; + --color-black2: #000; + /* 10px */ + /* used for roll templates */ + /* misc */ +} + +.ui-dialog .tab-content .charsheet .charsheet .pictos { + font-family: 'Pictos'; +} + +.ui-dialog .tab-content .charsheet .material-icons { + font-family: 'Material Icons'; +} + +*, +*::after, +*::before { + box-sizing: border-box; +} + +.charsheet span[title], +.charsheet label[title], +.charsheet label.readonly-span-textonly, +.charsheet span.readonly-span-textonly { + cursor: help; +} + +.charsheet ::placeholder { + color: var(--color-lightgrey1); + font-style: italic; +} + +.charsheet input { + border: 1px transparent; + border-bottom: 1px solid rgb(182, 182, 182); + margin: 2px; + min-width: 1em; + padding: unset; + text-align: center; + width: 100%; +} + +/* hide flippers for number fields */ +.charsheet input:hover[type=number], +.charsheet input:hover::-webkit-outer-spin-button, +.charsheet input:hover::-webkit-inner-spin-button { + -webkit-appearance: auto; +} + +.charsheet input::-webkit-outer-spin-button, +.charsheet input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +.charsheet input[disabled]:hover, +.charsheet input[disabled]:hover::-webkit-outer-spin-button, +.charsheet input[disabled]:hover::-webkit-inner-spin-button { + -webkit-appearance: none; +} + +.charsheet input[type=number]{ + -moz-appearance: textfield; +} + +.charsheet .wrapper input, +.charsheet .wrapper select, +.charsheet .wrapper textarea { + color: var(--color-black1); + font-family: var(--font-inputs); + font-size: var(--text-med); + margin-inline: 2px; +} + +.sheet-darkmode .tab-content .charsheet .wrapper .saves-box select option.option-bonus, +.charsheet .wrapper select option.option-bonus { + background-color: rgb(12, 85, 12); + color: #fff; + font-size: var(--text-sm); +} + +.sheet-darkmode .tab-content .charsheet .wrapper .saves-box select option.option-penalty, +.charsheet .wrapper select option.option-penalty { + background-color: rgb(103, 9, 9); + color: #fff; + font-size: var(--text-sm); +} + +.charsheet .background .wrapper .settings .reset-macros { + flex: 1 1 64px; + margin-inline: 0.75em; + max-width: 100px; + min-height: 2em; +} + +.tab-content .tab-pane { + min-width: min-content; +} + +.sheet-darkmode .tab-content .tab-pane, +.sheet-darkmode .tab-content .tab-pane .charsheet .background, +.sheet-darkmode .tab-content .tab-pane .charsheet .background .wrapper { + background-color: var(--color-black2); + color: var(--color-white3); +} + +.sheet-darkmode .tab-content .charsheet .background .wrapper textarea, +.sheet-darkmode .tab-content .charsheet .background .wrapper input[type='text'], +.sheet-darkmode .tab-content .charsheet .background .wrapper input[type='number'], +.sheet-darkmode .tab-content .charsheet .background .wrapper select, +.sheet-darkmode .tab-content .charsheet .background .wrapper select option { + background-color: var(--color-black1); + color: var(--color-white3); +} + +.sheet-darkmode .tab-content .charsheet .background .wrapper input:focus-within, +.sheet-darkmode .tab-content .charsheet .background .wrapper textarea:focus-within { + background-color: var(--color-lightgrey1); + color: var(--color-black2); +} + +.sheet-darkmode .tab-content .charsheet ::placeholder { + color: var(--color-lightgrey2); +} + +.sheet-darkmode .tab-content .charsheet .background .wrapper input:focus-within::placeholder, +.sheet-darkmode .tab-content .charsheet .background .wrapper textarea:focus-within::placeholder { + color: var(--color-darkgrey1); +} + +.tab-content .charsheet { + padding: 0; +} + +.tab-content .charsheet .linear-background { + background-image: linear-gradient(to top, rgba(0, 0, 0, 0.3), transparent 90%); +} + +.sheet-darkmode .tab-content .charsheet .linear-background { + background-image: linear-gradient(to top, rgba(255, 255, 255, 0.3), transparent 90%); +} + +/* background toggle */ +.charsheet .background { + background-color: transparent; + background-image: none; + color: var(--color-black1); + font-family: var(--font-base); + font-size: var(--text-med); + outline: 5px double var(--color-black1); + outline-offset: 0; + padding: 7px; + width: auto; + margin-block: 3em; +} + +.sheet-darkmode .tab-content .charsheet .background { + background-color: transparent !important; + background-image: none !important; + color: var(--color-white3); + outline: 4px double var(--color-lightgrey2); +} + +/*white*/ +.charsheet .background-selection[value='1']:checked ~ .background { + background-color: #fff; + background-image: none; +} + +/*parchment*/ +.charsheet .background-selection[value='2']:checked ~ .background { + background-image: url('https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/ADnD_1E_Revised/images/back2.jpg'); + background-repeat: repeat; + overflow: visible; +} + +/*light goldenrod*/ +.charsheet .background-selection[value='7']:checked ~ .background { + background-color: #f6e8a7; + background-image: none; +} + +.charsheet .background-selection[value='7']:checked ~ .background input, +.charsheet .background-selection[value='7']:checked ~ .background select { + background-color: rgb(255 255 255 / 40%); +} + +/*goldenrod*/ +.charsheet .background-selection[value='3']:checked ~ .background { + background-color: #f4d74f; + background-image: none; +} + +/*moldvay*/ +.charsheet .background-selection[value='4']:checked ~ .background { + background-color: #b5dcb3; + background-image: none; +} + +/*light greyhawk*/ +.charsheet .background-selection[value='5']:checked ~ .background { + background-color: var(--color-white1); + background-image: none; +} + +/*greyhawk*/ +.charsheet .background-selection[value='6']:checked ~ .background { + background-color: rgb(179 179 179 / 54%); + background-image: none; +} + +.charsheet .background-selection[value='6']:checked ~ .background * { + color: #000; +} + +.sheet-darkmode .background-selection[value='6']:checked ~ .background * { + color: inherit; +} + +.charsheet .wrapper { + align-items: flex-start; + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1em; + margin: -1.5em 0.5em 0 0.5em; + padding: 0.25em 0 0 0; +} + +/* Tabs */ + +/* hide PC page */ +.charsheet .background .npc-box, +.charsheet .background .header-box, +.charsheet .background .class-box, +.charsheet .background .armor-box, +.charsheet .background .personal-attributes-box, +.charsheet .background .abilities-box, +.charsheet .background .weapons-box, +.charsheet .background .saves-box, +.charsheet .background .equipment-box, +.charsheet .background .special-abilities-box, +.charsheet .background .nonweapon-proficiencies-box, +.charsheet .background .thief-skills-box, +.charsheet .background .spells-box, +.charsheet .background .notes-box, +.charsheet .background .options-box { + display: none; +} + +.charsheet input[value='0'].toggle-npc ~ .background .header-box { + display: grid; +} + +/* Show PC page */ +.charsheet input[value='0'].toggle-npc ~ .background, +.charsheet input[value='99'].toggle-npc ~ .background { + min-width: 650px; +} + +.charsheet input[value='0'].toggle-npc ~ .background .class-box, +.charsheet input[value='0'].toggle-npc ~ .background .armor-box, +.charsheet input[value='0'].toggle-npc ~ .background .personal-attributes-box, +.charsheet input[value='0'].toggle-npc ~ .background .abilities-box, +.charsheet input[value='0'].toggle-npc ~ .background .weapons-box, +.charsheet input[value='0'].toggle-npc ~ .background .saves-box, +.charsheet input[value='0'].toggle-npc ~ .background .equipment-box, +.charsheet input[value='0'].toggle-npc ~ .background .special-abilities-box, +.charsheet input[value='0'].toggle-npc ~ .background .nonweapon-proficiencies-box, +.charsheet input[value='0'].toggle-npc ~ .background .thief-skills-box, +.charsheet input[value='0'].toggle-npc ~ .background .spells-box, +.charsheet input[value='0'].toggle-npc ~ .background .notes-box { + display: block; + position: relative; +} + +/* Hide Monster page*/ +.charsheet input[value='0'].is-npc ~ .background .wrapper .top-header .npc-tabs input[value='1'].toggle-npc, +.charsheet input[value='0'].is-npc ~ .background .wrapper .top-header .npc-tabs input[value='1'].toggle-npc + span.tab, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .npc-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .header-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .class-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .armor-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .personal-attributes-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .abilities-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .weapons-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .saves-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .equipment-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .special-abilities-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .nonweapon-proficiencies-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .thief-skills-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .spells-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .notes-box, +.charsheet input[value='0'].is-npc + input[value='1'].toggle-npc ~ .background .options-box { + display: none; +} + +/* show with Monster page*/ +.charsheet input[value='1'].toggle-npc ~ .background .weapons-box, +.charsheet input[value='1'].toggle-npc ~ .background .special-abilities-box { + display: block; +} + +.charsheet input[value='1'].toggle-npc ~ .background { + min-width: 380px; +} + +.charsheet input[value='1'].toggle-npc ~ .background .footer-box { + width: auto; +} + +.charsheet input[value='1'].toggle-npc ~ .background .npc-box { + align-items: flex-start; + display: flex; + flex-direction: column; + row-gap: 2px; +} + +.charsheet input[value='1'].toggle-npc ~ .background .weapons-box { + grid-column: 1/-1; + grid-row-start: 4; + margin: 0 0 0 0.5em; +} + +.charsheet input[value='1'].toggle-npc ~ .background .special-abilities-box { + grid-column: 1/-1; + grid-row-start: 5; + margin: 0 0 0 0.5em; +} + +/* Show Sheet Options */ +.charsheet input[value='99'].toggle-npc ~ .background .wrapper, +.charsheet input[value='99'].toggle-npc ~ .background .options-box { + display: block; +} + +.charsheet input[value='99'].toggle-npc ~ .background .wrapper .options-box > .header, +.charsheet input[value='99'].toggle-npc ~ .background .wrapper .options-box > .sect-show:first-child { + margin-top: 1em; +} + +/* Hide PC and Monster */ +.charsheet input[value='99'].toggle-npc ~ .background .npc-box, +.charsheet input[value='99'].toggle-npc ~ .background .header-box, +.charsheet input[value='99'].toggle-npc ~ .background .class-box, +.charsheet input[value='99'].toggle-npc ~ .background .armor-box, +.charsheet input[value='99'].toggle-npc ~ .background .personal-attributes-box, +.charsheet input[value='99'].toggle-npc ~ .background .abilities-box, +.charsheet input[value='99'].toggle-npc ~ .background .saves-box, +.charsheet input[value='99'].toggle-npc ~ .background .equipment-box, +.charsheet input[value='99'].toggle-npc ~ .background .special-abilities-box, +.charsheet input[value='99'].toggle-npc ~ .background .nonweapon-proficiencies-box, +.charsheet input[value='99'].toggle-npc ~ .background .thief-skills-box, +.charsheet input[value='99'].toggle-npc ~ .background .spells-box, +.charsheet input[value='99'].toggle-npc ~ .background .notes-box { + display: none; +} + +.charsheet input[value='0'].toggle-npc ~ .background .weapons-box .hide-as-pc, +.charsheet input[value='0'].toggle-npc ~ .background .special-abilities-box .hide-as-pc, +.charsheet input[value='1'].toggle-npc ~ .background .weapons-box .hide-as-npc, +.charsheet input[value='1'].toggle-npc ~ .background .special-abilities-box .hide-as-npc, +.charsheet input[value='1'].toggle-npc ~ .background .special-abilities-box div.sect .hide-as-npc { + display: none; +} + +/* toggle options */ +/* Hide Sheet Areas */ +.charsheet input[type='checkbox'].toggle-thief-skills:checked ~ .background .thief-skills-box, +.charsheet input[type='checkbox'].toggle-thief-skills:checked ~ .background .toggle-backstab, +.charsheet input[type='checkbox'].toggle-spells:checked ~ .background .spells-box, +.charsheet input[type='checkbox'].toggle-caster2:checked ~ .background .toggle-caster2, +.charsheet input[type='checkbox'].toggle-nwp:checked ~ .background .nonweapon-proficiencies-box, +.charsheet input[type='checkbox'].toggle-costs:checked ~ .background .toggle-costs, +.charsheet input[type='checkbox'].toggle-comeliness:checked ~ .background .toggle-comeliness, +.charsheet input[type='checkbox'].toggle-multiclass:checked ~ .background .toggle-multiclass, +.charsheet input[type='checkbox'].toggle-psionics:checked ~ .background .toggle-psionics, +.charsheet input[type='checkbox'].toggle-macros:checked ~ .background .toggle-macros, +.charsheet input[type='checkbox'].toggle-critdamage:not(:checked) ~ .background .toggle-critdamage, +.charsheet input[type='checkbox'].toggle-lbs:not(:checked) ~ .background span.toggle-lbs + span, +.charsheet input[type='checkbox'].toggle-lbs:checked ~ .background span.toggle-lbs { + display: none; +} + +.charsheet .background .toggle-multiclass-swap { + display: none; +} + +.charsheet input[type='checkbox'].toggle-multiclass:checked ~ .background .toggle-multiclass-swap { + display: flex; + margin-inline: inherit; + text-align: end; +} + +/* hide costs all tabs*/ +.charsheet input[type='checkbox'].toggle-costs:checked ~ .background .equipment-columns { + grid-template-columns: + 3.5em minmax(7em, 2fr) minmax(4em, 1fr) minmax(3em, 7em) minmax(1em, 3em) minmax(3.5em, 5em) 0.5em minmax(1em, 3em) minmax(3em, 5em) minmax(1em, 3em) 0.5em minmax(1em, 3em) minmax(1em, 4em) 0; +} + +/* hide costs Armor tab specific */ +.charsheet .toggle-costs:checked ~ .background .equipment-display-type[value='2'] ~ .equipment-columns, +.charsheet .toggle-costs:checked ~ .background .equipment-display-type[value='2'] ~ .repcontainer .equipment-columns { + display: grid; + grid-template-columns: + 3.5em minmax(7em, 2fr) minmax(4em, 1fr) minmax(3em, 7em) minmax(3.5em, 5em) minmax(3em, 5em) minmax(1em, 3em) 0.5em minmax(1em, 3em) minmax(1em, 4em); +} + +/* prevent interaction until an armor type is chosen */ +.charsheet .toggle-armor-details[value='99'] + label ~ label { + opacity: 0.5; + pointer-events: none; + user-select: none; +} + +.charsheet input[type='checkbox'].toggle-costs:checked ~ .background .equipment-totals { + grid-template-columns: 8em 6em; +} + +/*hide exceptional ability column */ +.charsheet input[type='checkbox'].toggle-exceptional:checked ~ .background .toggle-exceptional, +.charsheet input[type='checkbox'].toggle-exceptional:checked ~ .background .exceptional:not(:checked) + .toggle-exceptional, +.charsheet input[type='checkbox'].toggle-exceptional:not(:checked) ~ .background .exceptional:not(:checked) + .toggle-exceptional { + margin: 0 5px 0 0; + min-width: 0; + visibility: hidden; + width: 0; +} + +.charsheet input[type='checkbox'].toggle-exceptional:checked ~ .background .exceptional:not(:checked) + .toggle-exceptional.strength { + width: 1em; + visibility: visible; + position: relative; + margin-right: -1.75em; + opacity: 1; +} + +.charsheet input[type='checkbox'].toggle-exceptional:checked ~ .background .exceptional:not(:checked) + .toggle-exceptional.strength input { + background-color: transparent; +} + +.charsheet input[type='checkbox'].toggle-exceptional:checked ~ .background .wrapper .abilities-columns .exceptional:checked + label.toggle-exceptional.strength, +.charsheet input[type='checkbox'].toggle-exceptional:not(:checked) ~ .background .exceptional:checked + .toggle-exceptional { + margin: 0 2px 0 -5px; + min-width: 2.75em; + visibility: visible; + opacity: 1; +} + +.charsheet input[type='checkbox'].toggle-exceptional:checked ~ .background .exceptional:not(:checked) + sup.toggle-exceptional.strength, +.charsheet input[type='checkbox'].toggle-exceptional:not(:checked) ~ .background .exceptional:not(:checked) + sup.toggle-exceptional.strength { + margin: -5px 0 0 -10px; + min-width: 0; + visibility: hidden; + width: 0; +} + +.charsheet input[type='checkbox'].toggle-exceptional:checked ~ .background .exceptional:checked + sup.toggle-exceptional.strength, +.charsheet input[type='checkbox'].toggle-exceptional:not(:checked) ~ .background .exceptional:checked + sup.toggle-exceptional.strength { + margin: 5px 0 0 -10px; + min-width: 1em; + visibility: visible; +} + +/*choose to hit table*/ +.charsheet .toggle-to-hit-table ~ .subheader .matrix-box, +.charsheet .toggle-to-hit-table ~ .sect .matrix-box, +.charsheet .toggle-to-hit-table ~ .subheader .thac0-box, +.charsheet .toggle-to-hit-table ~ .sect .thac0-box { + display: none; + opacity: 1; +} + +.charsheet .toggle-to-hit-table:not(:checked) ~ .subheader .matrix-box, +.charsheet .toggle-to-hit-table:not(:checked) ~ .sect .matrix-box, +.charsheet .toggle-to-hit-table:checked ~ .subheader .thac0-box, +.charsheet .toggle-to-hit-table:checked ~ .sect .thac0-box { + display: inline-flex; +} + +.charsheet .toggle-to-hit-table:not(:checked) ~ .sect .matrix-class.matrix-box, +.charsheet .toggle-to-hit-table:checked ~ .sect .matrix-class.thac0-box { + display: grid; +} + +/* indicates an input error */ +.charsheet input[type='checkbox'].toggle-input-error:not(:checked) + label input[type='text'], +.charsheet input[type='checkbox'].toggle-input-error:not(:checked) + input[type='text'], +.charsheet input:invalid:required { + box-shadow: 0 0 0 2px red; + color: red; + outline: 2px dotted gold; +} + +/* indicates attention */ +.charsheet input[type='checkbox'].toggle-input-attention:checked + label input[type='text'] { + outline: 2px dashed #a5a1a7; + outline-offset: -1px; +} + +.charsheet input[type='checkbox'].toggle-input-attention + label .material-icons, +.charsheet input[type='checkbox'].toggle-input-attention + .material-icons { + color: crimson; + display: none; + font-size: var(--text-xxl); + opacity: 0.9; + position: absolute; +} + +/* encumbrance warning */ +.charsheet input[type='checkbox'].toggle-input-attention:checked + label .material-icons { + display: block; + margin: 5px 0 0 -68px; +} + +/* matrix warning */ +.charsheet input[type='checkbox'].toggle-input-attention:checked + .material-icons { + display: block; + margin: 9px 0 0 -16px; + opacity: 1; +} + +.charsheet .wrapper .autoexpand, +.charsheet .wrapper .npc-box .autoexpand { + height: 1.85em; + max-width: 15em; + min-width: 3em; + overflow: visible; + position: relative; + width: fit-content; +} + +.charsheet .wrapper .notes-box .autoexpand { + max-width: 100%; + min-width: 12em; +} + +.charsheet .wrapper .autoexpand span { + font-size: var(--text-med); + padding: 0 6px 0 6px; + visibility: hidden; +} + +.charsheet .wrapper .autoexpand textarea { + display: block; + height: -webkit-fill-available; + height: 100%; + padding: 6px; + resize: none; + white-space: break-spaces; + z-index: 1; +} + +.charsheet .wrapper .autoexpand textarea:hover { + resize: none; +} + +.charsheet .wrapper .autoexpand textarea + span { + display: block; + line-height: normal; + margin: auto; + max-width: 100%; + overflow: hidden; + padding: 6px; + position: relative; + white-space: break-spaces; +} + +.charsheet .wrapper .autoexpand textarea, +.charsheet .wrapper .autoexpand input { + font-size: var(--text-med); + margin: auto; + position: absolute; + width: 100%; +} + +.charsheet .wrapper .autoexpand:has(textarea) { + display: block; + height: fit-content; + max-width: 100%; + min-height: 6em; + min-width: 100%; + width: 100%; +} + +.charsheet .wrapper .autoexpand:has(input[placeholder='Description']) { + min-width: 7em; +} + +.charsheet .shrink-on-placeholder:placeholder-shown { + order: -1; + visibility: collapse; +} + +/* main grid */ + +/* general layout */ +.charsheet .two-columns { + display: grid; + grid-template-columns: 1fr 1fr; + justify-items: center; +} + +.charsheet .three-columns { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + justify-items: center; + width: 100%; +} + +.charsheet .four-columns { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + justify-items: center; + width: 100%; +} + +.charsheet .five-columns { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr 1fr; + justify-items: center; + width: 100%; +} + +.charsheet .six-columns { + align-items: center; + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; + justify-items: center; + width: 100%; +} + +.charsheet .eight-columns { + align-items: center; + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr; + justify-items: center; + width: 100%; +} + +.charsheet .span-two { + grid-column: span 2; + justify-self: left; + width: 100%; +} + +.charsheet .span-three { + grid-column: span 3; + width: 100%; +} + +.charsheet .span-four { + grid-column: span 4; + justify-content: space-evenly; + width: 100%; +} + +.charsheet .span-five { + grid-column: span 5; + justify-content: space-evenly; + width: 100%; +} + +.charsheet .span-six { + display: flex; + grid-column: span 6; + justify-content: space-evenly; + width: 100%; +} + +.charsheet .span-seven { + grid-column: span 7; + justify-content: space-evenly; + width: 100%; +} + +.charsheet .span-ten { + grid-column: span 10; + justify-content: space-evenly; + width: 100%; +} + +.charsheet .span-all { + grid-column: 1/-1; + justify-self: left; + width: 100%; +} + +details:hover, +summary:hover, +summary:hover * { + text-decoration: none; +} + +details[open] summary:hover, +details[open]:focus-within summary { + border-radius: 0; + z-index: 1; +} + +.sheet-darkmode .tab-content .charsheet details:hover summary, +.sheet-darkmode .tab-content .charsheet details:hover summary span, +.sheet-darkmode .tab-content .charsheet details:hover summary span label, +.sheet-darkmode .tab-content .charsheet details[open] summary, +.sheet-darkmode .tab-content .charsheet details[open]:hover summary + div, +.sheet-darkmode .tab-content .charsheet details[open]:hover summary + div label { + background-color: inherit; + color: inherit; +} + +details { + padding: 2px; +} + +details[open] { + border-radius: 4px; + outline: 1px solid var(--color-lightgrey2); + padding: 2px; +} + +summary { + cursor: pointer; +} + +summary > * { + display: inline; +} + +summary::-webkit-details-marker { + display: none; +} + +.charsheet details summary span.material-icons.custom-btn-nav::before, +.charsheet details summary span.material-icons.custom-btn-nav::before { + font-size: var(--text-med); +} + +.charsheet input.sect-show:hover + span.material-icons::before, +.charsheet input.toggle-npc:hover + span.material-icons.custom-btn-nav::before, +.charsheet details summary:hover > span.material-icons.gear-nav::before, +/* works with new .top-row change*/ +.charsheet .top-row:hover ~ details summary > span.material-icons.gear-nav::before, +.charsheet .top-row ~ details[open] summary > span.material-icons.gear-nav::before, +.charsheet details summary:hover > span.material-icons.custom-btn-nav::before { + color: var(--link-hover); + opacity: 1; + transform: rotate(180deg); + transform-origin: center; + z-index: 999; +} + +.charsheet input.sect-show + span.material-icons::before, +.charsheet input.toggle-npc + span.material-icons::before, +.charsheet details summary span.material-icons::before { + content: 'settings'; + cursor: pointer; + font-size: var(--text-med); + line-height: normal; + opacity: 0.5; + position: absolute; + transition: all 0.6s ease; +} + +.charsheet details summary:hover span.material-icons.custom-btn-nav::before { + margin: auto; +} + +.charsheet .weapons-row2 details summary:hover > span.material-icons.custom-btn-nav::before { + display: block; + margin: 0 -10px 0 -6px; + opacity: 1; +} + +.charsheet .weapons-row2 details summary > span.material-icons.custom-btn-nav::before { + display: block; + margin: 0 -10px 0 -6px; + opacity: 0.5; +} + +.charsheet details summary span.material-icons.custom-btn-nav::before { + margin: auto; +} + +.charsheet input.toggle-npc:hover + span.material-icons.custom-btn-nav::before { + margin: -0.5em 0 0 0.25em; + z-index: 0; +} + +.charsheet input.toggle-npc + span.material-icons.custom-btn-nav::before { + font-size: var(--text-xl); + margin: -0.5em 0 0 0.25em; +} + +.charsheet details[open] summary span.material-icons::before { + opacity: 1; +} + +.charsheet .material-icons.gear-nav { + left: 0; + position: absolute; + top: 0; +} + +/* nav triangle placement for repeating rows */ +.charsheet .repitem summary::before { + left: 3.75em; + top: 0.125em; +} + +/* character name */ +.charsheet .heading-box input.text-large { + margin: -0.5em 0 0.5em 0; + padding: 5px; +} + +/* HP Heart */ +.charsheet .heart { + display: inline-block; + height: 3em; +} + +.charsheet .background .wrapper .logo-box input.heart-input { + background-color: transparent; + border: 0; + color: var(--color-white1); + display: block; + font-size: 2.12rem; + margin: -2em 0 0 0.125em; + padding: 2px 0 0 0; + position: relative; + width: 2em; + z-index: 1; +} + +/*darkmode*/ +.sheet-darkmode .tab-content .charsheet .wrapper input[type='text'].heart-input, +.sheet-darkmode .tab-content .charsheet .wrapper input[type='text'].shield-input { + background-color: transparent; +} + +.sheet-darkmode .tab-content .charsheet .wrapper .heart::before, +.sheet-darkmode .tab-content .charsheet .wrapper .shield::before { + -webkit-text-fill-color: var(--color-black1); + -webkit-text-stroke: 2px var(--color-white3); + color: transparent; +} + +.charsheet .heart::before { + -webkit-text-fill-color: var(--color-darkgrey1); + -webkit-text-stroke: 2px #000; + content: 'k'; + font-family: Pictos; + font-size: 7.25rem; + margin: 0 0 0 -0.125em; + position: relative; +} + +/* AC Shield */ +.charsheet .shield { + display: inline-block; + height: 2.58em; +} + +.charsheet .background .wrapper .logo-box input.shield-input { + background-color: transparent; + border: 0; + color: var(--color-white1); + display: block; + font-size: 2.12rem; + margin: -2.5em 0 0 0.3em; + padding: 3px 0 0 0; + position: relative; + width: 2em; + z-index: 1; +} + +.charsheet .shield::before { + -webkit-text-fill-color: var(--color-darkgrey1); + -webkit-text-stroke: 2px #000; + content: 'b'; + font-family: Pictos Three; + font-size: 7.25rem; + position: relative; +} + +.charsheet .wrapper .column-header { + background-color: var(--color-darkgrey1); + border-bottom: 1px solid var(--color-darkgrey1); + border-top: 1px solid var(--color-darkgrey1); + color: var(--color-white1); + cursor: default; + margin: -1px -1px 0 -1px; + text-align: center; + width: calc(100% + 2px); +} + +.charsheet .background .wrapper .sect .column-header span { + color: var(--color-white1); +} + +.sheet-darkmode .background .wrapper .sect .column-header span { + color: var(--color-white2); +} + +/* label is before field */ +.charsheet label, +.charsheet .sect label, +.charsheet .inline-label { + align-items: center; + display: flex; + margin: auto; + padding: 0; +} + +.charsheet .sect label > span, +.charsheet .label-under > span, +.charsheet .inline-label span, +.charsheet .label-under-small, +.charsheet .more + span { + font-size: var(--text-med); + font-weight: var(--text-wt600); +} + +.charsheet .wrapper .inline-label label span, +.charsheet .wrapper label.inline-label span { + align-self: center; + margin: 0 2px 0 5px; +} + +.charsheet .npc-box .inline-label.split label { + margin-inline: 0; +} + +.charsheet .npc-box .inline-label.split label:first-child { + min-width: 33%; + width: min-content; +} + +.charsheet .wrapper .npc-box label > span { + font-family: var(--font-monster); + font-size: var(--text-med); + font-weight: var(--text-wt600); +} + +.charsheet .npc-box .four-columns span { + max-width: min-content; + text-align: center; +} + +.charsheet .npc-box .four-columns span button { + height: 3.65em; +} + +.charsheet .npc-box .npc-init-box { + justify-content: center; +} + +.charsheet .long { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* label is under field */ +.charsheet .wrapper .label-under { + flex-direction: column; + height: 100%; +} + +.charsheet .background .wrapper .label-under-small, +.charsheet .background .wrapper .label-under-small span { + flex-direction: column; + font-size: calc(var(--text-sm) + 0.08rem); +} + +.charsheet label input { + align-self: center; + margin-left: 0.125em; + white-space: nowrap; +} + +.charsheet label:has(> input[type='checkbox']) { + margin: auto; + max-width: fit-content; + position: relative; +} + +.charsheet .inline-label { + white-space: nowrap; +} + +.charsheet .inline-label.wrap { + flex-wrap: wrap; +} + +.charsheet .inline-label.wrap > * { + flex: 1; + max-width: fit-content; + min-width: auto; + width: auto; +} + +.charsheet .inline-label.wrap > h4 { + max-width: fit-content; +} + +.charsheet .hide-overflowing-text { + max-height: 1.35em; + overflow: hidden; + text-align: center; +} + +.charsheet .label-under-small:has(.hide-overflowing-text) { + min-width: 10%; +} + +.charsheet .label-percent::after { + content: '%'; + font-size: var(--text-med); + font-weight: normal; + left: -4px; + position: relative; +} + +.charsheet .label-equals::after { + content: '='; + margin: 0 -1ch 0 0; +} + +.charsheet .label-plus::after { + content: '+'; + margin: 0 -1ch 0 0; +} + +.charsheet .label-plus-minus::after { + content: '±'; + margin: 0 -1ch 0 0; +} + +.charsheet .label-parenthesis-left::before { + content: '('; + font-weight: normal; + margin: 0 -1px 2px 0; +} + +.charsheet .label-parenthesis-right::after { + content: ')'; + font-weight: normal; + margin: 0 0 2px -1px; +} + +.charsheet .material-icons.grid::after { + content: 'view_module'; + display: inline-flex; + font-size: inherit; + opacity: 0.75; + position: relative; + vertical-align: middle; +} + +.charsheet .material-icons.grid::before { + content: ''; +} + +.charsheet .top-header { + display: grid; + grid-column: 1/-1; + grid-template-columns: 1fr 1fr 1fr 1fr; + left: -1em; + margin: -2em 0 0 0; + position: relative; + width: 102%; +} + +.charsheet .npc-toggle { + grid-column: 1/1; + grid-row-start: 1; + z-index: 1; +} + +.charsheet .sheet-type { + display: grid; + position: relative; + top: -1.1em; +} + +.charsheet .friend-foe > span { + position: relative; + top: 6px; + width: 91px; +} + +.charsheet input.is-friend { + height: 1em; + left: 26px; + opacity: 0; + position: absolute; + top: -5px; + width: 2.75em; + z-index: 1; +} + +.charsheet input.is-foe { + height: 1em; + width: 2em; + opacity: 0; + position: absolute; + top: -5px; + right: 0; + z-index: 1; +} + +.charsheet .friend-foe .inline-label input.is-friend + span::before { + border-right: 1px solid var(--color-black1); + content: 'Friend'; + line-height: 1em; + font-weight: normal; + opacity: .35; + padding-right: 5px; + position: absolute; + top: 0; + left: 27px; +} + +.charsheet .friend-foe .inline-label input.is-foe + span::before { + border-left: 1px solid var(--color-black1); + content: 'Foe'; + line-height: 1em; + font-weight: normal; + opacity: .35; + padding-left: 5px; + position: absolute; + right: 4px; + top: 0; +} + +.charsheet .friend-foe .inline-label input[type="radio"].is-friend:checked + span::before, +.charsheet .friend-foe .inline-label input[type="radio"].is-foe:checked + span::before { + font-weight: bold; + opacity: 1; + text-decoration: underline; +} + +.charsheet input.is-pc { + bottom: -12px; + height: 1em; + left: 16px; + opacity: 0; + position: absolute; + width: 1.2em; + z-index: 1; +} + +.charsheet input.is-npc { + bottom: -12px; + height: 1em; + opacity: 0; + position: absolute; + right: 0; + width: 2em; + z-index: 1; +} + +.charsheet .pc-npc .inline-label input.is-pc + span::before { + border-right: 1px solid var(--color-black1); + content: 'PC'; + line-height: 1em; + font-weight: normal; + opacity: .35; + padding-right: 7px; + position: absolute; + left: 25px; + bottom: -8px; +} + +.charsheet .pc-npc .inline-label input.is-npc + span::before { + border-left: 1px solid var(--color-black1); + content: 'NPC'; + line-height: 1em; + font-weight: normal; + opacity: .35; + padding-left: 5px; + position: absolute; + right: 0; + bottom: -8px; +} + +.charsheet .pc-npc .inline-label input[type="radio"].is-pc:checked + span::before, +.charsheet .pc-npc .inline-label input[type="radio"].is-npc:checked + span::before { + font-weight: bold; + opacity: 1; + text-decoration: underline; +} + +.charsheet .friend-foe .inline-label input.is-friend:hover + span::before, +.charsheet .friend-foe .inline-label input.is-foe:hover + span::before, +.charsheet .pc-npc .inline-label input.is-pc:hover + span::before, +.charsheet .pc-npc .inline-label input.is-npc:hover + span::before { + font-weight: bold; + opacity: .75; +} + +.charsheet .npc-toggle.npc-tabs { + border: none; + width: 10em; +} + +.charsheet input.is-npc[value='0'] ~ .background .wrapper .top-header .npc-toggle input[value='0'] + span::after { + content: 'PC'; +} + +.charsheet input.is-npc[value='1'] ~ .background .wrapper .top-header .npc-toggle input[value='0'] + span::after { + content: 'NPC'; +} + +.charsheet .announcements-box { + display: grid; + grid-column: 2/-1; + grid-row-start: 1; + grid-template-columns: 6em auto 1fr; + justify-self: end; + margin-top: 7px; +} + +.charsheet .announcements-box > input, +.charsheet .announcements-box > .header, +.charsheet .announcements-box > .material-icons { + bottom: -2px; + position: relative; + right: 0; +} + +.charsheet .announcements-box input[type='checkbox'].sect-show { + bottom: 2px; + height: 15px; + margin: 0; + position: absolute; + right: -15px; + width: 22px; +} + +.charsheet .npc-box.statblock1 { + grid-column: 1/2; + grid-row-start: 2; + padding-top: 0.75em; +} + +.charsheet .npc-box.statblock2 { + grid-column: 1/2; + grid-row-start: 7; + padding-bottom: 1em; +} + +.charsheet .npc-box.statblock3 { + grid-column: 2/3; + grid-row-start: 2; + height: 100%; + z-index: 0; +} + +.charsheet .npc-box.statblock3-span { + grid-column: 1/3; + grid-row-start: 3; + margin-top: 2px; + max-width: 70vw; + min-width: 60vw; +} + +/* center image */ +section.npc-box.statblock3 .image-avatar { + align-self: center; + max-height: 100%; +} + +/* hypertext image link */ +.charsheet .background .wrapper .image-avatar img + button { + bottom: 50%; + display: none; + min-height: 100%; + min-width: 100%; + opacity: 0; + position: absolute; + top: 50%; + z-index: 3; +} + +.charsheet .background .wrapper .image-avatar:hover:has(> img[src]) { + background-color: revert; +} + +.charsheet .background .wrapper .image-avatar:hover img[src] + button { + display: block; +} + +.charsheet .npc-box.statblock4 { + grid-column: 2/3; + grid-row-start: 7; + height: 100%; + padding: 0 1em 0 1em; +} + +.charsheet .header .hide-as-pc { + color: initial; + display: inline-block; + font-family: var(--font-monster); + font-size: var(--text-med); + margin: 2px 0 2px -2px; +} + +.sheet-darkmode .charsheet .header .hide-as-pc { + color: var(--color-white3); +} + +.charsheet .wrapper .npc-box .image-avatar { + align-items: center; + display: inline-flex; + height: 100%; + margin: 0.5em; + max-height: 310px; + max-width: 310px; + min-height: 20px; + min-width: 120px; + overflow: visible; + padding-left: 0; + width: 100%; +} + +.charsheet .npc-box .image-avatar img { + height: fit-content; + max-height: 310px; + object-fit: scale-down; +} + +.charsheet .npc-box .inline-label { + width: 100%; +} + +.charsheet .npc-box label > span + span { + justify-content: left; + text-align: left; + width: inherit; +} + +.charsheet .npc-box label > span input, +.charsheet .npc-box label > input { + padding-left: clamp(2px, 7%, 10px); + text-align: left; +} + +.charsheet .header-box { + align-items: center; + display: grid; + grid-column: 1/-1; + grid-row-start: 2; + grid-template-columns: 1fr 1.5fr auto; + justify-items: center; + position: relative; +} + +.charsheet .heading-box { + align-self: center; + display: flex; + flex-direction: column; + grid-column-start: 1; + grid-row-start: 1; + min-width: 18em; + padding: 0 5px 5px 0; + row-gap: 3px; + z-index: 1; +} + +.charsheet .logo-box { + align-content: space-evenly; + align-self: normal; + display: grid; + grid-template-columns: 1fr 1fr 4em; + grid-template-rows: 8em 8em; + justify-items: center; + max-width: 30em; + min-width: 280px; + width: 100%; + z-index: 1; +} + +.charsheet .logo-box .two-columns { + align-content: end; + min-width: 18em; +} + +.charsheet .logo-box .two-columns label { + justify-content: center; + margin: 0 0 1em 0; + max-width: none; + min-width: 0; + width: 50%; +} + +.charsheet .logo-box .normalmode, +.charsheet .logo-box .darkmode { + background-position: 50% 0; + background-repeat: no-repeat; + background-size: contain; + height: 8em; + width: calc(100% - 25px); +} + +.charsheet .logo-box .normalmode { + background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/ADnD_1E/images/logo.png); + opacity: 0.9; +} + +.charsheet .logo-box .darkmode { + display: none; +} + +/* darkmode */ +.sheet-darkmode .tab-content .charsheet .logo-box .darkmode { + background-image: url(https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/ADnD_1E/images/logo_inverted.png); + display: block; + opacity: 0.8; +} + +.sheet-darkmode .tab-content .charsheet .logo-box .normalmode { + display: none; +} + +.charsheet .portrait-box { + align-content: center; + display: flex; + grid-column: 3/4; + grid-row-start: 1; + position: absolute; + width: 100%; +} + +/* sheet is set to no image */ +.charsheet .portrait-box:has(input[type='hidden'].toggle-avatar[value="2"]), +.charsheet .wrapper .npc-box.statblock3:has(.toggle-avatar[value="2"]) { + display: none; +} + +/* sheet image avatar or url toggle */ +.charsheet .image-avatar img { + display: none; +} + +/* hides the ghosted outline when no avatar has been selected yet */ +.charsheet input[type='hidden'].toggle-avatar[value="1"] ~ .image-avatar img, +.charsheet input[type='hidden'].toggle-avatar[value="2"] ~ .image-avatar img { + display: none; +} + +.charsheet input[type='hidden'].toggle-avatar[value="1"] ~ .image-avatar img[src] { + display: inherit; +} + +/* needs important to override inline style added by roll20 */ +.charsheet input[type='hidden'].toggle-avatar[value="1"] ~ .image-avatar, +.charsheet input[type='hidden'].toggle-avatar[value="2"] ~ .image-avatar { + background-image: none !important; + min-width: auto; +} + +.charsheet .image-avatar { + align-items: center; + background-color: transparent; + background-position: center; + background-repeat: no-repeat; + background-size: contain; + box-sizing: content-box; + display: flex; + flex-grow: 1; + height: 200px; + justify-content: center; + margin: 0 0.5em 0 0.5em; + max-width: 200px; + overflow: hidden; + padding-left: 10px; + position: relative; + right: -10px; + width: fit-content; +} + +/* breakpoint behavior for sheet portrait */ + +/* img url is a background image which is not detected by the grid + this prevents collapsing the 3rd column when using an image */ +.charsheet .header-box:has(.image-avatar:checked[style*='http']), +.charsheet .header-box:has(.toggle-avatar[value="1"] + .image-avatar img), +.charsheet .header-box:has(.toggle-avatar[value="2"] + .image-avatar img) { + grid-template-columns: 1fr 1.5fr auto; +} + +.charsheet .header-box:has(.image-avatar[style*='http']), +.charsheet .header-box:has(.toggle-avatar[value="1"] + .image-avatar img[src]) { + grid-template-columns: 1fr 1.5fr 1fr; + position: relative; +} + +.charsheet .background, +.charsheet .header-box, +.charsheet .logo-box, +.charsheet .image-avatar, +.charsheet .portrait-box { + container-type: inline-size; +} + +@container (max-width: 281px) { + + .charsheet .background .wrapper .header-box:has(.image-avatar[style*='http']) .logo-box .ac-columns, + .charsheet .background .wrapper .header-box:has(.toggle-avatar[value="1"] + .image-avatar img[src]) .logo-box .ac-columns { + align-self: baseline; + flex-direction: row; + margin: 4.1em -4.5em 0 0; + width: 100%; + } + + .charsheet .background .wrapper .header-box:has(.image-avatar[style*='http']) .logo-box .ac-columns label:nth-child(2), + .charsheet .background .wrapper .header-box:has(.toggle-avatar[value="1"] + .image-avatar img[src]) .logo-box .ac-columns label:nth-child(2) { + margin-left: 5px; + } + + .charsheet .background .wrapper .header-box:has(.image-avatar[style*='http']) .logo-box .ac-columns label:last-child, + .charsheet .background .wrapper .header-box:has(.toggle-avatar[value="1"] + .image-avatar img[src]) .logo-box .ac-columns label:last-child { + margin-left: 8px; + } +} + +@container (max-width: 686px) { + .charsheet .background .wrapper .header-box .portrait-box { + display: block; + max-height: var(--portrait-min-xy); + min-height: var(--portrait-min-xy); + /* position: relative; */ + right: 3.95vw; + top: 0; + } +} + +/* works for avatar image */ +@container (max-width: 188px) { + .charsheet .background .wrapper .header-box .portrait-box .image-avatar { + margin: auto; + max-height: var(--portrait-min-xy); + min-width: var(--portrait-min-xy); + overflow: visible; + } +} + +/* applies the same breakpoint behavior for url image */ +@container (max-width: 166px) { + .charsheet .wrapper .portrait-box .image-avatar img { + height: var(--portrait-min-xy); + min-width: var(--portrait-min-xy); + } +} + +/* NPC single column */ +@container (max-width: 518px) { + .charsheet .background .wrapper { + grid-template-columns: 100%; + } + + .charsheet .background .footer-box { + grid-column: 1; + margin-top: 1em; + } + + .charsheet .background section.npc-box.statblock3 div.image-avatar { + display: block; + max-height: 135px; + min-height: 26vw; + min-width: 135px; + right: 29vw; + top: -5px; + width: 26vw; + z-index: -1; + } + + .charsheet .background .statblock1 > input[type='text'] { + width: 63%; + } + + .charsheet .background .statblock3-span { + grid-column: 1/2; + } + + .charsheet .background .statblock4 { + grid-column: 1/2; + grid-row-start: 8; + min-height: 10em; + padding: inherit; + } + + .charsheet input[value='1'].toggle-npc ~ .background .weapons-box .matrix-box, + .charsheet input[value='1'].toggle-npc ~ .background .weapons-box .thac0-box, + .charsheet input[value='1'].toggle-npc ~ .background .weapons-box label, + .charsheet input[value='1'].toggle-npc ~ .background .weapons-box .to-hit-adj-box h4, + .charsheet input[value='1'].toggle-npc ~ .background .weapons-box .to-hit-adj-box span span { + font-size: 85%; + } + + .charsheet input[value='1'].toggle-npc ~ .background .weapons-box > .sect { + margin-bottom: 0 !important; + } + + .charsheet .toggle-npc ~ .background .weapons-box .matrix-box, + .charsheet .toggle-npc ~ .background .weapons-box .thac0-box { + display: none; + } + + .charsheet input[value='1'].toggle-npc:checked ~ .background .weapons-box .matrix-box, + .charsheet input[value='1'].toggle-npc:checked ~ .background .weapons-box .thac0-box { + display: contents; + } + + .charsheet input[value='1'].toggle-npc ~ .background .weapons-box .to-hit-adj-box { + display: grid; + overflow-x: scroll; + overflow-y: clip; + } + + .charsheet input[value='1'].toggle-npc ~ .background .special-abilities-box .sect > span:first-child { + display: none; + } + + .charsheet input[value='1'].toggle-npc ~ .background .special-abilities-box .repcontainer[data-groupname='repeating_ability'], + .charsheet input[value='1'].toggle-npc ~ input.toggle-single-column-abilities:not(:checked) ~ .background .repcontainer[data-groupname='repeating_ability'] { + column-count: 1; + column-gap: 0; + column-width: auto; + height: auto; + min-width: 100%; + } + + .charsheet input[value='1'].toggle-npc ~ input.toggle-single-column-abilities:checked ~ .background .repcontainer[data-groupname='repeating_ability'] { + column-count: 1; + min-width: auto; + } + + .charsheet input[value='1'].toggle-npc ~ .repcontainer[data-groupname='repeating_ability'] .repitem { + -webkit-column-break-inside: avoid; + break-inside: avoid-column; + display: grid; + page-break-inside: avoid; + } + + .charsheet input[value='1'].toggle-npc ~ input.toggle-single-column-abilities ~ .background .special-abilities-row1.column-header.two-column-header { + display: none; + } + + .charsheet input[value='1'].toggle-npc ~ input.toggle-single-column-abilities ~ .background .special-abilities-row1.two-column-header { + align-items: center; + display: grid; + grid-template-columns: 5em 1fr 7em 5em 1fr 7em; + justify-items: center; + } + + .charsheet input[value='1'].toggle-npc ~ input.toggle-single-column-abilities ~ .background .repcontainer[data-groupname='repeating_ability'] .special-abilities-row1 { + display: grid; + + grid-template-areas: + 'a b b b c c c' + 'd d d d d d d'; + } + + .charsheet input[value='1'].toggle-npc ~ input.toggle-single-column-abilities ~ .background .repcontainer[data-groupname='repeating_ability'] .special-abilities-row1 .ability-area-roll { + grid-area: a; + } + + .charsheet input[value='1'].toggle-npc ~ input.toggle-single-column-abilities ~ .background .repcontainer[data-groupname='repeating_ability'] .special-abilities-row1 .ability-area-name { + grid-area: b; + } + + .charsheet input[value='1'].toggle-npc ~ input.toggle-single-column-abilities ~ .background .repcontainer[data-groupname='repeating_ability'] .special-abilities-row1 .ability-area-uses { + grid-area: c; + } + + .charsheet input[value='1'].toggle-npc ~ input.toggle-single-column-abilities ~ .background .repcontainer[data-groupname='repeating_ability'] .special-abilities-row1 .ability-area-desc { + grid-area: d; + } + + .charsheet input[value='1'].toggle-npc ~ input.toggle-single-column-abilities ~ .background .special-abilities-box .spell-details-grid { + border: none; + max-width: fit-content; + } + + /* NPC portrait breakpoint behavior */ + /* attacks */ + /* special abilities */ +} + +.charsheet .image-avatar img { + background-color: transparent; + height: 200px; + object-fit: scale-down; + overflow: hidden; + z-index: 1; +} + +.charsheet .class-box { + grid-column: 1/-1; + grid-row-start: auto; + margin-top: -1em; +} + +.charsheet .ac-columns { + align-self: end; + display: flex; + flex-direction: column; + padding-bottom: 1em; + row-gap: 0.5em; +} + +.charsheet .armor-columns label:first-child { + font-weight: var(--text-wt400); + justify-content: center; +} + +.charsheet .armor-columns input[type='checkbox']:checked:nth-of-type(1) ~ :not(*:nth-child(n + 12)) { + font-weight: var(--text-wt600); +} + +/* only reveal calc button if auto-calc is disabled */ +.charsheet .armor-columns input[type='checkbox']:checked + button[type='action'] { + display: none; +} + +.charsheet .armor-box { + grid-column: 1/-1; + grid-row-start: auto; + margin-top: -1em; +} + +.charsheet .class-box:has(input.sect-show:checked) ~ .armor-box { + margin-top: 0; +} + +.charsheet .armor-columns { + align-items: center; + display: grid; + grid-template-columns: minmax(7em, 1.5fr) 3em minmax(11em, 2fr) repeat(4, minmax(3em, 1fr)) 3.5em 7em; + justify-items: center; +} + +.charsheet .armor-box .armor-columns.sect { + padding: 0; +} + +.charsheet .armor-box .material-icons + .armor-columns.sect { + margin-top: -1em; +} + +.charsheet .armor-box .sect-show:not(:checked) ~ .sect + .armor-columns { + margin-top: -1em; +} + +.charsheet div.background div.wrapper section.class-box > .sect-show:not(:checked), +.charsheet div.background div.wrapper section.armor-box > .sect-show:not(:checked) { + display: none; +} + +.charsheet .ac-calc-columns { + display: grid; + grid-template-columns: + minmax(3em, 0.75fr) minmax(3em, 0.75fr) minmax(3em, 0.75fr) auto minmax(3em, 0.75fr) minmax(3em, 0.75fr) auto minmax(4em, 1fr) minmax(3em, 0.75fr) auto minmax(4em, 1fr) auto; +} + +.charsheet .sync-lock > input[type='checkbox'], +.charsheet .sync-lock input[type='checkbox'] { + opacity: 0; + position: absolute; +} + +.charsheet .sync-lock > span + input[type='checkbox'], +.charsheet .sync-lock label + input[type='checkbox'], +.charsheet .sync-lock span + input[type='checkbox'] { + opacity: 1; + position: relative; +} + +.charsheet .sync-lock:hover, +.charsheet .sync-lock:hover > input[type='checkbox'] + span, +.charsheet .sync-lock:hover input[type='checkbox'] + span { + background-color: transparent; + color: var(--link-hover); + opacity: 1; +} + +.charsheet .sync-lock > input[type='checkbox'] + span, +.charsheet .sync-lock input[type='checkbox'] + span { + min-width: 1.1em; + opacity: 0.5; +} + +.charsheet .wrapper .armor-columns .span-six span.sync-lock input[type='checkbox'] + span { + margin: 0 0 2px 3px; +} + +.charsheet .sync-lock > input[type='checkbox']:checked + span::before, +.charsheet .sync-lock input[type='checkbox']:checked + span::before { + content: '('; + font-family: 'Pictos'; +} + +.charsheet .sync-lock > input[type='checkbox'] + span::before, +.charsheet .sync-lock input[type='checkbox'] + span::before { + content: ')'; + font-family: 'Pictos'; + margin-right: -12px; +} + +.charsheet .class-columns { + align-items: center; + display: grid; + grid-template-columns: + minmax(5em, 1fr) minmax(2em, 4em) minmax(2em, 4.75em) minmax(5em, 0.75fr) auto minmax(3em, 4em) 0.25fr minmax(4em, + 0.5fr) minmax(4em, 0.5fr) minmax(2em, 4em); + justify-items: center; +} + +.charsheet .hp-calc-columns { + align-items: end; + display: grid; + grid-column: 4/11; + grid-template-columns: minmax(7em, 1fr) auto minmax(6em, 1fr) 1em 1fr 0.25fr minmax(5.5em, 1fr) minmax(5em, 1fr); + justify-items: center; +} + +.charsheet input[type='checkbox'].toggle-multiclass:checked ~ .background .hp-calc-columns { + grid-template-columns: minmax(7em, 1fr) auto minmax(6em, 1fr) 2em 1fr; + margin-left: 0 !important; +} + +.charsheet .hp-calc-columns label { + align-items: center; +} + +.charsheet .personal-attributes-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +.charsheet .details-row, +.charsheet .details-row1, +.charsheet .details-row2 { + display: flex; + flex-direction: row; + padding-bottom: 4px; +} + +.charsheet .personal-attributes-box .sect .details-row2 label { + margin: auto 5px auto 0; +} + +.charsheet .details-row1 { + display: inline-flex; + flex-wrap: wrap; + row-gap: 2px; +} + +.charsheet .details-row1 .inline-label { + flex: 1 1 auto; + flex-basis: min-content; + justify-content: center; + margin-inline: 0; + max-width: fit-content; + min-width: min-content; + width: fit-content; +} + +.charsheet .details-row3 { + display: inline; +} + +.charsheet .class-details, +.charsheet .armor-details { + min-width: 9em; + padding: 0 1em 0 1em; + text-align: center; + white-space: nowrap; + width: 50%; +} + +.charsheet .class-details { + text-align: left; +} + +.charsheet .abilities-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +.charsheet .abilities-columns { + align-items: center; + display: grid; + gap: 4px 0; + grid-template-columns: + 3.65em minmax(2.5em, 3.5em) auto minmax(4em, 1fr) 2.5em minmax(4em, 1.5fr) 3.5em minmax(4em, 1.5fr) 3.5em minmax(4em, 1fr) 3.5em minmax(4em, 0.85fr) minmax(3em, 4em); + margin: 0 -1em 0 -1em; +} + +.charsheet .abilities-columns label { + justify-content: end; + justify-self: end; + margin-inline: auto; + margin-right: 2px; + width: auto; +} + +.charsheet .abilities-columns label span, +.charsheet .abilities-columns button { + text-align: right; +} + +/* hyperlink and image buttons */ +.charsheet .background .wrapper button.image-link, +.charsheet .background .wrapper button.info-link { + background-image: none; + border: none; + box-shadow: none; + margin: auto; + margin-left: 0; + min-width: auto; +} + +.charsheet .background .wrapper button.image-link:hover, +.charsheet .background .wrapper button.info-link:hover { + background-image: none; + border: none; + box-shadow: none; +} + +.charsheet .background .wrapper button.image-link:hover::after, +.charsheet .background .wrapper button.info-link:hover::after { + color: var(--link-hover); +} + +.charsheet .background .wrapper button.image-link::after, +.charsheet .background .wrapper button.info-link::after { + display: flex; + font-family: 'Pictos'; + font-size: 14px; + opacity: 0.7; +} + +.charsheet button.image-link::after { + content: 'P'; +} + +.charsheet button.info-link::after { + content: 'j'; + rotate: -45deg; +} + +.charsheet .wrapper label:has(textarea.image-link), +.charsheet .wrapper label:has(textarea.info-link) { + margin: auto; + margin-left: 0; + width: min-content; +} + +.charsheet label:has(textarea.image-link:focus-within), +.charsheet label:has(textarea.info-link:focus-within) { + margin: auto; + margin-left: 0; + min-width: 18.5em; + width: 100%; +} + +.charsheet .inline-label:has(textarea.info-link:focus-within) label:first-child { + width: auto; +} + +.charsheet label .image-link + textarea.image-link, +.charsheet label .info-link + textarea.info-link { + line-height: normal; + margin-left: 2px; + max-height: 1.65em; + overflow: hidden; + padding: inherit; + resize: none; + width: 3.75em; +} + +.charsheet label .image-link + textarea.image-link:focus-within, +.charsheet label .info-link + textarea.info-link:focus-within { + margin: auto; + margin-left: 2px; + width: 100%; +} + +.charsheet label .image-link + textarea.image-link, +.charsheet label .image-link + textarea.image-link, +.charsheet label .info-link + textarea.info-link, +.charsheet label .info-link + textarea.info-link { + transition: width linear(0 0%, + 0.22 2.1%, + 0.86 6.5%, + 1.11 8.6%, + 1.3 10.7%, + 1.35 11.8%, + 1.37 12.9%, + 1.37 13.7%, + 1.36 14.5%, + 1.32 16.2%, + 1.03 21.8%, + 0.94 24%, + 0.89 25.9%, + 0.88 26.85%, + 0.87 27.8%, + 0.87 29.25%, + 0.88 30.7%, + 0.91 32.4%, + 0.98 36.4%, + 1.01 38.3%, + 1.04 40.5%, + 1.05 42.7%, + 1.05 44.1%, + 1.04 45.7%, + 1 53.3%, + 0.99 55.4%, + 0.98 57.5%, + 0.99 60.7%, + 1 68.1%, + 1.01 72.2%, + 1 86.7%, + 1 100%) 0.4s; +} + +.charsheet .basemove-columns { + align-items: center; + display: grid; + grid-template-columns: + minmax(7em, 1fr) minmax(4em, 1fr) minmax(4em, 1.5fr) minmax(5em, 1.5fr) minmax(4em, 1fr) auto minmax(4em, 1fr) minmax(5em, 1fr) minmax(5em, 1fr); + row-gap: 0.75em; + text-align: center; +} + +.charsheet .saves-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +.charsheet .saves-columns { + align-items: center; + display: grid; + grid-template-columns: minmax(8em, 2fr) 1fr 2em 1fr 1em 1fr 1em 1fr 1em 1fr 1em 1fr 0.5em; + justify-items: center; + height: 2.65em; +} + +.charsheet .saves-box .saves-columns label:first-child, +.charsheet .thief-skills-box .thief-columns label:first-child { + align-items: center; + justify-content: center; + min-height: 2.85em; + text-align: center; +} + +.charsheet .thief-skills-box .thief-columns label:first-child { + min-height: revert; +} + +.charsheet .repcontainer[data-groupname='repeating_weapon'] .repitem, +.charsheet .repcontainer[data-groupname='repeating_equipment'] .repitem, +.charsheet .repcontainer[data-groupname='repeating_ability'] .repitem, +.charsheet .repcontainer[data-groupname='repeating_nonweaponproficiencies'] .repitem, +.charsheet .repcontainer[data-groupname='repeating_notes'] .repitem { + margin-block: 1px; +} + +.charsheet .repcontainer[data-groupname='repeating_equipment'].editmode .repitem:has(input.toggle-carry[value='0'] ~ .equipment-display-carry), +.charsheet .repcontainer[data-groupname='repeating_equipment'].editmode .repitem:has(input.toggle-carry[value='1'] ~ .equipment-display-carry) { + line-height: 1.4em; + margin: auto; +} + +.charsheet .weapons-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +.charsheet .weapons-proficiency-box { + display: grid; + grid-template-columns: 0.75fr 1fr 1fr 1fr 3em .5em 5em; + justify-items: right; + padding: 4px; +} + +.charsheet input[value='0'].weapon-type-toggle ~ .top-row .weapons-row1 .hide-if-melee, +.charsheet input[value='2'].weapon-type-toggle ~ .top-row .weapons-row1 .hide-if-melee, +.charsheet input[value='1'].weapon-type-toggle ~ .top-row .weapons-row1 .hide-if-ranged, +.charsheet input[value='3'].weapon-type-toggle ~ .top-row .weapons-row1 .hide-if-ranged, +.charsheet input[value='0'].weapon-type-toggle ~ .top-row .weapons-row2 .hide-if-melee, +.charsheet input[value='2'].weapon-type-toggle ~ .top-row .weapons-row2 .hide-if-melee, +.charsheet input[value='1'].weapon-type-toggle ~ .top-row .weapons-row2 .hide-if-ranged, +.charsheet input[value='3'].weapon-type-toggle ~ .top-row .weapons-row2 .hide-if-ranged { + display: none; +} + +.charsheet input[value='1'].weapon-type-toggle ~ .top-row .weapons-row2 .ranged-touch, +.charsheet input[value='3'].weapon-type-toggle ~ .top-row .weapons-row2 .hide-if-ranged-touch { + display: none; +} + +.charsheet .background .wrapper .weapons-row1, +.charsheet .background .wrapper .weapons-row2 { + align-content: flex-start; + align-items: center; + display: flex; + flex-wrap: wrap; + gap: 0 2px; + justify-content: flex-start; +} + +.charsheet .background .wrapper .weapons-row1 { + padding-top: 2px; +} + +.charsheet .background .wrapper .weapons-row1 > label, +.charsheet .background .wrapper .weapons-row2 > label { + flex: 1 0 6em; + margin: inherit; + margin-inline: auto; + max-width: min-content; +} + +/* in-use toggle */ +.charsheet .background .wrapper .weapons-row2 > label:first-child { + position: absolute; + top: 1.75em; +} + +.charsheet .background .wrapper .weapons-row2 > label:first-child span { + margin: auto; +} + +.charsheet .background .wrapper .weapons-row1 button[type='roll'].dice-button { + margin: 0 0 0 0.75em; +} + +.charsheet .background .wrapper .weapons-row2 > details { + border: none; + margin: auto; + max-width: 7em; + min-width: 6em; +} + +.charsheet .background .wrapper .weapons-row1 label.repeating-name { + flex: 19%; + max-width: 25em; + min-width: 8em; + padding-inline: 5px; +} + +.charsheet .background .wrapper .repeating-name input { + font-size: var(--text-med); + font-weight: var(--text-wt500); +} + +/* crit damage modal */ +.charsheet .toggle-macros:checked ~ .background .wrapper .weapons-row2 > details.small-damage[open] summary + .toggle-critdamage, +.charsheet .toggle-macros:checked ~ .background .wrapper .weapons-row2 > details.large-damage[open] summary + .toggle-critdamage { + background-color: var(--color-white3); + border: 1px solid; + border-radius: 4px; + color: initial; + display: block; + height: 2em; + margin: 0 0 0 0; + max-width: none; + min-width: auto; + opacity: 1; + padding: 2px 0 2px 0; + position: absolute; + resize: none; + width: 77px; + z-index: 3; +} + +.charsheet .toggle-macros:checked ~ .background .wrapper .weapons-row2 > details.small-damage[open] summary + .toggle-critdamage button, +.charsheet .toggle-macros:checked ~ .background .wrapper .weapons-row2 > details.large-damage[open] summary + .toggle-critdamage button { + margin-inline: auto; +} + +.charsheet .background .wrapper .weapons-row2 > details :first-child button { + margin-inline: auto; + margin-top: -2px; + max-height: 1.125em; + min-width: fit-content; + padding-top: 0; +} + +.charsheet .background .wrapper .weapons-row2 > details.small-damage[open] summary + .toggle-critdamage, +.charsheet .background .wrapper .weapons-row2 > details.large-damage[open] summary + .toggle-critdamage { + background-color: var(--color-white3); + border: 1px solid; + border-radius: 4px; + color: initial; + display: inline-grid; + grid-template-columns: 6em auto; + height: auto; + margin: 0 0 0 -3em; + max-width: none; + min-height: 2.5em; + min-width: 55%; + opacity: 1; + overflow: hidden; + padding: 2px 2px 2px 0; + position: absolute; + resize: horizontal; + width: 36%; + z-index: 3; +} + +.charsheet .background .wrapper .weapons-row2 .toggle-critdamage textarea { + overflow: hidden; + resize: none; + border-color: #000; + background-color: revert; +} + +.charsheet .weapons-row2 > details[open] input { + max-width: fit-content; + outline: 1px solid var(--color-lightgrey2); +} + +.charsheet .toggle-critdamage:not(:checked) ~ .background .wrapper span.weapons-row2.center summary .custom-btn-nav + input, +.charsheet .toggle-critdamage:not(:checked) ~ .background .wrapper span.weapons-row2.center summary .custom-btn-nav ~ button { + width: 100%; + margin-inline: -1px; +} + +.charsheet .background .wrapper .two-inputs-over-label { + display: inline; + margin: auto; + min-width: max-content; +} + +.charsheet .select-over-label { + appearance: none; + margin: -3px 0 0 0; + max-width: 97%; +} + +.charsheet .weapons-box .repitem summary::before { + left: 3.75em; +} + +.charsheet .toggle-to-hit-table ~ .sect label, +.charsheet .thief-class label { + justify-content: center; +} + +.charsheet .saves-class { + display: grid; + grid-template-columns: .75fr 1fr 6em; + margin: -20px 0 5px auto; + position: relative; + width: 50%; + z-index: 1; +} + +.charsheet .npc-box .saves-class { + grid-template-columns: auto 1fr 7em; + width: 100%; +} + +.charsheet .thief-class { + display: grid; + grid-template-columns: 1fr 6em 1fr 1fr; + margin: -1.5em .5em .5em auto; + position: relative; + width: 80%; + z-index: 2; +} + +.charsheet .toggle-sync-class:checked ~ .thief-class { + grid-template-columns: 1fr 1fr 1fr 6em 1fr 1fr; +} + +.charsheet .settings label:has(> input[type='checkbox']), +.charsheet .saves-class label:has(> input[type='checkbox']), +.charsheet .matrix-class label:has(> span + input[type='checkbox']), +.charsheet .thief-class label:has(> input[type='checkbox']) { + margin-right: 0; +} + +.charsheet .background .wrapper input[type="checkbox"].toggle-matrix-autofill:not(:checked) ~ .matrix-class { + display: flex; + justify-self: left; +} + +.charsheet .wrapper .toggle-matrix-autofill:not(:checked) ~ .matrix-class .inline-label ~ * { + display: none; +} + +.charsheet .toggle-sync-class:not(:checked) ~ .matrix-class .show-sync-class, +.charsheet .toggle-sync-class:checked ~ .matrix-class .show-when-not-synced, +.charsheet .toggle-sync-class:not(:checked) ~ .thief-class .show-sync-class, +.charsheet .toggle-sync-class:checked ~ .thief-class .show-when-not-synced { + display: none; +} + +.charsheet .toggle-sync-class:not(:checked) ~ .matrix-class .show-when-not-synced, +.charsheet .toggle-sync-class:checked ~ .matrix-class .show-sync-class, +.charsheet .toggle-sync-class:not(:checked) ~ .thief-class .show-when-not-synced, +.charsheet .toggle-sync-class:checked ~ .thief-class .show-sync-class { + display: flex; +} + +.charsheet .toggle-sync-class:not(:checked) ~ .matrix-class { + display: grid; + grid-template-columns: 1fr 5em 2fr 2fr; + grid-template-rows: 1.2em 2em; + position: relative; + row-gap: 2px; +} + +.charsheet .toggle-sync-class:checked ~ .matrix-class { + display: grid; + grid-template-columns: 1fr 7em 1fr 5em 2fr auto; + grid-template-rows: 1.2em 2em; + position: relative; + row-gap: 2px; +} + +.charsheet .toggle-sync-class:not(:checked) + input[value='2'].toggle-fighter5 ~ .matrix-class { + display: grid; + grid-template-columns: 1fr 5em 2fr 5em 2fr; +} + +.charsheet .toggle-sync-class:checked + input[value='2'].toggle-fighter5 ~ .matrix-class { + display: grid; + grid-template-columns: 1fr 7em 1fr 5em 2fr 5em auto; +} + +.charsheet .class-selected ~ .show-none, +.charsheet .class-selected ~ .show-class1-name, +.charsheet .class-selected ~ .show-class2-name, +.charsheet .class-selected ~ .show-class3-name, +.charsheet .class-selected ~ .show-monster-name { + display: none; +} + +.charsheet .class-selected[value="0"] ~ .show-none, +.charsheet .class-selected[value="1"] ~ .show-class1-name, +.charsheet .class-selected[value="2"] ~ .show-class2-name, +.charsheet .class-selected[value="3"] ~ .show-class3-name, +.charsheet .class-selected[value="4"] ~ .show-monster-name { + display: block; +} + +.charsheet .matrix-class .fighter5 { + display: none; +} + +.charsheet input[value='2'].toggle-fighter5 ~ .matrix-class .fighter5 { + display: flex; +} + +.charsheet .toggle-matrixhd:not(:checked) ~ .matrix-class .matrix-hd, +.charsheet .toggle-matrixhd:checked ~ .matrix-class .matrix-level { + display: none; +} + +.charsheet .to-hit-adj-box .to-hit, +.charsheet .to-hit-adj-box .to-hit-input { + align-items: end; + display: grid; + grid-template-columns: + minmax(3em, 5em) minmax(3em, 5em) minmax(3em, 5em) minmax(3em, 5em) minmax(7em, 10em) repeat(11, minmax(1.5em, 3em)) 4em; + justify-content: flex-start; +} + +.charsheet .to-hit > input { + justify-self: center; +} + +.charsheet .to-hit-input span { + background-color: var(--color-white1); +} + +.sheet-darkmode .charsheet .to-hit-input span { + background-color: var(--color-black2); +} + +.charsheet .to-hit, +.charsheet .to-hit-input { + display: grid; + grid-template-columns: repeat(21, 1fr); +} + +.charsheet .equipment-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +.charsheet .equipment-columns, +/* overrides Armor grid when adding new gear on Armor tab */ +.charsheet input[type="hidden"].equipment-display-type[value="2"] ~ .repcontainer .equipment-columns:has(.equipment-type[value="0"]) { + align-items: center; + display: grid; + justify-items: center; + padding: 0 2px 0 2px; + grid-template-columns: + 3.5em minmax(7em, 2fr) minmax(4em, 1fr) minmax(3em, 7em) minmax(3.5em, 5em) minmax(1em, 3em) 0.5em minmax(1em, 3em) minmax(3em, 5em) minmax(1em, 3em) 0.5em minmax(1em, 3em) minmax(1em, 4em) minmax(1em, 4em); +} + +/* Armor tab specific */ +.charsheet .background input[type='hidden'].equipment-display-type[value='2'] ~ .equipment-columns, +.charsheet .background input[type='hidden'].equipment-display-type[value='2'] ~ .repcontainer .equipment-columns { + display: grid; + padding: 0 2px 0 2px; + grid-template-columns: + 3.5em minmax(7em, 2fr) minmax(4em, 1fr) minmax(3em, 7em) minmax(3.5em, 5em) minmax(3em, 5em) minmax(1em, 3em) 0.5em minmax(1em, 3em) minmax(1em, 4em) minmax(1em, 4em); +} + +.charsheet span.equipment-columns.column-header { + margin-top: 4px; + padding-top: 2px; +} + +/* hide stuff for the weapons and armor tab*/ +.charsheet .background input[type='hidden'].equipment-display-type[value='1'] ~ .equipment-columns .hidden-for-weapons, +.charsheet .equipment-type[value='1'] ~ .hidden-for-weapons, +.charsheet .background input[type='hidden'].equipment-display-type[value='2'] ~ .equipment-columns .hidden-for-armor, +.charsheet .equipment-type[value='2'] ~ .hidden-for-armor { + display: none; +} + +/* needed as a placeholder for when all types of equipment are displayed */ +.charsheet .equipment-display-type[value='-1'] ~ .repcontainer .equipment-type[value='2'] ~ .hidden-for-armor, +.charsheet .equipment-display-type[value='3'] ~ .repcontainer .equipment-type[value='2'] ~ .hidden-for-armor { + display: block; + opacity: 0; + pointer-events: none; +} + +.charsheet .equipment-box > .material-icons + .sect { + margin-top: -1.5em; + width: min-content; +} + +/* hide the weapon and armor details row for all other tabs */ +.charsheet .equipment-box .show-for-weapons, +.charsheet .equipment-box .show-for-armor { + display: none; +} + +/* show the weapon and armor details row only if on the weapon or armor tab */ +.charsheet .repitem:has(.equipment-type[value='1']) details .show-for-weapons, +.charsheet .repitem:has(.equipment-type[value='2']) details .show-for-armor { + align-items: baseline; + display: flex; + flex-flow: row wrap; + justify-content: flex-start; + padding: 2px; +} + +.charsheet .repitem:has(.equipment-type[value='1']) details .show-for-weapons label, +.charsheet .repitem:has(.equipment-type[value='2']) details .show-for-armor label { + flex: 1 1 auto; + width: min-content; +} + +/* show a different view of the AC/AR select for shield */ +.charsheet .repitem:has(.equipment-type[value='2']) details .show-for-armor .toggle-armor-details ~ label .show-shield-only { + display: none; +} + +.charsheet .repitem:has(.equipment-type[value='2']) details .show-for-armor .toggle-armor-details[value='3'] ~ label .show-shield-only, +.charsheet .repitem:has(.equipment-type[value='2']) details .show-for-armor .toggle-armor-details[value='6'] ~ label .show-shield-only, +.charsheet .repitem:has(.equipment-type[value='2']) details .show-for-armor .toggle-armor-details[value='7'] ~ label .show-shield-only, +.charsheet .repitem:has(.equipment-type[value='2']) details .show-for-armor .toggle-armor-details[value='8'] ~ label .show-shield-only, +.charsheet .repitem:has(.equipment-type[value='2']) details .show-for-armor .toggle-armor-details[value='9'] ~ label .show-shield-only, +.charsheet .repitem:has(.equipment-type[value='2']) details .show-for-armor .toggle-armor-details[value='10'] ~ label .show-shield-only { + display: flex; +} + +.charsheet .toggle-armor-details[value='3'] ~ label .show-shield-only + select, +.charsheet .toggle-armor-details[value='6'] ~ label .show-shield-only + select, +.charsheet .toggle-armor-details[value='7'] ~ label .show-shield-only + select, +.charsheet .toggle-armor-details[value='8'] ~ label .show-shield-only + select, +.charsheet .toggle-armor-details[value='9'] ~ label .show-shield-only + select, +.charsheet .toggle-armor-details[value='10'] ~ label .show-shield-only + select { + display: none; +} + +/* hide rep_equip armor fields to match their armor details row */ +.charsheet .toggle-armor-details[value='0'] ~ label.hide-magic, +.charsheet .toggle-armor-details[value='0'] ~ label.hide-misc, +.charsheet .toggle-armor-details[value='1'] ~ label.hide-misc, +.charsheet .toggle-armor-details[value='2'] ~ label.hide-misc, +.charsheet .toggle-armor-details[value='4'] ~ label.hide-ar, +.charsheet .toggle-armor-details[value='4'] ~ label.hide-bulk, +.charsheet .toggle-armor-details[value='4'] ~ label.hide-misc, +.charsheet .toggle-armor-details[value='5'] ~ label.hide-bulk, +.charsheet .toggle-armor-details[value='6'] ~ label.hide-bulk, +.charsheet .toggle-armor-details[value='7'] ~ label.hide-bulk, +.charsheet .toggle-armor-details[value='8'] ~ label.hide-bulk, +.charsheet .toggle-armor-details[value='9'] ~ label.hide-bulk, +.charsheet .toggle-armor-details[value='10'] ~ label.hide-bulk { + display: none; +} + +.charsheet .toggle-weapon-details[value='0'] ~ label.hide-ranged, +.charsheet .toggle-weapon-details[value='1'] ~ label.hide-melee, +.charsheet .toggle-weapon-details[value='2'] ~ label.hide-ranged { + display: none; +} + +.charsheet .capacity-box { + display: flex; + flex-direction: column; + grid-column: span 3; + width: 99%; +} + +.charsheet .coin-columns { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; + justify-items: center; + margin: 0 0 0.5em 0; +} + +.charsheet .capacity-box-loads { + align-items: center; + display: grid; + grid-column: 1/-1; + grid-template-columns: 1fr 1fr 2em 1fr 1fr 1fr 1fr; + justify-items: center; +} + +.charsheet .equipment-totals { + align-items: center; + border: 1px solid var(--color-lightgrey2); + border-radius: 6px; + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + display: grid; + grid-column-gap: 1px; + grid-template-columns: 8em 6em 6em; + height: fit-content; + justify-items: center; + justify-self: right; + padding: 4px; +} + +.charsheet .special-abilities-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +/*two columns*/ +.charsheet .repcontainer[data-groupname='repeating_ability'], +.charsheet .repcontainer[data-groupname='repeating_spells'], +.charsheet .repcontainer[data-groupname='repeating_attributes'], +.charsheet .repcontainer[data-groupname='repeating_notes'] { + column-count: 2; + column-gap: 0.25em; + font-size: var(--text-sm); +} + +/*single column*/ +.charsheet input.toggle-single-column-abilities:checked ~ .background .repcontainer[data-groupname='repeating_ability'], +.charsheet input.toggle-single-column-spells:checked ~ .background .repcontainer[data-groupname='repeating_spells'], +.charsheet input.toggle-single-column-attributes:checked ~ .background .repcontainer[data-groupname='repeating_attributes'], +.charsheet input.toggle-single-column-notes:checked ~ .background .repcontainer[data-groupname='repeating_notes'] { + column-count: 1; + font-size: var(--text-med); + min-width: auto; +} + +.charsheet .repcontainer[data-groupname='repeating_ability'] .repitem, +.charsheet .repcontainer[data-groupname='repeating_spells'] .repitem, +.charsheet .repcontainer[data-groupname='repeating_notes'] .repitem, +.charsheet .repcontainer[data-groupname='repeating_attributes'] .repitem { + -webkit-column-break-inside: avoid; + break-inside: avoid-column; + display: block; + page-break-inside: avoid; +} + +.charsheet input.toggle-single-column-abilities:checked ~ .background .special-abilities-row1.column-header.two-column-header { + display: none; +} + +.charsheet input.toggle-single-column-abilities:not(:checked) ~ .background .special-abilities-row1.column-header { + display: none; +} + +.charsheet input.toggle-single-column-abilities:not(:checked) ~ .background .special-abilities-row1.two-column-header { + align-items: center; + display: grid; + grid-template-columns: 5em 1fr 7em 5em 1fr 7em; + justify-items: center; +} + +.charsheet input.toggle-single-column-abilities:not(:checked) ~ .background .repcontainer[data-groupname='repeating_ability'] .special-abilities-row1 { + display: grid; + + grid-template-areas: + 'a b b b c c c' + 'd d d d d d d'; +} + +.charsheet input.toggle-single-column-abilities:not(:checked) ~ .background .repcontainer[data-groupname='repeating_ability'] .special-abilities-row1 .ability-area-roll { + grid-area: a; +} + +.charsheet input.toggle-single-column-abilities:not(:checked) ~ .background .repcontainer[data-groupname='repeating_ability'] .special-abilities-row1 .ability-area-name { + grid-area: b; +} + +.charsheet input.toggle-single-column-abilities:not(:checked) ~ .background .repcontainer[data-groupname='repeating_ability'] .special-abilities-row1 .ability-area-uses { + grid-area: c; +} + +.charsheet input.toggle-single-column-abilities:not(:checked) ~ .background .repcontainer[data-groupname='repeating_ability'] .special-abilities-row1 .ability-area-desc { + grid-area: d; +} + +.charsheet .special-abilities-row1 { + align-items: center; + display: grid; + grid-template-columns: 3.5em 3fr 5fr 7em; + justify-items: center; + padding: 0 2px 2px 2px; +} + +.charsheet input.toggle-single-column-spells:checked ~ .background .repcontainer[data-groupname='repeating_spells'] .spells-repheader:has(~ details[open]), +.charsheet .repitem .special-abilities-row1:has(~ details[open]) { + margin-bottom: -0.75em; +} + +.charsheet .repitem .nonweapon-proficiencies-row1:has(~ details[open]) { + margin-bottom: -0.5em; +} + +.charsheet .repcontainer[data-groupname='repeating_spells'] .spells-repheader:has(~ details[open]) .spell-level { + display: none; +} + +.charsheet .special-abilities-row2 { + display: grid; + grid-template-columns: 3em 5em auto; + justify-items: center; + padding: 2px; +} + +.charsheet .nonweapon-proficiencies-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +.charsheet .nonweapon-proficiencies-row1 { + align-items: center; + display: grid; + grid-template-columns: 3.5em 2fr 2fr 1fr 4em 4em 4em; + justify-items: center; + padding: 0 2px 2px 2px; +} + +.charsheet .thief-skills-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +.charsheet .thief-columns { + align-items: center; + display: grid; + grid-template-columns: minmax(8em, 2fr) 1fr 2em 1fr 2em 1fr 2em 1fr 2em 1fr 1em; + justify-items: center; + max-height: 3em; +} + +.charsheet .thief-columns label { + justify-content: center; +} + +.charsheet .spells-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +.charsheet .spells-top { + align-items: center; + display: grid; + grid-template-columns: repeat(10, 1fr); + justify-items: center; +} + +.charsheet .spells-middle { + align-items: center; + display: grid; + grid-template-columns: repeat(20, 1fr); + justify-items: center; +} + +.charsheet .spells-middle span input { + margin: 0; + padding: 0; +} + +.sheet-darkmode .tab-content .charsheet .spells-middle > span:has(input.width-fill[name$="max"]) > input, +.charsheet .spells-middle > span:has(input.width-fill[name$="max"]) > input { + background-color: var(--color-white2); + color: var(--color-darkgrey1); +} + +.charsheet .spells-middle span:nth-child(2n) { + background-color: var(--color-white2); + color: initial; +} + +.charsheet .spells-middle span { + border: 1px solid var(--color-white3); +} + +.charsheet .spells-bottom { + align-items: center; + display: grid; + grid-template-columns: repeat(10, 1fr); + margin-bottom: 0.5em; +} + +.charsheet .spells-repheader { + display: flex; + font-size: var(--text-lg); + justify-items: center; + padding: 0 2px 2px 2px; +} + +.charsheet div.spell-details-grid { + display: grid; + grid-template-columns: 1fr 1fr; + margin-inline: auto; + padding: 4px; + width: auto; +} + +.charsheet .spell-details-grid .span-all label:first-child > select { + margin: auto; + margin-right: 4px; + width: fit-content; +} + +.charsheet .spell-details-grid .span-all label:first-child > input { + max-width: 13em; +} + +.charsheet input.toggle-single-column-abilities:not(:checked) ~ .background .special-abilities-box .spell-details-grid, +.charsheet input.toggle-single-column-spells:not(:checked) ~ .background .spell-display .spell-details-grid { + border: none; + max-width: fit-content; +} + +.charsheet input.toggle-single-column-spells:not(:checked) ~ .background .spell-display .spell-details-grid > :first-child { + margin-top: -0.75em; +} + +.charsheet input.toggle-single-column-abilities:not(:checked) ~ .background .special-abilities-box .spell-details-grid { + margin-top: -1em; +} + +.charsheet .spell-details-grid label { + justify-content: left; + text-align: left; +} + +.charsheet .spell-details-grid label span { + margin: 0 2px 0 0; + white-space: nowrap; +} + +.charsheet .notes-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +.charsheet .notes-norep-columns { + align-items: center; + display: grid; + grid-template-columns: 3.5em auto; +} + +.charsheet .notes-columns { + display: grid; + grid-template-columns: 3.5em 1fr; + padding-right: 5px; +} + +.charsheet .notes-box input { + text-align: left; +} + +.charsheet .options-box { + grid-column: 1/-1; + grid-row-start: auto; +} + +.charsheet .options-box .settings { + align-items: start; + background-color: rgb(116 116 116 / 40%); + border: 1px solid var(--color-lightgrey2); + border-radius: 6px; + display: flex; + flex-direction: column; + flex-wrap: wrap; + min-width: 515px; + padding: 1em; + row-gap: 1em; +} + +.sheet-darkmode .charsheet .options-box .settings { + background-color: var(--color-lightgrey2); + color: initial; +} + +.charsheet .options-box .settings label, +.charsheet .wrapper .options-box .settings span h4 { + background-color: revert; + color: initial; +} + +.sheet-darkmode .charsheet .options-box .settings label, +.sheet-darkmode .charsheet .options-box .settings .inline-label > span, +.sheet-darkmode .charsheet .options-box .settings .inline-label label > span, +.sheet-darkmode .charsheet .wrapper .options-box .settings span h4 { + color: initial; +} + +.charsheet .options-box .settings .six-columns, +.charsheet .options-box .settings .eight-columns { + row-gap: 5px; +} + +.charsheet .options-box .settings .inline-label h4, +.charsheet .options-box .settings .six-columns h4, +.charsheet .options-box .settings .eight-columns h4 { + color: inherit; + min-width: 8em; + text-align: center; +} + +.charsheet .options-box .settings > span { + padding-block: 5px; + width: -webkit-fill-available; +} + +.charsheet .options-box .settings > span:nth-child(odd) { + background-color: var(--color-white2); + width: 100%; +} + +.charsheet .custom-attributes .custom-attributes-box { + display: grid; + grid-column-gap: 2px; + grid-template-columns: 1fr 6em 1fr 6em; + line-height: 1.85em; + margin-top: 0.25em; +} + +.charsheet .repcontainer[data-groupname='repeating_attributes'] .repitem > div { + padding: 4px; +} + +.charsheet .footer-box { + column-gap: 2em; + display: flex; + flex-wrap: wrap; + grid-column: 1/-1; + grid-row-start: 15; + justify-content: space-around; + margin: auto; +} + +/* announcements */ +.charsheet .announcements-box .announcements-title { + color: var(--link-hover); + font-size: 85%; + line-height: 2em; + margin: 1px -2px 0 5px; + padding: 0 0 0 5px; + position: relative; +} + +.charsheet .wrapper .announcements { + background-color: var(--color-white3); + border: 2px solid var(--color-lightgrey2); + border-radius: 6px; + color: initial; + max-height: 400px; + overflow: hidden; + padding: 1em; + padding-top: 1.2em; + position: absolute; + right: 0.75em; + text-align: left; + top: 1.25em; + width: 75%; + z-index: 5; +} + +.charsheet .center { + justify-content: center; + text-align: center; +} + +.charsheet .wrapper .left, +.charsheet .wrapper label.left { + justify-self: left; + margin: auto; + margin-left: 0; + padding: 0 5px 0 5px; + text-align: left; +} + +.charsheet .right, +.charsheet label.right { + justify-content: right; + justify-self: right; + margin: auto; + margin-right: 0; + text-align: right; +} + +.charsheet .wrapper .width-auto, +.charsheet .wrapper .label.auto-width { + width: auto; +} + +.charsheet .fill { + width: 100%; +} + +.charsheet .border { + border: 1px solid var(--color-lightgrey2); + border-radius: 6px; + margin: 2px 0 2px 0; +} + +.charsheet .border-top-half { + border-inline: 1px solid var(--color-lightgrey2); + border-top: 1px solid var(--color-lightgrey2); + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +.charsheet .border-bottom-half { + border-bottom: 1px solid var(--color-lightgrey2); + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + margin-top: -3px; +} + +.ui-dialog .charsheet .background .wrapper .sect .repitem details[open].border-bottom-half { + border: 1px solid; + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + box-shadow: none; + display: block; + margin: auto; + outline: none; +} + +.charsheet details[open].border-bottom-half > :not(*:first-child) { + margin-block: 2px; +} + +.charsheet .border-light { + border: 1px solid var(--color-white3); + border-radius: 0; + margin: 2px 0 2px 0; +} + +.charsheet .background .wrapper .no-border { + border: none; +} + +.charsheet .background .wrapper .nowrap, +.charsheet .background .wrapper span.nowrap { + white-space: nowrap; +} + +/* Emphasize Input */ +.charsheet .wrapper .field-border, +.charsheet .wrapper .readonly-span.field-border { + border: 1px solid var(--color-lightgrey2); + border-radius: 3px; + font-size: var(--text-xxl); + margin: auto; + max-height: 3rem; + max-width: 3em; + min-width: 2.5em; +} + +.charsheet .wrapper span.readonly-span.field-border { + padding: 9px 0 0 0; +} + +.charsheet .hidden { + display: none; +} + +/* Equipment Tabs */ +.charsheet .repcontainer[data-groupname='repeating_equipment'] .repitem { + display: flex; + flex-direction: column; + height: 0; + margin: 0; + overflow: hidden; +} + +.charsheet .repitem:has(input.toggle-carry[value='1'] ~ input.toggle-type[value='1'] + .equipment-display-carry .equipment-display-type) { + height: auto; + margin: auto; +} + +.charsheet input.toggle-show[value='1'] ~ .spell-display.top-row { + padding-left: 1em; +} + +.charsheet input.toggle-show[value='1'] ~ .spell-display.top-row label { + flex: 1 1 auto; + width: auto; +} + +.charsheet input.toggle-show[value='1'] ~ .spell-display.top-row label:nth-child(3) { + max-width: fit-content; +} + +/* Spells Tabs */ +.charsheet .wrapper .repcontainer[data-groupname='repeating_spells'] .repitem { + display: block; + height: 0; + margin: 0; + overflow: hidden; +} + +.charsheet .repcontainer[data-groupname='repeating_spells'] .repitem:has(input.toggle-show[value='1'] ~ .spell-display) { + height: auto; + margin: auto; +} + +/* emphasize memorized */ +.charsheet .toggle-show[value='1'] ~ .not-memorized ~ .spell-display { + opacity: 1; +} + +.charsheet .toggle-show[value='1'] ~ .not-memorized[value='0'] ~ .spell-display { + opacity: 0.5; +} + +/* toggle memorized only */ +.charsheet .toggle-show[value='1'] ~ .toggle-memorized:checked + .toggle-all:not(:checked) ~ .spell-display { + display: flex; +} + +.charsheet .toggle-show[value='1'] ~ .toggle-memorized:not(:checked) ~ .spell-display { + display: none; +} + +.charsheet .toggle-show[value='1'] ~ .toggle-memorized:not(:checked) + .toggle-all:checked ~ .spell-display { + display: flex; +} + +/* ensure un-memorized spells top-row and details get 100% opacity with hover/focus */ +.charsheet .repcontainer[data-groupname='repeating_spells'] .repitem:focus-within .toggle-show[value='1'] ~ .not-memorized[value='0'] ~ .spell-display, +.charsheet .repcontainer[data-groupname='repeating_spells'] .repitem:hover .toggle-show[value='1'] ~ .not-memorized[value='0'] ~ .spell-display { + opacity: 1; +} + +.charsheet .equipment-tabs, +.charsheet .spell-caster-tabs, +.charsheet .spell-tabs, +.charsheet .npc-tabs { + align-items: center; + display: flex; + height: 1.85em; + justify-content: start; + padding: 1.2em 0 0 0; +} + +.charsheet .spell-tabs { + margin: 0 0 10px 0; +} + +.charsheet details[open].spell-display summary, +.charsheet details[open].spell-display:hover summary, +.charsheet details[open].notes-box summary, +.charsheet details[open].notes-box:hover summary { + border: none; + padding: 0; +} + +.charsheet span.tab { + background-color: rgba(148, 148, 148, 0.5); + border: 1px solid var(--color-lightgrey2); + border-bottom: 0; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + color: var(--color-white1); + display: inline-block; + max-height: 1.5em; + min-width: fit-content; + overflow: hidden; + padding-inline: 4px; + text-align: center; + white-space: nowrap; + width: 9%; +} + +.charsheet .spell-caster-tabs { + margin: auto; + padding: 6px 0 0 0; + width: 100%; +} + +.charsheet .spell-caster-tabs span.tab { + width: 4.5em; +} + +.charsheet .npc-tabs span.tab { + width: 50%; +} + +.charsheet input[type='radio'].tab-hidden + span.tab::before { + display: none; +} + +.charsheet input[type='radio'].tab-hidden:not(:checked) + span.tab { + background-color: var(--color-black1); + color: var(--color-white1); +} + +.charsheet input[type='radio'].tab-hidden:not(:checked):hover + span.tab { + background-color: var(--color-lightgrey2); + height: 1.85em; + margin: 0; + max-height: 1.85em; + transform: translateY(-0.125em); + transition: all 100ms ease; +} + +.charsheet input[type='radio'].tab-hidden:checked + span.tab { + background-color: var(--color-white1); + box-shadow: 3px 2px 5px #000; + color: var(--color-darkgrey1); + font-weight: bold; + height: 1.85em; + margin: -5px 0 0 0; + max-height: 1.8em; + z-index: 0; +} + +.charsheet div.equipment-tabs > input.tab-hidden, +.charsheet div.spell-caster-tabs > input.tab-hidden, +.charsheet div.spell-tabs > input.tab-hidden, +.charsheet section.npc-tabs > input.tab-hidden { + height: 1.3em; + margin: 0 -10% 0 0; + opacity: 0; + position: relative; + width: 10%; + z-index: 1; +} + +.charsheet div.spell-caster-tabs > input.tab-hidden { + margin-right: -4.5em; + width: 4.5em; +} + +.charsheet section.npc-tabs > input.tab-hidden { + margin: 0 -50% 0 0; + width: 50%; +} + +.charsheet section.npc-tabs > input[value='99'].tab-hidden { + margin: 0 -25% 0 0; + width: 25%; +} + +.charsheet input[type='checkbox'] { + margin: 0 2px 0 2px; + width: 10px; +} + +.charsheet input[type='radio'].width-small { + margin-top: -1px; + width: auto; +} + +.charsheet .width-smallest, +.charsheet input[type='number'].width-smallest, +.charsheet input[type='text'].width-smallest { + min-width: 2em; + padding-inline: 0; + text-align: center; + width: 2em; +} + +.charsheet .width-smaller, +.charsheet input[type='number'].width-smaller, +.charsheet input[type='text'].width-smaller { + min-width: 2.5em; + padding-inline: 0; + text-align: center; + width: 2.5em; +} + +.charsheet .width-small, +.charsheet input[type='number'].width-small, +.charsheet input[type='text'].width-small { + padding-inline: 0; + text-align: center; + width: 3em; +} + +.charsheet .width-small-plus, +.charsheet input[type='number'].width-small-plus, +.charsheet input[type='text'].width-small-plus, +.charsheet select.width-small-plus { + min-width: 5em; + width: 5em; +} + +.charsheet .width-medium, +.charsheet input[type='number'].width-medium, +.charsheet input[type='text'].width-medium, +.charsheet select.width-medium { + min-width: 5em; + overflow: hidden; + text-overflow: ellipsis; + width: 50%; +} + +.charsheet .width-medium-plus, +.charsheet input[type='number'].width-medium-plus, +.charsheet input[type='text'].width-medium-plus, +.charsheet select.width-medium-plus { + min-width: 5em; + overflow: hidden; + text-overflow: ellipsis; + width: 80%; +} + +.charsheet .width-large, +.charsheet input[type='number'].width-large, +.charsheet input[type='text'].width-large, +.charsheet select.width-large { + margin: 0; + min-width: 8em; + overflow: hidden; + text-overflow: ellipsis; + width: 80%; +} + +.charsheet .width-fill, +.charsheet input[type='number'].width-fill, +.charsheet input[type='text'].width-fill, +.charsheet select.width-fill { + overflow: hidden; + text-overflow: ellipsis; + width: 100%; +} + +.charsheet .wrapper select.readonly, +.charsheet input[disabled], +.charsheet select[disabled], +.charsheet textarea[disabled], +.charsheet input[readonly] { + background-color: var(--color-white2); + border: 1px transparent; + border-bottom: 1px solid rgb(182, 182, 182); + border-bottom-color: transparent; + border-bottom-style: none; + border-bottom-width: 1px; + border-radius: 3px; + color: initial; + cursor: default; +} + + +.charsheet .wrapper input.readonly, +.charsheet .wrapper .readonly-span { + background-color: var(--color-white2); + border-radius: 3px; + color: var(--color-darkgrey1); + cursor: default; + display: inline-block; + font-size: var(--text-xl); + font-weight: normal; + margin: 2px; + min-width: 3.5rem; + padding: 3px; + pointer-events: none; + text-align: center; +} + +.sheet-darkmode .tab-content .charsheet .background .wrapper select.readonly, +.sheet-darkmode .tab-content .charsheet .background .wrapper input.readonly, +.sheet-darkmode .tab-content .charsheet .background .wrapper .readonly-span { + background-color: var(--color-darkgrey1); + color: var(--color-white3); +} + +.charsheet input.readonly { + font-size: inherit; + padding: inherit; +} + +.charsheet .readonly-span-textonly { + cursor: default; + text-align: center; + width: auto; +} + +.charsheet input[type='checkbox'].current-encumbrance { + height: 1.25em; + margin-top: 2.25em; + position: absolute; + width: 4.5em; +} + +.charsheet input[type='checkbox'].current-encumbrance:hover { + cursor: pointer; +} + +.charsheet .background .wrapper .current-encumbrance:checked ~ span:last-child, +.charsheet .background .wrapper input[type='checkbox'].current-encumbrance:hover ~ span:last-child { + background-color: var(--link-hover); + box-shadow: 1px 1px 3px var(--color-black1); + color: var(--color-white1); + cursor: pointer !important; + font-size: var(--text-med); + font-weight: normal; + padding-inline: 4px 4px; +} + +.sheet-darkmode .background .wrapper .current-encumbrance:checked ~ span:last-child, +.sheet-darkmode .background .wrapper input[type='checkbox'].current-encumbrance:hover ~ span:last-child, +.sheet-darkmode input[type='radio'].tab-hidden:checked + span.tab { + background-color: var(--dark-accent); + color: var(--color-white2); + font-weight: normal; +} + +.charsheet .current-encumbrance:checked ~ span:last-child::before { + content: '▶'; + font-size: var(--text-med); + margin: 0 0.5em 0 0; +} + +.charsheet .current-encumbrance:checked ~ span:last-child::after { + content: '◀'; + font-size: var(--text-med); + margin: 0 0 0 0.5em; +} + +.charsheet .announcements-box ul { + overflow-y: auto; + max-height: 300px; +} + +.charsheet li { + position: relative; + list-style: disc !important; + margin-left: 2em; +} + +.charsheet select { + align-self: center; + border-color: rgba(204, 204, 204, 0.44); + cursor: pointer; + margin: auto 1px auto 1px; + max-height: 1.75em; + min-width: 3.75em; + padding: 1px 0 0 2px; + text-align: center; + width: auto; +} + +.charsheet select option:nth-child(even) { + background-color: var(--color-white2); +} + +.charsheet select option:nth-child(odd) { + background-color: transparent; +} + +.charsheet .wrapper button[type='roll'].url-roll, +.charsheet .wrapper button[type='roll'].url-roll > span, +.charsheet .wrapper button[type='roll'].url-roll:visited { + background-color: transparent; + background-image: none; + border: none; + box-shadow: none; + color: var(--link-hover); + font-size: var(--text-med); + max-height: 2em; + max-width: none; + padding-block: 0; + text-decoration: underline; +} + +.charsheet .wrapper .footer-box button[type='roll'].url-roll { + font-size: var(--text-sm); +} + +.charsheet .inline-label:has(.url-roll) { + display: inline-flex; + position: relative; +} + +.charsheet .wrapper .announcements button[type='roll'].url-roll > span { + color: var(--link-hover); + font-size: var(--text-med); +} + +.charsheet button[type='roll'].url-roll::before { + content: ''; +} + +.charsheet .wrapper button[type='roll'].dice-button, +.charsheet .wrapper .repitem button[type='roll'].dice-button { + align-self: baseline; + border-radius: 4px; + height: 18px; + margin: auto; + min-width: 18px; + width: 18px; +} + +.charsheet .wrapper .abilities-columns .inline-label:has(.dice-button) { + container-type: inline-size; + width: 100%; +} + +@container (max-width: 6.5em) { + .charsheet .wrapper .abilities-columns .inline-label .dice-button { + margin-right: 0; + } + + .charsheet .wrapper .abilities-columns .inline-label .dice-button > span { + margin: 0 -2px 0 1px; + white-space: normal; + width: min-content; + } +} + +.charsheet .wrapper button[type='roll'].dice-button span { + white-space: nowrap; +} + +.charsheet .background .wrapper .repitem button[type='roll'].dice-button { + max-height: 20px; + max-width: 0; + min-width: 20px; + padding: 2px 0 0 1px; +} + +.charsheet .wrapper button[type='roll'] span.dice-button { + display: flex; + flex-direction: row; +} + +.charsheet .background .wrapper details button span::before { + margin-right: 2px; +} + +.charsheet .wrapper button[type='roll'].dice-button::before, +.charsheet .wrapper button[type='roll'] span.dice-button::before { + align-self: center; + content: '0'; + font-family: 'dicefontd20'; + font-size: 14px; + opacity: 0.9; +} + +.charsheet .wrapper button[type='roll'] span::before { + margin-right: 5px; +} + +.charsheet .wrapper button span { + align-items: center; + color: initial; + display: flex; + flex-direction: column; + font-family: var(--font-buttons1); + font-size: var(--text-sm); + font-weight: var(--text-wt600); + height: fit-content; + justify-content: center; + line-height: 1.1em; + margin: auto; + min-height: 1.85em; + white-space: normal; +} + +.charsheet .wrapper button[type='roll']::before, +.charsheet .wrapper button[type='roll']::after { + color: initial; + font-size: var(--text-lg); + font-weight: var(--text-wt600); +} + +.charsheet .wrapper button[type='roll'], +.charsheet .wrapper button[type='action'] { + align-items: center; + background: linear-gradient(180deg, rgb(255 255 255) 0%, rgb(176 176 176) 50%, rgb(163 163 163) 100%); + border-radius: 4px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 1px 1px 1px rgba(0, 0, 0, 1.5); + color: var(--color-black2); + cursor: pointer; + display: flex; + justify-content: center; + max-width: 7em; + min-width: 3.25em; + opacity: 1; + width: auto; +} + +/* text-only buttons */ +.charsheet .wrapper .npc-box button.text-only, +.charsheet .background .wrapper button.text-only { + align-items: stretch; + background-image: none; + border: none; + box-shadow: none; + justify-self: right; + margin-right: 2px; + max-width: none; + min-height: 1.5em; + min-width: auto; + width: auto; +} + +.charsheet .wrapper .npc-box button.text-only span, +.charsheet .background .wrapper button.text-only span { + font-family: var(--font-base); + font-size: var(--text-med); + margin-left: 2px; +} + +.charsheet .background .wrapper .npc-box button.text-only:hover, +.charsheet .background .wrapper button.text-only:hover { + background-image: none; + border: none; + box-shadow: none; +} + +.charsheet .wrapper button[type='roll']:hover, +.charsheet .wrapper button[type='action']:hover { + background: linear-gradient(180deg, rgb(216 216 216) 0%, rgb(255 252 252) 50%, rgb(206 206 206) 100%); +} + +.charsheet .wrapper button[type='roll']::before, +.charsheet .wrapper button[type='action']::before { + content: none; +} + +.charsheet .wrapper button[type='roll'].ability-button { + margin: 0; + min-width: 2.25em; + padding: 0; +} + +.charsheet .background .wrapper button[type='roll'].ability-button span { + font-family: var(--font-buttons2); + font-size: var(--text-xl); + margin-inline: auto; +} + +.charsheet .toggle-comeliness button[type='roll'].ability-button:hover, +.charsheet .toggle-comeliness button[type='roll'].ability-button:focus { + box-shadow: none; + color: initial; + pointer-events: none; + user-select: none; +} + +.charsheet .saves-columns button[type='roll'].saves-button, +.charsheet .thief-columns button[type='roll'].thiefskills-button { + justify-self: center; + margin-block: 1px; + min-width: 7.5em; +} + +.charsheet .background .wrapper .saves-columns button.text-only span, +.charsheet .background .wrapper .thief-columns button.text-only span { + margin-inline: auto; +} + +.sheet-darkmode .charsheet .background .wrapper button[type='roll']::after, +.sheet-darkmode .charsheet .background .wrapper button[type='action']::after, +.sheet-darkmode .charsheet .background .wrapper button[type='roll']::before, +.sheet-darkmode .charsheet .background .wrapper button[type='action']::before, +.sheet-darkmode .charsheet .background .wrapper button[type='roll'] span, +.sheet-darkmode .charsheet .background .wrapper button[type='action'] span, +.sheet-darkmode .saves-columns button[type='roll'].saves-button, +.sheet-darkmode .thief-columns button[type='roll'].thiefskills-button, +.sheet-darkmode .saves-columns button[type='roll'].saves-button span, +.sheet-darkmode .thief-columns button[type='roll'].thiefskills-button span { + color: var(--color-white3); + font-weight: normal; + overflow: hidden; + text-shadow: 1px 1px #000; +} + +.sheet-darkmode .background .wrapper button[type='roll'].url-roll { + background-color: transparent; + background-image: none; + color: var(--dark-accent); + text-shadow: none; +} + +.sheet-darkmode .background .wrapper button.url-roll:hover { + background-color: initial; + color: var(--link-hover); + outline: none; + text-shadow: none; +} + +/* Dark Buttons */ +.sheet-darkmode .background .wrapper button[type='roll'], +.sheet-darkmode .background .wrapper button[type='action'], +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks a[href^='!'], +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general a[href^='!'], +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks a[href^='~'], +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general a[href^='~'] { + background: rgb(40, 40, 40); + background: linear-gradient(180deg, + rgba(40, 40, 40, 1) 9%, + rgba(74, 74, 74, 1) 32%, + rgba(37, 37, 37, 1) 54%, + rgba(0, 0, 0, 0.9532313413646709) 83%, + rgba(74, 74, 74, 1) 100%); + border-radius: 4px; + border-top-width: 0; + color: var(--color-white3); +} + +.sheet-darkmode .charsheet .background .wrapper button[type='roll']:hover, +.sheet-darkmode .charsheet .background .wrapper button[type='action']:hover, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks a[href^='!']:hover, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general a[href^='!']:hover, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks a[href^='~']:hover, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general a[href^='~']:hover { + background: linear-gradient(180deg, + rgba(79, 79, 79, 1) 0%, + rgba(0, 0, 0, 1) 21%, + rgb(112 44 145) 170%, + rgba(79, 79, 79, 1) 100%); + box-shadow: 0 0 1px 1px var(--color-white2); +} + +.sheet-darkmode .charsheet .background .wrapper button[type='roll'].dice-button:hover::before, +.sheet-darkmode .charsheet .background .wrapper button[type='roll']:hover::after, +.sheet-darkmode .charsheet .background .wrapper button[type='roll']:hover span, +.sheet-darkmode .charsheet .background .wrapper button[type='action']:hover span, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks a[href^='!']:hover, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general a[href^='!']:hover, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks a[href^='~']:hover, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general a[href^='~']:hover { + color: var(--color-white2); + font-weight: normal; +} + +.charsheet .statblock2 .five-columns button { + height: 100%; + min-width: min-content; + width: 90%; +} + +.charsheet .saves-columns button[type='roll'].saves-button span, +.charsheet .thief-columns button[type='roll'].thiefskills-button span { + font-size: var(--text-med); + padding-block: 2px; +} + +.charsheet .settings button[type='roll'], +.charsheet .settings button[type='action'] { + border-color: rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.5); +} + +.charsheet .stack-text { + line-height: 1em; + max-width: 9em; + min-width: 4.5em; + text-align: center; + white-space: break-spaces; +} + +.charsheet .stack-text-wide { + line-height: 1em; + max-width: 12em; + min-width: 6em; + text-align: center; + white-space: break-spaces; +} + +.charsheet .thief-columns .label-percent:has(.field-border)::after { + left: 2px; +} + +.charsheet .thief-columns .label-percent .field-border { + margin-inline: 0; +} + +.charsheet .saves-columns details summary, +.charsheet .thief-columns details summary { + display: flex; + height: auto; +} + +.charsheet .saves-columns details[open] summary + input, +.charsheet .thief-columns details[open] summary + input { + background-color: var(--color-white3); + border: 1px solid; + color: initial; + margin: 0 0 0 0; + max-width: none; + min-height: 2em; + padding: 2px; + position: absolute; + width: 10.4em; + z-index: 3; +} + +/*custom button roll*/ +.charsheet .weapons-row2 button[type='roll'].stack-text { + margin: auto; + width: 6em; +} + +/*chat buttons*/ +.sheet-rolltemplate-attacks a[href^='!'], +.sheet-rolltemplate-general a[href^='!'], +.sheet-rolltemplate-attacks a[href^='~'], +.sheet-rolltemplate-general a[href^='~'] { + background: linear-gradient(180deg, rgb(255 255 255) 0%, rgb(176 176 176) 50%, rgb(163 163 163) 100%); + border: 1px solid var(--color-lightgrey2); + border-radius: 4px; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 1px 1px 1px rgba(0, 0, 0, 1.5); + color: initial; + cursor: pointer; + display: inline-block; + font-family: var(--font-buttons1); + font-size: var(--text-med); + font-weight: normal; + margin: 2px; + padding: 0 2px 0 2px; + text-shadow: none; + vertical-align: middle; + width: auto; +} + +/* adding backtick removes sheet formatting & roll20 pink for chatmenu buttons */ +.sheet-rolltemplate-attacks a[href^='`!'], +.sheet-rolltemplate-general a[href^='`!'], +.sheet-rolltemplate-attacks a[href^='`~'], +.sheet-rolltemplate-general a[href^='`~'] { + color: inherit; + display: inline-block; + font-weight: normal; + margin-block: 1px; + text-decoration: underline 1px solid #999; + white-space: normal; +} + +/*urls*/ +.sheet-rolltemplate-attacks a[href^='http'], +.sheet-rolltemplate-general a[href^='http'] { + color: var(--link-hover); + cursor: pointer; + display: inline-block; + font-weight: bold; + margin: 2px 0 2px; + padding: 0 2px 0 2px; +} + +/*images*/ +.sheet-rolltemplate-attacks a img, +.sheet-rolltemplate-general a img { + aspect-ratio: auto; + display: flex; + flex-direction: row; + justify-self: center; + margin: auto; + max-height: 50vw; + max-width: fit-content; + object-fit: contain; + object-position: center; + outline: 2px solid #000; + overflow: clip; + width: calc(100% - 5px); +} + +.sheet-rolltemplate-attacks .sheet-subheader a img, +.sheet-rolltemplate-general .sheet-subheader a img { + max-height: 100px; +} + +.charsheet button[type='action']:hover, +.charsheet button[type='roll']:hover, +.charsheet button[type='action']:focus, +.charsheet button[type='roll']:focus, +.sheet-rolltemplate-attacks a[href^='!']:hover, +.sheet-rolltemplate-general a[href^='!']:hover, +.sheet-rolltemplate-attacks a[href^='~']:hover, +.sheet-rolltemplate-general a[href^='~']:hover { + background-position: inherit; + border-radius: 4px; + box-shadow: 1px 1px 3px var(--color-darkgrey1); + color: var(--link-hover); +} + +.sheet-rolltemplate-attacks a[href^='`!']:hover, +.sheet-rolltemplate-general a[href^='`!']:hover, +.sheet-rolltemplate-attacks a[href^='`~']:hover, +.sheet-rolltemplate-general a[href^='`~']:hover { + background-position: inherit; + color: var(--link-hover); + text-decoration-color: var(--link-hover); +} + +.charsheet .background .wrapper button[type='action']:hover span, +.charsheet .background .wrapper button[type='roll']:hover span, +.charsheet .background .wrapper button[type='roll'].dice-button:hover::before, +.charsheet .background .wrapper button[type='roll'].dice-button:focus::before { + background-position: inherit; + color: var(--link-hover); + font-weight: var(--text-wt600); + overflow: visible; +} + +.charsheet .header, +.charsheet .subheader { + display: inline-block; + font-family: var(--font-headers); + font-size: var(--text-lg); + font-weight: var(--text-wt600); + letter-spacing: 0.05rem; + opacity: 1; +} + +.charsheet .wrapper .sect-show + .header, +.charsheet .wrapper .sect-show + .subheader { + opacity: 0.85; +} + +.charsheet h4, +.charsheet h5 { + color: inherit; + font-size: var(--text-med); + font-weight: var(--text-wt600); +} + +.charsheet h4 { + margin: 0.25em 0.5em 0.25em 0.5em; + text-align: right; +} + +.charsheet hr { + border-top: 1px solid var(--color-white3); + margin: 5px; +} + +.charsheet .background .wrapper .text-small, +.charsheet .background .wrapper .text-small span, +.charsheet .background .wrapper label.text-small, +.charsheet .background .wrapper label.text-small span { + font-size: var(--text-sm); +} + +.charsheet .wrapper label .text-medium, +.charsheet .wrapper label.text-medium { + font-size: var(--text-med); +} + +.charsheet .wrapper label .text-large, +.charsheet .wrapper label.text-large { + font-size: var(--text-lg); +} + +.charsheet .wrapper label .text-larger, +.charsheet .wrapper label.text-larger { + font-size: var(--text-xl); + width: inherit; +} + +.charsheet .wrapper textarea, +.charsheet .wrapper input[type='text'].textarea { + background-color: transparent; + border: 1px solid var(--color-white3); + font-family: var(--font-inputs); + height: 2em; + line-height: normal; + margin: auto; + min-height: 2em; + overflow: hidden; + padding: 2px; + resize: none; +} + +.charsheet .wrapper textarea:focus, +.charsheet .wrapper textarea:focus-within, +.charsheet .wrapper textarea:hover, +.charsheet .wrapper input[type='text'].textarea:focus, +.charsheet .wrapper input[type='text'].textarea:focus-within, +.charsheet .wrapper input[type='text'].textarea:hover { + overflow: auto; + resize: vertical; + scrollbar-width: none; +} + +.charsheet .background .wrapper button:focus, +.charsheet .background .wrapper select:focus, +.charsheet .background .wrapper textarea:focus, +.charsheet .background .wrapper input[type='number']:focus, +.charsheet .background .wrapper input[type='text']:focus, +.charsheet .background .wrapper button[type='roll']:focus-within, +.charsheet .background .wrapper select:focus-within, +.charsheet .background .wrapper textarea:focus-within, +.charsheet .background .wrapper input[type='number']:focus-within, +.charsheet .background .wrapper input[type='text']:focus-within { + background-color: revert; + color: var(--color-black1); + outline: outset 2px var(--link-hover); +} + +.charsheet input[type='checkbox']:focus, +.charsheet input[type='checkbox']:focus-within { + outline: none; +} + +.charsheet input[type='checkbox']:focus::before, +.charsheet input[type='checkbox']:focus-within::before { + content: ''; + display: flex; + height: 1em; + margin: auto; + max-width: 1em; + min-width: fit-content; + outline: 1px solid var(--link-hover); + outline-offset: 2px; +} + +.charsheet input[type='radio']:focus, +.charsheet input[type='radio']:focus-within, +.charsheet input.sect-show:focus-within { + outline: none; +} + +.charsheet input.height-short, +.charsheet textarea.height-short { + height: 1.85em; + max-height: 15em; + min-height: 1.85em; +} + +.charsheet input.height-medium, +.charsheet textarea.height-medium { + height: 3em; + max-height: 15em; + min-height: 3em; +} + +.charsheet input.height-tall, +.charsheet textarea.height-tall { + height: 5em; + max-height: 15em; + min-height: 5em; +} + +.charsheet input.height-half, +.charsheet textarea.height-half { + height: 50%; + margin-top: 2px; + max-height: 15em; + min-height: 3em; +} + +.charsheet input.height-fill, +.charsheet textarea.height-fill { + height: 100%; +} + +/*hide and seek magic*/ +.charsheet .sect-show { + -webkit-appearance: none; + appearance: none; +} + +.charsheet input[type='checkbox'].sect-show { + border: none; + cursor: pointer; + height: 1.5em; + max-width: 14em; + opacity: 0 !important; + position: absolute; + width: 100%; + z-index: 1; +} + +.charsheet input[type='checkbox'].sect-show.more { + height: 0.85em; + min-width: 97%; +} + +.charsheet .wrapper label:has(input[type='checkbox']):hover span, +.charsheet .wrapper input[type='checkbox'].sect-show:hover, +.charsheet .wrapper input[type='checkbox'].sect-show:hover + div, +.charsheet .wrapper input[type='checkbox'].sect-show:hover + div span, +.charsheet .wrapper input[type='checkbox'].sect-show:hover + span + span, +.charsheet .wrapper input[type='checkbox'].sect-show:hover + span, +.charsheet .wrapper input[type='checkbox'].sect-show:hover + b, +.charsheet .background .wrapper details:hover summary :first-child, +.charsheet .wrapper details[open] summary :first-child { + background-color: transparent; + color: var(--link-hover); + opacity: 1; +} + +.sheet-darkmode .background .wrapper label:has(input[type='checkbox']):hover span, +.sheet-darkmode .background .wrapper input[type='checkbox'].sect-show:hover, +.sheet-darkmode .background .wrapper input[type='checkbox'].sect-show:hover + div, +.sheet-darkmode .background .wrapper input[type='checkbox'].sect-show:hover + div span, +.sheet-darkmode .background .wrapper input[type='checkbox'].sect-show:hover + span, +.sheet-darkmode .background .wrapper input[type='checkbox'].sect-show:hover + span + span, +.sheet-darkmode .background .wrapper input[type='checkbox'].sect-show:hover + b, +.sheet-darkmode .background .wrapper details:hover summary :first-child, +.sheet-darkmode .background .wrapper details[open] summary :first-child, +.sheet-darkmode .background .wrapper input[type='checkbox'].sect-show:hover + span.material-icons::before, +.sheet-darkmode .background .wrapper input[type='checkbox'].sect-show:hover + span + span.material-icons::before, +.sheet-darkmode .background .wrapper input[type='checkbox'].sect-show:hover + div + span.material-icons::before, +.sheet-darkmode .background .wrapper input:hover + span.material-icons.custom-btn-nav::before, +.sheet-darkmode .background .wrapper .top-row:hover ~ details summary > span.material-icons.gear-nav::before, +.sheet-darkmode .background .wrapper .top-row ~ details[open] summary > span.material-icons.gear-nav::before, +.sheet-darkmode .background .wrapper details summary:hover > span.material-icons.custom-btn-nav::before { + color: var(--dark-accent); +} + +.charsheet input[type='checkbox'].sect-show:checked + span, +.charsheet input[type='checkbox'].sect-show:checked + div { + opacity: 1; +} + +.charsheet input[type='checkbox'].sect-show:hover::before { + color: var(--link-hover); + opacity: 1; +} + +/*used with hidden checkbox to hide elements*/ +.charsheet .sect-show:not(:checked) ~ .sect { + display: none; +} + +.charsheet input[type='checkbox'].sect-show + span + span.material-icons::before, +.charsheet input[type='checkbox'].sect-show + div + span.material-icons::before { + content: 'arrow_right'; + display: inline-flex; + font-size: inherit; + margin: -1.75rem 0 0 0; + opacity: 0.75; + position: absolute; +} + +.charsheet .announcements-box input[type='checkbox'].sect-show ~ .material-icons::before { + content: 'menu'; + font-size: 1.75rem; + margin: auto; + margin-top: 3px; + opacity: .5; +} + +.charsheet .announcements-box input[type='checkbox'].sect-show:checked ~ .material-icons::before { + content: 'menu_open'; +} + +.charsheet .announcements input[type='checkbox'].sect-show { + height: 24px; + position: absolute; + right: 0; + top: 0; + width: 24px; + z-index: 1; +} + +.charsheet .announcements input[type='checkbox'].sect-show:checked ~ .material-icons { + height: 20px; + position: absolute; + right: 0; + top: 0; + width: 20px; + z-index: 0; +} + +.charsheet .announcements input[type='checkbox'].sect-show:checked ~ .material-icons::before { + content: 'close'; + font-size: 15px; + font-weight: bold; + transition: none; +} + +.charsheet button .undo::before { + content: '1'; + font-family: 'Pictos'; + font-size: 1.5rem; + font-weight: normal; +} + +.charsheet .announcements input[type='checkbox'].sect-show:checked:hover ~ .material-icons::before { + transform: none; +} + +.charsheet .armor-box input[type='checkbox'].sect-show + span + span.material-icons::before, +.charsheet .personal-attributes-box input[type='checkbox'].sect-show + span + span.material-icons::before, +.charsheet .class-details input[type='checkbox'].sect-show + span + span.material-icons::before, +.charsheet .armor-details input[type='checkbox'].sect-show + span + span.material-icons::before, +.charsheet .saves-columns input[type='checkbox'].sect-show + span + span.material-icons::before, +.charsheet .thief-skills-box input[type='checkbox'].sect-show + span + span.material-icons::before, +.charsheet .spells-box input[type='checkbox'].sect-show + span + span.material-icons::before { + margin: -1.62rem 0 0 0; +} + +.charsheet input[type='checkbox'].sect-show:hover + span + span.material-icons::before, +.charsheet input[type='checkbox'].sect-show:hover + div + span.material-icons::before { + color: var(--link-hover); + opacity: 1; +} + +/*trick to limit active hotspot to just the clickable text*/ +.charsheet input[type='checkbox'].sect-show + span + span.material-icons::after, +.charsheet input[type='checkbox'].sect-show + div + span.material-icons::after { + content: ''; + height: 1em; + margin: -1.75rem 0 0 2.5rem; + position: absolute; + width: 7em; + z-index: 2; +} + +.charsheet .armor-box input[type='checkbox'].sect-show + span + span.material-icons::after { + display: none; +} + +/* special attention needed here */ +.charsheet .class-box input[type='checkbox'].sect-show + div + span.material-icons::after, +.charsheet .armor-box input[type='checkbox'].sect-show + div + span.material-icons::after, +.charsheet .class-details input[type='checkbox'].sect-show + span + span.material-icons::after, +.charsheet .armor-details input[type='checkbox'].sect-show + span + span.material-icons::after, +.charsheet .announcements-box input[type='checkbox'].sect-show + span + span.material-icons::after { + content: none; +} + +.charsheet .class-details input[type='checkbox'].sect-show, +.charsheet .armor-details input[type='checkbox'].sect-show { + max-width: 9em; + width: 100%; + z-index: 3; +} + +.charsheet input[type='checkbox'].sect-show:checked + span + span.material-icons::before, +.charsheet input[type='checkbox'].sect-show:checked + div + span.material-icons::before { + content: 'arrow_drop_down'; +} + +/*to-hit AC*/ +.charsheet span.to-hit span:nth-child(odd) { + background-color: var(--color-lightgrey2); + color: var(--color-white1); + height: 1.5em; +} + +.charsheet span.to-hit span:nth-child(even) { + background-color: var(--color-white1); + border: 1px solid #000; + color: initial; + height: 1.5em; +} + +.charsheet .to-hit-input input { + height: 2em; + margin: 0; + outline: 1px solid var(--color-lightgrey2); +} + +.charsheet .wrapper .version { + background-color: transparent; + border: none; + font-weight: bold; + height: 1.25em; + margin-left: 0; + margin-top: 0; + padding: 2px 0 0 0; + text-align: center; +} + +/*Roll Templates*/ +/* using darkmode variables from the vtt ::root*/ + +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks div, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks-table div, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general div { + background-color: var(--dark-background); + color: var(--color-white3); +} + +.sheet-rolltemplate-attacks div, +.sheet-rolltemplate-attacks-table div, +.sheet-rolltemplate-general div { + -moz-background-clip: padding; + -moz-box-shadow: 2px 2px 5px #000; + -webkit-background-clip: padding-box; + -webkit-box-shadow: 2px 2px 5px #000; + background-clip: padding-box; + background-color: var(--color-white1); + border: 5px solid #000; + border-collapse: separate; + border-radius: 4px; + border-spacing: 0; + box-shadow: 2px 2px 5px #000; + color: var(--color-black1); + display: grid; + grid-template-columns: 1fr auto; + outline: 2px solid var(--color-white1); + outline-offset: -5px; + overflow: hidden; + position: relative; + width: auto; + z-index: 1; +} + +.sheet-rolltemplate-attacks-table div { + border-top-color: transparent; + border-top-left-radius: 0; + border-top-right-radius: 0; + box-shadow: 2px 4px 5px #000; + margin: -3.75em 0 -1.5em 0; + padding-bottom: 0.25em; +} + +.sheet-rolltemplate-attacks .sheet-row, +.sheet-rolltemplate-attacks-table .sheet-row, +.sheet-rolltemplate-general .sheet-row { + background-image: none; + border: none; + border-radius: 0; + box-shadow: none; + display: inline-grid; + font-family: var(--font-monster); + grid-column: span 2; + grid-template-columns: 1fr minmax(2em, auto); + margin: 0; + outline: none; + outline-offset: 0; + padding: 0; + text-align: center; + width: auto; +} + +.sheet-rolltemplate-attacks .sheet-row:has(.sheet-big-text), +.sheet-rolltemplate-general .sheet-row:has(.sheet-big-text) { + line-height: 1.75em; +} + +.sheet-rolltemplate-attacks .sheet-row.sheet-all-props, +.sheet-rolltemplate-general .sheet-row.sheet-all-props { + align-items: start; + text-align: center; +} + +/* better all props handling */ + +/* left */ +.sheet-rolltemplate-attacks .sheet-row.sheet-all-props .sheet-tcat:not(:empty):has(+ span br), +.sheet-rolltemplate-general .sheet-row.sheet-all-props .sheet-tcat:not(:empty):has(+ span br) { + display: inline-block; + grid-column: 1/-1; + text-align: left; + white-space: normal; +} + +.sheet-rolltemplate-attacks .sheet-row.sheet-all-props span:first-child:not(.sheet-span-two), +.sheet-rolltemplate-general .sheet-row.sheet-all-props span:first-child:not(.sheet-span-two) { + display: inline-block; + text-align: left; +} + +.sheet-rolltemplate-attacks .sheet-row span:first-child:not(.sheet-span-two), +.sheet-rolltemplate-general .sheet-row span:first-child:not(.sheet-span-two) { + align-self: center; + flex-direction: column; + flex-wrap: wrap; + margin-inline: auto; + margin-left: 0; + white-space: nowrap; +} + +/* center */ +.sheet-rolltemplate-attacks .sheet-row.sheet-all-props span.sheet-tcat:has(+ span:empty), +.sheet-rolltemplate-general .sheet-row.sheet-all-props span.sheet-tcat:has(+ span:empty) { + display: inline-block; + align-items: center; + grid-column: 1/-1; + margin-inline: auto; + text-align: center; + white-space: normal; +} + +/* right */ +.sheet-rolltemplate-attacks .sheet-row.sheet-all-props span:empty + span, +.sheet-rolltemplate-general .sheet-row.sheet-all-props span:empty + span { + display: inline-block; + grid-column: 1/-1; + margin-inline: auto; + margin-right: 0; +} + +.sheet-rolltemplate-general .sheet-row:has(.sheet-span-two:empty):not(:last-child) { + display: none; +} + +.sheet-rolltemplate-attacks .sheet-row:last-child, +.sheet-rolltemplate-general .sheet-row:last-child { + border: none; +} + +.sheet-rolltemplate-general .sheet-row:nth-child(odd) { + background-color: var(--color-white3); +} + +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general .sheet-row:nth-child(odd) { + background-color: var(--color-black1); + color: var(--color-white3); + font-weight: normal; +} +/* {{freetext}} background-color override */ +.sheet-rolltemplate-general .sheet-row:nth-child(odd):has(.sheet-free-text), +.sheet-rolltemplate-general .sheet-row:nth-child(odd) .sheet-free-text, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general .sheet-row:nth-child(odd):has(.sheet-free-text), +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general .sheet-row:nth-child(odd) .sheet-free-text { + background-color: transparent; +} + +.sheet-rolltemplate-attacks .sheet-span-two, +.sheet-rolltemplate-attacks-table .sheet-span-two, +.sheet-rolltemplate-general div span.sheet-span-two { + display: block; + grid-column: span 2; + justify-content: center; + position: relative; + text-align: center; +} + +.sheet-rolltemplate-attacks .sheet-template-header, +.sheet-rolltemplate-attacks-table .sheet-template-header, +.sheet-rolltemplate-general .sheet-template-header { + background-color: var(--color-black2); + border-top: 3px solid transparent; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + color: var(--color-white1); + font-family: var(--font-headers); + font-size: var(--text-xxl); + padding: 2px; + text-align: center; + text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; +} + +.sheet-rolltemplate-attacks .sheet-subheader, +.sheet-rolltemplate-attacks-table .sheet-subheader, +.sheet-rolltemplate-general .sheet-subheader { + background-color: var(--color-black2); + color: var(--color-white1); + font-family: var(--font-headers); + font-size: var(--text-lg); + padding: 2px; + text-align: center; + text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; +} + +.sheet-rolltemplate-attacks .sheet-template-footer, +.sheet-rolltemplate-attacks-table .sheet-template-footer, +.sheet-rolltemplate-general .sheet-template-footer { + background-color: var(--color-black2); + border-bottom: 2px solid transparent; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + color: var(--color-white1); + margin-top: -2px; + min-height: 1em; + text-align: center; + text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; +} + +/* needed to prevent visible notch when {{bigname}} and {{name}} are used together */ +.sheet-rolltemplate-attacks .sheet-row:has(.sheet-bigger-text) + .sheet-row:has(.sheet-template-header) .sheet-template-header, +.sheet-rolltemplate-general .sheet-row:has(.sheet-bigger-text) + .sheet-row:has(.sheet-template-header) .sheet-template-header, +.sheet-rolltemplate-attacks .sheet-row:has(.sheet-bigger-text) + .sheet-row:has(.sheet-subheader) .sheet-subheader, +.sheet-rolltemplate-general .sheet-row:has(.sheet-bigger-text) + .sheet-row:has(.sheet-subheader) .sheet-subheader { + border-radius: 0; + margin-top: -2px; +} + +.sheet-rolltemplate-attacks .sheet-bigger-text, +.sheet-rolltemplate-general .sheet-row .sheet-bigger-text { + font-size: calc(var(--text-xxl) * 1.5); + line-height: normal; + min-height: 1em; + padding: 2px; + z-index: 1; +} + +.sheet-rolltemplate-attacks .sheet-big-text, +.sheet-rolltemplate-general .sheet-big-text { + /* font-family: var(--font-headers); */ + font-size: var(--text-xxl); +} + +.sheet-rolltemplate-attacks .sheet-smaller-text, +.sheet-rolltemplate-general .sheet-smaller-text { + font-size: var(--text-sm); + line-height: 1.85; + padding: 2px 0 2px 0; +} + +/* border below header/subheader */ +.sheet-rolltemplate-attacks .sheet-row:has(.sheet-template-header), +.sheet-rolltemplate-general .sheet-row:has(.sheet-template-header) { + border-bottom: 2px solid #000; +} + +.sheet-rolltemplate-attacks .sheet-tcat, +.sheet-rolltemplate-attacks-table .sheet-tcat { + align-items: end; + /* font-family: var(--font-headers); */ + font-size: var(--text-lg); + font-weight: bold; +} + +.sheet-rolltemplate-attacks span, +.sheet-rolltemplate-attacks-table span { + display: inline-flex; +} + +.sheet-rolltemplate-attacks span.sheet-text.sheet-text, +.sheet-rolltemplate-attacks-table span.sheet-text.sheet-text, +.sheet-rolltemplate-general span.sheet-text.sheet-text { + color: var(--color-black1); + display: block; + font-size: var(--text-med); + line-height: initial; + max-height: 10em; + overflow: auto; + padding: 0.25em 0.5em 0.25em 0.5em; + scrollbar-width: thin; + text-align: left; +} + +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks-table span.sheet-text, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks span.sheet-text, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general span.sheet-text { + background-color: var(--dark-background); + color: var(--color-white3); +} + +.sheet-rolltemplate-general .sheet-tcat + span, +.sheet-rolltemplate-attacks .sheet-tcat + span { + align-items: center; + flex-direction: row; + justify-content: end; + text-align: right; +} + +.sheet-rolltemplate-attacks .sheet-row .sheet-tcat, +.sheet-rolltemplate-attacks .sheet-row .sheet-tcat + span, +.sheet-rolltemplate-general .sheet-row .sheet-tcat, +.sheet-rolltemplate-general .sheet-row .sheet-tcat + span { + padding-inline: 4px; +} + +.sheet-rolltemplate-attacks .sheet-bold, +.sheet-rolltemplate-general .sheet-bold, +.sheet-rolltemplate-general .sheet-tcat, +.sheet-rolltemplate-general .sheet-tcat + span, +.sheet-rolltemplate-attacks .sheet-tcat + span { + font-weight: bold; +} + +.sheet-rolltemplate-general .sheet-left, +.sheet-rolltemplate-general span span.sheet-left { + justify-content: left; + text-align: left; +} + +.sheet-rolltemplate-general .sheet-right, +.sheet-rolltemplate-general span span.sheet-right { + justify-content: right; + margin-inline: auto; + margin-right: 0; + text-align: right; +} + +.sheet-rolltemplate-attacks .sheet-center, +.sheet-rolltemplate-attacks-table .sheet-center, +.sheet-rolltemplate-general .sheet-center { + align-self: center; + text-align: center; +} + +.sheet-rolltemplate-attacks div .sheet-ToHit, +.sheet-rolltemplate-attacks-table div .sheet-ToHit { + justify-self: center; + width: 22em; +} + +.sheet-rolltemplate-attacks span.sheet-ToHit, +.sheet-rolltemplate-attacks-table span.sheet-ToHit { + background-color: transparent; + display: block; + font-family: monospace; + font-size: 10px; + line-height: 8px !important; + margin: 0; + margin-left: -1em; + min-width: fit-content; + overflow: hidden; + padding: 3px 3px 3px 0; + text-align: right; + transform: scaleX(1.07); + white-space: nowrap; +} + +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks span.sheet-ToHit, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks-table span.sheet-ToHit { + background-color: var(--color-white3); + color: var(--surface-dark); +} + +.sheet-rolltemplate-attacks span.sheet-ToHit > span.inlinerollresult, +.sheet-rolltemplate-attacks-table span.sheet-ToHit > span.inlinerollresult { + margin: 0; + min-width: 2ch; +} + +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks span.sheet-ToHit > span.inlinerollresult, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks-table span.sheet-ToHit > span.inlinerollresult { + color: var(--surface-dark); +} + +.sheet-rolltemplate-attacks span.sheet-ToHit + span.sheet-ToHit { + background-color: var(--color-white1); +} + +.sheet-rolltemplate-attacks .sheet-ToHit strong, +.sheet-rolltemplate-attacks .sheet-ToHit span, +.sheet-rolltemplate-attacks-table .sheet-ToHit strong, +.sheet-rolltemplate-attacks-table .sheet-ToHit span { + min-width: 1.1em; +} + +.sheet-rolltemplate-attacks span.sheet-ToHit span.inlinerollresult.showtip, +.sheet-rolltemplate-attacks-table span.sheet-ToHit span.inlinerollresult.showtip { + background-color: #fef68e; + border: none; + font-family: monospace; + font-size: var(--text-sm); + justify-content: right; + padding: 2px 0 0 0; + text-align: right; +} + +.sheet-rolltemplate-attacks span.sheet-ToHit span.inlinerollresult[title$="20"], +.sheet-rolltemplate-attacks-table span.sheet-ToHit span.inlinerollresult[title$="20"], +.sheet-rolltemplate-attacks span.sheet-ToHit span.inlinerollresult[original-title$="20"], +.sheet-rolltemplate-attacks-table span.sheet-ToHit span.inlinerollresult[original-title$="20"] { + color: red; +} + +.sheet-rolltemplate-general .sheet-success, +.sheet-rolltemplate-general .sheet-failure { + font-family: var(--font-headers); + font-size: var(--text-xl); + text-align: center; +} + +.sheet-rolltemplate-general .sheet-success { + color: #3fb315; +} + +.sheet-rolltemplate-general .sheet-failure { + color: #85000a; +} + +.sheet-rolltemplate-general .sheet-row:has(.sheet-success) + .sheet-row:has(.inlinerollresult) .inlinerollresult:nth-child(2) { + border-color: #3fb315; +} + +.sheet-rolltemplate-general .sheet-failure + .sheet-row:has(.inlinerollresult) .inlinerollresult:nth-child(2) { + border-color: #85000a; +} + +.sheet-rolltemplate-general div .sheet-row:has(.sheet-tcat.sheet-success) { + background-color: initial; +} + +.sheet-rolltemplate-general span { + align-content: baseline; + align-items: end; + display: inline-flex; +} + +.sheet-rolltemplate-attacks .sheet-row span.inlinerollresult.inlinerollresult, +.sheet-rolltemplate-general .sheet-row span.inlinerollresult.inlinerollresult, +.sheet-rolltemplate-attacks .sheet-row.sheet-all-props span.inlinerollresult.inlinerollresult, +.sheet-rolltemplate-general .sheet-row.sheet-all-props span.inlinerollresult.inlinerollresult { + background-color: #fef68e; + color: #000; + display: inline-block; + font-family: var(--font-inputs); + line-height: 1em; + min-height: 1em; + min-width: 1.1em; + padding: 0 1px 0 1px; + text-align: center; + text-shadow: none; + white-space: nowrap; +} + +.sheet-rolltemplate-general .sheet-inlineroll-reset span.inlinerollresult.inlinerollresult { + display: contents; + font-size: inherit; +} + +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks .inlinerollresult, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks span.inlinerollresult.inlinerollresult, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general .inlinerollresult, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general span.inlinerollresult.inlinerollresult, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-general .sheet-row span.inlinerollresult.inlinerollresult { + background-color: var(--dark-gamecard); + color: var(--color-white3); + font-weight: normal; +} + +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks .sheet-ToHit .inlinerollresult, +.sheet-rolltemplate-darkmode.sheet-rolltemplate-attacks .sheet-ToHit span.inlinerollresult.inlinerollresult { + background-color: #fef68e; + border: none; + color: var(--color-black2); +} + +/* uses and qty */ +.sheet-rolltemplate-general div span.sheet-row.sheet-span-two span b + span.inlinerollresult { + font-size: revert; + min-height: auto; + min-width: auto; + padding: 0; +} + +.sheet-rolltemplate-attacks .inlinerollresult.fullcrit, +.sheet-rolltemplate-attacks span.inlinerollresult.fullcrit, +.sheet-rolltemplate-general .inlinerollresult.fullcrit, +.sheet-rolltemplate-general span.inlinerollresult.fullcrit { + border: 2px solid #3fb315; +} + +.sheet-rolltemplate-attacks .inlinerollresult.fullfail, +.sheet-rolltemplate-attacks span.inlinerollresult.fullfail, +.sheet-rolltemplate-general .inlinerollresult.fullfail, +.sheet-rolltemplate-general span.inlinerollresult.fullfail { + border: 2px solid #85000a; +} + +.sheet-rolltemplate-attacks .inlinerollresult.importantroll, +.sheet-rolltemplate-attacks span.inlinerollresult.importantroll, +.sheet-rolltemplate-general .inlinerollresult.importantroll, +.sheet-rolltemplate-general span.inlinerollresult.importantroll { + border: 2px solid #4a57ed; +} + +.sheet-rolltemplate-attacks, +.sheet-rolltemplate-attacks-table, +.sheet-rolltemplate-general { + margin: 0 0 0 -10px; + padding: 0 2px 0 2px; + width: calc(100% + 10px); +} + +.sheet-rolltemplate-attacks div.sheet-color-black .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-black .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-black .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-black .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-black .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-black .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-black .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-black .sheet-subheader { + background-color: var(--black); +} + +.sheet-rolltemplate-attacks div.sheet-color-white .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-white .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-white .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-white .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-white .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-white .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-white .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-white .sheet-subheader { + background-color: var(--white); + color: var(--color-black1); + text-shadow: none; +} + +.sheet-rolltemplate-attacks div.sheet-color-grey .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-grey .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-grey .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-grey .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-grey .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-grey .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-grey .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-grey .sheet-subheader { + background-color: var(--grey); +} + +.sheet-rolltemplate-attacks div.sheet-color-darkgrey .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-darkgrey .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-darkgrey .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-darkgrey .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-darkgrey .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-darkgrey .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-darkgrey .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-darkgrey .sheet-subheader { + background-color: var(--darkgrey); +} + +.sheet-rolltemplate-attacks div.sheet-color-red .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-red .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-red .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-red .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-red .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-red .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-red .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-red .sheet-subheader { + background-color: var(--red); +} + +.sheet-rolltemplate-attacks div.sheet-color-darkred .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-darkred .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-darkred .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-darkred .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-darkred .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-darkred .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-darkred .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-darkred .sheet-subheader { + background-color: var(--darkred); +} + +.sheet-rolltemplate-attacks div.sheet-color-orange .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-orange .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-orange .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-orange .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-orange .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-orange .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-orange .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-orange .sheet-subheader { + background-color: var(--orange); +} + +.sheet-rolltemplate-attacks div.sheet-color-darkorange .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-darkorange .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-darkorange .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-darkorange .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-darkorange .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-darkorange .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-darkorange .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-darkorange .sheet-subheader { + background-color: var(--darkorange); +} + +.sheet-rolltemplate-attacks div.sheet-color-yellow .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-yellow .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-yellow .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-yellow .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-yellow .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-yellow .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-yellow .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-yellow .sheet-subheader { + background-color: var(--yellow); + color: var(--color-black1); + text-shadow: none; +} + +.sheet-rolltemplate-attacks div.sheet-color-darkyellow .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-darkyellow .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-darkyellow .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-darkyellow .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-darkyellow .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-darkyellow .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-darkyellow .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-darkyellow .sheet-subheader { + background-color: var(--darkyellow); +} + +.sheet-rolltemplate-attacks div.sheet-color-green .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-green .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-green .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-green .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-green .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-green .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-green .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-green .sheet-subheader { + background-color: var(--green); +} + +.sheet-rolltemplate-attacks div.sheet-color-darkgreen .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-darkgreen .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-darkgreen .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-darkgreen .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-darkgreen .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-darkgreen .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-darkgreen .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-darkgreen .sheet-subheader { + background-color: var(--darkgreen); +} + +.sheet-rolltemplate-attacks div.sheet-color-blue .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-blue .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-blue .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-blue .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-blue .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-blue .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-blue .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-blue .sheet-subheader { + background-color: var(--blue); +} + +.sheet-rolltemplate-attacks div.sheet-color-darkblue .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-darkblue .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-darkblue .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-darkblue .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-darkblue .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-darkblue .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-darkblue .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-darkblue .sheet-subheader { + background-color: var(--darkblue); +} + +.sheet-rolltemplate-attacks div.sheet-color-pink .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-pink .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-pink .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-pink .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-pink .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-pink .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-pink .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-pink .sheet-subheader { + background-color: var(--pink); +} + +.sheet-rolltemplate-attacks div.sheet-color-darkpink .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-darkpink .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-darkpink .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-darkpink .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-darkpink .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-darkpink .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-darkpink .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-darkpink .sheet-subheader { + background-color: var(--darkpink); +} + +.sheet-rolltemplate-attacks div.sheet-color-purple .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-purple .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-purple .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-purple .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-purple .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-purple .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-purple .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-purple .sheet-subheader { + background-color: var(--purple); +} + +.sheet-rolltemplate-attacks div.sheet-color-darkpurple .sheet-template-header, +.sheet-rolltemplate-attacks div.sheet-color-darkpurple .sheet-template-footer, +.sheet-rolltemplate-attacks div.sheet-color-darkpurple .sheet-subheader, +.sheet-rolltemplate-attacks-table div.sheet-color-darkpurple .sheet-template-header, +.sheet-rolltemplate-attacks-table div.sheet-color-darkpurple .sheet-subheader, +.sheet-rolltemplate-general div.sheet-color-darkpurple .sheet-template-header, +.sheet-rolltemplate-general div.sheet-color-darkpurple .sheet-template-footer, +.sheet-rolltemplate-general div.sheet-color-darkpurple .sheet-subheader { + background-color: var(--darkpurple); +} + +.charsheet .repcontrol { + display: flex; + width: 100%; +} + +.charsheet .repcontrol .btn { + background: none; + border: medium none; + box-shadow: none; + font-size: 0; + padding: 2px 2px 0 2px; +} + +.charsheet .repcontrol .btn:focus { + outline: 0; +} + +.charsheet .repcontrol .repcontrol_edit:after, +.charsheet .repcontrol .repcontrol_add::before { + background-color: var(--color-white1); + border: 1px solid var(--color-lightgrey2); + border-radius: 2px; + color: var(--color-darkgrey1); + content: '('; + font-family: pictos; + font-size: var(--text-med); + padding: 2px 4px 2px 4px; + visibility: visible; +} + +.charsheet .repcontrol .repcontrol_edit:after { + content: '('; +} + +.charsheet .editmode ~ .repcontrol .repcontrol_edit:after { + content: ')'; +} + +.charsheet .repcontrol .repcontrol_add:before { + content: '&'; +} + +.charsheet .editmode ~ .repcontrol .repcontrol_edit:hover:after, +.charsheet .repcontrol .repcontrol_edit:hover:after, +.charsheet .repcontrol .repcontrol_add:hover:before { + color: var(--color-black2); +} + +.charsheet .itemcontrol .repcontrol_del, +.charsheet .itemcontrol .repcontrol_move { + float: right; + font-size: var(--text-med); + height: 2rem; + margin: 4px auto auto auto; + padding: 0; + width: 2rem; +} + +.charsheet .itemcontrol .repcontrol_move { + color: var(--link-hover); + outline: 1px solid var(--link-hover); + width: 4rem; +} + +/*edit mode*/ +.charsheet .editmode ~ .repcontrol .repcontrol_edit { + background-color: var(--color-white1); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + border: 1px solid var(--color-white3); + border-bottom-color: #bbb; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + margin-top: 2px; + padding-block: 1px; + width: 100%; +} + +.charsheet .repcontainer.ui-sortable.editmode { + outline: 1px solid red; + position: relative; +} + +.charsheet .repitem.ui-sortable-helper { + display: inline-block; + opacity: 1; + outline: 1px solid red; +} + +.charsheet .repcontainer.editmode .repitem .itemcontrol { + display: block; + z-index: 2; +} + +.charsheet .editmode .repitem:has(.itemcontrol a:focus), +.charsheet .editmode .repitem:has(.itemcontrol a:active) { + color: red; + display: block; + outline: 2px solid red; + position: relative; + right: 0; +} \ No newline at end of file diff --git a/ADnD_1E_Revised/src/bundle-process.js b/ADnD_1E_Revised/src/bundle-process.js index 40b1e33acf..532a97ee85 100644 --- a/ADnD_1E_Revised/src/bundle-process.js +++ b/ADnD_1E_Revised/src/bundle-process.js @@ -5,29 +5,53 @@ const chokidar = require('chokidar'); const argv = require('minimist')(process.argv.slice(2)); const htmlInput = 'index.html'; -const jsInput = 'index.js'; // Source JS file -const devJsOutput = 'dev/index.js'; // Destination for dev JS -const prodJsInput = 'prod/index.js'; // Input for prod build +const jsInput = 'index.js'; +const cssInput = '1ESheet.css'; const isProduction = argv.prod; const isDevelopment = argv.dev; -const bundledOutput = path.resolve(__dirname, '../1ESheet.html'); // final output file in the root folder -// --- Function to copy JS for development --- +// Output paths +const devDir = 'dev'; +const prodDir = 'prod'; +const devJsOutput = `${devDir}/index.js`; +const prodJsInput = `${prodDir}/index.js`; + +const devHtmlOutput = `${devDir}/1ESheet.html`; +const prodHtmlOutput = `${prodDir}/1ESheet.html`; + +const devCssOutput = `${devDir}/1ESheet.css`; +const prodCssOutput = `${prodDir}/1ESheet.css`; + +// Ensure directory exists +function ensureDir(folder) { + if (!fs.existsSync(folder)) { + fs.mkdirSync(folder); + } +} + +// ---- Copy JS for development ---- function copyDevJs() { try { - // Ensure the 'dev' directory exists - if (!fs.existsSync('dev')) { - fs.mkdirSync('dev'); - } + ensureDir(devDir); fs.copyFileSync(jsInput, devJsOutput); - console.log(`Copied ${jsInput} to ${devJsOutput}`); + console.log(`Copied ${jsInput} → ${devJsOutput}`); } catch (err) { console.error(`Error copying ${jsInput}:`, err); } } -// --- Main bundle function --- +// ---- Copy CSS ---- +function copyCss(outputPath) { + try { + fs.copyFileSync(cssInput, outputPath); + console.log(`Copied ${cssInput} → ${outputPath}`); + } catch (err) { + console.error(`Error copying CSS:`, err); + } +} + +// ---- Bundling function ---- async function bundle() { const jsPath = isProduction ? prodJsInput : devJsOutput; @@ -42,36 +66,52 @@ async function bundle() { minifyJS: true, removeComments: true, }); + injectedHTML = minifiedHTML.replace(/`); } else { injectedHTML = html.replace(/`); } - fs.writeFileSync(bundledOutput, injectedHTML, 'utf8'); - console.log(`✅ ${isProduction ? 'Production' : 'Development'} build complete!`); + // output to dev/ or prod/ + const outputPath = isProduction ? prodHtmlOutput : devHtmlOutput; + fs.writeFileSync(outputPath, injectedHTML, 'utf8'); + + console.log(`✅ ${isProduction ? 'Production' : 'Development'} build → ${outputPath}`); } catch (err) { console.error('❌ Error during build:', err); } } -// --- Script execution logic --- +// ---- DEV MODE ---- if (isDevelopment) { - // Initial dev build - copyDevJs(); - bundle(); + ensureDir(devDir); - // Watch for changes in source files - chokidar.watch([htmlInput, jsInput]).on('change', (changedPath) => { - console.log(`\nFile ${changedPath} has been changed`); - if (changedPath === jsInput) { - copyDevJs(); // Copy JS file first if it changed - } - bundle(); // Re-bundle - }); + // Initial actions + copyDevJs(); + copyCss(devCssOutput); + bundle(); console.log('👀 Watching for changes...'); + + chokidar.watch([htmlInput, jsInput, cssInput]).on('change', (changedPath) => { + console.log(`\nFile changed: ${changedPath}`); + + if (changedPath === jsInput) { + copyDevJs(); + } + + if (changedPath === cssInput) { + copyCss(devCssOutput); + } + + bundle(); + }); } +// ---- PROD MODE ---- if (isProduction) { + ensureDir(prodDir); + + copyCss(prodCssOutput); bundle(); } diff --git a/ADnD_1E_Revised/src/index.html b/ADnD_1E_Revised/src/index.html index 87094e50c1..2ab6f6252c 100644 --- a/ADnD_1E_Revised/src/index.html +++ b/ADnD_1E_Revised/src/index.html @@ -63,11 +63,14 @@ v - • 11/21/25' + • 11/23/25'