Commit Graph

123 Commits

Author SHA1 Message Date
Clément SAILLANT 8367393813 fix: post-audit CI and governance cleanup (#6)
* ci: enforce typecheck and add quality gates

Remove continue-on-error on the Typecheck step: astro check
currently reports 0 errors / 13 hints, so the step can block.

Also run tracking:check and image:budget after the build so these
quality gates actually fail CI when broken (they are defined in
package.json but were never wired into the workflow).

* chore: remove obsolete Tower deploy workflow

The 'Deploy to Tower' workflow built the Astro Node adapter and
scp'd it to Tower to run as a container on port 4321. Production
has been served by Cloudflare since PR #5, so this pipeline only
ever fails (Tower SSH secrets are stale and the target host is
not the live origin). Removing it eliminates noisy red runs.

* chore: monthly report tracks live required checks

The report hardcoded a probe for 'Cross-stack coherence', which
is no longer a required status check on main. Dump the live set
from required_status_checks.contexts[] and .checks[].context
instead, so the monthly report reflects whatever branch
protection is configured at that point rather than a stale name.
2026-05-18 22:23:44 +02:00
L'électron rare d0762a177e ci: make typecheck non-blocking
The new CI revealed 206 astro check errors on main, partly
surfaced by the Cloudflare adapter switch in PR #5 (the
process.env typing differs on Workers). Until the debt is
cleared, run typecheck for visibility but let the build
step gate the workflow.
2026-05-18 21:34:18 +02:00
L'électron rare 628009d468 chore: replace bogus e2e workflow with real CI
The previous ci-e2e.yml was a copy-paste from the mascarade
repo: it pointed at /home/clems/mascarade/web and required
a self-hosted runner that was offline, so the e2e check sat
queued 24h before GitHub auto-cancelled it as failed. This
site has no Playwright suite, so the check was meaningless.

