houserules/packages/chess/src
Joey Yakimowich-Payne 31af101b55
feat(ui): multi-profile stacking in lobby
T3 Wave 4 (T27). Lobby now supports stacking multiple modifier
profiles for solo play. The primary picker stays single-select for
backwards compatibility with multiplayer create/join (which sends
exactly one ModifierProfile on the wire today); a 'Stacked (solo
only)' list below it lets the user append additional profiles, with
up/down reorder and remove buttons per entry.

State:
- additionalProfiles: ModifierProfile[] holds the stack-on-top
  entries. Empty by default; appears in the UI only when the primary
  picker has a selection.

resetToFreshGame branches:
- 0 or 1 profile total → unchanged single-profile fast path through
  EngineOptions.profile (preserves T1/T2 behaviour exactly).
- 2+ profiles → constructs a profile-less engine, then runs
  applyProfilesToSession across the full ordered stack so additive
  contributions compose correctly across profiles. Sets activeProfile
  to the LAST entry as a UI-display canonical (header badge etc.).

UI:
- Primary picker unchanged.
- profile-stack list with data-testids profile-stack, profile-stack-{i},
  profile-stack-{i}-up/down/remove for e2e access.
- profile-stack-add dropdown filters out already-selected ids.

Multiplayer wire shape unchanged — sending the stack to the server is
a future T27 extension that would touch the protocol.

E2E for the new stacking UI defers to T29; existing 9/9 solo-smoke
+ all 1378 unit tests pass.
2026-04-19 20:22:58 -06:00
..
app fix(chess): use ref-based guard for shared-link auto-join to prevent StrictMode double-join 2026-04-18 16:26:35 -06:00
assets fix(chess): cylindrical board wraps every piece, plus eliminate piece image flash 2026-04-17 15:17:57 -06:00
hooks feat(ui): consent dialog for modifier profile proposals 2026-04-19 09:43:12 -06:00
layouts refactor(chess): unregister Empty layout — keep as internal fixture only 2026-04-18 20:39:08 -06:00
modifiers feat(ui): custom modifier editor 2026-04-19 20:17:33 -06:00
net refactor(net): type listener table as mapped type, drop double-casts 2026-04-19 16:48:35 -06:00
persist feat(chess): custom-layout editor + saved library (Phase E) 2026-04-18 20:20:41 -06:00
presets feat(engine): add transformMoveGenerator + modifyMoveAttrs preset hooks 2026-04-18 22:08:11 -06:00
rules chore: resolve stash merge conflicts + stage sliding.ts range-bonus changes 2026-04-18 22:59:03 -06:00
ui feat(ui): multi-profile stacking in lobby 2026-04-19 20:22:58 -06:00
audio.ts feat(chess): polish UI with SVG pieces, motion animations, sound, and confetti 2026-04-17 12:04:56 -06:00
coord.test.ts feat(chess): add coordinate + color helpers (P2.7) 2026-04-16 14:47:04 -06:00
coord.ts feat(chess): add coordinate + color helpers (P2.7) 2026-04-16 14:47:04 -06:00
engine-presets.test.ts feat(chess): starting-layout foundation (Phase A) 2026-04-18 19:44:01 -06:00
engine.ts feat(engine): apply custom modifier descriptors + multi-profile stacking 2026-04-19 18:12:19 -06:00
index.ts feat(server): modifier-profile.update WS handler 2026-04-18 23:11:21 -06:00
pgn.ts test(chess): replay 5 classic FIDE games; Phase 2 acceptance gate (P2.23) 2026-04-16 15:18:57 -06:00
schema.test.ts feat(chess): add attribute schema and piece fact shape (P2.5) 2026-04-16 14:46:27 -06:00
schema.ts feat(engine): aura effect computation + onAfterMove hook 2026-04-19 20:05:38 -06:00
starting-position.test.ts feat(chess): starting-layout foundation (Phase A) 2026-04-18 19:44:01 -06:00
starting-position.ts feat(chess): starting-layout foundation (Phase A) 2026-04-18 19:44:01 -06:00
vite-env.d.ts feat(chess): polish UI with SVG pieces, motion animations, sound, and confetti 2026-04-17 12:04:56 -06:00