@cadriciel/ui 0.1.0 → 0.3.0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cadriciel/ui",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.2.0",
6
6
  "@angular/core": "^21.2.0",
@@ -2247,6 +2247,170 @@ declare class CadSpeedDialComponent {
2247
2247
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadSpeedDialComponent, "cad-speed-dial", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "spacing": { "alias": "spacing"; "required": false; "isSignal": true; }; "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "showIcon": { "alias": "showIcon"; "required": false; "isSignal": true; }; "hideIcon": { "alias": "hideIcon"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; "itemClick": "itemClick"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
2248
2248
  }
2249
2249
 
2250
+ /** Une destination de la barre basse. Pas de sous-niveau : c'est le principe du composant. */
2251
+ interface CadBottomNavItem {
2252
+ /** Identifiant stable, retourné par `changed` et comparé à `value`. */
2253
+ value: string;
2254
+ label: string;
2255
+ icon: string;
2256
+ /** Icône affichée quand la destination est active (variante pleine, par exemple). */
2257
+ activeIcon?: string;
2258
+ routerLink?: string | unknown[];
2259
+ queryParams?: Record<string, unknown>;
2260
+ url?: string;
2261
+ /** Pastille de comptage. `true` affiche un simple point. */
2262
+ badge?: string | number | boolean;
2263
+ disabled?: boolean;
2264
+ /** Libellé lu par un lecteur d'écran s'il doit différer du libellé visible. */
2265
+ ariaLabel?: string;
2266
+ }
2267
+ /**
2268
+ * <cad-bottom-nav [(value)]="page" [items]="items" labels="always|selected|never" (changed)/>
2269
+ *
2270
+ * Barre de navigation basse : 3 à 5 destinations à portée de pouce, sur mobile uniquement.
2271
+ *
2272
+ * POURQUOI UNE LISTE PROPRE, DISTINCTE DU TIROIR — la tentation est de reprendre les premières
2273
+ * entrées de `cad-nav-drawer`. On ne le fait pas : une barre basse ne supporte pas plus de cinq
2274
+ * destinations, et surtout on ne met pas en avant les mêmes choses au pouce que dans un menu
2275
+ * complet. Les deux listes pointent volontiers les mêmes routes, mais elles sont écrites
2276
+ * séparément — l'implicite se paierait en surprises au premier ajout d'entrée.
2277
+ *
2278
+ * ACCESSIBILITÉ — la destination courante est marquée par une pastille pleine EN PLUS de la
2279
+ * couleur : la couleur seule disparaît pour une personne daltonienne. Les cibles font 44 px de
2280
+ * haut au minimum, et la barre réserve la zone sûre des téléphones à encoche
2281
+ * (`env(safe-area-inset-bottom)`), sans quoi la dernière rangée passe sous la barre d'accueil.
2282
+ */
2283
+ declare class CadBottomNavComponent {
2284
+ private readonly bp;
2285
+ readonly items: _angular_core.InputSignal<CadBottomNavItem[]>;
2286
+ /** Destination courante. Bidirectionnel. */
2287
+ readonly value: _angular_core.ModelSignal<string | null>;
2288
+ /** Quand afficher le libellé sous l'icône. */
2289
+ readonly labels: _angular_core.InputSignal<"always" | "never" | "selected">;
2290
+ /**
2291
+ * Au-delà, les destinations en trop ne sont PAS affichées : cinq est la limite tenable
2292
+ * en largeur, et tronquer silencieusement vaut mieux que rendre la barre illisible.
2293
+ * Prévoir une destination « Plus » qui ouvre le reste en feuille.
2294
+ */
2295
+ readonly maxItems: _angular_core.InputSignalWithTransform<number, unknown>;
2296
+ /** Seuil au-delà duquel la barre disparaît : elle n'a de sens que sur petit écran. */
2297
+ readonly breakpoint: _angular_core.InputSignal<CadBreakpoint>;
2298
+ /** Force l'affichage quel que soit le seuil — utile en démonstration. */
2299
+ readonly alwaysShow: _angular_core.InputSignalWithTransform<boolean, unknown>;
2300
+ readonly ariaLabel: _angular_core.InputSignal<string>;
2301
+ readonly changed: _angular_core.OutputEmitterRef<CadBottomNavItem>;
2302
+ readonly itemClick: _angular_core.OutputEmitterRef<{
2303
+ item: CadBottomNavItem;
2304
+ originalEvent: Event;
2305
+ }>;
2306
+ /** Les entrées au-delà de `maxItems` sont écartées, jamais compressées. */
2307
+ readonly shown: _angular_core.Signal<CadBottomNavItem[]>;
2308
+ readonly visible: _angular_core.Signal<boolean>;
2309
+ isActive(it: CadBottomNavItem): boolean;
2310
+ showLabel(it: CadBottomNavItem): boolean;
2311
+ /** « 99+ » plutôt qu'un nombre qui ferait déborder la pastille. */
2312
+ cap(badge: string | number | boolean): string;
2313
+ pick(it: CadBottomNavItem, ev: Event): void;
2314
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadBottomNavComponent, never>;
2315
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadBottomNavComponent, "cad-bottom-nav", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "maxItems": { "alias": "maxItems"; "required": false; "isSignal": true; }; "breakpoint": { "alias": "breakpoint"; "required": false; "isSignal": true; }; "alwaysShow": { "alias": "alwaysShow"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "changed": "changed"; "itemClick": "itemClick"; }, never, never, true, never>;
2316
+ }
2317
+
2318
+ /**
2319
+ * En-tête et pied sont des SLOTS, pas des gabarits : `<div cadNavDrawerFooter>` sur n'importe
2320
+ * quel élément, sans `<ng-template>` à écrire. Ces directives sont de simples marqueurs — elles
2321
+ * n'injectent surtout pas `TemplateRef`, qui n'existe que sur un `<ng-template>` et ferait
2322
+ * échouer l'injection sur un `<div>` (NG0201).
2323
+ */
2324
+ declare class CadNavDrawerHeaderDirective {
2325
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadNavDrawerHeaderDirective, never>;
2326
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CadNavDrawerHeaderDirective, "[cadNavDrawerHeader]", never, {}, {}, never, never, true, never>;
2327
+ }
2328
+ declare class CadNavDrawerFooterDirective {
2329
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadNavDrawerFooterDirective, never>;
2330
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<CadNavDrawerFooterDirective, "[cadNavDrawerFooter]", never, {}, {}, never, never, true, never>;
2331
+ }
2332
+ /** Entrée du tiroir. `section: true` en fait un intertitre, pas un lien. */
2333
+ interface CadNavDrawerItem {
2334
+ value?: string;
2335
+ label: string;
2336
+ icon?: string;
2337
+ routerLink?: string | unknown[];
2338
+ queryParams?: Record<string, unknown>;
2339
+ url?: string;
2340
+ target?: string;
2341
+ badge?: string | number;
2342
+ disabled?: boolean;
2343
+ /** Intertitre de regroupement : rendu comme un libellé, non cliquable. */
2344
+ section?: boolean;
2345
+ command?: (ev: {
2346
+ item: CadNavDrawerItem;
2347
+ originalEvent: Event;
2348
+ }) => void;
2349
+ ariaLabel?: string;
2350
+ }
2351
+ type CadNavDrawerMode = 'auto' | 'permanent' | 'temporary' | 'rail';
2352
+ /**
2353
+ * <cad-nav-drawer [items]="items" [(open)]="open" [(value)]="page" mode="auto" (itemClick)/>
2354
+ *
2355
+ * Menu principal de l'application : UN composant pour les trois états, pas deux à tenir en
2356
+ * parallèle. En `auto` (défaut) il est permanent en colonne au-dessus du seuil, et bascule
2357
+ * en tiroir par-dessus le contenu en dessous, ouvert au hamburger. `rail` n'affiche que les
2358
+ * icônes, le libellé passant en `title`.
2359
+ *
2360
+ * POURQUOI PAS `cad-drawer` — celui-ci est un panneau générique : il ne connaît ni items, ni
2361
+ * route active, ni sections, et surtout il est toujours temporaire. Le mode permanent n'est
2362
+ * pas une surcouche cosmétique : le tiroir occupe alors une colonne dans le flux et pousse le
2363
+ * contenu, au lieu de le recouvrir.
2364
+ *
2365
+ * LA LISTE EST DISTINCTE DE CELLE DE `cad-bottom-nav`, volontairement — voir la note qui s'y
2366
+ * trouve : on ne met pas en avant les mêmes destinations au pouce que dans un menu complet.
2367
+ */
2368
+ declare class CadNavDrawerComponent {
2369
+ private readonly bp;
2370
+ readonly items: _angular_core.InputSignal<CadNavDrawerItem[]>;
2371
+ /** Ouverture du tiroir. Sans effet en mode permanent, où le panneau est toujours là. */
2372
+ readonly open: _angular_core.ModelSignal<boolean>;
2373
+ /** Entrée courante, comparée à `item.value`. */
2374
+ readonly value: _angular_core.ModelSignal<string | null>;
2375
+ readonly mode: _angular_core.InputSignal<CadNavDrawerMode>;
2376
+ /** Seuil de bascule permanent → tiroir, en mode `auto`. */
2377
+ readonly breakpoint: _angular_core.InputSignal<CadBreakpoint>;
2378
+ readonly position: _angular_core.InputSignal<"left" | "right">;
2379
+ readonly title: _angular_core.InputSignal<string>;
2380
+ readonly icon: _angular_core.InputSignal<string>;
2381
+ readonly ariaLabel: _angular_core.InputSignal<string>;
2382
+ /** Referme le tiroir après un clic sur une entrée. Sans objet en permanent. */
2383
+ readonly closeOnNavigate: _angular_core.InputSignalWithTransform<boolean, unknown>;
2384
+ readonly closeOnEscape: _angular_core.InputSignalWithTransform<boolean, unknown>;
2385
+ /** Clic sur le voile. */
2386
+ readonly dismissableScrim: _angular_core.InputSignalWithTransform<boolean, unknown>;
2387
+ readonly opened: _angular_core.OutputEmitterRef<void>;
2388
+ readonly closed: _angular_core.OutputEmitterRef<void>;
2389
+ readonly itemClick: _angular_core.OutputEmitterRef<{
2390
+ item: CadNavDrawerItem;
2391
+ originalEvent: Event;
2392
+ }>;
2393
+ readonly changed: _angular_core.OutputEmitterRef<CadNavDrawerItem>;
2394
+ /** Présence des slots : sert à décider du repli sur l'en-tête par défaut et du cadre du pied. */
2395
+ readonly headerSlot: _angular_core.Signal<CadNavDrawerHeaderDirective | undefined>;
2396
+ readonly footerSlot: _angular_core.Signal<CadNavDrawerFooterDirective | undefined>;
2397
+ /** Mode effectif : `auto` se résout au seuil, les autres sont imposés. */
2398
+ readonly effective: _angular_core.Signal<"permanent" | "temporary" | "rail">;
2399
+ readonly temporary: _angular_core.Signal<boolean>;
2400
+ readonly rail: _angular_core.Signal<boolean>;
2401
+ private readonly wasOpen;
2402
+ constructor();
2403
+ isActive(it: CadNavDrawerItem): boolean;
2404
+ toggle(): void;
2405
+ show(): void;
2406
+ hide(): void;
2407
+ dismiss(): void;
2408
+ onEscape(): void;
2409
+ pick(it: CadNavDrawerItem, ev: Event): void;
2410
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadNavDrawerComponent, never>;
2411
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadNavDrawerComponent, "cad-nav-drawer", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "breakpoint": { "alias": "breakpoint"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "closeOnNavigate": { "alias": "closeOnNavigate"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "dismissableScrim": { "alias": "dismissableScrim"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "value": "valueChange"; "opened": "opened"; "closed": "closed"; "itemClick": "itemClick"; "changed": "changed"; }, ["headerSlot", "footerSlot"], ["[cadNavDrawerHeader]", "[cadNavDrawerFooter]"], true, never>;
2412
+ }
2413
+
2250
2414
  type CadSelectionMode = 'single' | 'multiple' | null;
2251
2415
  interface CadRowEvent<T> {
2252
2416
  row: T;
@@ -4643,6 +4807,80 @@ declare class CadSplitterComponent {
4643
4807
  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>;
4644
4808
  }
4645
4809
 
4810
+ /**
4811
+ * Ce que la coquille dit à ses enfants, pour DÉCIDER.
4812
+ *
4813
+ * Les enfants qui ont seulement besoin de SE PLACER n'ont pas à injecter ceci : ils lisent
4814
+ * les propriétés CSS (`--cad-shell-top` / `-bottom` / `-nav`). Un toast se pose au-dessus de
4815
+ * la barre basse avec `calc(16px + var(--cad-shell-bottom, 0px))`, sans rien importer — et
4816
+ * le repli à `0px` le laisse fonctionner hors coquille.
4817
+ */
4818
+ interface CadShellApi {
4819
+ /** Sous le seuil mobile. */
4820
+ readonly compact: Signal<boolean>;
4821
+ /** Hauteurs mesurées, en px (zones sûres comprises : elles sont dans le padding des barres). */
4822
+ readonly topHeight: Signal<number>;
4823
+ readonly bottomHeight: Signal<number>;
4824
+ readonly navWidth: Signal<number>;
4825
+ /** Un enfant demande l'ouverture du menu sans connaître le composant qui le porte. */
4826
+ openNav(): void;
4827
+ }
4828
+ declare const CAD_SHELL: InjectionToken<CadShellApi>;
4829
+ /**
4830
+ * Coquille d'application : barre haute, menu, contenu, barre basse.
4831
+ *
4832
+ * POURQUOI ELLE EXISTE — la bibliothèque avait `cad-bottom-nav`, `cad-menubar`,
4833
+ * `cad-nav-drawer` et `cad-sidebar`, mais aucune coquille. Chaque application refaisait donc
4834
+ * sa mise en page, et retombait sur le même défaut, signalé par SZU le 21/08/2026 : la barre
4835
+ * du haut « défile au lieu de rester en place ». Ce n'était pas la barre qui bougeait, c'était
4836
+ * le DOCUMENT qui défilait.
4837
+ *
4838
+ * LE PARTI PRIS — on ne fixe pas les barres une par une (`position: fixed`), on rend la
4839
+ * coquille INCAPABLE de défiler : hauteur exacte du viewport, seul le contenu défile. Les
4840
+ * barres restent en place parce qu'elles ne peuvent pas bouger. Rien à réserver dans le
4841
+ * contenu, aucune zone sûre dupliquée, un seul seuil. `fixed` reste une porte de sortie pour
4842
+ * un cas particulier, pas le mécanisme.
4843
+ *
4844
+ * AGENCEMENT — barre haute sur TOUTE la largeur, menu dessous : c'est celui du template
4845
+ * CEREMA (`_topbar.scss` : `position: fixed; top: 0; width: 100%`), et une bibliothèque ne
4846
+ * doit pas imposer l'inverse de ce que font les applications maison.
4847
+ *
4848
+ * ELLE MESURE LE MENU, ELLE NE LE POSSÈDE PAS (arbitrage SZU : « le tiroir c'est le composant
4849
+ * menu lui-même »). Elle fonctionne donc sans menu (`--cad-shell-nav: 0`), n'exige aucun
4850
+ * enfant, et `openNav()` se contente d'émettre `navRequested` — c'est l'hôte qui ouvre son
4851
+ * `cad-nav-drawer`. Aucun couplage dans un sens ni dans l'autre.
4852
+ *
4853
+ * ```html
4854
+ * <cad-app-shell (navRequested)="menu.set(true)">
4855
+ * <header cadShellBar>…</header>
4856
+ * <cad-nav-drawer cadShellNav [items]="menu" [(open)]="ouvert"/>
4857
+ * <router-outlet />
4858
+ * <cad-bottom-nav cadShellBottom [items]="dest" [(value)]="page"/>
4859
+ * </cad-app-shell>
4860
+ * ```
4861
+ */
4862
+ declare class CadAppShellComponent implements CadShellApi {
4863
+ private readonly bp;
4864
+ /** Surcharge locale du seuil. Par defaut : celui de la bibliotheque (CAD_MOBILE_BREAKPOINT). */
4865
+ readonly compactAt: _angular_core.InputSignal<number | null>;
4866
+ /** Un enfant a demande le menu (bouton hamburger de la barre, par exemple). */
4867
+ readonly navRequested: _angular_core.OutputEmitterRef<void>;
4868
+ private readonly barRef;
4869
+ private readonly navRef;
4870
+ private readonly bottomRef;
4871
+ private readonly _top;
4872
+ private readonly _bottom;
4873
+ private readonly _nav;
4874
+ readonly topHeight: Signal<number>;
4875
+ readonly bottomHeight: Signal<number>;
4876
+ readonly navWidth: Signal<number>;
4877
+ readonly compact: Signal<boolean>;
4878
+ constructor();
4879
+ openNav(): void;
4880
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CadAppShellComponent, never>;
4881
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadAppShellComponent, "cad-app-shell", never, { "compactAt": { "alias": "compactAt"; "required": false; "isSignal": true; }; }, { "navRequested": "navRequested"; }, never, ["[cadShellBar]", "[cadShellNav]", "*", "[cadShellBottom]"], true, never>;
4882
+ }
4883
+
4646
4884
  /**
4647
4885
  * URL optionnelle de la feuille de style MapLibre à injecter dans <head> (ex. `/assets/maplibre-gl.css`).
4648
4886
  * Sans token, cadriciel-ui embarque un sous-ensemble minimal (positionnement canvas/contrôles/popup/marqueurs) et
@@ -5033,6 +5271,12 @@ declare class CadMapComponent {
5033
5271
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadMapComponent, "cad-map", never, { "chrome": { "alias": "chrome"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "basemap": { "alias": "basemap"; "required": false; "isSignal": true; }; "basemaps": { "alias": "basemaps"; "required": false; "isSignal": true; }; "overlays": { "alias": "overlays"; "required": false; "isSignal": true; }; "overlayOpacity": { "alias": "overlayOpacity"; "required": false; "isSignal": true; }; "center": { "alias": "center"; "required": false; "isSignal": true; }; "zoom": { "alias": "zoom"; "required": false; "isSignal": true; }; "bearing": { "alias": "bearing"; "required": false; "isSignal": true; }; "pitch": { "alias": "pitch"; "required": false; "isSignal": true; }; "bounds": { "alias": "bounds"; "required": false; "isSignal": true; }; "maxBounds": { "alias": "maxBounds"; "required": false; "isSignal": true; }; "minZoom": { "alias": "minZoom"; "required": false; "isSignal": true; }; "maxZoom": { "alias": "maxZoom"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "controls": { "alias": "controls"; "required": false; "isSignal": true; }; "controlPosition": { "alias": "controlPosition"; "required": false; "isSignal": true; }; "scalePosition": { "alias": "scalePosition"; "required": false; "isSignal": true; }; "followTheme": { "alias": "followTheme"; "required": false; "isSignal": true; }; "cooperativeGestures": { "alias": "cooperativeGestures"; "required": false; "isSignal": true; }; "hash": { "alias": "hash"; "required": false; "isSignal": true; }; "screenshotable": { "alias": "screenshotable"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "syncWith": { "alias": "syncWith"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, { "basemap": "basemapChange"; "overlays": "overlaysChange"; "center": "centerChange"; "zoom": "zoomChange"; "bearing": "bearingChange"; "pitch": "pitchChange"; "ready": "ready"; "moveEnd": "moveEnd"; "move": "move"; "mapClick": "mapClick"; "error": "error"; "styleLoaded": "styleLoaded"; "drawChange": "drawChange"; "layerImport": "layerImport"; }, ["children"], ["[cadMapTopLeft]", "[cadMapTopRight]", "[cadMapBottomLeft]", "[cadMapBottomRight]", "*"], true, never>;
5034
5272
  }
5035
5273
 
5274
+ /**
5275
+ * Une carte MapLibre détruite garde son objet mais perd son `style`. Tout appel qui le
5276
+ * traverse — `getLayer`, `getSource`, `off` — lève alors un TypeError. C'est le seul signe
5277
+ * fiable qu'on puisse encore lui parler.
5278
+ */
5279
+ declare function cadMapEstVivante(map: unknown): boolean;
5036
5280
  type CadMapLayerType = 'geojson' | 'wms' | 'wmts' | 'raster' | 'vector';
5037
5281
  interface CadFeatureEvent {
5038
5282
  feature: ML.MapGeoJSONFeature;
@@ -5105,6 +5349,26 @@ declare class CadMapLayerComponent implements CadMapChild {
5105
5349
  bounds(): CadBounds | null;
5106
5350
  constructor();
5107
5351
  attach(map: ML.Map, ml: MaplibreModule): void;
5352
+ /**
5353
+ * Chemin de DÉMONTAGE : il ne doit JAMAIS lever.
5354
+ *
5355
+ * Bug signalé par SZU le 21/08/2026 — « au clic sur un élément de menu, parfois, le
5356
+ * contenu est blanc, puis quelques secondes plus tard le menu redevient fonctionnel et
5357
+ * la page est la bonne ». En quittant une page portant une carte :
5358
+ *
5359
+ * TypeError: Cannot read properties of undefined (reading 'getLayer')
5360
+ * at removeAll -> detach -> ... -> ComponentRef.destroy
5361
+ *
5362
+ * `detach` était appelé DEUX fois à la destruction : une fois par `unregisterChild`
5363
+ * (protégé côté cad-map) et une fois directement, sans garde. Le second passage
5364
+ * s'exécutait sur une carte déjà démontée par MapLibre — `map.style` vaut alors
5365
+ * `undefined` et `map.getLayer()` lève. Une exception pendant la destruction interrompt
5366
+ * le démontage de la vue : d'où l'écran blanc et le menu figé.
5367
+ *
5368
+ * Deux verrous, parce qu'un seul ne suffit pas : on ne touche à la carte que si elle est
5369
+ * encore vivante, ET on avale ce qui pourrait malgré tout échapper. Un nettoyage qui lève
5370
+ * est toujours pire que le déchet qu'il aurait laissé.
5371
+ */
5108
5372
  detach(map: ML.Map): void;
5109
5373
  private removeAll;
5110
5374
  private beforeId;
@@ -6323,5 +6587,5 @@ declare class CadChartComponent {
6323
6587
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CadChartComponent, "cad-chart", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "plugins": { "alias": "plugins"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "palette": { "alias": "palette"; "required": false; "isSignal": true; }; "themed": { "alias": "themed"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "accessibleTable": { "alias": "accessibleTable"; "required": false; "isSignal": true; }; }, { "chartClick": "chartClick"; "chartHover": "chartHover"; "ready": "ready"; "error": "error"; }, never, never, true, never>;
6324
6588
  }
6325
6589
 
6326
- export { 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_SELECT_POSITIONS, CAD_SELECT_TRIGGER_STYLES, CAD_SHEET_DATA, CAD_TOUCH_DENSITY, CadAccordionComponent, CadAccordionPanelComponent, CadAvatarComponent, CadAvatarGroupComponent, CadBadgeComponent, CadBadgeDirective, CadBlockDirective, CadBlockOverlayComponent, CadBlockUiComponent, CadBreadcrumbComponent, CadBreadcrumbItemDirective, CadBreakpointService, CadButtonComponent, CadButtonGroupComponent, 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, 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, CadTimelineComponent, CadTimelineContentDirective, CadTimelineMarkerDirective, CadTimelineOppositeDirective, CadToastComponent, CadToastItemDirective, CadToastService, CadToggleButtonComponent, CadTooltipComponent, CadTooltipDirective, CadTreeAdapter, CadTreeComponent, CadTreeNodeDirective, CadTreeselectComponent, CadUploadComponent, CadUploadContentDirective, CadUploadEmptyDirective, CadUploadItemDirective, CadValueAccessor, MAPLIBRE_MIN_CSS, addDays, addMonths, addYears, cadAggregate, cadApplyColumnOrder, cadApplyMask, cadArea, cadAutosizeWidth, cadBasemapThumbnail, cadBoundsOf, cadCategories, cadCentroid, cadColorExpr, cadCompare, cadCurrentOperator, cadDefaultMatchMode, cadDistance, cadDownloadCsv, cadFilterData, cadFilterKindOf, cadFilterOperators, cadFilterRows, cadFmtArea, cadFmtLength, cadFormatCell, cadFormatColor, cadFormatSize, cadGap, cadGeoJSONStats, cadGeometryKinds, cadHeaderMenuItems, cadHighlightJson, cadHslToRgb, cadHsvToRgb, cadId, cadIsGroupKey, cadJsonErrorPos, cadLegendFromStyle, cadLength, cadMapLayerOf, cadMapLayersOf, cadMatch, cadMoveColumn, cadMoveItems, cadNormalize, cadNormalizeOptions, cadNumberExpr, cadPadBounds, cadParseColor, cadParseResponsive, cadPropsTable, cadResolve, cadResolveResponsive, cadResponsive, cadRgbToHsl, cadRgbToHsv, cadRingArea, cadRowKey, cadRowPredicate, cadSameValue, cadSortData, cadStartResize, cadStyleToExpressions, cadUnmask, cadValidateGeoJSON, cadValueForOperator, cadWriteField, compareDay, daysInMonth, endOfMonth, ensureMaplibreCss, formatDate, isBetweenDay, isSameDay, isSameMonth, isValidDate, isoOf, isoWeek, loadChartJs, loadMaplibre, monthNames, pad2, parseIso, parseWithFormat, provideCadIcons, startOfDay, startOfMonth, toDate, weekdayNames };
6327
- export type { CadAggregate, CadAggregateFn, CadAggregates, CadBadgeSeverity, CadBasemap, CadBasemapKind, CadBounds, CadBreadcrumbItem, CadBreakpoint, 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, CadEditCompleteEvent, CadEditEvent, CadEditMode, CadEditorContext, 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, CadNodeEvent, CadNumberSpec, CadOptionItem, CadOrgNode, CadOverlayHandle, CadPageEvent, CadPaintSet, CadPinnedColumns, CadPlacement, CadPriorityBreakpoints, CadProgressSeverity, CadRgba, CadRowEditEvent, CadRowEditState, CadRowEvent, CadRowReorderEvent, CadSegmentOption, CadSelectItemContext, CadSelectionMode, CadSelectionPropagation, CadSeverity, CadSheetConfig, CadSheetHeight, CadSize, CadSliderMark, CadSliderSeverity, CadSliderValue, CadSortEvent, CadSortMeta, CadSortOrder, CadStepState, CadTableEditContext, CadTableEditUiContext, CadTablePanelTab, CadTableResponsiveMode, CadTableSelectionContext, CadTagSeverity, CadTimelineAlign, CadToastAction, CadToastMessage, CadToastPosition, CadToastSeverity, CadTreeAdapterOptions, CadTreeNode, CadTreeNodeEvent, CadUploadFile, CadUploadHandlerEvent, CadUploadStatus, CadVariant, CadVirtualRange, MLExpression, MaplibreModule };
6590
+ export { 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_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, 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, CadTimelineComponent, CadTimelineContentDirective, CadTimelineMarkerDirective, CadTimelineOppositeDirective, CadToastComponent, CadToastItemDirective, CadToastService, CadToggleButtonComponent, CadTooltipComponent, CadTooltipDirective, CadTreeAdapter, CadTreeComponent, CadTreeNodeDirective, CadTreeselectComponent, CadUploadComponent, CadUploadContentDirective, CadUploadEmptyDirective, CadUploadItemDirective, CadValueAccessor, MAPLIBRE_MIN_CSS, addDays, addMonths, addYears, cadAggregate, cadApplyColumnOrder, cadApplyMask, cadArea, cadAutosizeWidth, cadBasemapThumbnail, cadBoundsOf, cadCategories, cadCentroid, cadColorExpr, cadCompare, cadCurrentOperator, cadDefaultMatchMode, cadDistance, cadDownloadCsv, cadFilterData, cadFilterKindOf, cadFilterOperators, cadFilterRows, cadFmtArea, cadFmtLength, cadFormatCell, cadFormatColor, cadFormatSize, cadGap, cadGeoJSONStats, cadGeometryKinds, cadHeaderMenuItems, cadHighlightJson, cadHslToRgb, cadHsvToRgb, cadId, cadIsGroupKey, cadJsonErrorPos, cadLegendFromStyle, cadLength, cadMapEstVivante, cadMapLayerOf, cadMapLayersOf, cadMatch, cadMoveColumn, cadMoveItems, cadNormalize, cadNormalizeOptions, cadNumberExpr, cadPadBounds, cadParseColor, cadParseResponsive, cadPropsTable, cadResolve, cadResolveResponsive, cadResponsive, cadRgbToHsl, cadRgbToHsv, cadRingArea, cadRowKey, cadRowPredicate, cadSameValue, cadSortData, cadStartResize, cadStyleToExpressions, cadUnmask, cadValidateGeoJSON, cadValueForOperator, cadWriteField, compareDay, daysInMonth, endOfMonth, ensureMaplibreCss, formatDate, isBetweenDay, isSameDay, isSameMonth, isValidDate, isoOf, isoWeek, loadChartJs, loadMaplibre, monthNames, pad2, parseIso, parseWithFormat, provideCadIcons, startOfDay, startOfMonth, toDate, weekdayNames };
6591
+ export type { CadAggregate, CadAggregateFn, CadAggregates, CadBadgeSeverity, CadBasemap, CadBasemapKind, CadBottomNavItem, CadBounds, CadBreadcrumbItem, CadBreakpoint, 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, CadEditCompleteEvent, CadEditEvent, CadEditMode, CadEditorContext, 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, CadNavDrawerItem, CadNavDrawerMode, CadNodeEvent, CadNumberSpec, CadOptionItem, CadOrgNode, CadOverlayHandle, CadPageEvent, CadPaintSet, CadPinnedColumns, CadPlacement, CadPriorityBreakpoints, CadProgressSeverity, CadRgba, CadRowEditEvent, CadRowEditState, CadRowEvent, CadRowReorderEvent, CadSegmentOption, CadSelectItemContext, CadSelectionMode, CadSelectionPropagation, CadSeverity, CadSheetConfig, CadSheetHeight, CadShellApi, CadSize, CadSliderMark, CadSliderSeverity, CadSliderValue, CadSortEvent, CadSortMeta, CadSortOrder, CadStepState, CadTableEditContext, CadTableEditUiContext, CadTablePanelTab, CadTableResponsiveMode, CadTableSelectionContext, CadTagSeverity, CadTimelineAlign, CadToastAction, CadToastMessage, CadToastPosition, CadToastSeverity, CadTreeAdapterOptions, CadTreeNode, CadTreeNodeEvent, CadUploadFile, CadUploadHandlerEvent, CadUploadStatus, CadVariant, CadVirtualRange, MLExpression, MaplibreModule };