diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml new file mode 100644 index 0000000..b0884d3 --- /dev/null +++ b/.github/workflows/deploy-pages.yml @@ -0,0 +1,55 @@ +name: Deploy Astro to GitHub Pages + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + env: + PUBLIC_GTM_CONTAINER_ID: GTM-5SLM67QF + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./dist + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b3550c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# Internal private notes +notes-interne/ + +# Node / tooling +node_modules/ +dist/ +storybook-static/ +.astro/ +.DS_Store diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 0000000..86376a3 --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,25 @@ +import type { StorybookConfig } from '@storybook/react-vite'; +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; + +const config: StorybookConfig = { + stories: ['../src/**/*.stories.@(ts|tsx)'], + addons: ['@storybook/addon-onboarding', '@storybook/addon-docs', '@storybook/addon-a11y', '@storybook/addon-vitest'], + framework: { + name: '@storybook/react-vite', + options: {} + }, + viteFinal: async (config) => { + config.resolve = config.resolve || {}; + config.resolve.alias = { + ...(typeof config.resolve.alias === 'object' ? config.resolve.alias : {}), + '@': path.resolve(fileURLToPath(new URL('../src', import.meta.url))) + }; + return config; + }, + docs: { + autodocs: 'tag' + } +}; + +export default config; diff --git a/.storybook/preview.ts b/.storybook/preview.ts new file mode 100644 index 0000000..fa12844 --- /dev/null +++ b/.storybook/preview.ts @@ -0,0 +1,17 @@ +import type { Preview } from '@storybook/react-vite'; +import '../src/styles/global.css'; + +const preview: Preview = { + parameters: { + layout: 'fullscreen', + backgrounds: { + default: 'studio-dark', + values: [ + { name: 'studio-dark', value: '#0f0e17' }, + { name: 'studio-deep', value: '#151325' } + ] + } + } +}; + +export default preview; diff --git a/architecture/site-github-pages-architecture.md b/architecture/site-github-pages-architecture.md new file mode 100644 index 0000000..5bded03 --- /dev/null +++ b/architecture/site-github-pages-architecture.md @@ -0,0 +1,35 @@ +# Architecture — Site personnel statique GitHub Pages + +- **Date**: 2026-03-01 +- **Gate visée**: G1 Arch Freeze +- **Responsable (agent)**: Architect + +## Vue d'ensemble +Architecture front statique en 2 fichiers: +- `index.html`: structure sémantique (header/nav/main/sections/footer) +- `assets/styles.css`: thème, layout responsive, composants visuels + +## Interfaces +- **Entrée**: navigateur web moderne +- **Sortie**: rendu d'un site vitrine personnel +- **Hébergement**: GitHub Pages (branch `main`, root) + +## Structure UI +- Bloc `hero` avec CTA. +- Section `#a-propos` pour la présentation. +- Section `#projets` avec grille de cartes. +- Section `#contact` avec liens sortants. + +## Contraintes techniques +- Aucun JS requis pour la version initiale. +- Chemins relatifs uniquement (`assets/styles.css`). +- CSS pur (variables, grid, media queries). + +## Budgets +- Poids page + CSS < 80KB (source non compressée). +- Temps de chargement perçu < 1s sur connexion standard (contenu statique). + +## Validation +- Smoke test HTTP local. +- Vérification ancres + rendu responsive. +- Capture visuelle de preuve. diff --git a/artifacts/architect/2026-03-01/g1-arch-freeze-v2.md b/artifacts/architect/2026-03-01/g1-arch-freeze-v2.md new file mode 100644 index 0000000..325b977 --- /dev/null +++ b/artifacts/architect/2026-03-01/g1-arch-freeze-v2.md @@ -0,0 +1,5 @@ +# G1 Arch Freeze Evidence (v2) + +- Architecture UI détaillée: hero, about, projets, contact. +- Contraintes GitHub Pages (chemins relatifs, statique sans build) confirmées. +- Budgets et stratégie de validation ajustés. diff --git a/artifacts/architect/2026-03-01/g1-arch-freeze.md b/artifacts/architect/2026-03-01/g1-arch-freeze.md new file mode 100644 index 0000000..0a3a68f --- /dev/null +++ b/artifacts/architect/2026-03-01/g1-arch-freeze.md @@ -0,0 +1,5 @@ +# G1 Arch Freeze Evidence + +- Architecture statique validée: `index.html` + `assets/styles.css` +- Interfaces et contraintes de chemins relatifs définies +- Budgets simplifiés documentés diff --git a/artifacts/legacy-snapshot/2026-03-01/index.legacy.html b/artifacts/legacy-snapshot/2026-03-01/index.legacy.html new file mode 100644 index 0000000..f6263af --- /dev/null +++ b/artifacts/legacy-snapshot/2026-03-01/index.legacy.html @@ -0,0 +1,259 @@ + + + + + + Clément Saillant — L'électron rare + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

