Tuto Site
Ricetta JSON
JSON autonome, cohérent, peignable par ShowPageSite. Remplacer tous les <…> par des uuid v7 uniques. Réutiliser les uuid style du tenant (data_api_big_style.json). Intention : back fill + wrap racine 100 % + column 60/90 (titre, image deco, CTA) + phrase wrap_text optionnelle.
1. Route + Page + Back + Action
{
"p_route": [{
"id": 0, "odr": 1,
"uuid": "<R_HOME>",
"enable": 1, "menu": 1, "gen": 0, "folder": 0, "push": 0,
"uuid_folder": "", "origin": "", "ref": "",
"transition": "fade",
"name": { "fr": "accueil", "en": "home", "nl": "", "es": "", "it": "", "pt": "", "de": "" },
"list_page": ["<P_HOME>"],
"meta": {}, "pdf": {}
}],
"p_page": [{
"id": 0, "odr": 1,
"uuid": "<P_HOME>",
"enable": 1, "gen": 0, "folder": 0,
"type": "", "link": "", "uuid_link": "", "uuid_folder": "", "origin": "", "ref": "",
"name": { "fr": "home", "en": "home", "nl": "", "es": "", "it": "", "pt": "", "de": "" },
"width": 0, "height": 0,
"background": "<B_HOME>",
"image": {}
}],
"p_back": [{
"id": 0, "odr": 1,
"uuid": "<B_HOME>",
"uuid_page": "<P_HOME>",
"uuid_theme": "<THEME_SITE>",
"uuid_gradient": "",
"type": "", "origin": "",
"color": [], "color_dark": [],
"height_desktop": -1, "height_mobile": -1,
"height_image_d": 0, "fit_image_d": 2,
"height_image_m": 0, "fit_image_m": 2,
"height_images_d": 0, "fit_images_d": 2,
"height_images_m": 0, "fit_images_m": 2,
"height_video_d": 0, "fit_video_d": 2,
"height_video_m": 0, "fit_video_m": 2,
"image": "", "image_m": "", "images": [], "images_m": [],
"video": "", "video_m": "",
"video_auto": 1, "video_btn": 0, "video_elapsed": 0,
"test": []
}],
"p_action": [{
"id": 0, "odr": 1,
"uuid": "<A_CONTACT>",
"name": "go-contact",
"enable": 1,
"type": "018ef76b-29d7-7892-b912-8dfa0c23f5f7",
"data": "<R_CONTACT>",
"list": []
}]
}
<R_CONTACT> doit exister (route déjà en base, ou émise dans le même batch).
2. Views (table plate)
Commun : uuid_page: <P_HOME>, enable:1 desktop:1 mobile:1 layer:1 pop:0, type_m:"".
2.1 Wrap racine
{
"id": 0, "odr": 1, "uuid": "<V_WRAP>",
"uuid_page": "<P_HOME>", "uuid_folder": "",
"layer": 1, "pop": 0,
"type": "bca54f56-4e50-11ee-be56-0242ac120002",
"type_m": "",
"width": { "l": { "i": 100, "iT": "%" } },
"height": { "l": { "i": 0 } },
"axis_align": { "l": { "i": 2 } },
"enable": 1, "desktop": 1, "mobile": 1
}
2.2 Column 60/90
{
"id": 0, "odr": 1, "uuid": "<V_COL>",
"uuid_page": "<P_HOME>", "uuid_folder": "<V_WRAP>",
"layer": 1, "pop": 0,
"type": "aee08b10-4e50-11ee-be56-0242ac120002",
"width": { "l": { "i": 60, "iT": "%" }, "s": { "i": 90, "iT": "%" } },
"height": { "l": { "i": 0 } },
"axis_align": { "l": { "i": 0 } },
"cross_align": { "l": { "i": 2 } },
"pad": {
"l": { "iT": 32, "iB": 32, "iL": 0, "iR": 0, "iTT": "px", "iTB": "px" },
"s": { "iT": 16, "iB": 16, "iTT": "px", "iTB": "px" }
},
"uuid_theme": { "l": { "i": "<THEME_SITE>" } },
"enable": 1, "desktop": 1, "mobile": 1
}
2.3 Titre odr 1
{
"id": 0, "odr": 1, "uuid": "<V_TITLE>",
"uuid_page": "<P_HOME>", "uuid_folder": "<V_COL>",
"type": "8d669b32-e168-11ed-b5ea-0242ac120002",
"width": { "l": { "i": 100, "iT": "%" } },
"height": { "l": { "i": 0 } },
"title": {
"fr": "L’atelier qui digitalise votre métier",
"en": "The workshop that digitises your trade",
"nl": "", "es": "", "it": "", "pt": "", "de": ""
},
"style_title": "<STYLE_H1>",
"pad": { "l": { "iB": 12, "eB": 12, "iTB": "px", "eTB": "px" } },
"enable": 1, "desktop": 1, "mobile": 1, "layer": 1, "pop": 0
}
2.4 Image deco odr 2
{
"id": 0, "odr": 2, "uuid": "<V_IMG>",
"uuid_page": "<P_HOME>", "uuid_folder": "<V_COL>",
"type": "01965644-fa21-7cf9-9204-f71b2d3dd60d",
"width": { "l": { "i": 100, "iT": "%" } },
"height": { "l": { "i": 1.2, "iT": "ratio" } },
"image": "<FILE_HERO>",
"box_fit": 2, "box_fit_m": 2,
"radius": {
"l": {
"iTL": 16, "iTR": 16, "iBL": 16, "iBR": 16,
"eTL": 16, "eTR": 16, "eBL": 16, "eBR": 16,
"iTTL": "px", "iTTR": "px", "iTBL": "px", "iTBR": "px",
"eTTL": "px", "eTTR": "px", "eTBL": "px", "eTBR": "px"
}
},
"pad": { "l": { "iB": 20, "eB": 20, "iTB": "px", "eTB": "px" } },
"enable": 1, "desktop": 1, "mobile": 1, "layer": 1, "pop": 0
}
2.5 Bouton odr 3 — height 48 / 44 px, pas de radius JSON
{
"id": 0, "odr": 3, "uuid": "<V_BTN>",
"uuid_page": "<P_HOME>", "uuid_folder": "<V_COL>",
"type": "a0dc89fe-5b86-4a9d-a8b6-d3e2f07b7757",
"width": { "l": { "i": 220, "iT": "px" }, "s": { "i": 160, "iT": "px" } },
"height": { "l": { "i": 48, "iT": "px" }, "s": { "i": 44, "iT": "px" } },
"title": {
"fr": "Nous contacter",
"en": "Contact us",
"nl": "", "es": "", "it": "", "pt": "", "de": ""
},
"style_title": "<STYLE_BTN>",
"uuid_theme": { "l": { "i": "<THEME_CTA>" } },
"uuid_action": ["<A_CONTACT>"],
"enable": 1, "desktop": 1, "mobile": 1, "layer": 1, "pop": 0
}
2.6 Phrase highlight — wrap_text
{
"uuid": "<V_PHRASE>",
"uuid_page": "<P_HOME>",
"uuid_folder": "<V_COL>",
"type": "94ba3c60-6c02-4ecb-8e3d-77a8f7516e91",
"width": { "l": { "i": 100, "iT": "%" } },
"height": { "l": { "i": 0 } },
"axis_align": { "l": { "i": 2 }, "s": { "i": 0 } },
"enable": 1, "desktop": 1, "mobile": 1, "layer": 1, "pop": 0
}
Enfants odr 1 "Du " / 2 "terrain" + gradient / 3 " à la " / 4 "facture" + gradient — même uuid_folder: "<V_PHRASE>". Espaces dans le title. axis_align.i = 2 → phrase centrée (TextAlign, pas spaceBetween).
T0–T18 — boucle obligatoire
| T | Contrôle |
|---|---|
| T0 | Arbre : 1 racine flow, 0 orphelin, 0 cycle, A_CONTACT.data = uuid route |
| T1 | Nested % desktop : toile 1200, wrap 100 % = 1200, col 60 % = 720, titre 100 % = 720 |
| T2 | Nested % mobile : toile 400, col s 90 % = 360 (recette). Si 80 % → 320, enfant 50 % = 160 |
| T3 | Pad réduit la zone enfant (5 %+5 % sur 720 → inner 648) |
| T4 | Ratio image : 720 / 1.2 = 600. height: 0 sur image sizeFixe interdit |
| T5 | Bouton 48/44 px. Ne pas copier ratio 0.7 (≈ 300 px) |
| T6 | type_m: "" → fallback type. Type inconnu → shrink |
| T7 | pos dans column → ignoré |
| T8 | pos.iL = -1 → left = -widthInit (hide) |
| T9 | center.i = 1, width 200, zone 1000 → left = right = 400 |
| T10 | Copy rewrite : hôte impose la boîte, title overlay si non vide |
| T11 | action_link + data uuid route. action_open_page = no-op |
| T12 | View uuid_theme = objet. style_title = string. Back theme = string |
| T13 | Visibilité AND. loc_text: "en" + UI en → absent |
| T14 | wrap_text odr 6–12, espaces dans title, gradient sur 7/9/11 |
| T15 | axis_align 3 wrap_text = left, pas spaceBetween. Stack défaut 5 ≠ gradient 4 |
| T16 | box_fit 0–6 dans sizeFixe. image_pos 1 = gauche |
| T17 | pos sans e* = mort. left+right = stretch. pop + folder rempli = pos mort |
| T18 | radius sur id_button = Stadium inchangé. radius sur id_image = pas de clip (deco) |
T17 : pos sans
e* = mort. T18 : radius sur id_button = Stadium inchangé. Vert : tests 18/18 — JSON peignable.