Commit Graph

132 Commits

Author SHA1 Message Date
MVA Global Fret
baa71149b2 Contact: center the price reminder block below the 2-column grid
Avant : le bloc 'Rappel tarifaire' était collé en bas de la colonne droite,
créant un déséquilibre visuel avec le formulaire plus court à gauche.

Maintenant : sorti de la grille, centré avec max-width 720px sous les
deux colonnes, en grille 2 colonnes sur ses items pour une lecture
plus dense et équilibrée.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 21:57:39 +02:00
MVA Global Fret
a8bf913e68 Service Commande: clean up step cards (remove tiny icons, add proper grid)
- Retirer les icônes <i> minuscules à côté de chaque étape
- Ajouter le style CSS .steps-grid (grille 3 colonnes desktop, stack mobile)
- Ajouter le style .step-card (carte blanche, ombre, hover lift)
- Badge numéroté agrandi (64px) avec drop-shadow doré
- Ligne dorée discrète qui relie les 3 étapes en desktop

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 21:54:57 +02:00
MVA Global Fret
12a21852e3 Add Actions-based Pages deploy workflow
Le mode legacy était bloqué en errored. On passe au build via Actions
(actions/deploy-pages@v4) — plus fiable et debug-able.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 17:05:13 +02:00
MVA Global Fret
df6e03c0dc chore: re-trigger build now that verified-commits is disabled 2026-05-05 16:43:52 +02:00
MVA Global Fret
d22bb03d9c chore: trigger Pages redeploy for tiered delivery pricing 2026-05-05 16:25:23 +02:00
MVA Global Fret
94b168850b Tier home-delivery pricing in Antananarivo by parcel weight
Antananarivo home delivery is no longer a flat 6,000 Ar:
- 6,000 Ar  ≤ 5 kg
- 10,000 Ar ≤ 10 kg
- 20,000 Ar ≤ 20 kg
- > 20 kg: contact us

tarifs.html: replace the single price line with a 3-row tiered list
inside the Antananarivo card, keep the headline "À partir de 6 000 Ar"
on top, and turn the green "home delivery available" note into an
amber "over 20 kg: contact us" info banner.

