/* at_placement — feuille du NOYAU, commune au front et à l'aperçu de l'éditeur.
   Écrite par le pont (Placement_Bridge en PHP, atgf-placement-bridge.js dans l'aperçu), qui
   pose des classes GÉNÉRIQUES sur toute cible : `.atp-host` (+ `--flow` | `--grid`
   [`--balanced`] [`--dense`]) sur le conteneur, `.atp-item` (+ `--ideal`, `--hidden`) sur
   chaque élément. Audit : docs/audit-at-placement.md (lot 2).

   Les formules lisent trois variables d'ADAPTATEUR, que chaque cible fait pointer sur les
   siennes (le builder : attps-builder/assets/css/atb-placement.css ; la cible générique :
   plus bas) :
     --atp-w   poids effectif de l'élément (/12)      --atp-mw  largeur mini de l'élément
     --atp-gap écart des colonnes du conteneur
   K = garder les poids (`--atp-keep`, 0/1), F = pleine ligne (`--atp-full`, 0/1). Avec
   K = F = 0, la formule est EXACTEMENT celle, historique, des colonnes du builder.

   Spécificités (à préserver, elles battent les règles historiques du builder) :
   colonnes (0,3,0), idéalement (0,4,0), voisins d'un idéalement (0,6,0), masqué (0,3,0),
   grille (0,2,0) / (0,3,0). */

/* --- Variables propres à un élément : jamais héritées ------------------------------
   Un conteneur imbriqué dans un élément ne reçoit ni sa place en grille, ni sa pleine
   ligne, ni son poids (audit 1.8 : grille dans une case de grille empilée). */
@property --atp-full { syntax: '*'; inherits: false; }
@property --atp-span-c { syntax: '*'; inherits: false; }
@property --atp-span-r { syntax: '*'; inherits: false; }
@property --atp-start-c { syntax: '*'; inherits: false; }
@property --atp-start-r { syntax: '*'; inherits: false; }
@property --atp-aspect { syntax: '*'; inherits: false; }
@property --atp-rank { syntax: '*'; inherits: false; }
@property --atp-count { syntax: '*'; inherits: false; }
@property --atp-w { syntax: '*'; inherits: false; }
@property --atp-mw { syntax: '*'; inherits: false; }
@property --atp-item-align { syntax: '*'; inherits: false; }

/* --- Variables du conteneur : lues par ses éléments, remises à zéro à chaque conteneur
   placé (un conteneur imbriqué repart de ses propres réglages). */
.atp-host {
    --atp-keep: 0;
    --atp-tracks: initial;
    --atp-cols: initial;
    --atp-row: initial;
    --atp-n: initial;
    --atp-min: initial;
}

/* --- Colonnes (flex) : formule mixée ------------------------------------------------ */
.atp-host.atp-host--flow > .atp-item {
    flex-grow: calc(var(--atp-w, 6) * (1 - var(--atp-keep, 0)) * (1 - var(--atp-full, 0)));
    flex-shrink: calc(1 - var(--atp-full, 0));
    flex-basis: calc(((clamp(var(--atp-mw, 250px), calc((100% / 12) * var(--atp-w, 6)), 100%) - var(--atp-gap, 0rem)) * (1 - var(--atp-keep, 0)) + clamp(min(100%, var(--atp-mw, 250px)), calc((100% / 12) * var(--atp-w, 6) - var(--atp-gap, 0rem) * (12 - var(--atp-w, 6)) / 12), 100%) * var(--atp-keep, 0)) * (1 - var(--atp-full, 0)) + 100% * var(--atp-full, 0));
    max-width: 100%;
}

/* « Idéalement » : base au mini, reçoit en priorité la place libre ; en gardant les
   poids, grandit de son mini jusqu'à sa travée, pas au-delà ; en pleine ligne, 100 %. */
