2026-03-15 01:17:09 -04:00
|
|
|
#id_kit_btn {
|
|
|
|
|
position: fixed;
|
|
|
|
|
bottom: 0.5rem;
|
|
|
|
|
right: 0.5rem;
|
2026-03-23 01:06:14 -04:00
|
|
|
|
2026-04-06 01:30:31 -04:00
|
|
|
@media (orientation: landscape) {
|
2026-04-06 03:02:37 -04:00
|
|
|
right: 1rem;
|
2026-04-05 23:02:32 -04:00
|
|
|
bottom: 0.5rem;
|
2026-03-23 01:06:14 -04:00
|
|
|
top: auto;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-06 01:41:18 -04:00
|
|
|
@media (orientation: landscape) and (min-width: 1800px) {
|
|
|
|
|
right: 2.5rem; // centre in doubled 8rem sidebar
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-28 18:52:46 -04:00
|
|
|
z-index: 318;
|
2026-03-15 01:17:09 -04:00
|
|
|
font-size: 1.75rem;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
color: rgba(var(--secUser), 1);
|
|
|
|
|
display: inline-flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: center;
|
|
|
|
|
width: 3rem;
|
|
|
|
|
height: 3rem;
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
background-color: rgba(var(--priUser), 1);
|
|
|
|
|
border: 0.15rem solid rgba(var(--secUser), 1);
|
|
|
|
|
|
|
|
|
|
&.active {
|
|
|
|
|
color: rgba(var(--quaUser), 1);
|
|
|
|
|
border-color: rgba(var(--quaUser), 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#id_kit_bag_dialog {
|
|
|
|
|
// Override dialog's native display:none so we can drive visibility via max-height
|
|
|
|
|
display: block !important;
|
|
|
|
|
position: fixed;
|
|
|
|
|
bottom: 0;
|
|
|
|
|
left: 0;
|
|
|
|
|
right: 0;
|
|
|
|
|
width: 100%;
|
|
|
|
|
max-width: none;
|
|
|
|
|
margin: 0;
|
|
|
|
|
padding: 0;
|
|
|
|
|
border: none;
|
2026-03-30 18:31:05 -04:00
|
|
|
border-top: 0.1rem solid rgba(var(--quaUser), 1);
|
2026-03-15 01:17:09 -04:00
|
|
|
background: rgba(var(--priUser), 0.97);
|
2026-03-28 18:52:46 -04:00
|
|
|
z-index: 316;
|
2026-03-15 01:17:09 -04:00
|
|
|
overflow: hidden;
|
2026-03-23 01:06:14 -04:00
|
|
|
|
2026-04-06 01:30:31 -04:00
|
|
|
@media (orientation: landscape) {
|
2026-03-23 19:50:08 -04:00
|
|
|
$sidebar-w: 4rem;
|
|
|
|
|
// left: $sidebar-w;
|
|
|
|
|
right: $sidebar-w;
|
2026-03-28 18:52:46 -04:00
|
|
|
z-index: 316;
|
2026-03-23 01:06:14 -04:00
|
|
|
}
|
2026-03-15 01:17:09 -04:00
|
|
|
// Closed state
|
|
|
|
|
max-height: 0;
|
|
|
|
|
visibility: hidden;
|
|
|
|
|
transition: max-height 0.25s ease-out, visibility 0s 0.25s;
|
|
|
|
|
|
|
|
|
|
&[open] {
|
|
|
|
|
max-height: 5rem;
|
|
|
|
|
visibility: visible;
|
|
|
|
|
transition: max-height 0.25s ease-out, visibility 0s;
|
|
|
|
|
display: flex !important;
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
gap: 1.5rem;
|
|
|
|
|
align-items: center;
|
|
|
|
|
padding: 0.4rem 1rem;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.kit-bag-section {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
align-items: center;
|
|
|
|
|
gap: 0.5rem;
|
|
|
|
|
flex-shrink: 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.kit-bag-label {
|
|
|
|
|
font-size: 0.55rem;
|
|
|
|
|
text-transform: uppercase;
|
2026-03-15 16:39:14 -04:00
|
|
|
text-decoration: underline;
|
2026-03-15 01:17:09 -04:00
|
|
|
letter-spacing: 0.12em;
|
2026-03-30 18:31:05 -04:00
|
|
|
color: rgba(var(--quaUser), 0.75);
|
2026-03-15 01:17:09 -04:00
|
|
|
writing-mode: vertical-rl;
|
|
|
|
|
text-orientation: mixed;
|
|
|
|
|
transform: rotate(180deg);
|
2026-03-15 16:39:14 -04:00
|
|
|
padding: 0 0.25rem 0 0.5rem;
|
2026-03-15 01:17:09 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.kit-bag-row {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: row;
|
2026-03-15 16:39:14 -04:00
|
|
|
gap: 0.75rem;
|
2026-03-15 01:17:09 -04:00
|
|
|
}
|
|
|
|
|
|
2026-03-15 16:39:14 -04:00
|
|
|
#id_kit_bag_dialog {
|
|
|
|
|
.token {
|
|
|
|
|
font-size: 1.5rem;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
transition: filter 0.15s;
|
|
|
|
|
padding: 0 0.125rem;
|
2026-03-15 01:17:09 -04:00
|
|
|
|
2026-04-15 22:16:50 -04:00
|
|
|
&:hover .token-tooltip,
|
|
|
|
|
&:hover .tt { display: none; } // JS positions these as fixed
|
2026-03-15 01:17:09 -04:00
|
|
|
}
|
|
|
|
|
|
2026-04-15 22:16:50 -04:00
|
|
|
.token-tooltip,
|
|
|
|
|
.tt {
|
2026-03-15 16:39:14 -04:00
|
|
|
z-index: 9999;
|
2026-04-16 00:14:47 -04:00
|
|
|
|
2026-04-21 15:46:30 -04:00
|
|
|
@extend %tt-token-fields;
|
2026-04-16 02:36:24 -04:00
|
|
|
|
2026-04-16 00:14:47 -04:00
|
|
|
// Buttons positioned on left edge of the fixed inline tooltip
|
|
|
|
|
.tt-equip-btns {
|
|
|
|
|
position: absolute;
|
|
|
|
|
left: -1rem;
|
|
|
|
|
top: 0;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
gap: 1.25rem;
|
|
|
|
|
z-index: 1;
|
|
|
|
|
|
|
|
|
|
.btn { margin: 0; }
|
|
|
|
|
}
|
2026-03-15 01:17:09 -04:00
|
|
|
}
|
2026-03-24 23:18:04 -04:00
|
|
|
|
|
|
|
|
.kit-bag-deck {
|
|
|
|
|
font-size: 1.5rem;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
padding: 0 0.125rem;
|
2026-03-28 18:52:46 -04:00
|
|
|
color: rgba(var(--terUser), 1);
|
2026-03-24 23:18:04 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.kit-bag-placeholder {
|
|
|
|
|
font-size: 1.5rem;
|
|
|
|
|
padding: 0 0.125rem;
|
2026-03-30 18:31:05 -04:00
|
|
|
color: rgba(var(--quaUser), 0.3);
|
2026-03-24 23:18:04 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.kit-bag-section--tokens {
|
|
|
|
|
flex: 1;
|
|
|
|
|
min-width: 0;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.kit-bag-row--scroll {
|
|
|
|
|
overflow-x: auto;
|
|
|
|
|
flex-wrap: nowrap;
|
|
|
|
|
scrollbar-width: none;
|
|
|
|
|
&::-webkit-scrollbar { display: none; }
|
2026-03-15 01:17:09 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.kit-bag-empty {
|
|
|
|
|
font-size: 0.7rem;
|
|
|
|
|
color: rgba(var(--secUser), 0.4);
|
|
|
|
|
}
|
2026-03-24 22:57:12 -04:00
|
|
|
|
|
|
|
|
// ── Game Kit page ────────────────────────────────────────────────────────────
|
|
|
|
|
|
2026-04-05 17:23:51 -04:00
|
|
|
#id_game_kit_applets_container {
|
|
|
|
|
flex: 1;
|
|
|
|
|
min-height: 0;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-24 22:57:12 -04:00
|
|
|
#id_game_kit_applets_container section {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
|
|
|
|
h2 { flex-shrink: 0; }
|
|
|
|
|
.gk-items { flex: 1; overflow-y: auto; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.gk-items {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: row;
|
|
|
|
|
flex-wrap: wrap;
|
|
|
|
|
gap: 1rem;
|
|
|
|
|
align-items: center;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.gk-deck-card,
|
|
|
|
|
.gk-trinket-card,
|
pronouns: per-user pronouns ideology + Pronouns applet on Game Kit; provenance prose uses actor.pronouns at render time — TDD
- User.pronouns CharField w. choices=[pluralism (default), bawlmorese, misogyny, misandry, misanthropy] + pronoun_subj/obj/poss properties; PRONOUN_TABLE single source of truth in apps.lyric.models; mig 0002_user_pronouns
- drama.GameEvent.to_prose() drops module-level PRONOUN_* constants; SIG_READY/SIG_UNREADY/ROLE_SELECTED now resolve poss/subj from self.actor.pronouns at render time, so flipping a user's preference rewrites all their existing scroll prose; default actor → "their"
- SIG_READY prose strips a leading "The " from card_name so "the The Wanderer" reads "the Wanderer" and "the Engraven The Nomad" reads "the Engraven Nomad"; minor arcana ("Maid of Brands") untouched
- new applets/0005 seeds 'pronouns' applet (3x3, game-kit, default visible); _game_kit_sections.html grows a #id_gk_pronouns block w. 5 .gk-pronoun-card items labeled by ideology slug (italic) and tagged data-pronoun + data-trio
- card click → window.showGuard(card, "Set pronoun preference?<span class='guard-pronoun-trio'>{trio}</span>", commitCb); on OK fetches POST /dashboard/set-pronouns w. CSRF cookie + reloads so .active class moves and provenance prose re-renders; NVM dismisses
- dashboard.set_pronouns view (POST-only, login_required, 204/400/405) at /dashboard/set-pronouns; rejects choices not in PRONOUN_TABLE
- _game-kit.scss extends shared card rule to .gk-pronoun-card w. .active fill state + italic ideology label; #id_guard_portal .guard-pronoun-trio styled small/dim/centered under the question
- billscroll aperture: padding-right 0.75rem on #id_drama_scroll inside .applet-scroll so the timestamp column no longer sits beneath the scrollbar
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 01:11:40 -04:00
|
|
|
.gk-token-card,
|
|
|
|
|
.gk-pronoun-card {
|
2026-03-24 22:57:12 -04:00
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
align-items: center;
|
|
|
|
|
gap: 0.4rem;
|
|
|
|
|
padding: 0.75rem 1rem;
|
|
|
|
|
border-radius: 0.5rem;
|
|
|
|
|
border: 0.1rem solid rgba(var(--secUser), 0.3);
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
font-size: 1.5rem;
|
|
|
|
|
min-width: 6rem;
|
|
|
|
|
text-align: center;
|
|
|
|
|
transition: border-color 0.15s;
|
|
|
|
|
|
|
|
|
|
span { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.08em; }
|
|
|
|
|
small { font-size: 0.6rem; opacity: 0.5; }
|
|
|
|
|
|
|
|
|
|
&:hover { border-color: rgba(var(--secUser), 0.8); }
|
|
|
|
|
}
|
|
|
|
|
|
pronouns: per-user pronouns ideology + Pronouns applet on Game Kit; provenance prose uses actor.pronouns at render time — TDD
- User.pronouns CharField w. choices=[pluralism (default), bawlmorese, misogyny, misandry, misanthropy] + pronoun_subj/obj/poss properties; PRONOUN_TABLE single source of truth in apps.lyric.models; mig 0002_user_pronouns
- drama.GameEvent.to_prose() drops module-level PRONOUN_* constants; SIG_READY/SIG_UNREADY/ROLE_SELECTED now resolve poss/subj from self.actor.pronouns at render time, so flipping a user's preference rewrites all their existing scroll prose; default actor → "their"
- SIG_READY prose strips a leading "The " from card_name so "the The Wanderer" reads "the Wanderer" and "the Engraven The Nomad" reads "the Engraven Nomad"; minor arcana ("Maid of Brands") untouched
- new applets/0005 seeds 'pronouns' applet (3x3, game-kit, default visible); _game_kit_sections.html grows a #id_gk_pronouns block w. 5 .gk-pronoun-card items labeled by ideology slug (italic) and tagged data-pronoun + data-trio
- card click → window.showGuard(card, "Set pronoun preference?<span class='guard-pronoun-trio'>{trio}</span>", commitCb); on OK fetches POST /dashboard/set-pronouns w. CSRF cookie + reloads so .active class moves and provenance prose re-renders; NVM dismisses
- dashboard.set_pronouns view (POST-only, login_required, 204/400/405) at /dashboard/set-pronouns; rejects choices not in PRONOUN_TABLE
- _game-kit.scss extends shared card rule to .gk-pronoun-card w. .active fill state + italic ideology label; #id_guard_portal .guard-pronoun-trio styled small/dim/centered under the question
- billscroll aperture: padding-right 0.75rem on #id_drama_scroll inside .applet-scroll so the timestamp column no longer sits beneath the scrollbar
Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 01:11:40 -04:00
|
|
|
.gk-pronoun-card {
|
|
|
|
|
// Card shows the ideology slug (pluralism, bawlmorese, …) in italic;
|
|
|
|
|
// the guard portal previews the actual slash trio above OK|NVM via JS.
|
|
|
|
|
// Active card is filled with the secondary tint so the user can see at a
|
|
|
|
|
// glance which preference is currently in effect.
|
|
|
|
|
.gk-pronoun-label {
|
|
|
|
|
font-size: 0.85rem;
|
|
|
|
|
letter-spacing: 0.05em;
|
|
|
|
|
text-transform: lowercase;
|
|
|
|
|
font-style: italic;
|
|
|
|
|
}
|
|
|
|
|
&.active {
|
|
|
|
|
border-color: rgba(var(--secUser), 1);
|
|
|
|
|
background: rgba(var(--secUser), 0.18);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#id_guard_portal .guard-pronoun-trio {
|
|
|
|
|
display: block;
|
|
|
|
|
margin-top: 0.25rem;
|
|
|
|
|
font-size: 0.75rem;
|
|
|
|
|
letter-spacing: 0.06em;
|
|
|
|
|
opacity: 0.75;
|
|
|
|
|
text-align: center;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-24 22:57:12 -04:00
|
|
|
.gk-placeholder {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
align-items: center;
|
|
|
|
|
gap: 0.4rem;
|
|
|
|
|
padding: 0.75rem 1rem;
|
|
|
|
|
border-radius: 0.5rem;
|
|
|
|
|
border: 0.1rem dashed rgba(var(--secUser), 0.2);
|
|
|
|
|
font-size: 1.5rem;
|
|
|
|
|
min-width: 6rem;
|
|
|
|
|
text-align: center;
|
|
|
|
|
opacity: 0.4;
|
|
|
|
|
|
|
|
|
|
span { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.08em; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.gk-empty {
|
|
|
|
|
font-size: 0.8rem;
|
|
|
|
|
opacity: 0.45;
|
|
|
|
|
}
|
|
|
|
|
|