translations.js: add delivery1Tier1/2/3 keys for FR/EN/MG, refresh
delivery1Title (now mentions "à domicile"), delivery1Price (now "À
partir de…"), delivery1Desc, delivery1Note. Province card unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 16:02:31 +02:00
MVA Global Fret
d79628ace3 Revert "Tarifs: grille de livraison Antananarivo par palier de poids"
This reverts commit aec3cdd0b8.
2026-05-05 15:41:49 +02:00
MVA Global Fret
f67fa16e09 chore: trigger Pages redeploy 2026-05-05 15:33:21 +02:00
MVA Global Fret
aec3cdd0b8 Tarifs: grille de livraison Antananarivo par palier de poids
Remplace le prix unique de 6 000 Ar par 3 paliers (5/10/20 kg) plus
une ligne « Nous contacter » pour les colis plus lourds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 15:21:37 +02:00
MVA Global Fret
1c44730d08 Mobile: faster cruise — 16 s → 10 s per traversal
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 14:48:46 +02:00
MVA Global Fret
80957e804b Mobile: bump autonomous plane speed from 28 s → 16 s per traversal
Mobile screens are smaller and users glance at them for less time,
so the 28-second full-traversal on desktop felt sluggish there.
BASE_SPEED is now 1/16 on mobile vs 1/28 on desktop. The touch
boost (×6) still stacks on top, giving a sub-3-second sprint when
the user holds a finger down.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 14:46:23 +02:00
MVA Global Fret
fd0acea058 Mobile: lighter render path + touch-to-accelerate the plane
Detects mobile via UA + 768 px media query (IS_MOBILE constant) and
flips three knobs:

- Renderer: antialias off, pixelRatio capped at 1.5 (vs 2 on desktop)
- Parcels: spawn every 2.4 s (vs 1.4 s on desktop) to keep clone+
  draw cost down

Adds touch handlers so users without a mouse can speed the plane up:

- touchstart bumps `touchBoost` from 1 to 6 → BASE_SPEED is multiplied
  by 6 each tick while a finger is on the screen
- touchmove also feeds Math.hypot(dx, dy) * MOUSE_BOOST into
  targetProgress, so swiping advances the plane the same way mouse
  motion does on desktop
- touchend / touchcancel reset touchBoost to 1 and clear last-touch
  coordinates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 14:41:34 +02:00
MVA Global Fret
0b2fe83963 Expose translations on window so the inline lang switcher can find it
translations.js declared the dict as `const translations = {...}`,
which scopes it to the script but does NOT attach it to window. The
inline applyLang() in index.html reads `window.translations?.[l]` and
was always getting undefined → early-return → no DOM updates → the
button text stayed in French regardless of the lang switcher.

One-line fix: append `window.translations = translations;` so
classic-script inline code can pick it up. All page-level i18n keys
(intro.ctaBtn included) start translating again.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 14:18:14 +02:00
MVA Global Fret
c4328da11d Slow the CTA emerge tween — 1.2 s → 2.2 s, opacity 0.5 s → 0.9 s
User wanted a more deliberate descent. Bumps the transform transition
from 1.2 s to 2.2 s and the opacity transition from 0.5 s to 0.9 s.
Easing kept (slight overshoot spring). Halo delay (1 s) unchanged so
it kicks in mid-emerge while the button is still settling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 14:11:28 +02:00
MVA Global Fret
22c57e5b41 CTA emerges from the plane when it reaches center
Hide the gold pill button at page load (opacity 0, scale 0.05,
translated 27 vh up — roughly where the plane is when it crosses
the viewport center). When the plane's progress reaches 0.5, the
tick loop adds a `.revealed` class to .cta-btn; CSS variables flip
and a 1.2 s spring transition lands the button at viewport center
at full size.

Pulse halo (::after) is dormant until the .revealed class lands,
so it doesn't waste cycles on a hidden element. Hover scale (1.04)
re-introduced on `.cta-btn.revealed:hover` with the original 0.32 s
transition so it doesn't fight the slow emerge tween.

Plane and parcel logic untouched.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 14:07:48 +02:00
MVA Global Fret
4b622a7d85 Drop parcel spawn point lower under the fuselage
Parcels were appearing right at the plane's center line, looking like
they came out of a window. Move the spawn offset from y-0.4 to y-1.1
so they emerge from below the belly of the airliner, where a real
cargo bay would be.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 13:57:28 +02:00
MVA Global Fret
cf7f84f354 Drop cargo back below the harness, just touching the parachute base
Previous +0.55·height pushed the cargo up into the canopy itself —
user's annotation showed the cargo belongs immediately under the
strings' end, not inside the parachute. With the wrapper fix from
the previous commit, parachuteBottom now correctly points at the
harness end, so cargo center = parachuteBottom - cargoH/2 + 0.06
puts the cargo's top right at the harness with a tiny overlap.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 13:50:55 +02:00
MVA Global Fret
71d2f06920 Move cargo up into the canopy base, not below the strings
User's annotation showed the cargo belongs right at the canopy's
base — where the strings converge — not at the very bottom of the
strings. New position: parachuteBottom + 0.55·parachuteHeight,
i.e. about 55% up the parachute's vertical extent. Cargo also
shrunk to 0.36×0.30×0.36 to better match the small rectangle the
user drew.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 13:46:38 +02:00
MVA Global Fret
25ea448abe Make cargo a child of the parachute, drop the rogue strap meshes
The black rectangles the user circled in the screenshot were the
strap meshes (strapH/strapV, 0.04-thick black boxes) — they were
meant to wrap the cardboard box but ended up rendering as detached
rectangles in some viewing angles. They're gone.

Cargo positioning is now computed from the actual scaled parachute
bbox: parachuteBottom = -(size.y · baseScale)/2, cargo center sits
just inside that line for a slight overlap so the parachute strings
visually terminate on the box top. The cargo is now a child of the
parachute mesh (para.add(cargo)), so any transform applied to the
parachute — scale, rotation, position — carries the box along with
it. To keep the visible box size consistent regardless of the
parachute's baseScale, the cargo's local position and scale are
divided by baseScale.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 13:39:58 +02:00
MVA Global Fret
6b0f8d9afb Switch parcel sprites to a real 3D parachute GLB with bound cargo
Drops the parcel.png sprite (which baked the parachute and the box
into a single image) for a real 3D model: assets/parachute.glb is
the CC-BY 3.0 « Parachute » by Poly by Google, decompressed from
poly.pizza's static.poly.pizza CDN.

The parcel template now stacks four meshes inside one Group so they
move as a unit:
- the loaded parachute (centered + scaled to ~1.6 world units max)
- a 0.46×0.36×0.46 brown box with metal-low MeshStandardMaterial,
  positioned at y = -0.96 — right below the parachute's harness
  point — so the model's strings appear to terminate on it
- two thin black straps wrapping the box (0.04-thick boxes, one
  horizontal one vertical) for visual reinforcement that the cargo
  is tied down

spawnParcel clones the template (deep), per-instance clones every
material so opacity can be modulated independently per parcel, and
adds a slight pendulum sway + slow Y spin. Falling/scale-up/fade
logic adapted from the sprite version. Cleanup disposes the cloned
materials when a parcel exits.

HTML credit comment extended to attribute both the airplane and the
new parachute under CC-BY 3.0.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 13:32:48 +02:00
MVA Global Fret
3fc8f26c2e Clean up scattered noise around the parcel sprite
Original Gemini export had small dim artifacts dotted around the
parachute (visible against the transparent backdrop in the rendered
sprite). Re-process: crop the canvas tightly around the subject
(720×768 starting at x=344), then run a geq pass that knocks any
pixel with alpha < 40 down to alpha 0. The main subject keeps its
clean alpha; the faint speckles disappear.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 13:01:40 +02:00
MVA Global Fret
3f773380c4 Drop parachuted parcels behind the plane as it crosses
Adds a sprite-based parcel system. The plane spawns a new
parcel-on-parachute (assets/parcel.png, 236 KB transparent) every
~1.4 s while it's visible (progress 0.04-0.92). Each parcel:

- Spawns at the plane's current position with a tiny random offset.
- Falls at 1.4 world units/s, with a small horizontal drift and a
  parachute sway sinusoid for character.
- Scales 0.35 → 2.6 over its lifetime, simulating the perspective
  of falling toward the camera.
- Fades in over 6% of life, fades out over the last 15%.
- Cleaned up (removed from scene + material disposed) when its
  lifetime expires or it drops below y = -10.

Implemented as THREE.Sprite so it always faces the camera, no need
to track per-parcel orientation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 12:46:27 +02:00
MVA Global Fret
6fcc772bf0 Match trajectory to user-drawn line: high cruise, gentle climb
User sketched a near-horizontal red line in the upper third of the
viewport, slightly higher on the left than on the right. Mapping
that to world coords with the camera at z=22 and 40° vfov:
- right end (entrance): y ≈ +3.5
- left end (exit):      y ≈ +5

So the plane keeps cruising in the upper portion of the frame and
climbs ~1.5 world units across 40 horizontal units — about 2° of
slope. Pitch follows: rotation.z = -0.06 - p·0.01 (3.5–4° nose-up,
matching the slope). Roll softened to 0.04 ± 0.02 since the path is
nearly straight.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 12:39:42 +02:00
MVA Global Fret
6cf619857a Switch trajectory to descending right→top to left→bottom, nose down
Reroute the plane: it now enters from the upper-right (y=+6) and
exits at the lower-left (y=-10), so the path slopes downward as a
~22° descent (slope = -16/40 in world units). Pitch reversed to
match — rotation.z = +0.32 + p·0.05 (≈18-21° nose-down) so the
plane's body aligns with the descent line. Roll and yaw unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 12:35:03 +02:00
MVA Global Fret
7cebdf86ed Fix: rotation.z is the actual pitch axis, not rotation.x
The labels in the previous commit were swapped. With the wrapper
rotated -π/2 around Y so the nose points -X, the plane's longitudinal
axis is world X (so rotation.x is roll) and its lateral axis is
world Z (so rotation.z is pitch). Earlier code applied "roll"
(positive 0.18) to .z, which was actually pitching the nose down —
no amount of tweaking rotation.x could compensate, hence the user
seeing the plane go forward+down even after sign flips.

Now:
- rotation.z = -0.30 - p·0.05  (nose up ~17–20°, climb attitude)
- rotation.x = 0.12 + small variation  (subtle roll)
- rotation.y = 0  (no yaw, plane already heading the right way)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 12:31:51 +02:00
MVA Global Fret
710551082c Flip pitch sign — turns out positive rotation.x was nose-down
After the wrapper's -π/2 yaw, applying positive rotation.x to the
planeHolder rotates the plane around world X with the nose dropping,
not lifting (visible in the user-supplied screenshot). Flipping to
-0.18 (≈10°) puts the nose where the trajectory says it should go.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 12:29:12 +02:00
MVA Global Fret
1aa18d92b8 Soften the plane's pitch to a realistic ~4° nose-up
The +0.20 (≈11°) climb angle from last commit looked cartoonishly
steep. Real airliners climb at maybe 3–5° once they've cleaned up
after takeoff. Cut targetPitch to 0.06 + p·0.02 (3.5° → 4.6°).
Roll/yaw untouched.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 12:27:30 +02:00
MVA Global Fret
390e075371 Plane climbs and exits fully off-screen
py was descending +7→+2, now ascending -1→+12 so the plane gains
altitude across the traversal. px stretched 18→-22 (was 16→-16) so
both endpoints sit clearly outside the visible frustum (camera at
z=22 + 40° vfov gives ~28 world-units of visible width on a 16:9
viewport). Pitch flipped from negative to +0.20 + p·0.10 to read
as nose-up for the climb. Roll/yaw unchanged.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 12:24:03 +02:00
MVA Global Fret
a23ef5edc3 Flip plane heading 180° — nose now leads the right→left motion
The Poly by Google airplane's default orientation in the GLB is the
opposite of what I assumed: at wrapper.rotation.y = +π/2 the nose
ended up pointing into the direction the plane was moving away from
(it looked like it was flying tail-first). Switch to -π/2 so the
nose actually leads the trajectory.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 12:19:48 +02:00
MVA Global Fret
48dbd14541 Plane drifts forward at cruise speed, reverse trajectory right→left
Two adjustments to the intro plane:

1. Autonomous cruise speed. Adds BASE_SPEED (1/28 per second of
   wallclock) to targetProgress on every frame, so the plane crosses
   the screen on its own in ~28 s without any input. Mouse motion
   still adds a boost (one full traversal per ~4500 px of cursor
   travel), which feels like the plane "speeding up" when the user
   interacts. Time delta clamped to 0.1 s so the plane doesn't jump
   forward after the tab returns from background.

2. Reverse direction. Plane now enters from upper-right (x = +16),
   traverses to upper-left (x = -16), nose pointing -X. Wrapper rot.y
   flipped to +π/2; px formula flipped; banking angles inverted so
   the plane still rolls "into the turn" along its new direction.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 12:15:59 +02:00
MVA Global Fret
3829ab9af6 Drive plane progress by mouse movement, not mouse position
Old behaviour: plane.x mapped 1:1 to cursor.x — moving the mouse left
made the plane reverse. New behaviour: every pixel of cursor travel
(any direction) increments a progress counter from 0 to 1, the plane
position is derived from progress, and progress saturates at 1 — so
once the plane has exited stage right, it stays gone.

FULL_DISTANCE = 3500 px of cursor travel for a full traversal. The
existing lerp (0.06) still smooths the rendered position. Background
parallax still uses raw cursor X/Y (independent of plane progress).
deviceorientation handler updated symmetrically — gamma+beta deltas
push progress forward on mobile.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 12:11:53 +02:00
MVA Global Fret
ad9ad43487 Use the correct Antananarivo aerial image, lift plane to upper half
Background was inadvertently the wrong Gemini export (an unrelated
airliner-over-mountains photo) — sorted out and replaced with the
intended aerial illustration of Antananarivo (Lake Anosy + Rova
hill + city, 487 KB, 1920px wide).

Also lifted the plane's trajectory: y goes from +7 (offscreen
upper-left) to +2 (still upper half, exiting right) instead of
+5..-2. The plane now stays clearly in the upper third of the
viewport, leaving room for the centered CTA button and the city
detail at the bottom.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 11:39:08 +02:00
MVA Global Fret
eba88207c4 Swap video bg for aerial Antananarivo image, drive plane with the mouse
User-supplied aerial illustration of Antananarivo (Lake Anosy + Rova
hill + surrounding city, 1920px wide JPG, 241 KB) replaces the
parachute-drop video as the static intro backdrop. The video files
are deleted from /videos.

