CAST SKY: unify w. My Sky — inline --duoUser felt + scroll-snap wheel, gear NVM, burger reopen glow — TDD

Replaces the root-level dark Gaussian CAST SKY modal with the my_sky / sky.html
apparatus, mirroring the Sig Select unify (71c0069). Sky data stays seat-bound
(Character.seat), never a pos-circle.

- room.html: the sky overlay moves INTO .room-hex-pane on --duoUser felt
  (has-sky-stage), my_sea-style; rendered through the confirmed state too so
  the burger can reopen the saved wheel. Sky tooltips stay at root.
- _sky_overlay.html: drops .sky-backdrop / .sky-modal-wrap / .sky-modal / header
  + the in-felt NVM; reuses the shared .sky-page form/wheel (.sky-page--room).
  No live preview — the wheel only paints after SAVE SKY (my_sky parity); SAVE
  adds body.sky-saved → the felt flips to scroll-snap (form shunts to page 2,
  ease to the wheel on page 1). saved_sky_json primes the reopen draw. Inert
  STUB hook for the post-character-creation form lock (roadmap step 21).
- _sky.scss: in-room felt fill + open/close (html.sky-open); hides the position
  strip while the felt is up for a clean homogeneous surface.
- _room.scss: html.sky-open pins .room-aperture.is-scrollable (overflow hidden,
  snap none) so the ATLAS/SCROLL/YARN/POST/PULSE reelhouse is unreachable while
  casting; restored the instant the felt closes.
- _room_gear.html + room-views.js: NVM moves into a new .room-menu-sky gear pane
  (→ epic:room, which re-renders DRAW SEA if saved else CAST SKY); syncGear()
  shows it while sky-open.
- _burger.html + _burger.scss + burger-btn.js: the Sky sub-btn goes .active once
  saved (sky_btn_active = sky_confirmed) — concurrent w. a thrice --priTk burger
  pulse (.sky-saved-glow, rhymes w. .flash-inactive); an active click reopens
  the wheel via window.openSkyFelt.
- epic/views.py: sky_btn_active + saved_sky_json ctx off the seat's confirmed
  Character; the acting gamer's WS auto-reload is dropped (SAVE reveals the
  wheel in place; the gear NVM does the nav to DRAW SEA).
- Tests: PickSkyUnifiedFeltTest + PickSeaRenderingTest ITs (930 epic+gameboard
  green); BurgerSpec sky-glow/reopen Jasmine (full suite green); PickSky
  LocalStorageTest + PickSkyDelTest FTs reworked to the post-save flow.

[[project-deck-segment-model]] [[feedback-scss-import-order-specificity]]

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Disco DeDisco
2026-06-07 16:54:33 -04:00
parent 75301ca84d
commit 1f874de459
14 changed files with 665 additions and 154 deletions

View File

@@ -189,6 +189,22 @@
0 0 1.2rem 0.3rem rgba(var(--ninUser), 0.35);
}
// ── Sky-saved glow (CAST SKY → SAVE SKY) ──────────────────────────────
//
// Once the sky is saved, the burger pulses thrice in --priTk (border + icon)
// to cue "your sky lives here now — reopen it via the Sky sub-btn". burger-
// btn.js toggles .sky-saved-glow three times (finite), in rhyme with the
// 2-pulse --priRd .flash-inactive + the voice pulse above. The Sky sub-btn's
// own .active state (real cloud icon, opacity 1) is handled by the generic
// .burger-fan-btn.active rules.
#id_burger_btn.sky-saved-glow {
color: rgba(var(--priTk), 1);
border-color: rgba(var(--priTk), 1);
box-shadow:
0 0 0.5rem 0.1rem rgba(var(--priTk), 0.75),
0 0 1.2rem 0.3rem rgba(var(--priTk), 0.35);
}
// ── Voice affordance glow + pulse (Phase 3, my-sea voice) ─────────────
//
// Distinct from the sea-btn's --priYl `.glow-handoff` draw nudge: voice uses

View File

@@ -91,6 +91,18 @@ html.sea-open #id_aperture_fill {
}
}
// While the CAST SKY felt is summoned (html.sky-open) the outer aperture must
// NOT scroll down to the reelhouse carousel (ATLAS/SCROLL/YARN/POST/PULSE) —
// the felt's OWN form↔wheel scroll-snap (.sky-page--room) is the only scroll
// in play. Pin the aperture to the hex pane (which the felt fills); restored
// the instant the felt closes (sky-open removed). overflow:hidden alone leaves
// the aperture parked on whichever pane it was showing — and CAST SKY is only
// reachable from the hex pane, so it pins to the hex every time.
html.sky-open .room-aperture.is-scrollable {
overflow-y: hidden;
scroll-snap-type: none;
}
.room-scroll-pane {
display: flex;
flex-direction: column;

View File

@@ -13,6 +13,41 @@ html.sky-open {
#id_aperture_fill { opacity: 1; }
}
// ── In-room CAST SKY felt (unified with my_sky / sky.html) ────────────────────
// The .sky-page apparatus rendered INSIDE .room-hex-pane (my_sea-style, like
// .sig-overlay) instead of the old fixed dark modal. The hex pane becomes a
// positioning context only while the felt shows, so the absolute-filling felt
// scopes to the pane (not the viewport) and the position-strip's root stacking
// stays untouched in every other phase. Hidden until the CAST SKY btn adds
// html.sky-open; reuses every dashboard .sky-page form/wheel rule below.
.room-hex-pane.has-sky-stage {
position: relative;
}
.sky-page--room {
position: absolute;
inset: 0;
// Within the hex-pane stacking context (matches .sig-overlay's z:5), above
// the hex/seats it covers but below the root-level position strip (z-130).
z-index: 5;
// Hidden until opened — pointer-events off so the hidden felt can't eat the
// CAST SKY btn click beneath it.
visibility: hidden;
pointer-events: none;
}
html.sky-open .sky-page--room {
visibility: visible;
pointer-events: auto;
}
// While the felt is up, hide the position strip (a z-130 hex-pane sibling that
// would otherwise float its circles over the form) so the felt reads as a clean
// homogeneous surface — restored the instant the felt closes.
html.sky-open .position-strip {
visibility: hidden;
}
// ── Backdrop ──────────────────────────────────────────────────────────────────
.sky-backdrop {