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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
- Background video: aerial cloudscape (Pexels free video, 7.4 MB SD)
autoplay, loop, muted; fastest mouse parallax (-45px). Hue-shifted
toward navy and slightly desaturated.
- Earth-from-space photo overlaid in screen blend mode at 78%
opacity so the cloud motion shows through; medium parallax.
- Navy night tint preserves brand palette and central legibility.
- New SVG route layer: thin red gradient stroke (1.5px) curving
Paris → Antananarivo, with a glow filter, a soft halo path
beneath, two fixed pin markers at each endpoint, and a white
pulse traveling along the path on a 3.6s loop.
- Centered card content was stripped to JUST the gold "Accéder au
site" button (continuous pulse ring + hover shine + lift).
The full text block (welcome / subtitle / 3 meta stats) is gone.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Previous SVG illustrations and emojis were dropped per user feedback.
The new intro is a single fixed viewport (no scroll) where every
layer reacts to mouse movement only:
Layer 1 — Real photo: Earth at night from space (NASA / Unsplash),
slow parallax (-18px max).
Layer 2 — Navy gradient tint to anchor the brand palette and
ensure central card legibility.
Layer 3 — Real photo: aerial sunset clouds (Unsplash), 28%
opacity with mix-blend-mode soft-light, faster
parallax (-32px max).
Layer 4 — Gold radial glow that follows the cursor (mix-blend
screen), giving an interactive "spotlight" feel.
Layer 5 — 12 floating gold particles with continuous CSS
animation, fastest parallax (-55px max).
Center card (glassmorphism, navy + gold border, blur 24px) tilts in
the OPPOSITE direction (+12px) for a 3D depth illusion. The CTA
button has a continuous pulse ring, hover lift + shine sweep, and
routes to accueil.html.
Mobile: device-orientation events drive the parallax instead of
mouse. prefers-reduced-motion kills all animations.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The new index.html is a 3-act scroll-driven storytelling intro:
Act 1 (Tarmac at sunset)
Sunset gradient sky, mountain silhouettes, hangar, runway with
centerline lights. Inline SVG cargo plane (MVA-branded gold tail)
sits on the ground while box emojis cycle up a loading ramp.
Act 2 (Take-off at dusk)
Dusk sky, two parallax cloud layers and distant mountains. The
plane translates diagonally up-and-right with a slight tilt and
a glowing contrail, sized down progressively.
Act 3 (Arrival at night)
Deep navy night sky with twinkling stars, a glowing moon, and
the Madagascar coastline silhouette. A small plane fades in
descending toward the island, then a centered CTA block reveals:
"Bienvenue à bord" with the gold "Accéder au site" button that
routes to accueil.html (the real homepage).
Implementation:
- Pure CSS layered scenes; no library
- Scroll progress driven by a single CSS custom property --scroll
(0→1) updated via rAF, layers transform off it
- Mouse-move parallax on layers via --mx/--my (skipped on touch)
- Inline SVG plane reused across the 3 scenes
- All text is i18n-driven with a new `intro` section in FR/EN/MG
Architecture changes:
- index.html → new parallax intro
- accueil.html → former index.html content (full homepage)
- All nav/logo/footer links updated index.html → accueil.html across
the 8 existing pages
- Mobile-nav on accueil.html now also includes Service Commande
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bundle the actual SVG logos in images/payment-logos/ and reference
them with <img> instead of Font Awesome glyphs:
- mvola.svg (from mvola.mg, the green wordmark)
- orange.svg (Wikimedia Commons, square orange)
- airtel.svg (Wikimedia Commons, red wordmark)
- visa.svg (Wikimedia Commons)
- mastercard.svg (Wikimedia Commons)
New CSS block (.payment-logos-grid + .payment-logo-card) gives a
clean 4-column white-card layout with hover lift, gold border tint
on hover, and a 2-column responsive layout on mobile. The bank-card
slot now displays both Visa and Mastercard logos side-by-side.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Same fix as for Service Commande: apply .pricing-card--flat modifier
so the gold ::before bar is hidden and the border is uniform 2px on
all sides instead of looking thicker at the top.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two new clauses inserted into the loss-procedure article:
- Point 2: Drop-off at La Poste in France by a third party on behalf
of the Client. The La Poste receipt is mandatory as proof of
deposit; without it, no claim is processed.
- Point 4: When no prior declaration of the parcel contents was made
to MVA Global Fret, the refund is a flat-rate capped at 22,000 Ar
per kilogram lost. Encourages clients to declare valuable items.
Existing points renumbered (online purchase becomes 3, internal
verification 5, exclusions 6). Updated in all three CGV language
blocks (FR / EN / MG).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the short liability paragraph with a structured procedure
covering: third-party carrier proof for losses before Paris depot,
seller-refund-refusal proof for online purchases, MVA refund
commitment with invoice, internal verification clause, and explicit
exclusions (packaging, customs, prohibited items, force majeure).
Updated in all three CGV language blocks (FR / EN / MG).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Bumped "Dernière mise à jour" footer in the three CGV language blocks:
- FR: 04 Mai 2026
- EN: May 4, 2026
- MG: 04 Mey 2026
The "En vigueur depuis le 1er janvier 2025" header is kept (initial
effective date does not change).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Footer copyright bumped to 2026 across all 8 HTML pages and in the
three translation strings (FR/EN/MG) in translations.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
"Dépasser les dimensions autorisées" now has an asterisk pointing to
a small italic note below the dos/donts grid: "Nous contacter pour
tout colis volumineux." (FR/EN/MG).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The default .pricing-card has both a 3px gold border AND a 6px gold
gradient bar on top (::before). On the Service Commande page that
combination made the top edge look much thicker than the sides.
Add a .pricing-card--flat modifier that hides the ::before bar and
trims the border to 2px, then apply it to the commission card.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
New page service-commande.html explaining the order-on-behalf service:
- 10% commission on total order amount
- 50% deposit + 50% on order validation
- Right to request 100% upfront for large orders
- Standard 70,000 Ar/kg shipping fee on top, paid on receipt
- 5-question FAQ
- CTA to contact / Messenger
Trilingual content (FR / EN / MG) added to translations.js with full
serviceCommande section + nav.serviceCommande key.
Menu link inserted right after "Tarifs" in main nav, mobile nav and
footer links across all pages: index, about, tarifs, contact,
guide-envoi, application, cgv, service-commande.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When a client tries to re-register with an existing email:
- The form still shows the on-screen "already registered" message
- HubSpot data is still untouched (no duplicate, ref number preserved)
- NEW: a welcome-back email is now sent via EmailJS reminding them
of their existing client reference number
- The internal MVA notification (Formspree) is preserved
Requires creating a new EmailJS template (id: template_welcome_back)
with variables: firstname, email, reference_client.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use a Boeing-style commercial airliner on the tarmac, more relevant to
the air-freight business than the previous unrelated image. Image is
new to the site (no duplicates with index/about/tarifs/guide/contact).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace the cramped map-container layout with a polished map-card
- Centered section header (h2 + gold-line + subtitle) above the card
- Navy gradient header inside the card with gold location icon
- Address displayed in the header alongside an "open in Google Maps" CTA
- Increased map height to 420px (320px on mobile)
- Soft shadow and gold-tinted border for premium feel
- Added mapSubtitle translation key (FR/EN/MG)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajout de data-i18n sur tous les éléments non traduits (tarifs, contact, guide,
application, accueil) et ajout des clés correspondantes en FR/EN/MG dans
translations.js : détails tarifaires, cartes livraison, stats accueil, sections
CTA, récapitulatif contact, footer CGV.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
"Sarany" est le terme correct pour désigner les tarifs/prix dans ce contexte.
Corrige : heroTitle tarifs, heroSubtitle tarifs, nav pricing, heroCtaSecondary,
et value3Desc (about).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
"Fandefasana" est la forme correcte (nominalisée) en malgache pour désigner
le transport/fret aérien. Corrige le titre hero et 5 autres occurrences dans
les textes descriptifs, sous-titres et footer.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mise à jour de toutes les mentions du délai de livraison sur l'ensemble du site
(index, tarifs, contact) et dans les 3 langues (FR/EN/MG) pour indiquer clairement
que les 2 semaines sont comptées à compter de l'arrivée du colis au dépôt de Paris.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Ajout du SDK EmailJS (CDN) dans contact.html
- Initialisation EmailJS avec la clé publique dans form-handler.js
- Nouvelle fonction sendWelcomeEmail() : envoie au client son prénom,
numéro de référence et l'adresse de dépôt Paris (AEIC Forwarding, Orly)
- Appel automatique dans showSuccess() après inscription réussie
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Active WORKER_PROXY_URL pointant vers mva-hubspot-proxy.mvaglobalfret.workers.dev.
Le Worker interroge l'API CRM HubSpot côté serveur (contourne le CORS) et
retourne les données du contact si l'email est déjà enregistré.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Supprime HUBSPOT_SERVICE_KEY du code JS public (évite l'exposition du token)
- Remplace l'appel CORS-bloqué vers api.hubapi.com par un appel au proxy
Cloudflare Worker (WORKER_PROXY_URL, vide par défaut = sans blocage)
- Ajoute cloudflare-worker/hubspot-proxy.js : code complet du Worker à
déployer gratuitement depuis dash.cloudflare.com (sans CLI ni Node.js)
- Quand WORKER_PROXY_URL est renseigné, la détection doublon est active :
un client existant voit son message "déjà inscrit" sans re-soumission
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- generateRefNumber() basé sur timestamp : références jamais identiques
- checkExistingContact() : lecture HubSpot via clé de service (read-only)
- Si email déjà connu : affiche message 'déjà client' + référence existante,
AUCUNE soumission envoyée (référence existante jamais modifiée)
- Notification interne Formspree si tentative double inscription
- Traductions FR/EN/MG pour les nouveaux messages