The plane no longer orbits a scroll timeline. Now:
- Page is a single viewport, no scroll, no act labels, no scroll hint.
- Mouse X (0..1) drives plane.position.x from -16 (offscreen left) to
  +16 (offscreen right), with plane.position.y descending from +5 to
  -2 — so the plane enters from the upper-left and exits lower-right.
- Pitch/roll/yaw lerp toward small targets that depend on mouse X, so
  the plane banks naturally as it crosses.
- Background image gets a softer mouse parallax (-16/-10px) via the
  existing --mx/--my CSS vars, now updated from intro-scene.js.
- Three.js cloud spheres are gone; the photo is the entire backdrop.
- ScrollTrigger + the GSAP timeline are removed; the page no longer
  needs gsap at all (the script tag stayed for now in case it comes
  back, but the dependency could be dropped on a future pass).
- CTA button is back to plain visible/centered, no reveal animation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 11:35:11 +02:00
MVA Global Fret
d99e2a5fc1 Replace primitive plane with a real GLTF airliner
Drops the cylinder+box airplane built last commit in favor of a CC-BY
3D commercial airliner from Poly by Google (188 KB GLB, 11.3k tris,
hosted in assets/airplane.glb). Loaded at runtime via three/addons
GLTFLoader; importmap extended to expose the addons subpath.

