feat: enable GH Pages stable plus deploy externe Vercel/Netlify

This commit is contained in:
Clément SAILLANT
2026-03-02 09:06:42 +01:00
parent ca0904824a
commit 58a94001f8
128 changed files with 84617 additions and 400 deletions
+28 -7
View File
@@ -1,4 +1,4 @@
name: Deploy Astro to GitHub Pages
name: Deploy Static Site + Lab to GitHub Pages
on:
push:
@@ -26,14 +26,35 @@ jobs:
with:
node-version: 22
cache: npm
cache-dependency-path: |
package-lock.json
apps/lab-interactif/package-lock.json
- name: Install dependencies
- name: Install root dependencies
run: npm ci
- name: Build
run: npm run build
env:
PUBLIC_GTM_CONTAINER_ID: GTM-5SLM67QF
- name: Install lab dependencies
run: npm ci --prefix apps/lab-interactif
- name: Build lab module
run: npm run lab:build
- name: Prepare pages artifact
run: |
mkdir -p .pages-dist
cp index.html .pages-dist/
cp styles.css .pages-dist/
cp script.js .pages-dist/
cp robots.txt .pages-dist/
cp sitemap.xml .pages-dist/
cp favicon.svg .pages-dist/
cp favicon.ico .pages-dist/
cp favicon-32x32.png .pages-dist/
cp favicon-16x16.png .pages-dist/
cp apple-touch-icon.png .pages-dist/
cp -R assets .pages-dist/assets
cp -R lab .pages-dist/lab
if [ -f CNAME ]; then cp CNAME .pages-dist/; fi
- name: Setup Pages
uses: actions/configure-pages@v5
@@ -41,7 +62,7 @@ jobs:
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: ./dist
path: ./.pages-dist
deploy:
needs: build
+9
View File
@@ -7,3 +7,12 @@ dist/
storybook-static/
.astro/
.DS_Store
# GH Pages / builds locaux (sorties CI ou previews locales)
.pages-dist/
# Artefacts locaux de workflow / QA
output/
tmp/
.tmp/
.playwright-cli/
+9 -3
View File
@@ -1,14 +1,20 @@
import type { Preview } from '@storybook/react-vite';
import '../src/styles/global.css';
if (typeof document !== 'undefined') {
// Align Storybook rendering with the site default (atelier) theme.
document.documentElement.setAttribute('data-theme', 'light');
}
const preview: Preview = {
parameters: {
layout: 'fullscreen',
backgrounds: {
default: 'studio-dark',
default: 'atelier',
values: [
{ name: 'studio-dark', value: '#0f0e17' },
{ name: 'studio-deep', value: '#151325' }
{ name: 'atelier', value: '#f4eee3' },
{ name: 'atelier-soft', value: '#fbf7ef' },
{ name: 'ink', value: '#0b0a09' }
]
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

+15
View File
@@ -0,0 +1,15 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Lab interactif - L'electron rare</title>
<meta
name="description"
content="Lab interactif: prototypes React Router, parcours experimentaux et idees de dispositifs immersifs." />
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
+20
View File
@@ -0,0 +1,20 @@
{
"name": "lab-interactif",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"react": "^19.1.1",
"react-dom": "^19.1.1",
"react-router-dom": "^7.13.1"
},
"devDependencies": {
"@vitejs/plugin-react": "^5.0.4",
"vite": "^7.3.1"
}
}
+41
View File
@@ -0,0 +1,41 @@
import { NavLink, Route, Routes } from 'react-router-dom';
import { LabHomePage } from './pages/LabHomePage';
import { SignalsPage } from './pages/SignalsPage';
import { PrototypesPage } from './pages/PrototypesPage';
export function App() {
return (
<div className="lab-app">
<header className="lab-header">
<div className="lab-shell">
<a className="lab-brand" href="/">
Retour site principal
</a>
<nav aria-label="Navigation lab">
<ul>
<li>
<NavLink to="/" end>
Overview
</NavLink>
</li>
<li>
<NavLink to="/signals">Signals</NavLink>
</li>
<li>
<NavLink to="/prototypes">Prototypes</NavLink>
</li>
</ul>
</nav>
</div>
</header>
<main className="lab-shell">
<Routes>
<Route path="/" element={<LabHomePage />} />
<Route path="/signals" element={<SignalsPage />} />
<Route path="/prototypes" element={<PrototypesPage />} />
</Routes>
</main>
</div>
);
}
+13
View File
@@ -0,0 +1,13 @@
import React from 'react';
import { createRoot } from 'react-dom/client';
import { HashRouter } from 'react-router-dom';
import { App } from './App';
import './styles.css';
createRoot(document.getElementById('root')).render(
<React.StrictMode>
<HashRouter>
<App />
</HashRouter>
</React.StrictMode>
);
@@ -0,0 +1,27 @@
export function LabHomePage() {
return (
<section className="lab-panel">
<p className="lab-kicker">Module C</p>
<h1>Lab interactif React Router</h1>
<p>
Cet espace accueille les experiences interactives qui demandent un routage client,
une logique d'etat plus riche et des iterations UI rapides.
</p>
<div className="lab-grid">
<article>
<h2>Pourquoi ce module</h2>
<p>
Conserver une base statique lisible pour la conversion, et isoler les zones
experimentales sans alourdir le site principal.
</p>
</article>
<article>
<h2>Contrat d'integration</h2>
<p>
Chemin public: <code>/lab/</code>. Deploiement via build Vite, independent du template statique.
</p>
</article>
</div>
</section>
);
}
@@ -0,0 +1,37 @@
const prototypes = [
{
title: 'Flow mission brief',
status: 'In review',
desc: 'Wizard de cadrage mission avec sorties DA + tracking event map.'
},
{
title: 'Interactive scene card',
status: 'Draft',
desc: 'Carte projet animable pour narration systeme et preuves live.'
},
{
title: 'Lab telemetry shell',
status: 'Scaffolded',
desc: 'Base React Router prete pour brancher des donnees de suivi internes.'
}
];
export function PrototypesPage() {
return (
<section className="lab-panel">
<p className="lab-kicker">Prototypes</p>
<h1>Backlog interactif</h1>
<ul className="prototype-list">
{prototypes.map((item) => (
<li key={item.title}>
<div>
<h2>{item.title}</h2>
<p>{item.desc}</p>
</div>
<span>{item.status}</span>
</li>
))}
</ul>
</section>
);
}
@@ -0,0 +1,24 @@
const signals = [
{ label: 'Interaction density', value: '74%', note: 'navigation testee sur 3 patterns' },
{ label: 'Prototype confidence', value: 'B+', note: 'gates a11y et perf a renforcer' },
{ label: 'Narrative coherence', value: '82%', note: 'DA premium respectee sur les vues clefs' }
];
export function SignalsPage() {
return (
<section className="lab-panel">
<p className="lab-kicker">Signals</p>
<h1>Tableau de signaux</h1>
<p>Vue rapide sur l'etat des experiments interactifs en cours.</p>
<div className="signal-grid">
{signals.map((signal) => (
<article key={signal.label}>
<h2>{signal.label}</h2>
<strong>{signal.value}</strong>
<p>{signal.note}</p>
</article>
))}
</div>
</section>
);
}
+224
View File
@@ -0,0 +1,224 @@
@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&family=Prata&display=swap');
:root {
--lab-bg: #171a1e;
--lab-surface: #222830;
--lab-surface-soft: #2b3441;
--lab-line: #3d4b5d;
--lab-text: #f2f4f8;
--lab-muted: #b8c4d3;
--lab-accent: #f2a666;
--lab-accent-2: #7bd5cf;
}
* {
box-sizing: border-box;
}
html,
body,
#root {
min-height: 100%;
}
body {
margin: 0;
font-family: 'Manrope', 'Segoe UI', sans-serif;
color: var(--lab-text);
background:
radial-gradient(1000px 500px at 15% -20%, rgba(242, 166, 102, 0.18), transparent 55%),
radial-gradient(800px 460px at 100% 0%, rgba(123, 213, 207, 0.2), transparent 55%),
var(--lab-bg);
}
.lab-shell {
width: min(1080px, 92vw);
margin: 0 auto;
}
.lab-header {
position: sticky;
top: 0;
z-index: 20;
border-bottom: 1px solid var(--lab-line);
background: color-mix(in oklab, var(--lab-bg) 86%, black 14%);
backdrop-filter: blur(8px);
}
.lab-header .lab-shell {
min-height: 74px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.lab-brand {
display: inline-flex;
text-decoration: none;
color: var(--lab-accent);
font-weight: 700;
}
.lab-header ul {
margin: 0;
padding: 0;
list-style: none;
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
}
.lab-header a {
min-height: 2.2rem;
display: inline-flex;
align-items: center;
text-decoration: none;
color: var(--lab-text);
border: 1px solid transparent;
border-radius: 999px;
padding: 0 0.85rem;
font-size: 0.9rem;
font-weight: 600;
}
.lab-header a.active,
.lab-header a:hover,
.lab-header a:focus-visible {
border-color: var(--lab-line);
background: color-mix(in oklab, var(--lab-surface-soft) 80%, var(--lab-accent-2) 20%);
}
main {
padding-block: 1.2rem 2.8rem;
}
.lab-panel {
border: 1px solid var(--lab-line);
border-radius: 18px;
background: linear-gradient(180deg, var(--lab-surface), color-mix(in oklab, var(--lab-surface) 70%, black 30%));
box-shadow: 0 16px 42px rgba(0, 0, 0, 0.28);
padding: 1rem;
}
.lab-kicker {
margin: 0;
text-transform: uppercase;
letter-spacing: 0.14em;
font-size: 0.72rem;
color: var(--lab-accent-2);
font-weight: 700;
}
h1,
h2 {
font-family: 'Prata', Georgia, serif;
margin: 0;
font-weight: 400;
}
h1 {
margin-top: 0.5rem;
font-size: clamp(1.8rem, 5vw, 3rem);
}
.lab-panel > p {
color: var(--lab-muted);
margin: 0.9rem 0 0;
max-width: 70ch;
}
.lab-grid {
margin-top: 1rem;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.6rem;
}
.lab-grid article,
.signal-grid article,
.prototype-list li {
border: 1px solid var(--lab-line);
border-radius: 14px;
background: color-mix(in oklab, var(--lab-surface-soft) 82%, black 18%);
padding: 0.8rem;
}
.signal-grid {
margin-top: 0.9rem;
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.6rem;
}
.signal-grid strong {
display: block;
margin-top: 0.35rem;
color: var(--lab-accent);
font-size: 1.35rem;
}
.signal-grid p,
.prototype-list p {
margin: 0.4rem 0 0;
color: var(--lab-muted);
}
.prototype-list {
margin: 1rem 0 0;
padding: 0;
list-style: none;
display: grid;
gap: 0.58rem;
}
.prototype-list li {
display: flex;
justify-content: space-between;
gap: 0.8rem;
align-items: flex-start;
}
.prototype-list span {
border: 1px solid var(--lab-line);
border-radius: 999px;
min-height: 1.9rem;
display: inline-flex;
align-items: center;
padding: 0 0.66rem;
font-size: 0.72rem;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--lab-accent-2);
}
code {
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
background: rgba(0, 0, 0, 0.25);
border: 1px solid var(--lab-line);
border-radius: 6px;
padding: 0.14rem 0.3rem;
}
@media (max-width: 900px) {
.signal-grid {
grid-template-columns: 1fr;
}
.lab-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 700px) {
.lab-header .lab-shell {
min-height: auto;
flex-direction: column;
align-items: flex-start;
padding-block: 0.7rem;
}
.prototype-list li {
flex-direction: column;
}
}
+11
View File
@@ -0,0 +1,11 @@
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
base: '/lab/',
build: {
outDir: '../../lab',
emptyOutDir: true
}
});
@@ -0,0 +1,70 @@
# DA-00 — Home page Figma capture log (2026-03-02)
## Scope exécuté
- Objectif: capturer la home page statique `index.html` avec style `styles.css` pour DA-00 (Desktop/Mobile)
- Branchement cible: `http://127.0.0.1:4174/`
- Typo/Palette: conforme aux tokens déjà en place dans :
- `notes-interne/creative-direction-brief.md`
- `specs/site-github-pages-spec.md`
## Fichier créé (obligatoire)
1. Capture 390 (`newFile`) — Team utilisée: `team::1358840601337404242` (Full seat)
- `captureId`: `d42b3736-86a0-4317-aba3-db38e3fd8081`
- Viewport exécuté: `390x2600`
- Résultat: **completed**
- Claim URL: `https://www.figma.com/integrations/claim/fnqOdDOU97v7E27LxkV7cn`
2. Capture 390 de secours (réémission initiale) :
- `captureId`: `8e837489-b410-4fe6-bcd9-164cfc06ea28`
- Viewport exécuté: `390x2600`
- Résultat: **completed**
- Claim URL: `https://www.figma.com/integrations/claim/ZKgr7hsRPsU9FxZ1D3C9CC`
3. Capture 768 (`newFile`) :
- `captureId`: `a592d67e-df53-427a-bbc1-451b2cd00072`
- Viewport exécuté: `768x2600`
- Résultat: **completed**
- Claim URL: `https://www.figma.com/integrations/claim/zAedZvfZMYMxY1UfnKftGr`
4. Capture 1024 (`newFile`) :
- `captureId`: `e5039698-8d12-4fbb-b67c-556cc3af48be`
- Viewport exécuté: `1024x2600`
- Résultat: **completed**
- Claim URL: `https://www.figma.com/integrations/claim/6ZP1SHZVN5rgWrig10Lh9i`
5. Capture 1440 (`newFile`) :
- `captureId`: `b7aa2fbd-d715-4522-8b22-acdd6d058b28`
- Viewport exécuté: `1440x2600`
- Résultat: **completed**
- Claim URL: `https://www.figma.com/integrations/claim/ZMeMDAbbfYnDMgfXOeIDA4`
## Etat actuel
- Le fichier Figma de base est bien créé.
- `existingFile` pour regrouper plusieurs tailles dans le même fichier reste bloqué côté accès MCP (message: `This figma file could not be accessed`) avec `fileKey` de claim.
## Blocage détecté
- Les appels `existingFile` pour:
- `ZKgr7hsRPsU9FxZ1D3C9CC`
- `fnqOdDOU97v7E27LxkV7cn`
- `zAedZvfZMYMxY1UfnKftGr`
- `6ZP1SHZVN5rgWrig10Lh9i`
- `ZMeMDAbbfYnDMgfXOeIDA4`
retournent systématiquement:
- `This figma file could not be accessed.`
- Docs Figma: mode probable “claim non consommé / résolution du vrai fileKey et permissions” en cours.
## TODO dexécution prêt à lancer
1. Réclamer les 4 claims ci-dessus depuis la session Figma connectée (ou les ouvrir en parallèle).
2. Pour chaque claim, nommer lartboard:
- `Home 390`
- `Home 768`
- `Home 1024`
- `Home 1440`
3. Fusionner les 4 captures dans un seul fichier Figma (ou en garder un fichier par breakpoint si la contrainte de claim persiste).
4. Structurer selon la logique DA-00:
- `Header`
- `Hero + Identité`
- `Systèmes`
- `Production`
- `Conversion`
- `Footer`
5. Vérifier `#a-propos`, `#projets`, `#contact` visuellement.
6. Ajouter composants + variantes (`default`, `hover`, `focus-visible`, état lab collapsed/expanded si utilisé).
7. QA finale visuelle: overflow, lisibilité mobile, contraste CTA.
8. Archiver la preuve (captures + noms dartboards + lien final) dans `artifacts/figma-capture/2026-03-02`.
@@ -0,0 +1,36 @@
# G3 — Vérification DA / Responsive / Accessibilité (v8)
Date: 2026-03-01
## Scope
- Validation de la passe DA studio pour la page d'accueil Astro (`src/pages/index.astro` + sections).
- Vérification visuelle/UX locale (sans exécution de tests automatisés dans cette étape).
## Changes appliqués
1. Consolidation tokens visuels globaux
- Nouveau tokenset électrique dans `src/styles/global.css`.
- Classes sémantiques studio (`studio-panel`, `studio-link`, `studio-chip*`, `studio-muted`, etc.).
2. UI systémique alignée
- `src/components/ui/button.tsx` et `src/components/ui/card.tsx` sur tokens.
- Header/nav/footer dans `src/pages/index.astro`.
- Refonte visuelle et copy de toutes les sections: `Hero`, `About`, `Projects`, `Contact`.
3. Gouvernance DA
- Conformité maintenue au brief interne (experimental/noise, électrique, priorité lisibilité/impact).
## Vérifications documentées
- Aucune référence couleur violette dominante restante dans classes Tailwind des sections.
- Contrat tracking préservé (mêmes `data-track` et événements).
- `prefers-reduced-motion` conservé dans `global.css`.
- Classes daccessibilité clavier conservées (focus-visible).
## Checklist métier
- [x] Direction artistique visuelle uniforme (accroche hero + side card + sections).
- [x] CTA lisibles et conservés: projets, contact, profil.
- [x] Références externes conservées: LinkedIn / Malt / Bandcamp avec tracking.
- [ ] Revue responsive 390/768/1024/1440 (audit visuel à réaliser en session de dev).
- [ ] Revue accessibilité complète (focus order + contraste réel sur composants interactifs).
## Prochaine action QA
- Exécuter Lighthouse prod + revue GA4/SS to close P2 sprint.
@@ -0,0 +1,24 @@
# G3 Verification v9 - Production Readiness (local + external gates)
Date: 2026-03-01
Owner: QA/Test
## Local gates
- [x] `npm run typecheck` passe (0 erreur)
- [x] `npm run build` passe (site statique genere)
- [x] `public/robots.txt` present et coherent
- [x] `public/sitemap.xml` present et coherent
- [x] Contrat tracking front present (`src/lib/tracking.ts`)
- [x] GTM default present (`GTM-5SLM67QF`)
- [x] Canonical + OG/Twitter tags presents (`src/layouts/BaseLayout.astro`)
## External gates (a valider en prod)
- [ ] GA4 Realtime: events recus apres clic CTA
- [ ] GA4 DebugView: `event_category/event_label/destination` corrects
- [ ] GA4 conversions configurees (LinkedIn primaire, Malt secondaire)
- [ ] Search Console: propriete verifiee + sitemap soumis
- [ ] Social previews: LinkedIn/Facebook debug passes
## Notes
- QA Playwright locale effectuee sur 390/768/1024/1440 avec themes dark/light/high-contrast.
- Pipeline logo prepare (`notes-interne/logo-prompts-electron-rare.md`, `tmp/imagegen/electron-rare-logo-batch.jsonl`), generation finale en attente de cle API.
@@ -0,0 +1,34 @@
# G0 DA-00 - Brief + Wireflow Conversion
Date: 2026-03-02
Owner: Codex
Status: READY FOR DA-01
## Scope covered
- Consolidation brief DA v2.0.0
- Guidelines DA enrichies (zoning + matrice arbitrage)
- Spec projet alignee DA-00
- Wireflow conversion documente (desktop 1440 + mobile 390 + user flow CTA)
- Backlog DA-01 decision-complet
## Files delivered
- notes-interne/creative-direction-brief.md
- notes-interne/creative-direction-guidelines.md
- specs/site-github-pages-spec.md
- docs/wireflow-conversion-da00.md
- docs/da-01-implementation-backlog.md
## Decisions locked
- readability_priority: balanced
- anchors core preserved: #a-propos, #projets, #contact
- DA axis: atelier premium (ivoire/encre/cuivre) + accents techniques mesurés
- CTA primary: LinkedIn; secondary: Malt
## Validation notes
- Figma MCP not detected in this environment at planning time.
- Fallback applied: decision-complete wireflow documentation ready for manual Figma execution.
## Next gate (DA-01)
- Implement full structural/UI refactor from wireflow
- Preserve tracking/SEO contracts
- Run QA responsive/accessibility/build gates
@@ -0,0 +1,46 @@
# G1 Logo Selection + Integration
Date: 2026-03-02
Status: PASS
## Source and selection
- Source officielle: `output/VALIDE DA`
- Note de selection: `notes-interne/logo-selection-2026-03-02.md`
- Winner: `001-create-a-vector-logo-for-electron-rare-with-an-er-monogram-b.png`
- Backup A: `010-produce-a-favicon-first-hazard-signal-icon-for-electron-rare.png`
- Backup B: `005-generate-a-minimal-industrial-logo-with-telemetry-data-frame.png`
## Freeze working set
- `tmp/brand-selection/001-create-a-vector-logo-for-electron-rare-with-an-er-monogram-b.png`
- `tmp/brand-selection/010-produce-a-favicon-first-hazard-signal-icon-for-electron-rare.png`
- `tmp/brand-selection/005-generate-a-minimal-industrial-logo-with-telemetry-data-frame.png`
## Assets generated
- `public/assets/brand/logo-mark.png` (1024x1024)
- `public/assets/brand/logo-lockup.png` (1400x700)
- `public/assets/brand/logo-mark.svg` (derived)
- `public/assets/brand/logo-lockup.svg` (derived)
- `public/favicon.svg`
- `public/favicon.ico`
- `public/favicon-32x32.png`
- `public/favicon-16x16.png`
- `public/apple-touch-icon.png`
- `public/assets/og-cover.jpg` (1200x630)
## Code integration
- `src/lib/site.ts`: BRAND_ASSETS paths -> final brand PNG assets
- `src/layouts/BaseLayout.astro`: favicon link set completed (svg/png/ico/apple)
- `src/styles/global.css`: header brand mark path updated to `/assets/brand/logo-mark.png`
## Regression contract checks
- Anchors core unchanged: `#a-propos`, `#projets`, `#contact`
- Tracking contract untouched (events/params)
- SEO public resources preserved (`robots.txt`, `sitemap.xml`, canonical/OG/Twitter)
## Build checks
- `npm run typecheck`: PASS (0 errors)
- `npm run build`: PASS
## Notes
- SVG outputs are derived wrappers from PNG source (no native vector source available).
- Fallback behavior maintained: display relies on PNG quality; SVG kept for compatibility.
@@ -0,0 +1,35 @@
# G2 DA-01 P0 — Structure layout control-room
Date: 2026-03-02
Scope: finalisation P0 layout/tokens pour structure `index.astro` (sans changement des contrats publics)
## Changements appliques
- `src/styles/global.css`
- ajout des regles structurelles DA-01:
- `nav-main-row`, `nav-tools`, `nav-sub-row`, `nav-sub-chip`
- `studio-structure`, `structure-grid`, `structure-cell`
- variantes de grille: `--hero`, `--systems`, `--production`, `--conversion`
- `footer-grid`, `footer-title`, `footer-copy`, `footer-links`, `footer-link`
- ajout des breakpoints de composition:
- mobile `<768`
- tablette `>=768`
- desktop large `>=1140`
- micro-ajustements `<=390`
## Contrats verifies (non modifies)
- Anchors core conserves:
- `#a-propos`
- `#projets`
- `#contact`
- Tracking conserve:
- events `TRACK_EVENTS` inchanges
- attributs `data-track` / `data-destination` inchanges
- SEO/GTM non touches dans ce lot.
## Verification technique
- `npm run typecheck` -> OK (0 erreur)
- `npm run build` -> OK (build Astro statique complet)
## Notes
- Ce lot couvre la stabilisation layout/tokens P0.
- Les validations visuelles navigables (390/768/1024/1440) et QA accessibilite fine restent dans P1 QA.
@@ -0,0 +1,68 @@
# G3 DA-01 P1 — Harmonisation sections + footer + references GitHub
Date: 2026-03-02
Scope: harmoniser les sections conversion-first et intégrer les references projets GitHub fournies.
## Changements appliques
- `src/components/sections/SystemPipeline.tsx`
- labels pipeline harmonises (framing pro/automatisme).
- ajout intro section + chips de signaux.
- `src/components/sections/FlowDiagram.tsx`
- ajout intro section + chips narratifs du flux mission.
- `src/components/sections/About.tsx`
- titre et lead alignes sur le positionnement "profil systeme".
- `src/components/sections/Contact.tsx`
- ajout lead conversion orientee cadrage mission.
- `src/components/sections/Projects.tsx`
- harmonisation du bloc projets.
- ajout panel de references GitHub:
- `KomplexKapharnaum/KXKM_ESP32_Audio_Battery_hardware`
- `KomplexKapharnaum/LEDcurtain_hardware`
- `KomplexKapharnaum/kxkm_Ve.direct`
- `KomplexKapharnaum/KXKM_Batterie_Parallelator`
- `KomplexKapharnaum/STM32_ESP32_firmware`
- `KomplexKapharnaum/LEDcurtain`
- `electron-rare/`
- `src/components/sections/ProjectsTimeline.tsx`
- ajout entree timeline "Open repos references" vers GitHub.
- ajustement wording des liens de preuve.
- `src/components/sections/LabNotes.tsx`
- ajout lead de debrief technique.
- `src/components/sections/TrustStrip.tsx`
- enrichissement des preuves avec details et mention GitHub.
- `src/pages/index.astro`
- footer passe en mode knowledge/protocoles/links externes (LinkedIn, Malt, Bandcamp, GitHub).
- `src/styles/global.css`
- ajout classes de coherence P1:
- `section-lead`, `section-signal-row`, `section-signal-chip`
- `project-stage`, `project-reference-*`
- `trust-pill-detail`
- `footer-column-title`, `footer-protocol-list`, ajustements `footer-grid`
## Contrats verifies (non modifies)
- Anchors core conserves:
- `#a-propos`
- `#projets`
- `#contact`
- Contrat tracking conserve (events existants conserves; aucune suppression d'event).
- Contrat SEO/GTM conserve.
## Verification technique
- `npm run typecheck` -> OK (0 erreur)
- `npm run build` -> OK (build Astro statique complet)
## Notes
- QA responsive/accessibilite fine (visuelle cross-breakpoints) reste a confirmer en revue manuelle finale.
@@ -0,0 +1,55 @@
# G4 — Recherche UI/UX + QA responsive DA
Date: 2026-03-02
Owner: Design/QA
## Decisions appliquees
1. References GitHub dans Projets:
- mode retenu: **top 3 + lien "voir plus"**
2. Tracking GitHub:
- events GA4 dedies ajoutes:
- `outbound_github_project`
- `outbound_github_contact`
3. QA immediate:
- passe responsive effectuee en local sur 390/768/1024/1440
## Verifications locales
### Build/qualite
- `npm run typecheck` -> OK
- `npm run build` -> OK
### Captures responsive
- `artifacts/qa-test/2026-03-02/home-390.png`
- `artifacts/qa-test/2026-03-02/home-768.png`
- `artifacts/qa-test/2026-03-02/home-1024.png`
- `artifacts/qa-test/2026-03-02/home-1440.png`
### Lighthouse (local preview)
- mobile: `artifacts/qa-test/2026-03-02/lighthouse-home-mobile-v5.json`
- Performance: **54**
- Accessibility: **100**
- Best Practices: **100**
- SEO: **100**
- desktop: `artifacts/qa-test/2026-03-02/lighthouse-home-desktop-v5.json`
- Performance: **90**
- Accessibility: **100**
- Best Practices: **100**
- SEO: **100**
## Etat P1
- Harmonisation sections: OK
- Footer knowledge/protocoles: OK
- QA responsive/accessibilite/perf: **partiel**
- responsive + accessibilite: OK local
- perf mobile: sous cible (objectif >= 90 non atteint)
## Prochain levier anti-blocage
1. Reduire l'hydration client sur zones non critiques (objectif: baisse TBT mobile)
2. Confirmer en prod les mesures Lighthouse (environnement GitHub Pages)
3. Passer a Storybook P2 une fois perf mobile stabilisee
Binary file not shown.

After

Width:  |  Height:  |  Size: 436 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 745 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 433 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

@@ -0,0 +1,24 @@
PASS,home-1024,1024,1024,2239
PASS,home-1440,1440,1440,2074
PASS,home-390,390,390,2941
PASS,home-768,768,768,2562
PASS,home-contact-1024,1024,1024,2239
PASS,home-contact-1440,1440,1440,2074
PASS,home-contact-390,390,390,2941
PASS,home-contact-768,768,768,2562
PASS,home-projets-1024,1024,1024,2239
PASS,home-projets-1440,1440,1440,2074
PASS,home-projets-390,390,390,2941
PASS,home-projets-768,768,768,2562
PASS,lab-1024,1024,1024,900
PASS,lab-1440,1440,1440,900
PASS,lab-390,390,390,844
PASS,lab-768,768,768,1024
PASS,lab-prototypes-1024,1024,1024,900
PASS,lab-prototypes-1440,1440,1440,900
PASS,lab-prototypes-390,390,390,844
PASS,lab-prototypes-768,768,768,1024
PASS,lab-signals-1024,1024,1024,900
PASS,lab-signals-1440,1440,1440,900
PASS,lab-signals-390,390,390,844
PASS,lab-signals-768,768,768,1024
1 PASS home-1024 1024 1024 2239
2 PASS home-1440 1440 1440 2074
3 PASS home-390 390 390 2941
4 PASS home-768 768 768 2562
5 PASS home-contact-1024 1024 1024 2239
6 PASS home-contact-1440 1440 1440 2074
7 PASS home-contact-390 390 390 2941
8 PASS home-contact-768 768 768 2562
9 PASS home-projets-1024 1024 1024 2239
10 PASS home-projets-1440 1440 1440 2074
11 PASS home-projets-390 390 390 2941
12 PASS home-projets-768 768 768 2562
13 PASS lab-1024 1024 1024 900
14 PASS lab-1440 1440 1440 900
15 PASS lab-390 390 390 844
16 PASS lab-768 768 768 1024
17 PASS lab-prototypes-1024 1024 1024 900
18 PASS lab-prototypes-1440 1440 1440 900
19 PASS lab-prototypes-390 390 390 844
20 PASS lab-prototypes-768 768 768 1024
21 PASS lab-signals-1024 1024 1024 900
22 PASS lab-signals-1440 1440 1440 900
23 PASS lab-signals-390 390 390 844
24 PASS lab-signals-768 768 768 1024
Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

@@ -0,0 +1,100 @@
# P1 QA Report - Responsive + Storybook + Prod Checklist
- Date: 2026-03-02
- Scope: Home statique (`/`) + module interactif (`/lab/`)
- Environment: local server `http://127.0.0.1:4173`
## 1) Passe visuelle responsive (390/768/1024/1440)
### Captures generees
- Home: `home-*.png`
- Home ancre projets: `home-projets-*.png`
- Home ancre contact: `home-contact-*.png`
- Lab overview: `lab-*.png`
- Lab signals (hash route): `lab-signals-*.png` via `/lab/#/signals`
- Lab prototypes (hash route): `lab-prototypes-*.png` via `/lab/#/prototypes`
Dossier: `artifacts/qa-test/2026-03-02/responsive-p1/`
### Controle overflow (proxy technique via largeur image)
- Regle: largeur image capturee == largeur viewport attendue
- Resultat: `24/24 PASS`
- Preuve: `image-dimensions.csv`
### Resultat visuel
- 390: navigation et CTA lisibles, cartes projets en colonne, section contact accessible.
- 768: grille home stable, hierarchy typographique correcte, lab lisible.
- 1024: grille projets en 3 cartes stable, pas de debordement.
- 1440: layout home + lab coherent, densite visuelle conforme DA v2.
### Observation
- Les sections avec `data-reveal` ne deviennent visibles qu'au scroll (normal), d'ou besoin de captures ancrees (`#projets`, `#contact`) pour la verification complete.
- Routing statique module C corrige: passage de `BrowserRouter` a `HashRouter` pour eviter les 404 directs en hebergement GitHub Pages.
## 2) Storybook coverage P2
Commande executee:
```bash
npm run storybook:build
```
Resultat:
- Status: PASS
- Output: `storybook-static/`
- Warnings non bloquants:
- directives `"use client"` ignorees dans `framer-motion` lors du bundling
- chunk size warning > 500kB (storybook docs bundle)
## 3) Checklist prod GA4 / Search Console
### GA4/GTM (verifiable localement)
- [x] Container GTM present (`GTM-5SLM67QF`) dans `index.html`
- [x] Push `dataLayer` actif
- [x] Events hero existants conserves:
- `cta_hero_projets`, `cta_hero_contact`, `cta_hero_profile`
- [x] Events GitHub dedies actifs:
- `outbound_github_project_rtc_bl_phone`
- `outbound_github_project_zacus`
- `outbound_github_project_site`
- `outbound_github_lab_more`
- `cta_lab_interactif_open`
- [x] Legacy fallback conserve via `data-track-legacy` pour compatibilite historique
### Search Console / SEO (verifiable localement)
- [x] `robots.txt` a la racine
- [x] `sitemap.xml` a la racine
- [x] Sitemap maj au 2026-03-02 avec:
- `/`
- `/lab/`
- [x] Canonical + OG + Twitter tags presents dans `index.html`
### A faire en prod (manuel)
- [ ] GA4 DebugView: verifier reception de tous les events dedies GitHub
- [ ] GA4 Realtime: verifier session + events sur domaine public
- [ ] Search Console: soumettre `https://electron-rare.github.io/sitemap.xml`
- [ ] Search Console: verifier indexation de `/` et `/lab/`
- [ ] Validation preview sociale LinkedIn/Facebook
## Verdict P1
- Responsive QA: PASS
- Storybook coverage build: PASS
- Prod checklist locale: PASS
- Actions manuelles restantes: GA4 DebugView + Search Console en environnement public
## 4) Preflight et pipeline pages
Commande executee:
```bash
npm run preflight:pages
```
Resultat:
- Status: PASS
- Etapes validees:
- `lab:build`
- `tracking:check`
- `storybook:build`
- Warnings non bloquants identiques sur Storybook/framer-motion.
Mise a jour CI:
- Workflow `.github/workflows/deploy-pages.yml` migre vers publication statique + module `/lab/` via artifact `.pages-dist`.
+14
View File
@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 72" role="img" aria-label="Electron rare lockup placeholder">
<defs>
<linearGradient id="gg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#08f7ff"/>
<stop offset="100%" stop-color="#ff3adf"/>
</linearGradient>
</defs>
<rect x="2" y="2" width="316" height="68" rx="14" fill="#0a1220" stroke="#324667"/>
<rect x="12" y="12" width="48" height="48" rx="12" fill="#101c37" stroke="#31527d"/>
<path d="M24 26H40V32H30V36H39" fill="none" stroke="url(#gg)" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M43 26H49C54 26 56 28 56 32C56 36 54 38 49 38H43V26Z" fill="none" stroke="#8dff5a" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round"/>
<text x="72" y="33" fill="#f4f8ff" font-size="15" font-family="Source Sans 3, Segoe UI, sans-serif" font-weight="700" letter-spacing="1.8">ELECTRON RARE</text>
<text x="72" y="50" fill="#9fb3d3" font-size="10" font-family="Source Sans 3, Segoe UI, sans-serif" letter-spacing="1.6">UNSTABLE BY DESIGN</text>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1400 700" role="img" aria-label="Electron rare logo lockup"><image href="/assets/brand/logo-lockup.png" width="1400" height="700" preserveAspectRatio="xMidYMid meet"/></svg>

After

Width:  |  Height:  |  Size: 227 B

+14
View File
@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Electron rare mark placeholder">
<defs>
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#08f7ff"/>
<stop offset="100%" stop-color="#ff3adf"/>
</linearGradient>
</defs>
<rect x="6" y="6" width="84" height="84" rx="20" fill="#0a1220" stroke="#324667" stroke-width="2"/>
<path d="M24 30H56V40H34V48H54" fill="none" stroke="url(#g)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M62 30H72C80 30 84 34 84 42C84 50 80 54 72 54H62V30Z" fill="none" stroke="#8dff5a" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="24" cy="30" r="3" fill="#08f7ff"/>
<circle cx="54" cy="48" r="3" fill="#ff3adf"/>
<circle cx="84" cy="42" r="3" fill="#8dff5a"/>
</svg>

After

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-label="Electron rare logo mark"><image href="/assets/brand/logo-mark.png" width="1024" height="1024" preserveAspectRatio="xMidYMid meet"/></svg>

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

+3 -1
View File
@@ -2,8 +2,10 @@ import { defineConfig } from 'astro/config';
import react from '@astrojs/react';
import tailwindcss from '@tailwindcss/vite';
const siteUrl = process.env.PUBLIC_SITE_URL || 'https://electron-rare.github.io/';
export default defineConfig({
site: 'https://electron-rare.github.io',
site: siteUrl,
integrations: [react()],
vite: {
plugins: [tailwindcss()]
+17 -5
View File
@@ -1,10 +1,11 @@
# Plan d'avancement Acquisition/SEO (7 jours + 30 jours)
Date de mise à jour: 2026-03-01
Périmètre: site statique GitHub Pages (`index.html`, `assets/styles.css`)
Date de mise à jour: 2026-03-02
Perimetre: site statique GitHub Pages (`index.html`, `styles.css`, `script.js`) + module interactif `/lab/` (Vite + React Router hash)
Référence priorités globale: `docs/project-master-todos.md`
## Objectif
Transformer le site en base d'acquisition mesurable, sans ajouter de backend ni pipeline build.
Transformer le site en base d'acquisition mesurable, sans backend, avec une home legere et un module interactif isole.
## Avancement immédiat (P0/P1)
@@ -12,6 +13,7 @@ Transformer le site en base d'acquisition mesurable, sans ajouter de backend ni
- [x] URL canonique fixée (`https://electron-rare.github.io/`)
- [x] `robots.txt` à la racine
- [x] `sitemap.xml` à la racine
- [x] `sitemap.xml` inclut `/` + `/lab/`
- [x] Contrat d'événements tracking implémenté (`data-track` + `dataLayer` enrichi)
- [x] Remplacer `GTM-REPLACE_ME` par l'ID GTM réel (`GTM-5SLM67QF`)
- [ ] Valider événements en GA4 Realtime
@@ -21,7 +23,9 @@ Transformer le site en base d'acquisition mesurable, sans ajouter de backend ni
- [x] Asset social `assets/og-cover.jpg` créé (1200x630)
- [x] Copy contact orientée booking/collaboration + éléments de confiance
- [x] Ajustement responsive <=390px
- [x] Passe responsive complete 390/768/1024/1440 (home + lab)
- [x] Exécuter audit Lighthouse mobile/desktop et archiver résultats
- [x] Storybook build coverage P2 execute
- [ ] Vérifier aperçus sociaux en production (LinkedIn/Facebook debugger)
### P2 (mois)
@@ -80,11 +84,19 @@ Transformer le site en base d'acquisition mesurable, sans ajouter de backend ni
- `cta_hero_projets`
- `cta_hero_contact`
- `cta_hero_profile`
- `outbound_linkedin_project`
- `outbound_linkedin_contact`
- `outbound_malt_contact`
- `outbound_bandcamp_project`
- `outbound_bandcamp_contact`
- `outbound_github_contact`
- `outbound_github_project_rtc_bl_phone`
- `outbound_github_project_zacus`
- `outbound_github_project_site`
- `outbound_github_lab_more`
- `cta_lab_interactif_open`
Compat legacy:
- `outbound_github_project`
- `outbound_github_contact`
Paramètres:
- `event_category=engagement`
+191
View File
@@ -0,0 +1,191 @@
# Backlog DA-01 — Decision Complet
Date: 2026-03-02
Source: Sprint DA-00 (brief + wireflow conversion)
## Objectif
Implémenter la refonte complète selon le wireflow validé, sans modifier les contrats publics (anchors core, tracking, SEO).
## Etat d'avancement DA (2026-03-02)
- [x] Mapping section/composants finalisé en phase de refonte.
- [x] DA-00 intégré: structure Header/Hero/Systems/Production/Conversion/Footer et zones mobiles définies.
- [x] Contrat tokens/typographie/couleurs maintenu dans `src/styles/global.css`.
- [x] Validation finale pré-production en cours (preflight + checks build locaux + captures Figma consolidées).
- [ ] Plan de version web hors GitHub réservé (build Astro externe) en attente de besoin produit.
- [ ] Revue de dérive visuelle et conversion à refaire sur chaque release majeure.
## 1) Mapping section -> composants
1. `Header_ControlRoom`
- Cible: `src/pages/index.astro` + `src/layouts/BaseLayout.astro`
- Eléments:
- nav niveau 1 (labels libres)
- bus posture (niveau 2)
- status + contrast toggle
2. `Hero_Impact`
- Cible: `src/components/sections/Hero.tsx`
- Eléments:
- hook visuel
- manifeste 3 lignes
- CTA dual rail
3. `Identity_Proof`
- Cible: `src/components/sections/IdentityLab.tsx` + `TrustStrip.tsx`
- Eléments:
- identité studio
- preuves rapides
4. `Systems_Block`
- Cible: `FlowDiagram.tsx` + `SystemPipeline.tsx` + `About.tsx`
- Eléments:
- explication process
- architecture systeme
5. `Production_Block`
- Cible: `Projects.tsx` + `ProjectsTimeline.tsx` + `LabNotes.tsx`
- Eléments:
- portfolio systemique
- chronologie
- protocole Intent->Result
6. `Conversion_Block`
- Cible: `TrustStrip.tsx` + `Contact.tsx`
- Eléments:
- reassurance
- contact 2 voies (LinkedIn/Malt)
7. `Footer_Knowledge`
- Cible: `src/pages/index.astro` + `src/styles/global.css`
- Eléments:
- liens process/stack/contact
## 2) Mapping token -> CSS var
Fichier cible: `src/styles/global.css`
### Palette
- `--bg`, `--bg-elevated`, `--surface`, `--surface-soft`, `--surface-alt`
- `--trace-cyan`, `--trace-magenta`, `--trace-green`, `--trace-amber`
- `--electric`, `--accent`, `--signal`
- `--line`, `--line-soft`, `--line-edge`, `--line-rail`
### Typographie
- display serif editorial
- body sans
- micro labels mono
### Layout
- `site-shell` largeur max desktop
- grilles desktop/mobile (1440/390)
- rules sections `structure-grid` / `structure-cell`
## 3) Mapping interaction -> motion rule
### Navigation
- progress line header
- etat actif sur section visible
- micro-jitter actif uniquement sur lien actif
### Sections
- reveal par bloc (opacity + translateY)
- cadence differenciee par bloc (Hero > Systems > Conversion)
### CTA
- etat hover/focus/active explicite
- primaire > secondaire visuellement
### Accessibilite motion
- `prefers-reduced-motion`: desactiver animations non essentielles
## 4) Interfaces internes a standardiser
### CTA contract
Type logique:
- `label: string`
- `href: string`
- `event: TrackEventName`
- `destination: string`
- `external?: boolean`
Usage:
- Hero, About, Projects, Contact, Trust utilisent le meme contrat.
### Proof card contract
Type logique:
- `label: string`
- `value: string`
- `priority?: "high" | "medium"`
### Timeline/LabNotes contract
Type logique:
- `date/year`
- `title`
- `category`
- `summary`
- `href/event/destination` optionnels
## 5) Gates de validation DA-01
### Gate Build
- `npm run typecheck`
- `npm run build`
- `npm run preflight:pages`
- `npm run tracking:check`
### Gate UX
- ancres `#a-propos`, `#projets`, `#contact` fonctionnelles
- CTA primary/secondary lisibles
- mobile 390 sans overflow
- validation 390/768/1024/1440 conservée dans evidence
### Gate Tracking
- events declenches sans duplication
- params `event_category/event_label/destination` conformes
### Gate Accessibilite
- focus visible
- ordre tab coherent
- reduced-motion OK
### Gate SEO
- robots/sitemap accessibles
- canonical + OG/Twitter presents
## 6) Ordre dimplementation recommande
### P0
1. Recomposer la structure de `src/pages/index.astro`
2. Harmoniser tokens/layout de `src/styles/global.css`
3. Verifier ancres core + tracking
### P1
1. Harmoniser les sections (Hero, Systems, Production, Conversion)
2. Finaliser footer knowledge/protocoles
3. QA responsive + accessibilite
### P2
1. Storybook coverage structure + sections
2. Optimisation bundle/motion
## 7) Risques et parades
1. Risque: surcharge visuelle
- Parade: matrice arbitrage DA vs conversion appliquee
2. Risque: regression tracking
- Parade: tests manuels click-by-click + check dataLayer
3. Risque: degrade mobile
- Parade: validation systematique 390/768/1024/1440
## 8) Version duale (prod immédiate + web hors GitHub)
- Production immédiate: GitHub Pages conserve la version `index.html/styles.css/script.js` pour stabilité.
- Version web hors GitHub: build Astro `dist/` prévu comme variante de long terme (non déployé pour le moment).
- Règle: aucun changement d'UI ne doit diverger sans mise à jour explicite des 2 cahiers de preuve (scope statique + scope web externe).
## 9) Definition of done DA-01
1. Structure cible implementee en code.
2. DA conforme au brief v2.0.0.
3. Contrats publics preserves.
4. Tests passes et evidence mise a jour.
+43
View File
@@ -0,0 +1,43 @@
# DA Progress Log — 2026-03-02
## Contexte de la passe
- Refonte UI majeure engagée sur la home (DA-00).
- Objectif immédiat: fixer la stratégie de publication sans casser les contrats (tracking, ancres, SEO).
## Avancées capturées
- `docs/project-master-todos.md` mis à jour avec décision de sortie duale:
- production GitHub Pages = version immédiate stable (`index.html`, `styles.css`, `script.js`, `/lab/`)
- variante web hors GitHub = build Astro (`dist/`) préparé en option.
- `docs/da-01-implementation-backlog.md` mis à jour:
- état d'avancement DA
- gates QA élargies (`preflight:pages`, `tracking:check`)
- section "Version duale (prod immédiate + web hors GitHub)".
- `docs/github-pages-deploy.md` mis à jour:
- section "Stratégie de déploiement duale"
- rappel d'invariance de contrat entre versions.
- Figma DA-00 (captures) partiellement consolidées:
- captures desktop/mobile réalisées pour 390/768/1024/1440 (artifacts existants)
- preuves conservées: [artifacts/figma-capture/2026-03-02/da00-home-figma-capture-log.md](../artifacts/figma-capture/2026-03-02/da00-home-figma-capture-log.md)
- fichier final Figma: [Home_ElectronRare_DA00_2026-03-02_Final](https://www.figma.com/design/fnqOdDOU97v7E27LxkV7cn/Home_ElectronRare_DA00_2026-03-02_Final?node-id=0-5&t=1hMMzGSVdlsSMCI8-0)
## Décision d'architecture retenue
- Court terme: publier en priorité sur GitHub Pages (flux stable de release).
- Moyen terme: activer une version web externe Astro en parallèle uniquement si roadmap / besoins d'hébergement l'exigent.
- Contraintes permanentes: conserver `#a-propos`, `#projets`, `#contact`, CTA et contrat GA4 identiques.
## TODO immédiat (suite de sprint)
- [x] Vérification pré-vol technique terminée: `npm run preflight:pages`, `npm run build`.
- [x] Finaliser la preuve visuelle `390 / 768 / 1024 / 1440` sur la version GA publiée.
- [x] Normaliser lartefact Figma en un seul fichier final (nommage artboards + variantes) à partir des captures existantes.
- Vérifier GA4 Realtime + DebugView avec events cibles.
- Préparer le manifest d'évidence (`artifacts/.../`) pour la variante retenue.
- Garder la documentation de design centralisée dans ces fichiers avant toute autre livraison UI.
## Note runbook (tech)
- `npm run preflight:pages` a validé la chaine:
- `npm run lab:build`
- `npm run tracking:check`
- `npm run storybook:build`
- Point dattention observé lors du build Storybook:
- warning `Module level directives ... "use client" was ignored` sur `framer-motion` (non bloquant pour la prod)
- warning bundle `chunk size > 500kB` (à surveiller P2)
+91
View File
@@ -0,0 +1,91 @@
# Plan dexécution — Double version (GitHub Pages + web externe)
Date: 2026-03-02
Objectif: activer proprement une variante web hors GitHub sans casser la version stable GitHub Pages.
## 1) Référentiel dexécution
- Référence de vérité DA: `notes-interne/creative-direction-brief.md`
- Contrats publics (ancres/tracking/SEO): `specs/site-github-pages-spec.md`
- Gates techniques: `scripts/validate-tracking.mjs`
- Source technique:
- production immediate: `index.html`, `styles.css`, `script.js`, `lab/`
- évolution studio: `src/pages/index.astro`, `src/styles/global.css`, composants TSX
## 2) Stratégie de déploiement (choix)
### Baseline (conservée)
- Production immédiate = GitHub Pages via `index.html` statique.
- Aucun régression fonctionnelle ni visuelle sur cette version.
### Variante Web externe (en parallèle)
- Build web hors GitHub = Astro `dist/` (issue de la même base contentuelle DA).
- Utilisation recommandée: Vercel/Netlify (routes directes sur `/`).
## 3) Plan opérationnel par phases
### Phase A — Préparation (1h)
- [x] Valider que les sections/IDs core existent sur les 2 cibles:
- `#a-propos`
- `#projets`
- `#contact`
- [x] Vérifier que les contrats events GA4 sont identiques côté code source (nom + params).
- [x] Valider que le plan dassets SEO (robots/sitemap/OG/favicons) est prêt pour lhôte externe.
### Phase B — Stabilisation GitHub Pages (0.5h)
- [x] Exécuter: `npm run lab:build`, `npm run tracking:check`, `npm run storybook:build`, `npm run preflight:pages`.
- [ ] Vérifier sur local static preview (fallback) que `index.html` reste inchangé.
- [ ] Déployer GH Pages via `main` + workflow `.github/workflows/deploy-pages.yml`.
- [ ] Contrôles post-déploiement:
- `https://electron-rare.github.io/`
- `https://electron-rare.github.io/lab/`
- ancres core, robots, sitemap, prévisualisation OG.
### Phase C — Préparation web externe (1h)
- [x] Lancer build Astro de référence: `npm run build`.
- [x] Vérifier localement `dist/index.html` (ou host preview) et cohérence visuelle.
- [x] Vérifier que les CTA et paramètres GA4 sont bien émis comme GitHub Pages.
- [ ] Documenter la cible dURL externe et le `base/site` approprié si besoin.
### Phase D — Déploiement alternatif (0.5h)
- [ ] Déployer `dist/` sur hôte externe (Vercel/Netlify/custom) via `npm run build:external`.
- [ ] Vérifier accessibilité routes:
- `/`
- ancres de navigation en-fragmente
- `/lab/` (si exposée selon choix produit)
- [ ] Contrôles SEO: robots/sitemap (version externe si nécessaire), canonical, OG/Twitter.
### Phase E — Parité de preuve (1h)
- [ ] QA visuelle 390/768/1024/1440 sur les 2 versions.
- [ ] Tracking check:
- GA4 Realtime (events principaux)
- DebugView (`event_category`, `event_label`, `destination`)
- [ ] Archive:
- captures QA dans `artifacts/.../`
- manifest mis à jour (`evidence/manifest.json`)
- [ ] Verrouiller décision de routage principal: garder GH Pages ou activer web externe.
### Section complémentaire — Capture DA Figma (Home)
- Captures et instructions de handoff:
- [artifacts/figma-capture/2026-03-02/da00-home-figma-capture-log.md](../artifacts/figma-capture/2026-03-02/da00-home-figma-capture-log.md)
- Consolidation finale disponible: [Home_ElectronRare_DA00_2026-03-02_Final](https://www.figma.com/design/fnqOdDOU97v7E27LxkV7cn/Home_ElectronRare_DA00_2026-03-02_Final?node-id=0-5&t=1hMMzGSVdlsSMCI8-0)
- [x] Captures desktop/mobile obtenues (390/768/1024/1440) et loggées.
- [x] Consolider les 4 captures dans un seul fichier final (1 artboard par breakpoint).
- [x] Archiver le lien Figma final dans ce plan + dans `docs/recherche-documentaire-index.md`.
## 4) Règles de non-régression (non négociables)
- Aucune divergence visuelle majeure non tracée dans les docs DA.
- Uniquement la version choisie est promue comme “production”.
- Le contrat DA reste identique: anchors + CTAs + tracking + contraste/conversion.
- Pas de modification de tracking contract sans passage obligatoire de `tracking:check`.
## 5) Rôles / ownership proposé
- Pilotage DA: maintenu dans `docs/project-master-todos.md` + ce plan.
- QA: validation viewport + tracking + SEO.
- Livraisons: un seul merge valide une seule version à la fois.
## 6) Critères dacceptation
- 1 version publiée stable (GH Pages) + 1 build externe validé ou explicitement noté “en attente”.
- Les 3 ancres core fonctionnent sur les deux vues.
- Les events principaux GA4 passent avec paramètres conformes.
- Aucune régression de navigation, CTA, ni contraste.
+93 -46
View File
@@ -1,68 +1,115 @@
# Déploiement GitHub Pages (Astro studio stack)
# Deploiement GitHub Pages (site statique + module Lab interactif)
## Prérequis
- Dépôt Git connecté à GitHub (`git remote -v` non vide).
- Dépendances installées (`npm install`).
- Build local OK (`npm run build`).
- Workflow présent: `.github/workflows/deploy-pages.yml`.
- Fichiers publics en place:
- `public/robots.txt`
- `public/sitemap.xml`
- `public/assets/og-cover.jpg`
- GTM configuré via variable `PUBLIC_GTM_CONTAINER_ID` (par défaut actuel: `GTM-5SLM67QF`).
## Prerequis
- Depot Git connecte a GitHub (`git remote -v` non vide).
- Dependances installees:
- `npm install`
- `npm --prefix apps/lab-interactif install`
- Build module lab OK (`npm run lab:build`).
- Workflow present: `.github/workflows/deploy-pages.yml`.
- Fichiers de publication racine presents:
- `index.html`, `styles.css`, `script.js`
- `assets/` (dont `assets/og-cover.jpg` + `assets/brand/*`)
- `robots.txt`, `sitemap.xml`
- favicons (`favicon*`, `apple-touch-icon.png`)
## Configuration GitHub Pages
1. GitHub > dépôt > **Settings** > **Pages**.
1. GitHub > depot > **Settings** > **Pages**.
2. Dans **Build and deployment**:
- **Source**: `GitHub Actions`
3. Enregistrer.
## ploiement
1. Push sur `main` (ou lancer `workflow_dispatch`).
2. Vérifier le workflow **Deploy Astro to GitHub Pages**.
3. Attendre l'URL de déploiement dans le job `deploy`.
## Pipeline deploiement
Workflow: **Deploy Static Site + Lab to GitHub Pages**
## Commandes locales
- Dev: `npm run dev`
- Typecheck: `npm run typecheck`
- Build prod: `npm run build`
- Storybook: `npm run storybook`
Le job build:
1. installe les deps racine
2. installe les deps du module `apps/lab-interactif`
3. build le module interactif dans `lab/`
4. prepare un artifact `.pages-dist/` (site + assets + lab)
5. deploye via `actions/deploy-pages`
## Commandes locales utiles
- Home statique: `python3 -m http.server 4173`
- Lab dev: `npm run lab:dev`
- Lab build: `npm run lab:build`
- Tracking contract: `npm run tracking:check`
- Storybook build: `npm run storybook:build`
- Preflight complet pages: `npm run preflight:pages`
- Build externe Astro (avec `/lab` inclus): `npm run build:external`
## Instrumentation GTM + GA4
1. Créer/associer un conteneur GTM et propriété GA4.
2. Vérifier `PUBLIC_GTM_CONTAINER_ID` utilisé au build/deploy.
3. Publier le conteneur GTM.
4. Vérifier GA4 Realtime et DebugView.
## Déploiement externe Astro (Vercel/Netlify)
### Contrat d'événements (`dataLayer`)
Objectif: publier `dist/` généré par Astro pour une version hors GitHub Pages.
- Préparer les variables denvironnement:
- `PUBLIC_SITE_URL=https://<votre-domaine-vercel-ou-netlify>/` (canonical + OG)
- éventuellement `EXTERNAL_SITE_URL` comme alias pratique
- Exécuter: `npm run build:external`
- GitLab/Netlify et Vercel détectent automatiquement `vercel.json` / `netlify.toml` :
- `vercel`: `npm run build:external`
- `netlify`: `npm run build:external`
- Le build externe inclut:
- page Astro Home: `dist/index.html`
- page `dist/robots.txt` et `dist/sitemap.xml`
- bundle Astro `_astro/`
- `dist/lab/` (copié après `lab:build`) si `lab/` existe
## Notes de contrôle pour version externe
- Vérifier `https://<domaine-externe>/` après déploiement.
- Vérifier les ancres `/` : `#a-propos`, `#projets`, `#contact`.
- Vérifier que `canonical` correspond bien à `PUBLIC_SITE_URL`.
- Vérifier OG/Twitter preview via cache buster si nécessaire.
- Vérifier la présence de `/lab/` selon la stratégie produit.
## Stratégie de déploiement duale (si besoin business)
- Production: GitHub Pages reste la version publiée courante (`index.html`, `styles.css`, `script.js`, `/lab/`).
- Complément: version web hors GitHub possible via build Astro dédié (`npm run build:external`), puis publication sur hôte dédié (Netlify/Vercel/custom).
- Contrat immuable: ancres `#a-propos`, `#projets`, `#contact`, labels CTA, et paramètres GA4 conservés entre versions.
## Contrat tracking GTM + GA4
### Container
- GTM: `GTM-5SLM67QF`
### Evenements principaux
- `cta_hero_projets`
- `cta_hero_contact`
- `cta_hero_profile`
- `outbound_linkedin_project`
- `outbound_linkedin_contact`
- `outbound_malt_contact`
- `outbound_bandcamp_project`
- `outbound_bandcamp_contact`
- `outbound_github_contact`
Paramètres:
### Evenements GitHub dedies
- `outbound_github_project_rtc_bl_phone`
- `outbound_github_project_zacus`
- `outbound_github_project_site`
- `outbound_github_lab_more`
- `cta_lab_interactif_open`
### Compat historique
- Les liens GitHub critiques conservent `data-track-legacy` pour pousser aussi les evenements legacy.
### Parametres obligatoires
- `event_category=engagement`
- `event_label=<nom_evenement>`
- `destination=<domaine|ancre>`
- `destination=<domaine|ancre|path>`
Conversions recommandées:
- Primaire: `outbound_linkedin_contact`
- Secondaire: `outbound_malt_contact`
## Verification post-deploiement
- [ ] `https://electron-rare.github.io/` charge correctement
- [ ] `https://electron-rare.github.io/lab/` charge correctement
- [ ] Ancres core home (`#a-propos`, `#projets`, `#contact`) OK
- [ ] `robots.txt` accessible
- [ ] `sitemap.xml` accessible (inclut `/` + `/lab/`)
- [ ] OG/Twitter preview OK
- [ ] GA4 Realtime voit les events clics
- [ ] GA4 DebugView confirme `event_label` + `destination`
- [ ] Search Console: sitemap soumis + indexation `/` et `/lab/`
## Vérification post-déploiement
- URL publique chargée sans erreur.
- Sections et ancres (`#a-propos`, `#projets`, `#contact`) OK.
- `https://electron-rare.github.io/robots.txt` accessible.
- `https://electron-rare.github.io/sitemap.xml` accessible.
- OG/Twitter image OK (`/assets/og-cover.jpg`).
- GA4 Realtime + DebugView remontent les events et paramètres.
- Aperçu social validé (LinkedIn Post Inspector / Facebook Debugger).
## Traçabilité
- Mettre à jour `evidence/manifest.json`.
- Ajouter artefacts dans `artifacts/*/<date>/` à chaque itération.
## Notes de routage module C
- Le module lab utilise `HashRouter` pour compatibilite hebergement statique (GitHub Pages).
- Routes attendues:
- `/lab/` (overview)
- `/lab/#/signals`
- `/lab/#/prototypes`
+41
View File
@@ -0,0 +1,41 @@
# Runbook - Integration logo (post generation)
Date: 2026-03-02
## Objectif
Integrer le logo final dans le site sans regressions SEO/UI.
## Source de selection
- Source officielle: `output/VALIDE DA`
- Decision: voir `notes-interne/logo-selection-2026-03-02.md`
- Winner: `001-create-a-vector-logo-for-electron-rare-with-an-er-monogram-b.png`
## Emplacements cibles
- Header brand mark: `public/assets/brand/logo-mark.png`
- Header lockup (optionnel): `public/assets/brand/logo-lockup.png`
- SVG derives: `public/assets/brand/logo-mark.svg`, `public/assets/brand/logo-lockup.svg`
- Favicon: `public/favicon.svg`, `public/favicon.ico`, `public/favicon-32x32.png`, `public/favicon-16x16.png`, `public/apple-touch-icon.png`
- OG cover: `public/assets/og-cover.jpg` (1200x630)
## Fichiers a mettre a jour
- `src/styles/global.css` (classe `.site-brand::before`)
- `src/layouts/BaseLayout.astro` (favicon links)
- `src/lib/site.ts` (`BRAND_ASSETS`)
- `public/assets/brand/*` (assets finals)
## Checks obligatoires
1. Lisibilite logo a 24px/32px/48px
2. Contraste logo dark/light/high-contrast
3. Aucune casse layout mobile 390px
4. Favicon charge sans 404
5. OG image validee via social debuggers
## Procedure rapide
1. Copier les 3 fichiers retenus dans `tmp/brand-selection/` pour freeze.
2. Produire le pack final dans `public/assets/brand/` (PNG + SVG derives).
3. Produire le pack favicon dans `public/`.
4. Regenerer `public/assets/og-cover.jpg`.
5. Pointer `site.ts` + `BaseLayout` + `global.css` vers les nouveaux assets.
6. Executer `npm run typecheck && npm run build`.
7. Verifier en preview locale puis en production.
8. Archiver la preuve dans `artifacts/qa-test/<date>/` et mettre a jour `evidence/manifest.json`.
+68
View File
@@ -0,0 +1,68 @@
# Master TODO - Electron rare site
Date: 2026-03-02
Source of truth: this file
## Scope
- Site GitHub Pages (production): `index.html`, `styles.css`, `script.js`, `/lab/`
- Référence d'intégration UI/logicielle: `src/pages/index.astro`, `src/styles/global.css`, `src/components/*`
- Option web hors GitHub (en parallèle, si exigée): build Astro `dist/` publié sur autre host
- Module C interactif: `apps/lab-interactif` -> publication `lab/`
- Direction artistique active: `editorial-premium`, `warm-artistic`, `balanced`
- Acquisition: SEO + tracking GTM/GA4 + conversion CTA
## Decision Log DA (2026-03-02)
- [x] Avancée majeure: refonte UI complète validée en mode DA-00 sur `index.html` (scope web visible actuel).
- [x] Avancée majeure: plan DA (wireflow + composants + tokens) consolidé.
- [ ] Décision d'exploitation: maintien de la version GitHub Pages comme production immédiate, préparation d'un build Astro externe pour version web hors GitHub.
- [ ] Action nécessaire: aligner chaque évolution UI avec un `artifact` d'avancement daté (captures + preuve QA) pour éviter la dérive.
## Base DA / architecture
- [x] Brief DA v2.0.0 verrouille (`notes-interne/creative-direction-brief.md`)
- [x] Home reconstruite de zero en statique
- [x] Top 3 GitHub en section Projets + bouton "Voir plus" en section dediee
- [x] Module C "Lab interactif" implemente (React Router)
- [x] Routing lab adapte GitHub Pages (HashRouter)
## QA P1 (2026-03-02)
- [x] Passe visuelle responsive 390/768/1024/1440 (home + lab)
- [x] Captures + rapport QA archives (`artifacts/qa-test/2026-03-02/responsive-p1/`)
- [x] Storybook build coverage P2 execute (`npm run storybook:build`)
- [x] Checklist prod locale GA4/Search Console preparee
## Tracking / GA4
- [x] Contrat hero conserve (`cta_hero_projets`, `cta_hero_contact`, `cta_hero_profile`)
- [x] Events GitHub dedies ajoutes
- [x] Compat legacy preservee (`data-track-legacy`)
- [ ] Validation GA4 Realtime sur environnement public
- [ ] Validation GA4 DebugView (params conformes)
- [ ] Definition conversion GA4 primaire LinkedIn / secondaire Malt
## SEO / Search Console
- [x] `robots.txt` racine
- [x] `sitemap.xml` racine maj 2026-03-02
- [x] Sitemap inclut `/` et `/lab/`
- [x] Canonical + OG + Twitter sur home
- [ ] Validation Search Console (propriete + soumission sitemap + indexation)
- [ ] Validation previews sociaux (LinkedIn/Facebook)
## Roadmap web hors GitHub (optionnelle)
- [ ] Générer `dist/` Astro à partir du même contenu (`npm run build`) pour maquette/landing dédiée hors GitHub Pages.
- [x] Ajouter un plan de déploiement alternatif (Netlify/Vercel/custom) sans toucher au contrat d'ancrage (`#a-propos`, `#projets`, `#contact`) : configs `vercel.json` et `netlify.toml` + script `build:external`.
- [ ] Documenter la divergence minimale: route, headers, et variables d'environnement GA/SEO.
- [ ] Valider que le contrat de tracking reste identique entre les deux versions (labels, destinations, event_category).
## Deploy GitHub Pages
- [x] Workflow migre: static site + lab (`.github/workflows/deploy-pages.yml`)
- [x] Doc deploy mise a jour (`docs/github-pages-deploy.md`)
- [ ] Trigger deploy depuis `main` et verification URL publique
- [x] Exécuter `docs/dual-deployment-execution-plan.md` pour valider le mode “GitHub Pages + web externe” si décision produit.
- [x] Captures QA planifiées 390/768/1024/1440: `artifacts/qa-test/2026-03-02/responsive-p1/`.
- [x] Preflight local complété (2026-03-02): `npm run preflight:pages`
- [x] Build Astro vérifié (2026-03-02): `npm run build`
- [ ] Déploiement GH Pages post-lock (validation public URL + ancres + OG/robots/sitemap)
## Rituels de verification
- Avant merge: `npm run preflight:pages`
- A chaque pass majeur: mise a jour `artifacts/qa-test/<date>/...` + `evidence/manifest.json`
- Toute variation DA: mise a jour du brief avant patch UI
+64
View File
@@ -0,0 +1,64 @@
# Index - Recherche documentaire
Date: 2026-03-02
But: point d'entree unique pour retrouver la doc (DA, UX, tracking, SEO, deploy, evidence).
Note: `notes-interne/` est un dossier local prive (gitignore). Les liens vers ce dossier peuvent etre non resolubles sur GitHub.
## Ordre de verite (anti-derive)
1. `notes-interne/creative-direction-brief.md` (axes DA verrouilles)
2. `specs/site-github-pages-spec.md` (contrats publics: anchors, tracking, SEO)
3. `docs/project-master-todos.md` (source of truth execution + gates)
4. `docs/github-pages-deploy.md` (deploiement Pages + checklist post-deploy)
5. `docs/acquisition-seo-plan.md` (plan 7j/30j acquisition + QA)
## Actif (a consulter en premier)
- [project-master-todos.md](./project-master-todos.md) - backlog et gates (source de verite execution)
- [site-github-pages-spec.md](../specs/site-github-pages-spec.md) - spec + contrats publics (anchors/tracking/SEO)
- [creative-direction-brief.md](../notes-interne/creative-direction-brief.md) - brief DA (axes)
- [creative-direction-guidelines.md](../notes-interne/creative-direction-guidelines.md) - guidelines DA (composition, motion, conversion)
- [wireflow-conversion-da00.md](./wireflow-conversion-da00.md) - wireflow desktop/mobile + user flow CTA
- [da-01-implementation-backlog.md](./da-01-implementation-backlog.md) - mapping sections/tokens/interaction + gates DA-01
- [da-progress-log-2026-03-02.md](./da-progress-log-2026-03-02.md) - journal des avancées DA de la session courante
## Brand (logo + assets)
- [logo-selection-2026-03-02.md](../notes-interne/logo-selection-2026-03-02.md) - gagnant + backups (integration web)
- [logo-integration-runbook.md](./logo-integration-runbook.md) - procedure d'integration (formats, paths, verifs)
- [logo-prompts-electron-rare-v2-github.md](../notes-interne/logo-prompts-electron-rare-v2-github.md) - prompts pack v2 (reference)
- [logo-prompts-electron-rare.md](../notes-interne/logo-prompts-electron-rare.md) - prompts pack historique (archive)
## Acquisition / SEO / Tracking
- [acquisition-seo-plan.md](./acquisition-seo-plan.md) - plan P0/P1 + roadmap 7j/30j
- [github-pages-deploy.md](./github-pages-deploy.md) - checklist post-deploy + tracking contract
- `scripts/validate-tracking.mjs` - validation contrat tracking (CLI)
- `src/lib/tracking.ts` - source de verite implementation events
## Recherche (references et recoupements)
- [ui-ux-da-research-2026-03-02.md](../notes-interne/ui-ux-da-research-2026-03-02.md) - constats + gates UX (anti-blocage)
- [references-web-da-maker-ux-2026-03-01.md](../notes-interne/references-web-da-maker-ux-2026-03-01.md) - references creatives + UX (maker/studio)
- [recherche-web-clement-saillant.md](../notes-interne/recherche-web-clement-saillant.md) - recoupements web public (identites/URLs)
- [stack-studio-open-source-2026-03-01.md](../notes-interne/stack-studio-open-source-2026-03-01.md) - choix stack + arbitrages
- [top8-ui-reference-todos.md](./top8-ui-reference-todos.md) - TODOs UI references (historique utile)
## Evidence / QA
- [da00-home-figma-capture-log.md](../artifacts/figma-capture/2026-03-02/da00-home-figma-capture-log.md) - captures Figma home (390/768/1024/1440) + claims.
- [Home_ElectronRare_DA00_2026-03-02_Final](https://www.figma.com/design/fnqOdDOU97v7E27LxkV7cn/Home_ElectronRare_DA00_2026-03-02_Final?node-id=0-5&t=1hMMzGSVdlsSMCI8-0) - artifact Figma final (390/768/1024/1440).
- `artifacts/qa-test/` - captures, rapports, evidence par date
- `evidence/manifest.json` - manifest evidence
## Archive / Historique
- [migration-legacy-to-astro.md](./migration-legacy-to-astro.md) - migration legacy -> Astro (historique, pas la voie de publication actuelle)
- `artifacts/legacy-snapshot/` - snapshot legacy (reference)
## Regles de maintenance (rapides)
- Si tu changes une decision DA: update `notes-interne/creative-direction-brief.md` avant tout patch UI.
- Si tu changes tracking: update `specs/site-github-pages-spec.md` + `docs/github-pages-deploy.md`, puis `npm run tracking:check`.
- Si tu changes le deploy: update `.github/workflows/deploy-pages.yml` + `docs/github-pages-deploy.md`.
+113
View File
@@ -0,0 +1,113 @@
# Top 8 UI Reference TODOs - Electron Rare
Date: 2026-03-01
Scope: `src/pages/index.astro` + `src/styles/global.css`
DA lock: `editorial-premium` + `subtle-precise` + `warm-artistic`
Conversion lock: CTA principal LinkedIn, CTA secondaire Malt
## 1) Hero "manifeste laboratoire" (ref 1024 + maker)
Status: DONE (2026-03-01)
Source references:
- https://www.1024architecture.net/
- https://hackaday.com/
Tasks:
- `src/pages/index.astro`: ajouter un mini-manifeste en 3 lignes dans le hero (creation electronique, invention systeme, design produit).
- `src/styles/global.css`: ajouter un style `hero-manifest` en colonnes avec marqueurs "signal".
Acceptance:
- Message de valeur visible sans scroll sur mobile 390px.
- Aucun conflit de lisibilite avec la palette atelier (ivoire/encre/cuivre).
## 2) Timeline projets datee (ref Screen Club)
Status: DONE (2026-03-01)
Source references:
- https://www.screen-club.com/
Tasks:
- `src/pages/index.astro`: inserer une timeline compacte apres `Projects` (annee + titre + type + lien).
- `src/styles/global.css`: ajouter un rail vertical avec nodes et etat actif.
Acceptance:
- Lecture chronologique en <10 secondes.
- Focus clavier visible sur chaque lien timeline.
## 3) Bloc "Lab Notes" recurrent (ref Hackaday)
Status: DONE (2026-03-01)
Source references:
- https://hackaday.com/
- https://www.instructables.com/
Tasks:
- `src/pages/index.astro`: ajouter section `Lab Notes` avec 3 cartes datees.
- `src/styles/global.css`: styler cartes style carnet de labo (header horodate + barres de signal).
Acceptance:
- Structure fixe `Intent -> System -> Build -> Test -> Result` lisible dans chaque carte.
- Pas d'overflow a 390px.
## 4) Bandeau "system pipeline" (ref maker docs + 1024)
Status: DONE (2026-03-01)
Source references:
- https://www.1024architecture.net/about/
- https://learn.adafruit.com/
Tasks:
- `src/pages/index.astro`: ajouter bandeau horizontal "Research -> Prototype -> Runtime -> Deployment".
- `src/styles/global.css`: animer le flux avec cadence lente et `prefers-reduced-motion`.
Acceptance:
- Pipeline comprehensible en un coup d'oeil.
- Animation desactivee automatiquement si reduced motion.
## 5) Navigation "console sticky" renforcee (ref Studio Hemisphere)
Status: DONE (2026-03-01)
Source references:
- https://studio-hemisphere.com/
Tasks:
- `src/pages/index.astro`: ajouter un etat texte court dans le header (`STATUS: LIVE EXPERIMENT`).
- `src/styles/global.css`: renforcer style console (scanline, jitter leger, progress line) sans surbruit.
Acceptance:
- Header reste lisible et non intrusif pendant scroll.
- Aucun tremblement global hors lien actif.
## 6) Bloc confiance "preuves" (ref Screen Club + SparkFun)
Status: DONE (2026-03-01)
Source references:
- https://www.screen-club.com/about/
- https://www.sparkfun.com/success
Tasks:
- `src/pages/index.astro`: ajouter ligne de preuves ("collaborations", "projets actifs", "liens verifiables").
- `src/styles/global.css`: badges compacts avec contraste fort.
Acceptance:
- Bloc visible avant section Contact.
- CTA de contact reste element le plus actionnable.
## 7) Module CTA dual clair (ref CRO guardrail)
Status: DONE (2026-03-01)
Source references:
- https://www.nngroup.com/articles/ten-usability-heuristics/
- https://baymard.com/
Tasks:
- `src/pages/index.astro`: harmoniser un duo de CTA fixe par section cle (LinkedIn primaire, Malt secondaire).
- `src/styles/global.css`: etats hover/focus/active homogennes et accessibles.
Acceptance:
- Differenciation primaire/secondaire explicite visuellement.
- Evenements tracking existants non casses.
## 8) Footer "knowledge + protocoles"
Status: TODO
Source references:
- https://www.adafruit.com/
- https://www.hackster.io/
Tasks:
- `src/pages/index.astro`: enrichir footer avec 3 liens: process, stack, contact pro.
- `src/styles/global.css`: style footer en grille technique simple.
Acceptance:
- Footer apporte contexte pro sans alourdir.
- Liens externes trackables et testables.
## Execution order (recommande)
1. TODO 5 (nav) + TODO 7 (CTA) pour securiser conversion.
2. TODO 1 (hero) + TODO 6 (preuves) pour clarte business.
3. TODO 2 (timeline) + TODO 3 (lab notes) pour profondeur portfolio.
4. TODO 4 (pipeline) + TODO 8 (footer) pour finaliser coherence studio.
## QA minimal a chaque TODO
- `npm run typecheck`
- `npm run build`
- test visuel 390/768/1024/1440
- navigation clavier complete
- verification `prefers-reduced-motion`
+2 -1
View File
@@ -8,7 +8,8 @@ Améliorer le rendu visuel, la lisibilité mobile et l'ergonomie moderne sans ca
## Améliorations déjà appliquées
- `scroll-margin-top` sur sections ancrées (menu sticky plus propre).
- Cibles tactiles renforcées sur navigation, boutons et liens contact.
- Mode `prefers-contrast: more` ajouté pour meilleure lisibilité.
- Pass de style studio électrique appliquée (`src/styles/global.css` + `src/components/*`).
- `prefers-reduced-motion` maintenu pour réduire les animations.
## Priorités prochaines itérations
1. Typographie
+132
View File
@@ -0,0 +1,132 @@
# Wireflow Conversion — Sprint DA-00
Date: 2026-03-02
Statut: READY FOR FIGMA EXECUTION
## Contexte d'execution
- Figma MCP non detecte dans cet environnement (aucune ressource MCP disponible).
- Fallback applique: specification wireflow complete prete a etre reproduite dans Figma manuellement.
- Livrable attendu dans Figma:
- `00_Wireflow_Desktop_1440`
- `01_Wireflow_Mobile_390`
- `02_User_Flow_CTA`
## 1) Page Figma — `00_Wireflow_Desktop_1440`
### Frame principal
- Nom: `Home_Desktop_1440`
- Taille: `1440 x 4200`
- Grid: 12 colonnes, marge 80, gutter 24
- Sections (ordre strict):
1. `Header_ControlRoom`
2. `Hero_Impact`
3. `Identity_Proof`
4. `Systems_Block`
5. `Production_Block`
6. `Conversion_Block`
7. `Footer_Knowledge`
### Zoning par section
- `Header_ControlRoom`
- Row A: logo, nav, toggle, status
- Row B: chips posture studio
- `Hero_Impact`
- Col gauche: proposition de valeur + manifeste + CTA primary/secondary
- Col droite: carte studio / signaux
- `Identity_Proof`
- grille 3 modules (identite, preuves, credibilite)
- `Systems_Block`
- `FlowDiagram` + `SystemPipeline` + `About`
- `Production_Block`
- `Projects` + `ProjectsTimeline` + `LabNotes`
- `Conversion_Block`
- `TrustStrip` + `Contact`
- `Footer_Knowledge`
- liens process, stack, contact pro
### Interactions minimales (wireflow)
- Nav -> ancres core: `#a-propos`, `#projets`, `#contact`
- CTA primaire LinkedIn sur Hero, section intermediaire, Contact
- CTA secondaire Malt sur Hero, section intermediaire, Contact
## 2) Page Figma — `01_Wireflow_Mobile_390`
### Frame principal
- Nom: `Home_Mobile_390`
- Taille: `390 x 5300`
- Grid: 4 colonnes, marge 16, gutter 12
### Ordre mobile obligatoire
1. Header compact
2. Hero + CTA primaire above the fold
3. Identity
4. Flow
5. Pipeline
6. About
7. Projects
8. Timeline
9. Lab Notes
10. Trust
11. Contact
12. Footer
### Regles mobile
- Pas d'overflow horizontal
- Boutons >= 44px hauteur
- Contraste CTA suffisant
- Parcours contact en 2 clics max
## 3) Page Figma — `02_User_Flow_CTA`
### Diagramme user-flow
- Entrées trafic:
- Social direct
- Search organique
- Referral
- Noeuds:
1. `Hero_View`
2. `Proof_Scan`
3. `System_Understanding`
4. `Intent_Contact`
5. `Outbound_LinkedIn_Primary`
6. `Outbound_Malt_Secondary`
### Conditions de passage
- `Hero_View -> Intent_Contact`: proposition de valeur + CTA visible
- `Proof_Scan -> Intent_Contact`: preuves suffisantes + confiance
- `System_Understanding -> Intent_Contact`: comprehension methodologie + resultats
### Events associes
- `cta_hero_contact`
- `outbound_linkedin_contact`
- `outbound_malt_contact`
## 4) Tokens wireflow (niveau schema)
### Typographie
- Display: serif editorial
- Body/UI: sans lisible
- Micro-labels techniques: mono
### Couleur
- Base atelier claire (ivoire/crème), encre sombre pour le texte
- Accent principal cuivre/ambre (CTA, highlights)
- Accent secondaire teal/atelier (repères, liens)
- Accents techniques possibles (très mesurés) pour signal/état si besoin
### Motion
- Feedback dinteraction (hover/focus/active) + reveal discret par bloc
- Etats actifs nav lisibles, sans sur-effets
- `prefers-reduced-motion` obligatoire
## 5) Checklist de validation wireflow
1. Ancres core presentes et liees.
2. CTA primaire/secondaire presents dans 3 zones min.
3. Hierarchie visuelle lisible en moins de 2 secondes sur Hero.
4. Structure complete desktop + mobile.
5. Aucun conflit avec contrat tracking.
## 6) Definition of done DA-00 (wireflow)
- Pages Figma nommees exactement comme specifie.
- User flow CTA valide.
- Handoff DA-01 possible sans decision manquante.
+73 -7
View File
@@ -1,7 +1,7 @@
{
"date": "2026-03-01",
"change": "Migration Astro studio + pass CRO (CTA/funnel contact) avec validation build/type/storybook",
"gates_satisfied": ["G0", "G1", "G2", "G3"],
"date": "2026-03-02",
"change": "Pivot statique from-scratch + module C lab interactif + QA responsive P1 + Storybook coverage + prep prod checklist",
"gates_satisfied": ["G0", "G1", "G2", "G3", "DA-00", "G1-logo", "DA-01-P0", "DA-01-P1", "DA-01-QA-P1"],
"commits": [
"2b41f9c",
"6626fe1"
@@ -19,15 +19,32 @@
"artifacts/qa-test/2026-03-01/g3-verification-v6-astro.md",
"artifacts/qa-test/2026-03-01/g2-implement-v5-cro.md",
"artifacts/qa-test/2026-03-01/g3-verification-v7-cro.md",
"artifacts/qa-test/2026-03-01/g3-verification-v8-da-polish.md",
"artifacts/qa-test/2026-03-01/g3-verification-v9-production-readiness.md",
"artifacts/qa-test/2026-03-01/lighthouse-home-mobile-v1.json",
"artifacts/qa-test/2026-03-01/lighthouse-home-desktop-v1.json"
"artifacts/qa-test/2026-03-01/lighthouse-home-desktop-v1.json",
"artifacts/qa-test/2026-03-02/g0-da00-brief-wireflow.md",
"artifacts/qa-test/2026-03-02/g1-logo-selection-integration.md",
"artifacts/qa-test/2026-03-02/g2-da01-p0-layout-structure.md",
"artifacts/qa-test/2026-03-02/g3-da01-p1-sections-footer-references.md",
"artifacts/qa-test/2026-03-02/g4-uiux-da-research-and-qa.md",
"artifacts/qa-test/2026-03-02/responsive-p1/report.md",
"artifacts/qa-test/2026-03-02/responsive-p1/image-dimensions.csv"
],
"docs": [
"specs/site-github-pages-spec.md",
"architecture/site-github-pages-architecture.md",
"docs/github-pages-deploy.md",
"docs/acquisition-seo-plan.md",
"docs/webdesign-responsive-modern.md"
"docs/webdesign-responsive-modern.md",
"docs/project-master-todos.md",
"docs/logo-integration-runbook.md",
"docs/top8-ui-reference-todos.md",
"docs/wireflow-conversion-da00.md",
"docs/da-01-implementation-backlog.md",
"notes-interne/creative-direction-brief.md",
"notes-interne/creative-direction-guidelines.md",
"notes-interne/logo-selection-2026-03-02.md"
],
"implementation": [
"package.json",
@@ -39,19 +56,68 @@
".github/workflows/deploy-pages.yml",
"src/layouts/BaseLayout.astro",
"src/pages/index.astro",
"index.html",
"styles.css",
"script.js",
"scripts/validate-tracking.mjs",
"apps/lab-interactif/package.json",
"apps/lab-interactif/vite.config.js",
"apps/lab-interactif/src/main.jsx",
"apps/lab-interactif/src/App.jsx",
"apps/lab-interactif/src/styles.css",
"apps/lab-interactif/src/pages/LabHomePage.jsx",
"apps/lab-interactif/src/pages/SignalsPage.jsx",
"apps/lab-interactif/src/pages/PrototypesPage.jsx",
"src/components/ui/button.tsx",
"src/components/ui/card.tsx",
"src/components/ui/cta-dual-rail.tsx",
"src/components/sections/Hero.tsx",
"src/components/sections/About.tsx",
"src/components/sections/Projects.tsx",
"src/components/sections/FlowDiagram.tsx",
"src/components/sections/IdentityLab.tsx",
"src/components/sections/SystemPipeline.tsx",
"src/components/sections/ProjectsTimeline.tsx",
"src/components/sections/LabNotes.tsx",
"src/components/sections/TrustStrip.tsx",
"src/components/sections/Contact.tsx",
"src/styles/global.css",
"src/lib/site.ts",
"public/robots.txt",
"public/sitemap.xml",
"public/assets/og-cover.jpg"
"public/assets/og-cover.jpg",
"public/assets/brand/logo-mark.png",
"public/assets/brand/logo-lockup.png",
"public/assets/brand/logo-mark.svg",
"public/assets/brand/logo-lockup.svg",
"public/favicon.svg",
"public/favicon.ico",
"public/favicon-32x32.png",
"public/favicon-16x16.png",
"public/apple-touch-icon.png",
"apple-touch-icon.png",
"favicon.svg",
"favicon.ico",
"favicon-32x32.png",
"favicon-16x16.png",
"robots.txt",
"sitemap.xml",
"assets/og-cover.jpg",
"assets/brand/logo-mark.png",
"assets/brand/logo-lockup.png"
],
"notes": [
"Remote Git absent dans ce clone: push GitHub et deploiement Pages bloques tant que `git remote` n'est pas configure.",
"TODO externe restant apres push: valider GA4 Realtime/DebugView, Search Console, previews sociaux (LinkedIn/Facebook)."
"TODO externe restant apres push: valider GA4 Realtime/DebugView, Search Console, previews sociaux (LinkedIn/Facebook).",
"DA-00 verrouille: brief v1.3.0 + guidelines + spec + wireflow + backlog DA-01.",
"Figma MCP non detecte lors du sprint DA-00: wireflow documente en fallback pour execution manuelle.",
"Logo selection verrouillee depuis output/VALIDE DA: winner 001, backups 010 et 005.",
"Le dossier output/imagegen/electron-rare-logos-v2 contient des rendus incomplets; output/VALIDE DA est la source autoritative pour integration.",
"DA-01 P0 valide cote code: structure control-room + grilles responsive + footer harmonise, sans changement des contrats tracking/anchors.",
"DA-01 P1 avance: sections harmonisees, references GitHub integrees, footer knowledge/protocoles enrichi.",
"Research UI/UX DA ajoutee dans notes-interne/ui-ux-da-research-2026-03-02.md avec sources officielles.",
"QA locale faite (390/768/1024/1440 + Lighthouse): desktop perf 90, mobile perf encore sous cible.",
"Module /lab passe en HashRouter pour compatibilite GitHub Pages (pas de rewrite server).",
"Workflow Pages migre pour publier home statique + module lab depuis .pages-dist."
]
}
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-label="Electron rare favicon"><image href="/assets/brand/logo-mark.png" width="1024" height="1024" preserveAspectRatio="xMidYMid meet"/></svg>

After

Width:  |  Height:  |  Size: 223 B

+315
View File
@@ -0,0 +1,315 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Clément Saillant - L'electron rare</title>
<meta
name="description"
content="Studio de Clement Saillant (L'electron rare): design de systemes, code creatif, IA appliquee et prototypes electroniques." />
<meta name="theme-color" content="#f4eee3" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="canonical" href="https://electron-rare.github.io/" />
<meta name="robots" content="index,follow,max-image-preview:large" />
<meta property="og:type" content="website" />
<meta property="og:locale" content="fr_FR" />
<meta property="og:site_name" content="L'electron rare" />
<meta property="og:title" content="Clément Saillant - L'electron rare" />
<meta property="og:url" content="https://electron-rare.github.io/" />
<meta
property="og:description"
content="Design de systemes, code creatif, IA appliquee et production de dispositifs audiovisuels." />
<meta property="og:image" content="https://electron-rare.github.io/assets/og-cover.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="L'electron rare - studio systemes et design" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Clément Saillant - L'electron rare" />
<meta
name="twitter:description"
content="Studio hybride: strategie produit, creation electronique, IA appliquee et execution code." />
<meta name="twitter:image" content="https://electron-rare.github.io/assets/og-cover.jpg" />
<script>
window.dataLayer = window.dataLayer || [];
(function (w, d, s, l, i) {
if (!i) {
return;
}
w[l] = w[l] || [];
w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
var f = d.getElementsByTagName(s)[0];
var j = d.createElement(s);
var dl = l !== 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-5SLM67QF');
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Clément Saillant",
"alternateName": "L'electron rare",
"url": "https://electron-rare.github.io/",
"jobTitle": "Concepteur en creation electronique, design produit et systemes experimentaux",
"description": "Codeur creatif, iterateur IA et inventeur de systemes: creation electronique, performances audiovisuelles et collaborations studio.",
"sameAs": [
"https://fr.linkedin.com/in/electron-rare",
"https://www.malt.com/profile/clementsaillant",
"https://lelectron-fou.bandcamp.com/",
"https://github.com/electron-rare"
]
}
</script>
<link rel="stylesheet" href="/styles.css" />
</head>
<body id="top">
<noscript>
<iframe
src="https://www.googletagmanager.com/ns.html?id=GTM-5SLM67QF"
height="0"
width="0"
style="display: none; visibility: hidden"></iframe>
</noscript>
<a class="skip-link" href="#main">Aller au contenu</a>
<header class="site-nav" data-nav>
<div class="shell nav-inner">
<a class="brand" href="#top" aria-label="Retour en haut">
<img src="/assets/brand/logo-mark.png" width="46" height="46" alt="Logo L'electron rare" />
<span class="brand-text">
<span class="brand-kicker">Studio</span>
<strong>L'electron rare</strong>
</span>
</a>
<nav aria-label="Navigation principale">
<ul class="nav-list">
<li><a class="site-navlink" href="#a-propos">Approche</a></li>
<li><a class="site-navlink" href="#projets">Projets</a></li>
<li><a class="site-navlink" href="#github-lab">GitHub</a></li>
<li><a class="site-navlink" href="/lab/">Lab interactif</a></li>
<li><a class="site-navlink" href="#contact">Contact</a></li>
</ul>
</nav>
</div>
</header>
<main id="main">
<section class="hero shell reveal" data-reveal>
<p class="eyebrow">Creative systems studio</p>
<h1>
Je construis des experiences <span>electroniques</span> qui connectent design, code et IA.
</h1>
<p class="hero-copy">
De l'idee au prototype live: direction produit, architecture technique et execution visuelle pour
lancements, installations et projets experimentaux.
</p>
<div class="hero-actions">
<a class="btn btn-primary" href="#projets" data-track="cta_hero_projets" data-destination="#projets">
Voir les projets
</a>
<a class="btn btn-secondary" href="#contact" data-track="cta_hero_contact" data-destination="#contact">
Demarrer une mission
</a>
<a
class="btn btn-ghost"
href="https://fr.linkedin.com/in/electron-rare"
target="_blank"
rel="noopener noreferrer"
data-track="cta_hero_profile"
data-destination="linkedin.com/in/electron-rare">
Voir le profil
</a>
</div>
<ul class="hero-metrics" aria-label="Signaux studio">
<li>
<strong>Systemes</strong>
<span>UX, hardware et logiciel alignes</span>
</li>
<li>
<strong>IA appliquee</strong>
<span>prototypage rapide et pipelines intelligents</span>
</li>
<li>
<strong>Production</strong>
<span>execution propre, mesurable, deployable</span>
</li>
</ul>
</section>
<section id="a-propos" class="panel shell reveal" data-reveal>
<div class="panel-head">
<p class="eyebrow">Approche</p>
<h2>Direction artistique + direction systeme</h2>
</div>
<p>
Mon role est de transformer une intention en systeme operationnel: narration visuelle, architecture,
instrumentation et decisions produit. J'interviens comme partenaire de conception et de livraison.
</p>
<div class="pill-row">
<span>Creative coding</span>
<span>Design produit</span>
<span>Systemes embarques</span>
<span>Automation IA</span>
<span>Tracking GA4/GTM</span>
</div>
</section>
<section id="projets" class="shell reveal" data-reveal>
<div class="section-head">
<p class="eyebrow">Top projets</p>
<h2>3 references GitHub prioritaires</h2>
</div>
<div class="projects-grid">
<article class="project-card">
<p class="project-tag">Real-time embedded stack</p>
<h3>RTC_BL_PHONE</h3>
<p>
Firmware ESP32 avec WebUI, audio, Bluetooth et orchestration multi-modules pour experiences de
communication temps reel.
</p>
<a
href="https://github.com/electron-rare/RTC_BL_PHONE"
target="_blank"
rel="noopener noreferrer"
data-track="outbound_github_project_rtc_bl_phone"
data-track-legacy="outbound_github_project"
data-destination="github.com/electron-rare/RTC_BL_PHONE">
Ouvrir le repo
</a>
</article>
<article class="project-card">
<p class="project-tag">Narrative UI and scene engine</p>
<h3>Le Mystere Professeur Zacus</h3>
<p>
Pipeline scenes/screens, effets visuels et logique d'interaction pour experiences immersives sur
hardware contraint.
</p>
<a
href="https://github.com/electron-rare/le-mystere-professeur-zacus"
target="_blank"
rel="noopener noreferrer"
data-track="outbound_github_project_zacus"
data-track-legacy="outbound_github_project"
data-destination="github.com/electron-rare/le-mystere-professeur-zacus">
Ouvrir le repo
</a>
</article>
<article class="project-card">
<p class="project-tag">Portfolio and conversion stack</p>
<h3>electron-rare.github.io</h3>
<p>
Site vitrine orienté conversion: message clair, preuves directes, instrumentation GA4 et gouvernance
DA continue.
</p>
<a
href="https://github.com/electron-rare/electron-rare.github.io"
target="_blank"
rel="noopener noreferrer"
data-track="outbound_github_project_site"
data-track-legacy="outbound_github_project"
data-destination="github.com/electron-rare/electron-rare.github.io">
Ouvrir le repo
</a>
</article>
</div>
</section>
<section id="github-lab" class="panel shell reveal" data-reveal>
<div class="panel-head">
<p class="eyebrow">GitHub Lab</p>
<h2>Section dediee aux references techniques</h2>
</div>
<p>
Ici je centralise les depots de travail, prototypes secondaires et experiments en cours, avec suivi des
iterations.
</p>
<a
class="btn btn-secondary"
href="https://github.com/electron-rare?tab=repositories"
target="_blank"
rel="noopener noreferrer"
data-track="outbound_github_lab_more"
data-track-legacy="outbound_github_contact"
data-destination="github.com/electron-rare?tab=repositories">
Voir plus sur GitHub
</a>
<a class="btn btn-ghost" href="/lab/" data-track="cta_lab_interactif_open" data-destination="/lab/">
Ouvrir le Lab interactif
</a>
</section>
<section id="contact" class="shell contact reveal" data-reveal>
<div class="section-head">
<p class="eyebrow">Contact</p>
<h2>Parlons lancement, prototype ou mission studio</h2>
</div>
<p>
Je prends des missions autour du design systeme, du prototypage produit et des experiences creatives
instrumentees.
</p>
<div class="contact-links">
<a
href="https://fr.linkedin.com/in/electron-rare"
target="_blank"
rel="noopener noreferrer"
data-track="outbound_linkedin_contact"
data-destination="linkedin.com/in/electron-rare">
LinkedIn
</a>
<a
href="https://www.malt.com/profile/clementsaillant"
target="_blank"
rel="noopener noreferrer"
data-track="outbound_malt_contact"
data-destination="malt.com/profile/clementsaillant">
Malt
</a>
<a
href="https://lelectron-fou.bandcamp.com/"
target="_blank"
rel="noopener noreferrer"
data-track="outbound_bandcamp_contact"
data-destination="lelectron-fou.bandcamp.com">
Bandcamp
</a>
<a
href="https://github.com/electron-rare"
target="_blank"
rel="noopener noreferrer"
data-track="outbound_github_contact"
data-destination="github.com/electron-rare">
GitHub
</a>
</div>
</section>
</main>
<footer class="site-footer">
<div class="shell footer-inner">
<p><strong>L'electron rare</strong> - design de systemes, creation electronique, code et IA.</p>
<p><span id="year"></span> Clement Saillant. Tous droits reserves.</p>
</div>
</footer>
<script src="/script.js" defer></script>
</body>
</html>
+1
View File
@@ -0,0 +1 @@
@import"https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&family=Prata&display=swap";:root{--lab-bg: #171a1e;--lab-surface: #222830;--lab-surface-soft: #2b3441;--lab-line: #3d4b5d;--lab-text: #f2f4f8;--lab-muted: #b8c4d3;--lab-accent: #f2a666;--lab-accent-2: #7bd5cf}*{box-sizing:border-box}html,body,#root{min-height:100%}body{margin:0;font-family:Manrope,Segoe UI,sans-serif;color:var(--lab-text);background:radial-gradient(1000px 500px at 15% -20%,rgba(242,166,102,.18),transparent 55%),radial-gradient(800px 460px at 100% 0%,rgba(123,213,207,.2),transparent 55%),var(--lab-bg)}.lab-shell{width:min(1080px,92vw);margin:0 auto}.lab-header{position:sticky;top:0;z-index:20;border-bottom:1px solid var(--lab-line);background:color-mix(in oklab,var(--lab-bg) 86%,black 14%);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.lab-header .lab-shell{min-height:74px;display:flex;align-items:center;justify-content:space-between;gap:1rem}.lab-brand{display:inline-flex;text-decoration:none;color:var(--lab-accent);font-weight:700}.lab-header ul{margin:0;padding:0;list-style:none;display:flex;gap:.5rem;flex-wrap:wrap}.lab-header a{min-height:2.2rem;display:inline-flex;align-items:center;text-decoration:none;color:var(--lab-text);border:1px solid transparent;border-radius:999px;padding:0 .85rem;font-size:.9rem;font-weight:600}.lab-header a.active,.lab-header a:hover,.lab-header a:focus-visible{border-color:var(--lab-line);background:color-mix(in oklab,var(--lab-surface-soft) 80%,var(--lab-accent-2) 20%)}main{padding-block:1.2rem 2.8rem}.lab-panel{border:1px solid var(--lab-line);border-radius:18px;background:linear-gradient(180deg,var(--lab-surface),color-mix(in oklab,var(--lab-surface) 70%,black 30%));box-shadow:0 16px 42px #00000047;padding:1rem}.lab-kicker{margin:0;text-transform:uppercase;letter-spacing:.14em;font-size:.72rem;color:var(--lab-accent-2);font-weight:700}h1,h2{font-family:Prata,Georgia,serif;margin:0;font-weight:400}h1{margin-top:.5rem;font-size:clamp(1.8rem,5vw,3rem)}.lab-panel>p{color:var(--lab-muted);margin:.9rem 0 0;max-width:70ch}.lab-grid{margin-top:1rem;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.6rem}.lab-grid article,.signal-grid article,.prototype-list li{border:1px solid var(--lab-line);border-radius:14px;background:color-mix(in oklab,var(--lab-surface-soft) 82%,black 18%);padding:.8rem}.signal-grid{margin-top:.9rem;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.6rem}.signal-grid strong{display:block;margin-top:.35rem;color:var(--lab-accent);font-size:1.35rem}.signal-grid p,.prototype-list p{margin:.4rem 0 0;color:var(--lab-muted)}.prototype-list{margin:1rem 0 0;padding:0;list-style:none;display:grid;gap:.58rem}.prototype-list li{display:flex;justify-content:space-between;gap:.8rem;align-items:flex-start}.prototype-list span{border:1px solid var(--lab-line);border-radius:999px;min-height:1.9rem;display:inline-flex;align-items:center;padding:0 .66rem;font-size:.72rem;text-transform:uppercase;letter-spacing:.06em;color:var(--lab-accent-2)}code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;background:#00000040;border:1px solid var(--lab-line);border-radius:6px;padding:.14rem .3rem}@media(max-width:900px){.signal-grid,.lab-grid{grid-template-columns:1fr}}@media(max-width:700px){.lab-header .lab-shell{min-height:auto;flex-direction:column;align-items:flex-start;padding-block:.7rem}.prototype-list li{flex-direction:column}}
File diff suppressed because one or more lines are too long
+16
View File
@@ -0,0 +1,16 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Lab interactif - L'electron rare</title>
<meta
name="description"
content="Lab interactif: prototypes React Router, parcours experimentaux et idees de dispositifs immersifs." />
<script type="module" crossorigin src="/lab/assets/index-Zjyw1-5g.js"></script>
<link rel="stylesheet" crossorigin href="/lab/assets/index-7Y0vZRJY.css">
</head>
<body>
<div id="root"></div>
</body>
</html>
+14
View File
@@ -0,0 +1,14 @@
[build]
command = "npm run build:external"
publish = "dist"
[build.environment]
NODE_VERSION = "22"
[[headers]]
for = "/*"
[headers.values]
X-Content-Type-Options = "nosniff"
X-Frame-Options = "DENY"
Referrer-Policy = "strict-origin-when-cross-origin"
Permissions-Policy = "geolocation=(), camera=(), microphone=()"
+7 -1
View File
@@ -6,11 +6,17 @@
"scripts": {
"dev": "astro dev",
"build": "astro build",
"build:external": "node scripts/build-astro-external.mjs",
"preview": "astro preview",
"astro": "astro",
"typecheck": "astro check",
"storybook": "storybook dev -p 6006",
"storybook:build": "storybook build"
"storybook:build": "storybook build",
"lab:dev": "npm --prefix apps/lab-interactif run dev",
"lab:build": "npm --prefix apps/lab-interactif run build",
"lab:preview": "npm --prefix apps/lab-interactif run preview",
"tracking:check": "node scripts/validate-tracking.mjs",
"preflight:pages": "npm run lab:build && npm run tracking:check && npm run storybook:build"
},
"dependencies": {
"@astrojs/react": "^4.4.1",
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 72" role="img" aria-label="Electron rare lockup placeholder">
<defs>
<linearGradient id="gg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#08f7ff"/>
<stop offset="100%" stop-color="#ff3adf"/>
</linearGradient>
</defs>
<rect x="2" y="2" width="316" height="68" rx="14" fill="#0a1220" stroke="#324667"/>
<rect x="12" y="12" width="48" height="48" rx="12" fill="#101c37" stroke="#31527d"/>
<path d="M24 26H40V32H30V36H39" fill="none" stroke="url(#gg)" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M43 26H49C54 26 56 28 56 32C56 36 54 38 49 38H43V26Z" fill="none" stroke="#8dff5a" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round"/>
<text x="72" y="33" fill="#f4f8ff" font-size="15" font-family="Source Sans 3, Segoe UI, sans-serif" font-weight="700" letter-spacing="1.8">ELECTRON RARE</text>
<text x="72" y="50" fill="#9fb3d3" font-size="10" font-family="Source Sans 3, Segoe UI, sans-serif" letter-spacing="1.6">UNSTABLE BY DESIGN</text>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1400 700" role="img" aria-label="Electron rare logo lockup"><image href="/assets/brand/logo-lockup.png" width="1400" height="700" preserveAspectRatio="xMidYMid meet"/></svg>

After

Width:  |  Height:  |  Size: 227 B

@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" role="img" aria-label="Electron rare mark placeholder">
<defs>
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#08f7ff"/>
<stop offset="100%" stop-color="#ff3adf"/>
</linearGradient>
</defs>
<rect x="6" y="6" width="84" height="84" rx="20" fill="#0a1220" stroke="#324667" stroke-width="2"/>
<path d="M24 30H56V40H34V48H54" fill="none" stroke="url(#g)" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M62 30H72C80 30 84 34 84 42C84 50 80 54 72 54H62V30Z" fill="none" stroke="#8dff5a" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="24" cy="30" r="3" fill="#08f7ff"/>
<circle cx="54" cy="48" r="3" fill="#ff3adf"/>
<circle cx="84" cy="42" r="3" fill="#8dff5a"/>
</svg>

After

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-label="Electron rare logo mark"><image href="/assets/brand/logo-mark.png" width="1024" height="1024" preserveAspectRatio="xMidYMid meet"/></svg>

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Some files were not shown because too many files have changed in this diff Show More