Skip to content

feat: sequences and playlists that know which rig they are for - #122

Merged
pyramation merged 2 commits into
mainfrom
feat/layout-aware-shows
Aug 19, 2026
Merged

feat: sequences and playlists that know which rig they are for#122
pyramation merged 2 commits into
mainfrom
feat/layout-aware-shows

Conversation

@pyramation

Copy link
Copy Markdown
Contributor

Summary

Sequences and playlists were built for the 7×7: hardcoded animation/scene lists and three presets whose steps (heart-breathe, i-heart-sf) mean nothing on a ring. Both surfaces now come from a shared registry, and each look declares what it needs rather than carrying a geometry hash — a hash answers "which rig is this?", which is the question the layout ID already answers, and it can't say the heart is meaningless on a ring.

type Fits =
  | { needs: 'any' }                              // rainbows, sweeps, breathe
  | { needs: 'grid'; cols: number; rows: number }  // heart, I♥SF
  | { needs: 'ring' }                              // Nova amber motion
  | { needs: 'layout'; ids: string[] };            // a named installation

fitsReason(fits, layout): string   // '' when it fits, else 'needs a grid' / 'needs 7×7 or larger'

Nothing is hidden: looksForLayout(layout) and showPresetsForLayout(layout, kind) return everything, fitting entries first, each carrying a reason the UI shows and dims by. An operator can still run a mismatched preset — they know more about the room than the layout does.

Filter chips (All / 7×7 / Grace / Nova) pick the rig presets are judged against, using the real generators (presets['grid-7x7'](), presets['grace-cathedral'](), presets.nova()) so there's no second description of a rig to drift. All judges against the layout actually running, from /api/config — which is what removes the baked-in 7×7 assumption.

Pre-populated in SHOW_PRESETS: generic shows (solid vibes, pride, ambient, high energy), 7×7 (heart night, SF showcase), Nova amber (amber hour, slow burn, circle, house lights, chase), and Grace (vigil, rose, playlist) — as both sequences and playlists.

Two fixes fell out of building it:

  • trans-flow / trans-breathe / trans-ring were referenced by existing sequence definitions but never registered, so those steps were silently dead. Implemented, and a test now asserts every preset step resolves to a real animation or scene, plus that the catalog and the registries never drift apart.
  • Audio defaults to energy + replace (was plasma + brighten), and the range slider track starts at #4a4a63 instead of near-background #1a1a2a so the travel is visible.

Link to Devin session: https://app.devin.ai/sessions/ec43152136134467a853ec0bbf783ea9
Requested by: @pyramation

Looks declare what they need (any / grid / ring / named layout), so sequences and playlists list everything with the entries this rig cannot show marked rather than hidden, and filter chips (All / 7x7 / Grace / Nova) judge presets against a chosen rig. Ships Nova amber and Grace shows, plus the trans looks existing sequences referenced but never had. Audio defaults to energy + replace, and the range slider track starts light enough to read.
@pyramation pyramation self-assigned this Aug 19, 2026
@devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@pyramation
pyramation merged commit 1cb594e into main Aug 19, 2026
5 checks 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