Skip to content

feat(deck): smaller icon-style titles, pure-black tiles, reversed layout option, tab-bar label parity - #590

Merged
danshapiro merged 14 commits into
mainfrom
feat/deck-render-refinements
Jul 31, 2026
Merged

feat(deck): smaller icon-style titles, pure-black tiles, reversed layout option, tab-bar label parity#590
danshapiro merged 14 commits into
mainfrom
feat/deck-render-refinements

Conversation

@danshapiro

Copy link
Copy Markdown
Owner

Deck rendering refinements (follow-up to #576/#580/#585). Client-only.

  • Icons-style tab titles reduced 16px → 14px (new ICONS_TITLE_FONT_SIZE; classic preview style stays pinned at 16px); letter-spacing retained, fit/truncation math updated.
  • Tile interiors are now pure black (#000); the green attention fills are recomputed as the same hue composited at 50% over black (much darker), documented next to the token-mapping block. Borders/rings keep full-strength colors.
  • New key-layout setting (Settings → Stream Deck): Auto (default) / Newest first (pager top-left) / Status sorted. "Newest first" pins the pager to slot 0 on every page and fills remaining slots in reverse tab-bar order (last tab first); no attention sorting in that arrangement so positions stay muscle-memory stable. Auto resolves to newest-first on ≤6-key decks (Stream Deck Mini) and status-sorted on larger decks. Live-applies; persists client-side; virtual deck honors an explicit selection. Note: semantics are reverse tab-bar order — a drag-reordered tab bar is mirrored (documented in code).
  • Deck tiles and touch strip now show the tab bar's actual displayed label (custom title, else directory-derived default) via the same derivation the tab bar uses — never a raw "Tab N" placeholder mismatch.

Quality: TDD; plan review passed (clean round-3 verdict); independent delta review passed round 1 with zero blockers (hand-verified mirror-image press math, paging, color math, persistence round-trips); client suite fully green (431 files / 4,718 tests); dial reversed-cycling behavior pinned by test after final review. Two pre-existing server-side timing flakes observed in full runs, each passing in isolation (known-flake follow-up noted, out of scope).

danshapiro and others added 14 commits July 30, 2026 00:43
- Task 4: correct the falsified 'typecheck fixture ripple' (defaultSettings()
  is the controller callback shape and tests sit outside tsconfig includes;
  only the StreamDeckSettings renderSection fixture needs keyLayout, at runtime)
- Task 4: name both reload-path gates (pickKeys allowlist + normalizer value
  gate) as individually load-bearing; add a reload-proxy test to Step 1
- Task 8: re-point keyLayout seeding note to the Task 6 DeckStoreOpts dispatch
- Tasks 4/5/6 + Global Constraints: document 'newest-first' = strictly reverse
  tab-bar order (tab reordering is wired via drag/keyboard/context menu and
  cross-device sync can adopt remote order); name kept deliberately
- Task 6: forbid touching deck-controller.ts before Task 7
- Task 8: document known baseline flake in the server test-coordinator
  integration test + solo-rerun disambiguation
- Self-Review Record: add Stage-2 validation addendum (2b)
…sk 6, correct e2e setupLive option name in Task 8

Independent cross-model review (fresheyes iteration 1) found two blocking
plan defects:

- Task 6 Step 1's fixture migration missed the two frame.test.ts tests
  that build inline DeckModel literals without the model(n) helper; they
  now get keyLayout: 'status-sorted' explicitly, with a grep-based
  completeness check (tests sit outside tsconfig, tsc cannot flag misses).
  Self-Review 2b's 'migration list is complete' claim removed accordingly.
- Task 8's four e2e snippets used a nonexistent setupLive option
  tabCount; the e2e harness DeckStoreOpts option is tabs (a count,
  t1..tN). Renamed in all five call sites.
…istic page-preserved outcome (page 2, key 1 -> t3) instead of a reset that cannot fire
…tTabDisplayTitle

🤖 Generated with [Amplifier](https://github.com/microsoft/amplifier)

Co-Authored-By: Amplifier <240397093+microsoft-amplifier@users.noreply.github.com>
…rted), persisted client-side

🤖 Generated with [Amplifier](https://github.com/microsoft/amplifier)

Co-Authored-By: Amplifier <240397093+microsoft-amplifier@users.noreply.github.com>
…ngeTabs, always-reserved top-left pager plan

🤖 Generated with [Amplifier](https://github.com/microsoft/amplifier)

Co-Authored-By: Amplifier <240397093+microsoft-amplifier@users.noreply.github.com>
…_FONT_SIZE import

Final whole-branch review fixes:
- Add a pin test: on the Plus under keyLayout 'newest-first', dial 0
  cycles the ARRANGED tab list ([t3, t2, t1]) — rotating +1 from active
  t3 lands on t2, not t1 (which would indicate cycling the un-arranged
  model order). Test-only; pins already-shipped handleDialRotate behavior.
- Remove the dead TITLE_FONT_SIZE import from tile-renderer.test.ts
  (all uses were converted to literals).

🤖 Generated with [Amplifier](https://github.com/microsoft/amplifier)

Co-Authored-By: Amplifier <240397093+microsoft-amplifier@users.noreply.github.com>
@danshapiro
danshapiro merged commit 7f3d632 into main Jul 31, 2026
3 checks passed
@danshapiro
danshapiro deleted the feat/deck-render-refinements branch July 31, 2026 03:08
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