Tuto Site
Position stack / pop
pos n’est pas un offset CSS universel. C’est quatre insets Flutter Positioned.left/right/top/bottom. Lu seulement si parent id_page_stack (inStack) ou view pop: 1 racine. Widget : PositionedWidget → AnimatedPositioned. Mount : onion.dart si popView || inStack — sinon pos est mort.
Qui monte PositionedWidget
| Cas | Flag | Zone % / −1 |
|---|---|---|
| Overlay page | ShowPageSite popView: true (pop: 1 racine) | _zoneWidth = forceWidth. _zoneHeight = hauteur mesurée de la page |
| Enfant stack CMS | parent id_page_stack passe inStack: true | zone = LayoutBuilder du folder (après SizeGate + pad parent) |
| Flow wrap/row/column | aucun | pos ignoré |
pop: 1 et uuid_folder rempli : le view n’est pas racine → jamais dans les zones pop → pos mort. Overlay = racine uuid_folder: "". Layer 0 + pop = PopDown ; layer > 0 + pop = PopUp (live souvent layer: 1).
JSON — Coordinate, défaut px, sans fallback e→i
{
"pos": {
"l": {
"iL": 16, "eL": 16, "iTL": "px", "eTL": "px",
"iT": 16, "eT": 16, "iTT": "px", "eTT": "px"
}
}
}
Init vs enable — loi production n°1
ViewDataSize : e absent → i. ViewDataCoordinate.getEnable : retourne enableLeft tel quel, sans copier initLeft.
PositionedWidget : enablePos = !(timeBeforeOpen || timeStartClose). Si time_start et time_end == 0 → enablePos true tout de suite → clés e* seulement.
| Ticker | Quelle clé JSON |
|---|---|
time_start et time_end == 0 | e* seulement |
avant time_start | i* |
| entre start et end | e* |
après time_end | i* (souvent hide) |
time_start, PositionedWidget lit e* seulement. iL:16 seul → left null → le view se cale sur direction_align du stack, pas à 16 px. Toujours dupliquer i* et e*.Null / 0 / deux côtés — contrat Flutter
| Côtés H | Largeur du slot Positioned |
|---|---|
| left ou right seul (l’autre null) | = largeur du child |
| left et right non-null | = zoneW - left - right (étire, ignore width du view) |
| left et right null | child hug, posé selon Stack.alignment (direction_align) |
- Fill : les 4 côtés à
0→ le slot = tout le stack. Ne pas fill pour un bouton 200 px en bas-centre :center: 1+iB: 24seulement. - Coin :
iT: 16, iL: 16uniquement (pas iB/iR) → child garde sa boîte. - Bandeau bas stretch :
iL: 0, iR: 0, iB: 0(top null) +heightpx. - Width JSON écrasé par left+right.
width: 200pxETiL: 0, iR: 0= stretch, pas 200 px.
Sentinelle -1 — hors écran = -sizeInit
Ce n’est pas le <0 des sizes (100 % zone). pos.iL: -1 → posLeft = -widthInit (un cran pile à gauche). Idem top → -heightInit. Un pos.iL: -2 n’est pas hors écran : c’est −2 px.
"pos": {
"l": {
"iT": -1, "eT": 40,
"iTT": "px", "eTT": "px"
}
},
"time_start": 200,
"time": 600,
"time_end": 0
0–200 ms : top = -heightInit (snap). ≥ 200 ms : top = 40, duration = 600 ms → slide. Pas de ticker : -1 init seul n’est jamais lu. Hide statique : "eT": -1.
center (ViewDataInt, pas pos)
Si center.auto(enable) == 1 → left = right = (zoneW - widthInit) / 2. Écrase pos left et right. i: 1 sans e: 1 + pas de ticker → pas centré.
"center": { "l": { "i": 1, "e": 1 } },
"pos": { "l": { "iB": 24, "eB": 24, "iTB": "px", "eTB": "px" } },
"width": { "l": { "i": 200, "iT": "px" } }
Bouton 200 px, centré H, 24 px du bas. Ne pas ajouter iL/iR.
Recettes
Badge 16 px, coin haut-droit :
"uuid_folder": "<STACK>",
"width": { "l": { "i": 48, "iT": "px" } },
"height": { "l": { "i": 48, "iT": "px" } },
"pos": {
"l": {
"iT": 16, "eT": 16, "iTT": "px", "eTT": "px",
"iR": 16, "eR": 16, "iTR": "px", "eTR": "px"
}
}
Overlay page sticky bas (pop) — uuid_folder vide :
"pop": 1, "layer": 1, "uuid_folder": "",
"center": { "l": { "i": 1, "e": 1 } },
"pos": { "l": { "iB": 16, "eB": 16, "iTB": "px", "eTB": "px" } }
10 % depuis la gauche du parent stack :
"pos": { "l": { "iL": 10, "eL": 10, "iTL": "%", "eTL": "%" } }
dx/dy ne passent pas par PositionedWidget (consommateur = animated_forward). pad est dans l’onion, après Positioned : le slot pos est la boîte externe.
iL:16 → eL null → left null → PAS 16 px. iL+eL:0 et iR+eR:0 → stretch, width JSON ignoré. pop:1 + uuid_folder set → pas racine, pos mort. % vertical sur stack height: 0 = instable.