feat(02-02): begin screen + seed picker + ui-strings + lazy content split
- content/seasons/01-soil/ui-strings.yaml: player-visible Phase-2 copy externalized per CLAUDE.md (Begin / seed picker / post-harvest beat / journal / settings / plant display names); voice reviewed against bible + anti-fomo-doctrine.md
- content/seasons/01-soil/fragments.yaml: placeholder Season-1 fragment file (Plan 02-03 expands to ≥10 authored)
- content/seasons/00-demo/: deleted (Phase-1 demo replaced)
- src/content/schemas/ui-strings.ts: UiStringsSchema (Zod) — validates structure of every season's ui-strings.yaml at load time
- src/content/schemas/index.ts + src/content/index.ts: re-export UiStringsSchema/UiStrings
- src/content/loader.ts: eager `uiStrings` glob + PIPE-02 lazy `loadSeasonFragments(seasonId)` (Plan 02-03+ exploit)
- src/ui/begin/use-audio-bootstrap.ts: bootstrapAudioContext() lazy-creates + resumes (RESEARCH Pattern 9; Pitfall 5 mitigation — context construction inside the gesture for iOS Safari) + installFirstInteractionGestureHandler() one-shot for D-22 returning players + __resetAudioBootstrapForTest()
- src/ui/begin/BeginScreen.tsx: D-21 typographic Begin screen — title + subtitle + CTA from uiStrings[1].begin; onClick calls bootstrapAudioContext synchronously inside the click event then dismisses the session gate (D-22)
- src/ui/begin/BeginScreen.test.tsx: 4 tests — render / D-22 skip / click bootstraps + dismisses / subtitle string
- src/ui/garden/SeedPicker.tsx: D-02 inline DOM popover; subscribes to 'tile-clicked-coords'; renders one button per unlocked plant type from uiStrings[1].plants; click enqueues plantSeed command via store.enqueueCommand
- src/ui/garden/SeedPicker.test.tsx: 6 tests — initial-null / coords-positioned / unlocked-only / enqueue / dismiss / multi-plant; mocks game/event-bus to avoid Phaser canvas init under happy-dom (deviation Rule 3)
- src/ui/{begin,garden,index}.ts: barrels
- src/App.tsx: mount BeginScreen + SeedPicker as overlay siblings to PhaserGame
- src/PhaserGame.tsx: bootstrap unlockedPlantTypes=['rosemary'] for first-run; install gesture handler + scene-ready listener
- npm run ci exits 0; 163/163 tests pass (10 new this commit + 25 from Task 1 + 128 baseline)
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
# /content/seasons/01-soil/fragments.yaml
|
||||
#
|
||||
# Phase 2 placeholder. Plan 02-03 replaces with the authored Season-1
|
||||
# fragments (≥10 in voice, MEMR-* coverage). The single placeholder
|
||||
# fragment here keeps the eager fragment loader green during Plan 02-02
|
||||
# (Plan 02-03 expands the file).
|
||||
fragments:
|
||||
- id: season1.soil.placeholder
|
||||
season: 1
|
||||
body: "(placeholder — Plan 02-03 ships authored fragments)"
|
||||
@@ -0,0 +1,43 @@
|
||||
# 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"
|
||||
|
||||
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"
|
||||
Reference in New Issue
Block a user