Replace it with ci.yml: a minimal Node 22 job on
ubuntu-latest that runs typecheck and build for the Astro
app, with the existing ntfy failure notification hook.
2026-05-18 21:31:05 +02:00
cloudflare-workers-and-pages[bot] d1ac06b636 Add Cloudflare Workers configuration (#5)
Co-authored-by: cloudflare-workers-and-pages[bot] <73139402+cloudflare-workers-and-pages[bot]@users.noreply.github.com>
2026-05-18 21:30:31 +02:00
L'électron rare 429520d6c1 fix(3d): caption tiles below media plane
Plane was 1.9x1.425 — at media zoom Z=-0.5 it filled
the entire viewport, so any tile inside the card group
overlapped the image. Shrink plane to 1.2x0.9 (still
4:3) so it occupies ~60% viewport vertical, leaving
room below.

Move cas tile localOffset from (0, 0, -0.7) to (0, 0.5,
0): at full explode the mosfet rotation is [0, 0, pi]
which sends local +Y -> world -Y -> screen down. So
local Y +0.5 places tile clearly below plane bottom in
screen space.
2026-04-28 15:35:44 +02:00
L'électron rare ba3248e3f2 fix(3d): cas tiles below mosfet media
PCB_LABELS section 'cas' had localOffset z=-0.08 which
landed on top of (or overlapping with) the video/photo
plane at z=-0.1. Push to z=-0.7 so the tile reads as
"caption below the media" rather than "stuck onto it".
Also fix the Industrie sub-text STM32F030 -> STM32F070
to align with the consulting page case study.
2026-04-28 15:25:06 +02:00
L'électron rare e5ceb3c74d fix(3d): zoom in on mosfet media sections
Sections 7a-7d (media on mosfets #1-#4) had cam Z
distance -1.0 to -0.8 — too far, video and carousel
took only a small portion of viewport. Halve Z to
-0.6 to -0.5 and scale lateral X by ~0.6 to keep the
same angle. Each mosfet media now fills ~70% of view
instead of ~40%.
2026-04-28 15:19:30 +02:00
L'électron rare 072d792017 fix(3d): media planes in 4:3 with cover-fit crop
PcbVideoMesh and PcbCarouselMesh now render in 4:3
landscape (1.9 x 1.425) instead of portrait (1.9 x
4.275). Add applyCoverFit() helper that computes
texture.repeat and texture.offset to crop centered
when source aspect differs from target — equivalent
to CSS object-fit: cover. Hooked on loadedmetadata
for videos and on TextureLoader callback for photos.
2026-04-28 15:14:57 +02:00
L'électron rare 8bc027d9b4 fix(3d): sharper PCB tiles + smoother camera
PcbTile: render at 2x source resolution then halve
distanceFactor — same visual size but 4x more pixels,
no more subpixel scale blur. Drop backdropFilter blur(4)
which amplified perceived softness. Add translate3d to
force GPU compositing for crisp text edges.

Canvas dpr cap from 1.5 to 2.0 — full Retina rendering
on M1/M2/M3/M5 displays.

Camera inertia factor delta*2 -> delta*1: explode and
section transitions take ~1.4s instead of ~0.7s, with
the existing smoothstep on f keeping the eased curve.
2026-04-28 15:11:28 +02:00
L'électron rare a6316748b3 copy: harmonise to "plus de 10 ans"
Index SEO and Consulting About both said "10 ans
d'expérience" — switch to "plus de 10 ans" so the copy
ages well and matches what is stated externally on
LinkedIn / cached profiles.
2026-04-28 10:47:53 +02:00
L'électron rare c67d2a4045 fix(consulting): F070, auto_boot, expert
KXKM V3.2 case study said STM32F030 but the actual
migration target was STM32F070. Add the auto_boot
implementation and production dossier delivery as
they were part of what was shipped.

Replace "Cyborg en systèmes électroniques" with
"Expert en systèmes électroniques" — more aligned
with the audience and the consulting positioning.
2026-04-28 10:45:04 +02:00
L'électron rare 72203909e6 fix(css): unblock canvas + fmt cards click events
scroll-track was full-height (1000vh) at z-index 1
above the canvas (z:0) without pointer-events:none, so
elementFromPoint(anywhere) returned scroll-track and
the canvas never saw any click. Add pointer-events:none
to scroll-track so the canvas underneath receives them.

.fmt cards inherited pointer-events:none from parent
.ov class (pattern for non-clickable text overlays).
Add explicit pointer-events:auto on .fmt like .dot and
.hdr-link already do for clickable overlay elements.

Confirmed via Playwright elementFromPoint at the BMU
center and on a Conception card — both returned
scroll-track instead of expected canvas/<a class="fmt">.
2026-04-28 10:33:15 +02:00
L'électron rare 2e4b0ee04d fix(3d): enable pointer-events on Canvas for click
Previous pointerEvents=none on both the Canvas wrapper
and the Canvas itself blocked all React Three Fiber
event routing, so onClick handlers on the BMU/I2C/MOSFET
meshes never fired. Switch to pointerEvents=auto and
keep page scroll working via touchAction=pan-y on the
canvas (R3F doesn't consume wheel events without
OrbitControls, so scroll passes through naturally).
2026-04-28 10:28:09 +02:00
L'électron rare 7787bed2e9 refactor: contact form delegates to mail-api
Replace nodemailer SMTP with HTTP fetch to mail-api
container (http://mail-api:3200/api/mail/send) which
already holds the Brevo SMTP creds. Single source of
truth for mail credentials, no duplication across
electron-rare-site and mail-api.

Drop nodemailer + @types/nodemailer from deps. Restore
npm ci in Dockerfile since the lock no longer drifts.

Override defaults via env: MAIL_API_URL, MAIL_FROM,
MAIL_TO. mail-api intra-Docker network reachable
because both services are on the traefik network.
2026-04-28 10:02:07 +02:00
L'électron rare 225bd1d457 feat: contact form via SMTP + 3D click links
Replace Frappe/Dolibarr API with direct SMTP send via
nodemailer. Form posts to local /api/submit-lead, no
external proxy on api.lelectronrare.fr (which was down
since Frappe was retired ~13 days ago).

Add onClick handler on BMU/I2C/MOSFET 3D meshes that
redirects to /contact/. Cursor pointer on hover for
affordance.

Switch Dockerfile from npm ci to npm install --no-audit
since package-lock will regen with nodemailer added.

Container env vars to configure:
  SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS
  MAIL_FROM (defaults to SMTP_USER)
  MAIL_TO (defaults to contact@lelectronrare.fr)
2026-04-28 09:39:40 +02:00
L'électron rare 97fea66947 feat(home): cards link to dedicated pages
Wrap Conception/Formation/Consulting cards in <a> tags
pointing to /conception/, /formation/, /consulting/.
Add hover affordance: translateY(-2px), background and
border-color shift. Applied to both index.astro and
preview.astro variants for visual consistency.
2026-04-28 09:21:03 +02:00
L'électron rare 913df2aee8 wip: rescue source from photon
14 files (6 modified + 8 new) recovered from
photon /home/electron/electron-rare.github.io
during decom forensics.

New:
- src/components/BmuViewer.tsx (3D viewer)
- public/assets/models3d/{bmu_v2,bmu-assembly,
  i2c_repeater,mosfet_switch}.glb
- src/pages/{conception,consulting,contact,
  index-classic}.astro
- infra/Dockerfile.prebuild
- CLAUDE.md

Modified:
- public/sitemap.xml
- src/layouts/BaseLayout.astro
- src/pages/{formation,index,preview}.astro
- src/pages/sitemap.xml.ts (+5/-)

Snapshot mtime 2026-04-02 (photon last edits).
Recovery 2026-04-28 02:30 CEST.
2026-04-28 08:37:59 +02:00
Clément SAILLANT e49fdea8f0 refactor: clean slate — remove all WebGL, keep static + loading screen
REMOVED:
- AtomGlitch.tsx (countdown 3D atom)
- WebGLBackground.tsx (PCB 3D scene)
- WebGLCards.tsx (scroll animations)
- webgl-cards.css
- All GLB models (models3d/)
- Orbitron + Space Mono fonts

KEPT:
- static.astro (accessible version, no JS)
- Loading screen with BMU photo on preview
- Dark site CSS tokens in global.css
- bmu-assembly.jpg photo

SIMPLIFIED:
- index.astro: countdown without WebGL (placeholder div ready)
- preview.astro: loading screen + sections, WebGL placeholder ready
- Both pages have empty #webgl-* divs for new WebGL implementation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 18:04:19 +00:00
Clément SAILLANT adb756272b feat: accessible static version without 3D — SOTA 2026 a11y
- /static route — full site without WebGL/Three.js
- Skip-to-content link
- Semantic HTML5: header, main, footer, nav, section with aria-labels
- WCAG 2.2: focus-visible outlines (3px #0071e3), high contrast
- forced-colors media query support
- prefers-reduced-motion: all animations disabled
- Print stylesheet
- Light theme (white bg, high contrast text)
- Sticky header with nav links
- Photo grid (responsive CSS grid, no carousel)
- Link to "Version 3D" for users who want it
- No JavaScript dependencies

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 17:32:37 +00:00
Clément SAILLANT b01b8dc5cb feat: KiCad board + STEP components combined (248 meshes, 2.7MB, with PCB traces) 2026-03-30 17:27:50 +00:00
Clément SAILLANT 4d7a2580af feat: colored PCB assembly — STEP materials preserved (11 colors)
- Scene GLB export preserves per-geometry materials from STEP files
- 158 sub-meshes with individual colors:
  - Green PCB substrate (20,51,36)
  - Orange copper traces (226,138,7)
  - Silver pads/solder (165,163,146)
  - Black IC bodies (5,5,5)
  - Yellow silkscreen (198,196,160)
- 397K vertices, 334K faces, 2.5MB (was 8.4MB gray)
- Board thickness visible (12.1mm Z-depth)
- BMU board + 4x switch MOSFET properly assembled

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 17:00:55 +00:00
Clément SAILLANT 5959141642 fix: camera/lights/fog in meters (STEP units), BMU board included in assembly 2026-03-30 16:49:20 +00:00
Clément SAILLANT 34968c32e7 fix: camera targeting board center + cleanup orphans + label positions
Camera audit fixes:
- Board bounds: X[-74,81] Y[-43,63] Z[-17,150] mm
- After -π/2 rotation, scene center ≈ (4, 66, -10)
- All camera stops now look at board center
- Overview: Y=250 (sees full 155mm assembly height)
- Close-ups: Y=80-140 (proper zoom on zones)
- Fog: 150-500mm range

Cleanup:
- Removed SwitchBoard() dead code
- Deleted orphan GLBs: bmu-v2-full.glb (1.6MB), pcb-bmu-v2.glb (269KB), bmu-switch-mosfet.glb (370KB)
- Saved 2.2MB from production bundle

Label positions:
- All SectionLabels repositioned to match board zones in scene coords
- MCU/ANALOG at Y=90 (top), POWER/FORMATION at Y=30 (bottom)
- MISSIONS at Y=110, CONTACT at center (4, 66, -10)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 16:32:02 +00:00
Clément SAILLANT bd788182d3 fix: camera distances in mm units (200mm overview, 80mm close) 2026-03-30 16:11:47 +00:00
Clément SAILLANT 0e820aef48 fix: scale=1 with camera/lights/fog adjusted for mm units
- PCB scale: 1 (native mm from FreeCAD)
- Camera stops: all positions scaled to mm (0.15m overview, 0.06m close-ups)
- Fog: 0.1-0.4 range (was 12-40)
- Lights: positions scaled to mm, distance 0.15-0.2
- Mouse parallax: 0.015 (was 1.5)
- CameraLight follow offset: 0.01 (was 1)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 15:43:43 +00:00
Clément SAILLANT 78d5602ca6 fix: PCB scale 0.15→15 + remove Hero import + static version button on loading
- PCB assembly scale fixed (was 0.15, now 15 — model in mm units)
- Hero component import removed from preview.astro
- Loading screen: added "Version sans 3D →" button linking to /static/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 13:44:55 +00:00
Clément SAILLANT 9d526e9d88 feat: complete BMU assembly — board + 4x switch MOSFET + components
- BMU v2 board (from STEP, 225K verts)
- 4x switch MOSFET boards (from STEP, offset positions)
- 76 SMD components (Part::Feature from FCStd)
- Properly simplified with fast_simplification (560K faces, 8.4MB)
- No mesh corruption (proper topology-preserving decimation)
- Loading screen forced to 10s minimum

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 12:55:48 +00:00
Clément SAILLANT fdedaf77bb fix: countdown cartouche footer + mouse capture zone fix
Countdown page:
- Cartouche footer bottom-right: titre, copyright, contact LinkedIn/email
- Glassmorphism (blur 12px, dark 50%)
- Mobile: becomes full-width centered
- Links are pointer-events: auto (clickable through overlay)

Mouse capture fix:
- .webgl-bg now has pointer-events: auto (was missing)
- .overlay children are pointer-events: none (was auto — was blocking mouse events)
- Only links and tagline area are interactive
- Three.js canvas receives mouse events across entire viewport

PCB silkscreen labels still present on preview (SectionLabel with scrollTarget)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 12:21:59 +00:00
Clément SAILLANT a053bdbceb feat: loading screen with BMU photo while WebGL loads
- Full-screen loading overlay with BMU.jpeg from KXKM repo
- Title "L'electron rare" with cyan accent
- Animated progress bar (gradient cyan → amber)
- Rotating status messages (electronics-themed)
- Floating animation on BMU photo
- Auto-detects when WebGL canvas renders, then fades out (1s)
- Falls back gracefully if WebGL never loads

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 12:08:09 +00:00
Clément SAILLANT b5ed4ec309 fix: full assembly (380 objects, 4 MOSFET boards + BMU + I2C) + remove silkscreen labels
- Assembly now exports ALL 380 meshable objects (was 76)
- Includes: 4x switch MOSFET boards, BMU v2, I2C repeater, all SMD components
- Subsampled to 267K faces / 5.7MB GLB for web performance
- Removed BoardTitle silkscreen text overlay (was white labels on board)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 11:57:01 +00:00
Clément SAILLANT 05a9a220d8 feat: complete FreeCAD BMU assembly (76 real components, 4.6MB GLB)
- Exported from BMU.FCStd via amrit3701/freecad-cli Docker container
- 686 objects in FCStd, 76 Part::Feature exported (real geometry only)
- Full assembly: BMU v2 board + switch MOSFET + I2C repeater + all SMD components
- Components: D2PAK MOSFETs, SOT-23, R_0603, capacitors, connectors, inductors
- Replaces separate bmu-v2-full.glb + bmu-switch-mosfet.glb
- SwitchBoard component removed (included in assembly)
- Hero HTML removed — PCB 3D is the full-page hero

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 11:35:50 +00:00
Clément SAILLANT be20ae4400 feat: Hero removed — PCB silkscreen labels ARE the navigation
- Hero HTML deleted — the 3D PCB board IS the hero
- First viewport = 100vh spacer showing full board overview
- SectionLabel now clickable:
  MCU → #a-propos (Approche)
  ANALOG → #cas-concrets
  POWER → #photos
  FORMATION → /formation/
  MISSIONS → #graphic-sprints-title
  CONTACT → opens 3D popup
- Hover: label glows white, grows, ring appears
- Click: smooth scroll to target section
- Cursor changes to pointer on hover
- Labels visible directly on the PCB 3D as silkscreen text

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 11:13:23 +00:00
Clément SAILLANT 00b94c3cfa feat: Hero becomes BMU overview with clickable component zones
- Hero replaced by PCB-style navigation with 5 zones:
  MCU (Approche), ANALOG (Cas concrets), MISSIONS (Sprints),
  FORMATION (link), CONTACT (popup)
- Each zone: glassmorphism card with icon, Orbitron label, description
- Color-coded: cyan MCU, amber ANALOG, green MISSIONS, orange FORMATION, red CONTACT
- Gradient glow border on hover
- Smooth scroll to target sections
- Contact opens 3D popup
- Mobile: zones stack vertically
- Title: "L'electron rare" with cyan accent
- Subtitle: "Systemes electroniques specifiques, du besoin au livrable fiable"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 10:59:02 +00:00
Clément SAILLANT 4b5de5df8f fix: brighter PCB lighting + camera-follow light
- Ambient light 0.1 → 0.25
- Directional lights doubled (0.4→0.7, 0.15→0.3)
- Point light 0.2 → 0.4
- CameraLight: PointLight that follows camera position (intensity 0.6)
- Fog pushed back (8,30 → 12,40) for better PCB visibility

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 10:47:16 +00:00
Clément SAILLANT 6b914f088e fix: add 60vh PCB spacers between sections for board visibility
- 6x pcb-spacer (60vh transparent) between each content section
- Allows the PCB 3D model to be visible during scroll transitions
- Camera zooms on components during spacer gaps

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 10:25:15 +00:00
Clément SAILLANT 0f3990ca3d feat: ER logo PNG orbiting nucleus — 3 copies on elliptical paths
- LogoOrbit uses logo-mark.png as texture on 3D plane (not text)
- 3 copies at different tilts/speeds/colors (cyan, amber, green)
- Radii 1.0-1.3 (very close to nucleus)
- Billboard rendering (always faces camera)
- Glow sphere behind each logo
- Emissive tint matches orbit color

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 08:50:18 +00:00
Clément SAILLANT 1f960a1bb1 feat: real FreeCAD BMU v2 3D model + Orbitron font + ER nucleus logo
PCB 3D Models:
- bmu-v2-full.glb (1.6MB) — complete BMU v2 from FreeCAD with all components
- bmu-switch-mosfet.glb (369KB) — switch MOSFET daughter board
- Source: KXKM_Batterie_Parallelator branch object-orriented
- Converted via cascadio/trimesh from STEP

Fonts:
- Orbitron Bold (17KB) — geometric futuristic font for 3D text
- Space Mono Bold (80KB) — tech monospace
- Applied to all WebGL text (section labels, silkscreen, countdown)

Countdown (AtomGlitch):
- 3x "ER" logo at nucleus center, each on different rotation axis
- Cyan, amber, green glow variants
- Orbitron font for all orbital text

WebGL Background:
- RealPCB now uses bmu-v2-full.glb (real FreeCAD model)
- SwitchBoard added as secondary board
- Orbitron font for section labels

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 08:31:52 +00:00
Clément SAILLANT 4f9f464dab feat: real PCB refonte + tighter countdown text orbits
WebGL Background v2:
- Real KXKM BMU v2 PCB (GLB) as central 3D object
- 6 component zones with real KiCad GLB models:
  MCU (QFP32+SOIC8), ANALOG (SOIC8s), POWER (QFP32+caps+inductor),
  COM (SOIC8s), MISSIONS (QFP32), CONTACT
- ~70 real components (resistors, caps, inductors, LEDs, ICs)
- 25 extra scattered passives for realism
- Camera orbits PCB, zooms into each zone on scroll (8 stops)
- Current flow: 80 cyan + 40 amber particles circling the board
- Section labels as silkscreen text
- Board title: "L'ELECTRON RARE REV 2026.1"

Countdown (AtomGlitch):
- Text orbits tightened (radius 3.8→2.0, 3.5→1.8, etc.)
- Countdown ring radius 4.2→2.5
- Decorative ring 5.8→3.5
- All text closer to nucleus for denser, more energetic feel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 08:07:24 +00:00
Clément SAILLANT a7fd9dbac2 feat: integrate real KiCad GLB models into WebGL PCB scene
- ICComponent: uses qfp32.glb (large) or soic8.glb (small) with fallback to procedural
- Capacitor: uses capacitor_0805.glb with scroll-reactive glow
- Resistor: uses resistor_0603.glb
- LED: uses led_0603.glb + dynamic PointLight for glow effect
- All models preloaded via useGLTF.preload()
- Fallback to procedural geometry if GLB fails to load
- Models from KiCad 10.0 official 3D library (STEP → GLB via cascadio)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 07:54:26 +00:00
Clément SAILLANT 0a0a6fdfa9 feat: real KiCad 3D component models (GLB) for WebGL PCB
7 GLB models converted from KiCad official STEP library via cascadio/trimesh:
- resistor_0603.glb (8KB) — SMD 0603 resistor
- capacitor_0805.glb (11KB) — SMD 0805 capacitor
- inductor_0805.glb (11KB) — SMD 0805 inductor
- led_0603.glb (11KB) — SMD 0603 LED
- soic8.glb (33KB) — SOIC-8 IC package
- qfp32.glb (118KB) — LQFP-32 IC package
- pcb-bmu-v2.glb (275KB) — KXKM BMU v2 PCB with copper traces

Source: KiCad 10.0 official 3D library (/usr/share/kicad/3dmodels/)
Conversion: cascadio (OpenCASCADE) + trimesh → GLB on KXKM-AI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 07:44:27 +00:00
Clément SAILLANT 177458fd07 feat: 50+ transition components — STM32, FPGA, ARM NPU, DSP, selfs
Transition components between each section:
- HERO→ABOUT: STM32F030 (Cortex-M0) + 8 passives + LEDs
- ABOUT→CASES: 74HC595 shift register + 2 selfs (inductors) + passives
- CASES→MEDIA: XC7A35T FPGA Artix-7 + DONE/INIT LEDs + passives
- MEDIA→SPRINTS: STM32N6 ARM Neural Unit + self + decoupling
- SPRINTS→CONTACT: TMS320F DSP C2000 + PWM/ADC LEDs + self

All with silkscreen ref designators and component values.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 07:18:54 +00:00
Clément SAILLANT e3b202cde6 fix: dimmer hero background (10% opacity) + transition components between sections
- Hero panel image opacity 0.3 → 0.1 (much more subtle)
- Added ~20 transition components between each section:
  - HERO→ABOUT: caps, resistors, LED
  - ABOUT→CASES: 74HC595 shift register + passives
  - CASES→MEDIA: resistors, cap, LED
  - MEDIA→SPRINTS: AMS1117 regulator + decoupling caps
  - SPRINTS→CONTACT: caps, resistors, LED
- At least 2 components visible between each section stop

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 07:08:18 +00:00
Clément SAILLANT c4cfd63eb6 feat: space out PCB journey — 2.4x wider component spacing
- Board expanded from 38 to 90 units depth
- All component positions, vias, branches, labels rescaled
- Zoom stops recalibrated for wider travel
- Substrate expanded (35x110)
- More breathing room between sections
- Camera Z range updated to match

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-30 06:52:44 +00:00
Clément SAILLANT 582fee2e44 feat: silkscreen labels + zoom camera stops on PCB components
- Silkscreen text on all components (ref designators, values, section labels)
- SectionLabel component: glows when camera approaches (scroll proximity)
- Camera zoom stops: 8 waypoints, smooth interpolation between components
- FOV transitions (50→40→42 etc.) for cinematic zoom effect
- smoothstep easing between stops
- Mouse parallax on camera position and lookAt
- Board markings: "L'ELECTRON RARE REV 2026.1", "Made in France"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 23:50:35 +00:00
Clément SAILLANT 16341a9889 feat: PCB journey — 3D components + trace current + contact popup
WebGL Background:
- Camera follows copper trace path (CatmullRom curve) on scroll
- Green PCB substrate with solder mask grid
- Main copper trace tube + 10 secondary branch traces
- 15 vias (metallic rings with holes)
- Current flow: 60 cyan + 30 amber particles along traces
- 200 ambient dust particles

3D Electronic Components:
- IC/MCU (ESP32, LM358, IRFZ44, LM7805) with pins + silkscreen
- Capacitors (cylinders, electrolytic + ceramic)
- Resistors (SMD rectangles with solder pads)
- LEDs (glowing domes, intensity = scroll proximity)
- USB-C connector

Section mapping on PCB:
- Hero = ESP32 MCU area
- About = Op-amp + passives
- Cases = Power MOSFET stage
- Media = USB connector
- Sprints = Voltage regulator
- Contact = Energy storage capacitors

Contact 3D popup:
- Hidden by default, opens on #contact click or scroll >95%
- 3D perspective entry (rotateY -15deg → 0)
- Glassmorphism backdrop blur
- Close via backdrop click, X button, or Escape

CSS:
- Orbital card entry animations (left/right alternating)
- Atomic carousel with electron dot hover
- Dark tech design tokens

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 23:36:13 +00:00
Clément SAILLANT 96f4ca0f4e feat: 3D scroll tilt cards + atomic carousel for photos/videos
- Cards: perspective 3D enter animation (rotateX/Y from blur)
- Scroll tilt: cards subtly rotate based on viewport position
- Atomic carousel: orbital scroll container with electron dot animation on hover
- Navigation arrows with glow + orbital track indicator
- Video hover autoplay in carousel items
- Lightbox: click any photo/video for full-view with energy rings
- Carousel items: 3D perspective rotateY(-3deg) on hover + glow border

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 22:55:44 +00:00
Clément SAILLANT dab02bdfb8 feat: full dark tech WebGL refonte — atomic scroll cards + media lightbox
- WebGLBackground: fixed subtle atom + particles (dimmed, camera z=14)
- WebGLCards: scroll-triggered tile materialize with particle burst
- MediaLightbox: click photos/videos for full-view with orbital energy rings
- Dark design tokens in global.css (.dark-site variant)
- Glassmorphism cards, glow borders, staggered reveals
- Photo/video hover glow effects
- Each section wrapped in webgl-section for atomic reveal
- Each content block in webgl-card with per-section accent color
- Respects prefers-reduced-motion

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 22:36:08 +00:00
Clément SAILLANT 9b0cdd4dea feat: add WebGL atom background to preview Hero section
- AtomGlitch component integrated as Hero background (25% opacity)
- Respects prefers-reduced-motion
- Preview page now matches post-launch index.astro layout

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 21:58:04 +00:00
Clément SAILLANT acab730922 feat(seo): SOTA 2026 AI-ready SEO overhaul
- Schema.org: FAQPage, OfferCatalog, Occupation, EducationalOccupationalCredential, SearchAction, ContactPoint
- E-E-A-T signals: author, credentials (BTS SN), memberOf (KXKM), hasOccupation, priceRange
- AI crawling: llms.txt (llmstxt.org standard), robots.txt with GPTBot/Claude-Web/PerplexityBot/Google-Extended
- Meta: ai-content-declaration=human-created, generator-assisted, speakable, keywords, geo.region
- Auto date-switch: countdown (before May 1) / full site (after May 1) with Hero WebGL background
- Theme color updated to brand cyan #5bd1d8

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 21:49:04 +00:00
Clément SAILLANT d5f1ce84b4 feat: WebGL cinematic countdown — 3D atom with circular orbital text
- Three.js + React Three Fiber + postprocessing (bloom, chromatic aberration, glitch, scanlines)
- Nucleus with pulsing energy core, wireframe icosahedron shell
- 3 electron orbits with trail particles + energy arcs
- 600 particle cloud with organic movement
- Circular orbital text: title, countdown timer, subtitle curved on 3D rings
- Mouse interactions: camera parallax, atom speed boost, nucleus glow on proximity
- Camera smooth lerp follow with gentle auto-drift
- Font fix: woff2 → ttf for troika-three-text compatibility
- Logo: static mark instead of missing sprite frames

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 17:32:38 +00:00