## Context The Astro project was scaffolded with `astro@6.1.5` and directory structure in place, but `astro.config.mjs` is empty and no Tailwind integration exists. The Archia woff2 font files are already present at `src/assets/fonts/archia/`. The migration steps doc was written expecting Tailwind v3 patterns (`tailwind.config.mjs`); we are using Tailwind v4 instead. ## Goals / Non-Goals **Goals:** - Tailwind v4 fully wired into the Astro 6 build pipeline - All Qumo brand color tokens available as Tailwind utility classes (`bg-midnight`, `text-snow`, etc.) - `font-archia` available as a Tailwind font utility - All 6 Archia weights loaded via `@font-face` with `font-display: swap` - `@astrojs/sitemap` configured with `site: 'https://qumo.io'` - A smoke test page that confirms every token and weight renders correctly **Non-Goals:** - No real page content, layout, or navigation (those are steps 002–004) - No NL locale routing yet - No SEO meta tags or structured data yet - No production optimisation of font loading (preloads come in step 002 with BaseLayout) ## Decisions ### Tailwind v4 over v3 **Decision:** Use `@tailwindcss/vite` (Tailwind v4) rather than `tailwindcss@3` + `@astrojs/tailwind`. **Rationale:** Tailwind v4 is the current major version and integrates natively with Vite via a single Vite plugin — no Astro integration adapter needed. Configuration is CSS-based (`@theme` block), which keeps brand tokens co-located with the font-face declarations in one file. Astro 6 ships with Vite 6, which is fully supported. **Alternative considered:** Tailwind v3 (`tailwind.config.mjs`). Rejected because it requires an additional `@astrojs/tailwind` adapter with limited Astro 6 testing, and the JS config file adds complexity for what is simply a set of color + font token definitions. ### CSS-based token definition **Decision:** Brand tokens defined in `src/styles/global.css` using the `@theme` block, not in a JS config. ```css @import "tailwindcss"; @theme { --color-midnight: #102022; --color-snow: #F3F3F3; --color-brand-blue: #5257E4; --color-brand-red: #F71E3E; --font-archia: "Archia", ui-sans-serif, system-ui, sans-serif; } ``` **Rationale:** Tailwind v4 CSS variables in `@theme` are automatically exposed as utilities (`bg-midnight`, `text-snow`, `font-archia`, etc.) with no additional config. This is the idiomatic v4 pattern. ### Gradient as CSS custom property, not a Tailwind utility **Decision:** Define the brand gradient as a CSS custom property in `global.css` rather than a Tailwind background utility. ```css :root { --gradient-brand: linear-gradient(135deg, #5257E4, #F71E3E); } ``` **Rationale:** The gradient is used in specific, controlled contexts (hero accent, CTA sections) — never as a flat background. A raw CSS variable is easier to apply precisely than a generated utility class, and avoids accidentally using the gradient colors as standalone flat colors. ### Font loading strategy **Decision:** `@font-face` declarations in `global.css` with `font-display: swap`. Load Regular, SemiBold, and Bold in the initial stylesheet; defer Thin, Light, and Medium. **Rationale:** Archia Regular/SemiBold/Bold covers all visible text in the design. Thin/Light/Medium are used sparingly if at all. Font preloads (``) will be added to BaseLayout in step 002 for the three primary weights. ### Smoke test in index.astro **Decision:** Replace the default `index.astro` with a dev-only smoke test. It is not a real page — it will be fully replaced in the homepage step. **Structure:** Color swatch grid (4 swatches + gradient bar) + font weight table (Thin → Bold, each showing uppercase and sentence-case samples) + a note that this is a dev artifact. ## Risks / Trade-offs - **Tailwind v4 is newer** → Less community Q&A available. Mitigation: Astro Docs MCP server has current documentation; the API surface for what we need (colors, fonts) is stable. - **`@tailwindcss/typography` compatibility** → Already in devDeps; v4-compatible version should be installed. Mitigation: verify it installs without peer dep errors after `npm install`. - **Smoke test left in place too long** → If step 002 is delayed, the index route shows a dev page. Acceptable: this is a dev-only environment until deployment.