diff --git a/TODO.md b/TODO.md
index 083bb12..7fd3d3d 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,22 +1,26 @@
-# TODO — Post v0 Launch
-
-Items to revisit after the initial site launch. Nothing here is blocking v0.
+# TODO — WE3 Agency Website
---
-## Session Summary (4 Feb 2026)
+## Session Context
+
+**Last Updated**: 2026-02-04
+
+**Current Focus**: Restructuring TODO.md for AI collaboration and consolidating all tasks from investigation findings.
-### Where we landed
+### Session Summary (4 Feb 2026)
+
+#### Where we landed
v0 of the WE3 agency website is built and pushed to `gp-02-02-2026`. The site is a single Astro build (no variant system) with 12 pages, a design token pipeline (Style Dictionary), and a config-driven logo variant system.
-### What was done this session
+#### What was done this session
- **Logo variant system** — SVG logos in `public/images/logos/` (`warm.svg`, `claude.svg`). Active variant controlled by `SITE.logo` in `src/lib/site.ts`. Layout.astro derives the path dynamically for nav and footer. One-line swap.
- **Velvet hover effect** — CSS filter on both logo `` tags transitions to velvet (`#720A63`) on hover, using `var(--sys-motion-fast)`.
- **Archived dead files** — Old logo files (`we3-logo-claude.svg`, `we3-logo.svg`, `logo-placeholder.svg`) moved to `_archive/images/`. Old multi-variant `content/` directory moved to `_archive/content/`.
- **READMEs rewritten** — Root `README.md` updated (Vercel, page inventory, key systems). `website/README.md` replaced old A/B variant docs with current single-site architecture.
- **This TODO file** created to capture everything for the next phase.
-### Key context for next session
+#### Key context for next session
- **Site config**: `website/src/lib/site.ts` — single source of truth, currently just `logo: 'warm'`
- **Layout**: `website/src/layouts/Layout.astro` — shell for all pages (nav, footer, floating dock, scripts, cursor)
- **Tokens**: Generated via `pnpm run tokens:build` → `src/styles/tokens.generated.css`. 15 derived tokens are hand-written in `global.css` (stripes, glows, shadows). 17 bonus tokens exist in JSON but aren't consumed yet.
@@ -27,110 +31,268 @@ v0 of the WE3 agency website is built and pushed to `gp-02-02-2026`. The site is
---
-## Pre-Deploy (do before first production deploy)
-
-### Fix Vercel install command
-`vercel.json` uses `npm install` but the project uses pnpm. Update `installCommand` to `pnpm install` or remove it entirely so Vercel auto-detects from `pnpm-lock.yaml`. **This could break the production build.**
-
-### Set production site URL
-`astro.config.mjs` line 4 is `site: "http://localhost:4321"`. Change to the real production domain before deploy. Affects canonical URLs and any future sitemap/RSS generation.
+## Current Focus
-### Dependabot vulnerabilities
-GitHub flagged 16 vulnerabilities (3 high, 11 moderate, 2 low) on the default branch. Run `pnpm audit` and address the high-severity ones before launch.
+*No items currently in focus. Move tasks here when starting work.*
---
-## Design Tokens
+## Critical Priority
-### Hand-written derived tokens (15 "missing" from JSON)
-The 15 variables not in `tokens/tokens.json` are **intentionally hand-authored** in `global.css`: stripe gradients (`--s1`..`--s5`), the stacked/repeating stripe backgrounds, warm glow, gold glow, and shadow values. These are compositional — they combine primitives in ways that don't map cleanly to a flat token file. Decide later whether to:
-- Leave them hand-written (current, works fine)
-- Promote them to a second token file (e.g. `tokens/derived.json`) with a custom Style Dictionary transform
-- Accept the split as a feature, not a bug
+### Pre-Deploy
-### Bonus tokens (17 extras from JSON)
-The token JSON introduced z-index, breakpoint, and additional spacing/radius values that aren't yet consumed in CSS. They're harmless (generated but unused). Decide whether to:
-- Wire them into components as the design evolves
-- Prune unused ones from the JSON to keep the token file honest
+- [ ] Fix Vercel install command #task[id:task_01HQABCD1234EFGH5678IJKL status:to-do priority:critical created:2026-02-04]
+ - **Location**: `vercel.json`
+ - **Issue**: Uses `npm install` but project uses pnpm. Could break production build.
+ - **Fix**: Update `installCommand` to `pnpm install` or remove to auto-detect from `pnpm-lock.yaml`
+ - **Est**: 5 min
----
-
-## Site Config & Variant System
+- [ ] **🔴 Human Input Required**: Set production site URL #task[id:task_01HQABCD1234EFGH5678IJKM status:to-do priority:critical created:2026-02-04]
+ - **Location**: `website/astro.config.mjs` line 4
+ - **Issue**: Hardcoded to `"http://localhost:4321"`. Affects canonical URLs and sitemap generation.
+ - **Fix**: Change to production domain name
+ - **Est**: 2 min (after domain provided)
+ - **Human Input**: Decision - Requires actual production domain name
-### `variant-claude` body class is hardcoded
-`Layout.astro:51` has `
`. This controls the custom magnetic cursor and any variant-specific CSS in `global.css`. It doesn't track `SITE.logo`. Decide:
-- Make it dynamic (`variant-${SITE.logo}`) so cursor and other variant styles follow the logo choice
-- Or keep it pinned to `claude` if the cursor behaviour is meant to persist regardless of logo
+- [ ] Fix Dependabot vulnerabilities #task[id:task_01HQABCD1234EFGH5678IJKN status:to-do priority:critical created:2026-02-04]
+ - **Location**: GitHub flagged 16 vulnerabilities (3 high, 11 moderate, 2 low)
+ - **Issue**: Security vulnerabilities on default branch
+ - **Fix**: Run `pnpm audit` and address high-severity ones before launch
+ - **Est**: 30-60 min
-### Favicon not tied to logo variant system
-`public/favicon.svg` is its own thing — a simplified WE3 mark. It could stay independent or eventually be generated per-variant. Low priority.
+- [ ] **🔴 Human Input Required**: Contact form backend API #task[id:task_01HQABCD1234EFGH5678IJKO status:to-do priority:critical created:2026-02-04]
+ - **Location**: `website/src/pages/contact.astro` line 72
+ - **Issue**: Form has no `action` attribute or submission handler. Comment says "in production, this would submit to an API"
+ - **Fix**: Implement backend API endpoint + form submission handler
+ - **Est**: 4-8 hours (after service selected)
+ - **Human Input**: Decision - Choose service (Vercel serverless, Formspree, Netlify Forms, custom API)
---
-## SEO & Meta
+## High Priority
-### Open Graph / Twitter Card tags
-No `og:title`, `og:description`, `og:image`, or Twitter Card meta tags. Social shares will render with defaults. Add to `Layout.astro` props and head.
+### UX Fixes
-### Astro site URL hardcoded to localhost
-`astro.config.mjs` line 4: `site: "http://localhost:4321"`. Should be the production domain. Affects canonical URLs, sitemap generation, and any absolute URL helpers.
+- [ ] Mobile floating nav rendering #task[id:task_01HQABCD1234EFGH5678IJKP status:to-do priority:high created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro` lines 935-942
+ - **Issue**: Floating nav may overflow or break layout on mobile
+ - **Fix**: Improve mobile responsive styles for floating nav
+ - **Est**: 2-4 hours
-### Sitemap and robots.txt
-Neither exists. Astro has a `@astrojs/sitemap` integration that generates both at build time.
+- [ ] Contact form client-side handler #task[id:task_01HQABCD1234EFGH5678IJKQ status:to-do priority:high created:2026-02-04]
+ - **Location**: `website/src/pages/contact.astro` line 72
+ - **Issue**: Form has no client-side validation or submission handler
+ - **Fix**: Add form submission handler with client-side validation
+ - **Est**: 2-4 hours
----
+- [ ] Safari cursor performance #task[id:task_01HQABCD1234EFGH5678IJKR status:to-do priority:high created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro` lines 512, 539-550; `website/src/styles/global.css` lines 861-877
+ - **Issue**: Cursor feels laggy/dragging on Safari. RAF + `translate3d` causes performance issues. Low LERP (0.15) makes cursor feel laggy.
+ - **Fix**: Increase LERP to 0.25-0.3, add Safari detection and use `translate()` instead of `translate3d()`, add `will-change: transform` to cursor CSS, consider throttling RAF updates
+ - **Est**: 2-4 hours
-## Build & Deploy
+- [ ] Engagement fit cards links #task[id:task_01HQABCD1234EFGH5678IJKS status:to-do priority:high created:2026-02-04]
+ - **Location**: `website/src/pages/engagements.astro` lines 275-297
+ - **Issue**: Fit cards in "NOT SURE WHICH IS RIGHT FOR YOU?" section have no links - just badges
+ - **Fix**: Add links to fit cards (likely to `/brief` or engagement sections)
+ - **Est**: 2-4 hours
-### Vercel config uses npm instead of pnpm
-`vercel.json` specifies `npm install` but the project uses pnpm. May cause issues. Update `installCommand` to `pnpm install` or remove it and let Vercel auto-detect from the lockfile.
+### Content
-### Token build not in CI pipeline
-`pnpm run tokens:build` is manual. Generated CSS is committed. If tokens change, someone has to remember to regenerate. Consider chaining it before `astro build` or adding a pre-build script.
+- [ ] British English spelling fixes #task[id:task_01HQABCD1234EFGH5678IJKT status:to-do priority:high created:2026-02-04]
+ - **Location**: `website/src/pages/story.astro` lines 31, 262; `website/src/pages/model.astro` lines 278, 279
+ - **Issue**: "organizations" → "organisations" (2 instances), "recognize/recognized" → "recognise/recognised" (2 instances)
+ - **Fix**: Simple find/replace to British English spelling
+ - **Est**: 5 min
---
-## Content & Structure
+## Medium Priority
+
+### UX/Polish
+
+- [ ] Button active state obfuscates text #task[id:task_01HQABCD1234EFGH5678IJKU status:to-do priority:medium created:2026-02-04]
+ - **Location**: `website/src/styles/global.css` lines 290-327
+ - **Issue**: `:active` pseudo-class likely uses a dark background that hides text
+ - **Fix**: Adjust `:active` state colors or add text color override
+ - **Est**: 1-2 hours
+
+- [ ] Content reveal timing sync #task[id:task_01HQABCD1234EFGH5678IJKV status:to-do priority:medium created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro` line 467; `website/src/styles/global.css` line 476
+ - **Issue**: Content reveal starts when stripe finishes (2.6s), but reveal takes 2.1s (longest stagger), so content finishes ~2.1s after stripe. They should finish together.
+ - **Fix**: Start reveal earlier (~1.2s when stripe is ~50% done) or reduce transform duration to 1.0s and start at 1.6s
+ - **Est**: 1-2 hours
+
+- [ ] Floating nav icons #task[id:task_01HQABCD1234EFGH5678IJKW status:to-do priority:medium created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro` lines 168-200
+ - **Issue**: Floating nav is text-only, top nav has icons. Layout doesn't match.
+ - **Fix**: Add icons to floating nav items (same structure as top nav)
+ - **Est**: 2-4 hours
+
+- [ ] Tool card buttons cursor #task[id:task_01HQABCD1234EFGH5678IJKX status:to-do priority:medium created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro` line 555
+ - **Issue**: Cursor selector may not include nested buttons properly. Buttons within tools cards don't work with magnetic pointer.
+ - **Fix**: Update selector to properly target buttons inside `.tool-card`
+ - **Est**: 1-2 hours
+
+- [ ] View Source buttons #task[id:task_01HQABCD1234EFGH5678IJKY status:to-do priority:medium created:2026-02-04]
+ - **Location**: `website/src/pages/tools.astro` lines 47, 65
+ - **Issue**: `href="#"` - placeholders, buttons don't work
+ - **Fix**: Update hrefs to actual GitHub/source URLs
+ - **Est**: 5 min
+
+### Content
+
+- [ ] **🔴 Human Input Required**: Replace placeholder case studies #task[id:task_01HQABCD1234EFGH5678IJKZ status:to-do priority:medium created:2026-02-04]
+ - **Location**: `website/src/pages/work/index.astro` lines 5-46
+ - **Issue**: All 4 case studies are placeholder data. Comment says "Placeholder case studies - these would typically come from content collections"
+ - **Fix**: Replace with real case study content. Consider Signals, AI-assisted builds, EdTech project.
+ - **Est**: 4-8 hours (after content provided)
+ - **Human Input**: Content - Requires writing/creating real case study content
+
+- [ ] **🔴 Human Input Required**: Replace placeholder testimonial #task[id:task_01HQABCD1234EFGH5678IJL0 status:to-do priority:medium created:2026-02-04]
+ - **Location**: `website/src/pages/work/index.astro` line 239
+ - **Issue**: "Sarah Chen, CTO, Fintech Startup (Series B)" — placeholder name
+ - **Fix**: Replace with real testimonial or remove if not available
+ - **Est**: 30 min (after content provided)
+ - **Human Input**: Content/Approval - Requires real testimonial or decision to remove
+
+- [ ] **🔴 Human Input Required**: Verify/update stats accuracy #task[id:task_01HQABCD1234EFGH5678IJL1 status:to-do priority:medium created:2026-02-04]
+ - **Location**: `website/src/pages/work/index.astro` lines 179-194
+ - **Issue**: "50+ Projects", "12 Ventures", "95% Satisfaction", "3 Exits" — may be placeholders
+ - **Fix**: Verify accuracy and update if needed
+ - **Est**: 30 min (after verification)
+ - **Human Input**: Verification - Requires human to verify stats are accurate
+
+- [ ] **🔴 Human Input Required**: Currency decision #task[id:task_01HQABCD1234EFGH5678IJL2 status:to-do priority:medium created:2026-02-04]
+ - **Location**: `website/src/pages/contact.astro` lines 63-66, 192; `website/src/pages/brief.astro` lines 71, 574-578, 790-794
+ - **Issue**: Uses $ instead of £ for British context. Examples: "$25k", "$75k", "$200k", "$500k"
+ - **Fix**: Choose $ (international) or £ (British) and update all instances
+ - **Est**: 30 min (after decision)
+ - **Human Input**: Decision - Choose $ (international) or £ (British) and update all instances
+
+### Infrastructure
+
+- [ ] Token build in CI pipeline #task[id:task_01HQABCD1234EFGH5678IJL3 status:to-do priority:medium created:2026-02-04]
+ - **Location**: Build pipeline
+ - **Issue**: `pnpm run tokens:build` is manual. Generated CSS is committed. If tokens change, someone has to remember to regenerate.
+ - **Fix**: Add `pnpm run tokens:build` before `astro build` or add pre-build script
+ - **Est**: 30 min
+
+- [ ] Open Graph/Twitter Card tags #task[id:task_01HQABCD1234EFGH5678IJL4 status:to-do priority:medium created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro`
+ - **Issue**: No `og:title`, `og:description`, `og:image`, or Twitter Card meta tags. Social shares will render with defaults.
+ - **Fix**: Add to `Layout.astro` props and head
+ - **Est**: 2-4 hours
+
+- [ ] Sitemap and robots.txt #task[id:task_01HQABCD1234EFGH5678IJL5 status:to-do priority:medium created:2026-02-04]
+ - **Location**: Build output
+ - **Issue**: Neither exists. Astro has a `@astrojs/sitemap` integration that generates both at build time.
+ - **Fix**: Add `@astrojs/sitemap` integration to `astro.config.mjs`
+ - **Est**: 1-2 hours
-### Wire up Astro content collections as a lightweight CMS
-`src/content/config.ts` already defines `pages` and `posts` collections with schemas. The old markdown files have been archived to `_archive/content/` — they were from the multi-variant era and don't match the current site structure. The goal is to:
-- Create fresh markdown files in `src/content/pages/` matching the current page inventory (story, model, engagements, work, contact, etc.)
-- Refactor `.astro` pages to pull copy from `getCollection()` / `getEntry()` instead of hardcoding it
-- This turns the site into a markdown-driven CMS: update copy by editing `.md` files, no need to touch component code
-- The `work/index.astro` page is the best candidate to start with — it already has a comment noting case studies "would typically come from content collections"
-- Posts collection could power a blog/insights section later
+---
-### Populate Work page with real portfolio content
-The Work page currently shows placeholder case studies and a WIP overlay. Replace with real content. Remove the overlay once portfolio is populated.
+## Low Priority
+
+### Polish
+
+- [ ] Nav items equal width #task[id:task_01HQABCD1234EFGH5678IJL6 status:to-do priority:low created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro` lines 64-123
+ - **Issue**: Nav links have variable widths based on text content
+ - **Fix**: Add `min-width` or `width` to `.nav__link` or use flexbox with equal distribution
+ - **Est**: 1-2 hours
+
+- [ ] Duplicate path check #task[id:task_01HQABCD1234EFGH5678IJL7 status:to-do priority:low created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro` line 30
+ - **Issue**: `currentPath === "/" || currentPath === "/"` — redundant check
+ - **Fix**: Remove duplicate condition
+ - **Est**: 1 min
+
+### Architecture
+
+- [ ] Iframe cursor handling #task[id:task_01HQABCD1234EFGH5678IJL8 status:to-do priority:low created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro` cursor script lines 500-587
+ - **Issue**: Cursor script can't detect mouse events inside iframes (cross-origin limitation). Magnetic pointer doesn't work on iframes.
+ - **Fix**: Detect iframe hover, disable cursor inside iframes, or use overlay approach
+ - **Est**: 4-8 hours
+
+- [ ] Iframe modal UX improvement #task[id:task_01HQABCD1234EFGH5678IJL9 status:to-do priority:low created:2026-02-04]
+ - **Location**: `website/src/pages/tools.astro` lines 180-201
+ - **Issue**: Tools page uses iframes in modals - not ideal UX. Modal with iframe loading `/style-guide` and `/logo-iterator`.
+ - **Fix**: Consider replacing with direct navigation (no modal), use embed/component approach instead of iframe, or keep modal but improve mobile experience
+ - **Est**: 4-8 hours
+
+- [ ] View transitions #task[id:task_01HQABCD1234EFGH5678IJLA status:to-do priority:low created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro`, `website/astro.config.mjs`
+ - **Issue**: No view transition API usage found in codebase. Not implemented correctly.
+ - **Fix**: Implement View Transitions API for smooth page transitions. Add `@astrojs/view-transitions` integration.
+ - **Est**: 4-8 hours
+
+### Future
+
+- [ ] Self-host fonts #task[id:task_01HQABCD1234EFGH5678IJLB status:to-do priority:low created:2026-02-04]
+ - **Location**: Font loading
+ - **Issue**: Currently loading Inter, IBM Plex Mono, and League Gothic from Google Fonts. Self-hosting would eliminate external dependency and improve first-paint.
+ - **Fix**: Download fonts and serve locally. Fonts are already preconnected, so this is a nice-to-have.
+ - **Est**: 2-4 hours
+
+- [ ] Environment variables setup #task[id:task_01HQABCD1234EFGH5678IJLC status:to-do priority:low created:2026-02-04]
+ - **Location**: Project root
+ - **Issue**: No `.env` or `.env.example`. Will need one before adding analytics, API keys, or per-environment config.
+ - **Fix**: Create `.env.example` with template variables and document usage
+ - **Est**: 30 min
+
+- [ ] **🔴 Human Input Required**: Design token decisions - hand-written tokens #task[id:task_01HQABCD1234EFGH5678IJLD status:to-do priority:low created:2026-02-04]
+ - **Location**: `website/src/styles/global.css`, `tokens/tokens.json`
+ - **Issue**: 15 variables not in `tokens/tokens.json` are intentionally hand-authored in `global.css`: stripe gradients (`--s1`..`--s5`), stacked/repeating stripe backgrounds, warm glow, gold glow, shadow values. These are compositional — they combine primitives in ways that don't map cleanly to a flat token file.
+ - **Fix**: Decide whether to leave them hand-written (current, works fine), promote them to a second token file (e.g. `tokens/derived.json`) with a custom Style Dictionary transform, or accept the split as a feature
+ - **Est**: 1 hour (after decision)
+ - **Human Input**: Decision - Hand-written tokens approach: leave as-is, promote to token file, or accept split
+
+- [ ] **🔴 Human Input Required**: Design token decisions - unused tokens #task[id:task_01HQABCD1234EFGH5678IJLE status:to-do priority:low created:2026-02-04]
+ - **Location**: `tokens/tokens.json`
+ - **Issue**: Token JSON introduced z-index, breakpoint, and additional spacing/radius values that aren't yet consumed in CSS. They're harmless (generated but unused).
+ - **Fix**: Decide whether to wire them into components as the design evolves or prune unused ones from the JSON to keep the token file honest
+ - **Est**: 1 hour (after decision)
+ - **Human Input**: Decision - Unused tokens approach: wire into components or prune from JSON
+
+- [ ] **🔴 Human Input Required**: Site config decisions #task[id:task_01HQABCD1234EFGH5678IJLF status:to-do priority:low created:2026-02-04]
+ - **Location**: `website/src/layouts/Layout.astro` line 51, `public/favicon.svg`
+ - **Issue**: `variant-claude` body class is hardcoded on `` — controls the magnetic cursor. Doesn't track `SITE.logo`. Favicon not tied to logo variant system.
+ - **Fix**: Decide whether to make body class dynamic (`variant-${SITE.logo}`) so cursor and other variant styles follow the logo choice, or keep it pinned to `claude` if cursor behaviour is meant to persist regardless of logo. Decide favicon variant system approach.
+ - **Est**: 2-4 hours (after decision)
+ - **Human Input**: Decision - Make body class dynamic vs keep pinned to `claude`; favicon variant system approach
+
+- [ ] Wire up Astro content collections as lightweight CMS #task[id:task_01HQABCD1234EFGH5678IJLG status:to-do priority:low created:2026-02-04]
+ - **Location**: `website/src/content/config.ts`, `.astro` pages
+ - **Issue**: `src/content/config.ts` already defines `pages` and `posts` collections with schemas but nothing uses them yet. Old markdown files archived to `_archive/content/` — they were from multi-variant era and don't match current site structure.
+ - **Fix**: Create fresh markdown files in `src/content/pages/` matching current page inventory (story, model, engagements, work, contact, etc.). Refactor `.astro` pages to pull copy from `getCollection()` / `getEntry()` instead of hardcoding it. This turns the site into a markdown-driven CMS: update copy by editing `.md` files, no need to touch component code. The `work/index.astro` page is the best candidate to start with.
+ - **Est**: 8-16 hours
+
+- [ ] **🔴 Human Input Required**: Future ideas prioritization #task[id:task_01HQABCD1234EFGH5678IJLH status:to-do priority:low created:2026-02-04]
+ - **Location**: Various
+ - **Issue**: Multiple future ideas identified: logo variant dark-mode alternative, error pages (404/500) inline SVGs pulling colours from tokens, brief engine results in modal or dedicated page rather than just export
+ - **Fix**: Prioritize which ideas to pursue
+ - **Est**: Variable (after prioritization)
+ - **Human Input**: Prioritization - Requires human to prioritize which future ideas to pursue
-**Live projects to feature:**
-- **Signals** — Add as a featured case study (real engagement, real outcomes)
-- **Assisted work / AI-assisted builds** — Showcase the Claude-assisted development workflow itself as a case study or methodology highlight
+---
-**Pipeline / upcoming projects to queue up:**
-- **EdTech project** — Early-stage, could be a "Coming Soon" or teaser card
-- Other venture studio projects as they land
+## Blocked/Waiting
-**Implementation notes:**
-- Currently hardcoded as a JS array in `work/index.astro` (lines 5–46)
-- Ideal path: wire up content collections first (see above), then each case study is a markdown file
-- Case study schema could include: title, client, category, description, tags, impact metrics, featured flag, status (live / in-progress / coming-soon)
-- Consider adding individual case study pages (`/work/[slug]`) once there's enough depth per project
+*Tasks blocked by dependencies or awaiting human input. Move here when blocked.*
---
-## Performance & Polish
-
-### Self-host fonts
-Currently loading Inter, IBM Plex Mono, and League Gothic from Google Fonts. Self-hosting would eliminate the external dependency and improve first-paint. Fonts are already preconnected, so this is a nice-to-have.
+## Completed
-### Environment variables
-No `.env` or `.env.example`. Will need one before adding analytics, API keys, or per-environment config.
+*Completed tasks will be archived monthly to `TODO-archive-YYYY-MM.md`*
---
-## Future Ideas (not urgent)
+## Reference
-- Logo variant could include a dark-mode alternative
-- Error pages (404/500) inline SVGs could optionally pull colours from tokens for consistency, though their bespoke art direction is part of the charm
-- Brief engine could surface results in a modal or dedicated results page rather than just export
+- [Investigation Notes](cursor_branch_commit_comparison.md) - Detailed findings from branch comparison investigation
+- [Issue Templates](.github/ISSUE_TEMPLATE/) - Bug and content request templates
+- [Tracking System](.claude/commands/track.md) - Inline tracker syntax documentation
diff --git a/website/astro.config.mjs b/website/astro.config.mjs
index 54f5732..bcd0dda 100644
--- a/website/astro.config.mjs
+++ b/website/astro.config.mjs
@@ -1,8 +1,10 @@
import { defineConfig } from "astro/config";
+import icon from "astro-icon";
export default defineConfig({
site: "http://localhost:4321",
publicDir: "../public",
+ integrations: [icon()],
vite: {
server: {
port: 4321,
diff --git a/website/package.json b/website/package.json
index e43fbf8..6cf1738 100644
--- a/website/package.json
+++ b/website/package.json
@@ -12,7 +12,9 @@
"tokens:build": "style-dictionary build --config sd.config.js"
},
"dependencies": {
+ "@iconify-json/heroicons": "^1.2.3",
"astro": "^4.16.0",
+ "astro-icon": "^1.1.5",
"gray-matter": "^4.0.3",
"markdown-it": "^14.1.0"
},
diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml
index 48a69ee..f74eb6a 100644
--- a/website/pnpm-lock.yaml
+++ b/website/pnpm-lock.yaml
@@ -8,9 +8,15 @@ importers:
.:
dependencies:
+ '@iconify-json/heroicons':
+ specifier: ^1.2.3
+ version: 1.2.3
astro:
specifier: ^4.16.0
- version: 4.16.19(rollup@4.57.0)(typescript@5.9.3)
+ version: 4.16.19(@types/node@25.2.0)(rollup@4.57.0)(typescript@5.9.3)
+ astro-icon:
+ specifier: ^1.1.5
+ version: 1.1.5
gray-matter:
specifier: ^4.0.3
version: 4.0.3
@@ -24,6 +30,12 @@ importers:
packages:
+ '@antfu/install-pkg@1.1.0':
+ resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
+
+ '@antfu/utils@8.1.1':
+ resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
+
'@astrojs/compiler@2.13.0':
resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==}
@@ -278,6 +290,18 @@ packages:
cpu: [x64]
os: [win32]
+ '@iconify-json/heroicons@1.2.3':
+ resolution: {integrity: sha512-n+vmCEgTesRsOpp5AB5ILB6srsgsYK+bieoQBNlafvoEhjVXLq8nIGN4B0v/s4DUfa0dOrjwE/cKJgIKdJXOEg==}
+
+ '@iconify/tools@4.2.0':
+ resolution: {integrity: sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==}
+
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+ '@iconify/utils@2.3.0':
+ resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
+
'@img/sharp-darwin-arm64@0.33.5':
resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@@ -395,6 +419,10 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
+ '@isaacs/fs-minipass@4.0.1':
+ resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
+ engines: {node: '>=18.0.0'}
+
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -701,6 +729,10 @@ packages:
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+ '@trysound/sax@0.2.0':
+ resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+ engines: {node: '>=10.13.0'}
+
'@types/babel__core@7.20.5':
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
@@ -734,9 +766,15 @@ packages:
'@types/nlcst@2.0.3':
resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
+ '@types/node@25.2.0':
+ resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==}
+
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+ '@types/yauzl@2.10.3':
+ resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
+
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
@@ -784,6 +822,9 @@ packages:
assert@2.1.0:
resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==}
+ astro-icon@1.1.5:
+ resolution: {integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==}
+
astro@4.16.19:
resolution: {integrity: sha512-baeSswPC5ZYvhGDoj25L2FuzKRWMgx105FetOPQVJFMCAp0o08OonYC7AhwsFdhvp7GapqjnC1Fe3lKb2lupYw==}
engines: {node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
@@ -810,6 +851,9 @@ packages:
resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==}
hasBin: true
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
boxen@8.0.1:
resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==}
engines: {node: '>=18'}
@@ -823,6 +867,9 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
+ buffer-crc32@0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+
buffer@6.0.3:
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
@@ -864,6 +911,17 @@ packages:
character-entities@2.0.2:
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+ cheerio-select@2.1.0:
+ resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
+
+ cheerio@1.2.0:
+ resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==}
+ engines: {node: '>=20.18.1'}
+
+ chownr@3.0.0:
+ resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
+ engines: {node: '>=18'}
+
ci-info@4.4.0:
resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==}
engines: {node: '>=8'}
@@ -905,6 +963,10 @@ packages:
resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==}
engines: {node: '>=18'}
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
common-ancestor-path@1.0.1:
resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==}
@@ -912,6 +974,12 @@ packages:
resolution: {integrity: sha512-4m5s3Me2xxlVKG9PkZpQqHQR7bgpnN7joDMJ4yvVkVXngjoITG76IaZmzmywSeRTeTpc6N6r3H3+KyUurV8OYw==}
engines: {node: '>=18'}
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ confbox@0.2.2:
+ resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
@@ -923,11 +991,30 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
+ css-select@5.2.2:
+ resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
+
+ css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ css-tree@2.3.1:
+ resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ css-what@6.2.2:
+ resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==}
+ engines: {node: '>= 6'}
+
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'}
hasBin: true
+ csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -977,6 +1064,19 @@ packages:
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
dset@3.1.4:
resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
engines: {node: '>=4'}
@@ -1003,6 +1103,12 @@ packages:
emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ encoding-sniffer@0.2.1:
+ resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==}
+
+ end-of-stream@1.4.5:
+ resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
@@ -1011,6 +1117,10 @@ packages:
resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
engines: {node: '>=0.12'}
+ entities@7.0.1:
+ resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
+ engines: {node: '>=0.12'}
+
es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
@@ -1057,6 +1167,9 @@ packages:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
+ exsolve@1.0.8:
+ resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
+
extend-shallow@2.0.1:
resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
engines: {node: '>=0.10.0'}
@@ -1064,6 +1177,11 @@ packages:
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+ extract-zip@2.0.1:
+ resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
+ engines: {node: '>= 10.17.0'}
+ hasBin: true
+
fast-glob@3.3.3:
resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
engines: {node: '>=8.6.0'}
@@ -1071,6 +1189,9 @@ packages:
fastq@1.20.1:
resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==}
+ fd-slicer@1.1.0:
+ resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+
fill-range@7.1.1:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
@@ -1126,6 +1247,10 @@ packages:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
+ get-stream@5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+
github-slugger@2.0.0:
resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
@@ -1144,6 +1269,10 @@ packages:
engines: {node: 20 || >=22}
hasBin: true
+ globals@15.15.0:
+ resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
+ engines: {node: '>=18'}
+
gopd@1.2.0:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
@@ -1206,6 +1335,9 @@ packages:
html-void-elements@3.0.0:
resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+ htmlparser2@10.1.0:
+ resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==}
+
http-cache-semantics@4.2.0:
resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
@@ -1213,6 +1345,10 @@ packages:
resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==}
engines: {node: '>=10.18'}
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
@@ -1342,6 +1478,9 @@ packages:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
linkify-it@5.0.0:
resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
@@ -1349,6 +1488,10 @@ packages:
resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==}
engines: {node: '>=6'}
+ local-pkg@1.1.2:
+ resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==}
+ engines: {node: '>=14'}
+
locate-path@5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
@@ -1423,6 +1566,12 @@ packages:
mdast-util-to-string@4.0.0:
resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+ mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+ mdn-data@2.0.30:
+ resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+
mdurl@2.0.0:
resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
@@ -1535,6 +1684,13 @@ packages:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
+ minizlib@3.1.0:
+ resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
+ engines: {node: '>= 18'}
+
+ mlly@1.8.0:
+ resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
+
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
@@ -1557,6 +1713,9 @@ packages:
node-releases@2.0.27:
resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
object-inspect@1.13.4:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'}
@@ -1573,6 +1732,9 @@ packages:
resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
engines: {node: '>= 0.4'}
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
onetime@7.0.0:
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
engines: {node: '>=18'}
@@ -1611,9 +1773,18 @@ packages:
package-json-from-dist@1.0.1:
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+ package-manager-detector@1.6.0:
+ resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==}
+
parse-latin@7.0.0:
resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==}
+ parse5-htmlparser2-tree-adapter@7.1.0:
+ resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==}
+
+ parse5-parser-stream@7.1.2:
+ resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==}
+
parse5@7.3.0:
resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
@@ -1635,6 +1806,12 @@ packages:
path@0.12.7:
resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==}
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ pend@1.2.0:
+ resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -1654,6 +1831,12 @@ packages:
resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
engines: {node: '>=8'}
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ pkg-types@2.3.0:
+ resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==}
+
possible-typed-array-names@1.1.0:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
@@ -1686,6 +1869,9 @@ packages:
property-information@7.1.0:
resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
+ pump@3.0.3:
+ resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==}
+
punycode.js@2.3.1:
resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
engines: {node: '>=6'}
@@ -1697,6 +1883,9 @@ packages:
resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==}
engines: {node: '>=0.6'}
+ quansync@0.2.11:
+ resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
+
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
@@ -1772,6 +1961,9 @@ packages:
resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
engines: {node: '>= 0.4'}
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
section-matter@1.0.0:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>=4'}
@@ -1886,6 +2078,15 @@ packages:
engines: {node: '>=22.0.0'}
hasBin: true
+ svgo@3.3.2:
+ resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ tar@7.5.7:
+ resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==}
+ engines: {node: '>=18'}
+
thingies@2.5.0:
resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==}
engines: {node: '>=10.18'}
@@ -1898,6 +2099,10 @@ packages:
tinyexec@0.3.2:
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+ tinyexec@1.0.2:
+ resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
+ engines: {node: '>=18'}
+
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
@@ -1939,6 +2144,16 @@ packages:
uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
+ ufo@1.6.3:
+ resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
+
+ undici-types@7.16.0:
+ resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+
+ undici@7.20.0:
+ resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==}
+ engines: {node: '>=20.18.1'}
+
unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
@@ -2036,6 +2251,15 @@ packages:
web-namespaces@2.0.1:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+ whatwg-encoding@3.1.1:
+ resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+ engines: {node: '>=18'}
+ deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
+
+ whatwg-mimetype@4.0.0:
+ resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+ engines: {node: '>=18'}
+
which-pm-runs@1.1.0:
resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==}
engines: {node: '>=4'}
@@ -2069,16 +2293,26 @@ packages:
resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
engines: {node: '>=18'}
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
xxhash-wasm@1.1.0:
resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==}
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ yallist@5.0.0:
+ resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
+ engines: {node: '>=18'}
+
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
+ yauzl@2.10.0:
+ resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+
yocto-queue@1.2.2:
resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
engines: {node: '>=12.20'}
@@ -2102,6 +2336,13 @@ packages:
snapshots:
+ '@antfu/install-pkg@1.1.0':
+ dependencies:
+ package-manager-detector: 1.6.0
+ tinyexec: 1.0.2
+
+ '@antfu/utils@8.1.1': {}
+
'@astrojs/compiler@2.13.0': {}
'@astrojs/internal-helpers@0.4.1': {}
@@ -2367,6 +2608,39 @@ snapshots:
'@esbuild/win32-x64@0.21.5':
optional: true
+ '@iconify-json/heroicons@1.2.3':
+ dependencies:
+ '@iconify/types': 2.0.0
+
+ '@iconify/tools@4.2.0':
+ dependencies:
+ '@iconify/types': 2.0.0
+ '@iconify/utils': 2.3.0
+ cheerio: 1.2.0
+ domhandler: 5.0.3
+ extract-zip: 2.0.1
+ local-pkg: 1.1.2
+ pathe: 2.0.3
+ svgo: 3.3.2
+ tar: 7.5.7
+ transitivePeerDependencies:
+ - supports-color
+
+ '@iconify/types@2.0.0': {}
+
+ '@iconify/utils@2.3.0':
+ dependencies:
+ '@antfu/install-pkg': 1.1.0
+ '@antfu/utils': 8.1.1
+ '@iconify/types': 2.0.0
+ debug: 4.4.3
+ globals: 15.15.0
+ kolorist: 1.8.0
+ local-pkg: 1.1.2
+ mlly: 1.8.0
+ transitivePeerDependencies:
+ - supports-color
+
'@img/sharp-darwin-arm64@0.33.5':
optionalDependencies:
'@img/sharp-libvips-darwin-arm64': 1.0.4
@@ -2457,6 +2731,10 @@ snapshots:
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
+ '@isaacs/fs-minipass@4.0.1':
+ dependencies:
+ minipass: 7.1.2
+
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
@@ -2735,6 +3013,8 @@ snapshots:
'@shikijs/vscode-textmate@10.0.2': {}
+ '@trysound/sax@0.2.0': {}
+
'@types/babel__core@7.20.5':
dependencies:
'@babel/parser': 7.28.6
@@ -2778,8 +3058,18 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
+ '@types/node@25.2.0':
+ dependencies:
+ undici-types: 7.16.0
+ optional: true
+
'@types/unist@3.0.3': {}
+ '@types/yauzl@2.10.3':
+ dependencies:
+ '@types/node': 25.2.0
+ optional: true
+
'@ungap/structured-clone@1.3.0': {}
'@zip.js/zip.js@2.8.16': {}
@@ -2818,7 +3108,15 @@ snapshots:
object.assign: 4.1.7
util: 0.12.5
- astro@4.16.19(rollup@4.57.0)(typescript@5.9.3):
+ astro-icon@1.1.5:
+ dependencies:
+ '@iconify/tools': 4.2.0
+ '@iconify/types': 2.0.0
+ '@iconify/utils': 2.3.0
+ transitivePeerDependencies:
+ - supports-color
+
+ astro@4.16.19(@types/node@25.2.0)(rollup@4.57.0)(typescript@5.9.3):
dependencies:
'@astrojs/compiler': 2.13.0
'@astrojs/internal-helpers': 0.4.1
@@ -2874,8 +3172,8 @@ snapshots:
tsconfck: 3.1.6(typescript@5.9.3)
unist-util-visit: 5.1.0
vfile: 6.0.3
- vite: 5.4.21
- vitefu: 1.1.1(vite@5.4.21)
+ vite: 5.4.21(@types/node@25.2.0)
+ vitefu: 1.1.1(vite@5.4.21(@types/node@25.2.0))
which-pm: 3.0.1
xxhash-wasm: 1.1.0
yargs-parser: 21.1.1
@@ -2911,6 +3209,8 @@ snapshots:
baseline-browser-mapping@2.9.19: {}
+ boolbase@1.0.0: {}
+
boxen@8.0.1:
dependencies:
ansi-align: 3.0.1
@@ -2934,6 +3234,8 @@ snapshots:
node-releases: 2.0.27
update-browserslist-db: 1.2.3(browserslist@4.28.1)
+ buffer-crc32@0.2.13: {}
+
buffer@6.0.3:
dependencies:
base64-js: 1.5.1
@@ -2972,6 +3274,31 @@ snapshots:
character-entities@2.0.2: {}
+ cheerio-select@2.1.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-select: 5.2.2
+ css-what: 6.2.2
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+
+ cheerio@1.2.0:
+ dependencies:
+ cheerio-select: 2.1.0
+ dom-serializer: 2.0.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ encoding-sniffer: 0.2.1
+ htmlparser2: 10.1.0
+ parse5: 7.3.0
+ parse5-htmlparser2-tree-adapter: 7.1.0
+ parse5-parser-stream: 7.1.2
+ undici: 7.20.0
+ whatwg-mimetype: 4.0.0
+
+ chownr@3.0.0: {}
+
ci-info@4.4.0: {}
cli-boxes@3.0.0: {}
@@ -3006,10 +3333,16 @@ snapshots:
commander@12.1.0: {}
+ commander@7.2.0: {}
+
common-ancestor-path@1.0.1: {}
component-emitter@2.0.0: {}
+ confbox@0.1.8: {}
+
+ confbox@0.2.2: {}
+
convert-source-map@2.0.0: {}
cookie@0.7.2: {}
@@ -3020,8 +3353,32 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
+ css-select@5.2.2:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.2.2
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-tree@2.2.1:
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+
+ css-tree@2.3.1:
+ dependencies:
+ mdn-data: 2.0.30
+ source-map-js: 1.2.1
+
+ css-what@6.2.2: {}
+
cssesc@3.0.0: {}
+ csso@5.0.5:
+ dependencies:
+ css-tree: 2.2.1
+
debug@4.4.3:
dependencies:
ms: 2.1.3
@@ -3063,6 +3420,24 @@ snapshots:
dlv@1.1.3: {}
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
dset@3.1.4: {}
dunder-proto@1.0.1:
@@ -3083,10 +3458,21 @@ snapshots:
emoji-regex@9.2.2: {}
+ encoding-sniffer@0.2.1:
+ dependencies:
+ iconv-lite: 0.6.3
+ whatwg-encoding: 3.1.1
+
+ end-of-stream@1.4.5:
+ dependencies:
+ once: 1.4.0
+
entities@4.5.0: {}
entities@6.0.1: {}
+ entities@7.0.1: {}
+
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
@@ -3139,12 +3525,24 @@ snapshots:
events@3.3.0: {}
+ exsolve@1.0.8: {}
+
extend-shallow@2.0.1:
dependencies:
is-extendable: 0.1.1
extend@3.0.2: {}
+ extract-zip@2.0.1:
+ dependencies:
+ debug: 4.4.3
+ get-stream: 5.2.0
+ yauzl: 2.10.0
+ optionalDependencies:
+ '@types/yauzl': 2.10.3
+ transitivePeerDependencies:
+ - supports-color
+
fast-glob@3.3.3:
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -3157,6 +3555,10 @@ snapshots:
dependencies:
reusify: 1.1.0
+ fd-slicer@1.1.0:
+ dependencies:
+ pend: 1.2.0
+
fill-range@7.1.1:
dependencies:
to-regex-range: 5.0.1
@@ -3213,6 +3615,10 @@ snapshots:
dunder-proto: 1.0.1
es-object-atoms: 1.1.1
+ get-stream@5.2.0:
+ dependencies:
+ pump: 3.0.3
+
github-slugger@2.0.0: {}
glob-parent@5.1.2:
@@ -3232,6 +3638,8 @@ snapshots:
package-json-from-dist: 1.0.1
path-scurry: 2.0.1
+ globals@15.15.0: {}
+
gopd@1.2.0: {}
graceful-fs@4.2.11: {}
@@ -3348,10 +3756,21 @@ snapshots:
html-void-elements@3.0.0: {}
+ htmlparser2@10.1.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ entities: 7.0.1
+
http-cache-semantics@4.2.0: {}
hyperdyperid@1.2.0: {}
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
ieee754@1.2.1: {}
import-meta-resolve@4.2.0: {}
@@ -3451,6 +3870,8 @@ snapshots:
kleur@4.1.5: {}
+ kolorist@1.8.0: {}
+
linkify-it@5.0.0:
dependencies:
uc.micro: 2.1.0
@@ -3462,6 +3883,12 @@ snapshots:
pify: 4.0.1
strip-bom: 3.0.0
+ local-pkg@1.1.2:
+ dependencies:
+ mlly: 1.8.0
+ pkg-types: 2.3.0
+ quansync: 0.2.11
+
locate-path@5.0.0:
dependencies:
p-locate: 4.1.0
@@ -3622,6 +4049,10 @@ snapshots:
dependencies:
'@types/mdast': 4.0.4
+ mdn-data@2.0.28: {}
+
+ mdn-data@2.0.30: {}
+
mdurl@2.0.0: {}
memfs@4.56.10(tslib@2.8.1):
@@ -3847,6 +4278,17 @@ snapshots:
minipass@7.1.2: {}
+ minizlib@3.1.0:
+ dependencies:
+ minipass: 7.1.2
+
+ mlly@1.8.0:
+ dependencies:
+ acorn: 8.15.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.3
+
mrmime@2.0.1: {}
ms@2.1.3: {}
@@ -3861,6 +4303,10 @@ snapshots:
node-releases@2.0.27: {}
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
object-inspect@1.13.4: {}
object-is@1.1.6:
@@ -3879,6 +4325,10 @@ snapshots:
has-symbols: 1.1.0
object-keys: 1.1.1
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
onetime@7.0.0:
dependencies:
mimic-function: 5.0.1
@@ -3924,6 +4374,8 @@ snapshots:
package-json-from-dist@1.0.1: {}
+ package-manager-detector@1.6.0: {}
+
parse-latin@7.0.0:
dependencies:
'@types/nlcst': 2.0.3
@@ -3933,6 +4385,15 @@ snapshots:
unist-util-visit-children: 3.0.0
vfile: 6.0.3
+ parse5-htmlparser2-tree-adapter@7.1.0:
+ dependencies:
+ domhandler: 5.0.3
+ parse5: 7.3.0
+
+ parse5-parser-stream@7.1.2:
+ dependencies:
+ parse5: 7.3.0
+
parse5@7.3.0:
dependencies:
entities: 6.0.1
@@ -3953,6 +4414,10 @@ snapshots:
process: 0.11.10
util: 0.10.4
+ pathe@2.0.3: {}
+
+ pend@1.2.0: {}
+
picocolors@1.1.1: {}
picomatch@2.3.1: {}
@@ -3965,6 +4430,18 @@ snapshots:
dependencies:
find-up: 4.1.0
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.8.0
+ pathe: 2.0.3
+
+ pkg-types@2.3.0:
+ dependencies:
+ confbox: 0.2.2
+ exsolve: 1.0.8
+ pathe: 2.0.3
+
possible-typed-array-names@1.1.0: {}
postcss@8.5.6:
@@ -3992,6 +4469,11 @@ snapshots:
property-information@7.1.0: {}
+ pump@3.0.3:
+ dependencies:
+ end-of-stream: 1.4.5
+ once: 1.4.0
+
punycode.js@2.3.1: {}
punycode@1.4.1: {}
@@ -4000,6 +4482,8 @@ snapshots:
dependencies:
side-channel: 1.1.0
+ quansync@0.2.11: {}
+
queue-microtask@1.2.3: {}
regex-recursion@5.1.1:
@@ -4154,6 +4638,8 @@ snapshots:
es-errors: 1.3.0
is-regex: 1.2.1
+ safer-buffer@2.1.2: {}
+
section-matter@1.0.0:
dependencies:
extend-shallow: 2.0.1
@@ -4321,6 +4807,24 @@ snapshots:
transitivePeerDependencies:
- tslib
+ svgo@3.3.2:
+ dependencies:
+ '@trysound/sax': 0.2.0
+ commander: 7.2.0
+ css-select: 5.2.2
+ css-tree: 2.3.1
+ css-what: 6.2.2
+ csso: 5.0.5
+ picocolors: 1.1.1
+
+ tar@7.5.7:
+ dependencies:
+ '@isaacs/fs-minipass': 4.0.1
+ chownr: 3.0.0
+ minipass: 7.1.2
+ minizlib: 3.1.0
+ yallist: 5.0.0
+
thingies@2.5.0(tslib@2.8.1):
dependencies:
tslib: 2.8.1
@@ -4329,6 +4833,8 @@ snapshots:
tinyexec@0.3.2: {}
+ tinyexec@1.0.2: {}
+
to-regex-range@5.0.1:
dependencies:
is-number: 7.0.0
@@ -4353,6 +4859,13 @@ snapshots:
uc.micro@2.1.0: {}
+ ufo@1.6.3: {}
+
+ undici-types@7.16.0:
+ optional: true
+
+ undici@7.20.0: {}
+
unified@11.0.5:
dependencies:
'@types/unist': 3.0.3
@@ -4443,20 +4956,27 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vite@5.4.21:
+ vite@5.4.21(@types/node@25.2.0):
dependencies:
esbuild: 0.21.5
postcss: 8.5.6
rollup: 4.57.0
optionalDependencies:
+ '@types/node': 25.2.0
fsevents: 2.3.3
- vitefu@1.1.1(vite@5.4.21):
+ vitefu@1.1.1(vite@5.4.21(@types/node@25.2.0)):
optionalDependencies:
- vite: 5.4.21
+ vite: 5.4.21(@types/node@25.2.0)
web-namespaces@2.0.1: {}
+ whatwg-encoding@3.1.1:
+ dependencies:
+ iconv-lite: 0.6.3
+
+ whatwg-mimetype@4.0.0: {}
+
which-pm-runs@1.1.0: {}
which-pm@3.0.1:
@@ -4499,12 +5019,21 @@ snapshots:
string-width: 7.2.0
strip-ansi: 7.1.2
+ wrappy@1.0.2: {}
+
xxhash-wasm@1.1.0: {}
yallist@3.1.1: {}
+ yallist@5.0.0: {}
+
yargs-parser@21.1.1: {}
+ yauzl@2.10.0:
+ dependencies:
+ buffer-crc32: 0.2.13
+ fd-slicer: 1.1.0
+
yocto-queue@1.2.2: {}
zod-to-json-schema@3.25.1(zod@3.25.76):
diff --git a/website/src/layouts/Layout.astro b/website/src/layouts/Layout.astro
index b12621f..1f7a60f 100644
--- a/website/src/layouts/Layout.astro
+++ b/website/src/layouts/Layout.astro
@@ -1,25 +1,27 @@
---
import "../styles/global.css";
import { SITE } from "../lib/site";
+import { Icon } from "astro-icon/components";
interface Props {
title?: string;
description?: string;
}
-const { title = "WE3", description = "Small teams for big challenges" } = Astro.props;
+const { title = "WE3", description = "Small teams for big challenges" } =
+ Astro.props;
const currentPath = Astro.url.pathname;
const logoSrc = `/images/logos/${SITE.logo}.svg`;
const navLeft = [
- { href: "/story", label: "Our Story" },
- { href: "/model", label: "The Model" },
- { href: "/engagements", label: "Engagements" },
+ { href: "/story", label: "Our Story", icon: "heroicons:book-open" },
+ { href: "/model", label: "The Model", icon: "heroicons:squares-plus" },
+ { href: "/engagements", label: "Engagements", icon: "heroicons:user-group" },
];
const navRight = [
- { href: "/work", label: "Work" },
- { href: "/tools", label: "Tools" },
- { href: "/contact", label: "Contact" },
+ { href: "/work", label: "Work", icon: "heroicons:briefcase" },
+ { href: "/tools", label: "Tools", icon: "heroicons:wrench" },
+ { href: "/contact", label: "Contact", icon: "heroicons:envelope" },
];
const navAll = [...navLeft, ...navRight];
@@ -31,495 +33,608 @@ function isActive(href: string): boolean {
}
---
-
+
-
-
-
-
- {title} | WE3
-
-
-
-
-
-
-
-
-
-
-
-
- Skip to main content
-
-
-
-
+
+
+
+
+ {title} | WE3
+
+
+
+
+
+
+
+
+
+
+
+
+ Skip to main content
+
+
+
+
+
+
+
+
+
+
+