Bug worth noting: a naive setFromObject + position.sub(center) +
scale.setScalar pipeline leaves the model offset by -center after
scaling because position is in pre-scale units. Fix is to wrap the
model in a Group, apply the centering offset to the inner model,
then scale the outer Group — the whole transform stays consistent.

Attribution added in two places per CC-BY 3.0:
- HTML header comment with creator + source URL + license link
- JS file header in intro-scene.js
Tone-mapping bumped to ACES filmic for a slightly nicer render.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 11:18:53 +02:00
MVA Global Fret
341dca7cb5 Convert intro into a scroll-driven 3D cinematic
Restructure the page so the first 4 viewports of scroll drive a
Three.js scene composited on top of the Antananarivo parachute video.

What's there:

- Three.js (ESM, r158 via importmap) renders a low-poly cargo airliner
  built from primitives: cylinder fuselage, cone nose, sphere cockpit
  (dark glass + emissive), box wings/tail/fin, cylinder engines with
  torus intakes, gold trim band, navy fin with gold logo box. No
  external model file.
- Hemisphere + directional + ambient lights tuned for golden-hour fill.
- 14 cloud spheres scattered around the plane, slowly rotating.
- GSAP + ScrollTrigger drive a single progress value scrubbed against
  scroll position. Inside the rAF loop, the camera arcs from rear-left
  (-0.6 rad) to front-right (+1.1 rad), radius dipping mid-flight, and
  the plane rolls slightly with scroll.
