c46fc75549
Adds a single bible-voice line ("Begin where the soil is bare.") that
surfaces immediately after BeginScreen dismisses on first run and
auto-dismisses when the player makes their first plant. Closes G2
first-impression UX gap from 2026-05-09 live UAT — the post-Begin state
no longer leaves a brand-new player staring at a 4×4 grid with no
instruction.
Implementation:
- content/seasons/01-soil/ui-strings.yaml: first_run_hint key added
(recommended copy from plan; bible voice — warm, specific, contemplative)
- src/content/schemas/ui-strings.ts: UiStringsSchema extended with
first_run_hint: z.string().min(1) — MANDATORY because Zod default strip
mode silently drops unknown keys from parsed.data
- src/store/session-slice.ts: firstRunHintDismissed + dismissFirstRunHint
added (session state ONLY — NOT persisted to V1Payload, no migrations[2])
- src/ui/first-run/FirstRunHint.tsx: subscribes to tiles slice, dismisses
on first plant !== null transition; renders externalized line via
uiStrings[1]?.first_run_hint
- src/ui/first-run/{index.ts}, src/ui/index.ts: barrel + re-export wired
- src/App.tsx: <FirstRunHint /> mounted between BeginScreen and SeedPicker
Vitest: 6 new behavioral cases green (hidden when Begin still up, hidden
when dismissed, renders externalized line, reads uiStrings, auto-dismisses
on first plant, stays dismissed on subsequent tile changes). 324/324
total green; npm run ci exits 0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
51 lines
1.7 KiB
YAML
51 lines
1.7 KiB
YAML
# Player-visible Phase 2 UI copy. Externalized per CLAUDE.md
|
|
# Code Style ("anything player-facing... should match the bible's voice")
|
|
# and reviewed against anti-fomo-doctrine.md (no FOMO, no nag, no streaks).
|
|
#
|
|
# Tone: warm, specific, intermittent, sometimes funny, sometimes devastating.
|
|
# Lura's warmth is the contrast (Plan 02-04); Phase 2 Wave 1 ships only the
|
|
# outermost shell — Begin screen, the seed picker chrome, and the post-harvest
|
|
# beat that Plan 02-03 will surface.
|
|
season: 1
|
|
|
|
begin:
|
|
title: "The Last Garden"
|
|
subtitle: "tend"
|
|
cta: "Begin"
|
|
|
|
# Plan 02-06 G2 — first-run instructional hint shown after BeginScreen
|
|
# dismisses on the first run of a tab. Auto-dismisses on first plant.
|
|
# Per the A Dark Room rule: one prompt at a time, minimal but always
|
|
# present until acted upon. Bible voice (warm, specific, contemplative)
|
|
# per CLAUDE.md tone constraint.
|
|
first_run_hint: "Begin where the soil is bare."
|
|
|
|
seed_picker:
|
|
title: "Sow"
|
|
cancel: "Not yet"
|
|
|
|
# Three short beats, surfaced one at a time after a harvest (Plan 02-03).
|
|
# Authored to be quiet — the player is meant to almost miss them.
|
|
post_harvest_beat:
|
|
- "The earth remembers."
|
|
- "Something stayed."
|
|
- "It rests where it grew."
|
|
|
|
journal:
|
|
empty_state: "Nothing yet. Plant something."
|
|
back: "Close"
|
|
|
|
settings:
|
|
title: "Settings"
|
|
export: "Save to a copy"
|
|
import: "Restore from a copy"
|
|
restore_snapshot: "Earlier garden"
|
|
persistence_denied_toast: "The garden may forget, if your browser asks it to."
|
|
|
|
# Plant display names — sourced here so the writer can adjust without
|
|
# touching src/sim/garden/plants.ts (which carries fallbackName for tests).
|
|
plants:
|
|
rosemary: "Rosemary"
|
|
yarrow: "Yarrow"
|
|
winter-rose: "Winter-rose"
|