Performance • Noise • Audiovisuel

+

Clément Saillant, alias L'électron rare.

+

+ Projet artistique orienté expérimentations sonores et visuelles: + performances live, textures noise et collaborations entre scène et + image. +

+
    +
  • Live sets
  • +
  • Textures bruitistes
  • +
  • Collab vidéo
  • +
+

+ Voir mes projets + Me contacter +

+
+ +
+
+ +
+

À propos

+

+ Je suis Clément Saillant, artiste et créateur sous le + nom L'électron rare. J'explore les liens entre matière + sonore, récit visuel et énergie live, avec une approche artisanale et + directe. +

+
+ +
+

Projets

+
+
+

L'électron rare

+

+ Univers principal: performances et créations expérimentales entre + musique électronique et visuel. +

+

+ Profil LinkedIn +

+
+
+

Collaborations vidéo

+

+ Travail autour du VJing et des formats hybrides live, notamment avec + des collaborations type VJ Clearscreen. +

+
+
+

Électron Fou (noise)

+

+ Projet noise affilié à la scène expérimentale, avec sorties publiées + et présence sur plateformes audio. +

+

+ Bandcamp +

+
+
+
+ +
+

Contact

+

+ Pour booking, collaboration artistique ou production audiovisuelle, + contactez-moi via les plateformes ci-dessous. +

