Commit Graph

11 Commits

Author SHA1 Message Date
cesnimda 743cce306b docs: finalise PROJECT_STATUS + TODO; lint public browser script
CI / quality (push) Has been cancelled
CI / e2e (push) Has been cancelled
CI / lighthouse (push) Has been cancelled
CI / relay (push) Has been cancelled
CI / images (push) Has been cancelled
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 06:24:12 +02:00
cesnimda 9088dcffb9 feat: Docker images, compose stacks, nginx config, Gitea CI
- site image: multi-stage node build -> unprivileged nginx (non-root, read-only)
- nginx: CSP + security headers, immutable asset caching, revalidated HTML,
  canonical trailing slash, preserved /Linkedin 301, legacy-WP 410s, custom 404
- externalise theme-init so CSP uses script-src 'self' (no inline hash)
- prod + dev compose; .env.example; relay Dockerfile fixed (image ships app user)
- Gitea Actions: quality, e2e, lighthouse budgets, relay build, image push on main
- verified: both images build; relay healthz 200; site serves EN/NO with CSP + redirect

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 06:21:35 +02:00
cesnimda 033c9ec315 test: vitest unit + playwright e2e suites; fix a11y, contrast, no-JS reveal
- vitest: dictionary parity, slug-map bijection, content-schema validation, JSON-LD (23)
- playwright: both locales, language-switch mapping (incl. no-JS), CV downloads,
  form happy-path + honeypot, axe a11y on 5 templates x 2 themes (23)
- fix: raise ink-faint + light accent to meet WCAG AA 4.5:1 (axe-verified)
- fix: gate reveal animations behind html.js so content is visible without JS
  (progressive enhancement - was hidden at opacity 0); scan reduced-motion path
- fix: validate contact form before the anti-bot time-trap (no false success)
- chore: ESLint node globals, typed diagram props, resvg fontFiles, prettier pass

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 06:14:18 +02:00
cesnimda 1b5204e7f8 feat: build-time OpenGraph images (satori-free, resvg + vendored TTFs)
- one 1200x630 PNG per page per locale, design-system styled
- hand-built SVG rasterised by resvg (handles variable fonts; satori cannot)
- vendored Space Grotesk / Inter / JetBrains Mono TTFs for deterministic offline builds

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 01:35:28 +02:00
cesnimda 2330f374fc feat: case-study template, all pages, routing, sitemap, 404
- case-study components: CsHeader, TldrBox, MiniToc, SectionRenderer, DecisionList,
  ArchDiagram (data-driven), Gallery, NextPrev, CaseStudyPage
- standalone pages: projects index, about, experience, contact (with form),
  cv hub, colophon — all EN/NO compositions
- full route tree: EN root + /no localised slugs (prosjekter, om-meg, erfaring,
  kontakt, kolofon, hjemmelab) per ROUTING_SPEC
- bilingual 404 with trace-fray motif; robots.txt + sitemap.xml from slug map
- Portrait atom; reusable sections gain header/eyebrow toggles for standalone pages

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 01:30:32 +02:00
cesnimda 9a6d0edf6d chore: add favicon (CB monogram)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 01:20:47 +02:00
cesnimda 1fce1b3cec feat: core layout, UI atoms, homepage + behaviour modules
- UI atoms: Chip, Button, SplitCvButton, LangSwitch, ThemeToggle, Card,
  SectionLabel, TraceMotif, FramedImage
- core: Base/Seo/Header/MobileNav/Footer/HintBar/SkipLink/ThemeScript
- homepage sections: Hero, ProofStrip, SkillsGrid, ProjectCards,
  ExperienceTimeline, AboutTeaser, ContactBand + Homepage composition (EN/NO)
- behaviour modules: theme, nav (overlay/hint/copy/header), observer (reveal/spy),
  lightbox, form — progressive enhancement, fail-silent
- SEO head component: meta, hreflang from slug map, JSON-LD, OG references
- move content data to src/data (avoid Astro reserved content-collection folder)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 01:20:46 +02:00
cesnimda 2184a1892f feat: content layer — zod schemas, validated bilingual data, locale view models
- schema.ts: zod schemas per DATA_MODEL (profile, projects, experience, skills, meta)
- nested {en,no} model: invariant facts once, prose twice; validated at build
- content: profile, skills, experience (with apprentice->developer progression),
  JobTrack + InboxIntel case studies with data-driven arch diagrams, homelab capability page
- per-page SEO meta (EN/NO)
- content.ts: locale-resolved view models; CV PDFs wired
- deviation from literal Astro-collections logged in PROJECT_STATUS with rationale

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 01:05:21 +02:00
cesnimda 63db8bf254 feat: i18n layer — locales, slug-map contract, typed dictionaries
- locales.ts: locale codes, html lang, hreflang, OG locale
- slugMap.ts: EN/NO route table + section anchors, twin-path resolver (the tested contract)
- typed EN/NO dictionaries implementing one interface (missing key = compile error)
- useDict accessor + interpolate helper; no runtime i18n library

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 00:54:02 +02:00
cesnimda 9a75f73550 chore: temporary smoke-test home page (replaced in pages milestone)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 00:51:16 +02:00
cesnimda ff27b918ae chore: scaffold Astro 5 project with token/style layer
- Astro 5 static config (trailing-slash canonical, i18n en-root/no-prefixed)
- Tailwind 4 over CSS custom-property tokens (both themes via [data-theme])
- design tokens: colour/spacing/type/radius/motion per Phase 1 specs
- motion layer with reduced-motion overrides
- strict TypeScript, ESLint flat config, Prettier
- self-hosted variable fonts (Space Grotesk / Inter / JetBrains Mono)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 00:51:15 +02:00