
Strawberry Payton's Usa
Profil aromatique terreux et épicé, porté par le myrcène, concentration en cannabidiol mesurée par HPLC.
La donnée est le design : publier la mesure, pas l'ambiance.
Phytogrammes vend du CBD français avec une transparence radicale. Origine, méthode d’extraction, numéro de lot, date du certificat HPLC, seuil exact de Δ⁹-THC, profil terpénique par nom et par pourcentage : la fiche produit EST le certificat.
Trois règles gouvernent chaque page : la donnée est le design, une seule surface papier du début à la fin, un seul accent - plafonné à 10 % d’une surface, jamais le remplissage d’un bouton principal.
Deux lecteurs, un seul standard : l’adulte curieux qui découvre le cadre légal français, et le lecteur averti qui veut le certificat, le lot et le profil terpénique par poids. Aucun des deux ne tolère le mot « premium ».
Cinq groupes, un accent. Le rose est plafonné à 10 % d’une surface : ponctuation, jamais l’aplat d’un CTA.
Registre papier cassé. Le fond par défaut d'environ 70 % de chaque page.
Presque-noir tiède. Texte courant, titres, la surface du CTA primaire.
Hairlines et séparateurs. Jamais plus lourds que nécessaire.
Une seule couleur signal, plafonnée à 10 % d'une surface. Ponctuation, jamais l'aplat d'un CTA principal.
Trois bases à L ≈ 0,53 : le texte papier passe WCAG AA sur le badge plein.
Trois familles, un rôle chacune, aucun chevauchement. Plus les quatre paliers de l’échelle d’affichage.
Le chanvre, mesuré.
Display + headings. Tight tracking. Sentence-cased, French convention.
"Geologica", system-ui, sans-serif
Producteur et distributeur français de fleurs, huiles et extraits, sourcés honnêtement.
Body + UI labels. 15–17 px, leading 1.65, max 65 ch.
"Roboto", "Roboto Fallback", ui-sans-serif, system-ui, sans-serif
Δ⁹-THC 0,28 % · CBD 12,5 % · lot 24-A07 · 24 h
Measured numerals (tabular-nums), lot codes, inline metadata. Never body.
"Roboto Mono", "Roboto", ui-monospace, monospace
Quatre paliers Geologica, exposés en utilitaires text-display-*. Les titres référencent l’échelle, ils ne réinventent pas de clamp.
Le wordmark Futura PT Demi, jamais italique. Tout-encre sur clair, tout-papier sur sombre, le point final toujours rose.
Le vocabulaire physique de la page : espacement, rayons, bordures, élévation, profondeur.
Quatre paliers nommés, jamais mélangés. Plus les largeurs de conteneur.
Trois épaisseurs, deux teintes de filet. Le filet par défaut n’est jamais plus lourd qu’il ne doit.
Cinq niveaux, tous teintés encre, jamais colorés, jamais de glow.
Échelle nommée, aucun nombre magique. On consomme z-[var(--z-modal)], jamais z-[100].
Boutons, champs, badges, lignes de données, panneaux. Le relief est réservé à ce qu’on presse ; un statut se lit.
btn-skeuo + -ink / -accent / -paper / -icon. Grain SVG, gloss au survol, enfoncement 1 px à l’appui.
L’anneau montré est simulé : appuyez sur Tab pour voir le vrai :focus-visible.
Le corps (h-* px-*) reste le travail de Tailwind ; la recette de surface vient de globals.css.
Pilules à filet plat. Pas de relief : surface papier, filet 1 px, anneau accent au focus. Le libellé est en Roboto casse phrase, jamais en mono majuscules.
Le rejet de saisie utilise t-shake (voir le chapitre Mouvement).
Livraison UE uniquement.
Sélectionnez un format pour continuer.
ui/select-field.tsx : libellé Geologica, puits field-skeuo, placeholder, texte d’aide, erreur aria-invalid + FormAlert.
Adresse e-mail invalide. Vérifiez le format.
Votre panier ne peut pas être enregistré sur cet appareil.
Message envoyé. Réponse sous 72 h ouvrées.
ui/form-alert.tsx : surface teintée statut + icône + role=alert — une erreur n'est jamais couleur seule. Trois tons.
Réservée aux codes (certifications, lots) : mono 11,5 px casse haute, suivi 0,04em, h-8 px-3.5. Jamais un label UI.
Roboto 11 px casse phrase pour tout ce qui n’est pas un statut ; l’encre pleine pour l’unique état fort.
Les trois tons de statut restent teintés : la sémantique vit là. Doux + point sur fiche, plein pour le verdict.
La variante sombre du registre métadonnée : lozenge à filet paper/20, mono 11 px, texte paper/75. Jamais un label UI.
ui/tooltip.tsx : bulle encre au survol (délai d’intention 300 ms) et au focus clavier (instantané) ; Échap la ferme.
La ligne de données : numéral mono accent, symbole Geologica, nom Roboto muté, valeur mono encre, filet à remplissage proportionnel et point-repère.
Le registre « la donnée est le design » sur surface encre : index mono accent, nom Geologica, filet paper/20.
rounded-soft, filet rule, surface papier, en-tête Geologica casse phrase (pas un eyebrow tracké). Plus les helpers Do/Don’t.
Avis du laboratoire
Lot 2026-04-LH-018 conforme. CBD mesuré 15,9 %, Δ⁹-THC sous le seuil légal.
Lignes de spec
ui/toast.tsx : glyphe de ton, ombre --shadow-drawer, empilement max 4, fermeture toujours offerte, pause au survol.

