1. 07 Jun, 2026 7 commits
    • refactor(styles): extract token layer, kill the global neon leak · 9a2498a9
      Phase 1 Step 4. Move the palette out of globals.css :root into a new
      styles/tokens.css: a neutral/professional default on :root (landing +
      content) and the ParVagues neon/dark palette scoped to
      [data-theme="parvagues"], set on the app/parvagues/layout.tsx wrapper.
      The ~90 var(--…) consumers resolve against that ancestor scope, so
      theming is one attribute — no per-component edits.
      
      - globals.css: drop the :root palette + hardcoded dark html/body bg;
        body now reads var(--surface)/var(--text-primary).
      - parvagues.module.css: remove the dead duplicate .colorRoot/.colorContainer.
      - main.css: replace the body:not(:has(.parvagues-root)) element-style hack
        with a positive .site-shell scope on the content Layout container; links
        use the new --link token.
      - delete dead styles/dunbar.module.css.
      
      Verified: prod build green (14 routes, ParVagues ISR intact); fresh-dev
      smoke all 200; data-theme scoping confirmed (landing neutral, parvagues neon).
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      PLN (Algolia) authored
    • feat(app-router): migrate CosmicFest, remove Pages Router, update docs · 3dfa3a52
      Step 3 (group 3 of 3) — completes the App Router migration. The Pages
      Router is now fully gone (no more pages/ or _app.js).
      
      - /cosmicfest: server metadata wrapper + CosmicFestClient ('use client')
        for the modal/keyboard state. Swapped the deprecated next/image
        layout="intrinsic"/objectFit props for modern width/height + style.
      - Deleted the dead legacy shells components/ParVaguesHeader.js and
        components/ParVaguesFooter.js (only ever referenced by commented-out
        imports in CosmicFest).
      - tests/jest.setup.js: mock next/navigation (App Router hooks) instead of
        next/router.
      - CLAUDE.md: Pages Router -> App Router throughout (global CSS from
        app/layout.tsx, server-components-by-default + 'use client' leaves,
        generateStaticParams, the root-shell + ParVagues-sub-layout split,
        next/navigation in tests).
      
      Full App Router build green; route-smoke 14/14.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      PLN (Algolia) authored
    • feat(app-router): migrate ParVagues onto the shared shell · 8206199a
      Step 3 (group 2 of 3). Moves /parvagues, /parvagues/fiche,
      /parvagues/live and /parvagues/live/[slug] to the App Router under a
      single segment layout, retiring the old per-page components/parvagues/Layout.js.
      
      - app/parvagues/layout.tsx: the ParVagues sub-shell (Syne via next/font,
        parvagues-root/noise-overlay wrapper, footer) inheriting the root shell.
        Header scroll-state and the `.reveal` IntersectionObserver are split into
        client leaves (ParvaguesHeader, RevealController); the latter re-arms on
        client-side navigation via usePathname so reveals keep working between pages.
      - Pages become thin server components: data fetch + metadata + segment config
        (revalidate=60 on /parvagues and /parvagues/live/[slug] preserved;
        getStaticPaths -> generateStaticParams; per-page <title> -> metadata).
      - /parvagues/live redirect: client useRouter.replace -> server redirect().
      - /parvagues/live/[slug]: the interactive body (Prism, loupe, countdown,
        gallery) extracted to a client component (LiveEvent); the server page does
        the fs/data fetch.
      - /parvagues/fiche: window.print + <style jsx global> body extracted to a
        client component (FicheContent) behind a server metadata wrapper.
      - Marked the page-rendered feature components 'use client'
        (TourTimeline, MusicSection, VideoSection, BookingForm); Hero/BioSection/
        AsSeenAt stay server.
      - Dropped og:type="music.musician" (not in Next's typed Metadata enum; it
        threw at prerender) — inherits the root "website" default; see note for Phase 2.
      
      Build green; route-smoke 14/14. Only /cosmicfest remains on the Pages Router.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      PLN (Algolia) authored
    • feat(app-router): migrate landing + content routes to App Router · e1595147
      Step 3 (group 1 of 3) of the foundation redesign. Stands up the root
      App-Router shell and moves the low-risk static/content routes onto it,
      leaving ParVagues + CosmicFest on the Pages Router for now (no route URL
      changes — the smoke net stays green across the split).
      
      - app/layout.tsx: the one root shell (<html>/<body> + global CSS), with
        the shared <head> (OG/twitter/icons/title template) consolidated from
        components/layout.js into the Metadata API.
      - Migrated: / , /talks, /starry-nights, /hydra, /hydra/[id],
        /post/[id], /poesie/[id], /poesie, /fleurs. getStaticProps -> inline
        server fetch; getStaticPaths -> generateStaticParams; <Head> -> metadata.
      - components/layout.js: now a client component using next/navigation
        (router.back) instead of next/router; <Head> removed.
      - Client boundaries split out where needed: HydraClient (ssr:false dynamic),
        PoemsBrowser (filter/sort state), FleursClient (p5 + styled-jsx).
      - Deprecation sweep: dropped next/link legacyBehavior (talks, starry-nights;
        they wrapped invalid nested anchors) and the render-blocking Google Fonts
        <link> on /fleurs (now next/font Cormorant Garamond). Removed dead
        ReactPlayer import on /talks.
      - tsconfig moduleResolution -> bundler; added .yarn/sdks (PnP TS SDK for
        editors). next.config: skip Next's build-time type-check — its generated
        route validators deep-import a Next-internal type that stock (non-PnP)
        tsc can't resolve in Yarn PnP zips; SWC compile + lint + smoke are the gates.
      
      Build green (App + Pages split); route-smoke 14/14.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      PLN (Algolia) authored
    • test(redesign): Phase 1 Step 2 — add route-smoke safety net · fe205e02
      Re-establish a baseline of coverage (Phase 0 removed all tests with Dunbar)
      and guard the upcoming App Router migration: the route URLs are stable across
      that migration, so this spec must stay green before and after.
      
      - tests/e2e/smoke.spec.ts: visits all 14 public routes, asserts the document
        responds < 400, renders non-empty content, and throws no genuine uncaught
        exception. Tolerates dev-only React hydration warnings and third-party embed
        noise (would otherwise be flaky); caps the settle wait so embed-heavy pages
        don't hang.
      - Fix a pre-existing Playwright version split: @playwright/test (1.57.0 via
        ^1.55.0) and playwright (1.58.2) resolved to two copies, breaking the runner
        ("test() not expected here"). Pin both to 1.60.0.
      
      All 14 routes green (~55s, Node 20). Surfaced for later: a real /cosmicfest
      dev-mode hydration mismatch (task #7), a legacyBehavior next/link deprecation,
      and a next/head stylesheet warning — all to address in the App Router pass.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      PLN (Algolia) authored
    • refactor(redesign): Phase 1 Step 1 — hoist app from next/ to repo root · 6e51fffd
      Flatten the nested next/ app directory up to the repository root, removing
      the `cd next` friction that the old .cursor/rules existed largely to manage.
      
      - Move all app files (pages, components, lib, styles, content, public,
        tests, scripts, configs) and Yarn Zero-Install state (.pnp.cjs, .yarn/)
        from next/ to repo root via git mv (history preserved, 316 renames).
      - Merge next/.gitignore into the root .gitignore; note .pnp.cjs/.yarn are
        committed (Zero-Install) and must not be ignored.
      - Pin outputFileTracingRoot to the project in next.config.js: a stray
        ~/package-lock.json was making Next infer the wrong workspace root.
        Also makes standalone output tracing correct for self-hosting later.
      - Update CLAUDE.md: commands run from repo root; @/ alias, content/,
        public/, .next/ paths corrected; Vercel root dir must become '.'.
      
      Build green from root (yarn build, Node 20, all 14 route patterns, zero
      warnings). Content loaders (process.cwd()-based) resolve correctly since
      content/ and public/ now sit at the root.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      PLN (Algolia) authored
    • chore(redesign): Phase 0 — remove Dunbar, fix prod bugs, prune deps · 50e87a15
      Demolition step ahead of the site rationalization (App Router + shared
      design system foundation to follow).
      
      - Remove Dunbar entirely (pages, components, lib, tests); it's folding
        into a separate project. UX learnings preserved at
        docs/dunbar-design-learnings.md.
      - Prune 6 now-unused deps: d3-force, d3-zoom, minisearch,
        react-force-graph(-2d), snowball-stemmers, stopword.
      - Fix 3 production bugs in layout.js: drop the http://localhost:8097
        React DevTools script, replace the create-next-app template OG image
        with the site profile image, and compute the footer year dynamically.
      - Delete dead files: pages/parvagues.js.backup, the unused HeroVariants.
      - Add CLAUDE.md documenting the codebase and the redesign state.
      
      Build green (yarn build, 40 routes). Note: this removes all test
      coverage (it was all Dunbar's) — to be re-established in Phase 2.
      Co-Authored-By: 's avatarClaude Opus 4.8 (1M context) <noreply@anthropic.com>
      PLN (Algolia) authored
  2. 24 May, 2026 3 commits
    • fix(parvagues): clamp loupe width to viewport on narrow screens · 5fd1374e
      Shrink the loupe popup to (viewport_width - 32px) when 480px would
      overflow, keeping the 16:9 aspect ratio. Centering math uses the
      computed width so the clamp keeps the popup fully on-screen.
      PLN (Algolia) authored
    • fix(parvagues): mobile-friendly loupe — tap-to-zoom then tap-to-open · 40891851
      On touch devices the loupe overlay is now revealed by the first tap on a
      track thumbnail (the link's default action is prevented). A second tap on
      the same thumbnail navigates to the Instagram album. Tap-outside or 4s
      timeout auto-closes the loupe. Desktop hover behavior unchanged — gated
      on (hover: hover) media query.
      PLN (Algolia) authored
    • feat(parvagues): add Montreuil Algorave gig page · 11d7a44d
      15-track collapsible list driven by metadata extracted from the .tidal
      sources via the Pulsar HUD parser. Each row: name, BPM, style, expandable
      ingredients (per-orbit sample/role/CC bindings) + git.nech.pl src link.
      Six tracks have IG story loops (5s, 16:9 cropped from 9:16 originals,
      ~150 KB each) with a fixed-position hover loupe (480×270) that escapes
      the row's clipping box; click opens the highlight album. Page-level SC
      embed + Instagram album link in MediaSection. Full-length story MP4s
      gitignored — only the loop previews + jpg thumbs ship.
      PLN (Algolia) authored
  3. 01 May, 2026 1 commit
  4. 16 Mar, 2026 5 commits
  5. 15 Mar, 2026 6 commits
  6. 14 Mar, 2026 3 commits
    • fix(tailwind): align PostCSS config with Tailwind v4 docs · 706b2d03
      Root cause: Vercel wasn't processing Tailwind through @tailwindcss/postcss,
      serving raw CSS with zero utility classes (23KB theme-only vs 53KB with
      utilities). The source() directive was output literally as @media source().
      
      Fixes per official Tailwind v4 + Next.js setup:
      - Switch postcss.config.js (CJS) → postcss.config.mjs (ESM)
      - Remove autoprefixer (built into Tailwind v4)
      - Use plain @import "tailwindcss" (auto source detection)
      - Move tailwindcss + @tailwindcss/postcss to dependencies
      PLN (Algolia) authored
    • refactor: remove Bootstrap, fix Tailwind v4 in production · e903cb57
      Bootstrap's CSS was overriding all Tailwind utility classes in production,
      making parvagues render as raw unstyled HTML. Root cause: _app.js imported
      bootstrap.css globally before globals.css (Tailwind v4).
      
      - Remove bootstrap dependency and import from _app.js
      - Remove stale tailwind.config.js (v3 format, ignored by v4)
      - Remove @tailwindcss/aspect-ratio (v3 plugin, built-in in v4)
      - Replace 3 Bootstrap `container` usages with Tailwind equivalents
      - Scope main.css legacy element styles with :not(:has(.parvagues-root))
        to prevent link colors, section margins, footer styles from bleeding
        into parvagues pages
      - Add .parvagues-root class to parvagues Layout for scoping
      PLN (Algolia) authored
  7. 13 Mar, 2026 3 commits
  8. 12 Mar, 2026 1 commit
    • feat(fleurs): generative garden invitation — La Fête des Fleurs · 15299120
      p5.js canvas with impressionist top-down flower garden: organic bloom
      lifecycle (bud → bloom → wilt → respawn), rare mutations (queen,
      hypersaturated, variegated, concentric, firecracker), wind-driven
      grass, falling petals, ambient day/night light cycle, dawn reveal.
      
      DOM overlay with staggered text entrance, RSVP modal with decorative
      floral ornaments and entrance animation. Dark theme, mobile-first.
      PLN (Algolia) authored
  9. 10 Mar, 2026 1 commit
    • fix(parvagues): poster overflow, dark mode, reveal visibility · 61919d6a
      - Use inline opacity (0.15) on poster image — Tailwind opacity-20 not
        applying in production build
      - Add color-scheme: dark meta tag for browser/reader mode compatibility
      - Set html/body background to #0a0a0a to prevent white bleed
      - Fix reveal animation: sections visible by default, animate only after
        JS hydration via .reveal-ready class on documentElement
      - Bump screenshots script to domcontentloaded + 3s render wait
      PLN (Algolia) authored
  10. 09 Mar, 2026 6 commits
    • feat(parvagues): UX polish pass — atmosphere, thumbnails, animations · 46b2c51c
      - Fix mobile hero title clipping (clamp min 5rem → 3rem)
      - Reduce dead space between streaming and video sections
      - Bump hero poster opacity to 20% for more atmosphere
      - Add archive.org thumbnails to video cards with gradient overlay
      - Add scroll-triggered reveal animations (IntersectionObserver)
      - Add subtle grain/noise overlay (SVG texture at 3% opacity)
      - Alternate section backgrounds (#0a0a0a / #0e0e0e) for depth
      - Upgrade album platform links to pill buttons with neon hover
      - Brand-colored hover on booking submit button
      - Add fadeIn animation for streaming embed transitions
      PLN (Algolia) authored
    • fix(parvagues): visual polish and Tailwind v4 migration · 40d209c6
      - Fix globals.css: @import "tailwindcss" + @source (v4 syntax)
      - Fix hero: reduce poster opacity to 10%, use inline clamp for title
      - Remove oversized arrows from tour timeline, use inline styles
      - Add custom DeezerIcon SVG (react-icons has no Deezer icon)
      - Replace em dashes with appropriate punctuation throughout
      - Add playwright dev dependency + screenshots script
      PLN (Algolia) authored
    • feat(parvagues): rebuild SPA landing page · 7fb570e4
      New architecture:
      - Hero: full-viewport with Syne typeface, subtle neon glow, tagline
      - On Tour: vertical timeline grouped by year (2022-2026), 30 events
      - Music: albums with revenue-ordered platform links (Bandcamp first),
        click-to-load streaming embeds (no auto-connect)
      - Video: archive.org click-to-load cards (4 TOPLAP recordings)
      - Booking: mailto-based contact form
      - Footer: social icons + email
      
      Design: editorial dark aesthetic, Syne font, restrained neon accents.
      Zero third-party connections until user interaction.
      PLN (Algolia) authored
    • feat(parvagues): consolidate all concert data (2022-2026) · dd1c8e50
      Merge event data from 3 sources:
      - Existing content/lives/ files
      - Salvaged events from old parvagues-redesign branch
      - Archive.org metadata (TOPLAP streams, Solstice sets)
      
      30 events across 5 years. Enriched with archive.org video URLs.
      Removed duplicate fairyteuf file.
      PLN (Algolia) authored
  11. 26 Nov, 2025 1 commit
  12. 27 Sep, 2025 1 commit
  13. 13 Sep, 2025 2 commits