- Three act labels (Paris CDG / Vol cargo / Antananarivo) cross-fade at
  20%/40%-60%/72% scroll positions via a chained gsap timeline.
- Gold CTA button stays opacity:0 + pointer-events:none until the last
  ~10% of scroll, then fades and scales in. Hover transform rebuilt
  without the old mouse-parallax tilt (fights the scroll animation).
- Scroll hint pill (chevron + "Faites défiler") at the bottom of the
  first viewport, fades out on first scroll event.
- prefers-reduced-motion shortcut: scroll stage hidden, CTA visible,
  no animation. Page reverts to a static screen with the video bg.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 10:41:24 +02:00
MVA Global Fret
6f6cb672ac Revert "Add 3D plane fly-by intro that reveals the CTA on landing"
This reverts commit d1ea4d696c.
2026-05-05 10:17:57 +02:00
MVA Global Fret
d1ea4d696c Add 3D plane fly-by intro that reveals the CTA on landing
Hero animation: a 3D airliner enters from the lower-left climbing,
crosses the viewport at near-1:1 scale around 50% of the timeline,
then exits top-right and shrinks. CTA stays hidden during the flyby
and fades in once the plane has cleared the frame; the gold pulse
halo is delayed to start with the reveal.

The plane asset is microsoft/fluentui-emoji's Airplane/3D, MIT.
Total intro is ~3.9s before the CTA is interactable; reduced-motion
short-circuits the whole sequence and shows the button immediately.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 10:16:25 +02:00
MVA Global Fret
930ce340a8 Revert to original gold-pill CTA — cloud version was off-brand
User didn't like the cloud look. Roll the button back to the gold
pill from c52ac51 (gold gradient, shine sweep, pulse halo, mouse
parallax tilt). Keep the parachute video swap, just restore the CTA
styling.

