diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 686ff91..3aa3c74 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,15 +9,19 @@ on: jobs: build: runs-on: ubuntu-latest + env: + NEXT_PUBLIC_BUILD_ID: ${{ github.sha }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: npm - name: Install dependencies run: npm ci - - name: Type-check and build - run: npm run build + - name: Lint, typecheck, build, and validate export + run: npm run check + - name: Audit production dependencies + run: npm audit --omit=dev --audit-level=high diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index cb37755..acbd9c9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,20 +17,22 @@ concurrency: jobs: build: runs-on: ubuntu-latest + env: + NEXT_PUBLIC_BUILD_ID: ${{ github.sha }} steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: npm - name: Install dependencies run: npm ci - - name: Typecheck - run: npx tsc --noEmit - - name: Build - run: npm run build + - name: Lint, typecheck, build, and validate export + run: npm run check + - name: Audit production dependencies + run: npm audit --omit=dev --audit-level=high - name: Upload Pages artifact uses: actions/upload-pages-artifact@v3 with: diff --git a/README.md b/README.md index 0d13df4..382c521 100644 --- a/README.md +++ b/README.md @@ -6,26 +6,27 @@ Personal site, engineering projects showcase, and technical notes archive. ## Overview -Static-exported personal site built with Next.js 15 App Router and React 19. Designed for sub-second page loads, clean semantic HTML structure, and seamless deployment across GitHub Pages and custom targets. +Static-exported personal site built with Next.js 16 App Router and React 19. It combines a cinematic visual journal with project work, field notes, and a clear public identity as a dental student and independent builder in Adelaide. ## Features * **Site-wide search** — ⌘K (or `/`) command palette across pages, notes, and projects. * **Notes/journal system** — single data source (`config/notes.ts`) driving the index, homepage journal, per-note metadata, prev/next pagination, share actions, and print styles. * **SEO layer** — `sitemap.xml`, `robots.txt`, RSS (`/feed.xml`), canonical URLs, Open Graph/Twitter cards, and JSON-LD (Person, WebSite, BlogPosting, BreadcrumbList). -* **PWA** — web manifest plus a service worker for offline reading (network-first pages, stale-while-revalidate assets). -* **Performance** — responsive `srcset` images, content-visibility-friendly layout, zero-CLS media via CSS aspect ratios. -* **Accessibility** — WCAG AA contrast, keyboard-navigable dialogs and tabs, reduced-motion support, correct `lang` tagging for bilingual content. +* **PWA** — ambience is opt-in, the service worker is versioned per deployment, and offline reading cannot pin an older page to stale JavaScript chunks. +* **Performance** — responsive `srcset` images, content-visibility-friendly layout, zero-CLS media via explicit dimensions and aspect ratios. +* **Accessibility** — keyboard-navigable dialogs and menus, reduced-motion support, semantic sharing controls, and correct `lang` tagging for bilingual content. ## Technical Details -* **Framework**: Next.js 15 (App Router, static export mode `output: 'export'`). -* **UI & Styling**: React 19, TypeScript, Tailwind CSS, and `next-themes` for system-aware dark mode switching. -* **Build Pipeline**: Static site generation producing optimized static assets to `out/` for edge deployment; CI typechecks and builds on every push to `main`, then deploys to GitHub Pages. +* **Framework**: Next.js 16 (App Router, static export mode `output: 'export'`). +* **UI & Styling**: React 19, TypeScript, Tailwind CSS, Framer Motion, and `next-themes`. +* **Quality gate**: ESLint, TypeScript, production build, internal route/asset/fragment validation, service-worker syntax validation, and a high-severity production dependency audit. +* **Deployment**: GitHub Pages receives an artifact only after the complete quality gate passes on Node.js 22. ## Development -Requires Node.js 20+. +Requires Node.js 22+. ```bash npm install @@ -35,9 +36,11 @@ npm run dev ## Build & Export ```bash -npm run build +npm run check ``` +`npm run check` lints the active application source, typechecks it, builds the complete static export, and verifies internal links, fragments, required metadata files, manifest validity, and service-worker syntax. CI and deployment additionally require a clean high-severity production dependency audit. + ## License MIT diff --git a/app/about/page.tsx b/app/about/page.tsx index 71c434c..ec6a728 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -4,7 +4,7 @@ import { pageMetadata } from '@/config/pageMetadata'; export const metadata = pageMetadata({ title: 'About — Austin Liu', description: - 'Builder, traveller, photographer, and writer behind The Last Blue Hour.', + 'Dental student, builder, traveller, photographer, and writer behind The Last Blue Hour.', image: '/assets/blue-hour/afterlight-1200.jpg', imageAlt: 'A small stone cabin with one warm window on a blue moor', }); diff --git a/components/BlueHourJumpShell.tsx b/components/BlueHourJumpShell.tsx index c8e1853..87c6137 100644 --- a/components/BlueHourJumpShell.tsx +++ b/components/BlueHourJumpShell.tsx @@ -32,7 +32,6 @@ export function BlueHourPicture({