# ViewData (Website Templates) ViewData is the **only** allowed input type for Templates in `apps/website`. Authoritative contract: [`WEBSITE_CONTRACT.md`](docs/architecture/website/WEBSITE_CONTRACT.md:1). ## 1) Definition ViewData is a JSON-serializable, template-ready data structure: - primitives (strings/numbers/booleans) - arrays and plain objects - `null` for missing values ## 2) What ViewData is NOT ViewData is not: - an API Transport DTO (raw transport) - a ViewModel (client-only class) - a Display Object instance ## 3) Construction rules ViewData MUST be created in client code: 1) Initial SSR-safe render: `ViewData = fromDTO(PageDTO)` 2) Post-hydration render: `ViewData = fromViewModel(ViewModel)` These transformations are Presenters. See [`PRESENTERS.md`](docs/architecture/website/PRESENTERS.md:1). Templates MUST NOT compute derived values. Presenters MUST NOT call the API. ## 4) Determinism rules Any formatting used to produce ViewData MUST be deterministic. Forbidden anywhere in formatting code paths: - `Intl.*` - `Date.toLocaleString()` / `Date.toLocaleDateString()` / `Date.toLocaleTimeString()` Reason: SSR and browser outputs can differ. Localization MUST NOT depend on runtime locale APIs. If localized strings are required, they MUST be provided as deterministic inputs (for example via API-provided labels or a deterministic code-to-label map) and passed through Presenters into ViewData. ## 5) Relationship to Display Objects Display Objects are used to implement formatting/mapping, but their instances MUST NOT be stored inside ViewData. Only primitive outputs produced by Display Objects may appear in ViewData.