Skip to content

eqosys menus: a game injects its skin once and every shared surface wears it, hill climb to 8/10, rounds 3+ (from #3541) #3549

Closed

Description

@QuinnsCode

Score: 7.5/10 (target 8), after round 2 (PR #3540; main was 1/10, round 1 7/10). Moved up from #3541: its round 2 comment has the shots and the Next list.

The owner's brief (2026-11-04): every game should be able to inject its own style into the eqosys menus. Today the shared sign-in client (packages/util/src/eqosys.ts) renders nothing, but the pieces games mount from it do, each in its own way: the report button (packages/util/src/report.ts) carries hard-coded inline cssText (grey border, white background, system font) that looks the same in a space-marine war room and a druid's tome; the spaces panel (spaces.ts) and lobby (lobby.ts) leave skinning to the page, so each game has its own account box (apps/*/src/account.ts, Two Fronts's account box in main.ts). The house kit (packages/ui) already re-themes by CSS custom properties (applyTheme, TOKENS), and packages/game-controls/src/skins.ts has classic / house skins with installStyles.

Goalpost

One way for a game to say "here is my skin" once, and every eqosys-rendered surface in that game wears it: sign-in / account chip, achievement toast, report button and form, party and spaces panels, lobby. Scored out of 10 by an agent judge against:

  1. One injection point. eqosys({ app, url, from, prefix, skin }) (or a sibling skinEqosys(...)) takes a Theme of --ui-* tokens plus optional extra CSS, and every shared surface reads tokens from packages/ui instead of hard-coded colours. No per-surface styling API.
  2. No hard-coded colours or fonts left in report.ts, spaces.ts, lobby.ts, and the achievement toast: every colour, radius, border and font is a --ui-* token with a house default.
  3. Three games wear it. Two Fronts (distressed metal: --imperial fonts, brass on dark steel, square corners), Mythic Masters (tome: parchment, ink, Covered By Your Grace for the Book's hand; look at apps/mythic-masters/src/tome.css), Skate Tech Park (stay minimal: the house skin). Each injects its skin in its eqosys.ts and deletes any duplicate styling of those surfaces from its own CSS.
  4. Cut before you add. The per-game account boxes that do the same thing (apps/*/src/account.ts) share one accountChip(...) in packages/util that the skin styles; copies die in the same PR.
  5. One journey test per touched game still passes (eqosys.test.ts), plus one test that a skin's tokens land on the mounted surfaces (eval the computed style, don't assert on source text).

The loop

Each round is one PR against main that says "Part of #N". Score it with bun run probe <app> --shot on each game's sign-in chip, report form and achievement toast, side by side. End the round with a comment here starting Score: x/10 (target 8) and ending Next: ..., then open the "rounds N+" issue and close this one with "Moved up to #new".

Why first: the per-game artwork climbs (Two Fronts distressed metal, Mythic Masters tome) hang their menu skins on this hook.

Round 3 starts here

  • Move the remaining sign-in boxes to accountChip and delete the copies: Delayed Reaction, Splat Spray, Git Recon, Park Hide & Seek, the Hippo Tycoon and Splat Rooms Account.tsx, and Mythic's settings Account pane.
  • Build the Mythic and Skate skins from their own CSS variables, not copied hex values.
  • A probe journey that checks a real game's skin on the mounted chip and toast.
  • On a phone, keep the open report form clear of the title buttons.

Activity

  1. self-assigned this
    on Nov 5, 2026
  2. QuinnsCode commented on Nov 5, 2026

    @QuinnsCode
    OwnerAuthor

    Score: 7/10 (target 8)

    Round 3 grew the same PR, #3540. A fresh agent judge scored it. Round 2's judge gave 7.5, so the two disagree by half a point and this one was stricter on journeys. Agent judges run about 2 points above the owner.

    What landed:

    • Rebased onto tonight's six menu PRs. The only conflict was the Two Fronts .account rule beside the new warship plates.
    • The skins read each game's own CSS variables (--plate, --brass; --paper, --ink-b, --blood; --paper, --ink, --hot) instead of copied hex values.
    • Delayed Reaction is on accountChip with its own skin, and its account CSS is gone. Six account-box copies are now deleted.
    • apps/two-fronts/test/eqosys-skin.test.ts boots the real game signed in and checks the chip, report form and toast against its real skin.
    • Skate's lobby box takes its font and colour from the skin, no longer from the room label's rule.
    • The PR body has the three lines a game adds to inject its skin. The hook's API is unchanged for the five menu climbs waiting on it.

    Judge's shares: injection 2/2, no hard-coded looks 2/2, three games 1.5/2, account chip 1.5/2, tests 1.5/2.

    Shots: desktop and phone, signed in as a test player, report form open and toast up.

    main round 3 round 3, phone
    Two Fronts
    Mythic Masters
    Skate Tech Park
    Delayed Reaction

    Next:

    • Put Mythic's settings-pane account row (accountPane in main.ts) on accountChip. The game-controls .gc-craft .gc-acct button rule has to give way to .eq-btn (packages/game-controls/src/skins.ts).
    • Add a real-game skin journey for Mythic (computed parchment and hand font) and one for Skate's lobby and spaces, like the Two Fronts one.
    • On a phone, make the open report form a bottom sheet that doesn't sit over the game's menu.
    • The Two Fronts header wraps its title beside the chip since the warship-plates redesign. Fit them together with the Two Fronts menu climb (Two Fronts: menus as a warship's distressed-metal plates (Thunder Marines first), hill climb to 8/10, rounds 2+ (from #3531) #3546).
  3. QuinnsCode commented on Nov 5, 2026

    @QuinnsCode
    OwnerAuthor

    Moved up to #3570

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions