diff --git a/.claude/hooks/format-lint.sh b/.claude/hooks/format-lint.sh index 1bc7db4..c56b623 100755 --- a/.claude/hooks/format-lint.sh +++ b/.claude/hooks/format-lint.sh @@ -65,15 +65,16 @@ lint() { } case "${file##*.}" in - ts | tsx | js | jsx | mjs | cjs | json | jsonc | json5 | css) + ts | tsx | js | jsx | mjs | cjs | json | jsonc | json5) # Without --ignore-path, oxfmt also reads .prettierignore, which excludes # every extension oxfmt owns. run oxfmt --ignore-path .gitignore "$file" >/dev/null lint oxlint --type-aware "$file" ;; # oxfmt's directory scan formats these too, so `pnpm check` fails on an unformatted one — - # but oxlint has no rules for them, so they are formatted and not linted. - yaml | yml | toml) + # but oxlint has no rules for them, so they are formatted and not linted. Passing one to + # oxlint is not a no-op: it reports "No files found to lint" and exits non-zero. + css | yaml | yml | toml) run oxfmt --ignore-path .gitignore "$file" >/dev/null ;; astro) diff --git a/AGENTS.md b/AGENTS.md index 9ae5f20..07e562e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,11 +20,12 @@ Pages. **Zero client-side framework runtime** — `.astro` components and plain ## Toolchain ownership -| Extensions | Linter | Formatter | -| ------------------------------------- | ---------------------------------------------- | --------- | -| `.ts .js .mjs .cjs .json .jsonc .css` | oxlint (type-aware, vendored nkzw + anti-slop) | oxfmt | -| `.astro` | ESLint (typed, jsx-a11y-strict) | Prettier | -| `.md` | — | Prettier | +| Extensions | Linter | Formatter | +| -------------------------------- | ---------------------------------------------- | --------- | +| `.ts .js .mjs .cjs .json .jsonc` | oxlint (type-aware, vendored nkzw + anti-slop) | oxfmt | +| `.css` | — (oxlint has no CSS rules) | oxfmt | +| `.astro` | ESLint (typed, jsx-a11y-strict) | Prettier | +| `.md` | — | Prettier | The Claude Code hook in `.claude/hooks/format-lint.sh` runs the right pair on every file you edit, and feeds lint failures back to you. Do not reach for the other toolchain by hand. diff --git a/plan/06-homepage.md b/plan/06-homepage.md index 7ce8157..956f659 100644 --- a/plan/06-homepage.md +++ b/plan/06-homepage.md @@ -44,10 +44,74 @@ Built from primitives; these are the reusable section vocabulary for all later p ## Acceptance criteria -- [ ] Homepage copy parity with legacy (diff the visible text; intentional omissions listed in PR). -- [ ] All sections built from `ui/` + `ui/primitives/` — zero one-off styling that bypasses tokens. -- [ ] Sponsors render from the collection; deactivating a sponsor file removes it without code changes. -- [ ] Zero client JS except the video poster/in-view script and nav toggle; reduced-motion shows poster. -- [ ] Lighthouse A11y = 100, SEO = 100 (mobile) on the preview. +- [x] Homepage copy parity with legacy (diff the visible text; intentional omissions listed in PR). + Every legacy string is present. Changes, all listed under "Notes and deviations": the hero + heading became the page's `h1`; two section headings were added where legacy had none + ("Our programs", "Our sponsors"); "highschool" → "high school"; "Contact us!" moved from the + closing heading into its paragraph so the tagline could take that heading. +- [x] All sections built from `ui/` + `ui/primitives/` — zero one-off styling that bypasses tokens. +- [x] Sponsors render from the collection; deactivating a sponsor file removes it without code + changes — the three `active: false` records (Fives, VFW, Wellspan) are already absent. +- [x] Zero client JS except the nav toggle. The homepage hero is a photograph, not a video (see + below), so it ships no script at all; the whole page's only `