Profil aromatique terreux et épicé, porté par le myrcène, concentration en cannabidiol mesurée par HPLC.

Strawnana, fleur de chanvre au profil terreux et épicé, porté par le myrcène. Analyse HPLC lot par lot.
CBD11 %

Variété sélectionnée pour un profil terreux et épicé, porté par le myrcène, cultivée en intérieur sur substrat coco-perlite.
CBD7 %
Le vrai <ProductCard/>, trois références du catalogue : CTA panier révélé au survol/focus, statique en mobile.
Anatomie de /laboratoire-cbd, la page de collection canonique.
Une courbe par défaut, une grille de jetons, un registre. Les fermetures sont plus rapides que les ouvertures.
Chaque valeur est choisie par USAGE sur l’échelle transitions.dev — jamais au nombre le plus proche. Interactions sous 300 ms, transform et opacity seulement, jamais transition: all, jamais ease-in sur de l’UI.
Les fermetures sont plus rapides que les ouvertures (250 → 150, 400 → 350). Page slide, tabs, icon swap et text swap restent symétriques. Jamais de délai sur une fermeture ni un hover-out.
La distance descend avec la fréquence, monte avec la cérémonie : un swap in-place bouge à peine, un badge célébratoire balaie large.
La pré-échelle d’une surface avant son entrée - les grandes surfaces partent de plus loin, jamais sous 0,9 (effet zoom interdit).
Le flou adoucit un swap ou un slide, jamais un simple fade ni un changement de couleur.
Chaque animation du site, en démo vivante — les bascules sont la vraie primitive, les one-shots se rejouent au ↻. La source structurée est brandkit/motion-registry.ts. Trois bibliothèques MIT (torph · calligraph · number-flow) sont consommées derrière un wrapper de marque.
Ce qui s'ouvre, glisse et se replie. Origine ancrée au déclencheur, fermetures plus rapides que les ouvertures.
Presse sur le déclencheur. Origin-aware : la surface grandit depuis son déclencheur, jamais du centre.
.t-dropdown + .is-open/.is-closing + data-origin
--dropdown-open-dur--dropdown-close-dur--ease-outUtilisé sur Méga-menu header · Résultats de recherche
Ouverture / fermeture. Échelle 0,96 → 1 depuis le centre ; le backdrop ne fait que fondre.
.t-modal + .t-auth-overlay
--modal-open-dur--modal-close-dur--modal-scaleUtilisé sur Modale d'authentification · Popup de bienvenue
10 € offerts
Le code part par e-mail.
Ouverture de la modale, un temps APRÈS la carte. La seule échelle d'entrée AU-DESSUS de 1 : la plaque se pose avec du poids au lieu de claquer avec la carte.
.t-plate-settle (enfant d'un .t-modal)
--ease-out-quart520 ms (littéral recette)échelle 1,04 → 1Utilisé sur Popup de bienvenue — plaque photo
Ouverture du tiroir. Axe X (divergence assumée du Y amont) ; ferme plus vite qu'il n'ouvre.
.t-panel-backdrop + .t-panel-drawer + .is-open
--panel-open-dur--panel-close-dur--ease-outUtilisé sur Tiroir panier · Tiroir filtres (mobile)
Étape 1 / 2
Livraison
Changement d'étape. Entrée seule (variante assumée) : les formulaires à hauteur variable ne supportent pas la sortie jumelée.
.t-page-enter + --t-page-dir (remount key={step})
--page-slide-dur--page-slide-distance--page-blurUtilisé sur Tunnel de commande
L'essentiel scannable.
Sélection d'un segment. La pastille tween transform + width entre segments mesurés ; flèches + Home/End au clavier.
<SegmentedControl/> (.t-tabs + .t-tabs-pill)
--tabs-dur--tabs-easeUtilisé sur Fiche wiki - Résumé / Complet
Survolez — ou Tab, puis Échap.
Survol (délai 300 ms) OU focus clavier (instantané). Scale-in 0,98 depuis le bord ancré ; a11y focus-within, Échap, aria-describedby ; délai d'intention 300 ms.
<Tooltip/> (.tooltip-anchor + .tooltip-bubble)
--duration-quick--scale-pre-small--ease-outUtilisé sur Verdict légalité wiki
Expédition sous 24-72 h. Interpolate-size ouvre en douceur sur Chromium ; ailleurs, instantané.
Ouverture du <details> natif. Amélioration progressive (Chromium 129+) sur la sémantique native ; ailleurs, ouverture instantanée.
details.t-details (::details-content + interpolate-size)
--duration-fast--ease-outUtilisé sur FAQ · Facettes du laboratoire
Changement d'état de taille. LE tween largeur/hauteur sanctionné (exception assumée du transform-only, recette amont #01).
.t-resize + classe d'état du caller
--resize-dur--resize-easeInstallé, en attente de son premier consommateur.
Trois registres de numéraux - célébration (pop), instrument (roll continu), promo (machine à sous) - et les swaps de libellés.
Le libellé change en place. Bloc entier : sortie vers le haut, entrée par le bas. Pour un morph partiel → MorphText.
.t-text-swap + .is-exit/.is-enter-start
--text-swap-dur--text-swap-translate-y--blur-swap-smallUtilisé sur États de bouton, compteurs
Le libellé change - les glyphes communs GLISSENT. FLIP mot-à-mot (Intl.Segmenter) ; respectReducedMotion natif ; sans dépendance.
<MorphText/> (torph, MIT)
--duration-fast--ease-out (lus au runtime)Utilisé sur Soumission d'avis (PDP) · Me prévenir (rupture)
Un ÉVÉNEMENT numérique (ajout panier). Le registre célébration : pop escaladé, ~100×/jour, jamais pour une quantité continue.
.t-digit-group + .t-digit[data-stagger]
--digit-dur--digit-stagger--ease-bounce-softUtilisé sur Badge compteur du panier
Une quantité qui BOUGE (la direction porte du sens). Anneau de chiffres masqué + composite:accumulate : le spam de clics reste continu. fr-FR natif.
<PriceFlow/> · <PriceFlowLockup/> (number-flow, MIT)
--duration-medium--duration-quick (fade-cap)--ease-outUtilisé sur Panier : lignes, sous-total, « Plus que X € », CTA · Prix PDP (variante/quantité) + barre d'achat mobile
Révélation d'une offre (first-run) ou cycle promo. Odomètre à tendance (9→0 roule vers l'avant), chiffre de droite d'abord. Garde reduced-motion maison.
<PromoSlots/> (calligraph, MIT)
preset snappy (350 ms), stagger 20 msUtilisé sur Offre de bienvenue (10 € offerts)
Un libellé d'affichage dont la valeur ET la largeur changent sur place. Les caractères communs glissent, le reste entre/sort. Reduced-motion maison derrière une porte d'hydratation.
<FluidText/> (calligraph, MIT)
preset bouncy (spring 500 ms, bounce .3), stagger 20 msUtilisé sur Logotype du header (« P. » ⇄ « Phytogrammes. »)
Attente inline (un bloc skeleton serait faux). Pure CSS ; reduced-motion lit un muté statique.
.t-shimmer
2 s linéaire, encre ↔ encre-mutéUtilisé sur Liste d'attente (envoi en cours)
Entrée first-run d'un hero. Montée + fondu ligne par ligne ; réservé aux surfaces vues une fois par visite.
.wiki-rise (+ délais par enfant)
560 ms (littéral recette)--ease-out--duration-staggerUtilisé sur Hero Canna·wiki
Le végétal, mesuré ligne à ligne, prouvé.
Chargement (héros au-dessus du pli) ou entrée viewport (once). Montée ligne par ligne sous masque ; le SSR peint le titre nu. Le wordmark du footer monte de 112 % sous clip.
<MaskedLines/> (ui/masked-lines, SplitText mask lignes)
BRAND_EASE (miroir de --ease-out)0,8 s / stagger 80 ms (rythme useGsapReveal)Utilisé sur Héros des pages secondaires (PageHero) · Titre d'article du journal · Masthead de l'index du journal · FAQ · Contact · Notre laboratoire · Masthead du brandkit · Wordmark géant du footer
Le certificat correspond au chiffre près.
Julien M.La plaque entre au viewport, PUIS chaque permutation du trio. Fondu + flou 4 px + montée 16 px, rejoué au remount du trio. Rotation 7 s, suspendue au survol ; le PDP ne tourne pas.
.review-in + remount du trio (landing) · motion whileInView (PDP)
blur 4 px · y 16 px · 0,6 s (littéraux recette nor.ma)--ease-out (≡ leur --ease-norma)délais inline 0/100/200 ms (échelle recette)rotation 7 s — pause survol/focus, stop reduced-motionUtilisé sur Avis du landing (§ 07) · Avis produit (PDP)
L'interface répond : confirmations, refus, attentes. Chaque canal visuel est doublé d'une sémantique (role, aria).
Deux icônes permutent dans un slot.
.t-icon-swap[data-state] + .t-icon[data-icon]
--icon-swap-dur--blur-swap-smallUtilisé sur Burger ↔ croix (header mobile)
Saisie rejetée. Le message d'erreur vit dans <FormAlert/> (divergence assumée : pas de bordure/auto-revert amont).
.t-shake + .is-shaking
--shake-distance420 ms (littéral recette)Utilisé sur Formulaires (auth, notify, avis)
Action confirmée. Retuné plus calme que l'amont : rotation -10° (vs 80°), bob 6 px (vs 40).
.t-success-check + data-state
--check-dur--check-draw-dur--check-bobUtilisé sur Confirmations de formulaire
Notification qui apparaît. Le pop du point roule sur le spring COMPILÉ (linear(), physique réelle, zéro JS).
.t-badge[data-open] + .t-badge-dot
--badge-slide-dur--badge-pop-dur--ease-spring-linearUtilisé sur Compteur panier (header)
Retour d'arrière-plan non-modal. Entrée : échelle 0,97 + cross-blur rejoignent la montée. Sortie : fondu calme.
useToast() (.toast-item)
--duration-fast--duration-quick--scale-pre-medium--blur-swap-smallUtilisé sur Échec d'enregistrement du panier
Fleur CBD Alpine
Indoor, 15,9 % CBD — lot 2026-04, COA disponible.
Les données arrivent. Cross-fade + cross-blur EN PLACE (grille superposée) : zéro décalage de mise en page.
.t-skel + .is-revealed (+ <Skeleton/>)
--duration-fast--blur-swap-smallInstallé, en attente de son premier consommateur.
Attente indéterminée dans un bouton. Reduced motion RALENTIT au lieu de figer : un loader porte du sens (guidance checklist).
.spinner-arc (arc sur piste 10 %, currentColor)
800 ms linéaire ; reduced-motion → 2400 msInstallé, en attente de son premier consommateur.
Une RÉGION fait un aller-retour indéterminé de plusieurs secondes. Six verbes point-par-point ; le libellé est obligatoire. Repos hors écran, DPR plafonné à 2.
<WaitOrb/> · <WaitOrbSection/> · <WaitOrbGlyph/> (thinking-orbs, MIT)
présets calibrés lib (canvas 2D, 20 / 64 px).orb-wait / .orb-wait-section (recette de paire)encre épinglée par surface (paper / ink)Utilisé sur Tunnel - capture du paiement · Retour OAuth (plein écran) · Mon compte - commandes + adresses · Confirmation - récapitulatif
Cocher / décocher. La boîte se remplit d'encre, puis la coche se TRACE (pathLength=1) en 250 ms. Famille de jetons --cbx-*.
<Checkbox/> (.t-check, famille --cbx-*)
--cbx-box-dur--cbx-draw-dur--ease-outUtilisé sur Facettes du laboratoire · Suppression de compte
Bascule on / off. Double rebond du pouce : dépasse 1 px, revient, se pose. .is-init bloque le rejeu « off » au montage.
<Switch/> (.t-toggle + data-on + .is-init)
--toggle-dur--toggle-travel--ease-springUtilisé sur Préférences e-mail (mon compte) · Adresse par défaut (éditeur)
Un booléen « aimé » passe à vrai. Remplissage accent + pop compressé-relâché + 8 particules ; décocher rembobine sans fête.
.t-like[data-liked] + .is-bursting (+ --px/--py par point)
--like-fill-dur--like-pop-dur--ease-springInstallé, en attente de son premier consommateur.
Les garnitures - boucles ambiantes, survols, gloss. Budget délice : surfaces occasionnelles seulement.
Boucle ambiante. Bords fondus (edge-fade) : les glyphes se dissolvent au lieu d'être coupés.
.animate-marquee (+ .edge-fade-x)
32 s linéaire (défaut recette)Installé, en attente de son premier consommateur.
Survol (pointeur fin uniquement). Levée -4 px ; le RETOUR seul est springé — le relâchement porte l'élan.
.t-avatar (dans .t-avatar-group)
--duration-fast (entrée)--ease-spring-linear (retour)Installé, en attente de son premier consommateur.
« Le taux annoncé correspondait au certificat du lot, au chiffre près. »
Survol d'une carte d'avis (pointeur fin uniquement). Au survol, la citation recule (flou 2 px) et l'image du produit noté monte à sa place. Pointeur fin seul.
.review-swap + .review-quote/.review-photo (survol de .review-card)
--duration-fast--ease-out--ease-spring (l'échelle)Utilisé sur Avis du landing (§ 07)
Survol d'un bouton skeuo.
.btn-skeuo::before (au survol)
650 ms--ease-outUtilisé sur Tous les CTA skeuo
Survol d'un lien fléché (pointeur fin). Le chevron glisse 2 px et OUVRE ses bras en flèche (±8° autour de l'apex).
.t-learn + .t-learn-chevron (<ChevronSpreadIcon/>)
--learn-dur--learn-shift--ease-outUtilisé sur « Voir plus » des sections (landing) · Tuiles promo des collections · Avis clients - lien produit · CTA de la modale d'authentification · Journal - à la une + articles liés
Boucles lentes, à la demande.
.animate-float-y · .animate-drift
6-22 s ease-in-outUtilisé sur Découpes du hero · Plaque moléculaire wiki
Les scrubs GSAP (deck méthode, crossfades) vivent sur la landing — un cadre statique les trahirait.
Voir en contexteScroll (landing uniquement). Partage moteur assumé : GSAP pour les sections landing scrollées, motion/react partout ailleurs.
@/lib/gsap (BRAND_EASE, useGsapReveal, scrubs)
BRAND_EASE (miroir de --ease-out)Utilisé sur Deck méthode (scrub épinglé) · Crossfade des cartes produit · Bande de réassurance (drift + vélocité)
Le refus documenté fait partie de la référence — reprendre un motif rejeté demande de rouvrir sa décision au journal, pas de le glisser dans un coin.
Helpers décoratifs, en lecture à la demande (au repos sur une page de référence). La garde prefers-reduced-motion globale les neutralise toutes.
animate-marquee · défilement horizontal infini, durée via --duration (32 s par défaut).
animate-spin-slow · rotation continue lente, 12 s. Disques et sceaux décoratifs.
ui/skeleton.tsx : blocs paper-tint à la forme du contenu, pulsation d’opacité. La région porte role=status.
Retirés (anti-slop), ne pas réintroduire : hero-cloudscape, cloud-drift, liquid-glass-sweep.
Wrappers Hugeicons et SVG extraits. Trait 1,5. Échelle 16 · 20 · 24 · 32 · 48.
16 inline · 20 bouton · 24 UI · 32 grand CTA · 48 illustration.
Le standard WCAG 2.2 AA, pratiqué de longue date : contraste, clavier, mouvement réduit, cibles tactiles.
Les jetons dans leur format brut. Le logotype se compose en direct, sans fichier séparé.
Le logotype « Phytogrammes. » se compose en direct (Futura PT Demi, .font-logo) - aucun fichier SVG séparé n’existe à ce jour.
Les anti-patterns, la direction artistique et la voix. Si un ingénieur senior dit « ça fait IA », c’est ici.
Motif retiré → remplacement sanctionné. Reprendre un motif retiré est une violation du check de dérive, pas un choix de style. La justification vit dans l’entrée de journal « Depuis ».
100 % piloté par le CMS, aucun asset local. La voix est en français, vouvoiement, sans tiret cadratin.