Skip to content

design: Constellation phase B - The Sky of rooms#65

Merged
knzeng-e merged 3 commits into
design/constellation-phase-afrom
design/constellation-phase-b
Jul 5, 2026
Merged

design: Constellation phase B - The Sky of rooms#65
knzeng-e merged 3 commits into
design/constellation-phase-afrom
design/constellation-phase-b

Conversation

@knzeng-e

@knzeng-e knzeng-e commented Jul 4, 2026

Copy link
Copy Markdown
Owner

Constellation phase B: The Sky of rooms

Second phase of the Constellation design track (ticket 19, spec in
docs/design/dotify-constellation-ux.md). Stacked on
design/constellation-phase-a (#64); merge that first.

What this does

RoomsView gains its hero effect: open rooms as dot-spheres in the navy
sky
, rendered above the existing board when rooms exist.

  • The sphere: core is the current track's cover, halo is its real aura
    (auraForTrack), sized by the real presence count. Layout is a
    deterministic golden-angle spiral with roomId-hashed jitter: organic to the
    eye, stable for a given set of rooms.
  • Honest pulse: the halo breathes only when the host's broadcast
    playerState.playing is genuinely true.
  • Presence petals: one light petal orbits per genuinely connected presence
    (visual cap at 10; the true count is always printed on the label).
  • Embers: rooms with no track loaded are small and unlit, present but dark.
  • Honest preview tag: playbackMode: 'preview' shows an amber tag (the
    host has not unlocked the track).
  • Joining = entering the halo: on click the sphere grows and its light
    floods for 420 ms before onJoinRoom fires (immediately under reduced
    motion), landing in the immersive player where applyAura takes over. The
    transition tells the product story: you step into someone's light.

Engineering decisions

  • DOM + CSS, no OGL. The plan allowed one lazy OGL canvas; the prototype
    showed DOM/CSS covers the visual completely at realistic room counts (tens
    of points), so the dependency and single-file Bulletin bundle weight were
    not justified. Recorded in the design doc, with OGL kept as the escape hatch
    for a future filament/hundreds-of-points sky.
  • Fallback doctrine: on mobile and prefers-reduced-motion the sky is
    hidden entirely; the card grid below is the complete experience, untouched.
  • e2e safety: the room-join specs drive everything through the player and
    share links, never the rooms list; the sky uses its own sky-* testids.

Verification

tsc clean, lint 0 errors (3 pre-existing warnings), build, fmt:check, 72 unit
tests, 10/10 Playwright e2e. Visually verified live: seeded dev server +
signaling, host page creates a room, viewer page screenshots the sky (sphere +
halo + orbiting petal + honest preview tag) and the join flood mid-transition.

🤖 Generated with Claude Code

knzeng-e and others added 2 commits July 4, 2026 15:00
Add the Rooms view's hero effect from the Constellation direction: open rooms
as dot-spheres in the navy sky. Each sphere has the current track's cover as
its core and its real aura as a halo, laid out on a deterministic golden-angle
spiral (roomId-hashed jitter so the sky never looks mechanical while staying
stable). One light petal orbits per genuinely connected presence (visual cap
10, true count always printed on the label); the halo breathes only when the
host's broadcast playerState.playing is true; rooms with no track loaded are
embers; playbackMode 'preview' shows an honest amber tag. Joining is entering
the halo: the sphere grows and its light floods for 420 ms before onJoinRoom
fires (immediate under reduced motion).

DOM + CSS only, no OGL: at realistic room counts (tens of points) the
dependency and single-file Bulletin bundle weight were not justified; the
decision is recorded in the design doc with OGL kept as the escape hatch. On
mobile and prefers-reduced-motion the sky is hidden and the existing card grid
below remains the complete experience. The e2e room-join flow never touches
the rooms list, and the sky uses its own sky-* testids.

Verified: tsc clean, lint 0 errors, build, fmt:check, 72 unit tests, 10/10
Playwright e2e, plus live two-page visual checks (host creates a room via the
seeded dev server + signaling; viewer screenshots the sky, hover state, and
the join flood).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Add the four cross-surface micro-moments from the Constellation direction, all
keyed off real state (no status-string matching for triggers):

- Dot birth (components/DotBirth.tsx): the single loading vocabulary.
  Scattered particles converge into a lit sphere, three sizes, colored by the
  ambient aura variables. Wired to the catalog's genuine loading state in
  ListenView; terminal states (empty registry, failures) stay plain text.
- Unlock ritual (PlayerView): when the selected track's real access flips from
  needed to granted (access-map transition tracked per track id), a ring of
  aura light travels the cover once (1.3s). Paying an artist is the product's
  most important moment; it gets the most care.
- Reaction petals: the room reaction emojis now rise inside aura-tinted petals
  (CSS-only change to .room-reaction; markup untouched).
- Into orbit (ArtistConsole + ReleasesTab): when a new release id appears in
  the artist's on-chain catalog while the console is open (structural id diff;
  the first observation only seeds the known set, so nothing animates on
  mount), its card plays a one-shot arrival glow.

Reduced motion gets static dignity everywhere: particles hidden with a static
core, near-instant ritual, fade-only reactions, no arrival motion. No new
dependencies, no WebGL.

Verified: tsc clean, lint 0 errors, build, fmt:check, 72 unit tests, 10/10
Playwright e2e, plus a mid-flight screenshot of the unlock ritual (ring
crossing the cover) on the seeded classic-unlock flow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
design: Constellation phase C - micro-moments
@knzeng-e
knzeng-e merged commit 9617616 into design/constellation-phase-a Jul 5, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant