Show the build, play from the keyboard, and clean up the ledger
Five things from the second playtest. A status line at the top of every screen: the game, the pack, your current title, and the version plus the commit it came from. `tools/stamp.js` writes the commit into src/build-info.js before serving and before building, so a distributed dist/theladder.html states exactly which commit produced it. An uncommitted working tree gets a `+` suffix — "4cab9fc+" is honest in a way a bare SHA would not be. The whole game is now playable on Enter. Every screen marks one control and the app focuses it after each render: the first *available* option while choosing, the next-turn button once the result is in, "keep going" on the retrospective. Tab and Shift+Tab reach the other options. Locked options needed no special handling — the browser's tab order already skips disabled controls, so they stay visible without being in the way. "What is notable? under What changed?" — two fixes. `notable` is the retrospective's own list of moments; a display rule can now say `inLedger: false` and it is left out, because "Notable — changed" tells nobody anything. Flags are the opposite and stay, but as sentences the pack supplies rather than as booleans: "The envelope is in your locker." instead of "the envelope: now true". Exported logs live in logs/, gitignored, and `npm run analyze` reads the newest one there when given no argument. A log records what a real person did turn by turn, including whatever they typed into the feedback box — committing one once would put it in the history for good. Version set to 0.3.0 on the reasoning that the engine was 0.1 and the interface 0.2; say if you want a different scheme and I will renumber. 119 tests. Reasoning in docs/DECISIONS.md §25-28. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VMSFHyVPitUoosW5wyEADj
This commit is contained in:
co-authored by
Claude Opus 5
parent
4cab9fc41e
commit
76072edf4e
@@ -51,6 +51,24 @@ body {
|
||||
}
|
||||
|
||||
.app { max-width: 1080px; margin: 0 auto; padding: 24px 20px 48px; }
|
||||
|
||||
/* ---------- status bar ---------- */
|
||||
|
||||
.statusbar {
|
||||
display: flex; flex-wrap: wrap; gap: 8px 16px;
|
||||
align-items: baseline; justify-content: space-between;
|
||||
margin-bottom: 18px; padding-bottom: 10px;
|
||||
border-bottom: 1px solid var(--rule);
|
||||
font-size: 12px; letter-spacing: 0.04em;
|
||||
}
|
||||
.statusbar__what { display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; }
|
||||
.statusbar__game { font-weight: 600; color: var(--ink); }
|
||||
.statusbar__sep { color: var(--rule-strong); }
|
||||
.statusbar__pack { color: var(--ink-soft); }
|
||||
.statusbar__title { color: var(--accent); }
|
||||
.statusbar__version {
|
||||
font-variant-numeric: tabular-nums; color: var(--ink-faint); font-size: 11px;
|
||||
}
|
||||
.booting { color: var(--ink-faint); padding: 48px 20px; text-align: center; }
|
||||
|
||||
/* ---------- head-up display ---------- */
|
||||
@@ -178,6 +196,9 @@ body {
|
||||
.change--up .change__delta { color: var(--up); }
|
||||
.change--down .change__delta { color: var(--down); }
|
||||
.change__note { font-size: 11px; color: var(--ink-faint); font-style: italic; }
|
||||
.change--note .change__phrase { font-style: italic; }
|
||||
.change--note.change--up .change__phrase { color: var(--up); }
|
||||
.change--note.change--down .change__phrase { color: var(--ink-soft); }
|
||||
|
||||
.button--next { margin-top: 8px; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user