diff --git a/.design-context.md b/.design-context.md new file mode 100644 index 0000000..7cb973c --- /dev/null +++ b/.design-context.md @@ -0,0 +1,66 @@ +# Design Context — MicroHAMS + +> Written by the `design-context` skill. Priming for all `design-*` work. Update the +> Design Context section in place rather than duplicating it. + +## Design Context + +### Users + +MicroHAMS is an amateur radio club in the Puget Sound area. The site serves **two audiences +equally**: + +- **Existing members & licensed hams** — want event details (monthly meetings, Field Day, swap + meets), technical articles, and reference docs. They value information density, accuracy, and + utility. +- **Prospective / newly licensed hams** — need an inviting front door: who the club is, when it + meets, how to show up. They value warmth, clear on-ramps, and low jargon. + +Context of use: desktop and mobile, often checking "when/where is the next meeting" or reading a +long technical article. Both light and dark environments (shacks are dark; phones are everywhere). + +### Brand Personality + +Three words: **precise, credible, welcoming**. The voice is knowledgeable but not gatekeeping — +technical authority delivered plainly. Emotionally the interface should evoke **confidence and +calm competence** (this club knows its craft) without feeling cold or corporate. A subtle nod to +the hobby's signal/RF heritage is welcome (see the header's radio-wave motif). + +### Aesthetic Direction + +Deliberately **Swiss / editorial / typographic** — the codebase explicitly cites Vignelli, Tufte, +and Bringhurst. Characteristics: + +- Achromatic base (black/white/grays in OKLCH) with restrained accent use. +- **Single accent: blue** (`--color-accent`, hue ~240). Red has been **retired** as an accent — + every interactive/emphasis role (links, focus rings, active nav, blockquote rule, tag hover, + badges, primary buttons, the logo, the header wave motif) uses the one blue. Reserve any future + red strictly for genuine error/danger semantics, never decoration. +- **Web-tuned type scale**: round-px text band (12–20px) + exact alternating 1.2/1.25 display band + (20·24·30·36·45px, h1 capped at 45px), 16px base (`1rem`, honors zoom), on a 24px + baseline grid — the old print-derived φ=1.618 ramp was too poster-aggressive for screens. Generous + measure (≈62ch body), Every-Layout primitives. +- **Self-hosted fonts via Fontsource** (no third-party request): **Atkinson Hyperlegible Next** + (body/UI — Braille Institute low-vision face, incl. italic for blockquotes) and **JetBrains Mono** + (headings + code). No serif face. Fallback stacks use only generic keywords (`ui-sans-serif`, + `ui-monospace`) — never named/system or banned fonts. +- Full light + dark mode, WCAG AA targeted throughout the tokens. + +**Anti-references:** generic AI-template aesthetics — purple/indigo gradients, glassmorphism, +gradient text, hero stat-counters, emoji-as-icons, drop-shadow soup. The site should look +_designed and edited_, not _generated_. Also banned as fonts (incl. fallback stacks): Inter, +Roboto, Arial, Open Sans, Helvetica Neue, Segoe UI, system-ui, Space Grotesk — and near-name +"kissing-cousins" of these. Nerd Fonts evaluated and rejected (no relevant glyphs, heavy payload). + +### Design Principles + +1. **Typography is the interface.** Hierarchy comes from the type scale and spacing, not + decoration. Protect the measure and the baseline rhythm. +2. **Systematic, not rigid.** Every value derives from tokens (space, type, color, radius). No + magic numbers in components; reach for a token or a primitive first. +3. **Accent with discipline.** Color is rare and meaningful. Keep the blue/red roles separated and + documented; never let an accent become decoration. +4. **AA is the floor, not the goal.** Contrast, focus visibility, semantics, and 44px touch + targets are non-negotiable; aim past AA where cheap. +5. **Fast and quiet.** A static club site should load instantly and never flash. Performance and a + stable first paint are part of the design, not an afterthought. diff --git a/package-lock.json b/package-lock.json index 90ef888..00197b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,8 @@ "name": "microhams", "version": "0.0.1", "dependencies": { + "@fontsource-variable/atkinson-hyperlegible-next": "^5.2.6", + "@fontsource-variable/jetbrains-mono": "^5.2.8", "@js-temporal/polyfill": "^0.5.1", "@types/leaflet": "^1.9.21", "astro": "^6.3.1", @@ -1187,6 +1189,24 @@ } } }, + "node_modules/@fontsource-variable/atkinson-hyperlegible-next": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/@fontsource-variable/atkinson-hyperlegible-next/-/atkinson-hyperlegible-next-5.2.6.tgz", + "integrity": "sha512-D0Z8peFkRGYACvmWp8Sl8YPGYLBEJbzqapugtsMEYSUUtpQDiZVDHjk9s7bqB4hSCRYCrKuW6V1V+mnHybVnPw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource-variable/jetbrains-mono": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource-variable/jetbrains-mono/-/jetbrains-mono-5.2.8.tgz", + "integrity": "sha512-WBA9elru6Jdp5df2mES55wuOO0WIrn3kpXnI4+W2ek5u3ZgLS9XS4gmIlcQhiZOWEKl95meYdvK7xI+ETLCq/Q==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", diff --git a/package.json b/package.json index 6e5d10f..e89def7 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,8 @@ "prepare": "husky" }, "dependencies": { + "@fontsource-variable/atkinson-hyperlegible-next": "^5.2.6", + "@fontsource-variable/jetbrains-mono": "^5.2.8", "@js-temporal/polyfill": "^0.5.1", "@types/leaflet": "^1.9.21", "astro": "^6.3.1", diff --git a/src/components/SiteHeader.astro b/src/components/SiteHeader.astro index d3f4ae5..e81b922 100644 --- a/src/components/SiteHeader.astro +++ b/src/components/SiteHeader.astro @@ -7,7 +7,8 @@ */ --- -