Drop assets/cloud.png — no longer referenced.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 02:02:46 +02:00
MVA Global Fret
90e5ff7116 Drop the parachute, scale cloud up to 520x360, fit text inside
The Lottie parachute was floating above the cloud as an extra layer,
which felt busy. Strip it out — the dotlottie player script tag, the
.cta-stack wrapper, the .cta-parachute rule, and assets/parachute.json
all go.

The cloud is now the only landing element. Bumped width 360→520 and
height 200→360 so the Fluent cloud renders much larger; bumped font
size 1.15→1.4rem; added a small negative margin-top to seat the text
on the cloud's "body" (Fluent's base is heavy, the body sits a bit
above the geometric center).

Drop animation moved off the wrapper onto the button itself, with the
:hover rule overriding animation:none + applying the centered scale
transform so hover doesn't fight the keyframe.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 01:55:19 +02:00
MVA Global Fret
b4bc2959e2 Swap colorkey'd cloud for Microsoft Fluent 3D cloud emoji
The chromakey extraction on the user's reference image left frayed
edges and detached fragments. Replace with the official 3D cloud
asset from microsoft/fluentui-emoji (256x256 RGBA, 19 KB, MIT
license) — already perfectly cut, soft white-to-lavender gradient,
no artifacts.

Also broaden .claude/settings.local.json: replace ~30 over-narrow
literal command rules (each only matched its single exact
invocation) with prefix patterns covering git/curl/ffmpeg/file-ops,
common PowerShell verbs, and the MCP toolkits in active use, so
routine work stops triggering permission prompts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 01:50:44 +02:00
MVA Global Fret
83b61debae Strip parcel from parachute Lottie, swap cloud puffs for image, slow drop
Three iterations on the entrance animation:

- Edit the dotLottie animation in place: drop the "parcel" and
  "clouds_comp" layers so only the parachute itself remains. Save the
  result as plain JSON (parachute.json, 15 KB) instead of zipped
  .lottie since PowerShell's Compress-Archive produces a ZIP that
  the dotlottie player can't decode.
- Replace the five CSS cloud puffs with a single cloud illustration
  from the user (cloud.png, transparent background) sat behind the
  CTA text. Bigger, less abstract, more on-brand.
- Stretch the drop keyframes from 1.6s to 3.4s — still well below the
  ~7s the parachute boxes in the background video take to land.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 01:41:28 +02:00
MVA Global Fret
25d52d6709 Drop the cloud-styled CTA into the intro under a parachute
Replace the gold pill with a fluffy cloud-shaped button — pill base
plus five absolutely-positioned puffs (three on top, two on the
bottom) all in white-to-pale-blue gradient with subtle inner shadow
to read as 3D.

Cradle the button in a 170px LottieFiles parachute (Elmer Vergara's
"Falling Parcel", licensed under Lottie Simple, hosted in
assets/parachute.lottie at 3.7 KB). The whole stack drops in from
above the viewport over 1.6s with a slight overshoot, much faster
than the boxes in the background video, then the parachute keeps
looping in place.

