diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 63627a3..27c7117 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -586,10 +586,17 @@ Plans: **Context:** `.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-CONTEXT.md` (D-01 to D-05, D-07, D-09 and D-12 still apply; see its supersession note) -**Plans:** 0 plans +**Plans:** 3 plans Plans: -- [ ] TBD (run /gsd-plan-phase 11.2 to break down) +**Wave 1** +- [ ] 11.2-01-PLAN.md — vue-summercms-app: Nuxt 4 landing page matching the handoff (en-only i18n, @nuxt/fonts, @nuxtjs/seo with static OG, sun assets from logo.png, single-source terminal commands, Copy, scroll-spy, app config flags) + +**Wave 2** *(blocked on Wave 1 completion)* +- [ ] 11.2-02-PLAN.md — Framework PG15 verification and site_url/site_label (D-25, D-41, D-46), v0.1.0 tag checkpoint (D-42), sm-summercms-plugin static serving at / and /docs (D-07, D-47), sm-summercms-app wiring, build and smoke scripts, link and terminal checks (SC3, D-40), DEPLOY.md with nginx, supervisor and rollback + +**Wave 3** *(blocked on Wave 2 completion)* +- [ ] 11.2-03-PLAN.md — Unit tests last: plugin rule table at 90%+ coverage, site_url/site_label branches, terminal-check helpers, check-phase11.2.sh gate, validated VALIDATION.md ### Phase 11.3: Newsletter plugin and signup on summercms.io (INSERTED) diff --git a/.planning/STATE.md b/.planning/STATE.md index ad96185..38aea55 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -1,18 +1,18 @@ --- gsd_state_version: "1.0" milestone: v1.0 -current_phase: "11.1" -current_phase_name: SummerCMS documentation for humans and AI agents (INSERTED) -status: verifying +current_phase: "11.2" +current_phase_name: summercms.io Alpha 0.1 landing page on SummerCMS +status: executing stopped_at: Phase 11.2 context gathered -last_updated: "2026-10-01T12:33:55.152Z" +last_updated: "2026-10-01T13:40:22.087Z" last_activity: 2026-10-01 last_activity_desc: Phase 11.1 execution started -state_head: 3cbc8d32d15ca53ad9c81b8a202137bfb39bd133 +state_head: b6013a81edf0fd2c7c9254c865b359065b44652d progress: total_phases: 20 completed_phases: 9 - total_plans: 93 + total_plans: 96 completed_plans: 93 milestone_name: milestone --- @@ -28,9 +28,9 @@ See: .planning/PROJECT.md (updated 2026-09-16) ## Current Position -Phase: 11.1 (SummerCMS documentation for humans and AI agents (INSERTED)) — EXECUTING +Phase: 11.2 (summercms.io Alpha 0.1 landing page on SummerCMS) — READY TO EXECUTE Plan: 7 of 7 -Status: Phase complete — ready for verification +Status: Ready to execute Last activity: 2026-10-01 - Completed quick task 261001-ddh: Replace lagoon hardcoded ICU pl-PL database locale with per-query COLLATE option Progress: [██████░░░░] 60% diff --git a/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-01-PLAN.md b/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-01-PLAN.md new file mode 100644 index 0000000..3f87ca0 --- /dev/null +++ b/.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-01-PLAN.md @@ -0,0 +1,336 @@ +--- +phase: 11.2-ready-to-share-summercms-io-website-and-newsletter-plugin +plan: 01 +type: execute +wave: 1 +depends_on: [] +files_modified: + - ../sm-summercms-app/vue-summercms-app/package.json + - ../sm-summercms-app/vue-summercms-app/pnpm-lock.yaml + - ../sm-summercms-app/vue-summercms-app/pnpm-workspace.yaml + - ../sm-summercms-app/vue-summercms-app/.nvmrc + - ../sm-summercms-app/vue-summercms-app/.gitignore + - ../sm-summercms-app/vue-summercms-app/README.md + - ../sm-summercms-app/vue-summercms-app/tsconfig.json + - ../sm-summercms-app/vue-summercms-app/nuxt.config.ts + - ../sm-summercms-app/vue-summercms-app/app/app.config.ts + - ../sm-summercms-app/vue-summercms-app/app/app.vue + - ../sm-summercms-app/vue-summercms-app/app/pages/index.vue + - ../sm-summercms-app/vue-summercms-app/app/components/SiteHeader.vue + - ../sm-summercms-app/vue-summercms-app/app/components/HeroSection.vue + - ../sm-summercms-app/vue-summercms-app/app/components/WhySection.vue + - ../sm-summercms-app/vue-summercms-app/app/components/FeaturesSection.vue + - ../sm-summercms-app/vue-summercms-app/app/components/WinterSection.vue + - ../sm-summercms-app/vue-summercms-app/app/components/StartSection.vue + - ../sm-summercms-app/vue-summercms-app/app/components/TerminalCard.vue + - ../sm-summercms-app/vue-summercms-app/app/components/SiteFooter.vue + - ../sm-summercms-app/vue-summercms-app/app/assets/css/tokens.css + - ../sm-summercms-app/vue-summercms-app/app/assets/css/base.css + - ../sm-summercms-app/vue-summercms-app/app/data/terminal.json + - ../sm-summercms-app/vue-summercms-app/app/utils/terminal.ts + - ../sm-summercms-app/vue-summercms-app/app/utils/scrollSpy.ts + - ../sm-summercms-app/vue-summercms-app/i18n/locales/en.json + - ../sm-summercms-app/vue-summercms-app/assets-src/logo.png + - ../sm-summercms-app/vue-summercms-app/scripts/derive-images.sh + - ../sm-summercms-app/vue-summercms-app/public/sun-logo.webp + - ../sm-summercms-app/vue-summercms-app/public/sun-badge.webp + - ../sm-summercms-app/vue-summercms-app/public/favicon.ico + - ../sm-summercms-app/vue-summercms-app/public/apple-touch-icon.png + - ../sm-summercms-app/vue-summercms-app/public/og-image.png + - ../sm-summercms-app/vue-summercms-app/tests/output.test.ts + - ../sm-summercms-app/vue-summercms-app/tests/terminal.test.ts + - ../sm-summercms-app/vue-summercms-app/tests/scrollSpy.test.ts +autonomous: true +requirements: [] +assumption_delta_decision: no-change +specless_probe_fallback: "skipped: phase has no requirement IDs to probe (visible skip); ROADMAP SC1-SC5 and the D-IDs are the acceptance contract" +user_setup: [] + +estimate: + tokens: 120000 + raw_tokens: 120000 + tasks: 3 + confidence: low + +must_haves: + truths: + - "Per D-04 and SC1, `pnpm -C ../sm-summercms-app/vue-summercms-app run generate` exits 0 and writes `.output/public/index.html` as real prerendered HTML holding, in order, the sticky header, the hero `#top`, `#why`, `#features`, `#winter`, `#start` and the footer." + - "Per D-23, colors, type, spacing, breakpoints, copy and the two interactions match design/README.md and `SummerCMS Landing.dc.html`; the only copy deviations are the D-12 credit, the D-39 clone step and the D-26 `PostgreSQL 15+` chip." + - "Per D-33, every visible string on the page comes from `i18n/locales/en.json` through @nuxtjs/i18n with the single locale `en` served at `/` (strategy `prefix_except_default`), so Phase 11.3 adds `pl.json` without touching component markup." + - "Per D-34, Roboto 300/400/500/700 and Roboto Mono 400/500 are self-hosted by @nuxt/fonts under `/_fonts/` and the generated HTML and CSS reference no Google font host." + - "Per D-35, styles are plain CSS: the handoff tokens are custom properties on `:root` in `tokens.css`, used by scoped component styles; no CSS framework package is installed." + - "Per D-36, every sun image (header logo, hero badge, favicons, OG image) is derived from the original `logo.png` by a committed ImageMagick script, and the handoff `sun-crop.png` placeholder is not shipped." + - "Per D-37, @nuxtjs/seo emits title, description, canonical, Open Graph, Twitter and schema.org tags, a flat `sitemap.xml` and `robots.txt` at generate time; `og:image` is the absolute `https://summercms.io/og-image.png`; nothing is rendered at runtime." + - "Per D-45, `app.config.ts` has `landing.showRays` and `landing.scrollSpy`, both `true`; setting either to false removes the hero rays layer or the scroll-spy listener." + - "Per D-39 and D-40, the terminal card shows three groups and six commands read from the single source `app/data/terminal.json`, and Copy writes exactly the six command lines joined by newlines (no `$`, no comments), then shows `Copied` for 1500 ms." + - "Per D-47 and D-38, the eight feature tiles, the concept-map link and the Installation guide keep the handoff's extension-less `/docs/...` hrefs, the Docs links point to `/docs`, and both Source links point to `https://git.golem15.com/golem15/summercms`." + - "Per D-09, the From WinterCMS section carries the handoff copy and concept table unchanged, with no added seasons copy; per D-12, the footer has a `Built by Golem15` link to `https://golem15.com` styled as a footer link." + - "Per SC1, at viewport widths of 720px or less the header section links are hidden by a CSS media query (rendered in SSR, no width-dependent markup), and every grid collapses to one column on phone widths." + - "Scroll-spy marks the last of why, features, winter and start whose top is less than 140px from the viewport top; above `#why` no link is active." + - statement: "Visual fidelity at 1280, 721, 720 and 375px, the sticky header, and the Copy label change are confirmed against the handoff in the end-of-phase UAT." + verification: backstop + artifacts: + - path: "../sm-summercms-app/vue-summercms-app/nuxt.config.ts" + provides: "Nuxt 4 SSG config: fonts, i18n, seo, prerender ignore for /docs" + contains: "prerender" + - path: "../sm-summercms-app/vue-summercms-app/app/app.config.ts" + provides: "D-45 landing flags" + contains: "scrollSpy" + - path: "../sm-summercms-app/vue-summercms-app/i18n/locales/en.json" + provides: "all page copy (D-33)" + contains: "A new dawn in content management" + - path: "../sm-summercms-app/vue-summercms-app/app/data/terminal.json" + provides: "single source of the six terminal commands (D-40)" + contains: "./bin/hello greeter:hello" + - path: "../sm-summercms-app/vue-summercms-app/app/components/TerminalCard.vue" + provides: "terminal card with Copy" + contains: "copyPayload" + - path: "../sm-summercms-app/vue-summercms-app/app/utils/scrollSpy.ts" + provides: "pure scroll-spy selection" + contains: "export function activeSection" + - path: "../sm-summercms-app/vue-summercms-app/app/utils/terminal.ts" + provides: "pure copy payload builder" + contains: "export function copyPayload" + - path: "../sm-summercms-app/vue-summercms-app/tests/output.test.ts" + provides: "SC1 assertions on the generated output" + contains: "index.html" + - path: "../sm-summercms-app/vue-summercms-app/scripts/derive-images.sh" + provides: "D-36 image derivation from the original sun" + contains: "magick" + key_links: + - from: "../sm-summercms-app/vue-summercms-app/app/components/TerminalCard.vue" + to: "../sm-summercms-app/vue-summercms-app/app/data/terminal.json" + via: "static JSON import; the card renders and copies only these commands" + pattern: "data/terminal\\.json" + - from: "../sm-summercms-app/vue-summercms-app/app/components/TerminalCard.vue" + to: "../sm-summercms-app/vue-summercms-app/app/utils/terminal.ts" + via: "copyPayload(groups) builds the clipboard text" + pattern: "copyPayload\\(" + - from: "../sm-summercms-app/vue-summercms-app/app/components/SiteHeader.vue" + to: "../sm-summercms-app/vue-summercms-app/app/utils/scrollSpy.ts" + via: "scroll listener calls activeSection with section tops" + pattern: "activeSection\\(" + - from: "../sm-summercms-app/vue-summercms-app/nuxt.config.ts" + to: "/docs links on the page" + via: "nitro.prerender.ignore keeps generate from crawling /docs, which the Go binary serves" + pattern: "ignore:.*'/docs'" +--- + + +Build `vue-summercms-app`, the Nuxt 4 static site for summercms.io, matching the claude.ai/design handoff exactly (D-23) with the decided deviations (D-12, D-26, D-39). `nuxt generate` produces real prerendered HTML (D-04) with self-hosted fonts (D-34), plain-CSS tokens (D-35), the original sun artwork (D-36), static SEO output (D-37), a single `en` locale ready for Phase 11.3 (D-33), the app-config flags (D-45), and a terminal card fed from one command list (D-39, D-40). Docs links stay extension-less (D-47). The superseded decisions apply in their superseded form: D-06 English only (Polish is Phase 11.3, via D-33), D-08 the handoff's section list, D-10 the "Alpha 0.1 is out" tone, and D-11 Source links on the page (D-38). + +Purpose: SC1. The Go binary in plan 11.2-02 embeds this output, so the generate output contract here (file layout, `_nuxt/`, `_fonts/`, `_i18n/`, flat `sitemap.xml`) is what the site handler serves. + +Output: a new git repository at `/media/nvme/dev/golem15/summercms.io/summercms/sm-summercms-app/vue-summercms-app` (it becomes a submodule of `sm-summercms-app` in plan 11.2-02), with node:test assertions over the generated output and the two pure utilities. + + + +@~/.claude/gsd-core/workflows/execute-plan.md +@~/.claude/gsd-core/templates/summary.md + + + +@.planning/PROJECT.md +@.planning/ROADMAP.md +@.planning/STATE.md +@CLAUDE.md +@.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-CONTEXT.md +@.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-RESEARCH.md +@.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-PATTERNS.md +@.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/README.md +@.planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/SummerCMS Landing.dc.html +@/media/nvme/dev/golem15/fonoteka/vue-fonoteka-app/nuxt.config.ts +@/media/nvme/dev/golem15/fonoteka/vue-fonoteka-app/package.json +@/media/nvme/dev/golem15/fonoteka/vue-fonoteka-app/pnpm-workspace.yaml + +**Paths.** Commands run from the summercms.go root. `SITE` = `../sm-summercms-app/vue-summercms-app` (absolute: `/media/nvme/dev/golem15/summercms.io/summercms/sm-summercms-app/vue-summercms-app`). Every file in this plan is written to the SITE repository, which this plan creates. Nothing in summercms.go changes in this plan. Do not run `git add` in the meta repository `summercms/` or in summercms.go; `sm-summercms-app/` stays a plain directory until plan 11.2-02 makes it a repository. + +**Commits.** Commit inside SITE only, one logical change per commit, conventional messages such as `feat(site): ...`, and never a co-author tag. + +**Design source of truth.** `design/SummerCMS Landing.dc.html` is authoritative for punctuation and details not in design/README.md (RESEARCH "Details found in SummerCMS Landing.dc.html"): typographic apostrophes in "each plugin’s YAML" and "the caller’s transaction", the straight apostrophe in "WHAT'S IN THE BOX", gaps, paddings and the terminal layout. Ignore its `support.js` runtime and its JS width state. + + +Pure utilities consumed by components and by node:test (use only erasable TypeScript syntax so Node 22 runs the files without a build: no enums, no namespaces, no parameter properties; type-only imports use `import type`): + +- `app/utils/terminal.ts`: `export interface TerminalGroup { comment: string; commands: string[] }` and `export function copyPayload(groups: readonly TerminalGroup[]): string` returning every command in order joined by `\n`, with no trailing newline, no `$` and no comment text. +- `app/utils/scrollSpy.ts`: `export const SPY_SECTIONS` = `['why', 'features', 'winter', 'start']`, `export const SPY_THRESHOLD = 140`, and `export function activeSection(tops: ReadonlyArray<{ id: string; top: number }>, threshold?: number): string` returning the id of the last entry whose `top` is strictly less than the threshold, or `''` when none is. +- `app/data/terminal.json`: `{ "groups": [ { "comment": "", "commands": [ ... ] } ] }` with exactly these groups in order: `terminal.getFramework` → `git clone https://git.golem15.com/golem15/summercms`, `cd summercms`; `terminal.installCli` → `go install ./cmd/summer`; `terminal.buildExample` → `cd examples/hello`, `summer build`, `./bin/hello greeter:hello`. Plan 11.2-02 reads this file from Go (D-40 check and the HTML drift guard), so the key names and shape are a contract. +- `app/app.config.ts`: `defineAppConfig({ landing: { showRays: true, scrollSpy: true } })`. + + + + + + + Task 1: Tracer: `nuxt generate` turns en.json into a prerendered page with the sticky header and hero, self-hosted fonts, the real sun and static SEO output + `node --version` prints v22.18 or newer, `pnpm --version` prints 11.x, and `magick -version` succeeds with WEBP and ICO delegates (RESEARCH Environment Availability). + ../sm-summercms-app/vue-summercms-app/package.json, ../sm-summercms-app/vue-summercms-app/pnpm-lock.yaml, ../sm-summercms-app/vue-summercms-app/pnpm-workspace.yaml, ../sm-summercms-app/vue-summercms-app/.nvmrc, ../sm-summercms-app/vue-summercms-app/.gitignore, ../sm-summercms-app/vue-summercms-app/README.md, ../sm-summercms-app/vue-summercms-app/tsconfig.json, ../sm-summercms-app/vue-summercms-app/nuxt.config.ts, ../sm-summercms-app/vue-summercms-app/app/app.config.ts, ../sm-summercms-app/vue-summercms-app/app/app.vue, ../sm-summercms-app/vue-summercms-app/app/pages/index.vue, ../sm-summercms-app/vue-summercms-app/app/components/SiteHeader.vue, ../sm-summercms-app/vue-summercms-app/app/components/HeroSection.vue, ../sm-summercms-app/vue-summercms-app/app/assets/css/tokens.css, ../sm-summercms-app/vue-summercms-app/app/assets/css/base.css, ../sm-summercms-app/vue-summercms-app/i18n/locales/en.json, ../sm-summercms-app/vue-summercms-app/assets-src/logo.png, ../sm-summercms-app/vue-summercms-app/scripts/derive-images.sh, ../sm-summercms-app/vue-summercms-app/public/sun-logo.webp, ../sm-summercms-app/vue-summercms-app/public/sun-badge.webp, ../sm-summercms-app/vue-summercms-app/public/favicon.ico, ../sm-summercms-app/vue-summercms-app/public/apple-touch-icon.png, ../sm-summercms-app/vue-summercms-app/public/og-image.png, ../sm-summercms-app/vue-summercms-app/tests/output.test.ts + + - .planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/README.md (Global, 1. Header, 2. Hero, Design Tokens, Assets) + - .planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/design/SummerCMS Landing.dc.html (header and hero markup and inline styles) + - .planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-RESEARCH.md sections "Standard Stack", "Package Legitimacy Audit", "Nuxt 4 (question 4)", "Pattern 1", "Design Handoff Inventory", Pitfalls 1-4 and 6, Open Questions 4-5 + - .planning/phases/11.2-ready-to-share-summercms-io-website-and-newsletter-plugin/11.2-PATTERNS.md section "SITE/nuxt.config.ts, package.json, pnpm-workspace.yaml, i18n/locales/en.json" + - /media/nvme/dev/golem15/fonoteka/vue-fonoteka-app/nuxt.config.ts (fonts, i18n and site blocks; copy shapes only) + - /media/nvme/dev/golem15/fonoteka/vue-fonoteka-app/package.json and pnpm-workspace.yaml (scripts, engines, allowBuilds) + + +Create the repository and the thinnest production-quality slice through every layer the site has: package config, Nuxt modules, i18n copy, tokens, components, static assets and the generate output, checked by a test over the output. + +1. Repository (per D-01 and D-43): `mkdir -p /media/nvme/dev/golem15/summercms.io/summercms/sm-summercms-app/vue-summercms-app`, then `git init -b master` inside `vue-summercms-app` only. Add `.gitignore` (`node_modules/`, `.nuxt/`, `.output/`, `.data/`, `dist`, `.env`), `.nvmrc` with `22.22.0`, and a short `README.md` (what the site is, `pnpm install --frozen-lockfile`, `pnpm generate`, `pnpm test`, `scripts/derive-images.sh`, and that the root app embeds `.output/public`). +2. Packages (T-11.2-SC): `package.json` with `"name": "vue-summercms-app"`, `"private": true`, `"type": "module"`, `"engines": { "node": ">=22.6" }`, scripts `build` (`nuxt build`), `dev` (`nuxt dev`), `generate` (`nuxt generate`), `preview` (`nuxt preview`), `prepare` (`nuxt prepare`), `test` (`node --test tests/*.test.ts`), and no install-time lifecycle script. Install with exact pins via `pnpm add --save-exact nuxt@4.4.8 @nuxt/fonts@0.14.0 @nuxtjs/i18n@10.4.0 @nuxtjs/seo@5.2.1 vue@3.5.35` and `pnpm add -D --save-exact typescript@5.9.3`. These are the versions running in vue-fonoteka-app and approved in RESEARCH "Package Legitimacy Audit". If pnpm cannot resolve any of these exact versions, stop and return a `checkpoint:human-verify` with `gate="blocking-human"` naming the package and version instead of installing another version. Copy fonoteka's `pnpm-workspace.yaml` `allowBuilds` entries for `@parcel/watcher`, `esbuild` and `vue-demi` only (no protobufjs, no sharp, no patchedDependencies). Commit `pnpm-lock.yaml`. Add `tsconfig.json` extending `./.nuxt/tsconfig.json` as fonoteka does. +3. `nuxt.config.ts` (the spike-verified config in RESEARCH Pattern 1, per D-04, D-33, D-34, D-37): `compatibilityDate: '2025-07-15'`, `devtools: { enabled: false }`, `modules: ['@nuxt/fonts', '@nuxtjs/i18n', '@nuxtjs/seo']`, `css` loading `~/assets/css/tokens.css` then `~/assets/css/base.css`; `fonts.families` Roboto weights 300/400/500/700 and Roboto Mono weights 400/500, each with `styles: ['normal']`, `subsets: ['latin', 'latin-ext']`, `global: true` (Roboto 900 from the prototype is not loaded, per D-34); `i18n` with `strategy: 'prefix_except_default'`, `defaultLocale: 'en'`, one locale `{ code: 'en', language: 'en-US', file: 'en.json', name: 'English' }`, `langDir: 'locales/'`, `baseUrl: 'https://summercms.io'`, `experimental: { prerenderMessages: true }`; `site: { url: 'https://summercms.io', name: 'SummerCMS', description: , defaultLocale: 'en' }`; `ogImage: { enabled: false }`; `sitemap: { autoI18n: false }` (Pitfall 2: one flat file); `linkChecker: { excludeLinks: ['/docs', '/docs/**'] }`; `nitro: { prerender: { ignore: ['/docs'] } }` (Pitfall 1: generate otherwise exits 1 on /docs links); `app.head.link` with `/favicon.ico`, `/apple-touch-icon.png` (sizes 180x180). +4. `app/app.config.ts` per D-45 (both flags `true`). `app/app.vue` renders ``. `app/pages/index.vue` renders `SiteHeader` and `HeroSection` inside a wrapper whose horizontal overflow is clipped with `overflow-x: clip`, never `hidden` (Pitfall 3: a hidden-overflow ancestor breaks the sticky header), and sets the page head with `useSeoMeta`: title `SummerCMS: A new dawn in content management` with a `titleTemplate` that does not append the site name again (spike finding 4), `description` = the hero description, `ogImage` `/og-image.png` with width 1200, height 630 and alt text, `twitterCard: 'summary_large_image'`. Title, description and alt live in `en.json` under `meta.*`. +5. `i18n/locales/en.json` (D-33): nested keys for `meta`, `header` (logo aria label, wordmark parts "Summer" and "CMS", pill `ALPHA 0.1`, nav labels Why, Features, From WinterCMS, Get started, `Docs →`), `hero` (tagline "A new dawn in content management", description "A content management framework for Go, inspired by WinterCMS. Plugins, the admin SPA and console commands compile into a single binary.", CTA labels "Read the docs" and "Alpha 0.1 is out"). Copy every string verbatim from the handoff. Use no vue-i18n special characters (`@`, `|`, `{`, `}`) in values except deliberate slot placeholders (Pitfall 6). +6. Styles per D-35: `tokens.css` defines on `:root` the fourteen color tokens from RESEARCH "Tokens → :root custom properties" (`--navy-900` `#18223a` through `--text-4` `#8a94a3`), white border alphas 6/7/8/10/12/14% as `--border-06` … `--border-14`, radii `--radius-sm` 6px, `--radius-card` 16px, `--radius-pill` 999px, and font stacks `--font-sans` (Roboto, system-ui, sans-serif) and `--font-mono` (Roboto Mono, ui-monospace, monospace). `base.css` holds the globals from design/README.md "Global": page background `#233148`, text `#e9edf3`, `html { scroll-behavior: smooth; scroll-padding-top: 72px }` plus `@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto } }` (discretion choice), selection colors, link colors and hover, `.container` (max-width 1120px, padding 0 24px, auto margins), the shared section heading pattern (`.eyebrow`, `.section-title`), and the shared button shapes (primary, secondary, outline) and chip shape used by later sections. Component styles are `