.atp-host.atp-host--flow > .atp-item.atp-item--ideal {
    flex-grow: calc((var(--atp-w, 6) * 1000 * (1 - var(--atp-keep, 0)) + var(--atp-keep, 0)) * (1 - var(--atp-full, 0)));
    flex-basis: calc(min(100%, var(--atp-mw, 250px)) * var(--atp-keep, 0) * (1 - var(--atp-full, 0)) + 100% * var(--atp-full, 0));
    max-width: calc(100% - (100% - calc((100% / 12) * var(--atp-w, 6) - var(--atp-gap, 0rem) * (12 - var(--atp-w, 6)) / 12)) * var(--atp-keep, 0) * (1 - var(--atp-full, 0)));
}

/* Voisins d'un « idéalement » (visible) : part EXACTE des écarts ; une pleine ligne
   reste pleine (audit 1.9). */
.atp-host.atp-host--flow:has(> .atp-item--ideal:not(.atp-item--hidden)) > .atp-item:not(.atp-item--ideal) {
    flex-basis: calc(clamp(var(--atp-mw, 250px), calc((100% / 12) * var(--atp-w, 6) - var(--atp-gap, 0rem) * (12 - var(--atp-w, 6)) / 12), 100%) * (1 - var(--atp-full, 0)) + 100% * var(--atp-full, 0));
}

/* --- Masqué (un point de rupture peut le réafficher : `display` de la cible dans sa règle) --- */
.atp-host .atp-item.atp-item--hidden {
    display: none;
}

/* --- Grille ----------------------------------------------------------------------
   Fixe : pistes (`--atp-cols`, jetons fr / px / minmax…), départ et span par élément,
   pleine ligne = colonne 1 sur 12 (bornée aux pistes), rangées auto / égales / au
   moins / fixes / au ratio. Équilibrée : au plus N colonnes, une de moins sous le mini. */
.atp-host.atp-host--grid {
    display: grid;
    grid-template-columns: var(--atp-cols, repeat(var(--atp-tracks, 3), minmax(0, 1fr)));
    grid-auto-rows: var(--atp-row, auto);
    align-items: stretch;
}

.atp-host.atp-host--grid.atp-host--balanced {
    grid-template-columns: repeat(auto-fit, minmax(min(100%, max(var(--atp-min, 250px), calc((100% - (var(--atp-n, 3) - 1) * var(--atp-gap, 0rem)) / var(--atp-n, 3)))), 1fr));
}

.atp-host.atp-host--grid.atp-host--dense {
    grid-auto-flow: row dense;
}

.atp-host.atp-host--grid > .atp-item {
    flex: none;
    min-width: 0;
    max-width: none;
    grid-column: var(--atp-start-c, auto) / span min(var(--atp-span-c, 1), var(--atp-tracks, 3));
    grid-row: var(--atp-start-r, auto) / span var(--atp-span-r, 1);
    aspect-ratio: var(--atp-aspect, auto);
}

.atp-host.atp-host--grid.atp-host--balanced > .atp-item {
    grid-column: auto;
    grid-row: auto;
    aspect-ratio: auto;
}

/* --- Cible générique `item` : n'importe quelle liste générée ---------------------------
   `.atp-list` > `.atp-list__item`, posées par le pont ; variables d'élément `--atp-item-*`
   (poids, mini, alignement), écart `--atp-gap`. Le socle flex n'est pas fourni par un
   thème : il est ici. */
.atp-list.atp-host {
    box-sizing: border-box;
    column-gap: var(--atp-gap, 0rem);
    row-gap: var(--atp-gap, 0rem);
}

.atp-list.atp-host--flow {
    display: flex;
    flex-wrap: wrap;
    align-content: flex-start;
}

.atp-list.atp-host > .atp-list__item {
    --atp-item-weight-eff: var(--atp-item-weight, 6);
    --atp-w: var(--atp-item-weight-eff, 6);
    --atp-mw: var(--atp-item-min-width, 250px);
    box-sizing: border-box;
    align-self: var(--atp-item-align, auto);
    min-width: min(100%, var(--atp-item-min-width, 250px));
}