Mouse parallax dropped from the button — it would fight the entrance
animation. Video parallax stays.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 01:17:30 +02:00
MVA Global Fret
8db37dd538 Smooth out stutter, dial speed back from 2x to 1.5x
Pure setpts slowdown holds each source frame for the same wall-clock
time, which at 25 fps source / 2x means ~12.5 effective fps — felt
juddery. Switch to setpts=1.5*PTS (7.4s output) and add
minterpolate=fps=50:mi_mode=blend so the encoder generates blended
intermediate frames. Result is buttery, slightly faster than the 2x
version.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 01:00:29 +02:00
MVA Global Fret
d3151a4e3e Slow the parachute drop 2x — 5s loop felt rushed
Re-encode from source with setpts=2.0*PTS so the 5-second clip plays
back over 10 seconds. Boxes drift down more gently, matches the
cinematic slow-motion feel asked for in the original prompt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 00:57:07 +02:00
MVA Global Fret
9f3f3478a9 Swap to landscape parachute video, drop the logo overlay
Replace the portrait 9:16 source with a 16:9 landscape rendering of
the same scene — the wide aspect matches the desktop viewport so the
full Antananarivo skyline is visible without center-cropping. Crop
bottom 150px to remove the HeyGen watermark, strip audio, no logo
composite this round (per request).

Final: 1280x570, 5s, 1.6 MB.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 00:54:33 +02:00
MVA Global Fret
5756669c67 Replace Earth intro with Antananarivo parachute-drop video
Swap the rotating Earth backdrop for an AI-generated golden-hour shot
of Antananarivo's skyline with navy cardboard boxes parachuting in
from across the frame. The hero box at center gets the MVA Global Fret
shield overlaid for the last second of the loop, so each cycle ends
on a brand reveal.

Pipeline: source video cropped (bottom 150px) to remove the HeyGen
watermark, audio stripped, MVA logo composited on the foreground box
from t=4 to t=5 with a 0.3s alpha fade-in, re-encoded to H.264 at CRF
22 (1.1 MB total).

Tint overlay softened — the original navy gradient was tuned for the
dark space backdrop and was crushing the golden hour light.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 00:46:18 +02:00
MVA Global Fret
c52ac514b1 Drop the red Paris-Tana line, add mouse parallax to the Earth video
Tracking the line against the rotating globe was finicky and never
quite aligned. Strip out the SVG route, the great-circle slerp, the
3D projection and the debug overlay — the rotating Earth alone is
the visual now.

Re-add a subtle mouse parallax: the video shifts up to 22px against
the cursor, the CTA button tilts 8px the opposite way for a 3D feel.
On mobile, deviceorientation drives the same vars.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-05 00:04:37 +02:00
MVA Global Fret
eb01e75a3f Recalibrate intro line: shift LON0 to 150, bump rate to -6 deg/s
The pins were drifting east of the actual cities — Paris ended up over
Italy and Antananarivo in the Indian Ocean. Linear regression over five
calibration frames (visible central longitude at t=0,10,15,18,22) gives
LON0~151, rate~-6.0, which I round to 150 and -6.

Also expose all knobs as URL params (?lon0=&rate=&cx=&cy=&r=) and add a
?debug=1 overlay that draws the projected sphere outline + equator +
30 deg meridian grid, so the calibration can be eyeballed live.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-04 23:59:01 +02:00
MVA Global Fret
8033c0fd02 Self-host rotating Earth video, project red Paris-Tana line in 3D
Replace the Pexels stock clip with a higher-quality Earth-from-space loop
hosted in /videos (720p, 60s, slowed 2x, 12 MB). The static SVG arc is
gone — the route is now computed every frame from a 3D projection that
follows the globe's rotation:

- France (48.85N, 2.35E) and Antananarivo (-18.9N, 47.5E) are placed on
  a unit sphere, then rotated around the Y axis to match the apparent
  central longitude of the video at each frame (LON0=140 deg, omega
  =-5.75 deg/s, calibrated empirically from sample frames).
- A great-circle arc is sampled with slerp and projected
  orthographically; only the front-side portion (z > 0) is drawn.
- Pins fade out when their city rotates behind the globe; the whole
  group fades out when both endpoints are on the back side.

Mouse parallax dropped — it would desync the SVG from the video and
break alignment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-04 23:41:23 +02:00
MVA Global Fret
e23cc9ee33 Switch parallax intro to Earth-from-space video, drop static photo overlay
Replace clouds video (Pexels 2098989) with actual Earth-from-space footage
(Pexels 854275 — Europe/Africa visible + orbiting satellite) and remove
the static Unsplash Earth photo layer that was overlaying the video.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-04 23:08:28 +02:00