Primitives v2
Les 35 primitives sont les briques HTML/CSS du moteur v2. Chaque primitive est un fragment self-contained (HTML +
<style>scopé) que le renderer assemble selon leprimitive_selectionde la DNA. Le smart picker (F1) override les defaults selon traffic temperature et structure du copy.
Concept
Chaque primitive vit dans ai-landing-primitives.js. Signature universelle : (dna, copy) => string qui rend un fragment HTML autonome. Les CSS classes sont préfixées .p-<group>-<variant>-* pour éviter les collisions.
Le renderer (ai-landing-renderer-v2.js) :
- Lit
dna.primitive_selection. - Pour chaque slot (hero, social_proof, urgency…), pick la variant choisie par la DNA.
- Appelle la fonction primitive avec
(dna, copy). - Concatène les fragments selon l'
ARCHETYPE_SECTION_ORDERSde l'archetype.
Les primitives sont CRO-tested : on ne touche pas à la structure CRO (CTA placement, ordre des sections), seule l'aesthetic varie.
Catalogue par groupe
Groupe hero — 5 variants
L'above-the-fold. Le seul slot qui a 5 variants distincts.
split_image
- Look : grid 2 colonnes (1.4fr texte / 1fr image), image à droite avec aspect 4:3, trust badges sous le CTA.
- Quand le picker la choisit :
linear_minimal,scientific,retrodefaults. - Code :
ai-landing-primitives.js:53.
centered_text
- Look : tout centré, max-width 760px, pré-headline en small caps souligné, image optionnelle sous le hero.
- Quand :
brutalist,editorial,dark_tech,wellness,tabloid,luxury,indie,y2k,glassmorphism(la plupart des archetypes). - Code :
ai-landing-primitives.js:86.
testimonial_above_fold
- Look : un témoignage cinq étoiles en hero, photo de l'auteur, sub-headline du produit dessous.
- Quand : trigger par le smart picker quand
testimonials.length >= 7ETtraffic_temperature = cold(sauf wellness/luxury). Trust-first. - Code :
ai-landing-primitives.js:118.
comparison_above_fold
- Look : table comparative "Brand X vs us" directement en hero, avec WINNER badge.
- Quand : smart picker quand
comparison_items.length >= 4ET archetype ≠ {luxury, wellness, y2k, editorial}. - Code :
ai-landing-primitives.js:155.
video_placeholder
- Look : zone vidéo 16:9 avec play button SVG, headline + sub à côté ou dessous.
- Quand : rarement choisi par les archetypes default. Override via JSON DNA si tu veux un VSL (Video Sales Letter).
- Code :
ai-landing-primitives.js:188.
Groupe problem — 1 variant (always-on)
default
- Look : section avec un headline "Le problème" + 3-4 bullet points en cards.
- Quand : présent par défaut sauf pour
luxuryety2k(qui retirent la section problem de l'ordre). - Code :
ai-landing-primitives.js:226.
Groupe solution — 1 variant (always-on)
default
- Look : section avec headline + 3-4 features en cards avec icônes, alignement variable selon DNA.
- Quand : présent dans TOUS les archetypes (c'est le pitch).
- Code :
ai-landing-primitives.js:253.
Groupe social_proof — 5 variants
star_grid
- Look : grid 3-4 columns avec photos clients + 5-star rating + témoignage court.
- Quand :
tabloid,y2kdefaults. Trigger par smart picker dèstestimonials.length >= 5(sauf editorial/indie/luxury locked). - Code :
ai-landing-primitives.js:298.
logo_strip
- Look : bande horizontale de logos clients en grayscale.
- Quand :
linear_minimaldefault. Triggéré quand l'audience reconnaît les marques (B2B SaaS). En cold traffic le picker la remplace parmetric_blocks. - Code :
ai-landing-primitives.js:329.
quote_cards
- Look : 2-3 grands témoignages en cards avec quote marks décoratives, photo de l'auteur, titre + entreprise.
- Quand :
editorial,wellness,luxury,indie,retro,glassmorphismdefaults. La voix premium. - Code :
ai-landing-primitives.js:350.
metric_blocks
- Look : 3-4 chiffres énormes ("4.8/5", "12 000+", "97 %") + label en dessous.
- Quand :
brutalist,dark_tech,scientificdefaults. Trigger par smart picker en cold traffic si default = logo_strip ou mixed. - Code :
ai-landing-primitives.js:384.
mixed
- Look : combo — un metric_block géant + une rangée de mini-quotes.
- Quand : rare. Choisi explicitement via override DNA quand tu veux le best of both worlds.
- Code :
ai-landing-primitives.js:424.
Groupe objections — 3 variants
faq_accordion
- Look : 4-6 questions avec accordéon CSS-only (
<details>/<summary>), accent sur l'open. - Quand :
linear_minimal,editorial,wellness,luxury,scientific,retro,glassmorphismdefaults. La voix corporate / informative. - Code :
ai-landing-primitives.js:460.
mythbusters
- Look : grid de cards "❌ Mythe → ✅ Réalité" en deux colonnes par item.
- Quand :
indie,y2kdefaults. La voix conversationnelle. - Code :
ai-landing-primitives.js:488.
side_by_side
- Look : 2 colonnes "Avant ❌ / Après ✅" alignées, comparaison de slogans courts.
- Quand :
brutalist,dark_tech,tabloiddefaults. Voix punch. - Code :
ai-landing-primitives.js:519.
Groupe urgency — 5 variants
countdown
- Look : compte à rebours JS (jours:heures:minutes:secondes), background coloré, sous-titre.
- Quand :
tabloiddefault. Smart picker n'override pas (locked). - Code :
ai-landing-primitives.js:554.
scarcity_count
- Look : message "Plus que X places / X pièces" avec animation pulse.
- Quand :
dark_techdefault. Trigger par smart picker en cold traffic si default = none ou embedded_inline (sauf wellness/luxury/editorial/indie/tabloid/y2k locked). - Code :
ai-landing-primitives.js:590.
banner
- Look : bande pleine largeur en haut de page, message court, CTA inline.
- Quand :
brutalist,tabloid(sur urgency_top),y2kdefaults. - Code :
ai-landing-primitives.js:610.
embedded_inline
- Look : petit badge inline ("Offre limitée jusqu'à dimanche") posé entre 2 sections.
- Quand :
editorial,wellness,dark_tech(sur urgency_inline),scientific,retro,glassmorphismdefaults. La pression douce. - Code :
ai-landing-primitives.js:620.
none
- Look : rien (la section est skip).
- Quand :
linear_minimal,luxury,indiedefaults — les voix anti-pressure. - Code :
ai-landing-primitives.js:none → returns ''.
Groupe guarantee — 4 variants
badge
- Look : badge circulaire avec icône bouclier et texte "Garantie X jours".
- Quand :
linear_minimal,dark_tech,scientific,y2k,glassmorphismdefaults. - Code :
ai-landing-primitives.js:640.
seal
- Look : seal officiel avec ornements gold/ruban, plus formel que badge.
- Quand :
wellness,luxury,retrodefaults. Voix premium. - Code :
ai-landing-primitives.js:659.
testimonial_quote
- Look : grand pull-quote d'un client qui mentionne la garantie, photo de l'auteur.
- Quand :
editorial,indiedefaults. La preuve par le pair. - Code :
ai-landing-primitives.js:691.
bold_text
- Look : statement géant en uppercase, "Si ça ne marche pas, on rembourse." pas de fioriture.
- Quand :
brutalist,tabloiddefaults. Voix punch. - Code :
ai-landing-primitives.js:713.
Groupe pricing — 4 variants
anchored_strikethrough
- Look : prix barré (
$199) → prix actuel ($49), badge "-75 %". - Quand :
brutalist,tabloiddefaults. Trigger en hot traffic si default = single_box (sauf luxury locked). - Code :
ai-landing-primitives.js:735.
tiered_cards
- Look : 3 cards (Starter / Pro / Enterprise) avec popular badge sur la card du milieu.
- Quand :
dark_tech,y2k,glassmorphismdefaults. SaaS-style. - Code :
ai-landing-primitives.js:766.
single_box
- Look : une seule card prix avec features bullet + CTA, simple et direct.
- Quand :
linear_minimal,editorial,wellness,indie,scientific,retrodefaults. - Code :
ai-landing-primitives.js:815.
hidden_until_cta
- Look : pas de prix affiché. Le CTA dit "Demander un prix" ou "Réserver".
- Quand :
luxurydefault uniquement. Locked par smart picker. - Code :
ai-landing-primitives.js:832.
Groupe comparison — 1 variant (conditional)
default
- Look : table 3-4 colonnes (Brand X / Brand Y / Us), checkmarks + crosses, WINNER badge.
- Quand : présent SEULEMENT si
copy.comparison_items.length > 0. Sinon la section est skip. - Code :
ai-landing-primitives.js:855.
Groupe faq — 1 variant (always-on quand archetype l'inclut)
default
- Look : accordéon FAQ classique (différent de
objections.faq_accordionqui est plus court et tactique). - Quand : présent dans
linear_minimal,editorial,wellness,scientific,retro,indie. - Code :
ai-landing-primitives.js:895.
Groupe final_cta — 1 variant (always-on)
default
- Look : section pleine largeur avec headline accrocheur, sub, gros CTA centré, optionnel trust badges en bas.
- Quand : présent dans TOUS les archetypes — c'est la dernière demande.
- Code :
ai-landing-primitives.js:929.
Groupe footer — 4 variants
minimal_legal
- Look : 1-2 lignes (copyright, links Privacy/Terms), texte petit en gris.
- Quand :
linear_minimal,editorial,wellness,dark_tech,glassmorphismdefaults. - Code :
ai-landing-primitives.js:957.
full_sitemap
- Look : footer 4-5 colonnes (Product, Company, Resources, Legal, Social), links en grid.
- Quand :
scientificdefault. Voix corporate. - Code :
ai-landing-primitives.js:984.
brand_repeat
- Look : logo de la marque en grand, slogan, copyright. Pas de links.
- Quand :
brutalist,luxury,indie,tabloid,y2k,retrodefaults. Signature visuelle. - Code :
ai-landing-primitives.js:1032.
none
- Look : rien. Pas même un copyright (techniquement non-recommandé légalement, à éviter).
- Quand : jamais default. Override DNA explicite si tu veux.
Smart Picker (F1) — recap
Source : ai-landing-dna.js:702 (smartPickPrimitives).
Inputs: traffic_temperature ∈ {cold, warm, hot}
copy.testimonials.length
copy.comparison_items.length
dna.aesthetic_archetype
Pour chaque archetype, certains slots sont LOCKED → jamais override.
Cold:
- si urgency ∈ {none, embedded_inline} → set scarcity_count (UNLESS locked)
- si social_proof ∈ {logo_strip, mixed} → set metric_blocks (UNLESS locked)
Hot:
- si hero == split_image → set centered_text (UNLESS locked)
- si pricing == single_box → set anchored_strikethrough (UNLESS locked)
Warm: (rien)
Copy shape:
- testimonials.length >= 5 → set social_proof = star_grid (UNLESS locked)
- testimonials.length >= 7 ET cold ET arch != {wellness, luxury} → set hero = testimonial_above_fold
- comparison_items.length >= 4 ET arch != {luxury, wellness, y2k, editorial} → set hero = comparison_above_fold
Voir la matrice des locks dans archetypes — tableau récapitulatif des LOCKS.
Quelle primitive par archetype (matrice)
| Archetype | hero | social_proof | objections | urgency | guarantee | pricing | footer |
|---|---|---|---|---|---|---|---|
| linear_minimal | split_image | logo_strip | faq_accordion | none | badge | single_box | minimal_legal |
| brutalist | centered_text | metric_blocks | side_by_side | banner | bold_text | anchored_strikethrough | brand_repeat |
| editorial | centered_text | quote_cards | faq_accordion | embedded_inline | testimonial_quote | single_box | minimal_legal |
| dark_tech | centered_text | metric_blocks | side_by_side | scarcity_count | badge | tiered_cards | minimal_legal |
| wellness | centered_text | quote_cards | faq_accordion | embedded_inline | seal | single_box | minimal_legal |
| tabloid | centered_text | star_grid | side_by_side | countdown | bold_text | anchored_strikethrough | minimal_legal |
| luxury | centered_text | quote_cards | faq_accordion | none | seal | hidden_until_cta | brand_repeat |
| indie | centered_text | quote_cards | mythbusters | none | testimonial_quote | single_box | brand_repeat |
| scientific | split_image | metric_blocks | faq_accordion | embedded_inline | badge | single_box | full_sitemap |
| y2k | centered_text | star_grid | mythbusters | banner | badge | tiered_cards | brand_repeat |
| retro | split_image | quote_cards | faq_accordion | embedded_inline | seal | single_box | brand_repeat |
| glassmorphism | centered_text | quote_cards | faq_accordion | embedded_inline | badge | tiered_cards | minimal_legal |
Comment override manuellement
Tu peux émettre une DNA custom en passant directement le payload via les params du LLM, mais la pratique standard est :
- Génère avec
generate_ai_landing. - Inspecte
meta.design_dna.primitive_selection. - Update via
update_landingen patchant lemetadirectement (le moteur respecte les overrides viarerender_landing_from_meta).
⚠️ Une override qui ignore le lock peut produire un résultat hors-brand. Réfléchis avant.
Erreurs courantes
- Primitive inconnue dans DNA : le renderer fallback sur la default (
centered_textpour hero,quote_cardspour social, etc.). Pas d'erreur, mais pas non plus le résultat espéré. copy.testimonialsmanquant ou vide :star_gridrenvoie une chaîne vide. Pas d'erreur, juste pas de social proof.- Comparison sans
comparison_items: la section comparison est skip silencieusement. Si tu veux la voir, fournir un arraycomparison_itemsdans le copy. - Confusion
objections.faq_accordionvsfaq.default: deux sections différentes ! L'objections est plus court et tactique (3-5 Qs ciblées). La FAQ est plus longue (5-10 Qs informatives). - Override
pricing: tiered_cardssur luxury : le smart picker locked, mais si tu force via DNA explicite, ça override. Casse l'identité brand.
Voir aussi
- Archetypes — qui pick quelle primitive par défaut
- AI Builder — comment ces primitives sont assemblées
- Code source :
ai-landing-primitives.js(35 fonctions),ai-landing-renderer-v2.js(assembly)