diff --git a/devils-dandy-dogs/README.md b/devils-dandy-dogs/README.md
new file mode 100644
index 00000000..e1206070
--- /dev/null
+++ b/devils-dandy-dogs/README.md
@@ -0,0 +1,38 @@
+# The Devil's Dandy Dogs — official Roll20 Beacon character sheet
+
+Official Beacon character sheet for **The Devil's Dandy Dogs**, published by
+**Monte Cook Games**. Built with Vue 3, Pinia, and the Beacon SDK.
+
+
+
+## Features
+
+- The ten Roles, each with its Drive, storytelling style and Temptation die
+- Traits with narrative and combat roll modes, rolled straight to chat
+- Tricks, and Pact of the Pack cards picked from the bundled deck and posted to chat
+- Shadow Rends and Memory Shards tracks, with the Shadow Riven state and
+ memories unlocked by spending shards
+- A Call & Response exchange tracker that freezes the rolled pool and its mode
+- A folding reference panel for the dice tables and roll outcomes
+- Themed chat roll cards rendered from `public/host.css`
+
+## Development
+
+```bash
+npm i
+npm run dev # dev server with an offline relay (browser, no Roll20)
+npm run build # compiles scss, bundles dist/
+```
+
+## Structure notes
+
+- `public/host.css` is compiled from `src/rollTemplates/host.scss` by
+ `npm run build-scss`, which `npm run build` runs first. The chat-card styles
+ live in `src/rollTemplates/common.scss`; edit the scss, not the compiled css.
+- `src/data/*.json` are generated data files — the Role list and the Pact cards.
+ They are bundled, not fetched.
+- Colours, spacing and type all resolve to `--ddd-*` custom properties defined
+ in `src/assets/main.css`; Tailwind aliases them via `@theme inline`, so no
+ component rule carries a raw literal.
+- The display face is Playfair Display (SIL Open Font License), inlined as a
+ data URI so it resolves regardless of the deployed base path.
diff --git a/devils-dandy-dogs/index.html b/devils-dandy-dogs/index.html
new file mode 100644
index 00000000..60e30045
--- /dev/null
+++ b/devils-dandy-dogs/index.html
@@ -0,0 +1,13 @@
+
+
+
+
diff --git a/devils-dandy-dogs/src/assets/dice/delight.png b/devils-dandy-dogs/src/assets/dice/delight.png
new file mode 100644
index 00000000..a2447c8c
Binary files /dev/null and b/devils-dandy-dogs/src/assets/dice/delight.png differ
diff --git a/devils-dandy-dogs/src/assets/dice/eyebrow.png b/devils-dandy-dogs/src/assets/dice/eyebrow.png
new file mode 100644
index 00000000..935a7a16
Binary files /dev/null and b/devils-dandy-dogs/src/assets/dice/eyebrow.png differ
diff --git a/devils-dandy-dogs/src/assets/dice/temptation-drive.png b/devils-dandy-dogs/src/assets/dice/temptation-drive.png
new file mode 100644
index 00000000..25535330
Binary files /dev/null and b/devils-dandy-dogs/src/assets/dice/temptation-drive.png differ
diff --git a/devils-dandy-dogs/src/assets/dice/temptation-overtaken.png b/devils-dandy-dogs/src/assets/dice/temptation-overtaken.png
new file mode 100644
index 00000000..8bc921ea
Binary files /dev/null and b/devils-dandy-dogs/src/assets/dice/temptation-overtaken.png differ
diff --git a/devils-dandy-dogs/src/assets/fonts/OFL.txt b/devils-dandy-dogs/src/assets/fonts/OFL.txt
new file mode 100644
index 00000000..9a30d7e1
--- /dev/null
+++ b/devils-dandy-dogs/src/assets/fonts/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2017 The Playfair Display Project Authors (https://github.com/clauseggers/Playfair-Display), with Reserved Font Name "Playfair Display".
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/devils-dandy-dogs/src/assets/fonts/playfair-display-700.woff2 b/devils-dandy-dogs/src/assets/fonts/playfair-display-700.woff2
new file mode 100644
index 00000000..998739cc
Binary files /dev/null and b/devils-dandy-dogs/src/assets/fonts/playfair-display-700.woff2 differ
diff --git a/devils-dandy-dogs/src/assets/main.css b/devils-dandy-dogs/src/assets/main.css
new file mode 100644
index 00000000..0a33245b
--- /dev/null
+++ b/devils-dandy-dogs/src/assets/main.css
@@ -0,0 +1,624 @@
+/* DDD Dog sheet styles. Every colour, spacing and type decision is a custom property so the
+ sheet can be re-skinned without touching layout. Palette values are anchored on a sample of
+ the printed character-sheet insert — see the design spec §3.1 for the exact commands and the
+ caveat that quantisation is renderer-dependent. */
+@import 'tailwindcss';
+
+/* Tailwind v4 scans markdown. Without these, class names written as prose in the docs become
+ real utilities in the bundle (this bit ddd-tmp on cypher-sheet). main.css sits at
+ devils-dandy-dogs/src/assets/, so the repo docs directory is THREE parents up, not two. */
+@source not "../../README.md";
+@source not "../../../docs";
+
+@font-face {
+ font-family: 'Playfair Display';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ /* Inlined as a data: URI rather than referenced by URL. vite.config.js builds a production
+ "base" of VITE_SHEET_PATH/VITE_SHEET_SHORT_NAME/, neither of which is set anywhere in this
+ repo, so a url() reference resolves to /undefined/undefined/ in the published bundle
+ (ddd-brb). The sandbox runs --mode staging with base "/" and therefore CANNOT detect that.
+ Since every display element on the sheet now depends on this face, it ships embedded. */
+ src: url('data:font/woff2;base64,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') format('woff2');
+}
+
+:root {
+ /* --- Book palette (spec §3.2). The legacy dark layer was deleted in ddd-dp6 Task 8,
+ atomically with the rules that consumed it. --- */
+ --ddd-parchment: #f3e8dc;
+ /* The field the parchment panels sit on. Was #e32027 "crimson" until 2026-08-11 (ddd-n93);
+ renamed rather than retuned because #710103 is oxblood and a token named crimson holding it
+ makes every contrast note below read as a lie. The palette flips with it: light-on-field
+ improves sharply (parchment 3.86 -> 10.18:1, gold 2.34 -> 6.17:1) while dark-on-field
+ collapses (ink 3.86 -> 1.46:1, blood 2.88 -> 1.09:1). */
+ --ddd-oxblood: #710103;
+ --ddd-deep: #9e1c1f;
+ --ddd-blood: #5e1111;
+ --ddd-gold: #ebac49;
+ --ddd-tan: #e3cc9d;
+ --ddd-ink: #211313;
+
+ /* Die tiles, keyed to which DIE it is (owner, 2026-08-12 — ddd-a74). Briefly both were the
+ field colour; they are now two colours of OPPOSITE POLARITY, which is what drives the two
+ rules further down that look like they could be simplified away and cannot:
+
+ symbol white on devil 5.53:1 on temptation 2.06:1 <- white is unusable on amber
+ symbol ink on devil 3.26:1 on temptation 8.75:1
+ rim gold on devil 2.77:1 on temptation 1.03:1 <- gold IS amber; no rim at all
+ rim ink on devil 3.26:1 on temptation 8.75:1
+ tile on the parchment panel: devil 4.58:1, temptation 1.70:1
+
+ So the symbol colour follows the tile (white on devil, ink on temptation) and the rim is ink
+ on both. Gold was fine on the old dark tile but never did the separating on the SHEET —
+ gold-on-parchment is 1.65:1, the dark tile was the edge. Amber cannot be its own edge at
+ 1.70:1, so the rim has to be, and only a dark one can. */
+ --ddd-die-devil: #ce1b1e;
+ --ddd-die-temptation: #f5a424;
+
+ /* --- Type --- */
+ --ddd-font-display: 'Playfair Display', Georgia, serif; /* stands in for March */
+ --ddd-font-head: 'Playfair Display', Georgia, serif; /* stands in for Carena */
+ --ddd-font-body: Georgia, 'Times New Roman', serif;
+
+ /* --- Metrics. Tokenised so owner tuning in ddd-dp6 is a one-line edit. --- */
+ --ddd-gap: 0.625rem;
+ --ddd-radius: 0.75rem;
+ --ddd-panel-pad: 0.7rem;
+ --ddd-chip-pad-y: 2px;
+ --ddd-chip-pad-x: 12px;
+
+ /* --- Type scale (spec §4.3) --- */
+ --ddd-size-title: 1.8125rem;
+ --ddd-size-title-lg: 2.375rem;
+ --ddd-size-banner: 0.6875rem;
+ --ddd-size-entry: 0.875rem;
+ --ddd-size-drive: 1.375rem;
+ --ddd-size-btn: 0.65625rem;
+ --ddd-size-label: 0.59375rem;
+ --ddd-size-body: 0.75rem;
+ --ddd-size-body-sm: 0.71875rem;
+
+ /* Die glyph ARTWORK. DUPLICATED from src/rollTemplates/common.scss ($glyph-*) on purpose: that
+ file compiles to public/host.css for the CHAT host, a separate artifact from the sheet
+ bundle, so the sheet cannot reference it. src/__tests__/die-glyph-parity.test.js fails if
+ they drift, and since ddd-4ra it checks the tile colours too.
+ Devil's Duty has no glyph — the book's "Blank" face is a plain die.
+ Format: LA PNG, pure black, real alpha. These are consumed as MASKS (ddd-4ra), not as
+ background images, which is what makes "white symbols on a #710103 tile" a CSS change
+ instead of four re-authored artworks. mask-mode defaults to alpha for an image source —
+ luminance mode would render nothing, since every opaque pixel here is (0,0,0). */
+ --ddd-glyph-eyebrow: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABACAQAAADsFdxDAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAlwSFlzAABcRgAAXEYBFJRDQQAAAAd0SU1FB+oGHRE4H9FLkO8AAAHuSURBVFjDzZnLcsMwCEWNxv//y3TRZOJIPO4FOlNWjQQcgS2EVblqos64oA5gxRRJ+uXAGBTyjYI5JOAfA1exASEHd6ABIwP3sQ4nAk9BTdJNY+McwYsV2EF/44n7wzETYx5ZRrh4SQzEna1tRLlccwzLpN7Mn7hKWS6q6JfVclT5wyOSpzeNwNErJ7sLGm2A1VaiMbGoHXGcZEk1wJif4CgmJUYh9KJMsazkok8wHy8fcyNirm4NgsdiPsGauJuJWa2IlYyiFPMqGI/EPFOrsWV/ack2iHYkqJ3ro/9WozFvGm9wtmLv3C4/58rLVYn5mF3bML6Ayj7YwBoqZUktfgQtVBHQY45OWeaEo0zHHNTA2zWpiFptnS29fRw9/wgrJzjvuJClaIZFmr04eQppGf7kMvv81+j3IuJXjrwN8sFebB30w/ui0tQRsdrbZhtzxhNDP2D8i4i/MxHbZlEHnPiOHKSry9RqMf76/Nq/nZPl3Ze1cWLsiOa+nXDT/RGRPYmVaszULi5wXn73sbgOOSFsb94ElOSipnMs7rcDUQV0mr2JmLCZEXBLOs/2eUdk14LgOU9FLM6oW8EmU03dcP+jqwhczqMibfGmIpYDB38ezFYs6y7UqeLTpXK/73YPj/kaDfwj5K/AO9xk/ACWGX50qzzxdwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNi0wNi0yOVQxNzo1NDowOSswMDowMOeuB70AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjYtMDYtMjlUMTc6NTQ6MDkrMDA6MDCW878BAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDI2LTA2LTI5VDE3OjU2OjMxKzAwOjAweHMHZwAAAABJRU5ErkJggg==');
+ --ddd-glyph-delight: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAlwSFlzAABcRgAAXEYBFJRDQQAAAAd0SU1FB+oGHRE4H9FLkO8AAAG4SURBVGje7VjZkoQwCATL//9l9m3VJEBDwKmpXZ6mRo5Oy2WYiISIiJgiIoa+3H67XvlmgEPQIMtS2/TLg6EPQocrhhXbDzDSZGGJBDf98uQAOVk0uAHhcMPZ7gUOr3jixUP2jDZkZEGOlJu8PBkTotNR7wFxk7cZmOTPA+AZwJWnPRkwyLnvYgIeak3WLMDc2NNDPLszYYoGvzREt2Nanz89XKJyT8IPhCfiRK6XBSfKVIE2rpOwogxM08wB50qsE9rhscoZdCIAKt79BPGA3WJLqLc/TXIQEdfmdewg5+Nvt3FuydL7swyZ+mbgVayPsmVVFTl/XvNXb1UFON0MWhrDCClDBp8lwmNGewnoeKrbiPyzg59mXeEV6WLA6pIPJjoA2CdXOiFssBV84S1SBVY5pW5HMAb0ECVNG62CnWCmLd7lR/29VS7MwOymaIvYW8ny21SSAcw1R5iqb0Qc4qZgFnirehmApsW1YhqObznEQVUOpPn59CXVP4AAgKYPli9ioImDGAMNEKKvoBzCV+VAi6xbqL+QlQMQ0q8nWi9wtJ3/pfD+ltt+fWWN41fuzrRV4rWLux9wlliS8qYCfwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNi0wNi0yOVQxNzo1NDozMyswMDowMM1RXxAAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjYtMDYtMjlUMTc6NTQ6MzMrMDA6MDC8DOesAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDI2LTA2LTI5VDE3OjU2OjMxKzAwOjAweHMHZwAAAABJRU5ErkJggg==');
+ /* Temptation die, from the same insert page. Band names match temptationResult()
+ in src/dice/rolls.js: `drive` is the spiral (d6 3-6), `overtaken` the bolt (1-2). */
+ --ddd-glyph-drive: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAAI3klEQVR42rXZeawfVRUH8M/M/N5r66OWRW1rqa1YsKUogkJEQKGgmBIwGoNUIS4IRogGDRoVI0YxIQrGDROJS4gLAdSgRnCrERQxFhfEBQSqLUuBUirwaPveb2auf8ztvJnfb15bWpibtPPmN/ec7z37OZPZ0yuRyZStJyOSXd++p8zzeD/bqJ5JW0zEJxlK4ZkDkCmwl5Os8FIHmiPRt95//dNv/N5mJFKFZ+TKMMv73CV0ro2udEI8ZPrMsD/KHYKg0Jcr4yrk+soIY7WT6/efZvanGxcarAZXWf/2Qy9Ctof2NsD+1Hj2sJOVKwQPOQ3p0wMhlVhsk3IX2G8HEQSfebogpPixoD/EqNJ+c+URZCkXfOvpgJDh5CH2Rc1qOiVUO741bI7JUw493OwoRU2oFOL9f6z1e+uMKzHLQsd6qfkopBJ9Iy7xUb06eO3W+Y9vab/S790udoJndex4nne6tTbYvuDNe+KUGb5Rs62I3uscY7V9ZHr1ymIAypznUSHGio0W7W5oSjDTvbX7FYIrPCcy6fbzJD5f4hZBLhf8YHdlkOFY/RjxcsEF8fnOLKmHZ7uuNsnX7R6EHt4jmIxKuAC9XRRmhlF/iLtvkuyOQ2b4mKAvF1yJ3lMgkmGxBxXy3ZVBhs/GMzzkuR2mlMrqlXRKcFXcf83uAvicYJvgkkhwx+8nHRRWCwpbLKjMurcTu68WBD1simSukrTKsMpHDrHCIRL3+5tf21wXLc3rEscLZjnZFY16qrPO69Lv+YLgAXP0WiJMJOb7WyMEr3OJRXX2aFK+VVC6qjpKMm2pBTMsMM88PbNlcvv6oPm4zzLjMbUUDeL72c+BTrfSPmCTL/iciQbFnty5Lsc9XmLrMP/KOUa93qessdbmzpwXrHGegxqabV9LfLeOl7+zvGEvKeZ7TBAsG5BO/efb/avFskqtE7YO5MBNfuYNLXNLYjCGd9imMCnY7E0DEK4XulwxwwHxx0JfoVAq63weBNv80xqPNgqx3zluSNOpDCttU0TQZ9QQehLvFwQfaHtShqNtEBQDub1ifptLHWmhMSPmOsi7Xe2JCPZys4ZUMYKLYvAtBasiuxSHGhdcFt+q2b8mlpnDBdW93mNmh7m+2OXx/ZssGoCQyIz5tzJKcqujazn1rBV8ZUoCKfZ3byPRTuk/uNb8uC2VSiTSGPPgRHcpBXdaNKCIDB+MNHPBPfaOFPie4PIpAJlRv+1gnwsujQJNOuvDEbzQ/XLBnRa2IGQSS41HO5oqyXoRWC2BDGd2CL8v+BJ1YTF9jjzSVhOCm8xoBLAqhq6JBynrJDSKE5W+XNlAgjFrh8rsQnC9tEWwF9VQOVvSgPDxRo7IWkr4ei3ZXPBHIzLMFXy4AtDD2UPiLxUetbgml+wgd6VSY+5RmrTVYY13M5wzUMK9Me5Y7chKYSl+0fD0Ke1/vDaSiuC+3uUyV7naNb7pXL26qu7hrJhof9KwgwynNADkSqulUsyYsqp5nhRaPV4h2Gx+zPgZnuNSGwZs5NraOhKJvawX5CYcVkPOsKIl3VLuJYMx49jOZurqeJIMr419cK4vl8tNygVL6tNmuExpa22425+e0AKQCy5u1lIpDmEgawf8LHp8YZUbvFguyPRivTMiEzy/FXi+LzGKU81s0CuG2p/jm1VCFYIMFBcp/itIlRb5mkwxUP9Vg5dt9d+l4HbrpXL7O6Yh5GKoJjrcQqEpgXLAqkupR90d2ZxjtrzTB0obG4BS4/6MQuaIgZwQWtBnWjYllXSa4nDcE/HumCm0A9dGjzSIZ/hfvD+q8XzGwK4Cx055SooHhwsDWzzeKlEMkQl+7glZ63R5PNlyM5Rx3z4duxdMAUzxjw4ASc12beegLZW4bgBSYv8IYLbn1nQO7Wjw9mM7wBR3KyQDbGaZHe+u75BAIbXG9Y2KMBUsclwMSnPsi0QQvKID/mjbLkbc1pr3lIJxy6Je53poIE9UNdIRLesZwRV16i2dFKHsbd3ALCkX3CzbLuNUT9+NQsMXEoUxL4ym9ZCvtHqAIFE6w5p6BFnRONPZSll8Y3ZMx4d7gbLDwoq2Zx43EIr7gk/E1jo1y211si6VHvMqzKibMDjHFnmkkSutjPb/xaE0lwt+2bSyRKLn70Nzj1uihaRY7uE6qwcbrWidaalv1qqp/p3wMqTmDCmgOsg1bbPfnsuaVlDaYnlMrFVEb9eLa3zP+c72WattFWLhGeLdA/aW4G3TFHnfaJajlQxmxfKx+dqnW0nlle6uBwxl5yRwaudP48zklqE0XynoA4OtbTV6bRIqlO63bx2GqpT87UiivcrWeDbIHSbBys5hZil49XD8TfGjocT5ycaL1f+r6gY0jxX/1Ii62vt47ABG/WWaYe64BV1NWWKBBxsQSoUnHdx4NYmVzFlunmYoOe47Do6B5sIO/VdPbugO8NUIarKh4Vxwo5FWIt4uj0N9xA1u84AnTXjAX/3Uey2p49wxJlvKaQK4cLrhRobTTDYEl8chc69j8FZlurkOcKC5RludwhL3TTtLn7C0I/c0HPI0Ew3h9QVntp2mMQ1qw89iU7q3P3WKv/KAX+14QtbDCg83Il+h8NZp2pMkdglNX1no5mnYVzJ5y87GUxmWu7XukqvG6kN1az39PKmHpe6cln2udIdnNVL9DqQw01frTRWEa+v0lHXOlOAUG6ZlXz1/x66N5yphv97tjcATbPIJ8+o3qnF0r56Vjrl4h59xcsEfjOzqhLTy+Znea120hW3xY9znHT90hjGr/CO2HXn8hlbZT79OUbm+o5/aB4uqet/HWVY5PFZCVb5f67du97j15phnmZO9APk0U8cChVGfctHw3DDZqRwKjHitU51k8U7kNuket9vgLv+xxUyLvNxp5oBfWRmt6Sl+spn6PryXg53oIEstNlsSf+m7wzobrPdnd3mk0axsr4DPcLT1LrJJOtSD7OK0uwodea2aMWNmCdii7/HWwLXqfUPcF1qDzLBnH6+rM5cdH6O3M63W8G+FdLrv6P8Hx7ZTlxuYJmgAAAAASUVORK5CYII=');
+ --ddd-glyph-overtaken: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAADAElEQVR42s2Zv2/TQBSAP/uSsjWtUIUobSckoGIBsSIx8FsspbAzlf49TEgwsdEW/gRE23RBAiQkws7MgCpU0sR3x3BJG9tnJ77YZ3xSpMRJ/Pm97z2fz5C/BVS8iZwDLxDQqxohzPn8Fu8RPqKQFZm7aN7SJMjErBjgPhLNDg0C/1EwAJoumm0a/qMwBIjoo9kmzPGlYgA9QBB+ozAKoOmheec3EXEAE4Udmv50TAKYKOxUE4UAkRozCB7GAAzCFgJoWH4hEGVH52YCwCBsZ7Zvp2tHA1jhOkcIdCwFkhupP2wS8YQtXhGiLAc/4NC6Z0wClvkWO8/8IXP2tZkr3i8CYJYPaLpEsSEzESLr6KFpM18cIQTm2R8U2zSjj2af+ZzLfA7CXIkIc8URBDDLbsp7V4RZtyi02C0tCi1XF8pCOHDXca8khPb/omPoomNZUdijNY2OsuAhJSr2PjqpCCcXPqIKIaiR17iODoloAHcKdAWF5jcv0CgLgkODFgQ8KAjQZYFnlkQ46ZieEY0H+MtVYDMDoaCObgCXCYGNzCgUaNCuADADPEcTWV2YOBHuACHNXIQJdZwGwNTQZmYiJmrQ0wEYhI3cihDVAoxDGKvjOAA1aDnDIVMABuHUheE3zeR+7HxBAPeQOQAqAaA4SgBwoqPZfzp6JxUR5AE8GtDar3PpEXEldVZGR/sV5ROLhI0MAEXAFzqsIhO5UoS85g0tosT0XvITErclESEv+cxZ+omzlbSYybuJCYELfE+dr0Lyi9slLIRN1AuWrAgaxVPgTOLmNBvB8WZWAMt0UggSTZ/1QY4rXydY4keqICWaHusD0ytHsLugOOaxrygsWhAkmmPW/CXCrmPPH0KWjpG/RBgd+/Xq2LFUxFBH4U9HG8Kaj+XcrKKUaP6w7AshXREKRZdVP0vatopQaI645GtNPd2glWVG5FVH7wBJHWsAiOtYC8Cojr16AEZ1lPUAjLpwWA/AsCI6aC7WA2AQVvjKtboADMI5ztf1pHmKB/3/AIsDnPXHDro4AAAAAElFTkSuQmCC');
+}
+
+/* Tailwind namespace bridge. `inline` makes utilities emit var(--ddd-*) directly rather than
+ resolving the alias at :root scope, so a [data-theme] subtree redefining --ddd-* would
+ re-skin every utility. Components use ONLY these semantic utilities. */
+@theme inline {
+ --color-parchment: var(--ddd-parchment);
+ --color-oxblood: var(--ddd-oxblood);
+ --color-deep: var(--ddd-deep);
+ --color-blood: var(--ddd-blood);
+ --color-gold: var(--ddd-gold);
+ --color-tan: var(--ddd-tan);
+ --color-ink: var(--ddd-ink);
+ --font-display: var(--ddd-font-display);
+ --font-head: var(--ddd-font-head);
+ --font-body: var(--ddd-font-body);
+ --radius-panel: var(--ddd-radius);
+ --spacing-sheet: var(--ddd-gap);
+ --text-banner: var(--ddd-size-banner);
+ --text-entry: var(--ddd-size-entry);
+ --text-btn: var(--ddd-size-btn);
+ --text-label: var(--ddd-size-label);
+ --text-sheet: var(--ddd-size-body);
+ --text-sheet-sm: var(--ddd-size-body-sm);
+}
+
+/* Preflight reconciliation. v4 preflight resets UA chrome this sheet relies on; `revert` rolls
+ back to UA defaults. Lives in @layer components so it BEATS preflight (base) but LOSES to
+ utilities — a Phase B component's utility classes must win — while un-layered BEM rules
+ out-rank all of it. */
+@layer components {
+ /* preflight:12-13's universal border-box is now KEPT — Phase B dropped the revert, and every
+ metric below assumes border-box. The UA body margin stays zeroed too (see the shell rules):
+ restoring it alongside a full-width body pushes the sheet 8px off-screen. */
+ html { line-height: revert; }
+
+ input, select, textarea, button {
+ margin: revert; padding: revert; border: revert; border-radius: revert;
+ background-color: revert; color: revert; font: revert;
+ }
+ textarea { resize: revert; } /* preflight:308 sets resize: vertical */
+ ::file-selector-button {
+ margin: revert; padding: revert; border: revert; border-radius: revert;
+ background-color: revert; color: revert; font: revert; appearance: revert;
+ }
+ /* NOT reverted: the UA placeholder grey is 3.81:1 on parchment and fails AA as text. Deep is
+ 6.59:1 and still reads as "not a value" against ink body text. Spec §3.3 rule 6 — this only
+ showed up in the rendered sweep, never in the palette table. */
+ ::placeholder { color: var(--ddd-deep); opacity: 1; }
+
+ img, svg, video, canvas { /* preflight:214-234 */
+ display: revert; vertical-align: revert; max-width: revert; height: revert;
+ }
+
+ p { margin: revert; }
+ h2, h3 { margin: revert; font-size: revert; font-weight: revert; }
+ small { font-size: revert; } /* ReferencePanel.vue:27 has one, and the
+ harness opens Reference */
+ dl, dd { margin: revert; } /* ReferencePanel declares dd itself; dl is
+ the genuinely unrestored one */
+ summary { display: revert; } /* preflight:194-196 is list-item, not block */
+}
+
+/* --- Primitives (ddd-dp6 Task 9). Layered so template utilities can still override them: an
+ un-layered rule out-ranks everything Tailwind emits and the token bridge becomes decorative.
+ Declared AFTER the reconciliation block on purpose — `input, textarea, select` ties it at
+ 0-0-1, so source order is what makes the styled control win over the UA revert. --- */
+@layer components {
+ /* A section is block, NOT grid: as a grid item the banner would blockify and stretch to the
+ track width, and the parent's gap would fight the -7px overlap. */
+ .ddd-section { display: block; container-type: inline-size; }
+
+ /* The 2px gold border is the panel's boundary and it got sharper in ddd-n93 — 2.34:1 on the old
+ crimson, 6.17:1 on oxblood. The deep ring below is NOT a boundary and never was (1.71:1 then,
+ 1.55:1 now); it is a depth cue, so the recolor leaves it alone. */
+ .ddd-panel {
+ @apply bg-parchment border-2 border-gold;
+ border-radius: var(--ddd-radius) 5px 14px 7px;
+ box-shadow: 0 0 0 2px var(--ddd-deep);
+ padding: var(--ddd-panel-pad);
+ display: grid;
+ gap: 0.3rem;
+ min-width: 0;
+ }
+
+ /* Rendered as
: four sections carry an
today, and replacing those with styled divs
+ would strip heading semantics and orphan the
s beneath. UA h2 sizing is overridden
+ here, so the element choice costs nothing visually. */
+ .ddd-banner {
+ @apply bg-ink text-parchment font-display text-banner uppercase;
+ width: fit-content; /* chip, not full-width bar */
+ letter-spacing: 0.13em;
+ padding: var(--ddd-chip-pad-y) var(--ddd-chip-pad-x);
+ margin: 0 0 -7px 10px;
+ font-weight: 400;
+ position: relative;
+ z-index: 2;
+ /* Was top+bottom rules only. Closed to a full rim in ddd-n93: this class is ALSO the
+ ReferencePanel's (ReferencePanel.vue:15), i.e. a click target whose default
+ disclosure marker was removed because "the chip carries the affordance". On oxblood an ink
+ fill is 1.46:1, so the fill stopped drawing the silhouette that affordance depends on.
+ The rim is defined by gold-on-ink (9.02:1), not by the ground, so it reads identically on
+ the half of the chip that overhangs a parchment panel. */
+ border: 1px solid var(--ddd-gold);
+ }
+
+ /* Gold keyline is permitted here under spec §3.3 rule 2's narrow exception: the blood FILL
+ carries 11.12:1 against parchment, so the fill — not the border — identifies the control. */
+ .ddd-btn {
+ @apply font-display text-btn uppercase text-parchment;
+ background: var(--ddd-blood);
+ border: 1px solid var(--ddd-gold);
+ border-radius: 3px;
+ padding: 2px 8px;
+ letter-spacing: 0.07em;
+ cursor: pointer;
+ white-space: nowrap;
+ }
+ .ddd-btn:disabled { opacity: 0.4; cursor: not-allowed; }
+ /* Gold fill + gold border would leave the ACTIVE state with no 3:1 boundary against
+ parchment (1.65:1) — the blood-fill exception does not carry over. Deep border. */
+ .ddd-btn--on {
+ background: var(--ddd-gold);
+ color: var(--ddd-ink);
+ border-color: var(--ddd-deep);
+ }
+
+ /* Transparent/parchment-filled controls need a deep border — it is the only boundary. */
+ input, textarea, select {
+ @apply bg-parchment text-ink font-body;
+ border: 1px solid var(--ddd-deep);
+ border-radius: 3px;
+ padding: 1px 5px;
+ min-width: 0;
+ }
+
+ /* Gold on parchment is 1.65:1 — not a visible focus indicator. */
+ input:focus-visible, textarea:focus-visible, select:focus-visible,
+ button:focus-visible, summary:focus-visible {
+ outline: 2px solid var(--ddd-ink);
+ outline-offset: 1px;
+ }
+}
+
+/* --- Migrated from SFC scoped styles (ddd-yf4), grouped by original component. Prefixes marked
+ KEEP-SCOPED are load-bearing: without them the rule leaks to a component that is currently
+ unstyled. Raw hex values are carried over verbatim; tokenising them is a visible-risk change
+ and belongs to Task 9. --- */
+
+
+/* ============================================================================
+ Phase B component rules (ddd-dp6). Layered so template utilities can override
+ them, and declared AFTER the primitives block above so that at equal
+ specificity — .reset vs .ddd-btn, both 0-1-0 — the component rule wins.
+ ============================================================================ */
+@layer components {
+ /* Preflight zeroes the body margin and Phase B keeps it that way. Restoring the UA 8px
+ alongside width:100% makes the body 496px wide in a 480px viewport and pushes the sheet's
+ right edge off-screen — invisible to a scrollWidth check, and clipped out of screenshots by
+ overflow-x:hidden. */
+ body {
+ margin: 0;
+ width: auto;
+ min-height: 100dvh;
+ overflow-x: hidden;
+ background: var(--ddd-oxblood);
+ color: var(--ddd-ink);
+ }
+
+ #app { font-family: var(--ddd-font-body); }
+
+ /* App.vue — the sheet measures its OWN box: a Roll20 panel resizes independently of the
+ window, so a media query reads the wrong number. Size queries evaluate the CONTENT box, so
+ the --ddd-gap padding is subtracted: a 480px panel queries at 460px (28.75rem) and an 860px
+ panel at 840px (52.5rem). Thresholds are 28rem/51rem accordingly — 30rem/48rem would never
+ fire at 480px. */
+ .ddd-sheet {
+ container-type: inline-size;
+ background: var(--ddd-oxblood);
+ /* NOT the field's text colour, despite appearances: .ddd-panel sets no `color`, so this is
+ what every panel's interior inherits. It has to stay ink. The corollary is the field
+ invariant — anything sitting on the BARE field sets its own light colour. That was always
+ true; since ddd-n93 it is unforgiving rather than merely poor (ink 3.86 -> 1.46:1). */
+ color: var(--ddd-ink);
+ font-family: var(--ddd-font-body);
+ padding: var(--ddd-gap);
+ display: grid;
+ gap: var(--ddd-gap);
+ }
+
+ /* Multi-column flow, not a row grid: panels stack down each column at their natural height so
+ the vertical gap is one constant value and no banners align across a row. Accepted cost —
+ column balancing moves panels between columns as content grows (spec §6.2). */
+ .ddd-sheet__grid { column-count: 1; column-gap: var(--ddd-gap); }
+ @container (min-width: 28rem) { .ddd-sheet__grid { column-count: 2; } }
+ @container (min-width: 51rem) { .ddd-sheet__grid { column-count: 3; } }
+ .ddd-sheet__grid > * { break-inside: avoid; margin: 0 0 var(--ddd-gap); }
+
+ /* Sits directly on the field. Ink fill — but on oxblood an ink chip is 1.46:1, so the fill no
+ longer draws its own silhouette. Nothing to add: .ddd-btn's `1px solid var(--ddd-gold)` is
+ what makes this read as a chip now (6.17:1), and .reset overrides only the background. */
+ .reset { justify-self: start; background: var(--ddd-ink); }
+
+ /* --- RoleHeader.vue --- */
+ .role-header__bar { display: flex; gap: 1rem; align-items: center; }
+ .role-header__fields { display: grid; gap: 0.25rem; min-width: 0; }
+ .role-header__role { display: grid; gap: 0.3rem; min-width: 0; }
+
+ /* ddd-93d. A fixed identity column (token + Name + Role) beside the role's own column, so the
+ description sets to a readable measure instead of running the full width of the sheet.
+ `align-items: start` keeps the short left column from stretching to the prose's height.
+ Keyed to .ddd-section's container like the rest of this header: 36rem is where 15rem of
+ fixed column still leaves the right column a usable measure once .ddd-panel's padding and
+ borders (~1.4rem + 4px) are taken off. Below it the grid is a single track and the columns
+ stack in source order — the pre-ddd-93d layout, unchanged. */
+ .role-header__layout { display: grid; gap: var(--ddd-gap); align-items: start; }
+ @container (min-width: 36rem) { .role-header__layout { grid-template-columns: 15rem minmax(0, 1fr); } }
+
+ /* Keys off .ddd-section's own container, NOT the root: the header is full-width, so 20rem of
+ ITS content box is the right trigger and is a different measurement from the root's 28rem. */
+ .role-header__title {
+ font-family: var(--ddd-font-display);
+ text-align: center;
+ line-height: 1;
+ font-size: var(--ddd-size-title);
+ color: var(--ddd-deep);
+ margin: 0;
+ }
+ @container (min-width: 20rem) { .role-header__title { font-size: var(--ddd-size-title-lg); } }
+ /* ddd-93d. Declared AFTER the base rule on purpose — it ties `text-align: center` at 0-1-0, so
+ source order is what makes it win. Flush-left with the description's text edge: centring only
+ reads as intentional while the title spans the whole panel; over one column of a two-column
+ layout it looks like a stray indent. Same 36rem trigger as .role-header__layout. */
+ @container (min-width: 36rem) { .role-header__title { text-align: left; } }
+ /* Superior cap. Lives INSIDE the panel with the title — on the bare field it would be ~12px
+ ink text at 1.46:1 (spec §3.3 rule 1). Worse than the 3.86:1 that first put it here. */
+ .role-header__title .the {
+ font-size: var(--ddd-size-body); text-transform: uppercase; letter-spacing: 0.1em;
+ vertical-align: top; position: relative; top: 4px;
+ }
+ .role-header__desc { font-size: var(--ddd-size-body); line-height: 1.45; }
+ .role-header .drop-cap {
+ font-family: var(--ddd-font-display);
+ float: left; font-size: 1.875rem; line-height: 0.82;
+ padding: 1px 3px 0 0; color: var(--ddd-deep);
+ }
+
+ /* Shared by DogDetails, DriveStorytelling, RoleHeader and Tracks. Blood on parchment is
+ 11.12:1; on the oxblood field it would be 1.09:1, so labels only ever sit inside a panel.
+ The reason survived the ddd-n93 recolor and got stronger — blood was 2.88:1 on crimson. */
+ .label {
+ font-family: var(--ddd-font-display);
+ font-size: var(--ddd-size-label); text-transform: uppercase; letter-spacing: 0.1em;
+ font-weight: 700; color: var(--ddd-blood);
+ }
+ .avatar img { height: 3rem; border-radius: 6px; border: 2px solid var(--ddd-gold); }
+
+ /* --- TraitsBlock.vue. Keyed to the SECTION's own container, not the root: at the 2-column
+ sheet threshold a panel's content is ~199px, so a row keyed to the root's 480px would
+ overflow by more than half. --- */
+ .trait-row {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ gap: 2px 6px;
+ align-items: baseline;
+ font-size: 0.78125rem;
+ padding-bottom: 3px;
+ border-bottom: 1px dotted var(--ddd-tan);
+ min-width: 0;
+ }
+ .trait-row__tier { font-family: var(--ddd-font-display); }
+ .trait-row__name {
+ font-family: var(--ddd-font-display); font-size: var(--ddd-size-entry); min-width: 0;
+ }
+ .trait-row__count { width: 3rem; }
+ .trait-row .roll { grid-column: 1 / -1; justify-self: start; }
+
+ /* 19rem of the SECTION's content box. The measured floor is ~17rem, but at 273px (the 3-column
+ panel) the 1fr name column collapses until "Dandy" touches the count input — so the switch
+ is held back to a width where the inline row is actually comfortable, not merely possible. */
+ @container (min-width: 19rem) {
+ .trait-row { grid-template-columns: 4.6rem 1fr 3rem auto; }
+ .trait-row .roll { grid-column: auto; justify-self: end; }
+ }
+
+ .riven-badge {
+ background: var(--ddd-deep); color: var(--ddd-parchment);
+ padding: 0.15rem 0.4rem; border-radius: 0.25rem;
+ font-family: var(--ddd-font-display); font-size: var(--ddd-size-btn);
+ text-transform: uppercase; letter-spacing: 0.07em; justify-self: start;
+ }
+
+ /* Roll-mode toggle, above the trait rows it governs. Moved here from DriveStorytelling
+ (ddd-pzx) — mode selects the face names a trait roll posts and never touches Drive.
+ The label takes its own line by default: in the 2- and 3-column panels the section is
+ ~199-273px, where "Roll Mode / Narrative / Combat" inline orphans Combat onto its own
+ row and the pair stops reading as one control. Same container and threshold as
+ .trait-row above, so the toggle and the rows it governs relax together. */
+ .mode { display: flex; gap: 0.4rem; align-items: center; flex-wrap: wrap; }
+ .mode__label { flex: 1 0 100%; }
+ @container (min-width: 19rem) {
+ .mode__label { flex: 0 0 auto; }
+ }
+
+ /* --- CallResponse.vue. Lives in the Traits column, whose content box is ~199px at the
+ 2-column sheet threshold — so chips wrap and nothing here assumes horizontal room. --- */
+ .call-response {
+ display: grid;
+ gap: 0.3rem;
+ margin-top: 0.4rem;
+ padding-top: 0.4rem;
+ border-top: 1px dotted var(--ddd-tan);
+ }
+ .call-response__context { font-size: var(--ddd-size-label); margin: 0; opacity: 0.8; }
+ .call-response__dice {
+ display: flex; flex-wrap: wrap; gap: 0.3rem;
+ list-style: none; margin: 0; padding: 0; min-width: 0;
+ }
+ .call-response__slot { min-width: 0; }
+ .call-response__die {
+ display: grid; justify-items: center; gap: 1px;
+ padding: 3px 5px; min-width: 0;
+ background: var(--ddd-parchment);
+ border: 1px solid var(--ddd-deep); border-radius: 4px;
+ font-family: var(--ddd-font-body); color: var(--ddd-ink);
+ cursor: pointer;
+ }
+ /* A spent die reads as an EMPTIED SLOT: tan fill, recessed by an inset shadow, struck through.
+ The owner judged the previous dim-plus-strike too faint in the real Roll20 host (ddd-905) —
+ 1360440 had raised the spent chip's own text contrast, which is a different problem from
+ spent-vs-held distinguishability. Fill is the channel that carries the latter.
+
+ No `opacity` here, and that is the load-bearing part: opacity composites the element's own
+ background toward the panel behind it, so dimming the chip washes out the very fill meant to
+ carry the state (tan 1.30:1 -> 1.20:1 against parchment, and the chip's text 11.47:1 ->
+ 5.08:1). The fill and the recess ARE the dim. Guarded in call-response-legibility.test.js.
+
+ Border is deliberately NOT softened to tan: the chip is a button (click to unspend), and tan
+ is 1.30:1 against parchment — no boundary. The inherited --ddd-deep border carries 6.59:1
+ against the panel and 5.07:1 against this fill. Blood text on tan is 8.56:1. */
+ .call-response__die--spent {
+ background: var(--ddd-tan);
+ box-shadow: inset 0 2px 4px rgb(from var(--ddd-ink) r g b / 0.35);
+ color: var(--ddd-blood);
+ text-decoration: line-through;
+ }
+ /* Tile. Devil's dice by default; the Temptation faces override the fill below. Ink rim on both
+ — see the --ddd-die-* note in :root for why gold is gone. The rim is what gives the amber
+ tile an edge on parchment (1.70:1 on its own), and it sharpens the devil tile too: ink is
+ 14.9:1 against the panel where gold was 1.65:1. Tan would also be dark enough but tan means
+ SPENT here (.call-response__die--spent), the wrong signal on a fresh die. */
+ .call-response__glyph {
+ width: 1.1rem; height: 1.1rem; border-radius: 3px;
+ background-color: var(--ddd-die-devil);
+ border: 1px solid var(--ddd-ink);
+ }
+ /* Ties the base rule at 0-1-0, so SOURCE ORDER is what makes these win — they must stay
+ declared after it. Two selectors rather than a shared `--temptation` modifier class because
+ the face class is derived from the store's band name (`call-response__glyph--${band}`), and
+ inventing a second class for the template to emit would put the die-type knowledge in the
+ component instead of here. */
+ .call-response__glyph--drive,
+ .call-response__glyph--overtaken { background-color: var(--ddd-die-temptation); }
+ /* The mask goes on ::before, not on .call-response__glyph itself: masking the element would
+ clip its own background and border away and leave a bare symbol. The base rule carries
+ geometry and mask placement only — both inert without a mask-image — so `duty`, the book's
+ "Blank" face, needs no opt-out: it never gets a background-color, and an unpainted
+ ::before is invisible. */
+ .call-response__glyph::before {
+ content: ''; display: block; box-sizing: border-box;
+ /* Symbol colour is set per FACE below, not here: it follows the tile's polarity — white on
+ the dark devil tile, ink on the light Temptation tile. Setting a default here would make
+ whichever group forgot to override it silently unreadable. */
+ width: 100%; height: 100%;
+ mask-position: center; mask-size: 72%; mask-repeat: no-repeat;
+ -webkit-mask-position: center; -webkit-mask-size: 72%; -webkit-mask-repeat: no-repeat;
+ }
+ .call-response__glyph--eyebrow::before {
+ background-color: #fff;
+ mask-image: var(--ddd-glyph-eyebrow); -webkit-mask-image: var(--ddd-glyph-eyebrow);
+ }
+ .call-response__glyph--delight::before {
+ background-color: #fff;
+ mask-image: var(--ddd-glyph-delight); -webkit-mask-image: var(--ddd-glyph-delight);
+ }
+ .call-response__glyph--drive::before {
+ background-color: var(--ddd-ink);
+ mask-image: var(--ddd-glyph-drive); -webkit-mask-image: var(--ddd-glyph-drive);
+ }
+ .call-response__glyph--overtaken::before {
+ background-color: var(--ddd-ink);
+ mask-image: var(--ddd-glyph-overtaken); -webkit-mask-image: var(--ddd-glyph-overtaken);
+ }
+ /* duty is the book's "Blank" face — plain die, no glyph, hence no ::before rule */
+ .call-response__value { font-family: var(--ddd-font-display); font-size: var(--ddd-size-entry); }
+ .call-response__face { font-size: 0.625rem; text-align: center; }
+ .call-response__remaining { margin: 0; font-size: var(--ddd-size-label); }
+ /* Body, not label (ddd-0i8). This is the text a player reads mid-scene when they have run out
+ of dice; at --ddd-size-label it was 9.5px, the smallest type on the panel, and the owner
+ judged it unreadable in the host. Width is the constraint that made it small in the first
+ place — see the .call-response__temptation note below. */
+ .call-response__empty { font-size: var(--ddd-size-body); }
+ .call-response__empty-lead { margin: 0 0 0.2rem; font-weight: 700; }
+ .call-response__options { margin: 0; padding-left: 1rem; display: grid; gap: 0.2rem; }
+ /* .ddd-btn's white-space: nowrap gives "Roll your Temptation die" a 187.5px min-content —
+ plus .call-response__options' 1rem padding-left, that alone forces the whole
+ .call-response grid past the ~199px column budget in the out-of-dice state (the held
+ state has no such button and fits fine). Ties .ddd-btn on specificity (0-1-0 each), so
+ this must stay declared after it in source order — .ddd-btn lives in the SECOND
+ @layer components block above; this is the THIRD, so the tie is won by construction. */
+ .call-response__temptation { white-space: normal; }
+ /* The rolled Temptation result (ddd-4zr). Same reading order as a pool die — symbol, value,
+ then what it means — but laid out inline rather than stacked, because this block sits in the
+ out-of-dice state, which is the sheet's tightest column. The outcome text wraps under the
+ tile instead of widening the grid: `flex-wrap` plus a 100% basis on the outcome is what keeps
+ min-content at the tile-plus-value width and off the whole sentence. */
+ .call-response__result {
+ display: flex; flex-wrap: wrap; align-items: center;
+ gap: 1px 0.3rem; min-width: 0;
+ }
+ .call-response__outcome { flex: 1 0 100%; font-size: var(--ddd-size-body-sm); }
+ .call-response__clear { justify-self: start; }
+
+ /* --- DriveStorytelling.vue --- */
+ .drive__value {
+ font-family: var(--ddd-font-display);
+ font-size: var(--ddd-size-drive);
+ text-align: center;
+ color: var(--ddd-deep);
+ /* An 's intrinsic width is its `size` attribute (default 20 characters), which at
+ 22px display type is 264px — wider than a 199px panel at the 2-column threshold. */
+ width: 100%;
+ /* border intentionally inherited from the layered input rule — rule 2 forbids border:none */
+ }
+ .sub {
+ font-family: var(--ddd-font-head);
+ font-size: 0.625rem; text-transform: uppercase; letter-spacing: 0.11em;
+ color: var(--ddd-blood);
+ border-top: 1px solid var(--ddd-tan);
+ padding-top: 4px; margin: 2px 0 0;
+ }
+ .storytelling { font-size: var(--ddd-size-body-sm); line-height: 1.45; }
+
+ /* --- Tracks.vue. flex-wrap is load-bearing, not cosmetic: without it .track's min-content is
+ 283px and it alone sets the whole sheet's minimum width, overflowing every panel width. --- */
+ .track { display: flex; gap: 0.4rem; align-items: center; flex-wrap: wrap; }
+ .memories__head { display: flex; justify-content: space-between; align-items: center; }
+
+ /* The pip glyph is TEXT as well as a control, so a tan glyph fails twice: 1.30:1 as text and
+ 1.30:1 as a boundary. Both states are drawn in deep (6.59:1) and distinguished by glyph
+ shape and ground, not by colour. Spec §3.3 rule 4. */
+ .rend-pip {
+ background: none; cursor: pointer; padding: 0 2px;
+ color: var(--ddd-deep);
+ border: 1px solid var(--ddd-deep);
+ border-radius: 3px;
+ font-size: 0.9375rem; line-height: 1;
+ }
+ .rend-pip.filled { background: var(--ddd-tan); }
+ .riven {
+ font-family: var(--ddd-font-display);
+ color: var(--ddd-deep); font-weight: 700;
+ text-transform: uppercase; font-size: var(--ddd-size-btn); letter-spacing: 0.07em;
+ }
+ .memory { display: grid; grid-template-columns: 1fr auto; gap: 0.3rem; margin-top: 0.3rem; }
+
+ /* --- Tricks.vue and Pacts.vue --- */
+ .tricks__head { display: flex; justify-content: flex-end; }
+ /* Card-level break protection: the SECTION avoiding a break does not stop an individual card
+ from splitting between its control row and its body when a panel exceeds the column box. */
+ .trick, .pact {
+ break-inside: avoid;
+ border-top: 1px solid var(--ddd-tan); padding-top: 5px; display: grid; gap: 3px;
+ }
+ /* Trick names are entry titles too — same treatment as .pact__name, on an input. */
+ .trick__row input {
+ font-family: var(--ddd-font-display);
+ font-size: var(--ddd-size-entry);
+ color: var(--ddd-deep);
+ }
+ /* A trick row has THREE children and a pact row has FOUR — a shared three-column rule would
+ push Remove onto a second line. */
+ .trick__row { display: grid; grid-template-columns: 1fr auto auto; gap: 6px; align-items: baseline; min-width: 0; }
+ .pact__row { display: grid; grid-template-columns: auto 1fr auto auto; gap: 6px; align-items: baseline; min-width: 0; }
+
+ /* Below 18rem of the section's own box, four controls plus the name will not sit on one line
+ without ellipsising the name to nothing — at 260px "Ask the Devil" rendered as "Ask t…", and
+ the name is the most identifying thing in the row. Wrap the trailing controls instead. */
+ @container (max-width: 18rem) {
+ .pact__row { grid-template-columns: auto 1fr; }
+ /* justify-self keeps the wrapped controls at their natural width — without it Remove
+ stretches to fill the 1fr track and reads as a primary action. */
+ .pact__row > :nth-child(n + 3) { grid-column: span 1; justify-self: start; }
+ }
+
+ .pact__name, .trick__row input { min-width: 0; }
+ .pact__name {
+ font-family: var(--ddd-font-display); font-size: var(--ddd-size-entry); color: var(--ddd-deep);
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
+ }
+ .trick__text, .pact__text { font-size: var(--ddd-size-body-sm); line-height: 1.45; }
+ /* A