feat: enable GH Pages stable plus deploy externe Vercel/Netlify
@@ -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
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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' }
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 12 KiB |
@@ -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>
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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 d’exé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 l’artboard:
|
||||
- `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 d’artboards + 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 d’accessibilité 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
|
||||
|
After Width: | Height: | Size: 436 KiB |
|
After Width: | Height: | Size: 745 KiB |
|
After Width: | Height: | Size: 211 KiB |
|
After Width: | Height: | Size: 520 KiB |
|
After Width: | Height: | Size: 433 KiB |
|
After Width: | Height: | Size: 492 KiB |
|
After Width: | Height: | Size: 249 KiB |
|
After Width: | Height: | Size: 387 KiB |
|
After Width: | Height: | Size: 603 KiB |
|
After Width: | Height: | Size: 642 KiB |
|
After Width: | Height: | Size: 433 KiB |
|
After Width: | Height: | Size: 552 KiB |
|
After Width: | Height: | Size: 601 KiB |
|
After Width: | Height: | Size: 649 KiB |
|
After Width: | Height: | Size: 401 KiB |
|
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
|
||||
|
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
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`.
|
||||
@@ -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 |
|
After Width: | Height: | Size: 282 KiB |
@@ -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 |
|
After Width: | Height: | Size: 238 KiB |
@@ -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 |
|
After Width: | Height: | Size: 79 KiB |
@@ -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()]
|
||||
|
||||
@@ -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`
|
||||
|
||||
@@ -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 d’implementation 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.
|
||||
@@ -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 l’artefact 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 d’attention 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)
|
||||
@@ -0,0 +1,91 @@
|
||||
# Plan d’exé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 d’exé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 d’assets SEO (robots/sitemap/OG/favicons) est prêt pour l’hô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 d’URL 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 d’acceptation
|
||||
- 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.
|
||||
@@ -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.
|
||||
|
||||
## Dé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 d’environnement:
|
||||
- `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`
|
||||
|
||||
@@ -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`.
|
||||
@@ -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
|
||||
@@ -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`.
|
||||
@@ -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`
|
||||
@@ -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
|
||||
|
||||
@@ -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 d’interaction (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.
|
||||
@@ -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."
|
||||
]
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 520 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 36 KiB |
@@ -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 |
@@ -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>
|
||||
@@ -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}}
|
||||
@@ -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>
|
||||
@@ -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=()"
|
||||
@@ -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",
|
||||
|
||||
|
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 |
|
After Width: | Height: | Size: 282 KiB |
@@ -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 |
|
After Width: | Height: | Size: 238 KiB |
@@ -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 |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 79 KiB |
|
After Width: | Height: | Size: 520 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 36 KiB |