import { z } from 'zod'; /** * Player-visible UI strings, externalized per CLAUDE.md "Code Style": * "Player-visible strings are externalized in /content/, never hardcoded." * * One file per season under /content/seasons//ui-strings.yaml. The * loader (src/content/loader.ts) keys them by `season` so the runtime can * resolve `uiStrings[1].begin.title` etc. */ export const UiStringsSchema = z.object({ season: z.number().int().min(0).max(7), begin: z.object({ title: z.string().min(1), subtitle: z.string().min(1), cta: z.string().min(1), }), seed_picker: z.object({ title: z.string().min(1), cancel: z.string().min(1), }), post_harvest_beat: z.array(z.string().min(1)).min(1), journal: z.object({ empty_state: z.string().min(1), back: z.string().min(1), }), settings: z.object({ title: z.string().min(1), export: z.string().min(1), import: z.string().min(1), restore_snapshot: z.string().min(1), persistence_denied_toast: z.string().min(1), }), plants: z.record(z.string(), z.string().min(1)), // Plan 02-06 G2 — first-run instructional hint, externalized per STRY-09. // Required because Zod default strip mode would silently drop this key // from parsed.data and FirstRunHint would render null in production. first_run_hint: z.string().min(1), }); export type UiStrings = z.infer;