@cadriciel/ui 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -145,6 +145,7 @@ declare class CadIconRegistry {
145
145
  /**
146
146
  * <cad-icon name="search" [size]="16" />
147
147
  * SVG inline, trait 2 px, hérite `currentColor`. `spin` (animation), `filled` (icône pleine), `flip`, `rotate`, `title` (info-bulle native).
148
+ * @atelier icone=sparkles largeur=1 hauteur=1
148
149
  */
149
150
  declare class CadIconComponent {
150
151
  private readonly registry;
@@ -178,6 +179,7 @@ declare class CadIconComponent {
178
179
  * - Directive-composant appliquée sur un vrai <button>/<a> : sémantique native, focus, formulaire.
179
180
  * - Signals inputs, OnPush, classes hôtes reflétées (stylables sans ::ng-deep).
180
181
  * - Ne lit QUE les tokens --cad-* (thème clair/sombre transparent).
182
+ * @atelier icone=square largeur=2 hauteur=1 contenu=Bouton
181
183
  */
182
184
  declare class CadButtonComponent {
183
185
  readonly el: ElementRef<HTMLElement>;
@@ -208,6 +210,7 @@ declare class CadButtonComponent {
208
210
  * Accole les boutons (radius aux extrémités, bordures fusionnées). Sans `attached`, simple groupe espacé (gap).
209
211
  * Remplace p-buttonGroup. Le focus reste visible (z-index sur le bouton focusé).
210
212
  * `selectable="single|multiple"` + `[(value)]` : les boutons portant `value` deviennent des options (état enfoncé, aria-pressed).
213
+ * @atelier icone=columns-3 hauteur=1 conteneur=direct ajustement=naturel
211
214
  */
212
215
  declare class CadButtonGroupComponent {
213
216
  readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
@@ -222,6 +225,15 @@ declare class CadButtonGroupComponent {
222
225
  readonly value: _angular_core.ModelSignal<unknown>;
223
226
  readonly changed: _angular_core.OutputEmitterRef<unknown>;
224
227
  private readonly buttons;
228
+ /**
229
+ * Enfants créés DYNAMIQUEMENT (atelier CadGrid, composition programmatique) : une
230
+ * requête de contenu ne voit JAMAIS un composant né de `createComponent`, donc sans
231
+ * ce registre le groupe serait sourd à leurs clics. Contrat d'accueil duck-typé —
232
+ * l'appelant fournit les instances, le groupe filtre ce qui n'est pas un bouton.
233
+ */
234
+ private readonly enfantsDynamiques;
235
+ enregistrerEnfants(instances: unknown[]): void;
236
+ private readonly tousBoutons;
225
237
  constructor();
226
238
  protected onClick(e: Event): void;
227
239
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadButtonGroupComponent, never>;
@@ -258,6 +270,7 @@ declare class CadInputDirective {
258
270
  *
259
271
  * Le focus se pose sur la BOÎTE (`.cad-field__box:focus-within`) — jamais sur un morceau (règle SZU 17/08).
260
272
  * L'erreur remplace l'aide quand elle est présente. `label` lié au contrôle via `for`.
273
+ * @atelier icone=text-cursor-input largeur=4 hauteur=1 pose-label=Champ
261
274
  */
262
275
  declare class CadFieldComponent {
263
276
  readonly label: _angular_core.InputSignal<string>;
@@ -283,6 +296,7 @@ declare class CadFieldComponent {
283
296
  /**
284
297
  * <cad-number [(value)]="port" [min]="1" [max]="65535" [step]="1" suffix=" ms" [decimals]="0" showButtons/>
285
298
  * CVA<number|null>. Clavier : ↑/↓ (± step), Shift+↑/↓ (× 10), Home/End (min/max). Locale via `locale`.
299
+ * @atelier icone=hash largeur=3 hauteur=1
286
300
  */
287
301
  declare class CadNumberComponent extends CadValueAccessor<number> {
288
302
  readonly min: _angular_core.InputSignalWithTransform<number | null, unknown>;
@@ -320,6 +334,7 @@ declare class CadNumberComponent extends CadValueAccessor<number> {
320
334
  /**
321
335
  * <cad-password [(value)]="pwd" placeholder="…" toggleMask [feedback]="true" />
322
336
  * CVA<string>. Bouton œil (afficher/masquer), jauge de robustesse optionnelle (`feedback`), `autocomplete`.
337
+ * @atelier icone=lock largeur=3 hauteur=1
323
338
  */
324
339
  declare class CadPasswordComponent extends CadValueAccessor<string> {
325
340
  readonly placeholder: _angular_core.InputSignal<string>;
@@ -347,6 +362,7 @@ type CadSliderSeverity = 'primary' | 'success' | 'warning' | 'danger' | 'info';
347
362
  * <cad-slider range [(value)]="[a,b]" [marks]="[0,25,50,75,100]"/>
348
363
  * CVA<number | [number, number]>. Remplace p-slider. Clavier ←→↑↓ (±step), PageUp/Down (±10 steps), Home/End, Shift = ×10.
349
364
  * `lazy` : `valueChange`/`changed` émis au relâchement seulement (`sliding` pendant le drag).
365
+ * @atelier icone=sliders-horizontal largeur=4 hauteur=1
350
366
  */
351
367
  declare class CadSliderComponent extends CadValueAccessor<CadSliderValue> {
352
368
  readonly min: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -449,6 +465,7 @@ declare const CAD_COLOR_PRESETS: string[];
449
465
  * <cad-colorpicker [(value)]="color" format="hex" alpha [presets]="[…]" inline/>
450
466
  * CVA<string>. Panneau : zone saturation/luminosité + barre de teinte (+ alpha), champs hex/r/g/b, palette, pipette (EyeDropper si dispo).
451
467
  * Clavier : flèches sur les poignées (Shift = ×10). Events `changed`, `opened`, `closed`.
468
+ * @atelier icone=palette largeur=3 hauteur=1
452
469
  */
453
470
  declare class CadColorpickerComponent extends CadValueAccessor<string> {
454
471
  readonly format: _angular_core.InputSignal<CadColorFormat>;
@@ -508,6 +525,7 @@ declare class CadColorpickerComponent extends CadValueAccessor<string> {
508
525
  /**
509
526
  * <cad-rating [(value)]="note" [max]="5" allowHalf clearable showValue severity="warning"/>
510
527
  * CVA<number>. Clavier ←→ (± 1 ou ½), Home/End, Suppr = 0 (clearable). `role="slider"`.
528
+ * @atelier ajustement=naturel icone=star largeur=2 hauteur=1 pose-value=3
511
529
  */
512
530
  declare class CadRatingComponent extends CadValueAccessor<number> {
513
531
  readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -612,6 +630,7 @@ declare class CadInplaceContentDirective {
612
630
  * <ng-template cadInplaceContent><input cadInput [(ngModel)]="name"></ng-template>
613
631
  * </cad-inplace>
614
632
  * Texte → éditeur au clic/Entrée ; Échap ou blur referme (`closeOnEscape`, `closeOnBlur`) ; crayon au survol.
633
+ * @atelier icone=pen-line hauteur=1
615
634
  */
616
635
  declare class CadInplaceComponent {
617
636
  readonly active: _angular_core.ModelSignal<boolean>;
@@ -635,6 +654,7 @@ declare class CadInplaceComponent {
635
654
  /**
636
655
  * <cad-switch [(value)]="on" label="Auto-park 7 j" size="sm" labelPosition="left" />
637
656
  * CVA<boolean>. Espace/Entrée basculent. `readonly` = visible mais figé.
657
+ * @atelier ajustement=naturel icone=toggle-right largeur=2 hauteur=1 pose-label=Interrupteur
638
658
  */
639
659
  declare class CadSwitchComponent extends CadValueAccessor<boolean> {
640
660
  readonly label: _angular_core.InputSignal<string>;
@@ -653,6 +673,7 @@ declare class CadSwitchComponent extends CadValueAccessor<boolean> {
653
673
  * <cad-checkbox [(value)]="checked" label="PostGIS" [indeterminate]="some" />
654
674
  * CVA<boolean>. `indeterminate` (two-way) = état visuel « partiel » ; un clic passe à coché.
655
675
  * `invalid` pour l'état d'erreur (ex. CGU non acceptées).
676
+ * @atelier ajustement=naturel icone=check-square largeur=2 hauteur=1 pose-label="Case à cocher"
656
677
  */
657
678
  declare class CadCheckboxComponent extends CadValueAccessor<boolean> {
658
679
  readonly label: _angular_core.InputSignal<string>;
@@ -673,20 +694,56 @@ declare class CadCheckboxComponent extends CadValueAccessor<boolean> {
673
694
  * <cad-radio value="session" label="Session" [disabled]="true" />
674
695
  * </cad-radio-group>
675
696
  * CVA<T> sur le GROUPE. Clavier : ←/→/↑/↓ déplacent la sélection (pattern WAI-ARIA radiogroup).
697
+ * @atelier icone=circle-dot largeur=2 conteneur=direct hauteur=4
676
698
  */
677
699
  declare class CadRadioGroupComponent<T = unknown> extends CadValueAccessor<T> {
678
700
  readonly orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
679
701
  readonly ariaLabel: _angular_core.InputSignal<string>;
680
702
  readonly name: _angular_core.InputSignal<string>;
681
703
  readonly changed: _angular_core.OutputEmitterRef<T>;
682
- readonly radios: _angular_core.Signal<readonly any[]>;
704
+ private readonly radiosProjetes;
705
+ /** Radios POSÉS hors gabarit, annoncés par `enregistrerEnfants`. */
706
+ private readonly radiosPoses;
707
+ readonly radios: _angular_core.Signal<any[]>;
708
+ /** Reçoit la LISTE COMPLÈTE des radios posés, et se RATTACHE à chacun. */
709
+ enregistrerEnfants(instances: unknown[]): void;
683
710
  select(v: T): void;
684
711
  protected onKey(e: KeyboardEvent): void;
685
712
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadRadioGroupComponent<any>, never>;
686
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadRadioGroupComponent<any>, "cad-radio-group", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, ["radios"], ["*"], true, never>;
713
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadRadioGroupComponent<any>, "cad-radio-group", never, { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, ["radiosProjetes"], ["*"], true, never>;
687
714
  }
715
+ /**
716
+ * Un choix du groupe : `<cad-radio [value]="'a'" label="Option A">`.
717
+ * @atelier icone=circle-dot conteneur=flux dans=cad-radio-group pose-label=Option
718
+ */
688
719
  declare class CadRadioComponent<T = unknown> {
689
- readonly group: CadRadioGroupComponent<T>;
720
+ /**
721
+ * Le groupe d'accueil — INJECTÉ dans un gabarit, POUSSÉ par l'hôte à la pose.
722
+ *
723
+ * ⚠️ OPTIONNEL depuis le 27/08, même correctif que `cad-accordion-panel` : l'injection
724
+ * obligatoire levait `NG0201` dès qu'on créait le bouton à la main, et `gen-catalog`
725
+ * classait `cad-radio` « contextuel » — il n'était pas posable. `cad-tab`, la pièce
726
+ * jumelle des onglets, n'injecte rien : elle est PASSIVE et son hôte la pilote. La
727
+ * divergence était d'écriture, pas de nature (SZU 27/08).
728
+ */
729
+ private readonly groupInjecte;
730
+ private readonly groupPose;
731
+ readonly group: _angular_core.Signal<CadRadioGroupComponent<T> | null>;
732
+ /** Le groupe s'annonce au bouton qu'il accueille. Cf. `atelier/atelier.pieces.ts`. */
733
+ rattacher(g: CadRadioGroupComponent<T>): void;
734
+ /** Sélectionne, si un groupe existe. Un radio solitaire ne prétend pas gérer un choix. */
735
+ protected choisir(): void;
736
+ /**
737
+ * La valeur que ce choix représente.
738
+ *
739
+ * DÉFAUT UNIQUE plutôt que `input.required` (27/08) — même précédent que
740
+ * `cad-accordion-panel`, qui se donne `cadId('cad-panel')`. Une entrée requise LÈVE
741
+ * dès qu'on instancie le composant sans la fournir : posé dans l'atelier, le radio
742
+ * mourait à la construction et le poseur l'écartait EN SILENCE (groupe vide, aucune
743
+ * erreur visible). Un défaut unique par instance rend un radio posé immédiatement
744
+ * cohérent — deux radios ne se retrouvent jamais cochés ensemble — et n'enlève rien à
745
+ * l'usage écrit, où l'on passe toujours une valeur.
746
+ */
690
747
  readonly value: _angular_core.InputSignal<T>;
691
748
  readonly label: _angular_core.InputSignal<string>;
692
749
  readonly hint: _angular_core.InputSignal<string>;
@@ -697,7 +754,7 @@ declare class CadRadioComponent<T = unknown> {
697
754
  protected readonly tabIndex: _angular_core.Signal<0 | -1>;
698
755
  focus(): void;
699
756
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadRadioComponent<any>, never>;
700
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadRadioComponent<any>, "cad-radio", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
757
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadRadioComponent<any>, "cad-radio", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
701
758
  }
702
759
 
703
760
  type CadSegmentOption = {
@@ -711,6 +768,8 @@ type CadSegmentOption = {
711
768
  * <cad-segmented [(value)]="view" [options]="[{label:'Tableau',value:'t'},{label:'SQL',value:'s',icon:'code'}]" />
712
769
  * Remplace p-selectButton. CVA<T>. `multiple` = tableau de valeurs. `allowEmpty` (single) autorise la désélection.
713
770
  * `optionLabel`/`optionValue` pour des objets. Template d'option : <ng-template let-o>…</ng-template>.
771
+ * @atelier icone=columns-3 hauteur=1
772
+ * @atelier-exemple options [{"label":"Jour","value":"jour"},{"label":"Semaine","value":"semaine"},{"label":"Mois","value":"mois"}]
714
773
  */
715
774
  declare class CadSegmentedComponent<T = unknown> extends CadValueAccessor<T | T[]> {
716
775
  readonly options: _angular_core.InputSignal<CadSegmentOption[]>;
@@ -736,6 +795,7 @@ declare class CadSegmentedComponent<T = unknown> extends CadValueAccessor<T | T[
736
795
  /**
737
796
  * <cad-toggle-button [(value)]="on" onLabel="Actif" offLabel="Inactif" onIcon="check" offIcon="x" severity="primary"/>
738
797
  * CVA<boolean>. Actif = bouton plein, inactif = contour. `aria-pressed`. Remplace p-toggleButton.
798
+ * @atelier icone=toggle-left largeur=2 hauteur=1
739
799
  */
740
800
  declare class CadToggleButtonComponent extends CadValueAccessor<boolean> {
741
801
  readonly onLabel: _angular_core.InputSignal<string>;
@@ -1119,6 +1179,8 @@ declare abstract class CadSelectBase<T, V> extends CadValueAccessor<V> {
1119
1179
  * Escape/Tab ferment, lettres = typeahead (sélection directe quand fermé), Suppr/Retour = effacer si `clearable`.
1120
1180
  * - `open()/close()/toggle()/focus()` publiques ; events `changed`, `opened`, `closed`, `filtered`, `cleared`, `focusChange`.
1121
1181
  * - mobile : `mobile="auto|sheet|popover"` — sous le seuil mobile le panneau s'ouvre en feuille basse (cad-sheet), options 44 px.
1182
+ * @atelier icone=chevrons-up-down largeur=3 hauteur=1
1183
+ * @atelier-exemple options [{"label":"Béton"},{"label":"Acier"},{"label":"Bois"},{"label":"Mixte"}]
1122
1184
  */
1123
1185
  declare class CadSelectComponent<T = unknown, V = unknown> extends CadSelectBase<T, V> {
1124
1186
  /** Émis quand l'utilisateur choisit (ou efface) une option. */
@@ -1147,6 +1209,8 @@ declare class CadSelectComponent<T = unknown, V = unknown> extends CadSelectBase
1147
1209
  * - Espace/Entrée basculent l'option SANS fermer le panneau ; Escape ferme.
1148
1210
  * - events : `changed<V[]>`, `removed<V>` (chip retirée), + `opened/closed/filtered/cleared/focusChange`.
1149
1211
  * - mobile : `mobile="auto|sheet|popover"` — feuille basse avec pied « OK (n) » sous le seuil mobile.
1212
+ * @atelier icone=list-checks largeur=3 hauteur=1
1213
+ * @atelier-exemple options [{"label":"Nord"},{"label":"Sud"},{"label":"Est"},{"label":"Ouest"}]
1150
1214
  */
1151
1215
  declare class CadMultiselectComponent<T = unknown, V = unknown> extends CadSelectBase<T, V[]> {
1152
1216
  readonly display: _angular_core.InputSignal<"chip" | "comma">;
@@ -1423,6 +1487,7 @@ interface CadColumnFilterOption {
1423
1487
  * <ng-template cadFilterTemplate let-col>…</ng-template>
1424
1488
  * </cad-column>
1425
1489
  * Déclaration d'une colonne de cad-table (élément sans rendu propre).
1490
+ * @atelier icone=columns
1426
1491
  */
1427
1492
  declare class CadColumnComponent {
1428
1493
  /** Chemin (pointé) de la donnée dans la ligne. */
@@ -1485,6 +1550,7 @@ declare class CadColumnComponent {
1485
1550
  /**
1486
1551
  * <cad-filter-chip label="Statut" value="en ligne, en pause" active removable (removed)="…" (clicked)="…"/>
1487
1552
  * Chip de filtre de la barre d'outils (pointillé inactif = « + Filtre », plein accent quand actif).
1553
+ * @atelier ajustement=naturel icone=filter largeur=2 hauteur=1 pose-label=Filtre
1488
1554
  */
1489
1555
  declare class CadFilterChipComponent {
1490
1556
  readonly label: _angular_core.InputSignal<string>;
@@ -1509,6 +1575,9 @@ interface CadPageEvent {
1509
1575
  /**
1510
1576
  * <cad-paginator [(first)]="first" [(rows)]="rows" [totalRecords]="42" [rowsPerPageOptions]="[10,25,50]" (pageChange)="…"/>
1511
1577
  * Remplace p-paginator. Réutilisé par cad-table. `currentPageReportTemplate` : {first} {last} {totalRecords} {currentPage} {totalPages} {rows}.
1578
+ * @atelier icone=arrow-left-right hauteur=1
1579
+ * @atelier-exemple totalRecords 120
1580
+ * @atelier-exemple rows 10
1512
1581
  */
1513
1582
  declare class CadPaginatorComponent {
1514
1583
  readonly first: _angular_core.ModelSignal<number>;
@@ -1832,6 +1901,7 @@ declare class CadTabContentDirective {
1832
1901
  * contenu (ou <ng-template cadTabContent> pour un rendu vraiment paresseux)
1833
1902
  * <ng-template cadTabLabel>label custom</ng-template>
1834
1903
  * </cad-tab>
1904
+ * @atelier icone=panel-top conteneur=flux dans=cad-tabs pose-label=Onglet
1835
1905
  */
1836
1906
  declare class CadTabComponent {
1837
1907
  readonly value: _angular_core.InputSignal<unknown>;
@@ -1853,6 +1923,7 @@ declare class CadTabComponent {
1853
1923
  /**
1854
1924
  * <cad-tabs [(value)]="tab" [(activeIndex)]="i" variant="line|pill|enclosed" size="sm|md" [stretch] [scrollable] [lazy]="true" [keepAlive]="true" (changed) (tabChange)>
1855
1925
  * `value` prime sur `activeIndex` (les deux sont two-way et synchronisés). Clavier ←/→/Home/End sur la liste.
1926
+ * @atelier icone=folder conteneur=direct largeur=12 hauteur=6
1856
1927
  */
1857
1928
  declare class CadTabsComponent {
1858
1929
  readonly value: _angular_core.ModelSignal<unknown>;
@@ -1876,7 +1947,37 @@ declare class CadTabsComponent {
1876
1947
  value: unknown;
1877
1948
  tab: CadTabComponent;
1878
1949
  }>;
1879
- readonly tabs: _angular_core.Signal<readonly CadTabComponent[]>;
1950
+ /** Onglets déclarés dans un GABARIT — la voie normale, celle de tous les usages écrits. */
1951
+ private readonly tabsProjetes;
1952
+ /**
1953
+ * Onglets POSÉS : créés hors gabarit par `createComponent`, et annoncés par
1954
+ * `enregistrerEnfants` — le contrat d'accueil décrit dans `atelier/atelier.pieces.ts`.
1955
+ *
1956
+ * ⚠️ CE N'EST PAS UN DOUBLON DE LA REQUÊTE, C'EST LA SEULE VOIE POSSIBLE POUR EUX.
1957
+ * Mesuré le 27/08 : un `cad-tab` créé impérativement et passé en `projectableNodes`
1958
+ * arrive bien dans le DOM, mais `contentChildren` NE LE VOIT PAS — une requête de
1959
+ * contenu se résout sur la structure déclarée d'un gabarit, et un composant instancié
1960
+ * à la main vit dans une autre vue. Résultat avant correction : `onglets=0`, une barre
1961
+ * vide et aucun panneau, sans la moindre erreur. C'est ce qui rendait `cad-tabs`
1962
+ * inutilisable dans l'atelier et dans les pages visuelles de frontless.
1963
+ *
1964
+ * Même trappe que `cad-button-group`, qui la porte depuis le 24/08 pour la même
1965
+ * raison (il était SOURD aux clics de ses boutons posés) : les deux sources
1966
+ * FUSIONNENT, la projection reste prioritaire dans l'ordre, et rien ne change pour
1967
+ * qui écrit du gabarit.
1968
+ */
1969
+ private readonly tabsPoses;
1970
+ /** Tous les onglets : projetés d'abord, posés ensuite. L'ordre fait la barre. */
1971
+ readonly tabs: _angular_core.Signal<CadTabComponent[]>;
1972
+ /**
1973
+ * Reçoit les instances des onglets posés — la LISTE COMPLÈTE, pas un ajout.
1974
+ *
1975
+ * Le poseur reconstruit ses enfants d'un bloc à chaque changement de structure : lui
1976
+ * faire tenir un différentiel inviterait le fantôme (un onglet détruit qui reste dans
1977
+ * la barre). L'hôte filtre lui-même ce qui n'est pas un onglet, pour qu'un appelant
1978
+ * n'ait pas à connaître nos types.
1979
+ */
1980
+ enregistrerEnfants(instances: unknown[]): void;
1880
1981
  private readonly list;
1881
1982
  private readonly btns;
1882
1983
  protected readonly overflow: _angular_core.WritableSignal<boolean>;
@@ -1889,7 +1990,7 @@ declare class CadTabsComponent {
1889
1990
  protected scroll(dir: number): void;
1890
1991
  protected checkOverflow(): void;
1891
1992
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadTabsComponent, never>;
1892
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadTabsComponent, "cad-tabs", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "stretch": { "alias": "stretch"; "required": false; "isSignal": true; }; "scrollable": { "alias": "scrollable"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "keepAlive": { "alias": "keepAlive"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "activeIndex": "activeIndexChange"; "changed": "changed"; "tabChange": "tabChange"; }, ["tabs"], ["[cadTabsEnd]"], true, never>;
1993
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadTabsComponent, "cad-tabs", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "stretch": { "alias": "stretch"; "required": false; "isSignal": true; }; "scrollable": { "alias": "scrollable"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "keepAlive": { "alias": "keepAlive"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "activeIndex": "activeIndexChange"; "changed": "changed"; "tabChange": "tabChange"; }, ["tabsProjetes"], ["[cadTabsEnd]"], true, never>;
1893
1994
  }
1894
1995
 
1895
1996
  type CadStepState = 'done' | 'current' | 'error' | 'todo';
@@ -1912,6 +2013,7 @@ declare class CadStepComponent {
1912
2013
  /**
1913
2014
  * <cad-stepper [(activeIndex)]="i" [linear] [clickable]="true" orientation="horizontal|vertical" size="sm|md" (changed) (stepClick)>
1914
2015
  * `linear` : impossible d'aller au-delà de la première étape non `completed`. Méthodes next()/prev()/goTo(i).
2016
+ * @atelier icone=git-commit
1915
2017
  */
1916
2018
  declare class CadStepperComponent {
1917
2019
  readonly activeIndex: _angular_core.ModelSignal<number>;
@@ -1962,9 +2064,29 @@ declare class CadPanelContentDirective {
1962
2064
  * </cad-accordion-panel>
1963
2065
  * </cad-accordion>
1964
2066
  * `value` = valeur ouverte (string) ou tableau si `multiple`. Clavier : Entrée/Espace, ↑/↓/Home/End entre en-têtes.
2067
+ * @atelier icone=panel-top conteneur=flux dans=cad-accordion pose-header=Section
1965
2068
  */
1966
2069
  declare class CadAccordionPanelComponent {
1967
- readonly acc: CadAccordionComponent;
2070
+ /**
2071
+ * L'accordéon d'accueil — INJECTÉ dans un gabarit, POUSSÉ par l'hôte quand la pièce
2072
+ * est posée hors gabarit.
2073
+ *
2074
+ * ⚠️ L'INJECTION EST OPTIONNELLE, ET C'EST LE CŒUR DU CORRECTIF (SZU 27/08 : « pourquoi
2075
+ * cad-accordion serait différent d'un cad-tabs ? »). Elle était obligatoire, donc :
2076
+ * `NG0201` dès qu'on créait le panneau à la main, et `gen-catalog` le classait
2077
+ * « contextuel » — il n'était même pas POSABLE. Or `cad-tab`, lui, n'injecte rien :
2078
+ * c'est une pièce PASSIVE que son hôte pilote. La différence n'était pas une contrainte
2079
+ * du composant, c'était une divergence d'écriture entre deux familles jumelles.
2080
+ *
2081
+ * Renversement : la pièce ne va plus CHERCHER son hôte, c'est l'hôte qui s'annonce en
2082
+ * l'accueillant (`rattacher`). Un panneau posé seul reste sensé — il gère alors son
2083
+ * propre `expanded` au lieu de lever.
2084
+ */
2085
+ private readonly accInjecte;
2086
+ private readonly accPose;
2087
+ readonly acc: _angular_core.Signal<CadAccordionComponent | null>;
2088
+ /** L'accordéon s'annonce à la pièce qu'il accueille. Cf. `atelier/atelier.pieces.ts`. */
2089
+ rattacher(acc: CadAccordionComponent): void;
1968
2090
  readonly value: _angular_core.InputSignal<string>;
1969
2091
  readonly header: _angular_core.InputSignal<string>;
1970
2092
  readonly icon: _angular_core.InputSignal<string>;
@@ -1977,6 +2099,7 @@ declare class CadAccordionPanelComponent {
1977
2099
  readonly contentTpl: _angular_core.Signal<CadPanelContentDirective | undefined>;
1978
2100
  readonly id: string;
1979
2101
  readonly rendered: _angular_core.WritableSignal<boolean>;
2102
+ /** Sans hôte, le panneau fait autorité sur lui-même : posé seul, il reste utilisable. */
1980
2103
  readonly isOpen: _angular_core.Signal<boolean>;
1981
2104
  constructor();
1982
2105
  toggle(): void;
@@ -1984,6 +2107,7 @@ declare class CadAccordionPanelComponent {
1984
2107
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadAccordionPanelComponent, never>;
1985
2108
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadAccordionPanelComponent, "cad-accordion-panel", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "header": { "alias": "header"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; "opened": "opened"; "closed": "closed"; }, ["headerTpl", "contentTpl"], ["[cadPanelExtra]", "*"], true, never>;
1986
2109
  }
2110
+ /** @atelier icone=chevron-down conteneur=direct largeur=12 hauteur=8 */
1987
2111
  declare class CadAccordionComponent {
1988
2112
  readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
1989
2113
  /** Ouvert(s) : string (single) ou string[] (multiple). */
@@ -1992,13 +2116,21 @@ declare class CadAccordionComponent {
1992
2116
  /** Sans bordure extérieure. */
1993
2117
  readonly flush: _angular_core.InputSignalWithTransform<boolean, unknown>;
1994
2118
  readonly changed: _angular_core.OutputEmitterRef<string | string[] | null>;
1995
- readonly panels: _angular_core.Signal<readonly CadAccordionPanelComponent[]>;
2119
+ private readonly panelsProjetes;
2120
+ /** Panneaux POSÉS hors gabarit, annoncés par `enregistrerEnfants`. */
2121
+ private readonly panelsPoses;
2122
+ readonly panels: _angular_core.Signal<CadAccordionPanelComponent[]>;
2123
+ /**
2124
+ * Reçoit la LISTE COMPLÈTE des panneaux posés, et se RATTACHE à chacun : la pièce
2125
+ * n'ayant plus d'injection obligatoire, c'est ce geste qui rétablit le lien.
2126
+ */
2127
+ enregistrerEnfants(instances: unknown[]): void;
1996
2128
  private readonly openSet;
1997
2129
  isOpen(v: string): boolean;
1998
2130
  setOpen(v: string, open: boolean, panel?: CadAccordionPanelComponent): void;
1999
2131
  onKey(e: KeyboardEvent, from: CadAccordionPanelComponent): void;
2000
2132
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadAccordionComponent, never>;
2001
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadAccordionComponent, "cad-accordion", never, { "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "expandIcon": { "alias": "expandIcon"; "required": false; "isSignal": true; }; "flush": { "alias": "flush"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "changed": "changed"; }, ["panels"], ["*"], true, never>;
2133
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadAccordionComponent, "cad-accordion", never, { "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "expandIcon": { "alias": "expandIcon"; "required": false; "isSignal": true; }; "flush": { "alias": "flush"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "changed": "changed"; }, ["panelsProjetes"], ["*"], true, never>;
2002
2134
  }
2003
2135
 
2004
2136
  interface CadBreadcrumbItem {
@@ -2022,6 +2154,8 @@ declare class CadBreadcrumbItemDirective {
2022
2154
  * <cad-breadcrumb [items]="[{label:'Projets', routerLink:'/projets'}, {label:'gestion-flotte'}, {label:'Environnements'}]"
2023
2155
  * [home]="{icon:'home', routerLink:'/'}" separatorIcon="chevron-right" [maxItems]="4" (itemClick)>
2024
2156
  * Le dernier élément porte aria-current="page". Au-delà de `maxItems`, les éléments du milieu sont repliés en « … » (clic = déplie).
2157
+ * @atelier icone=chevron-right hauteur=1
2158
+ * @atelier-exemple items [{"label":"Accueil"},{"label":"Ouvrages"},{"label":"Pont de Sèvres"}]
2025
2159
  */
2026
2160
  declare class CadBreadcrumbComponent {
2027
2161
  readonly items: _angular_core.InputSignal<CadBreadcrumbItem[]>;
@@ -2073,6 +2207,8 @@ interface CadMenuItem {
2073
2207
  * inline : liste verticale. Sous-menu 1 niveau (`items`), ouvert au survol / →. Clavier ↑/↓/Home/End/Entrée/→/←/Escape.
2074
2208
  * mobile : `mobile="auto|sheet|popover"` — sous le seuil mobile, le menu popup s'ouvre en feuille basse (items 44 px,
2075
2209
  * sous-menus dépliés en accordéon) sauf menu contextuel (clic droit) sur desktop.
2210
+ * @atelier icone=menu
2211
+ * @atelier-exemple items [{"label":"Ouvrir","icon":"folder-open"},{"label":"Exporter","icon":"download"},{"separator":true},{"label":"Supprimer","icon":"trash-2","severity":"danger"}]
2076
2212
  */
2077
2213
  declare class CadMenuComponent {
2078
2214
  private readonly overlay;
@@ -2138,6 +2274,8 @@ interface CadMenubarItem extends CadMenuItem {
2138
2274
  * Barre horizontale : racines (routerLink actif souligné), sous-menus en overlay CDK (`cad-menu` popup, 2 niveaux) au clic ou au survol,
2139
2275
  * méga-menu multi-colonnes (`columns`), clavier ←→ entre racines, ↓/Entrée ouvre, Échap ferme, `role=menubar`.
2140
2276
  * Sous `breakpoint` (fenêtre) : bouton hamburger + menu vertical déplié en accordéon.
2277
+ * @atelier icone=menu
2278
+ * @atelier-exemple items [{"label":"Fichier","items":[{"label":"Nouveau"},{"label":"Ouvrir"}]},{"label":"Édition","items":[{"label":"Annuler"},{"label":"Rétablir"}]},{"label":"Affichage"}]
2141
2279
  */
2142
2280
  declare class CadMenubarComponent {
2143
2281
  private readonly overlay;
@@ -2215,6 +2353,9 @@ declare class CadSplitButtonComponent {
2215
2353
  /**
2216
2354
  * <cad-speed-dial [items]="items" direction="up" type="linear" [(visible)] mask/>
2217
2355
  * FAB 48 px + items déployés en ligne (`linear`), en cercle ou demi-cercle. Clic dehors / Échap ferment. Tooltips (label), clavier ↑↓ Entrée.
2356
+ * @atelier icone=plus-circle
2357
+ * @atelier-exemple items [{"icon":"pen-line","title":"Éditer"},{"icon":"share-2","title":"Partager"},{"icon":"trash-2","title":"Supprimer"}]
2358
+ * @atelier-exemple visible true
2218
2359
  */
2219
2360
  declare class CadSpeedDialComponent {
2220
2361
  readonly items: _angular_core.InputSignal<CadMenuItem[]>;
@@ -2279,6 +2420,9 @@ interface CadBottomNavItem {
2279
2420
  * couleur : la couleur seule disparaît pour une personne daltonienne. Les cibles font 44 px de
2280
2421
  * haut au minimum, et la barre réserve la zone sûre des téléphones à encoche
2281
2422
  * (`env(safe-area-inset-bottom)`), sans quoi la dernière rangée passe sous la barre d'accueil.
2423
+ * @atelier icone=panel-bottom
2424
+ * @atelier-exemple items [{"value":"carte","label":"Carte","icon":"map"},{"value":"releves","label":"Relevés","icon":"clipboard-list"},{"value":"alertes","label":"Alertes","icon":"bell"},{"value":"profil","label":"Profil","icon":"user-round"}]
2425
+ * @atelier-exemple value "carte"
2282
2426
  */
2283
2427
  declare class CadBottomNavComponent {
2284
2428
  private readonly bp;
@@ -2391,6 +2535,9 @@ interface CadNavDrawerRow {
2391
2535
  *
2392
2536
  * LA LISTE EST DISTINCTE DE CELLE DE `cad-bottom-nav`, volontairement — voir la note qui s'y
2393
2537
  * trouve : on ne met pas en avant les mêmes destinations au pouce que dans un menu complet.
2538
+ * @atelier icone=sidebar-open
2539
+ * @atelier-exemple items [{"value":"tableau","label":"Tableau de bord","icon":"layout-dashboard"},{"value":"ouvrages","label":"Ouvrages","icon":"building-2"},{"value":"releves","label":"Relevés","icon":"clipboard-list"},{"value":"parametres","label":"Paramètres","icon":"settings-2"}]
2540
+ * @atelier-exemple value "tableau"
2394
2541
  */
2395
2542
  declare class CadNavDrawerComponent {
2396
2543
  private readonly bp;
@@ -2481,6 +2628,15 @@ interface CadColumnReorderEvent {
2481
2628
  columns: CadColumnComponent[];
2482
2629
  order: string[];
2483
2630
  }
2631
+ /** Une colonne définie par entrée (`[colonnes]`) — le sous-ensemble utile de `<cad-column>`. */
2632
+ interface CadColonneDef {
2633
+ field: string;
2634
+ header?: string;
2635
+ dataType?: CadColumnDataType;
2636
+ align?: CadColumnAlign;
2637
+ width?: string;
2638
+ sortable?: boolean;
2639
+ }
2484
2640
  interface CadFilterChangeEvent {
2485
2641
  filters: CadFilters;
2486
2642
  globalFilter: string;
@@ -2704,7 +2860,21 @@ declare abstract class CadTableBase<T> {
2704
2860
  /** Pied « N lignes · filtrées · sélectionnées ». */
2705
2861
  readonly showRowCount: _angular_core.InputSignalWithTransform<boolean, unknown>;
2706
2862
  readonly rowCountLabel: _angular_core.InputSignal<string>;
2707
- readonly columns: _angular_core.Signal<readonly CadColumnComponent[]>;
2863
+ /**
2864
+ * Colonnes par ENTRÉE — jumelles des `<cad-column>` projetées, pour les contextes où
2865
+ * la projection n'existe pas : construction dynamique (l'atelier CadGrid instancie par
2866
+ * `createComponent`, et une requête de contenu ne voit JAMAIS un composant créé
2867
+ * dynamiquement), configuration programmatique, colonnes venues d'une API.
2868
+ *
2869
+ * Le gabarit de `cad-table` rend ces définitions en `<cad-column>` réels (masqués,
2870
+ * la colonne ne dessine rien) et une requête de VUE les récupère : tout le moteur
2871
+ * continue de consommer des `CadColumnComponent`, aucune seconde voie interne.
2872
+ * Les deux sources se cumulent, projection d'abord.
2873
+ */
2874
+ readonly colonnes: _angular_core.InputSignal<CadColonneDef[]>;
2875
+ protected readonly columnsProjetees: _angular_core.Signal<readonly CadColumnComponent[]>;
2876
+ protected readonly columnsSynthetisees: _angular_core.Signal<readonly CadColumnComponent[]>;
2877
+ readonly columns: _angular_core.Signal<CadColumnComponent[]>;
2708
2878
  readonly expansionTpl: _angular_core.Signal<CadRowExpansionDirective | undefined>;
2709
2879
  readonly rowActionsTpl: _angular_core.Signal<CadRowActionsDirective | undefined>;
2710
2880
  readonly emptyTpl: _angular_core.Signal<CadEmptyDirective | undefined>;
@@ -2715,7 +2885,7 @@ declare abstract class CadTableBase<T> {
2715
2885
  readonly cardTpl: _angular_core.Signal<CadCardDirective | undefined>;
2716
2886
  readonly rowCountTpl: _angular_core.Signal<CadRowCountDirective | undefined>;
2717
2887
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadTableBase<any>, never>;
2718
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CadTableBase<any>, never, never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "dataKey": { "alias": "dataKey"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingRows": { "alias": "loadingRows"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "emptyHint": { "alias": "emptyHint"; "required": false; "isSignal": true; }; "emptyIcon": { "alias": "emptyIcon"; "required": false; "isSignal": true; }; "cellFormatter": { "alias": "cellFormatter"; "required": false; "isSignal": true; }; "dense": { "alias": "dense"; "required": false; "isSignal": true; }; "striped": { "alias": "striped"; "required": false; "isSignal": true; }; "hoverable": { "alias": "hoverable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "borderless": { "alias": "borderless"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "scrollHeight": { "alias": "scrollHeight"; "required": false; "isSignal": true; }; "resizableColumns": { "alias": "resizableColumns"; "required": false; "isSignal": true; }; "styleClass": { "alias": "styleClass"; "required": false; "isSignal": true; }; "tableClass": { "alias": "tableClass"; "required": false; "isSignal": true; }; "tableStyle": { "alias": "tableStyle"; "required": false; "isSignal": true; }; "rowClass": { "alias": "rowClass"; "required": false; "isSignal": true; }; "rowStyle": { "alias": "rowStyle"; "required": false; "isSignal": true; }; "rowActionsWidth": { "alias": "rowActionsWidth"; "required": false; "isSignal": true; }; "rowActionsAlwaysVisible": { "alias": "rowActionsAlwaysVisible"; "required": false; "isSignal": true; }; "showToolbar": { "alias": "showToolbar"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "showCount": { "alias": "showCount"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "columnToggle": { "alias": "columnToggle"; "required": false; "isSignal": true; }; "columnsLabel": { "alias": "columnsLabel"; "required": false; "isSignal": true; }; "showDensityToggle": { "alias": "showDensityToggle"; "required": false; "isSignal": true; }; "showSelectionBar": { "alias": "showSelectionBar"; "required": false; "isSignal": true; }; "selectedLabel": { "alias": "selectedLabel"; "required": false; "isSignal": true; }; "selectedLabelPlural": { "alias": "selectedLabelPlural"; "required": false; "isSignal": true; }; "filtersLabel": { "alias": "filtersLabel"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "selectAll": { "alias": "selectAll"; "required": false; "isSignal": true; }; "selectAllScope": { "alias": "selectAllScope"; "required": false; "isSignal": true; }; "rowSelectable": { "alias": "rowSelectable"; "required": false; "isSignal": true; }; "metaKeySelection": { "alias": "metaKeySelection"; "required": false; "isSignal": true; }; "selectionPropagation": { "alias": "selectionPropagation"; "required": false; "isSignal": true; }; "sortField": { "alias": "sortField"; "required": false; "isSignal": true; }; "sortOrder": { "alias": "sortOrder"; "required": false; "isSignal": true; }; "sortMode": { "alias": "sortMode"; "required": false; "isSignal": true; }; "multiSortMeta": { "alias": "multiSortMeta"; "required": false; "isSignal": true; }; "defaultSortOrder": { "alias": "defaultSortOrder"; "required": false; "isSignal": true; }; "customSort": { "alias": "customSort"; "required": false; "isSignal": true; }; "paginator": { "alias": "paginator"; "required": false; "isSignal": true; }; "first": { "alias": "first"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "rowsPerPageOptions": { "alias": "rowsPerPageOptions"; "required": false; "isSignal": true; }; "totalRecords": { "alias": "totalRecords"; "required": false; "isSignal": true; }; "showCurrentPageReport": { "alias": "showCurrentPageReport"; "required": false; "isSignal": true; }; "currentPageReportTemplate": { "alias": "currentPageReportTemplate"; "required": false; "isSignal": true; }; "pageLinks": { "alias": "pageLinks"; "required": false; "isSignal": true; }; "showFirstLastIcon": { "alias": "showFirstLastIcon"; "required": false; "isSignal": true; }; "alwaysShowPaginator": { "alias": "alwaysShowPaginator"; "required": false; "isSignal": true; }; "globalFilter": { "alias": "globalFilter"; "required": false; "isSignal": true; }; "globalFilterFields": { "alias": "globalFilterFields"; "required": false; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "filterDelay": { "alias": "filterDelay"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "lazyLoadOnInit": { "alias": "lazyLoadOnInit"; "required": false; "isSignal": true; }; "rowExpandable": { "alias": "rowExpandable"; "required": false; "isSignal": true; }; "expandedRowKeys": { "alias": "expandedRowKeys"; "required": false; "isSignal": true; }; "expandMode": { "alias": "expandMode"; "required": false; "isSignal": true; }; "treeField": { "alias": "treeField"; "required": false; "isSignal": true; }; "parentKey": { "alias": "parentKey"; "required": false; "isSignal": true; }; "treeColumn": { "alias": "treeColumn"; "required": false; "isSignal": true; }; "indent": { "alias": "indent"; "required": false; "isSignal": true; }; "expandedNodeKeys": { "alias": "expandedNodeKeys"; "required": false; "isSignal": true; }; "lazyChildren": { "alias": "lazyChildren"; "required": false; "isSignal": true; }; "hasChildren": { "alias": "hasChildren"; "required": false; "isSignal": true; }; "showTreeLines": { "alias": "showTreeLines"; "required": false; "isSignal": true; }; "treeIcon": { "alias": "treeIcon"; "required": false; "isSignal": true; }; "keepAncestors": { "alias": "keepAncestors"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "expandedGroups": { "alias": "expandedGroups"; "required": false; "isSignal": true; }; "aggregates": { "alias": "aggregates"; "required": false; "isSignal": true; }; "showGrandTotal": { "alias": "showGrandTotal"; "required": false; "isSignal": true; }; "grandTotalLabel": { "alias": "grandTotalLabel"; "required": false; "isSignal": true; }; "groupSort": { "alias": "groupSort"; "required": false; "isSignal": true; }; "groupLabel": { "alias": "groupLabel"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "stackAt": { "alias": "stackAt"; "required": false; "isSignal": true; }; "priorityBreakpoints": { "alias": "priorityBreakpoints"; "required": false; "isSignal": true; }; "showHiddenInExpansion": { "alias": "showHiddenInExpansion"; "required": false; "isSignal": true; }; "stickyFirstColumn": { "alias": "stickyFirstColumn"; "required": false; "isSignal": true; }; "stickyActions": { "alias": "stickyActions"; "required": false; "isSignal": true; }; "reorderableColumns": { "alias": "reorderableColumns"; "required": false; "isSignal": true; }; "columnOrder": { "alias": "columnOrder"; "required": false; "isSignal": true; }; "headerGroups": { "alias": "headerGroups"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualRowHeight": { "alias": "virtualRowHeight"; "required": false; "isSignal": true; }; "virtualBuffer": { "alias": "virtualBuffer"; "required": false; "isSignal": true; }; "editMode": { "alias": "editMode"; "required": false; "isSignal": true; }; "editOnClick": { "alias": "editOnClick"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "mutate": { "alias": "mutate"; "required": false; "isSignal": true; }; "showEditIcon": { "alias": "showEditIcon"; "required": false; "isSignal": true; }; "showRowEditButton": { "alias": "showRowEditButton"; "required": false; "isSignal": true; }; "rowEditDialogHeader": { "alias": "rowEditDialogHeader"; "required": false; "isSignal": true; }; "rowEditDialogSize": { "alias": "rowEditDialogSize"; "required": false; "isSignal": true; }; "rowEditDialogCols": { "alias": "rowEditDialogCols"; "required": false; "isSignal": true; }; "columnMenu": { "alias": "columnMenu"; "required": false; "isSignal": true; }; "columnMenuItems": { "alias": "columnMenuItems"; "required": false; "isSignal": true; }; "columnMenuExtra": { "alias": "columnMenuExtra"; "required": false; "isSignal": true; }; "pinnedColumns": { "alias": "pinnedColumns"; "required": false; "isSignal": true; }; "showFilterRow": { "alias": "showFilterRow"; "required": false; "isSignal": true; }; "showGroupZone": { "alias": "showGroupZone"; "required": false; "isSignal": true; }; "groupZoneLabel": { "alias": "groupZoneLabel"; "required": false; "isSignal": true; }; "hideGroupedColumns": { "alias": "hideGroupedColumns"; "required": false; "isSignal": true; }; "showRowNumber": { "alias": "showRowNumber"; "required": false; "isSignal": true; }; "reorderableRows": { "alias": "reorderableRows"; "required": false; "isSignal": true; }; "rowDragDisabled": { "alias": "rowDragDisabled"; "required": false; "isSignal": true; }; "showRowCount": { "alias": "showRowCount"; "required": false; "isSignal": true; }; "rowCountLabel": { "alias": "rowCountLabel"; "required": false; "isSignal": true; }; }, { "dense": "denseChange"; "selection": "selectionChange"; "rowSelect": "rowSelect"; "rowUnselect": "rowUnselect"; "rowClick": "rowClick"; "rowDblClick": "rowDblClick"; "sortField": "sortFieldChange"; "sortOrder": "sortOrderChange"; "multiSortMeta": "multiSortMetaChange"; "sortChange": "sortChange"; "first": "firstChange"; "rows": "rowsChange"; "pageChange": "pageChange"; "globalFilter": "globalFilterChange"; "filters": "filtersChange"; "filterChange": "filterChange"; "lazyLoad": "lazyLoad"; "expandedRowKeys": "expandedRowKeysChange"; "rowExpand": "rowExpand"; "rowCollapse": "rowCollapse"; "expandedNodeKeys": "expandedNodeKeysChange"; "nodeExpand": "nodeExpand"; "nodeCollapse": "nodeCollapse"; "groupBy": "groupByChange"; "expandedGroups": "expandedGroupsChange"; "aggregates": "aggregatesChange"; "columnResize": "columnResize"; "columnToggled": "columnToggled"; "columnOrder": "columnOrderChange"; "columnReorder": "columnReorder"; "editInit": "editInit"; "editComplete": "editComplete"; "editCancel": "editCancel"; "cellChange": "cellChange"; "rowEditInit": "rowEditInit"; "rowEditSave": "rowEditSave"; "rowEditCancel": "rowEditCancel"; "columnMenuAction": "columnMenuAction"; "pinnedColumns": "pinnedColumnsChange"; "columnPin": "columnPin"; "rowReorder": "rowReorder"; }, ["columns", "expansionTpl", "rowActionsTpl", "emptyTpl", "footerTpl", "captionTpl", "groupHeaderTpl", "groupFooterTpl", "cardTpl", "rowCountTpl"], never, true, never>;
2888
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CadTableBase<any>, never, never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "dataKey": { "alias": "dataKey"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingRows": { "alias": "loadingRows"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "emptyHint": { "alias": "emptyHint"; "required": false; "isSignal": true; }; "emptyIcon": { "alias": "emptyIcon"; "required": false; "isSignal": true; }; "cellFormatter": { "alias": "cellFormatter"; "required": false; "isSignal": true; }; "dense": { "alias": "dense"; "required": false; "isSignal": true; }; "striped": { "alias": "striped"; "required": false; "isSignal": true; }; "hoverable": { "alias": "hoverable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "borderless": { "alias": "borderless"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "scrollHeight": { "alias": "scrollHeight"; "required": false; "isSignal": true; }; "resizableColumns": { "alias": "resizableColumns"; "required": false; "isSignal": true; }; "styleClass": { "alias": "styleClass"; "required": false; "isSignal": true; }; "tableClass": { "alias": "tableClass"; "required": false; "isSignal": true; }; "tableStyle": { "alias": "tableStyle"; "required": false; "isSignal": true; }; "rowClass": { "alias": "rowClass"; "required": false; "isSignal": true; }; "rowStyle": { "alias": "rowStyle"; "required": false; "isSignal": true; }; "rowActionsWidth": { "alias": "rowActionsWidth"; "required": false; "isSignal": true; }; "rowActionsAlwaysVisible": { "alias": "rowActionsAlwaysVisible"; "required": false; "isSignal": true; }; "showToolbar": { "alias": "showToolbar"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "showCount": { "alias": "showCount"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "columnToggle": { "alias": "columnToggle"; "required": false; "isSignal": true; }; "columnsLabel": { "alias": "columnsLabel"; "required": false; "isSignal": true; }; "showDensityToggle": { "alias": "showDensityToggle"; "required": false; "isSignal": true; }; "showSelectionBar": { "alias": "showSelectionBar"; "required": false; "isSignal": true; }; "selectedLabel": { "alias": "selectedLabel"; "required": false; "isSignal": true; }; "selectedLabelPlural": { "alias": "selectedLabelPlural"; "required": false; "isSignal": true; }; "filtersLabel": { "alias": "filtersLabel"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "selectAll": { "alias": "selectAll"; "required": false; "isSignal": true; }; "selectAllScope": { "alias": "selectAllScope"; "required": false; "isSignal": true; }; "rowSelectable": { "alias": "rowSelectable"; "required": false; "isSignal": true; }; "metaKeySelection": { "alias": "metaKeySelection"; "required": false; "isSignal": true; }; "selectionPropagation": { "alias": "selectionPropagation"; "required": false; "isSignal": true; }; "sortField": { "alias": "sortField"; "required": false; "isSignal": true; }; "sortOrder": { "alias": "sortOrder"; "required": false; "isSignal": true; }; "sortMode": { "alias": "sortMode"; "required": false; "isSignal": true; }; "multiSortMeta": { "alias": "multiSortMeta"; "required": false; "isSignal": true; }; "defaultSortOrder": { "alias": "defaultSortOrder"; "required": false; "isSignal": true; }; "customSort": { "alias": "customSort"; "required": false; "isSignal": true; }; "paginator": { "alias": "paginator"; "required": false; "isSignal": true; }; "first": { "alias": "first"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "rowsPerPageOptions": { "alias": "rowsPerPageOptions"; "required": false; "isSignal": true; }; "totalRecords": { "alias": "totalRecords"; "required": false; "isSignal": true; }; "showCurrentPageReport": { "alias": "showCurrentPageReport"; "required": false; "isSignal": true; }; "currentPageReportTemplate": { "alias": "currentPageReportTemplate"; "required": false; "isSignal": true; }; "pageLinks": { "alias": "pageLinks"; "required": false; "isSignal": true; }; "showFirstLastIcon": { "alias": "showFirstLastIcon"; "required": false; "isSignal": true; }; "alwaysShowPaginator": { "alias": "alwaysShowPaginator"; "required": false; "isSignal": true; }; "globalFilter": { "alias": "globalFilter"; "required": false; "isSignal": true; }; "globalFilterFields": { "alias": "globalFilterFields"; "required": false; "isSignal": true; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "filterDelay": { "alias": "filterDelay"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "lazyLoadOnInit": { "alias": "lazyLoadOnInit"; "required": false; "isSignal": true; }; "rowExpandable": { "alias": "rowExpandable"; "required": false; "isSignal": true; }; "expandedRowKeys": { "alias": "expandedRowKeys"; "required": false; "isSignal": true; }; "expandMode": { "alias": "expandMode"; "required": false; "isSignal": true; }; "treeField": { "alias": "treeField"; "required": false; "isSignal": true; }; "parentKey": { "alias": "parentKey"; "required": false; "isSignal": true; }; "treeColumn": { "alias": "treeColumn"; "required": false; "isSignal": true; }; "indent": { "alias": "indent"; "required": false; "isSignal": true; }; "expandedNodeKeys": { "alias": "expandedNodeKeys"; "required": false; "isSignal": true; }; "lazyChildren": { "alias": "lazyChildren"; "required": false; "isSignal": true; }; "hasChildren": { "alias": "hasChildren"; "required": false; "isSignal": true; }; "showTreeLines": { "alias": "showTreeLines"; "required": false; "isSignal": true; }; "treeIcon": { "alias": "treeIcon"; "required": false; "isSignal": true; }; "keepAncestors": { "alias": "keepAncestors"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "expandedGroups": { "alias": "expandedGroups"; "required": false; "isSignal": true; }; "aggregates": { "alias": "aggregates"; "required": false; "isSignal": true; }; "showGrandTotal": { "alias": "showGrandTotal"; "required": false; "isSignal": true; }; "grandTotalLabel": { "alias": "grandTotalLabel"; "required": false; "isSignal": true; }; "groupSort": { "alias": "groupSort"; "required": false; "isSignal": true; }; "groupLabel": { "alias": "groupLabel"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "stackAt": { "alias": "stackAt"; "required": false; "isSignal": true; }; "priorityBreakpoints": { "alias": "priorityBreakpoints"; "required": false; "isSignal": true; }; "showHiddenInExpansion": { "alias": "showHiddenInExpansion"; "required": false; "isSignal": true; }; "stickyFirstColumn": { "alias": "stickyFirstColumn"; "required": false; "isSignal": true; }; "stickyActions": { "alias": "stickyActions"; "required": false; "isSignal": true; }; "reorderableColumns": { "alias": "reorderableColumns"; "required": false; "isSignal": true; }; "columnOrder": { "alias": "columnOrder"; "required": false; "isSignal": true; }; "headerGroups": { "alias": "headerGroups"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "virtualRowHeight": { "alias": "virtualRowHeight"; "required": false; "isSignal": true; }; "virtualBuffer": { "alias": "virtualBuffer"; "required": false; "isSignal": true; }; "editMode": { "alias": "editMode"; "required": false; "isSignal": true; }; "editOnClick": { "alias": "editOnClick"; "required": false; "isSignal": true; }; "commitOnBlur": { "alias": "commitOnBlur"; "required": false; "isSignal": true; }; "mutate": { "alias": "mutate"; "required": false; "isSignal": true; }; "showEditIcon": { "alias": "showEditIcon"; "required": false; "isSignal": true; }; "showRowEditButton": { "alias": "showRowEditButton"; "required": false; "isSignal": true; }; "rowEditDialogHeader": { "alias": "rowEditDialogHeader"; "required": false; "isSignal": true; }; "rowEditDialogSize": { "alias": "rowEditDialogSize"; "required": false; "isSignal": true; }; "rowEditDialogCols": { "alias": "rowEditDialogCols"; "required": false; "isSignal": true; }; "columnMenu": { "alias": "columnMenu"; "required": false; "isSignal": true; }; "columnMenuItems": { "alias": "columnMenuItems"; "required": false; "isSignal": true; }; "columnMenuExtra": { "alias": "columnMenuExtra"; "required": false; "isSignal": true; }; "pinnedColumns": { "alias": "pinnedColumns"; "required": false; "isSignal": true; }; "showFilterRow": { "alias": "showFilterRow"; "required": false; "isSignal": true; }; "showGroupZone": { "alias": "showGroupZone"; "required": false; "isSignal": true; }; "groupZoneLabel": { "alias": "groupZoneLabel"; "required": false; "isSignal": true; }; "hideGroupedColumns": { "alias": "hideGroupedColumns"; "required": false; "isSignal": true; }; "showRowNumber": { "alias": "showRowNumber"; "required": false; "isSignal": true; }; "reorderableRows": { "alias": "reorderableRows"; "required": false; "isSignal": true; }; "rowDragDisabled": { "alias": "rowDragDisabled"; "required": false; "isSignal": true; }; "showRowCount": { "alias": "showRowCount"; "required": false; "isSignal": true; }; "rowCountLabel": { "alias": "rowCountLabel"; "required": false; "isSignal": true; }; "colonnes": { "alias": "colonnes"; "required": false; "isSignal": true; }; }, { "dense": "denseChange"; "selection": "selectionChange"; "rowSelect": "rowSelect"; "rowUnselect": "rowUnselect"; "rowClick": "rowClick"; "rowDblClick": "rowDblClick"; "sortField": "sortFieldChange"; "sortOrder": "sortOrderChange"; "multiSortMeta": "multiSortMetaChange"; "sortChange": "sortChange"; "first": "firstChange"; "rows": "rowsChange"; "pageChange": "pageChange"; "globalFilter": "globalFilterChange"; "filters": "filtersChange"; "filterChange": "filterChange"; "lazyLoad": "lazyLoad"; "expandedRowKeys": "expandedRowKeysChange"; "rowExpand": "rowExpand"; "rowCollapse": "rowCollapse"; "expandedNodeKeys": "expandedNodeKeysChange"; "nodeExpand": "nodeExpand"; "nodeCollapse": "nodeCollapse"; "groupBy": "groupByChange"; "expandedGroups": "expandedGroupsChange"; "aggregates": "aggregatesChange"; "columnResize": "columnResize"; "columnToggled": "columnToggled"; "columnOrder": "columnOrderChange"; "columnReorder": "columnReorder"; "editInit": "editInit"; "editComplete": "editComplete"; "editCancel": "editCancel"; "cellChange": "cellChange"; "rowEditInit": "rowEditInit"; "rowEditSave": "rowEditSave"; "rowEditCancel": "rowEditCancel"; "columnMenuAction": "columnMenuAction"; "pinnedColumns": "pinnedColumnsChange"; "columnPin": "columnPin"; "rowReorder": "rowReorder"; }, ["columnsProjetees", "expansionTpl", "rowActionsTpl", "emptyTpl", "footerTpl", "captionTpl", "groupHeaderTpl", "groupFooterTpl", "cardTpl", "rowCountTpl"], never, true, never>;
2719
2889
  }
2720
2890
 
2721
2891
  /**
@@ -2726,6 +2896,9 @@ declare abstract class CadTableBase<T> {
2726
2896
  * </cad-table>
2727
2897
  * UN composant : plat, ARBRE (`treeField`/`parentKey`), GROUPEMENT (`groupBy`) — moteur CadTreeAdapter ; responsive scroll|priority|stack ; colonnes figées,
2728
2898
  * réordonnables (`columnOrder`), virtual scroll, édition inline cell|row. Tri/filtre/pagination locaux, ou tout délégué en `lazy`.
2899
+ * @atelier icone=table
2900
+ * @atelier-exemple colonnes [{"field":"nom","header":"Nom"},{"field":"etat","header":"État"},{"field":"controle","header":"Dernier contrôle"}]
2901
+ * @atelier-exemple value [{"nom":"Pont de Sèvres","etat":"Bon","controle":"12/03/2026"},{"nom":"Viaduc de Meudon","etat":"À surveiller","controle":"28/05/2026"},{"nom":"Passerelle Rive Sud","etat":"Bon","controle":"02/07/2026"},{"nom":"Tunnel des Acacias","etat":"Dégradé","controle":"19/08/2026"}]
2729
2902
  */
2730
2903
  declare class CadTableComponent<T = Record<string, unknown>> extends CadTableBase<T> {
2731
2904
  private readonly host;
@@ -2994,6 +3167,11 @@ interface CadTreeNodeEvent<T> {
2994
3167
  * </cad-tree>
2995
3168
  * Arbre sans colonnes ; même moteur (CadTreeAdapter) que le mode arbre de cad-table. Données imbriquées (`treeField`) ou plates (`parentKey`+`dataKey`).
2996
3169
  * Clavier : ↑/↓ (nœud suivant/précédent), → déplie / va au 1er enfant, ← replie / remonte au parent, Home/End, Entrée = sélection, Espace = case, * = déplie la fratrie.
3170
+ * @atelier icone=folder-tree
3171
+ * @atelier-exemple value [{"id":1,"label":"Infrastructures"},{"id":2,"label":"Pont de Sèvres","parent":1},{"id":3,"label":"Viaduc de Meudon","parent":1},{"id":4,"label":"Équipements"},{"id":5,"label":"Éclairage public","parent":4},{"id":6,"label":"Signalisation","parent":4}]
3172
+ * @atelier-exemple parentKey "parent"
3173
+ * @atelier-exemple dataKey "id"
3174
+ * @atelier-exemple labelField "label"
2997
3175
  */
2998
3176
  declare class CadTreeComponent<T = Record<string, unknown>> {
2999
3177
  private readonly host;
@@ -3123,6 +3301,7 @@ interface FilterDraft {
3123
3301
  * </div>
3124
3302
  * ou dans `<cad-split ratio="1fr auto">` / `<cad-sidebar>` de la couche layout.
3125
3303
  * Sous `md` (fenêtre) le panneau devient un overlay à droite, fermé par défaut.
3304
+ * @atelier icone=table-properties
3126
3305
  */
3127
3306
  declare class CadTablePanelComponent<T = unknown> {
3128
3307
  private readonly bp;
@@ -3291,6 +3470,8 @@ type CadDataviewLayout = 'list' | 'grid';
3291
3470
  * <ng-template cadDataviewGrid let-p>…carte…</ng-template>
3292
3471
  * </cad-dataview>
3293
3472
  * Remplace p-dataView : liste ou grille de templates, tri/filtre/pagination locaux, squelettes en `loading`.
3473
+ * @atelier icone=layout-list
3474
+ * @atelier-exemple value [{"label":"Pont de Sèvres","etat":"Bon"},{"label":"Viaduc de Meudon","etat":"À surveiller"},{"label":"Passerelle Rive Sud","etat":"Bon"}]
3294
3475
  */
3295
3476
  declare class CadDataviewComponent<T = unknown> {
3296
3477
  readonly value: _angular_core.InputSignal<T[]>;
@@ -3332,6 +3513,7 @@ declare class CadDataviewComponent<T = unknown> {
3332
3513
  * <cad-treeselect [(value)]="v" [options]="arbre" treeField="children" labelField="name" dataKey="id" selectionMode="checkbox" filter clearable/>
3333
3514
  * CVA : valeur = nœud(s) (objets) ; `optionValue` (chemin) pour stocker un identifiant. Panneau CDK avec un cad-tree.
3334
3515
  * single → ferme à la sélection ; multiple/checkbox → chips ou « n sélectionnés » (`display`). Events changed/opened/closed/nodeExpand.
3516
+ * @atelier icone=folder-tree largeur=3 hauteur=1
3335
3517
  */
3336
3518
  declare class CadTreeselectComponent<T = unknown> extends CadValueAccessor<T | T[] | unknown> {
3337
3519
  readonly options: _angular_core.InputSignal<T[]>;
@@ -3394,6 +3576,7 @@ declare class CadTreeselectComponent<T = unknown> extends CadValueAccessor<T | T
3394
3576
  /**
3395
3577
  * <cad-cascade-select [(value)]="commune" [options]="regions" optionLabel="nom" optionValue="code" optionGroupLabel="nom" optionGroupChildren="items" showPath/>
3396
3578
  * CVA valeur FEUILLE. Panneau à colonnes successives (survol/clic ouvre le niveau suivant, ← → ↑ ↓, Entrée choisit). Events changed/opened/closed/groupChange.
3579
+ * @atelier icone=corner-down-right largeur=3 hauteur=1
3397
3580
  */
3398
3581
  declare class CadCascadeSelectComponent<T = unknown, V = unknown> extends CadValueAccessor<V> {
3399
3582
  readonly options: _angular_core.InputSignal<T[]>;
@@ -3450,6 +3633,8 @@ type CadComboSource<T> = T[] | ((query: string) => T[] | Promise<T[]> | Observab
3450
3633
  * <cad-combo [(value)]="ville" [suggestions]="search" optionLabel="nom" [minLength]="2" [delay]="250" dropdown forceSelection placeholder="Commune…"/>
3451
3634
  * Autocomplete (remplace p-autocomplete et le cad-combo du studio). CVA string (texte libre) ou objet (`forceSelection`), `multiple` = chips.
3452
3635
  * `suggestions` = tableau (filtré localement) ou fonction (query) → tableau | Promise | Observable. Template `cadSelectItem`. Clavier ↑↓ Entrée Échap.
3636
+ * @atelier icone=list-filter largeur=3 hauteur=1
3637
+ * @atelier-exemple suggestions [{"label":"Béton armé"},{"label":"Béton précontraint"},{"label":"Acier"},{"label":"Bois lamellé"}]
3453
3638
  */
3454
3639
  declare class CadComboComponent<T = unknown> extends CadValueAccessor<unknown> {
3455
3640
  readonly suggestions: _angular_core.InputSignal<CadComboSource<T>>;
@@ -3561,6 +3746,7 @@ interface DayCell {
3561
3746
  * CVA<CadDateValue>. `dataType='string'` (défaut, compat studio/Postgres) → ISO local
3562
3747
  * ("yyyy-MM-dd" / "yyyy-MM-ddTHH:mm" / "HH:mm" / "yyyy-MM" / "yyyy") ; `dataType='date'` → Date.
3563
3748
  * `selectionMode='range'` → [debut, fin] ; 'multiple' → tableau.
3749
+ * @atelier icone=calendar-days largeur=3 hauteur=1
3564
3750
  */
3565
3751
  declare class CadDatepickerComponent extends CadValueAccessor<CadDateValue> {
3566
3752
  private readonly host;
@@ -3884,6 +4070,7 @@ declare abstract class CadOverlayBase implements OnDestroy {
3884
4070
  * </cad-dialog>
3885
4071
  * Remplace p-dialog. Chrome partagé (CadDialogContainerComponent), focus trap, Escape/backdrop configurables.
3886
4072
  * Mobile : plein écran par défaut (`mobileFullscreen`), ou feuille basse (`mobileSheet`).
4073
+ * @atelier icone=message-square
3887
4074
  */
3888
4075
  declare class CadDialogComponent extends CadOverlayBase {
3889
4076
  readonly width: _angular_core.InputSignal<string | undefined>;
@@ -3911,6 +4098,7 @@ declare class CadDialogComponent extends CadOverlayBase {
3911
4098
  * </cad-drawer>
3912
4099
  * Remplace p-drawer. Même chrome/slots que cad-dialog (cadDialogHeader / cadDialogFooter), glissement 180 ms.
3913
4100
  * Mobile : `mobileSize` ('full' par défaut = pleine largeur / hauteur).
4101
+ * @atelier icone=panel-right
3914
4102
  */
3915
4103
  declare class CadDrawerComponent extends CadOverlayBase {
3916
4104
  readonly position: _angular_core.InputSignal<CadDrawerPosition>;
@@ -3983,6 +4171,7 @@ declare class CadConfirmService {
3983
4171
  /**
3984
4172
  * <cad-confirm-dialog key="…"/> — wrapper de migration (PrimeNG exigeait un p-confirmDialog dans le template).
3985
4173
  * cadriciel-ui n'en a PAS besoin (CadConfirmService rend lui-même) : ce composant ne fait rien et peut être retiré.
4174
+ * @atelier icone=help-circle
3986
4175
  */
3987
4176
  declare class CadConfirmDialogComponent {
3988
4177
  readonly key: _angular_core.InputSignal<string>;
@@ -4046,6 +4235,7 @@ declare class CadTooltipDirective implements OnDestroy {
4046
4235
  * <button (click)="p.toggle($event)">…</button>
4047
4236
  * Panneau flottant ancré sur une cible passée à `open(target)`. Base du futur menu contextuel.
4048
4237
  * Mobile : `mobile="sheet"` → sous le seuil mobile le contenu s'ouvre en feuille basse (défaut 'popover' = inchangé).
4238
+ * @atelier icone=message-circle
4049
4239
  */
4050
4240
  declare class CadPopoverComponent implements OnDestroy {
4051
4241
  private readonly overlay;
@@ -4161,6 +4351,7 @@ interface ToastItem {
4161
4351
  /**
4162
4352
  * <cad-toast position="top-right" [life]="4000" [maxVisible]="5" [preventDuplicates]="true" [showProgress]="true" />
4163
4353
  * Conteneur des toasts d'un `key` (ou sans clé). Position fixe hors flux, pause au survol, aria-live.
4354
+ * @atelier icone=bell
4164
4355
  */
4165
4356
  declare class CadToastComponent {
4166
4357
  private readonly svc;
@@ -4196,6 +4387,7 @@ declare class CadToastComponent {
4196
4387
  /**
4197
4388
  * <cad-message severity="warning" [closable]="true">Le certificat expire dans 6 jours.</cad-message>
4198
4389
  * Message inline (remplace p-message). `text` ou contenu projeté ; `icon` (nom cad-icon, '' = sans icône) ; variant soft|outline ; size sm|md.
4390
+ * @atelier icone=info largeur=6 hauteur=1 pose-text="Message d'information"
4199
4391
  */
4200
4392
  declare class CadMessageComponent {
4201
4393
  readonly severity: _angular_core.InputSignal<"secondary" | "success" | "warning" | "danger" | "info">;
@@ -4218,8 +4410,15 @@ declare class CadMessageComponent {
4218
4410
  /**
4219
4411
  * <cad-avatar [src]="url" text="SZ" icon="user" size="sm|md|lg" shape="circle|square" [color]="'#…'" />
4220
4412
  * Sans `color`, la teinte est dérivée du texte (hash → hue) : stable pour un même utilisateur.
4413
+ * @atelier ajustement=naturel icone=user-round largeur=1 hauteur=1 pose-text=AB
4221
4414
  */
4222
4415
  declare class CadAvatarComponent {
4416
+ /**
4417
+ * Son élément, exposé comme `cad-button` le fait déjà : le groupe marque le
4418
+ * débordement (`.is-overflow`) sur les éléments, et une requête de contenu ne les
4419
+ * rapporte pas pour un avatar POSÉ hors gabarit.
4420
+ */
4421
+ readonly el: ElementRef<HTMLElement>;
4223
4422
  readonly src: _angular_core.InputSignal<string | null | undefined>;
4224
4423
  readonly text: _angular_core.InputSignal<string>;
4225
4424
  readonly icon: _angular_core.InputSignal<string>;
@@ -4239,6 +4438,7 @@ declare class CadAvatarComponent {
4239
4438
  /**
4240
4439
  * <cad-chip label="szu" icon="user" [image]="url" avatarText="SZ" removable [selected] [disabled] size="sm|md" severity="primary" (removed) (clicked)/>
4241
4440
  * Backspace/Suppr sur un chip focalisé → `removed`. `clickable` rend le chip actionnable (role=button).
4441
+ * @atelier ajustement=naturel icone=tags largeur=2 hauteur=1 pose-label=Élément
4242
4442
  */
4243
4443
  declare class CadChipComponent {
4244
4444
  readonly label: _angular_core.InputSignal<string>;
@@ -4262,7 +4462,10 @@ declare class CadChipComponent {
4262
4462
  }
4263
4463
 
4264
4464
  type CadTagSeverity = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';
4265
- /** <cad-tag severity="success" dot value="En ligne" /> — statut compact (fond soft + point). */
4465
+ /**
4466
+ * <cad-tag severity="success" dot value="En ligne" /> — statut compact (fond soft + point).
4467
+ * @atelier ajustement=naturel icone=tag largeur=1 hauteur=1 pose-value=Étiquette
4468
+ */
4266
4469
  declare class CadTagComponent {
4267
4470
  readonly value: _angular_core.InputSignal<string>;
4268
4471
  readonly severity: _angular_core.InputSignal<CadTagSeverity>;
@@ -4275,7 +4478,10 @@ declare class CadTagComponent {
4275
4478
  }
4276
4479
 
4277
4480
  type CadBadgeSeverity = 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';
4278
- /** <cad-badge [value]="3" [max]="99" severity="danger" [dot] size="sm|md" /> */
4481
+ /**
4482
+ * <cad-badge [value]="3" [max]="99" severity="danger" [dot] size="sm|md" />
4483
+ * @atelier ajustement=naturel icone=badge-check largeur=1 hauteur=1 pose-value=3
4484
+ */
4279
4485
  declare class CadBadgeComponent {
4280
4486
  readonly value: _angular_core.InputSignal<string | number | null>;
4281
4487
  readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -4306,7 +4512,10 @@ declare class CadBadgeDirective {
4306
4512
  }
4307
4513
 
4308
4514
  type CadProgressSeverity = 'primary' | 'success' | 'warning' | 'danger' | 'info';
4309
- /** <cad-progress [value]="62" [max]="100" [indeterminate] severity size="sm|md|lg" showValue label="Build" striped /> */
4515
+ /**
4516
+ * <cad-progress [value]="62" [max]="100" [indeterminate] severity size="sm|md|lg" showValue label="Build" striped />
4517
+ * @atelier icone=percent largeur=4 hauteur=1 pose-value=60
4518
+ */
4310
4519
  declare class CadProgressComponent {
4311
4520
  readonly value: _angular_core.InputSignalWithTransform<number, unknown>;
4312
4521
  readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -4321,7 +4530,10 @@ declare class CadProgressComponent {
4321
4530
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadProgressComponent, never>;
4322
4531
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadProgressComponent, "cad-progress", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "severity": { "alias": "severity"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "striped": { "alias": "striped"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4323
4532
  }
4324
- /** <cad-spinner [size]="24" [strokeWidth]="2.5" severity ariaLabel="Chargement" /> */
4533
+ /**
4534
+ * <cad-spinner [size]="24" [strokeWidth]="2.5" severity ariaLabel="Chargement" />
4535
+ * @atelier ajustement=naturel icone=loader-2 largeur=1 hauteur=1
4536
+ */
4325
4537
  declare class CadSpinnerComponent {
4326
4538
  readonly size: _angular_core.InputSignalWithTransform<number, unknown>;
4327
4539
  readonly strokeWidth: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -4331,7 +4543,10 @@ declare class CadSpinnerComponent {
4331
4543
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadSpinnerComponent, "cad-spinner", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; "isSignal": true; }; "severity": { "alias": "severity"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4332
4544
  }
4333
4545
 
4334
- /** <cad-skeleton width="70%" height="12px" shape="text|rect|circle" [lines]="3" [animation]="true" /> */
4546
+ /**
4547
+ * <cad-skeleton width="70%" height="12px" shape="text|rect|circle" [lines]="3" [animation]="true" />
4548
+ * @atelier icone=loader
4549
+ */
4335
4550
  declare class CadSkeletonComponent {
4336
4551
  readonly width: _angular_core.InputSignal<string>;
4337
4552
  readonly height: _angular_core.InputSignal<string>;
@@ -4358,6 +4573,7 @@ declare class CadCardHeaderDirective {
4358
4573
  * contenu
4359
4574
  * <div cadCardFooter>…</div>
4360
4575
  * </cad-card>
4576
+ * @atelier icone=layout-template conteneur=flux largeur=6 hauteur=6 rang=2
4361
4577
  */
4362
4578
  declare class CadCardComponent {
4363
4579
  readonly header: _angular_core.InputSignal<string>;
@@ -4373,7 +4589,10 @@ declare class CadCardComponent {
4373
4589
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadCardComponent, "cad-card", never, { "header": { "alias": "header"; "required": false; "isSignal": true; }; "subheader": { "alias": "subheader"; "required": false; "isSignal": true; }; "hoverable": { "alias": "hoverable"; "required": false; "isSignal": true; }; "flat": { "alias": "flat"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, ["headerTpl"], ["[cadCardActions]", "*", "[cadCardFooter]"], true, never>;
4374
4590
  }
4375
4591
 
4376
- /** <cad-divider [vertical] align="left|center|right" [dashed]>texte optionnel</cad-divider> */
4592
+ /**
4593
+ * <cad-divider [vertical] align="left|center|right" [dashed]>texte optionnel</cad-divider>
4594
+ * @atelier icone=minus largeur=12 hauteur=1
4595
+ */
4377
4596
  declare class CadDividerComponent {
4378
4597
  readonly vertical: _angular_core.InputSignalWithTransform<boolean, unknown>;
4379
4598
  readonly dashed: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -4391,6 +4610,7 @@ declare class CadFieldsetLegendDirective {
4391
4610
  /**
4392
4611
  * <cad-fieldset legend="Options avancées" toggleable [(collapsed)]="c" (toggled)="…">…</cad-fieldset>
4393
4612
  * Remplace p-fieldset : légende posée sur la bordure, contenu repliable (animation grid-rows, `inert` fermé).
4613
+ * @atelier icone=square-dashed conteneur=flux largeur=6 hauteur=5
4394
4614
  */
4395
4615
  declare class CadFieldsetComponent {
4396
4616
  readonly legend: _angular_core.InputSignal<string>;
@@ -4417,6 +4637,7 @@ declare class CadPanelHeadingDirective {
4417
4637
  * <div cadPanelFooter>…</div>
4418
4638
  * </cad-panel>
4419
4639
  * Remplace p-panel : en-tête 42 px fond `--cad-bg-subtle`, repli animé.
4640
+ * @atelier icone=panel-top conteneur=flux largeur=6 hauteur=6 rang=1
4420
4641
  */
4421
4642
  declare class CadPanelComponent {
4422
4643
  readonly header: _angular_core.InputSignal<string>;
@@ -4426,6 +4647,14 @@ declare class CadPanelComponent {
4426
4647
  readonly flat: _angular_core.InputSignalWithTransform<boolean, unknown>;
4427
4648
  readonly toggled: _angular_core.OutputEmitterRef<boolean>;
4428
4649
  readonly headingTpl: _angular_core.Signal<CadPanelHeadingDirective | undefined>;
4650
+ /**
4651
+ * Un en-tête qui n'a RIEN à montrer ne se dessine pas (SZU 24/08 : un panel nu posé
4652
+ * dans l'atelier arborait une barre vide de 42 px). Masqué en CSS et non par un @if :
4653
+ * un `@if` autour d'un `<ng-content>` ferait retomber la projection dans le corps —
4654
+ * piège payé le 22/08. Limite assumée : des actions `[cadPanelActions]` SANS titre ni
4655
+ * repli restent masquées avec l'en-tête — donner alors un `header`.
4656
+ */
4657
+ protected readonly sansEntete: _angular_core.Signal<boolean>;
4429
4658
  protected readonly id: string;
4430
4659
  toggle(): void;
4431
4660
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadPanelComponent, never>;
@@ -4435,18 +4664,30 @@ declare class CadPanelComponent {
4435
4664
  /**
4436
4665
  * <cad-avatar-group [max]="3" size="md"><cad-avatar text="SZ"/><cad-avatar text="PA"/>…</cad-avatar-group>
4437
4666
  * Avatars empilés (chevauchement, bordure surface) ; au-delà de `max` un avatar « +N » (title = noms masqués).
4667
+ * @atelier ajustement=naturel icone=users largeur=2 hauteur=1 conteneur=direct accepte=cad-avatar
4438
4668
  */
4439
4669
  declare class CadAvatarGroupComponent {
4440
4670
  readonly max: _angular_core.InputSignalWithTransform<number | null, unknown>;
4441
4671
  readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
4442
4672
  readonly moreColor: _angular_core.InputSignal<string | null>;
4673
+ private readonly avatarsProjetes;
4674
+ /**
4675
+ * Avatars POSÉS hors gabarit, annoncés par `enregistrerEnfants`
4676
+ * (cf. `atelier/atelier.pieces.ts`).
4677
+ *
4678
+ * Le groupe RENDAIT correctement sans eux — le chevauchement et les bordures sont du
4679
+ * CSS sur les enfants directs. Seul `max` était inerte : le « +N » ne comptait rien et
4680
+ * rien ne passait en débordement. Une panne discrète, donc pire qu'une panne franche.
4681
+ */
4682
+ private readonly avatarsPoses;
4443
4683
  private readonly avatars;
4444
- private readonly avatarEls;
4684
+ /** Reçoit la LISTE COMPLÈTE des avatars posés. Le groupe filtre ce qui n'en est pas un. */
4685
+ enregistrerEnfants(instances: unknown[]): void;
4445
4686
  readonly hidden: _angular_core.Signal<number>;
4446
4687
  readonly hiddenTitle: _angular_core.Signal<string>;
4447
4688
  constructor();
4448
4689
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadAvatarGroupComponent, never>;
4449
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadAvatarGroupComponent, "cad-avatar-group", never, { "max": { "alias": "max"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "moreColor": { "alias": "moreColor"; "required": false; "isSignal": true; }; }, {}, ["avatars", "avatarEls"], ["*"], true, never>;
4690
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadAvatarGroupComponent, "cad-avatar-group", never, { "max": { "alias": "max"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "moreColor": { "alias": "moreColor"; "required": false; "isSignal": true; }; }, {}, ["avatarsProjetes"], ["*"], true, never>;
4450
4691
  }
4451
4692
 
4452
4693
  interface CadMeterValue {
@@ -4465,6 +4706,8 @@ declare class CadMeterLabelDirective {
4465
4706
  /**
4466
4707
  * <cad-meter [values]="[{label:'Utilisé', value: 62, severity:'primary'}, {label:'Réservé', value: 18, severity:'warning'}]" [max]="100" unit="Gi" showLabels/>
4467
4708
  * Jauge segmentée (remplace p-meterGroup) : segments proportionnels, légende (point + label + valeur/%), horizontal ou vertical.
4709
+ * @atelier icone=gauge
4710
+ * @atelier-exemple values [{"label":"Utilisé","value":62,"severity":"primary"},{"label":"Réservé","value":21,"severity":"warning"}]
4468
4711
  */
4469
4712
  declare class CadMeterComponent {
4470
4713
  readonly values: _angular_core.InputSignal<CadMeterValue[]>;
@@ -4518,6 +4761,8 @@ type CadTimelineAlign = 'left' | 'right' | 'alternate' | 'top' | 'bottom';
4518
4761
  * <ng-template cadTimelineContent let-e let-i="index"><b>{{ e.title }}</b></ng-template>
4519
4762
  * </cad-timeline>
4520
4763
  * `activeIndex` : les événements d'index ≤ activeIndex sont « passés » (marqueur/connecteur en accent).
4764
+ * @atelier icone=milestone
4765
+ * @atelier-exemple events [{"title":"Mise en service","date":"2019"},{"title":"Première inspection","date":"2022"},{"title":"Réparations","date":"2024"},{"title":"Inspection décennale","date":"2029"}]
4521
4766
  */
4522
4767
  declare class CadTimelineComponent<T = unknown> {
4523
4768
  readonly events: _angular_core.InputSignal<T[]>;
@@ -4548,6 +4793,7 @@ interface CadCarouselResponsive {
4548
4793
  * <ng-template cadCarouselItem let-it let-i="index">…</ng-template>
4549
4794
  * </cad-carousel>
4550
4795
  * `numVisible` responsive par breakpoints FENÊTRE ("1 sm:2 lg:3") ou `[responsive]="[{breakpoint:768,numVisible:1}]"` (max-width du CONTENEUR).
4796
+ * @atelier icone=images
4551
4797
  */
4552
4798
  declare class CadCarouselComponent<T = unknown> {
4553
4799
  private readonly bp;
@@ -4591,6 +4837,7 @@ declare class CadCarouselComponent<T = unknown> {
4591
4837
  /**
4592
4838
  * <cad-image src="…" alt="…" width="240px" height="160px" fit="cover" rounded preview caption="Légende" fallback="/assets/nope.png"/>
4593
4839
  * Aperçu plein écran (clic) : zoom ± / molette, rotation, téléchargement, Échap/croix ; squelette pendant le chargement, image de repli sur erreur.
4840
+ * @atelier icone=image
4594
4841
  */
4595
4842
  declare class CadImageComponent {
4596
4843
  readonly src: _angular_core.InputSignal<string>;
@@ -4628,6 +4875,7 @@ declare class CadImageComponent {
4628
4875
  /**
4629
4876
  * <cad-scroll-top [threshold]="400" target="window" behavior="smooth"/> — bouton flottant « remonter » (fondu au-delà du seuil).
4630
4877
  * `target` = 'window' ou un élément défilant (`[target]="scroller"`).
4878
+ * @atelier icone=arrow-up largeur=1 hauteur=1
4631
4879
  */
4632
4880
  declare class CadScrollTopComponent {
4633
4881
  readonly target: _angular_core.InputSignal<HTMLElement | "window">;
@@ -4696,7 +4944,10 @@ declare class CadIfDirective {
4696
4944
 
4697
4945
  type Align = 'stretch' | 'start' | 'center' | 'end' | 'baseline';
4698
4946
  type Justify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';
4699
- /** Pile verticale : `<cad-stack gap="sm" align="stretch">` — les enfants s'empilent avec un gap uniforme (jamais de marges). */
4947
+ /**
4948
+ * Pile verticale : `<cad-stack gap="sm" align="stretch">` — les enfants s'empilent avec un gap uniforme (jamais de marges).
4949
+ * @atelier icone=rows conteneur=flux largeur=4 hauteur=5
4950
+ */
4700
4951
  declare class CadStackComponent {
4701
4952
  readonly gap: _angular_core.InputSignal<CadGap>;
4702
4953
  readonly align: _angular_core.InputSignal<Align>;
@@ -4708,7 +4959,10 @@ declare class CadStackComponent {
4708
4959
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadStackComponent, never>;
4709
4960
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadStackComponent, "cad-stack", never, { "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "justify": { "alias": "justify"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
4710
4961
  }
4711
- /** Groupe horizontal qui replie : `<cad-cluster gap="sm" justify="between" align="center">` (boutons, chips, méta). */
4962
+ /**
4963
+ * Groupe horizontal qui replie : `<cad-cluster gap="sm" justify="between" align="center">` (boutons, chips, méta).
4964
+ * @atelier icone=boxes conteneur=flux largeur=6 hauteur=3
4965
+ */
4712
4966
  declare class CadClusterComponent {
4713
4967
  readonly gap: _angular_core.InputSignal<CadGap>;
4714
4968
  readonly align: _angular_core.InputSignal<Align>;
@@ -4725,6 +4979,15 @@ declare class CadClusterComponent {
4725
4979
  * Grille responsive : `<cad-grid cols="1 sm:2 lg:4" gap="md">` (breakpoints FENÊTRE, mobile-first)
4726
4980
  * ou `<cad-grid min="220px">` (auto-fit : autant de colonnes que le CONTENEUR en accepte — préférer pour les composants).
4727
4981
  * Enfant : `<div cadCol="2">` / `cadCol="1 md:2"` = span, `cadCol="full"` = toute la largeur.
4982
+ *
4983
+ * CONTENEUR D'ATELIER en régime `direct`, et non `flux` (27/08) : en flux, l'atelier
4984
+ * envelopperait les enfants dans SA propre grille 12 colonnes, la grille posée n'aurait
4985
+ * plus qu'un seul enfant et son `cols` ne servirait plus à rien — un conteneur qui a
4986
+ * l'air de marcher et ne fait rien. En direct, les enfants sont projetés nus et c'est
4987
+ * bien `cols` / `min` qui les place, ce qu'on vient chercher en posant une grille.
4988
+ * Aucune trappe d'accueil n'est nécessaire ici : `cad-grid` ne fait ni requête de
4989
+ * contenu ni injection depuis ses enfants, il ne les REGARDE pas, il les dispose.
4990
+ * @atelier icone=grid conteneur=direct largeur=12 hauteur=4
4728
4991
  */
4729
4992
  declare class CadGridComponent {
4730
4993
  readonly cols: _angular_core.InputSignal<string | number>;
@@ -4748,7 +5011,10 @@ declare class CadColDirective {
4748
5011
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadColDirective, never>;
4749
5012
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CadColDirective, "[cadCol]", never, { "cadCol": { "alias": "cadCol"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4750
5013
  }
4751
- /** Deux zones : `<cad-split ratio="1fr auto" gap="md" stackAt="md">` — sous `stackAt`, empilé. */
5014
+ /**
5015
+ * Deux zones : `<cad-split ratio="1fr auto" gap="md" stackAt="md">` — sous `stackAt`, empilé.
5016
+ * @atelier icone=split-square-horizontal
5017
+ */
4752
5018
  declare class CadSplitComponent {
4753
5019
  private readonly bp;
4754
5020
  readonly ratio: _angular_core.InputSignal<string>;
@@ -4771,6 +5037,7 @@ declare class CadSidebarPanelDirective {
4771
5037
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadSidebarPanelDirective, never>;
4772
5038
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CadSidebarPanelDirective, "[cadSidebarPanel]", never, {}, {}, never, never, true, never>;
4773
5039
  }
5040
+ /** @atelier icone=panel-left */
4774
5041
  declare class CadSidebarComponent {
4775
5042
  private readonly bp;
4776
5043
  readonly side: _angular_core.InputSignal<"left" | "right">;
@@ -4785,7 +5052,10 @@ declare class CadSidebarComponent {
4785
5052
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadSidebarComponent, never>;
4786
5053
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadSidebarComponent, "cad-sidebar", never, { "side": { "alias": "side"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "contentMin": { "alias": "contentMin"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "collapseAt": { "alias": "collapseAt"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
4787
5054
  }
4788
- /** Centre horizontalement avec largeur max : `<cad-center maxWidth="60ch" [gutters]="'16px'" andText>` */
5055
+ /**
5056
+ * Centre horizontalement avec largeur max : `<cad-center maxWidth="60ch" [gutters]="'16px'" andText>`
5057
+ * @atelier icone=crosshair
5058
+ */
4789
5059
  declare class CadCenterComponent {
4790
5060
  readonly maxWidth: _angular_core.InputSignal<string>;
4791
5061
  readonly gutters: _angular_core.InputSignal<string>;
@@ -4794,7 +5064,10 @@ declare class CadCenterComponent {
4794
5064
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadCenterComponent, never>;
4795
5065
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadCenterComponent, "cad-center", never, { "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "gutters": { "alias": "gutters"; "required": false; "isSignal": true; }; "andText": { "alias": "andText"; "required": false; "isSignal": true; }; "intrinsic": { "alias": "intrinsic"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
4796
5066
  }
4797
- /** Conteneur de page : `<cad-container size="lg" padding="md">` — largeur max par taille (sm 640, md 768, lg 1024, xl 1280, 2xl 1536, full = --cad-container-max), centré. */
5067
+ /**
5068
+ * Conteneur de page : `<cad-container size="lg" padding="md">` — largeur max par taille (sm 640, md 768, lg 1024, xl 1280, 2xl 1536, full = --cad-container-max), centré.
5069
+ * @atelier icone=box conteneur=flux largeur=6 hauteur=5
5070
+ */
4798
5071
  declare class CadContainerComponent {
4799
5072
  readonly size: _angular_core.InputSignal<"sm" | "md" | "lg" | "xl" | "2xl" | "full">;
4800
5073
  readonly padding: _angular_core.InputSignal<CadGap>;
@@ -4803,7 +5076,15 @@ declare class CadContainerComponent {
4803
5076
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadContainerComponent, never>;
4804
5077
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadContainerComponent, "cad-container", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
4805
5078
  }
4806
- /** Espace flexible (pousse ce qui suit) ou fixe : `<cad-spacer/>` · `<cad-spacer size="lg"/>` */
5079
+ /**
5080
+ * Espace flexible (pousse ce qui suit) ou fixe : `<cad-spacer/>` · `<cad-spacer size="lg"/>`
5081
+ *
5082
+ * `surface=aucune` : il occupe sa place et ne dessine RIEN. Posé dans une maquette, il
5083
+ * fait donc exactement son travail en restant invisible — indistinguable d'un composant
5084
+ * qui n'aurait pas été posé (SZU 27/08). L'atelier s'en sert pour le MATÉRIALISER le
5085
+ * temps de la conception ; le rendu, lui, n'en sait rien.
5086
+ * @atelier icone=move-horizontal surface=aucune
5087
+ */
4807
5088
  declare class CadSpacerComponent {
4808
5089
  readonly size: _angular_core.InputSignal<"" | CadGap>;
4809
5090
  protected readonly cadGap: typeof cadGap;
@@ -4811,7 +5092,10 @@ declare class CadSpacerComponent {
4811
5092
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadSpacerComponent, "cad-spacer", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4812
5093
  }
4813
5094
 
4814
- /** Panneau d'un splitter : `<cad-splitter-panel [size]="30" [minSize]="10">…</cad-splitter-panel>` (size en %). */
5095
+ /**
5096
+ * Panneau d'un splitter : `<cad-splitter-panel [size]="30" [minSize]="10">…</cad-splitter-panel>` (size en %).
5097
+ * @atelier icone=square conteneur=flux dans=cad-splitter
5098
+ */
4815
5099
  declare class CadSplitterPanelComponent {
4816
5100
  readonly size: _angular_core.InputSignalWithTransform<number | null, unknown>;
4817
5101
  readonly minSize: _angular_core.InputSignalWithTransform<number, unknown>;
@@ -4823,6 +5107,7 @@ declare class CadSplitterPanelComponent {
4823
5107
  * <cad-splitter-panel>…</cad-splitter-panel><cad-splitter-panel>…</cad-splitter-panel>
4824
5108
  * </cad-splitter>
4825
5109
  * Gouttière glissable (pointer), double-clic = tailles initiales, clavier ←→/↑↓ (±2 %), `role=separator`, persistance localStorage via `stateKey`, imbriquable.
5110
+ * @atelier icone=columns conteneur=direct largeur=12 hauteur=8
4826
5111
  */
4827
5112
  declare class CadSplitterComponent {
4828
5113
  private readonly host;
@@ -4833,7 +5118,22 @@ declare class CadSplitterComponent {
4833
5118
  readonly stateKey: _angular_core.InputSignal<string>;
4834
5119
  readonly resizeStart: _angular_core.OutputEmitterRef<number[]>;
4835
5120
  readonly resizeEnd: _angular_core.OutputEmitterRef<number[]>;
4836
- readonly panels: _angular_core.Signal<readonly CadSplitterPanelComponent[]>;
5121
+ /** Panneaux déclarés dans un GABARIT — la voie normale. */
5122
+ private readonly panelsProjetes;
5123
+ /**
5124
+ * Panneaux POSÉS, créés hors gabarit et annoncés par `enregistrerEnfants`
5125
+ * (cf. `atelier/atelier.pieces.ts`).
5126
+ *
5127
+ * Sans eux, `panels()` reste vide pour un splitter posé : aucune gouttière, aucune
5128
+ * taille calculée, `grid-template-columns` vide — mesuré à `gouttieres=0` le 27/08.
5129
+ * Les panneaux s'affichaient quand même (ils sont projetés), ce qui donnait un
5130
+ * splitter d'apparence correcte mais sans mise en page ni poignée.
5131
+ */
5132
+ private readonly panelsPoses;
5133
+ /** Tous les panneaux : projetés d'abord, posés ensuite — l'ordre fait les colonnes. */
5134
+ readonly panels: _angular_core.Signal<CadSplitterPanelComponent[]>;
5135
+ /** Reçoit la LISTE COMPLÈTE des panneaux posés. L'hôte filtre ce qui n'en est pas un. */
5136
+ enregistrerEnfants(instances: unknown[]): void;
4837
5137
  readonly sizes: _angular_core.WritableSignal<number[]>;
4838
5138
  readonly gutters: _angular_core.Signal<number[]>;
4839
5139
  readonly mins: _angular_core.Signal<number[]>;
@@ -4850,7 +5150,7 @@ declare class CadSplitterComponent {
4850
5150
  protected onDown(e: PointerEvent, g: number): void;
4851
5151
  protected onKey(e: KeyboardEvent, g: number): void;
4852
5152
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadSplitterComponent, never>;
4853
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadSplitterComponent, "cad-splitter", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "panelSizes": { "alias": "panelSizes"; "required": false; "isSignal": true; }; "minSizes": { "alias": "minSizes"; "required": false; "isSignal": true; }; "gutterSize": { "alias": "gutterSize"; "required": false; "isSignal": true; }; "stateKey": { "alias": "stateKey"; "required": false; "isSignal": true; }; }, { "resizeStart": "resizeStart"; "resizeEnd": "resizeEnd"; }, ["panels"], ["*"], true, never>;
5153
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadSplitterComponent, "cad-splitter", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "panelSizes": { "alias": "panelSizes"; "required": false; "isSignal": true; }; "minSizes": { "alias": "minSizes"; "required": false; "isSignal": true; }; "gutterSize": { "alias": "gutterSize"; "required": false; "isSignal": true; }; "stateKey": { "alias": "stateKey"; "required": false; "isSignal": true; }; }, { "resizeStart": "resizeStart"; "resizeEnd": "resizeEnd"; }, ["panelsProjetes"], ["*"], true, never>;
4854
5154
  }
4855
5155
 
4856
5156
  /**
@@ -4942,6 +5242,7 @@ declare const CAD_SHELL: InjectionToken<CadShellApi>;
4942
5242
  * En application autonome (ajoutée à l'écran d'accueil), la page ne passe pas sous la bande
4943
5243
  * d'état : `viewport-fit=cover` n'y suffit pas et c'est `<meta name="theme-color">`, tenu à
4944
5244
  * jour avec le thème, qui donne la continuité.
5245
+ * @atelier icone=layout-dashboard
4945
5246
  */
4946
5247
  declare class CadAppShellComponent implements CadShellApi {
4947
5248
  private readonly bp;
@@ -5201,6 +5502,7 @@ declare const CAD_MAP_CHILD: InjectionToken<CadMapChild>;
5201
5502
  * <div cadMapTopLeft>…</div> ← coins (recherche, légende, chrome…)
5202
5503
  * </cad-map>
5203
5504
  * MapLibre est chargé à la demande ; le fond change sans perdre les couches ; `followTheme` bascule clair/sombre avec `.theme-dark`.
5505
+ * @atelier icone=map conteneur=direct
5204
5506
  */
5205
5507
  declare class CadMapComponent {
5206
5508
  private readonly registry;
@@ -5272,6 +5574,20 @@ declare class CadMapComponent {
5272
5574
  readonly allChildren: _angular_core.Signal<readonly CadMapChild[]>;
5273
5575
  registerChild(k: CadMapChild): void;
5274
5576
  unregisterChild(k: CadMapChild): void;
5577
+ /**
5578
+ * Contrat d'accueil des pièces POSÉES (cf. `atelier/atelier.pieces.ts`).
5579
+ *
5580
+ * ⚠️ CORRIGE UN MENSONGE LIVRÉ LE 24/08. `cad-map` était annoté conteneur et ses onze
5581
+ * pièces déclaraient `dans=cad-map`, mais AUCUNE couche posée ne s'est jamais
5582
+ * enregistrée : la carte n'exposait que `registerChild`, que les poseurs n'appellent
5583
+ * pas, et `cad-map-layer` s'injecte la carte en `optional` — donc `null` sans chaîne
5584
+ * d'injecteurs, donc pas d'auto-enregistrement, et pas la moindre erreur pour le dire.
5585
+ * Deux vocabulaires pour un besoin : c'est la divergence qu'on paie ici.
5586
+ *
5587
+ * Liste COMPLÈTE à chaque appel : le poseur reconstruit ses enfants d'un bloc, et un
5588
+ * contrat incrémental laisserait des couches fantômes sur la carte.
5589
+ */
5590
+ enregistrerEnfants(instances: unknown[]): void;
5275
5591
  /** Événements du chrome intégré (dessin, import). */
5276
5592
  readonly drawChange: _angular_core.OutputEmitterRef<object>;
5277
5593
  readonly layerImport: _angular_core.OutputEmitterRef<{
@@ -5373,6 +5689,7 @@ interface CadFeatureEvent {
5373
5689
  * <cad-map-layer id="oa" label="Ouvrages d'art" type="geojson" [data]="geojson" [style]="{ color: { field:'etat', categories:{…} }, radius: 6 }" cluster [popupTemplate]="tpl" (featureClick)/>
5374
5690
  * <cad-map-layer id="ppri" label="PPRI" type="wms" url="https://…/wms" layers="PPRI" [opacity]=".6"/>
5375
5691
  * Enfant de <cad-map>, sans rendu : crée/maintient sources et couches MapLibre, réagit aux inputs, survit aux changements de fond.
5692
+ * @atelier icone=layers dans=cad-map
5376
5693
  */
5377
5694
  declare class CadMapLayerComponent implements CadMapChild {
5378
5695
  private readonly mapCmp;
@@ -5478,6 +5795,7 @@ declare class CadMapLayerComponent implements CadMapChild {
5478
5795
  /**
5479
5796
  * <cad-map-legend/> (dans un coin de la carte : `<cad-map-legend cadMapBottomRight/>`) — légende auto des couches visibles de la carte parente,
5480
5797
  * ou `[layers]="[layerA, layerB]"`, ou `[items]="CadLegendItem[]"` (manuel). Repliable, `title`, `compact`.
5798
+ * @atelier icone=clipboard-list dans=cad-map
5481
5799
  */
5482
5800
  declare class CadMapLegendComponent {
5483
5801
  private readonly mapCmp;
@@ -5544,6 +5862,7 @@ declare class CadGeocodingService {
5544
5862
  /**
5545
5863
  * <cad-map-search cadMapTopLeft placeholder="Adresse, commune…" (select)="…"/> — recherche d'adresse (BAN par défaut ou `provider`),
5546
5864
  * résultats au fil de la frappe, ↑↓ Entrée Échap, sélection → flyTo + marqueur temporaire sur la carte parente.
5865
+ * @atelier icone=search dans=cad-map
5547
5866
  */
5548
5867
  declare class CadMapSearchComponent {
5549
5868
  private readonly geo;
@@ -5592,6 +5911,7 @@ declare class CadMapSearchComponent {
5592
5911
  * <div cadMapRailBottom>v1.2</div>
5593
5912
  * </cad-map-rail>
5594
5913
  */
5914
+ /** @atelier dans=cad-map */
5595
5915
  declare class CadMapRailComponent {
5596
5916
  private readonly mapCmp;
5597
5917
  readonly position: _angular_core.InputSignal<CadMapSide>;
@@ -5600,6 +5920,7 @@ declare class CadMapRailComponent {
5600
5920
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadMapRailComponent, never>;
5601
5921
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadMapRailComponent, "cad-map-rail", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, {}, never, ["*", "[cadMapRailBottom]"], true, never>;
5602
5922
  }
5923
+ /** @atelier dans=cad-map */
5603
5924
  declare class CadMapRailItemComponent {
5604
5925
  readonly mapCmp: CadMapComponent | null;
5605
5926
  readonly icon: _angular_core.InputSignal<string>;
@@ -5619,6 +5940,7 @@ declare class CadMapRailItemComponent {
5619
5940
  * Panneau accolé au rail : <cad-map-panel id="carto" header="Cartographie" [width]="300" side="left" [(open)]>
5620
5941
  * <cad-map-section header="Fonds de carte" expanded><cad-map-basemaps/></cad-map-section>
5621
5942
  * </cad-map-panel>
5943
+ * @atelier icone=panel-right dans=cad-map
5622
5944
  */
5623
5945
  declare class CadMapPanelComponent {
5624
5946
  private readonly mapCmp;
@@ -5640,6 +5962,7 @@ declare class CadMapPanelComponent {
5640
5962
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadMapPanelComponent, "cad-map-panel", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "header": { "alias": "header"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "side": { "alias": "side"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "opened": "opened"; "closed": "closed"; }, never, ["[cadMapPanelActions]", "*", "[cadMapPanelFooter]"], true, never>;
5641
5963
  }
5642
5964
  /** Section repliable d'un panneau : <cad-map-section header="Gares" [expanded]="true" icon="server"> contenu libre </cad-map-section> */
5965
+ /** @atelier dans=cad-map */
5643
5966
  declare class CadMapSectionComponent {
5644
5967
  readonly header: _angular_core.InputSignal<string>;
5645
5968
  readonly icon: _angular_core.InputSignal<string>;
@@ -5660,6 +5983,7 @@ declare function cadMapLayerOf(map: CadMapComponent | null, id: string): CadMapL
5660
5983
  /**
5661
5984
  * Sélecteur de fonds en vignettes + transparence + overlays :
5662
5985
  * <cad-map-basemaps [ids]="['ign-plan','ign-ortho']" [columns]="2" showOpacity showOverlays/>
5986
+ * @atelier icone=globe dans=cad-map
5663
5987
  */
5664
5988
  declare class CadMapBasemapsComponent {
5665
5989
  protected thumbUrl(b: {
@@ -5692,6 +6016,7 @@ declare class CadMapBasemapsComponent {
5692
6016
  * Ligne « couche » : picto dérivé de la symbologie + case de visibilité + label + opacité + zoom.
5693
6017
  * <cad-map-layer-toggle layer="ouvrages" showOpacity showLegend zoomTo/>
5694
6018
  */
6019
+ /** @atelier dans=cad-map */
5695
6020
  declare class CadMapLayerToggleComponent {
5696
6021
  readonly mapCmp: CadMapComponent | null;
5697
6022
  readonly layer: _angular_core.InputSignal<string>;
@@ -5718,7 +6043,10 @@ declare class CadMapLayerToggleComponent {
5718
6043
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadMapLayerToggleComponent, never>;
5719
6044
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadMapLayerToggleComponent, "cad-map-layer-toggle", never, { "layer": { "alias": "layer"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "showOpacity": { "alias": "showOpacity"; "required": false; "isSignal": true; }; "showLegend": { "alias": "showLegend"; "required": false; "isSignal": true; }; "zoomTo": { "alias": "zoomTo"; "required": false; "isSignal": true; }; }, { "visibleChange": "visibleChange"; }, never, never, true, never>;
5720
6045
  }
5721
- /** Groupe de couches avec case parent tri-état : <cad-map-layer-group header="Risques" [layers]="['ppri','argiles']" showOpacity/> */
6046
+ /**
6047
+ * Groupe de couches avec case parent tri-état : <cad-map-layer-group header="Risques" [layers]="['ppri','argiles']" showOpacity/>
6048
+ * @atelier icone=layers dans=cad-map
6049
+ */
5722
6050
  declare class CadMapLayerGroupComponent {
5723
6051
  readonly mapCmp: CadMapComponent | null;
5724
6052
  readonly header: _angular_core.InputSignal<string>;
@@ -5801,6 +6129,7 @@ interface CadMapMenuConfig {
5801
6129
  /**
5802
6130
  * Menu de carte généré depuis une config JSON (rail + panneaux + sections + blocs), posé dans <cad-map> :
5803
6131
  * <cad-map-menu [config]="cfg" [templates]="{ meteo: tplMeteo }" (action)="…"/>
6132
+ * @atelier icone=menu dans=cad-map
5804
6133
  */
5805
6134
  declare class CadMapMenuComponent {
5806
6135
  readonly config: _angular_core.InputSignal<CadMapMenuConfig>;
@@ -5907,6 +6236,8 @@ declare function cadJsonErrorPos(err: unknown, src: string): {
5907
6236
  /**
5908
6237
  * <cad-json-editor [(value)]="obj" mode="object" height="320px" [validator]="cadValidateGeoJSON" (invalid)="…"/>
5909
6238
  * CVA string|object : textarea + numéros de ligne + coloration + validation en direct (JSON puis `validator`) + Formater/Compacter/Copier/Importer/Télécharger.
6239
+ * @atelier icone=braces
6240
+ * @atelier-exemple value {"ouvrage":"Pont de Sèvres","etat":"Bon","inspection":{"date":"2026-03-12","agent":"SZU"},"geometrie":{"lat":48.8264,"lng":2.2275}}
5910
6241
  */
5911
6242
  declare class CadJsonEditorComponent extends CadValueAccessor<string | object> {
5912
6243
  private readonly san;
@@ -5952,6 +6283,7 @@ type CadGeoJSON = FeatureCollection | Feature | Geometry;
5952
6283
  * <cad-map-card [(value)]="geojson" header="Emprise" height="320px" editable showStats/>
5953
6284
  * ControlValueAccessor GeoJSON en carte « flip » : recto = carte (couche auto, fit, dessin optionnel), verso = éditeur JSON validé.
5954
6285
  * `mode="string"` : la valeur est la chaîne JSON. Utilisable dans <cad-field plain>.
6286
+ * @atelier icone=map-pinned
5955
6287
  */
5956
6288
  declare class CadMapCardComponent extends CadValueAccessor<CadGeoJSON | string> {
5957
6289
  readonly header: _angular_core.InputSignal<string>;
@@ -6183,6 +6515,8 @@ declare class CadOrgNodeDirective {
6183
6515
  * <cad-listbox [(value)]="v" [options]="opts" optionLabel="name" optionValue="id" [multiple] checkbox filter listHeight="240px" selectAll/>
6184
6516
  * Liste de sélection toujours visible (remplace p-listbox). CVA<V | V[]>. Clavier ↑↓ Home End PageUp/Down Espace/Entrée, typeahead,
6185
6517
  * Shift+clic = plage, Ctrl/⌘+clic (metaKeySelection) = bascule sans désélectionner en multiple.
6518
+ * @atelier icone=list
6519
+ * @atelier-exemple options [{"label":"Ouvrage d'art"},{"label":"Chaussée"},{"label":"Signalisation"},{"label":"Éclairage"}]
6186
6520
  */
6187
6521
  declare class CadListboxComponent<T = unknown, V = unknown> extends CadValueAccessor<V | V[]> {
6188
6522
  readonly options: _angular_core.InputSignal<T[]>;
@@ -6257,6 +6591,9 @@ declare class CadListboxComponent<T = unknown, V = unknown> extends CadValueAcce
6257
6591
  /**
6258
6592
  * <cad-orderlist [(value)]="items" optionLabel="name" header="Colonnes" controls="side" dragHandle filter listHeight="260px" (reorder)="…"/>
6259
6593
  * Liste réordonnable (drag CDK vertical + boutons ↑ ↓ ⤒ ⤓, sélection multiple Ctrl/Shift). CVA<T[]> : la valeur = NOUVEAU tableau réordonné.
6594
+ * @atelier icone=list-ordered
6595
+ * @atelier-exemple value [{"label":"1. Inspection visuelle"},{"label":"2. Relevé des désordres"},{"label":"3. Essais matériaux"},{"label":"4. Rapport"}]
6596
+ * @atelier-exemple header "Étapes"
6260
6597
  */
6261
6598
  declare class CadOrderlistComponent<T = unknown> extends CadValueAccessor<T[]> {
6262
6599
  readonly optionLabel: _angular_core.InputSignal<string>;
@@ -6310,6 +6647,8 @@ type Side = 'source' | 'target';
6310
6647
  * <cad-picklist [(value)]="selected" [options]="tous" optionLabel="name" sourceHeader="Disponibles" targetHeader="Sélectionnés" filter showTargetControls/>
6311
6648
  * Deux listes reliées par des boutons → ← ⇒ ⇐ + drag & drop entre listes (CDK). CVA<T[]> = cible ; source = options − cible.
6312
6649
  * Responsive : sous 640 px de large (conteneur), les listes s'empilent et les boutons passent à l'horizontale.
6650
+ * @atelier icone=arrow-right-left
6651
+ * @atelier-exemple options [{"label":"Pont de Sèvres"},{"label":"Viaduc de Meudon"},{"label":"Passerelle Rive Sud"},{"label":"Tunnel des Acacias"}]
6313
6652
  */
6314
6653
  declare class CadPicklistComponent<T = unknown> extends CadValueAccessor<T[]> {
6315
6654
  private readonly destroyRef;
@@ -6415,6 +6754,8 @@ interface Flat<T> {
6415
6754
  * <cad-orgchart [value]="nodes" labelField="name" sublabelField="role" avatarField="initials" collapsible zoomable selectionMode="single" [(selection)]="sel"/>
6416
6755
  * Organigramme maison (grille CSS + connecteurs), template de nœud `cadOrgNode`, orientation vertical/horizontal, mode compact (liste indentée) sous 640 px
6417
6756
  * ou forcé, zoom molette/± + drag pour panner. Clavier ←→↑↓ (nœuds), Entrée sélectionne, +/− déplie/replie.
6757
+ * @atelier icone=git-fork
6758
+ * @atelier-exemple value [{"data":{"label":"Direction technique"},"expanded":true,"children":[{"data":{"label":"Bureau d'études"}},{"data":{"label":"Travaux"}},{"data":{"label":"Maintenance"}}]}]
6418
6759
  */
6419
6760
  declare class CadOrgchartComponent<T = unknown> {
6420
6761
  private readonly destroyRef;
@@ -6529,6 +6870,7 @@ declare function cadFormatSize(b: number): string;
6529
6870
  * <cad-upload url="/api/upload" multiple accept="image/*,.pdf" [maxFileSize]="5e6" [maxFiles]="5" auto (upload)="…"/>
6530
6871
  * Modes : `advanced` (zone de dépôt + liste + boutons), `dropzone` (zone seule, liste), `basic` (un bouton).
6531
6872
  * Envoi : `url` (HttpClient — `provideHttpClient()` requis dans l'app) OU `customUpload` + `(uploadHandler)` OU `selectOnly` (l'app lit `files()`).
6873
+ * @atelier icone=upload-cloud
6532
6874
  */
6533
6875
  declare class CadUploadComponent {
6534
6876
  private readonly http;
@@ -6622,6 +6964,9 @@ interface CadChartClickEvent {
6622
6964
  * <cad-chart type="bar" [data]="data" [options]="options" height="280px" (chartClick)="…"/>
6623
6965
  * Wrapper Chart.js 4 (chargé à la demande) : thème automatique depuis les tokens (police, grille, tooltip) et re-rendu au changement `.theme-dark`,
6624
6966
  * palette par défaut sur les datasets sans couleur, ResizeObserver, `getChart()/update()/toBase64Image()`, canvas `role="img"` + table accessible optionnelle.
6967
+ * @atelier icone=chart-bar
6968
+ * @atelier-exemple type "bar"
6969
+ * @atelier-exemple data {"labels":["Jan","Fév","Mar","Avr","Mai"],"datasets":[{"label":"Relevés","data":[12,19,8,15,11]}]}
6625
6970
  */
6626
6971
  declare class CadChartComponent {
6627
6972
  private readonly hostEl;
@@ -7372,6 +7717,103 @@ declare function cadProjeterClavier(kind: CadEditKind, base: CadEditBase, jours:
7372
7717
  end: Date;
7373
7718
  };
7374
7719
 
7720
+ /**
7721
+ * Mise en page du scheduler — logique PURE, sans DOM, donc testable seule.
7722
+ *
7723
+ * Le scheduler n'a pas de projection à lui : un geste horizontal y est exactement la
7724
+ * projection HORAIRE du calendrier tournée d'un quart de tour (échelle heure), ou la
7725
+ * projection de MOIS sans rangées (échelle jour). On réutilise `cadProjeterEdition` et
7726
+ * `cadProjeterMois` en réinterprétant leur géométrie — une seule logique de placement à
7727
+ * éprouver, pas trois.
7728
+ *
7729
+ * Ce fichier ne porte donc que ce qui est PROPRE au scheduler : l'empilement en voies,
7730
+ * la partition planifié / non planifié, et le découpage d'une barre à la fenêtre.
7731
+ */
7732
+
7733
+ interface CadLaneSpan {
7734
+ start: Date;
7735
+ end: Date;
7736
+ }
7737
+ /**
7738
+ * Empilement des chevauchements : balayage, première voie libre.
7739
+ *
7740
+ * Les voies sont attribuées DANS L'ORDRE D'ENTRÉE trié par début (puis fin) ; le résultat
7741
+ * est aligné sur l'ordre d'entrée, pas sur l'ordre de balayage — l'appelant garde ses index.
7742
+ * Deux barres qui se touchent bord à bord (end === start) partagent une voie : une réunion
7743
+ * qui finit à 10 h et une qui commence à 10 h ne se chevauchent pas.
7744
+ */
7745
+ declare function cadPackLanes(items: readonly CadLaneSpan[]): {
7746
+ lanes: number[];
7747
+ count: number;
7748
+ };
7749
+ /**
7750
+ * Partition planifié / non planifié — LA règle du document commun : une tâche que la vue ne
7751
+ * sait pas placer part dans sa zone « non planifié » avec un compteur, jamais dans le silence.
7752
+ * Ici, placer exige un début, une fin ET au moins une affectation (les lignes SONT des
7753
+ * ressources : sans affectation, aucune ligne ne peut l'accueillir).
7754
+ */
7755
+ declare function cadSchedulerPartition(tasks: readonly CadPlannedTask[]): {
7756
+ posables: CadPlannedTask[];
7757
+ nonPlanifiees: CadPlannedTask[];
7758
+ };
7759
+ interface CadFenetreSpan {
7760
+ start: Date;
7761
+ end: Date;
7762
+ /** La barre continue avant / après la fenêtre — bord en pointillé, jamais coupé en silence. */
7763
+ continueAvant: boolean;
7764
+ continueApres: boolean;
7765
+ }
7766
+ /** Découpe une plage à la fenêtre. `null` si elle est entièrement dehors. */
7767
+ declare function cadClipFenetre(start: Date, end: Date, f0: Date, f1: Date): CadFenetreSpan | null;
7768
+
7769
+ /**
7770
+ * Mise en page du gantt — logique PURE, sans DOM, donc testable seule.
7771
+ *
7772
+ * Deux responsabilités, et rien d'autre : quelles rangées sont VISIBLES (l'arbre replié), et
7773
+ * par où passe une flèche de dépendance. L'axe de temps vient de planning.axis, la hiérarchie
7774
+ * et les dates roulées de planning.model — le gantt n'invente aucune donnée.
7775
+ */
7776
+
7777
+ interface CadGanttRow {
7778
+ task: CadPlannedTask;
7779
+ level: number;
7780
+ }
7781
+ /**
7782
+ * Rangées visibles, dans l'ordre hiérarchique : on descend depuis les racines et on saute la
7783
+ * descendance des nœuds ABSENTS de `expanded`. Une tâche non plaçable (ni dates propres ni
7784
+ * dates roulées) ne produit pas de rangée : elle appartient à la zone « non planifié ».
7785
+ */
7786
+ declare function cadGanttRows(tasks: readonly CadPlannedTask[], roots: readonly string[], expanded: ReadonlySet<string>): CadGanttRow[];
7787
+ /** Ancre d'une barre pour le routage : ses deux bouts et son centre vertical, en pixels. */
7788
+ interface CadLienAncre {
7789
+ x1: number;
7790
+ x2: number;
7791
+ y: number;
7792
+ }
7793
+ interface CadLienTrace {
7794
+ /** Chemin SVG orthogonal. */
7795
+ d: string;
7796
+ /** Pointe de flèche : sommet, et sens d'entrée ('right' = elle pointe vers la droite). */
7797
+ fleche: {
7798
+ x: number;
7799
+ y: number;
7800
+ sens: 'right' | 'left';
7801
+ };
7802
+ }
7803
+ /**
7804
+ * Routage orthogonal d'un lien, 3 segments — 5 quand l'entrée est à contre-sens.
7805
+ *
7806
+ * Les conventions MS Project portent tout : le type dit de quel BOUT on sort (F = fin, S =
7807
+ * début) et par quel bout on entre. On sort d'une longueur de garde `g`, on descend, on entre.
7808
+ * Le chemin direct n'est licite que si l'approche se fait DU BON CÔTÉ (par la gauche pour une
7809
+ * entrée sur un début, par la droite pour une entrée sur une fin) — sinon la flèche
7810
+ * traverserait la barre qu'elle vise. À contre-sens, on passe par le bord de la rangée cible.
7811
+ * L'évitement d'obstacles est EXCLU (acté le 21/08) : un lien peut croiser une barre tierce.
7812
+ */
7813
+ declare function cadRouterLien(type: CadPlanLinkType, a: CadLienAncre, b: CadLienAncre, g?: number, demiRangee?: number): CadLienTrace;
7814
+ /** Points du polygone de la pointe, prêt pour l'attribut `points`. */
7815
+ declare function cadPointeFleche(f: CadLienTrace['fleche'], taille?: number): string;
7816
+
7375
7817
  /** Contenu d'une carte : `<ng-template cadTaskCard let-task let-bucket="bucket">`. */
7376
7818
  declare class CadTaskCardDirective {
7377
7819
  readonly tpl: TemplateRef<any>;
@@ -7442,6 +7884,8 @@ interface Column {
7442
7884
  *
7443
7885
  * Clavier : Entrée / Espace ouvrent la tâche ; Ctrl (ou Cmd) + flèches la déplacent — gauche et
7444
7886
  * droite changent de colonne, haut et bas changent de rang. Chaque déplacement est annoncé.
7887
+ * @atelier icone=kanban
7888
+ * @atelier-exemple plan {"buckets":[{"id":"afaire","label":"À faire","wipLimit":4},{"id":"encours","label":"En cours","wipLimit":3},{"id":"fait","label":"Fait"}],"tasks":[{"id":"t1","label":"Inspection du pont","bucket":"afaire"},{"id":"t2","label":"Rapport d'étude","bucket":"afaire"},{"id":"t3","label":"Levé topographique","bucket":"encours"},{"id":"t4","label":"Diagnostic béton","bucket":"fait"}]}
7445
7889
  */
7446
7890
  declare class CadTaskboardComponent {
7447
7891
  /** Document de planification brut ; il est normalisé en interne et jamais muté. */
@@ -7554,6 +7998,9 @@ interface CadCalendarDateEvent {
7554
7998
  *
7555
7999
  * LE COMPOSANT N'ÉCRIT JAMAIS : il émet `eventClick`, `dateClick`, `rangeChange`. Masquer un
7556
8000
  * agenda est en revanche un état de PRÉSENTATION, donc un `model()` qu'il porte lui-même.
8001
+ * @atelier icone=calendar
8002
+ * @atelier-exemple plan {"tasks":[{"id":"v1","label":"Visite d'ouvrage","start":"@aujourdhuiT09:00","end":"@aujourdhuiT10:30"},{"id":"v2","label":"Relevé terrain","start":"@aujourdhui+1T14:00","end":"@aujourdhui+1T16:00"},{"id":"v3","label":"Réunion de service","start":"@aujourdhui+2","allDay":true},{"id":"v4","label":"Contrôle technique","start":"@aujourdhui-1T11:00","end":"@aujourdhui-1T12:00"}]}
8003
+ * @atelier-exemple view "week"
7557
8004
  */
7558
8005
  declare class CadCalendarComponent {
7559
8006
  protected readonly Math: Math;
@@ -7731,6 +8178,364 @@ declare class CadCalendarComponent {
7731
8178
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadCalendarComponent, "cad-calendar", never, { "plan": { "alias": "plan"; "required": false; "isSignal": true; }; "sources": { "alias": "sources"; "required": false; "isSignal": true; }; "hidden": { "alias": "hidden"; "required": false; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": false; "isSignal": true; }; "firstDay": { "alias": "firstDay"; "required": false; "isSignal": true; }; "dayStart": { "alias": "dayStart"; "required": false; "isSignal": true; }; "dayEnd": { "alias": "dayEnd"; "required": false; "isSignal": true; }; "hourHeight": { "alias": "hourHeight"; "required": false; "isSignal": true; }; "maxPerDay": { "alias": "maxPerDay"; "required": false; "isSignal": true; }; "workCalendar": { "alias": "workCalendar"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "showNow": { "alias": "showNow"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "snap": { "alias": "snap"; "required": false; "isSignal": true; }; }, { "hidden": "hiddenChange"; "view": "viewChange"; "date": "dateChange"; "eventClick": "eventClick"; "dateClick": "dateClick"; "rangeChange": "rangeChange"; "eventMove": "eventMove"; "eventResize": "eventResize"; "eventCreate": "eventCreate"; }, never, never, true, never>;
7732
8179
  }
7733
8180
 
8181
+ type CadSchedulerScale = 'day' | 'week' | 'month';
8182
+ type CadSchedulerMode = 'timeline' | 'list' | 'auto';
8183
+ interface CadSchedulerEventEvent {
8184
+ occurrence: CadOccurrence;
8185
+ originalEvent: Event;
8186
+ }
8187
+ /** Intention d'écriture. Le composant ne l'applique pas : il la propose. */
8188
+ interface CadSchedulerChangeEvent {
8189
+ occurrence: CadOccurrence;
8190
+ start: Date;
8191
+ end: Date;
8192
+ }
8193
+ /** Réaffectation : SEULE l'affectation saisie change de ligne, les dates ne bougent pas. */
8194
+ interface CadSchedulerAssignEvent {
8195
+ occurrence: CadOccurrence;
8196
+ assignmentIndex: number;
8197
+ from: string;
8198
+ to: string;
8199
+ }
8200
+ interface CadSchedulerCreateEvent {
8201
+ resource: string;
8202
+ start: Date;
8203
+ end: Date;
8204
+ }
8205
+ /** Une tâche de la zone « non planifié » déposée sur une ligne. */
8206
+ interface CadSchedulerScheduleEvent {
8207
+ task: CadPlannedTask;
8208
+ resource: string;
8209
+ start: Date;
8210
+ end: Date;
8211
+ }
8212
+ interface Rangee {
8213
+ type: 'groupe' | 'ligne';
8214
+ res: CadPlanResource;
8215
+ }
8216
+ interface Barre {
8217
+ o: CadOccurrence;
8218
+ ai: number;
8219
+ x: number;
8220
+ w: number;
8221
+ voie: number;
8222
+ continueAvant: boolean;
8223
+ continueApres: boolean;
8224
+ }
8225
+ /**
8226
+ * `<cad-scheduler [plan]="plan" scale="week" editable/>`
8227
+ *
8228
+ * LES LIGNES SONT DES RESSOURCES — c'est ce qui le distingue de `cad-calendar`, dont la
8229
+ * grille est le temps. On répond ici à « qui est libre jeudi ? ». Même document JSON.
8230
+ *
8231
+ * MULTI-RESSOURCE = 'each' (arbitré sur maquette le 24/08/2026) : une tâche affectée à N
8232
+ * ressources dessine UNE BARRE PAR LIGNE (⧉). Un déplacement horizontal bouge la tâche —
8233
+ * donc toutes ses barres ; un déplacement vertical ne réaffecte que l'affectation saisie.
8234
+ * C'est le seul rendu qui ne mente pas quand les lignes SONT les ressources.
8235
+ *
8236
+ * LES CHEVAUCHEMENTS S'EMPILENT en voies (balayage, première voie libre) : deux barres ne se
8237
+ * recouvrent jamais, la ligne grandit. La hauteur d'une ligne est donc une CONSÉQUENCE de la
8238
+ * donnée, pas un réglage.
8239
+ *
8240
+ * LE COMPOSANT N'ÉCRIT JAMAIS : il émet eventMove / eventResize / eventAssign / eventCreate /
8241
+ * eventSchedule et garde le geste vivant à l'écran (correctif optimiste, patron du taskboard).
8242
+ * Une tâche sans dates ou sans affectation part dans la zone « non planifié » avec un
8243
+ * compteur — jamais dans le silence — et se pose au glisser.
8244
+ * @atelier icone=chart-no-axes-gantt
8245
+ * @atelier-exemple plan {"resources":[{"id":"claire","label":"Claire Fontaine","color":"#2f6feb"},{"id":"marc","label":"Marc Delorme","color":"#a371f7"}],"tasks":[{"id":"t1","label":"Diagnostic OA 214","start":"@aujourdhuiT09:00","end":"@aujourdhui+2T17:00","assignments":[{"resource":"claire"}]},{"id":"t2","label":"Relevés terrain","start":"@aujourdhui+1T09:00","end":"@aujourdhui+3T12:00","assignments":[{"resource":"marc"}]},{"id":"t3","label":"Avis technique mur R27"}]}
8246
+ */
8247
+ declare class CadSchedulerComponent {
8248
+ private readonly bp;
8249
+ private readonly hote;
8250
+ readonly plan: _angular_core.InputSignal<CadPlan | null>;
8251
+ readonly mode: _angular_core.InputSignal<CadSchedulerMode>;
8252
+ readonly scale: _angular_core.ModelSignal<CadSchedulerScale>;
8253
+ /** Date d'ancrage : le jour, la semaine ou le mois affiché. */
8254
+ readonly date: _angular_core.ModelSignal<Date>;
8255
+ readonly firstDay: _angular_core.InputSignal<0 | 1>;
8256
+ /** Plage horaire de l'échelle jour, en heures. */
8257
+ readonly dayStart: _angular_core.InputSignal<number>;
8258
+ readonly dayEnd: _angular_core.InputSignal<number>;
8259
+ /** Largeur d'une graduation en pixels. null = défaut selon l'échelle (64 / 76 / 27). */
8260
+ readonly tickWidth: _angular_core.InputSignal<number | null>;
8261
+ /** Aimantage à l'échelle jour, en minutes. Les échelles semaine et mois aimantent au JOUR. */
8262
+ readonly snap: _angular_core.InputSignal<number>;
8263
+ readonly workCalendar: _angular_core.InputSignal<CadWorkCalendar | null>;
8264
+ readonly today: _angular_core.InputSignal<Date | null>;
8265
+ readonly locale: _angular_core.InputSignal<string>;
8266
+ readonly emptyText: _angular_core.InputSignal<string>;
8267
+ readonly ariaLabel: _angular_core.InputSignal<string>;
8268
+ readonly showNow: _angular_core.InputSignalWithTransform<boolean, unknown>;
8269
+ readonly showUnplanned: _angular_core.InputSignalWithTransform<boolean, unknown>;
8270
+ readonly editable: _angular_core.InputSignalWithTransform<boolean, unknown>;
8271
+ readonly eventClick: _angular_core.OutputEmitterRef<CadSchedulerEventEvent>;
8272
+ readonly eventMove: _angular_core.OutputEmitterRef<CadSchedulerChangeEvent>;
8273
+ readonly eventResize: _angular_core.OutputEmitterRef<CadSchedulerChangeEvent>;
8274
+ readonly eventAssign: _angular_core.OutputEmitterRef<CadSchedulerAssignEvent>;
8275
+ readonly eventCreate: _angular_core.OutputEmitterRef<CadSchedulerCreateEvent>;
8276
+ readonly eventSchedule: _angular_core.OutputEmitterRef<CadSchedulerScheduleEvent>;
8277
+ /** La fenêtre affichée a changé : l'hôte peut aller chercher les données qui manquent. */
8278
+ readonly rangeChange: _angular_core.OutputEmitterRef<{
8279
+ start: Date;
8280
+ end: Date;
8281
+ }>;
8282
+ /** `auto` : liste par ressource sous le seuil. Une grille de 14 jours à 390 px ne montre rien. */
8283
+ protected readonly modeEffectif: _angular_core.Signal<"list" | "timeline">;
8284
+ private readonly normalise;
8285
+ private readonly calendrier;
8286
+ /** Anomalies de normalisation et de dépliage — jamais tues : l'hôte peut les montrer. */
8287
+ readonly issues: _angular_core.Signal<(_cadriciel_ui.CadPlanIssue | _cadriciel_ui.CadRecurrenceIssue)[]>;
8288
+ protected readonly unite: _angular_core.Signal<number>;
8289
+ /** Fenêtre affichée : 1 jour en heures, 14 jours, ou 6 semaines pleines autour du mois. */
8290
+ protected readonly fenetre: _angular_core.Signal<{
8291
+ start: Date;
8292
+ end: Date;
8293
+ }>;
8294
+ private readonly tete;
8295
+ protected readonly axe: _angular_core.Signal<CadTimeAxis>;
8296
+ protected readonly enTete: _angular_core.Signal<{
8297
+ hautes: {
8298
+ label: string;
8299
+ w: number;
8300
+ }[];
8301
+ basses: {
8302
+ label: string;
8303
+ sub: string;
8304
+ off: boolean;
8305
+ today: boolean;
8306
+ }[];
8307
+ }>;
8308
+ /**
8309
+ * Rangées : les ressources dans leur ordre de déclaration ; celles que d'autres référencent
8310
+ * comme `parent` deviennent des bandes de groupe. Un groupe ne porte pas de barres — un
8311
+ * congé n'est pas un jour férié, une équipe n'est pas une ressource de travail.
8312
+ */
8313
+ protected readonly rangees: _angular_core.Signal<Rangee[]>;
8314
+ /**
8315
+ * CORRECTIF OPTIMISTE — patron de cad-taskboard et cad-calendar : le composant n'écrit
8316
+ * jamais dans le document, mais garde les bornes, réaffectations et planifications
8317
+ * PROPOSÉES, attachées au `plan` d'origine, et les abandonne dès qu'un nouveau plan arrive.
8318
+ */
8319
+ private readonly patch;
8320
+ private patchCourant;
8321
+ private readonly partition;
8322
+ protected readonly nonPlanifiees: _angular_core.Signal<CadPlannedTask[]>;
8323
+ private readonly occurrences;
8324
+ /** Barres par ligne : une par AFFECTATION (multi-ressource 'each'), empilées en voies. */
8325
+ private readonly rendu;
8326
+ protected barresDe(res: string): Barre[];
8327
+ protected hauteurDe(res: string): number;
8328
+ /**
8329
+ * Cellules de fond par ligne : fermé global (week-end, férié) ou pour CETTE ressource.
8330
+ * MÉMOÏSÉ en un seul computed — une méthode appelée du template serait recalculée à
8331
+ * chaque cycle de détection de changements, pour un résultat identique.
8332
+ */
8333
+ private readonly cellules;
8334
+ protected cellulesDe(res: string): {
8335
+ off: boolean;
8336
+ ex: boolean;
8337
+ }[];
8338
+ protected readonly marqueurs: _angular_core.Signal<{
8339
+ x: number;
8340
+ label: string;
8341
+ }[]>;
8342
+ protected readonly ligneNow: _angular_core.Signal<number | null>;
8343
+ protected readonly survol: _angular_core.WritableSignal<string | null>;
8344
+ protected readonly cible: _angular_core.WritableSignal<string | null>;
8345
+ protected readonly fantome: _angular_core.WritableSignal<{
8346
+ res: string;
8347
+ x: number;
8348
+ w: number;
8349
+ texte: string;
8350
+ } | null>;
8351
+ protected readonly annonce: _angular_core.WritableSignal<string>;
8352
+ protected couleur(o: CadOccurrence): string;
8353
+ protected etp(c: number): string;
8354
+ protected heure(d: Date): string;
8355
+ private jour;
8356
+ protected periodeListe(o: CadOccurrence): string;
8357
+ protected titre(o: CadOccurrence): string;
8358
+ protected motifNonPlanifie(t: CadPlannedTask): string;
8359
+ /** Une occurrence de SÉRIE ou une tâche verrouillée n'est pas manipulable — on le MONTRE. */
8360
+ protected manipulable(o: CadOccurrence): boolean;
8361
+ protected motifVerrou(o: CadOccurrence): string;
8362
+ /**
8363
+ * Projection d'un geste HORIZONTAL — aucune logique neuve : à l'échelle jour c'est la
8364
+ * projection horaire du calendrier tournée d'un quart de tour (dx joue le rôle de dy,
8365
+ * la largeur de graduation celui de la hauteur d'heure) ; aux échelles semaine et mois
8366
+ * c'est la projection de mois sans rangées (des JOURS entiers, l'heure ne bouge pas).
8367
+ */
8368
+ private projeter;
8369
+ private poserBornes;
8370
+ private lignesEcran;
8371
+ /** Le clic qui SUIT un glisser est celui du navigateur, pas celui de l'utilisateur. */
8372
+ private finGeste;
8373
+ /**
8374
+ * Geste au pointeur sur une barre. Patron de cad-calendar : écoute sur le DOCUMENT.
8375
+ * Horizontal = les dates (la tâche entière, donc toutes ses barres) ; vertical = la SEULE
8376
+ * affectation saisie change de ligne, dates intactes. Les deux ne se combinent pas dans un
8377
+ * même geste : une intention est atomique, l'hôte n'a jamais à en deviner la moitié.
8378
+ */
8379
+ protected geste(kind: CadEditKind, b: Barre, origine: string, ev: PointerEvent): void;
8380
+ /** Création par glisser sur une plage libre d'une ligne. Un clic sec produit un pas. */
8381
+ protected creer(res: CadPlanResource, ev: PointerEvent, zone: HTMLElement): void;
8382
+ /** Glisser d'un chip « non planifié » vers une ligne. */
8383
+ protected prendreChip(t: CadPlannedTask, ev: PointerEvent): void;
8384
+ /**
8385
+ * Le CLAVIER passe par la MÊME projection que le pointeur. Ctrl/Cmd + ←/→ déplacent d'un
8386
+ * pas (un jour, ou l'aimantage à l'échelle jour), Maj + ←/→ redimensionnent par la fin,
8387
+ * Ctrl/Cmd + ↑/↓ réaffectent à la ligne voisine.
8388
+ */
8389
+ protected clavier(b: Barre, origine: string, e: KeyboardEvent): void;
8390
+ private nomDe;
8391
+ /** L'annonce dit OÙ la tâche atterrit, pas seulement qu'elle a bougé. */
8392
+ private annoncer;
8393
+ protected clicEvenement(occurrence: CadOccurrence, originalEvent: Event): void;
8394
+ constructor();
8395
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadSchedulerComponent, never>;
8396
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadSchedulerComponent, "cad-scheduler", never, { "plan": { "alias": "plan"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "date": { "alias": "date"; "required": false; "isSignal": true; }; "firstDay": { "alias": "firstDay"; "required": false; "isSignal": true; }; "dayStart": { "alias": "dayStart"; "required": false; "isSignal": true; }; "dayEnd": { "alias": "dayEnd"; "required": false; "isSignal": true; }; "tickWidth": { "alias": "tickWidth"; "required": false; "isSignal": true; }; "snap": { "alias": "snap"; "required": false; "isSignal": true; }; "workCalendar": { "alias": "workCalendar"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "showNow": { "alias": "showNow"; "required": false; "isSignal": true; }; "showUnplanned": { "alias": "showUnplanned"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; }, { "scale": "scaleChange"; "date": "dateChange"; "eventClick": "eventClick"; "eventMove": "eventMove"; "eventResize": "eventResize"; "eventAssign": "eventAssign"; "eventCreate": "eventCreate"; "eventSchedule": "eventSchedule"; "rangeChange": "rangeChange"; }, never, never, true, never>;
8397
+ }
8398
+
8399
+ type CadGanttScale = 'day' | 'week' | 'month';
8400
+ interface CadGanttTaskEvent {
8401
+ task: CadPlannedTask;
8402
+ originalEvent: Event;
8403
+ }
8404
+ interface LigneTable {
8405
+ id: string;
8406
+ parent: string | null;
8407
+ label: string;
8408
+ debut: string;
8409
+ fin: string;
8410
+ duree: string;
8411
+ pct: string;
8412
+ [extra: string]: unknown;
8413
+ }
8414
+ /**
8415
+ * `<cad-gantt [plan]="plan" scale="week"/>` — VOLET 1 : affichage.
8416
+ *
8417
+ * LES LIGNES SONT DES TÂCHES, avec dépendances — on répond à « si ça glisse, qu'est-ce qui
8418
+ * tombe ? ». Même document JSON que le taskboard, le calendrier et le scheduler.
8419
+ *
8420
+ * LE VOLET GAUCHE EST `cad-table` EN MODE ARBRE — le même composant, pas une ressemblance
8421
+ * (acté le 21/08) : hiérarchie par `parentKey`, repli par `expandedNodeKeys`, sélection
8422
+ * simple. Le volet droit s'aligne sur lui en MESURANT (ResizeObserver) la hauteur réelle de
8423
+ * son en-tête et de ses rangées : un calcul serait faux au premier changement de densité.
8424
+ *
8425
+ * RIEN NE SE DÉPLACE ICI. L'écriture (déplacer, redimensionner, relier) est le lot 5 ; le
8426
+ * moteur CPM (chemin critique, marge) est le volet 2. Les barres récapitulatives portent des
8427
+ * dates ROULÉES depuis leurs enfants — jamais saisies. Une tâche sans dates part dans la zone
8428
+ * « non planifié », comptée, jamais dans le silence.
8429
+ *
8430
+ * LES LIENS suivent les conventions MS Project (FS/SS/FF/SF, décalage) : routage orthogonal
8431
+ * 3 segments, 5 à contre-sens, évitement d'obstacles exclu (acté 21/08). Un lien dont une
8432
+ * extrémité est repliée est MASQUÉ. Survoler une barre allume ses liens et ses voisines.
8433
+ * @atelier icone=milestone
8434
+ * @atelier-exemple plan {"tasks":[{"id":"p1","label":"Études"},{"id":"t1","parent":"p1","label":"Relevés","start":"@aujourdhui-7","end":"@aujourdhui-3","progress":1},{"id":"t2","parent":"p1","label":"Diagnostic","start":"@aujourdhui-2","end":"@aujourdhui+4","progress":0.4},{"id":"t3","label":"Rapport","start":"@aujourdhui+5","end":"@aujourdhui+9"},{"id":"j1","label":"Remise","start":"@aujourdhui+10","milestone":true}],"links":[{"from":"t1","to":"t2"},{"from":"t2","to":"t3"},{"from":"t3","to":"j1"}]}
8435
+ */
8436
+ declare class CadGanttComponent {
8437
+ private readonly hote;
8438
+ readonly plan: _angular_core.InputSignal<CadPlan | null>;
8439
+ readonly scale: _angular_core.ModelSignal<CadGanttScale>;
8440
+ /** Nœuds dépliés. `null` (défaut) = tout déplié. */
8441
+ readonly expandedKeys: _angular_core.ModelSignal<string[] | null>;
8442
+ readonly selectedKey: _angular_core.ModelSignal<string | null>;
8443
+ /** Largeur d'une graduation en pixels. null = défaut selon l'échelle (36 / 90 / 120). */
8444
+ readonly tickWidth: _angular_core.InputSignal<number | null>;
8445
+ readonly workCalendar: _angular_core.InputSignal<CadWorkCalendar | null>;
8446
+ readonly today: _angular_core.InputSignal<Date | null>;
8447
+ readonly locale: _angular_core.InputSignal<string>;
8448
+ readonly firstDay: _angular_core.InputSignal<0 | 1>;
8449
+ readonly emptyText: _angular_core.InputSignal<string>;
8450
+ readonly ariaLabel: _angular_core.InputSignal<string>;
8451
+ readonly showNow: _angular_core.InputSignalWithTransform<boolean, unknown>;
8452
+ readonly showUnplanned: _angular_core.InputSignalWithTransform<boolean, unknown>;
8453
+ /** Largeur de la colonne Tâche du volet gauche. */
8454
+ readonly taskColumnWidth: _angular_core.InputSignal<string>;
8455
+ readonly taskClick: _angular_core.OutputEmitterRef<CadGanttTaskEvent>;
8456
+ private readonly normalise;
8457
+ private readonly calendrier;
8458
+ /** Anomalies de normalisation — jamais tues : l'hôte peut les montrer. */
8459
+ readonly issues: _angular_core.Signal<_cadriciel_ui.CadPlanIssue[]>;
8460
+ protected readonly colTache: _angular_core.Signal<string>;
8461
+ protected readonly leftWidth: _angular_core.Signal<string>;
8462
+ protected readonly unite: _angular_core.Signal<number>;
8463
+ private readonly parents;
8464
+ protected readonly expansion: _angular_core.Signal<string[]>;
8465
+ protected basculer(key: unknown, ouvert: boolean): void;
8466
+ protected readonly rangeesVisibles: _angular_core.Signal<CadGanttRow[]>;
8467
+ protected readonly nonPlanifiees: _angular_core.Signal<CadPlannedTask[]>;
8468
+ private readonly bornes;
8469
+ private readonly tete;
8470
+ protected readonly axe: _angular_core.Signal<CadTimeAxis>;
8471
+ protected readonly enTete: _angular_core.Signal<{
8472
+ hautes: {
8473
+ label: string;
8474
+ w: number;
8475
+ }[];
8476
+ basses: {
8477
+ label: string;
8478
+ off: boolean;
8479
+ today: boolean;
8480
+ }[];
8481
+ }>;
8482
+ protected readonly colonnesFermees: _angular_core.Signal<{
8483
+ off: boolean;
8484
+ x: number;
8485
+ w: number;
8486
+ }[]>;
8487
+ /** Traits verticaux : chaque graduation quand elle est lisible, sinon les majeures seules. */
8488
+ protected readonly traits: _angular_core.Signal<number[]>;
8489
+ protected readonly marqueurs: _angular_core.Signal<{
8490
+ x: number;
8491
+ label: string;
8492
+ }[]>;
8493
+ protected readonly ligneNow: _angular_core.Signal<number | null>;
8494
+ protected readonly hdH: _angular_core.WritableSignal<number>;
8495
+ /** Géométrie PAR RANGÉE mesurée sur la vraie table : un libellé qui replie sur deux lignes
8496
+ * rend les rangées inégales — un pas uniforme ferait dériver toutes les barres suivantes. */
8497
+ private readonly mesures;
8498
+ protected readonly geo: _angular_core.Signal<{
8499
+ tops: number[];
8500
+ hauteurs: number[];
8501
+ total: number;
8502
+ }>;
8503
+ private readonly geometrie;
8504
+ protected readonly barres: _angular_core.Signal<{
8505
+ task: CadPlannedTask;
8506
+ genre: "barre" | "recap" | "jalon";
8507
+ x: number;
8508
+ w: number;
8509
+ y: number;
8510
+ titre: string;
8511
+ }[]>;
8512
+ protected readonly traces: _angular_core.Signal<{
8513
+ id: string;
8514
+ d: string;
8515
+ pointe: string;
8516
+ titre: string;
8517
+ from: string;
8518
+ to: string;
8519
+ }[]>;
8520
+ protected readonly chaud: _angular_core.WritableSignal<string | null>;
8521
+ protected readonly chauds: _angular_core.Signal<Set<string>>;
8522
+ protected readonly voisins: _angular_core.Signal<Set<string>>;
8523
+ protected readonly lignesTable: _angular_core.Signal<LigneTable[]>;
8524
+ protected surLigneTable(e: {
8525
+ row: LigneTable;
8526
+ event: Event;
8527
+ }): void;
8528
+ protected selectionner(t: CadPlannedTask, ev: Event): void;
8529
+ protected ouvrir(t: CadPlannedTask, ev: Event): void;
8530
+ private dateCourt;
8531
+ private duree;
8532
+ private titre;
8533
+ private titreLien;
8534
+ constructor();
8535
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadGanttComponent, never>;
8536
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadGanttComponent, "cad-gantt", never, { "plan": { "alias": "plan"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "expandedKeys": { "alias": "expandedKeys"; "required": false; "isSignal": true; }; "selectedKey": { "alias": "selectedKey"; "required": false; "isSignal": true; }; "tickWidth": { "alias": "tickWidth"; "required": false; "isSignal": true; }; "workCalendar": { "alias": "workCalendar"; "required": false; "isSignal": true; }; "today": { "alias": "today"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "firstDay": { "alias": "firstDay"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "showNow": { "alias": "showNow"; "required": false; "isSignal": true; }; "showUnplanned": { "alias": "showUnplanned"; "required": false; "isSignal": true; }; "taskColumnWidth": { "alias": "taskColumnWidth"; "required": false; "isSignal": true; }; }, { "scale": "scaleChange"; "expandedKeys": "expandedKeysChange"; "selectedKey": "selectedKeyChange"; "taskClick": "taskClick"; }, never, never, true, never>;
8537
+ }
8538
+
7734
8539
  /**
7735
8540
  * Le format d'une maquette de l'Atelier CadGrid.
7736
8541
  *
@@ -7763,6 +8568,24 @@ declare const ATELIER_BORNES: {
7763
8568
  readonly hMax: 100;
7764
8569
  readonly itemsMax: 200;
7765
8570
  readonly propsMax: 30;
8571
+ /** Enfants directs d'un conteneur. Le plafond GLOBAL reste `itemsMax`, enfants compris. */
8572
+ readonly enfantsMax: 30;
8573
+ /**
8574
+ * Profondeur d'imbrication, en niveaux SOUS le plan.
8575
+ *
8576
+ * Un item du plan est à la profondeur 0, son enfant à 1, et ainsi de suite jusqu'à
8577
+ * `profondeurMax` INCLUS — soit cinq étages en tout. Ce n'est pas une préférence
8578
+ * d'ergonomie : `atelierNormaliser` et l'assainisseur backend descendent une
8579
+ * structure VENUE DE L'EXTÉRIEUR (lien partagé, fichier collé), et une récursion
8580
+ * non bornée sur du JSON hostile fait sauter la pile. Le plafond de COMPTE
8581
+ * (`itemsMax`) ne borne pas la profondeur : deux cents items peuvent former une
8582
+ * chaîne de deux cents étages.
8583
+ *
8584
+ * Cinq étages couvrent le besoin réel mesuré le 27/08 — le pire cas de la
8585
+ * bibliothèque est `cad-splitter > cad-splitter-panel > cad-tabs > cad-tab >
8586
+ * contenu`, soit une profondeur de 4 pour le contenu.
8587
+ */
8588
+ readonly profondeurMax: 4;
7766
8589
  };
7767
8590
  /** Un composant posé sur le plan. */
7768
8591
  interface AtelierItem {
@@ -7787,6 +8610,27 @@ interface AtelierItem {
7787
8610
  label?: string;
7788
8611
  };
7789
8612
  hideMobile?: boolean;
8613
+ /**
8614
+ * Enfants d'un CONTENEUR (panel, carte, fieldset…), projetés dans son emplacement par
8615
+ * défaut — arbitrage SZU 24/08.
8616
+ *
8617
+ * · Les enfants vivent en GRILLE DE FLUX (le patron du `cad-grid` homonyme) : leur
8618
+ * ORDRE fait loi, et leur `w` est une LARGEUR en colonnes (1–12 de la largeur du
8619
+ * conteneur) — quatre tags à `w=3` tiennent côte à côte. `x`, `y` et `h` restent
8620
+ * normalisés (0/0/1) : pas de placement absolu à l'intérieur, c'est ce qui évite le
8621
+ * glisser inter-grilles, là où les outils de maquette meurent.
8622
+ * · IMBRICATION LIBRE jusqu'à `profondeurMax` (27/08, arbitrage SZU) : un enfant est
8623
+ * un item comme un autre, donc un conteneur peut en contenir un. Le plafond d'un
8624
+ * SEUL niveau, tenu du 24/08 au 27/08, rendait indéfendables les familles à pièce
8625
+ * typée — `cad-tabs > cad-tab > contenu` réclame deux niveaux, et un onglet qu'on
8626
+ * ne peut pas remplir est pire qu'un onglet absent. Au-delà du plafond, la pose
8627
+ * refuse VISIBLEMENT et l'assainisseur écarte le surplus : jamais de troncature
8628
+ * muette.
8629
+ * · Le régime (`flux` ou `direct`) est celui du PARENT DIRECT, lu de son annotation
8630
+ * `@atelier conteneur=` — pas celui de la racine. Un `cad-tab` en flux dans un
8631
+ * `cad-tabs` en direct est la forme normale, pas un cas limite.
8632
+ */
8633
+ children?: AtelierItem[];
7790
8634
  }
7791
8635
  interface AtelierLayout {
7792
8636
  version: 1;
@@ -7795,10 +8639,81 @@ interface AtelierLayout {
7795
8639
  /** Un plan vide, jamais `null` : un canevas absent et un canevas vide se traitent pareil. */
7796
8640
  declare const atelierLayoutVide: () => AtelierLayout;
7797
8641
 
8642
+ /**
8643
+ * Le contrat d'accueil entre un HÔTE de la bibliothèque et les pièces qu'on lui POSE.
8644
+ *
8645
+ * ── POURQUOI CE FICHIER EXISTE ──────────────────────────────────────────────────
8646
+ *
8647
+ * L'atelier du studio et le rendu frontless du shell instancient les composants
8648
+ * IMPÉRATIVEMENT (`createComponent` + `projectableNodes`) : c'est ce qui permet de poser
8649
+ * le VRAI composant, vivant, plutôt qu'une image de lui. Mais deux mécanismes d'Angular
8650
+ * ne traversent PAS cette frontière, et c'est mesuré, pas supposé (27/08) :
8651
+ *
8652
+ * ① `contentChildren()` — une requête de contenu se résout sur la structure DÉCLARÉE
8653
+ * d'un gabarit. Un composant instancié à la main vit dans une autre vue : il arrive
8654
+ * bien dans le DOM, la requête ne le voit jamais. `cad-tabs` rendait `onglets=0`,
8655
+ * `cad-splitter` `gouttieres=0` — une barre vide, aucune erreur.
8656
+ * ② `inject(Hôte)` depuis la pièce — sans chaîne d'injecteurs de nœud, la recherche
8657
+ * remonte à l'injecteur d'environnement et échoue : `NG0201` pour
8658
+ * `cad-accordion-panel` et `cad-radio` (que `gen-catalog` classe d'ailleurs en
8659
+ * « contextuels », donc non posables), ou `null` silencieux quand l'injection est
8660
+ * `optional`.
8661
+ *
8662
+ * `<ng-content>` est donc NÉCESSAIRE mais PAS SUFFISANT pour qu'une famille soit un
8663
+ * conteneur d'atelier. Le raccourci « ça projette, donc ça marche » a coûté une matinée :
8664
+ * il faut aussi que l'hôte sache ACCUEILLIR une pièce qu'aucune requête ne lui rapportera.
8665
+ *
8666
+ * ── LE CONTRAT ──────────────────────────────────────────────────────────────────
8667
+ *
8668
+ * Il n'est pas neuf : `cad-button-group` le porte depuis le 24/08, posé le jour où l'on
8669
+ * a constaté qu'un groupe était SOURD aux clics de ses boutons posés. Ce fichier ne
8670
+ * l'invente pas, il l'ÉCRIT — jusqu'ici il vivait duck-typé dans le seul poseur du
8671
+ * studio, invisible depuis la bibliothèque, ce qui a permis à `cad-map` de partir avec
8672
+ * un nom à lui (`registerChild`) que personne n'appelle. Deux vocabulaires pour un
8673
+ * besoin, c'est une famille cassée en silence.
8674
+ */
8675
+ /**
8676
+ * Un hôte capable d'accueillir des pièces créées hors gabarit.
8677
+ *
8678
+ * Le passage est la LISTE COMPLÈTE, jamais un ajout : le poseur reconstruit ses enfants
8679
+ * d'un bloc à chaque changement de structure, et un contrat incrémental l'obligerait à
8680
+ * tenir un différentiel — c'est ainsi qu'on garde un fantôme après une suppression.
8681
+ */
8682
+ interface CadHoteAPieces {
8683
+ /** Reçoit toutes les instances posées. L'hôte filtre lui-même ce qui le concerne. */
8684
+ enregistrerEnfants(instances: unknown[]): void;
8685
+ }
8686
+ /**
8687
+ * L'hôte sait-il accueillir des pièces posées ?
8688
+ *
8689
+ * Reconnaissance par CAPACITÉ et non par liste de types : un poseur qui énumérerait les
8690
+ * familles concernées serait à mettre à jour à chaque nouvelle — et c'est toujours la
8691
+ * mise à jour qu'on oublie. Une famille qui gagne la trappe devient utilisable dans
8692
+ * l'atelier sans qu'aucun poseur ne bouge.
8693
+ */
8694
+ declare function estHoteAPieces(hote: unknown): hote is CadHoteAPieces;
8695
+
7798
8696
  /** Identifiant conforme à l'assainisseur backend : `/^[A-Za-z0-9_-]{1,24}$/`. */
7799
8697
  declare function atelierNouvelId(): string;
7800
8698
  /** Remet le compteur à zéro. Réservé aux tests, pour qu'ils ne dépendent pas de leur ordre. */
7801
8699
  declare function atelierReinitialiserIds(): void;
8700
+ /**
8701
+ * Empêche les prochains ids de VOLER l'identité d'items déjà présents.
8702
+ *
8703
+ * ⚠️ À APPELER À CHAQUE CHARGEMENT d'un plan venu d'ailleurs (base, fichier collé). Le
8704
+ * compteur est propre à la SESSION et repart de zéro : une maquette rechargée porte déjà
8705
+ * `i1`, `i2`… et la première pose redonnait `i1`. Deux items partagent alors une clé, et
8706
+ * tout ce qui vise par id se trompe de cible — `atelierTrouver` rend le premier homonyme,
8707
+ * `transformerArbre` édite les deux, et le `@for … track` d'Angular en FUSIONNE deux à
8708
+ * l'écran : un bloc disparaît du canevas sans qu'aucune erreur ne soit levée (NG0955 en
8709
+ * avertissement, c'est tout).
8710
+ *
8711
+ * C'EST LE MÊME DÉFAUT QUE `eb87d3f7` (26/08), qui l'avait corrigé dans le builder
8712
+ * frontless — « le compteur valait items.length et non le plus grand id existant ». Le
8713
+ * format a DEUX producteurs ; le correctif n'en avait couvert qu'un. Il vit désormais
8714
+ * dans la bibliothèque, là où les deux le partagent.
8715
+ */
8716
+ declare function atelierAdopterIds(layout: AtelierLayout): void;
7802
8717
  /**
7803
8718
  * La première position libre pour un bloc de `w × h`, en balayant de haut en bas puis de
7804
8719
  * gauche à droite.
@@ -7811,19 +8726,49 @@ declare function atelierPremierePlaceLibre(items: readonly AtelierItem[], w: num
7811
8726
  x: number;
7812
8727
  y: number;
7813
8728
  };
7814
- /** Pose un composant, à la première place libre ou à l'endroit demandé. */
8729
+ /** Nombre TOTAL de composants, à toutes les profondeurs c'est lui que borne `itemsMax`. */
8730
+ declare function atelierCompter(layout: AtelierLayout): number;
8731
+ /**
8732
+ * Retrouve un composant OÙ QU'IL VIVE, à n'importe quelle profondeur.
8733
+ *
8734
+ * `parentId` dit d'où il vient — c'est ce qui permet à l'inspecteur de remonter, d'un
8735
+ * cran à la fois. `profondeur` dit à quel étage il se trouve (0 = sur le plan) : la
8736
+ * pose s'en sert pour refuser AVANT d'agir, plutôt que de tronquer après.
8737
+ */
8738
+ declare function atelierTrouver(layout: AtelierLayout, id: string): {
8739
+ item: AtelierItem;
8740
+ parentId: string | null;
8741
+ profondeur: number;
8742
+ } | null;
8743
+ /**
8744
+ * Pose un composant — sur le plan, ou DANS un conteneur (`dansId`), à n'importe quelle
8745
+ * profondeur jusqu'à `profondeurMax`.
8746
+ *
8747
+ * Dans un conteneur, l'enfant vit en FLUX : ajouté en fin, x/y/w/h normalisés (0/0/12/1),
8748
+ * l'ordre fait loi. Refus VISIBLE (id vide) si le conteneur n'existe pas, s'il est déjà
8749
+ * au dernier étage autorisé, ou si un plafond est atteint — jamais de troncature
8750
+ * silencieuse, même doctrine que le plafond global.
8751
+ */
7815
8752
  declare function atelierAjouter(layout: AtelierLayout, type: string, gabarit?: {
7816
8753
  w?: number;
7817
8754
  h?: number;
7818
8755
  props?: AtelierItem['props'];
7819
- }): {
8756
+ }, dansId?: string): {
7820
8757
  layout: AtelierLayout;
7821
8758
  id: string;
7822
8759
  };
7823
- /** Retire un composant. Sans effet si l'identifiant est inconnu. */
8760
+ /**
8761
+ * Retire un composant, où qu'il vive et à quelque profondeur que ce soit.
8762
+ * Retirer un conteneur emporte toute sa descendance — jamais d'orphelin invisible.
8763
+ */
7824
8764
  declare function atelierRetirer(layout: AtelierLayout, id: string): AtelierLayout;
7825
- /** Change une propriété. `undefined` la supprime plutôt que d'écrire un vide. */
8765
+ /** Change une propriété — où que vive le composant. `undefined` la supprime. */
7826
8766
  declare function atelierDefinirProp(layout: AtelierLayout, id: string, nom: string, valeur: string | number | boolean | string[] | undefined): AtelierLayout;
8767
+ /**
8768
+ * Déplace un ENFANT d'un cran dans son conteneur (le flux : l'ordre fait loi).
8769
+ * Même chemin pour la souris et le clavier, comme le reste du modèle.
8770
+ */
8771
+ declare function atelierReordonnerEnfant(layout: AtelierLayout, parentId: string, id: string, sens: -1 | 1): AtelierLayout;
7827
8772
  /**
7828
8773
  * Change la largeur, en gardant le bloc DANS la grille.
7829
8774
  *
@@ -7877,6 +8822,12 @@ interface AtelierProp {
7877
8822
  controle: 'interrupteur' | 'liste' | 'nombre' | 'texte' | 'liaison';
7878
8823
  /** Valeurs proposées quand `controle === 'liste'`. */
7879
8824
  choix?: string[];
8825
+ /**
8826
+ * La liste accepte AUSSI l'état vide : union `'a' | 'b' | null` — le troisième état
8827
+ * est « rien », pas un texte libre. L'inspecteur propose alors « (aucun) », qui
8828
+ * RETIRE la prop. Signalé par SZU le 24/08 sur `selectable`.
8829
+ */
8830
+ videAutorise?: boolean;
7880
8831
  }
7881
8832
  interface AtelierComposant {
7882
8833
  /**
@@ -7905,6 +8856,91 @@ interface AtelierComposant {
7905
8856
  largeur: number;
7906
8857
  /** Hauteur de départ, en lignes de grille. */
7907
8858
  hauteur: number;
8859
+ /**
8860
+ * Comment le composant occupe sa cellule : il la REMPLIT (défaut — un bouton d'une
8861
+ * rangée fait la hauteur d'une rangée), ou il garde sa taille NATURELLE, centré
8862
+ * verticalement — pour les composants plus petits qu'un contrôle (tag, badge,
8863
+ * interrupteur…), qu'étirer déformerait.
8864
+ *
8865
+ * Vient de l'annotation `@atelier ajustement=naturel` portée par le composant : la
8866
+ * métadonnée voyage avec lui, l'atelier n'a aucune liste.
8867
+ */
8868
+ ajustement: 'remplir' | 'naturel';
8869
+ /**
8870
+ * Ce composant DESSINE-T-IL quelque chose ? `aucune` = il occupe sa place sans rien
8871
+ * rendre (`cad-spacer`).
8872
+ *
8873
+ * Sert aux OUTILS DE CONCEPTION à le matérialiser : un composant qui n'affiche rien
8874
+ * est indistinguable d'un composant absent, on ne peut ni le voir ni le saisir. La
8875
+ * métadonnée voyage avec le composant — l'atelier n'a aucune liste à tenir à jour, et
8876
+ * c'est ce qui évite qu'un futur composant sans surface soit oublié.
8877
+ *
8878
+ * ⚠️ N'A AUCUN EFFET AU RENDU. Seule la feuille de style de l'ÉDITEUR agit dessus ;
8879
+ * le visualiseur et le shell frontless n'ont pas la règle, donc ils ne peuvent pas
8880
+ * l'afficher, même par erreur. La garantie est structurelle, pas conditionnelle.
8881
+ */
8882
+ surface: 'propre' | 'aucune';
8883
+ /**
8884
+ * Icône de palette (`@atelier icone=…`), VALIDÉE contre le jeu d'icônes réel : un nom
8885
+ * inconnu retombe sur `null` plutôt que d'afficher un carré cassé — mieux vaut vide
8886
+ * que faux, comme `role`. Les correspondances vivent sur les composants (88 posées le
8887
+ * 24/08), jamais dans une table de l'atelier.
8888
+ */
8889
+ icone: string | null;
8890
+ /**
8891
+ * Texte projeté DE DÉPART (`@atelier contenu=…`) : un bouton posé dit « Bouton » au
8892
+ * lieu de ressembler à un point. Réservé aux composants dont le corps passe par
8893
+ * `<ng-content>` ; l'atelier l'écrit sous la clé `__contenu` à la pose.
8894
+ */
8895
+ contenu: string | null;
8896
+ /**
8897
+ * Ce composant ACCUEILLE des enfants, et dit COMMENT :
8898
+ * · `flux` (panel, carte, fieldset…) — enfants dans une grille de flux 12 colonnes,
8899
+ * chacun enveloppé d'un bloc d'atelier (largeur, isolation d'échec, ajustement) ;
8900
+ * · `direct` (groupe de boutons…) — enfants projetés NUS, sans enveloppe ni grille :
8901
+ * pour les composants dont les styles ciblent leurs enfants DIRECTS et que toute
8902
+ * enveloppe casserait (pilule, segments accolés).
8903
+ * `false` : rien ne se pose dedans. Un seul niveau dans tous les cas.
8904
+ */
8905
+ conteneur: 'flux' | 'direct' | false;
8906
+ /**
8907
+ * Ce composant n'a de sens QUE DANS un hôte (`@atelier dans=cad-map`) : les pièces de
8908
+ * carte, par exemple, s'instancient sans erreur mais ne montrent rien de sensé posées
8909
+ * seules. La palette les MASQUE tant que leur hôte n'est pas la cible de pose — elles
8910
+ * apparaissent dans leur groupe quand on est « dans » le bon conteneur.
8911
+ */
8912
+ dans: string | null;
8913
+ /**
8914
+ * Les seules clés que cet hôte accueille (`@atelier accepte=cad-avatar`), ou `null`
8915
+ * si rien n'est déclaré. Plusieurs clés se séparent par `|`.
8916
+ *
8917
+ * COMPLÈTE `dans=` sans le doubler. `dans=` dit « cette pièce ne va QUE là », ce qui
8918
+ * rend son hôte strict par ricochet — c'est le cas de `cad-tabs` et de `cad-map`.
8919
+ * Mais un `cad-avatar` se pose aussi très bien seul sur une carte : il ne peut donc
8920
+ * pas porter `dans=`, et c'est alors à l'HÔTE de dire ce qu'il prend.
8921
+ */
8922
+ accepte: string[] | null;
8923
+ /**
8924
+ * Valeurs de départ des ENTRÉES à la pose (`@atelier pose-value=Étiquette`) — le
8925
+ * pendant de `contenu` pour les composants dont le visible passe par une entrée et
8926
+ * non par la projection : un tag sans `value` est une coquille invisible, constaté
8927
+ * au clic le 24/08. Modifiables et effaçables ensuite comme toute saisie.
8928
+ */
8929
+ proposDeDepart: Record<string, string | number | boolean>;
8930
+ /**
8931
+ * Rang d'affichage DANS son groupe (`@atelier rang=1`), 99 sans annotation. Sert à
8932
+ * mettre en tête ce qu'on pose en premier (le panel chez les conteneurs) sans
8933
+ * qu'aucune liste d'ordre ne vive dans l'atelier.
8934
+ */
8935
+ rang: number;
8936
+ /**
8937
+ * Jeux d'exemple (`@atelier-exemple <entrée> <JSON>`) : ce qui rend un composant À
8938
+ * DONNÉES jugeable posé nu — une table montre des lignes, un select des options.
8939
+ * Poussés AU RENDU quand l'item ne fournit pas l'entrée, JAMAIS écrits dans le
8940
+ * layout ni dans le code généré : le gabarit reste scalaire, l'exemple s'efface dès
8941
+ * qu'une vraie valeur arrive.
8942
+ */
8943
+ exemples: Record<string, unknown>;
7908
8944
  }
7909
8945
  /** `CadBadgeComponent` → `cad-badge`. Dérivé, jamais saisi. */
7910
8946
  declare function atelierCleDeSymbole(symbole: string): string;
@@ -7944,14 +8980,112 @@ declare function atelierControle(type: string | undefined): Pick<AtelierProp, 'c
7944
8980
  declare function atelierPalette(): readonly AtelierComposant[];
7945
8981
  /** Le composant derrière une clé de `layout.json`, ou `null` s'il n'existe plus. */
7946
8982
  declare function atelierComposant(cle: string): AtelierComposant | null;
7947
- /** Recherche par nom, clé ou sélecteur. Sans terme, rend tout. */
8983
+ /**
8984
+ * Cet hôte accepte-t-il ce composant ? `hote = null` désigne le PLAN.
8985
+ *
8986
+ * ⚠️ `dans=` SE LIT DANS LES DEUX SENS, et c'est toute la règle (arbitrage SZU 27/08) :
8987
+ *
8988
+ * · SENS DIRECT — une pièce ne se pose QUE chez son hôte. `cad-map-panel` posé seul
8989
+ * ne montre rien de sensé (signalé le 24/08), `cad-tab` hors d'un `cad-tabs` non plus.
8990
+ * · SENS INVERSE — un hôte QUI A des pièces n'accepte QUE ses pièces. `cad-tabs`
8991
+ * n'accueille que des `cad-tab`, `cad-map` que ses onze pièces de carte.
8992
+ *
8993
+ * La troisième règle en découle sans être écrite : un conteneur SANS pièce déclarée
8994
+ * (`cad-tab`, `cad-panel`, `cad-grid`…) accepte tout, sauf ce qui appartient à un autre
8995
+ * hôte. Rien à annoter : la relation existe déjà, on la lisait à moitié.
8996
+ */
8997
+ declare function atelierAccepte(hote: string | null, cle: string): boolean;
8998
+ /**
8999
+ * Les clés des pièces d'un hôte, dans l'ordre de la palette. Vide si l'hôte n'est pas
9000
+ * strict — c'est le test « ce conteneur a-t-il des pièces à lui ? ».
9001
+ */
9002
+ declare function atelierPiecesDe(hote: string | null): string[];
9003
+ /**
9004
+ * Recherche par nom, clé ou sélecteur. Rend TOUT ce qui correspond au terme.
9005
+ *
9006
+ * ⚠️ NE FILTRE PLUS SUR LA CIBLE, et c'est délibéré (SZU 27/08, règle déjà posée le
9007
+ * 26/08 pour le builder) : ce qu'un conteneur refuse doit apparaître VERROUILLÉ, pas
9008
+ * disparaître. Masquer fait deux dégâts — ça dérobe l'information (l'utilisateur ne sait
9009
+ * pas que le composant existe, ni pourquoi il n'est pas là) et ça fait SAUTER la palette
9010
+ * à chaque changement de sélection, si bien qu'on ne retrouve plus rien où on l'avait vu.
9011
+ *
9012
+ * L'appelant interroge `atelierAccepte` pour savoir quoi désactiver, et dit pourquoi.
9013
+ */
7948
9014
  declare function atelierChercher(terme: string): AtelierComposant[];
7949
- /** Les composants groupés, dans l'ordre d'affichage de la palette. */
9015
+ /**
9016
+ * Les composants groupés, dans l'ordre d'affichage de la palette.
9017
+ *
9018
+ * Les groupes ne dépendent PAS de la cible : la palette garde la même forme quoi qu'on
9019
+ * sélectionne, ce qui est la moitié de l'intérêt du verrouillage-expliqué.
9020
+ */
7950
9021
  declare function atelierGroupes(terme?: string): {
7951
9022
  groupe: string;
7952
9023
  composants: AtelierComposant[];
7953
9024
  }[];
7954
9025
 
9026
+ /**
9027
+ * OÙ un clic de palette pose réellement le composant.
9028
+ *
9029
+ * ── POURQUOI CE FICHIER EXISTE ──────────────────────────────────────────────────
9030
+ *
9031
+ * Depuis que les hôtes à pièces typées sont stricts, `cad-tabs` ne prend que des
9032
+ * `cad-tab`. Conséquence immédiate, signalée par SZU le 27/08 : « je fais comment pour
9033
+ * placer un composant sur cad-tab, puisque quand je sélectionne quelque chose c'est
9034
+ * cad-tabs qui est sélectionné ? » — le canevas ne sélectionne que les blocs du PLAN, et
9035
+ * la seule façon de viser un onglet était la liste de l'inspecteur. Ça marche, mais il
9036
+ * faut le savoir : une affordance qu'on doit enseigner n'en est pas une.
9037
+ *
9038
+ * La règle, telle qu'elle a été demandée dès le premier message (« cad-spacer devrait
9039
+ * aller dans cad-tab ») : quand l'hôte visé est STRICT et que le composant n'est pas une
9040
+ * de ses pièces, on DESCEND dans sa pièce courante. Poser un onglet ajoute un onglet ;
9041
+ * poser un bouton le met dans l'onglet affiché.
9042
+ *
9043
+ * Le routage ne s'applique QUE si l'hôte a exactement UN type de pièce et que cette
9044
+ * pièce est elle-même un conteneur. `cad-map` a onze pièces, dont aucune n'accueille
9045
+ * quoi que ce soit : il n'y a rien à router, et un `cad-button` y reste refusé — ce qui
9046
+ * est la vérité, pas une limite d'outil.
9047
+ *
9048
+ * Rien ici ne mute : on rend une DESTINATION, l'appelant décide.
9049
+ */
9050
+
9051
+ /** La destination d'un clic de palette, résolue et explicable. */
9052
+ interface AtelierCible {
9053
+ /** Le conteneur qui recevra le composant. `null` = le plan. */
9054
+ dansId: string | null;
9055
+ /**
9056
+ * Pièce d'hôte à créer AVANT de poser, parce que l'hôte est strict et n'en a aucune.
9057
+ * L'appelant pose d'abord celle-ci dans `dansId`, puis le composant dans la pièce
9058
+ * obtenue. Elle apparaît à l'écran : rien de caché.
9059
+ */
9060
+ pieceACreer: string | null;
9061
+ /**
9062
+ * Le chemin lisible de la destination — `['cad-tabs', 'Onglet']` — pour l'ANNONCER
9063
+ * avant le clic. Un routage qu'on ne voit pas est une surprise ; annoncé, c'est un
9064
+ * service.
9065
+ */
9066
+ chemin: string[];
9067
+ /** Faux si ce composant ne peut se poser nulle part dans cette cible. */
9068
+ possible: boolean;
9069
+ }
9070
+ /**
9071
+ * Résout la destination d'un clic de palette.
9072
+ *
9073
+ * `selectionId` est le composant actuellement sélectionné — un conteneur accueille, un
9074
+ * composant simple fait poser à côté de lui, chez son parent.
9075
+ */
9076
+ declare function atelierCibleDePose(layout: AtelierLayout, selectionId: string | null, cle: string): AtelierCible;
9077
+ /**
9078
+ * Les valeurs de DÉPART d'un composant qu'on pose : le texte projeté (`contenu=`) et
9079
+ * les entrées (`pose-*`) du catalogue.
9080
+ *
9081
+ * Extrait ici parce que DEUX poseurs doivent l'appliquer, et à DEUX endroits chacun :
9082
+ * au composant cliqué, et à la pièce d'hôte que le routage crée au passage. Cette
9083
+ * seconde application manquait — un onglet né du routage arrivait sans libellé, donc
9084
+ * invisible dans la barre (mesuré au clic dans le builder le 27/08). Un composant posé
9085
+ * sans ses valeurs de départ est une coquille, c'était déjà la leçon du 24/08.
9086
+ */
9087
+ declare function atelierProposDePose(cle: string): AtelierItem['props'];
9088
+
7955
9089
  /** `Relevé d'ouvrage` → `ReleveOuvrage`. */
7956
9090
  declare function atelierNomDeClasse(titre: string): string;
7957
9091
  /** `ReleveOuvrage` → `app-releve-ouvrage`. */
@@ -7970,11 +9104,12 @@ declare function atelierImports(layout: AtelierLayout): string[];
7970
9104
  */
7971
9105
  declare function atelierGabarit(layout: AtelierLayout): string;
7972
9106
  /**
7973
- * Les styles du plan — RECOPIÉS du rendu de frontless (`serverless/shell/src/frontless/
7974
- * grid.ts`), pas réinventés. Une maquette doit s'afficher chez qui la colle exactement
9107
+ * Les styles du plan — la grille de frontless (`serverless/shell/src/frontless/grid.ts`),
9108
+ * à la rangée près : 44 px comme l'atelier (divergence assumée du 24/08 — la rangée fait
9109
+ * la hauteur d'un contrôle). Une maquette doit s'afficher chez qui la colle exactement
7975
9110
  * comme dans l'atelier, y compris son repli mobile à une colonne.
7976
9111
  */
7977
- declare const ATELIER_STYLES_PLAN = " .plan {\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n grid-auto-rows: 58px;\n gap: 10px;\n }\n .bloc { grid-column: var(--gc); grid-row: var(--gr); min-width: 0; overflow: hidden; }\n @media (max-width: 700px) {\n .plan { grid-template-columns: 1fr; grid-auto-rows: minmax(58px, auto); }\n .bloc { grid-column: auto; grid-row: auto; }\n .bloc.cache-mobile { display: none; }\n }";
9112
+ declare const ATELIER_STYLES_PLAN = " .plan {\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n grid-auto-rows: 44px;\n gap: 10px;\n }\n .bloc { grid-column: var(--gc); grid-row: var(--gr); min-width: 0; overflow: hidden; }\n .flux { display: grid; grid-template-columns: repeat(12, 1fr); gap: 8px; width: 100%; }\n .flux > * { min-width: 0; }\n @media (max-width: 700px) {\n .plan { grid-template-columns: 1fr; grid-auto-rows: minmax(44px, auto); }\n .bloc { grid-column: auto; grid-row: auto; }\n .bloc.cache-mobile { display: none; }\n .flux { grid-template-columns: 1fr; }\n .flux > * { grid-column: auto !important; }\n }";
7978
9113
  /** Le composant Angular complet, prêt à coller dans un projet. */
7979
9114
  declare function atelierCode(layout: AtelierLayout, titre?: string): string;
7980
9115
 
@@ -8003,10 +9138,10 @@ interface EntreeRegistre {
8003
9138
  /** La balise à créer pour l'héberger. */
8004
9139
  readonly hote: string;
8005
9140
  }
8006
- /** Symbole -> de quoi le construire. 102 composants posables. */
9141
+ /** Symbole -> de quoi le construire. 106 composants posables. */
8007
9142
  declare const REGISTRE: Readonly<Record<string, EntreeRegistre>>;
8008
9143
  /** La classe d'un symbole, ou `null` s'il n'est pas posable (directive, ou hôte indéterminable). */
8009
9144
  declare function classeDe(symbole: string): Type<unknown> | null;
8010
9145
 
8011
- export { ATELIER_BORNES, ATELIER_COLONNES, ATELIER_STYLES_PLAN, BanGeocoder, CAD_BREAKPOINTS, CAD_CHART_PALETTE, CAD_COLOR_PRESETS, CAD_DEFAULT_BASEMAPS, CAD_DEFAULT_PRIORITY_BREAKPOINTS, CAD_DIALOG_DATA, CAD_FILTER_OPERATORS, CAD_GEOCODER, CAD_ICONS, CAD_ICONS_CEREMA, CAD_ICONS_CORE, CAD_ICONS_DATA, CAD_ICONS_FILES, CAD_ICONS_GEO, CAD_ICONS_SUBSET, CAD_ICONS_TOKEN, CAD_ICONS_UI, CAD_ICON_ALIASES, CAD_ICON_CATEGORIES, CAD_MAPLIBRE_CSS_URL, CAD_MAP_CHILD, CAD_MAP_DEFAULTS, CAD_MAP_GLOBAL_STYLES, CAD_MAP_GLYPHS, CAD_MAP_PALETTE, CAD_MASK_PRESETS, CAD_MOBILE_BREAKPOINT, CAD_RECURRENCE_INTERNE, CAD_SELECT_POSITIONS, CAD_SELECT_TRIGGER_STYLES, CAD_SHEET_DATA, CAD_SHELL, CAD_TOUCH_DENSITY, CadAccordionComponent, CadAccordionPanelComponent, CadAppShellComponent, CadAvatarComponent, CadAvatarGroupComponent, CadBadgeComponent, CadBadgeDirective, CadBlockDirective, CadBlockOverlayComponent, CadBlockUiComponent, CadBottomNavComponent, CadBreadcrumbComponent, CadBreadcrumbItemDirective, CadBreakpointService, CadButtonComponent, CadButtonGroupComponent, CadCalendarComponent, CadCaptionDirective, CadCardComponent, CadCardDirective, CadCardHeaderDirective, CadCarouselComponent, CadCarouselItemDirective, CadCascadeSelectComponent, CadCellTemplateDirective, CadCenterComponent, CadChartComponent, CadCheckboxComponent, CadChipComponent, CadClusterComponent, CadColDirective, CadColorpickerComponent, CadColumnComponent, CadComboComponent, CadConfirmContentComponent, CadConfirmDialogComponent, CadConfirmService, CadContainerComponent, CadDataviewComponent, CadDataviewGridDirective, CadDataviewListDirective, CadDatepickerComponent, CadDialogComponent, CadDialogContainerComponent, CadDialogFooterDirective, CadDialogHeaderDirective, CadDialogRef, CadDialogService, CadDividerComponent, CadDrawerComponent, CadEditFocusDirective, CadEditorTemplateDirective, CadEmptyDirective, CadFieldComponent, CadFieldsetComponent, CadFieldsetLegendDirective, CadFilterChipComponent, CadFilterTemplateDirective, CadGeocodingService, CadGridComponent, CadGroupFooterDirective, CadGroupHeaderDirective, CadHeaderTemplateDirective, CadIconComponent, CadIconRegistry, CadIfDirective, CadImageComponent, CadInplaceComponent, CadInplaceContentDirective, CadInplaceDisplayDirective, CadInputDirective, CadJsonEditorComponent, CadKeyFilterDirective, CadListEmptyDirective, CadListFooterDirective, CadListHeaderDirective, CadListItemDirective, CadListboxComponent, CadMapBasemapRegistry, CadMapBasemapsComponent, CadMapCardComponent, CadMapChromeComponent, CadMapComponent, CadMapDrawEngine, CadMapLayerComponent, CadMapLayerGroupComponent, CadMapLayerToggleComponent, CadMapLegendComponent, CadMapMenuComponent, CadMapPanelComponent, CadMapPanels, CadMapRailComponent, CadMapRailItemComponent, CadMapSearchComponent, CadMapSectionComponent, CadMaskDirective, CadMenuComponent, CadMenubarComponent, CadMessageComponent, CadMeterComponent, CadMeterLabelDirective, CadMultiselectComponent, CadNavDrawerComponent, CadNavDrawerFooterDirective, CadNavDrawerHeaderDirective, CadNumberComponent, CadOptionListComponent, CadOrderlistComponent, CadOrgNodeDirective, CadOrgchartComponent, CadOverlayBase, CadPaginatorComponent, CadPanelComponent, CadPanelContentDirective, CadPanelHeaderDirective, CadPanelHeadingDirective, CadPasswordComponent, CadPicklistComponent, CadPopoverComponent, CadProgressComponent, CadRadioComponent, CadRadioGroupComponent, CadRatingComponent, CadRowActionsDirective, CadRowCountDirective, CadRowExpansionDirective, CadScrollTopComponent, CadSegmentedComponent, CadSelectBase, CadSelectComponent, CadSelectEmptyDirective, CadSelectFooterDirective, CadSelectHeaderDirective, CadSelectItemDirective, CadSelectSelectedDirective, CadSheetContainerComponent, CadSheetRef, CadSheetService, CadSidebarComponent, CadSidebarPanelDirective, CadSkeletonComponent, CadSliderComponent, CadSpacerComponent, CadSpeedDialComponent, CadSpinnerComponent, CadSplitButtonComponent, CadSplitComponent, CadSplitterComponent, CadSplitterPanelComponent, CadStackComponent, CadStepComponent, CadStepperComponent, CadSwitchComponent, CadTabComponent, CadTabContentDirective, CadTabLabelDirective, CadTableBase, CadTableComponent, CadTableEdit, CadTableEditUi, CadTableFooterDirective, CadTablePanelComponent, CadTableResponsive, CadTableSelection, CadTableSticky, CadTableVirtual, CadTabsComponent, CadTagComponent, CadTaskCardDirective, CadTaskRowDirective, CadTaskboardComponent, CadTimeAxis, CadTimelineComponent, CadTimelineContentDirective, CadTimelineMarkerDirective, CadTimelineOppositeDirective, CadToastComponent, CadToastItemDirective, CadToastService, CadToggleButtonComponent, CadTooltipComponent, CadTooltipDirective, CadTreeAdapter, CadTreeComponent, CadTreeNodeDirective, CadTreeselectComponent, CadUploadComponent, CadUploadContentDirective, CadUploadEmptyDirective, CadUploadItemDirective, CadValueAccessor, CadWorkCalendar, MAPLIBRE_MIN_CSS, REGISTRE, addDays, addMonths, addYears, atelierAjouter, atelierBalise, atelierChercher, atelierCleDeSymbole, atelierCode, atelierComposant, atelierControle, atelierDefinirProp, atelierDeplacer, atelierGabarit, atelierGroupes, atelierImports, atelierLayoutVide, atelierManques, atelierNomDeClasse, atelierNormaliser, atelierNouvelId, atelierPalette, atelierPoser, atelierPremierePlaceLibre, atelierRecompacter, atelierRedimensionner, atelierReinitialiserIds, atelierRetirer, atelierSelecteurDeClasse, cadAggregate, cadApplyColumnOrder, cadApplyMask, cadArea, cadAutosizeWidth, cadBasemapThumbnail, cadBoundsOf, cadCategories, cadCentroid, cadColorExpr, cadCompare, cadCompareRank, cadCurrentOperator, cadDebutSemaine, cadDefaultMatchMode, cadDistance, cadDownloadCsv, cadDurationToMinutes, cadEstBandeau, cadExpandOccurrences, cadFilterData, cadFilterKindOf, cadFilterOperators, cadFilterRows, cadFindLinkCycle, cadFmtArea, cadFmtLength, cadFormatCell, cadFormatColor, cadFormatDuration, cadFormatSize, cadFrenchHolidays, cadGap, cadGeoJSONStats, cadGeometryKinds, cadHeaderMenuItems, cadHighlightJson, cadHslToRgb, cadHsvToRgb, cadId, cadIsGroupKey, cadIsRank, cadJsonErrorPos, cadLegendFromStyle, cadLength, cadMapEstVivante, cadMapLayerOf, cadMapLayersOf, cadMatch, cadMinuit, cadMonthGrid, cadMoveColumn, cadMoveItems, cadNormalize, cadNormalizeOptions, cadNormalizePlan, cadNumberExpr, cadNumeroJour, cadPackDay, cadPadBounds, cadParseColor, cadParseDuration, cadParseRRule, cadParseResponsive, cadPlanHeader, cadPlanTicks, cadProjeterClavier, cadProjeterCreation, cadProjeterEdition, cadProjeterMois, cadPropsTable, cadRankBetween, cadRankFirst, cadRankLast, cadRankSequence, cadResolve, cadResolveResponsive, cadResponsive, cadRgbToHsl, cadRgbToHsv, cadRingArea, cadRowKey, cadRowPredicate, cadSameValue, cadScaleNext, cadScaleStart, cadSortData, cadStartResize, cadStyleToExpressions, cadUnmask, cadUnscheduled, cadValidateGeoJSON, cadValueForOperator, cadWeekBands, cadWriteField, classeDe, compareDay, daysInMonth, endOfMonth, ensureMaplibreCss, formatDate, isBetweenDay, isSameDay, isSameMonth, isValidDate, isoOf, isoWeek, loadChartJs, loadMaplibre, monthNames, pad2, parseIso, parseWithFormat, provideCadIcons, startOfDay, startOfMonth, toDate, weekdayNames };
8012
- export type { AtelierComposant, AtelierItem, AtelierLayout, AtelierProp, CadAggregate, CadAggregateFn, CadAggregates, CadBadgeSeverity, CadBand, CadBandRow, CadBasemap, CadBasemapKind, CadBottomNavItem, CadBounds, CadBreadcrumbItem, CadBreakpoint, CadCalendarChangeEvent, CadCalendarCreateEvent, CadCalendarDateEvent, CadCalendarEventEvent, CadCalendarSource, CadCalendarView, CadCarouselResponsive, CadCellContext, CadCellEditState, CadChartClickEvent, CadChartType, CadColorFormat, CadColorSpec, CadColumnAlign, CadColumnDataType, CadColumnEditor, CadColumnFilterOption, CadColumnFilterType, CadColumnMenuActionEvent, CadColumnPinEvent, CadColumnReorderEvent, CadColumnResizeEvent, CadColumnToggleEvent, CadComboSource, CadConfirmOptions, CadDataviewLayout, CadDateMode, CadDateSelection, CadDateValue, CadDialogConfig, CadDialogPosition, CadDialogSize, CadDisplayRow, CadDrawMode, CadDrawOptions, CadDrawerPosition, CadDuration, CadDurationUnit, CadEditBase, CadEditCompleteEvent, CadEditEvent, CadEditGeometry, CadEditKind, CadEditMode, CadEditorContext, CadExpandResult, CadFeatureEvent, CadFilterChangeEvent, CadFilterKind, CadFilterMatchMode, CadFilterMeta, CadFilterOperator, CadFilters, CadGap, CadGeoJSON, CadGeocodeOptions, CadGeocodeResult, CadGeocoder, CadGeometryKind, CadGroupBy, CadGroupContext, CadGroupInfo, CadGroupItem, CadHeaderMenuHost, CadHsva, CadLayerStyle, CadLazyLoadEvent, CadLegendItem, CadListGroup, CadListItem, CadListNormalizeOpts, CadListOption, CadListRow, CadLngLat, CadMapChild, CadMapChrome, CadMapClick, CadMapControl, CadMapLayerType, CadMapMenuConfig, CadMapMenuItem, CadMapMenuPanel, CadMapMenuRailItem, CadMapMenuSection, CadMapPosition, CadMapSide, CadMapView, CadMeasure, CadMenuItem, CadMenubarItem, CadMeterValue, CadMonthGrid, CadNavDrawerItem, CadNavDrawerMode, CadNavDrawerRow, CadNodeEvent, CadNormalizePlanOptions, CadNormalizedPlan, CadNumberSpec, CadOccurrence, CadOptionItem, CadOrgNode, CadOverlayHandle, CadPageEvent, CadPaintSet, CadPinnedColumns, CadPlacement, CadPlan, CadPlanAssignment, CadPlanBucket, CadPlanCalendar, CadPlanCalendarException, CadPlanDateInput, CadPlanHeader, CadPlanHours, CadPlanIssue, CadPlanLink, CadPlanLinkType, CadPlanMarker, CadPlanResource, CadPlanScale, CadPlanTask, CadPlanTick, CadPlanTicksOptions, CadPlannedLink, CadPlannedTask, CadPriorityBreakpoints, CadProgressSeverity, CadRRule, CadRRuleFreq, CadRecurrenceIssue, CadRgba, CadRowEditEvent, CadRowEditState, CadRowEvent, CadRowReorderEvent, CadSegmentOption, CadSelectItemContext, CadSelectionMode, CadSelectionPropagation, CadSeverity, CadSheetConfig, CadSheetHeight, CadShellApi, CadSize, CadSliderMark, CadSliderSeverity, CadSliderValue, CadSlot, CadSortEvent, CadSortMeta, CadSortOrder, CadStepState, CadTableEditContext, CadTableEditUiContext, CadTablePanelTab, CadTableResponsiveMode, CadTableSelectionContext, CadTagSeverity, CadTaskAssignEvent, CadTaskMoveEvent, CadTaskOpenEvent, CadTaskboardGroupBy, CadTaskboardMode, CadTimelineAlign, CadToastAction, CadToastMessage, CadToastPosition, CadToastSeverity, CadTreeAdapterOptions, CadTreeNode, CadTreeNodeEvent, CadUploadFile, CadUploadHandlerEvent, CadUploadStatus, CadVariant, CadVirtualRange, CadWipEvent, EntreeRegistre, MLExpression, MaplibreModule };
9146
+ export { ATELIER_BORNES, ATELIER_COLONNES, ATELIER_STYLES_PLAN, BanGeocoder, CAD_BREAKPOINTS, CAD_CHART_PALETTE, CAD_COLOR_PRESETS, CAD_DEFAULT_BASEMAPS, CAD_DEFAULT_PRIORITY_BREAKPOINTS, CAD_DIALOG_DATA, CAD_FILTER_OPERATORS, CAD_GEOCODER, CAD_ICONS, CAD_ICONS_CEREMA, CAD_ICONS_CORE, CAD_ICONS_DATA, CAD_ICONS_FILES, CAD_ICONS_GEO, CAD_ICONS_SUBSET, CAD_ICONS_TOKEN, CAD_ICONS_UI, CAD_ICON_ALIASES, CAD_ICON_CATEGORIES, CAD_MAPLIBRE_CSS_URL, CAD_MAP_CHILD, CAD_MAP_DEFAULTS, CAD_MAP_GLOBAL_STYLES, CAD_MAP_GLYPHS, CAD_MAP_PALETTE, CAD_MASK_PRESETS, CAD_MOBILE_BREAKPOINT, CAD_RECURRENCE_INTERNE, CAD_SELECT_POSITIONS, CAD_SELECT_TRIGGER_STYLES, CAD_SHEET_DATA, CAD_SHELL, CAD_TOUCH_DENSITY, CadAccordionComponent, CadAccordionPanelComponent, CadAppShellComponent, CadAvatarComponent, CadAvatarGroupComponent, CadBadgeComponent, CadBadgeDirective, CadBlockDirective, CadBlockOverlayComponent, CadBlockUiComponent, CadBottomNavComponent, CadBreadcrumbComponent, CadBreadcrumbItemDirective, CadBreakpointService, CadButtonComponent, CadButtonGroupComponent, CadCalendarComponent, CadCaptionDirective, CadCardComponent, CadCardDirective, CadCardHeaderDirective, CadCarouselComponent, CadCarouselItemDirective, CadCascadeSelectComponent, CadCellTemplateDirective, CadCenterComponent, CadChartComponent, CadCheckboxComponent, CadChipComponent, CadClusterComponent, CadColDirective, CadColorpickerComponent, CadColumnComponent, CadComboComponent, CadConfirmContentComponent, CadConfirmDialogComponent, CadConfirmService, CadContainerComponent, CadDataviewComponent, CadDataviewGridDirective, CadDataviewListDirective, CadDatepickerComponent, CadDialogComponent, CadDialogContainerComponent, CadDialogFooterDirective, CadDialogHeaderDirective, CadDialogRef, CadDialogService, CadDividerComponent, CadDrawerComponent, CadEditFocusDirective, CadEditorTemplateDirective, CadEmptyDirective, CadFieldComponent, CadFieldsetComponent, CadFieldsetLegendDirective, CadFilterChipComponent, CadFilterTemplateDirective, CadGanttComponent, CadGeocodingService, CadGridComponent, CadGroupFooterDirective, CadGroupHeaderDirective, CadHeaderTemplateDirective, CadIconComponent, CadIconRegistry, CadIfDirective, CadImageComponent, CadInplaceComponent, CadInplaceContentDirective, CadInplaceDisplayDirective, CadInputDirective, CadJsonEditorComponent, CadKeyFilterDirective, CadListEmptyDirective, CadListFooterDirective, CadListHeaderDirective, CadListItemDirective, CadListboxComponent, CadMapBasemapRegistry, CadMapBasemapsComponent, CadMapCardComponent, CadMapChromeComponent, CadMapComponent, CadMapDrawEngine, CadMapLayerComponent, CadMapLayerGroupComponent, CadMapLayerToggleComponent, CadMapLegendComponent, CadMapMenuComponent, CadMapPanelComponent, CadMapPanels, CadMapRailComponent, CadMapRailItemComponent, CadMapSearchComponent, CadMapSectionComponent, CadMaskDirective, CadMenuComponent, CadMenubarComponent, CadMessageComponent, CadMeterComponent, CadMeterLabelDirective, CadMultiselectComponent, CadNavDrawerComponent, CadNavDrawerFooterDirective, CadNavDrawerHeaderDirective, CadNumberComponent, CadOptionListComponent, CadOrderlistComponent, CadOrgNodeDirective, CadOrgchartComponent, CadOverlayBase, CadPaginatorComponent, CadPanelComponent, CadPanelContentDirective, CadPanelHeaderDirective, CadPanelHeadingDirective, CadPasswordComponent, CadPicklistComponent, CadPopoverComponent, CadProgressComponent, CadRadioComponent, CadRadioGroupComponent, CadRatingComponent, CadRowActionsDirective, CadRowCountDirective, CadRowExpansionDirective, CadSchedulerComponent, CadScrollTopComponent, CadSegmentedComponent, CadSelectBase, CadSelectComponent, CadSelectEmptyDirective, CadSelectFooterDirective, CadSelectHeaderDirective, CadSelectItemDirective, CadSelectSelectedDirective, CadSheetContainerComponent, CadSheetRef, CadSheetService, CadSidebarComponent, CadSidebarPanelDirective, CadSkeletonComponent, CadSliderComponent, CadSpacerComponent, CadSpeedDialComponent, CadSpinnerComponent, CadSplitButtonComponent, CadSplitComponent, CadSplitterComponent, CadSplitterPanelComponent, CadStackComponent, CadStepComponent, CadStepperComponent, CadSwitchComponent, CadTabComponent, CadTabContentDirective, CadTabLabelDirective, CadTableBase, CadTableComponent, CadTableEdit, CadTableEditUi, CadTableFooterDirective, CadTablePanelComponent, CadTableResponsive, CadTableSelection, CadTableSticky, CadTableVirtual, CadTabsComponent, CadTagComponent, CadTaskCardDirective, CadTaskRowDirective, CadTaskboardComponent, CadTimeAxis, CadTimelineComponent, CadTimelineContentDirective, CadTimelineMarkerDirective, CadTimelineOppositeDirective, CadToastComponent, CadToastItemDirective, CadToastService, CadToggleButtonComponent, CadTooltipComponent, CadTooltipDirective, CadTreeAdapter, CadTreeComponent, CadTreeNodeDirective, CadTreeselectComponent, CadUploadComponent, CadUploadContentDirective, CadUploadEmptyDirective, CadUploadItemDirective, CadValueAccessor, CadWorkCalendar, MAPLIBRE_MIN_CSS, REGISTRE, addDays, addMonths, addYears, atelierAccepte, atelierAdopterIds, atelierAjouter, atelierBalise, atelierChercher, atelierCibleDePose, atelierCleDeSymbole, atelierCode, atelierComposant, atelierCompter, atelierControle, atelierDefinirProp, atelierDeplacer, atelierGabarit, atelierGroupes, atelierImports, atelierLayoutVide, atelierManques, atelierNomDeClasse, atelierNormaliser, atelierNouvelId, atelierPalette, atelierPiecesDe, atelierPoser, atelierPremierePlaceLibre, atelierProposDePose, atelierRecompacter, atelierRedimensionner, atelierReinitialiserIds, atelierReordonnerEnfant, atelierRetirer, atelierSelecteurDeClasse, atelierTrouver, cadAggregate, cadApplyColumnOrder, cadApplyMask, cadArea, cadAutosizeWidth, cadBasemapThumbnail, cadBoundsOf, cadCategories, cadCentroid, cadClipFenetre, cadColorExpr, cadCompare, cadCompareRank, cadCurrentOperator, cadDebutSemaine, cadDefaultMatchMode, cadDistance, cadDownloadCsv, cadDurationToMinutes, cadEstBandeau, cadExpandOccurrences, cadFilterData, cadFilterKindOf, cadFilterOperators, cadFilterRows, cadFindLinkCycle, cadFmtArea, cadFmtLength, cadFormatCell, cadFormatColor, cadFormatDuration, cadFormatSize, cadFrenchHolidays, cadGanttRows, cadGap, cadGeoJSONStats, cadGeometryKinds, cadHeaderMenuItems, cadHighlightJson, cadHslToRgb, cadHsvToRgb, cadId, cadIsGroupKey, cadIsRank, cadJsonErrorPos, cadLegendFromStyle, cadLength, cadMapEstVivante, cadMapLayerOf, cadMapLayersOf, cadMatch, cadMinuit, cadMonthGrid, cadMoveColumn, cadMoveItems, cadNormalize, cadNormalizeOptions, cadNormalizePlan, cadNumberExpr, cadNumeroJour, cadPackDay, cadPackLanes, cadPadBounds, cadParseColor, cadParseDuration, cadParseRRule, cadParseResponsive, cadPlanHeader, cadPlanTicks, cadPointeFleche, cadProjeterClavier, cadProjeterCreation, cadProjeterEdition, cadProjeterMois, cadPropsTable, cadRankBetween, cadRankFirst, cadRankLast, cadRankSequence, cadResolve, cadResolveResponsive, cadResponsive, cadRgbToHsl, cadRgbToHsv, cadRingArea, cadRouterLien, cadRowKey, cadRowPredicate, cadSameValue, cadScaleNext, cadScaleStart, cadSchedulerPartition, cadSortData, cadStartResize, cadStyleToExpressions, cadUnmask, cadUnscheduled, cadValidateGeoJSON, cadValueForOperator, cadWeekBands, cadWriteField, classeDe, compareDay, daysInMonth, endOfMonth, ensureMaplibreCss, estHoteAPieces, formatDate, isBetweenDay, isSameDay, isSameMonth, isValidDate, isoOf, isoWeek, loadChartJs, loadMaplibre, monthNames, pad2, parseIso, parseWithFormat, provideCadIcons, startOfDay, startOfMonth, toDate, weekdayNames };
9147
+ export type { AtelierCible, AtelierComposant, AtelierItem, AtelierLayout, AtelierProp, CadAggregate, CadAggregateFn, CadAggregates, CadBadgeSeverity, CadBand, CadBandRow, CadBasemap, CadBasemapKind, CadBottomNavItem, CadBounds, CadBreadcrumbItem, CadBreakpoint, CadCalendarChangeEvent, CadCalendarCreateEvent, CadCalendarDateEvent, CadCalendarEventEvent, CadCalendarSource, CadCalendarView, CadCarouselResponsive, CadCellContext, CadCellEditState, CadChartClickEvent, CadChartType, CadColonneDef, CadColorFormat, CadColorSpec, CadColumnAlign, CadColumnDataType, CadColumnEditor, CadColumnFilterOption, CadColumnFilterType, CadColumnMenuActionEvent, CadColumnPinEvent, CadColumnReorderEvent, CadColumnResizeEvent, CadColumnToggleEvent, CadComboSource, CadConfirmOptions, CadDataviewLayout, CadDateMode, CadDateSelection, CadDateValue, CadDialogConfig, CadDialogPosition, CadDialogSize, CadDisplayRow, CadDrawMode, CadDrawOptions, CadDrawerPosition, CadDuration, CadDurationUnit, CadEditBase, CadEditCompleteEvent, CadEditEvent, CadEditGeometry, CadEditKind, CadEditMode, CadEditorContext, CadExpandResult, CadFeatureEvent, CadFenetreSpan, CadFilterChangeEvent, CadFilterKind, CadFilterMatchMode, CadFilterMeta, CadFilterOperator, CadFilters, CadGanttRow, CadGanttScale, CadGanttTaskEvent, CadGap, CadGeoJSON, CadGeocodeOptions, CadGeocodeResult, CadGeocoder, CadGeometryKind, CadGroupBy, CadGroupContext, CadGroupInfo, CadGroupItem, CadHeaderMenuHost, CadHoteAPieces, CadHsva, CadLaneSpan, CadLayerStyle, CadLazyLoadEvent, CadLegendItem, CadLienAncre, CadLienTrace, CadListGroup, CadListItem, CadListNormalizeOpts, CadListOption, CadListRow, CadLngLat, CadMapChild, CadMapChrome, CadMapClick, CadMapControl, CadMapLayerType, CadMapMenuConfig, CadMapMenuItem, CadMapMenuPanel, CadMapMenuRailItem, CadMapMenuSection, CadMapPosition, CadMapSide, CadMapView, CadMeasure, CadMenuItem, CadMenubarItem, CadMeterValue, CadMonthGrid, CadNavDrawerItem, CadNavDrawerMode, CadNavDrawerRow, CadNodeEvent, CadNormalizePlanOptions, CadNormalizedPlan, CadNumberSpec, CadOccurrence, CadOptionItem, CadOrgNode, CadOverlayHandle, CadPageEvent, CadPaintSet, CadPinnedColumns, CadPlacement, CadPlan, CadPlanAssignment, CadPlanBucket, CadPlanCalendar, CadPlanCalendarException, CadPlanDateInput, CadPlanHeader, CadPlanHours, CadPlanIssue, CadPlanLink, CadPlanLinkType, CadPlanMarker, CadPlanResource, CadPlanScale, CadPlanTask, CadPlanTick, CadPlanTicksOptions, CadPlannedLink, CadPlannedTask, CadPriorityBreakpoints, CadProgressSeverity, CadRRule, CadRRuleFreq, CadRecurrenceIssue, CadRgba, CadRowEditEvent, CadRowEditState, CadRowEvent, CadRowReorderEvent, CadSchedulerAssignEvent, CadSchedulerChangeEvent, CadSchedulerCreateEvent, CadSchedulerEventEvent, CadSchedulerMode, CadSchedulerScale, CadSchedulerScheduleEvent, CadSegmentOption, CadSelectItemContext, CadSelectionMode, CadSelectionPropagation, CadSeverity, CadSheetConfig, CadSheetHeight, CadShellApi, CadSize, CadSliderMark, CadSliderSeverity, CadSliderValue, CadSlot, CadSortEvent, CadSortMeta, CadSortOrder, CadStepState, CadTableEditContext, CadTableEditUiContext, CadTablePanelTab, CadTableResponsiveMode, CadTableSelectionContext, CadTagSeverity, CadTaskAssignEvent, CadTaskMoveEvent, CadTaskOpenEvent, CadTaskboardGroupBy, CadTaskboardMode, CadTimelineAlign, CadToastAction, CadToastMessage, CadToastPosition, CadToastSeverity, CadTreeAdapterOptions, CadTreeNode, CadTreeNodeEvent, CadUploadFile, CadUploadHandlerEvent, CadUploadStatus, CadVariant, CadVirtualRange, CadWipEvent, EntreeRegistre, MLExpression, MaplibreModule };