+ + +
+
+ + + + + + diff --git a/artifacts/legacy-snapshot/2026-03-01/og-cover.legacy.jpg b/artifacts/legacy-snapshot/2026-03-01/og-cover.legacy.jpg new file mode 100644 index 0000000..355032b Binary files /dev/null and b/artifacts/legacy-snapshot/2026-03-01/og-cover.legacy.jpg differ diff --git a/artifacts/legacy-snapshot/2026-03-01/robots.legacy.txt b/artifacts/legacy-snapshot/2026-03-01/robots.legacy.txt new file mode 100644 index 0000000..6f1c95a --- /dev/null +++ b/artifacts/legacy-snapshot/2026-03-01/robots.legacy.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://electron-rare.github.io/sitemap.xml diff --git a/artifacts/legacy-snapshot/2026-03-01/sitemap.legacy.xml b/artifacts/legacy-snapshot/2026-03-01/sitemap.legacy.xml new file mode 100644 index 0000000..40c7434 --- /dev/null +++ b/artifacts/legacy-snapshot/2026-03-01/sitemap.legacy.xml @@ -0,0 +1,9 @@ + + + + https://electron-rare.github.io/ + 2026-03-01 + weekly + 1.0 + + diff --git a/artifacts/legacy-snapshot/2026-03-01/styles.legacy.css b/artifacts/legacy-snapshot/2026-03-01/styles.legacy.css new file mode 100644 index 0000000..335e63e --- /dev/null +++ b/artifacts/legacy-snapshot/2026-03-01/styles.legacy.css @@ -0,0 +1,424 @@ +:root { + --bg: #f7f4ec; + --surface: #fffdf7; + --surface-soft: #f2eee3; + --text: #171614; + --muted: #625d50; + --primary: #d74b2a; + --primary-strong: #b83c1f; + --border: #d8d1c1; +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + font-family: "Avenir Next", "Segoe UI", "Helvetica Neue", sans-serif; + line-height: 1.6; + background: + radial-gradient(circle at 10% 10%, #ffddbf 0%, rgba(255, 221, 191, 0) 40%), + radial-gradient(circle at 90% 0%, #f0d8bf 0%, rgba(240, 216, 191, 0) 35%), + var(--bg); + color: var(--text); + text-rendering: optimizeLegibility; +} + +.skip-link { + position: absolute; + left: -9999px; + top: auto; + width: 1px; + height: 1px; + overflow: hidden; +} + +.skip-link:focus { + left: 0.8rem; + top: 0.8rem; + width: auto; + height: auto; + z-index: 40; + background: #111; + color: #fff; + padding: 0.45rem 0.7rem; + border-radius: 0.45rem; +} + +.container { + width: min(1000px, 92vw); + margin: 0 auto; +} + +section[id] { + scroll-margin-top: 6.2rem; +} + +.site-header { + position: sticky; + top: 0; + z-index: 20; + backdrop-filter: blur(8px); + background: rgba(247, 244, 236, 0.86); + border-bottom: 1px solid var(--border); +} + +.nav-wrap { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.8rem 0; +} + +.brand { + color: var(--text); + text-decoration: none; + font-weight: 800; + letter-spacing: 0.01em; +} + +nav ul { + list-style: none; + display: flex; + gap: 1rem; + margin: 0; + padding: 0; +} + +nav a { + display: inline-flex; + align-items: center; + min-height: 2rem; + color: var(--muted); + text-decoration: none; + font-weight: 500; + padding: 0.35rem 0.55rem; + border-radius: 0.45rem; +} + +nav a:hover, +nav a:focus-visible { + color: var(--text); + background: rgba(255, 255, 255, 0.66); +} + +.hero { + padding: clamp(3.2rem, 7vw, 4.8rem) 0 2.2rem; +} + +.hero-grid { + display: grid; + grid-template-columns: 1.25fr 0.8fr; + gap: 1.1rem; + align-items: end; +} + +.eyebrow { + color: var(--primary); + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + margin: 0; + font-size: 0.8rem; +} + +h1 { + font-size: clamp(2rem, 5vw, 3.2rem); + line-height: 1.12; + margin: 0.6rem 0 1rem; + max-width: 18ch; + text-wrap: balance; +} + +.hero-text { + max-width: 64ch; + margin: 0 0 1.4rem; + color: var(--muted); +} + +.hero-metrics { + list-style: none; + display: flex; + flex-wrap: wrap; + gap: 0.55rem; + margin: 0 0 1.3rem; + padding: 0; +} + +.hero-metrics li { + background: rgba(255, 255, 255, 0.76); + border: 1px solid var(--border); + border-radius: 999px; + padding: 0.3rem 0.65rem; + font-size: 0.92rem; +} + +.hero-actions { + display: flex; + flex-wrap: wrap; + gap: 0.7rem; +} + +.btn { + min-height: 2.75rem; + display: inline-block; + padding: 0.7rem 1.02rem; + border-radius: 0.7rem; + text-decoration: none; + font-weight: 600; + transition: transform 140ms ease, box-shadow 140ms ease, background-color 140ms ease; +} + +.btn-primary { + background: var(--primary); + color: #fff7f1; +} + +.btn-primary:hover, +.btn-primary:focus-visible { + background: var(--primary-strong); + transform: translateY(-1px); + box-shadow: 0 8px 18px rgba(183, 60, 31, 0.22); +} + +.btn-secondary { + border: 1px solid var(--border); + color: var(--text); + background: rgba(255, 255, 255, 0.65); +} + +.btn-secondary:hover, +.btn-secondary:focus-visible { + transform: translateY(-1px); +} + +.hero-card { + background: linear-gradient(180deg, #fff6eb 0%, #f3e6d4 100%); + border: 1px solid #ddc8ab; + border-radius: 14px; + padding: 1rem 1rem 1.1rem; + box-shadow: 0 12px 26px rgba(30, 18, 6, 0.11); +} + +.hero-card-kicker { + margin: 0; + color: #90633d; + font-size: 0.78rem; + text-transform: uppercase; + letter-spacing: 0.06em; +} + +.hero-card h2 { + margin: 0.35rem 0 0.45rem; + font-size: 1.4rem; +} + +.hero-card p { + margin: 0 0 0.7rem; + color: #4f4639; +} + +.hero-card a { + color: var(--primary-strong); + font-weight: 700; + text-decoration: none; +} + +.hero-card a:hover, +.hero-card a:focus-visible { + text-decoration: underline; +} + +.panel { + background: linear-gradient(180deg, var(--surface) 0%, var(--surface-soft) 100%); + border: 1px solid var(--border); + border-radius: 14px; + padding: 1.1rem 1.2rem 1.25rem; + margin: 1rem 0; + box-shadow: 0 10px 24px rgba(30, 18, 6, 0.07); + content-visibility: auto; + contain-intrinsic-size: 1px 500px; +} + +h2 { + margin-top: 0.2rem; + text-wrap: balance; +} + +.cards { + display: grid; + grid-template-columns: repeat(12, minmax(0, 1fr)); + gap: 0.9rem; +} + +.card { + grid-column: span 4; + background: rgba(255, 252, 246, 0.86); + border: 1px solid var(--border); + border-radius: 10px; + padding: 0.9rem; + transition: transform 140ms ease, box-shadow 140ms ease; +} + +.card h3 { + margin-top: 0.1rem; + margin-bottom: 0.45rem; +} + +.card p { + margin-top: 0; +} + +.card a { + color: var(--primary); + font-weight: 600; + text-decoration: none; +} + +.card a:hover, +.card a:focus-visible { + text-decoration: underline; +} + +.card:hover { + transform: translateY(-2px); + box-shadow: 0 10px 18px rgba(30, 18, 6, 0.08); +} + +.contact-list { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; + gap: 0.3rem; +} + +.contact-list a { + display: inline-flex; + align-items: center; + min-height: 2rem; + color: var(--primary); + text-decoration: none; + font-weight: 600; +} + +.contact-list a:hover, +.contact-list a:focus-visible { + text-decoration: underline; +} + +.contact-intro { + margin-top: 0; + color: var(--muted); + max-width: 62ch; +} + +.trust-points { + margin: 0.95rem 0 0; + padding-left: 1.1rem; + color: var(--muted); +} + +.trust-points li + li { + margin-top: 0.3rem; +} + +.site-footer { + border-top: 1px solid var(--border); + color: var(--muted); + padding: 1.2rem 0 2.2rem; + margin-top: 1.6rem; +} + +a:focus-visible, +button:focus-visible { + outline: 3px solid var(--primary); + outline-offset: 2px; + border-radius: 4px; +} + +@media (max-width: 960px) { + .hero-grid { + grid-template-columns: 1fr; + } + + .hero-card { + max-width: 38rem; + } + + .cards { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .card { + grid-column: auto; + } +} + +@media (max-width: 760px) { + .nav-wrap { + flex-direction: column; + gap: 0.7rem; + } + + nav ul { + flex-wrap: wrap; + justify-content: center; + gap: 0.45rem; + } + + nav a { + display: inline-block; + padding: 0.42rem 0.62rem; + } + + .cards { + grid-template-columns: 1fr; + } + + .hero { + padding-top: 2.4rem; + } +} + +@media (max-width: 390px) { + .container { + width: min(1000px, 94vw); + } + + h1 { + font-size: clamp(1.72rem, 9vw, 2.25rem); + } + + .hero-actions { + gap: 0.55rem; + } + + .btn { + width: 100%; + text-align: center; + } +} + +@media (prefers-reduced-motion: reduce) { + * { + animation-duration: 1ms !important; + animation-iteration-count: 1 !important; + transition-duration: 1ms !important; + scroll-behavior: auto !important; + } +} + +@media (prefers-contrast: more) { + :root { + --muted: #453f33; + --border: #8b816d; + } +} diff --git a/artifacts/pm-spec/2026-03-01/g0-spec-freeze-v2.md b/artifacts/pm-spec/2026-03-01/g0-spec-freeze-v2.md new file mode 100644 index 0000000..20fd2b6 --- /dev/null +++ b/artifacts/pm-spec/2026-03-01/g0-spec-freeze-v2.md @@ -0,0 +1,5 @@ +# G0 Spec Freeze Evidence (v2) + +- Spécification orientée « site personnel » finalisée. +- AC mis à jour avec navigation ancrée et contenu vitrine. +- Non-goals, risques et TODO de personnalisation documentés. diff --git a/artifacts/pm-spec/2026-03-01/g0-spec-freeze.md b/artifacts/pm-spec/2026-03-01/g0-spec-freeze.md new file mode 100644 index 0000000..dc03a59 --- /dev/null +++ b/artifacts/pm-spec/2026-03-01/g0-spec-freeze.md @@ -0,0 +1,6 @@ +# G0 Spec Freeze Evidence + +- Spec créée: `specs/site-github-pages-spec.md` +- AC définis: AC1..AC4 +- Non-goals et risques documentés +- TODO ajoutés pour informations manquantes diff --git a/artifacts/qa-test/2026-03-01/g2-implement-v2.md b/artifacts/qa-test/2026-03-01/g2-implement-v2.md new file mode 100644 index 0000000..c03ab24 --- /dev/null +++ b/artifacts/qa-test/2026-03-01/g2-implement-v2.md @@ -0,0 +1,6 @@ +# G2 Implement Evidence (v2) + +Implémentation livrée: +- `index.html` transformé en template de site personnel complet. +- `assets/styles.css` enrichi (navigation sticky, sections, cartes projets, responsive). +- Documentation de déploiement mise à jour. diff --git a/artifacts/qa-test/2026-03-01/g2-implement-v3.md b/artifacts/qa-test/2026-03-01/g2-implement-v3.md new file mode 100644 index 0000000..a8d2549 --- /dev/null +++ b/artifacts/qa-test/2026-03-01/g2-implement-v3.md @@ -0,0 +1,39 @@ +# G2 Implement Evidence (v3) - SEO + Acquisition + +Date: 2026-03-01 + +## Portée implémentée +- SEO technique: canonical, robots, sitemap, OG/Twitter image. +- Tracking contract: événements CTA/outbound avec `event_category`, `event_label`, `destination`. +- Bootstrap GTM prêt à brancher (`GTM-REPLACE_ME`). +- Conversion UX: section contact enrichie + trust points. +- Accessibilité/réactivité: skip-link déjà présent + réglage ultra-mobile (`<=390px`). + +## Fichiers modifiés +- `index.html` +- `assets/styles.css` +- `docs/github-pages-deploy.md` +- `robots.txt` (nouveau) +- `sitemap.xml` (nouveau) +- `assets/og-cover.jpg` (nouveau) + +## Mapping tracking (event -> destination) +| Event | Type | Destination | Usage | +|---|---|---|---| +| `cta_hero_projets` | CTA interne | `#projets` | Navigation vers section projets | +| `cta_hero_contact` | CTA interne | `#contact` | Navigation vers section contact | +| `cta_hero_profile` | CTA interne | `#a-propos` | Navigation vers section profil | +| `outbound_linkedin_project` | Sortant | `linkedin.com` | Preuve sociale projet | +| `outbound_linkedin_contact` | Sortant | `linkedin.com` | Conversion primaire | +| `outbound_malt_contact` | Sortant | `malt.com` | Conversion secondaire | +| `outbound_bandcamp_project` | Sortant | `bandcamp.com` | Projet musical | +| `outbound_bandcamp_contact` | Sortant | `bandcamp.com` | Contact alternatif | + +Paramètres communs poussés: +- `event_category=engagement` +- `event_label=` +- `destination=` + +## Notes +- Pour activer GTM en production: remplacer `GTM-REPLACE_ME` dans le script head et le bloc noscript. +- URL canonique actuelle: `https://electron-rare.github.io/`. diff --git a/artifacts/qa-test/2026-03-01/g2-implement-v4-astro.md b/artifacts/qa-test/2026-03-01/g2-implement-v4-astro.md new file mode 100644 index 0000000..002d5fb --- /dev/null +++ b/artifacts/qa-test/2026-03-01/g2-implement-v4-astro.md @@ -0,0 +1,38 @@ +# G2 Implement Evidence (v4) - Astro Studio Migration Foundation + +Date: 2026-03-01 + +## Scope implémenté +- Mise en place stack primaire: + - Astro + TypeScript strict + - React integration + - Tailwind 4 (via plugin Vite) + - Motion + - Radix/shadcn-like base (`Button` with Radix Slot + CVA) + - Storybook React-Vite +- Création architecture `src/` composantisée: + - `src/layouts/BaseLayout.astro` + - `src/pages/index.astro` + - sections React (`Hero`, `About`, `Projects`, `Contact`) + - composants UI (`Button`, `Card`) +- Conservation contrat SEO/analytics: + - metadata canonical/OG/Twitter + - JSON-LD Person + - contrat `dataLayer` (`event_category`, `event_label`, `destination`) + - GTM ID `GTM-5SLM67QF` via `PUBLIC_GTM_CONTAINER_ID` fallback +- Préparation déploiement Pages via GitHub Actions: + - `.github/workflows/deploy-pages.yml` +- Storybook full coverage initiale des composants/sections clés. + +## Fichiers clés ajoutés/modifiés +- `package.json`, `package-lock.json` +- `astro.config.mjs`, `tsconfig.json` +- `src/**` (layouts/components/styles/pages) +- `.storybook/main.ts`, `.storybook/preview.ts` +- `.github/workflows/deploy-pages.yml` +- `public/robots.txt`, `public/sitemap.xml`, `public/assets/og-cover.jpg` +- `docs/github-pages-deploy.md` +- `specs/site-github-pages-spec.md` + +## Note +- L'ancien socle statique (`index.html`, `assets/styles.css`) est conservé temporairement dans le repo pour transition contrôlée. diff --git a/artifacts/qa-test/2026-03-01/g3-verification-v2.md b/artifacts/qa-test/2026-03-01/g3-verification-v2.md new file mode 100644 index 0000000..5c020d1 --- /dev/null +++ b/artifacts/qa-test/2026-03-01/g3-verification-v2.md @@ -0,0 +1,7 @@ +# G3 Verification Evidence (v2) + +Vérifications exécutées: +- `python3 -m http.server 4173` +- `curl -I http://127.0.0.1:4173/` -> `HTTP/1.0 200 OK` +- `rg 'href="/' index.html` (attendu: aucune occurrence) +- Capture Playwright: `artifacts/qa-test/2026-03-01/site-home-v2.png` diff --git a/artifacts/qa-test/2026-03-01/g3-verification-v3.md b/artifacts/qa-test/2026-03-01/g3-verification-v3.md new file mode 100644 index 0000000..37271ae --- /dev/null +++ b/artifacts/qa-test/2026-03-01/g3-verification-v3.md @@ -0,0 +1,28 @@ +# G3 Verification Evidence (v3) - SEO + Tracking + +Date: 2026-03-01 + +## Vérifications exécutées +- `rg -n "canonical|og:image|twitter:image|application/ld\+json|GTM_CONTAINER_ID|event_category|event_label|destination" index.html` +- `rg -n "data-track=|data-destination=" index.html` +- `sips -g pixelWidth -g pixelHeight assets/og-cover.jpg` +- `cat robots.txt` +- `cat sitemap.xml` +- `python3 -m http.server 4173` puis: + - `curl -I http://127.0.0.1:4173/` + - `curl -s http://127.0.0.1:4173/robots.txt` + - `curl -s http://127.0.0.1:4173/sitemap.xml` + +## Résultats attendus/observés +- Canonical présent et fixé sur `https://electron-rare.github.io/`. +- OG/Twitter image renseignée vers `assets/og-cover.jpg` (URL absolue). +- JSON-LD `Person` enrichi (`jobTitle`, `description`, `sameAs`). +- Contrat dataLayer conforme (`event_category`, `event_label`, `destination`). +- `assets/og-cover.jpg` présent en `1200x630`. +- `robots.txt` et `sitemap.xml` accessibles. +- HTTP local `/` retourne `200 OK`. + +## Contrôles manuels restants (production) +- Publier le conteneur GTM réel et remplacer `GTM-REPLACE_ME`. +- Vérifier la remontée GA4 Realtime des événements clés. +- Valider les aperçus sociaux via LinkedIn Post Inspector/Facebook Sharing Debugger. diff --git a/artifacts/qa-test/2026-03-01/g3-verification-v4.md b/artifacts/qa-test/2026-03-01/g3-verification-v4.md new file mode 100644 index 0000000..5c8fe18 --- /dev/null +++ b/artifacts/qa-test/2026-03-01/g3-verification-v4.md @@ -0,0 +1,37 @@ +# G3 Verification Evidence (v4) - Full TODO Validation Pass + +Date: 2026-03-01 + +## Lighthouse (local) +Source URL testée: `http://127.0.0.1:4173/` + +### Mobile +- performance: **93** +- accessibility: **95** +- best-practices: **96** +- seo: **100** + +### Desktop +- performance: **100** +- accessibility: **95** +- best-practices: **96** +- seo: **100** + +Artifacts JSON: +- `artifacts/qa-test/2026-03-01/lighthouse-home-mobile-v1.json` +- `artifacts/qa-test/2026-03-01/lighthouse-home-desktop-v1.json` + +## Validations structurelles +- JSON-LD `Person`: **OK** (`jobTitle`, `description`, `sameAs` présents) +- `sitemap.xml` parse XML: **OK** +- `robots.txt` présent et exploitable: **OK** +- `assets/og-cover.jpg` dimensions: **1200x630** +- Contrat tracking (`event_category`, `event_label`, `destination`): **OK** + +## TODO status final +- ✅ Canonical / OG / Twitter / sitemap / robots +- ✅ Tracking contract côté front +- ✅ Lighthouse archivé +- ✅ GTM réel configuré (`GTM-5SLM67QF`) +- ⏳ Validation GA4 Realtime en production +- ⏳ Debugger aperçu social en production (action externe) diff --git a/artifacts/qa-test/2026-03-01/g3-verification-v5.md b/artifacts/qa-test/2026-03-01/g3-verification-v5.md new file mode 100644 index 0000000..7245ef1 --- /dev/null +++ b/artifacts/qa-test/2026-03-01/g3-verification-v5.md @@ -0,0 +1,34 @@ +# G3 Verification Evidence (v5) - Tracking Contract + GTM ID + +Date: 2026-03-01 + +## Validation locale du contrat tracking +Commandes exécutées: +- extraction `data-track` et `data-destination` depuis `index.html` +- vérification présence des champs dataLayer (`event_category`, `event_label`, `destination`) + +Résultats: +- `tracked_links`: 8 +- `missing_destination_count`: 0 +- `js_contract_ok`: true +- `missing_required_events`: [] + +Événements détectés: +- `cta_hero_projets` +- `cta_hero_contact` +- `cta_hero_profile` +- `outbound_linkedin_project` +- `outbound_linkedin_contact` +- `outbound_malt_contact` +- `outbound_bandcamp_project` +- `outbound_bandcamp_contact` + +## GTM +- ID configuré: `GTM-5SLM67QF` +- emplacements validés: + - `window.GTM_CONTAINER_ID` + - bloc `