@cadriciel/ui 0.3.0 → 0.4.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.
@@ -11,7 +11,7 @@ import { PortalModule, ComponentPortal, TemplatePortal, Portal } from '@angular/
11
11
  import * as i2 from '@angular/cdk/a11y';
12
12
  import { A11yModule, ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';
13
13
  import { Subject, isObservable } from 'rxjs';
14
- import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle, CdkDragPlaceholder, transferArrayItem } from '@angular/cdk/drag-drop';
14
+ import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle, CdkDragPlaceholder, transferArrayItem, CdkDropListGroup } from '@angular/cdk/drag-drop';
15
15
  import { RouterLink, Router, RouterLinkActive } from '@angular/router';
16
16
  import { HttpClient, HttpHeaders, HttpEventType } from '@angular/common/http';
17
17
 
@@ -1647,7 +1647,7 @@ class CadColorpickerComponent extends CadValueAccessor {
1647
1647
  </div>
1648
1648
  }
1649
1649
  </ng-template>
1650
- `, isInline: true, styles: [":host{display:inline-flex;width:100%;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-inline){width:auto}.cp-trigger{display:flex;align-items:center;gap:8px;width:100%;height:var(--cad-control-h);padding:0 8px;box-sizing:border-box;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;color:inherit;font:inherit;text-align:left;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}:host(.size-sm) .cp-trigger{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm)}:host(.size-lg) .cp-trigger{height:var(--cad-control-h-lg)}.cp-trigger:focus-visible,:host(.is-open) .cp-trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring);outline:none}:host(.is-invalid) .cp-trigger{border-color:var(--cad-danger)}:host(.is-disabled) .cp-trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.cp-swatch{position:relative;width:22px;height:22px;border-radius:6px;border:1px solid var(--cad-border-strong);flex:none;overflow:hidden;background-image:repeating-conic-gradient(var(--cad-elevated) 0 25%,transparent 0 50%);background-size:8px 8px}.cp-swatch i{position:absolute;inset:0;background:inherit}.cp-val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm)}.cp-val.is-ph{color:var(--cad-fg-muted);font-family:var(--cad-font)}.cp-clear{display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted)}.cp-clear:hover{background:var(--cad-hover);color:var(--cad-fg)}.cp-chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}:host(.is-open) .cp-chev{transform:rotate(180deg)}.cp-panel{width:260px;padding:10px;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);display:grid;gap:10px}.cp-panel.is-inline{box-shadow:none}.cp-sv{position:relative;height:150px;border-radius:8px;cursor:crosshair;touch-action:none;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,transparent)}.cp-sv:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.cp-sv__thumb{position:absolute;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #0006;pointer-events:none}.cp-bars{display:flex;gap:8px;align-items:center}.cp-eye{all:unset;display:grid;place-items:center;width:28px;height:28px;border-radius:6px;border:1px solid var(--cad-border);color:var(--cad-fg-secondary);cursor:pointer}.cp-eye:hover{background:var(--cad-hover)}.cp-sliders{flex:1;display:grid;gap:8px}.cp-bar{position:relative;height:12px;border-radius:6px;cursor:pointer;touch-action:none}.cp-bar:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.cp-bar--hue{background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.cp-bar--alpha{background-image:repeating-conic-gradient(var(--cad-elevated) 0 25%,transparent 0 50%);background-size:8px 8px}.cp-bar__grad{position:absolute;inset:0;border-radius:6px}.cp-bar__thumb{position:absolute;top:50%;width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #00000059;pointer-events:none}.cp-fields{display:grid;grid-template-columns:2fr repeat(4,1fr);gap:6px}.cp-fields label{display:grid;gap:2px;font:600 9.5px var(--cad-font-mono);color:var(--cad-fg-muted);text-transform:uppercase}.cp-fields input{width:100%;box-sizing:border-box;height:26px;padding:0 6px;border:1px solid var(--cad-input-border);border-radius:5px;background:var(--cad-input-bg);color:var(--cad-fg);font:11.5px var(--cad-font-mono);outline:none}.cp-fields input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.cp-fields input[type=number]{-moz-appearance:textfield}.cp-fields input::-webkit-outer-spin-button,.cp-fields input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.cp-presets{display:grid;grid-template-columns:repeat(8,1fr);gap:6px}.cp-presets button{aspect-ratio:1;border-radius:6px;border:1px solid var(--cad-border-strong);cursor:pointer;padding:0}.cp-presets button:hover{transform:scale(1.1)}.cp-presets button.is-on{outline:2px solid var(--cad-accent);outline-offset:1px}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1650
+ `, isInline: true, styles: [":host{display:inline-flex;width:100%;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-inline){width:auto}.cp-trigger{display:flex;align-items:center;gap:8px;width:100%;height:var(--cad-control-h);padding:0 8px;box-sizing:border-box;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;color:inherit;font:inherit;text-align:left;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}:host(.size-sm) .cp-trigger{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm)}:host(.size-lg) .cp-trigger{height:var(--cad-control-h-lg)}.cp-trigger:focus-visible,:host(.is-open) .cp-trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring);outline:none}:host(.is-invalid) .cp-trigger{border-color:var(--cad-danger)}:host(.is-disabled) .cp-trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.cp-swatch{position:relative;width:22px;height:22px;border-radius:6px;border:1px solid var(--cad-border-strong);flex:none;overflow:hidden;background-image:repeating-conic-gradient(var(--cad-elevated) 0 25%,transparent 0 50%);background-size:8px 8px}.cp-swatch i{position:absolute;inset:0;background:inherit}.cp-val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm)}.cp-val.is-ph{color:var(--cad-fg-muted);font-family:var(--cad-font)}.cp-clear{display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted)}.cp-clear:hover{background:var(--cad-hover);color:var(--cad-fg)}.cp-chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}:host(.is-open) .cp-chev{transform:rotate(180deg)}.cp-panel{width:260px;padding:10px;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);display:grid;gap:10px}.cp-panel.is-inline{box-shadow:none}.cp-sv{position:relative;height:150px;border-radius:8px;cursor:crosshair;touch-action:none;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,transparent)}.cp-sv:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.cp-sv__thumb{position:absolute;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #0006;pointer-events:none}.cp-bars{display:flex;gap:8px;align-items:center}.cp-eye{all:unset;display:grid;place-items:center;width:28px;height:28px;border-radius:6px;border:1px solid var(--cad-border);color:var(--cad-fg-secondary);cursor:pointer}.cp-eye:hover{background:var(--cad-hover)}.cp-sliders{flex:1;display:grid;gap:8px}.cp-bar{position:relative;height:12px;border-radius:6px;cursor:pointer;touch-action:none}.cp-bar:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.cp-bar--hue{background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.cp-bar--alpha{background-image:repeating-conic-gradient(var(--cad-elevated) 0 25%,transparent 0 50%);background-size:8px 8px}.cp-bar__grad{position:absolute;inset:0;border-radius:6px}.cp-bar__thumb{position:absolute;top:50%;width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #00000059;pointer-events:none}.cp-fields{display:grid;grid-template-columns:2fr repeat(4,1fr);gap:6px}.cp-fields label{display:grid;gap:2px;font:600 9.5px var(--cad-font-mono);color:var(--cad-fg-muted);text-transform:uppercase}.cp-fields input{width:100%;box-sizing:border-box;height:26px;padding:0 6px;border:1px solid var(--cad-input-border);border-radius:5px;background:var(--cad-input-bg);color:var(--cad-fg);font:11.5px var(--cad-font-mono);outline:none}.cp-fields input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.cp-fields input[type=number]{-moz-appearance:textfield}.cp-fields input::-webkit-outer-spin-button,.cp-fields input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.cp-presets{display:grid;grid-template-columns:repeat(8,1fr);gap:6px}.cp-presets button{aspect-ratio:1;border-radius:6px;border:1px solid var(--cad-border-strong);cursor:pointer;padding:0}.cp-presets button:hover{transform:scale(1.1)}.cp-presets button.is-on{outline:2px solid var(--cad-accent);outline-offset:1px}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1651
1651
  }
1652
1652
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadColorpickerComponent, decorators: [{
1653
1653
  type: Component,
@@ -1687,7 +1687,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
1687
1687
  </div>
1688
1688
  }
1689
1689
  </ng-template>
1690
- `, imports: [OverlayModule, CadIconComponent, NgTemplateOutlet], styles: [":host{display:inline-flex;width:100%;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-inline){width:auto}.cp-trigger{display:flex;align-items:center;gap:8px;width:100%;height:var(--cad-control-h);padding:0 8px;box-sizing:border-box;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;color:inherit;font:inherit;text-align:left;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}:host(.size-sm) .cp-trigger{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm)}:host(.size-lg) .cp-trigger{height:var(--cad-control-h-lg)}.cp-trigger:focus-visible,:host(.is-open) .cp-trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring);outline:none}:host(.is-invalid) .cp-trigger{border-color:var(--cad-danger)}:host(.is-disabled) .cp-trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.cp-swatch{position:relative;width:22px;height:22px;border-radius:6px;border:1px solid var(--cad-border-strong);flex:none;overflow:hidden;background-image:repeating-conic-gradient(var(--cad-elevated) 0 25%,transparent 0 50%);background-size:8px 8px}.cp-swatch i{position:absolute;inset:0;background:inherit}.cp-val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm)}.cp-val.is-ph{color:var(--cad-fg-muted);font-family:var(--cad-font)}.cp-clear{display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted)}.cp-clear:hover{background:var(--cad-hover);color:var(--cad-fg)}.cp-chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}:host(.is-open) .cp-chev{transform:rotate(180deg)}.cp-panel{width:260px;padding:10px;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);display:grid;gap:10px}.cp-panel.is-inline{box-shadow:none}.cp-sv{position:relative;height:150px;border-radius:8px;cursor:crosshair;touch-action:none;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,transparent)}.cp-sv:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.cp-sv__thumb{position:absolute;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #0006;pointer-events:none}.cp-bars{display:flex;gap:8px;align-items:center}.cp-eye{all:unset;display:grid;place-items:center;width:28px;height:28px;border-radius:6px;border:1px solid var(--cad-border);color:var(--cad-fg-secondary);cursor:pointer}.cp-eye:hover{background:var(--cad-hover)}.cp-sliders{flex:1;display:grid;gap:8px}.cp-bar{position:relative;height:12px;border-radius:6px;cursor:pointer;touch-action:none}.cp-bar:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.cp-bar--hue{background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.cp-bar--alpha{background-image:repeating-conic-gradient(var(--cad-elevated) 0 25%,transparent 0 50%);background-size:8px 8px}.cp-bar__grad{position:absolute;inset:0;border-radius:6px}.cp-bar__thumb{position:absolute;top:50%;width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #00000059;pointer-events:none}.cp-fields{display:grid;grid-template-columns:2fr repeat(4,1fr);gap:6px}.cp-fields label{display:grid;gap:2px;font:600 9.5px var(--cad-font-mono);color:var(--cad-fg-muted);text-transform:uppercase}.cp-fields input{width:100%;box-sizing:border-box;height:26px;padding:0 6px;border:1px solid var(--cad-input-border);border-radius:5px;background:var(--cad-input-bg);color:var(--cad-fg);font:11.5px var(--cad-font-mono);outline:none}.cp-fields input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.cp-fields input[type=number]{-moz-appearance:textfield}.cp-fields input::-webkit-outer-spin-button,.cp-fields input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.cp-presets{display:grid;grid-template-columns:repeat(8,1fr);gap:6px}.cp-presets button{aspect-ratio:1;border-radius:6px;border:1px solid var(--cad-border-strong);cursor:pointer;padding:0}.cp-presets button:hover{transform:scale(1.1)}.cp-presets button.is-on{outline:2px solid var(--cad-accent);outline-offset:1px}\n"] }]
1690
+ `, imports: [OverlayModule, CadIconComponent, NgTemplateOutlet], styles: [":host{display:inline-flex;width:100%;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-inline){width:auto}.cp-trigger{display:flex;align-items:center;gap:8px;width:100%;height:var(--cad-control-h);padding:0 8px;box-sizing:border-box;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;color:inherit;font:inherit;text-align:left;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}:host(.size-sm) .cp-trigger{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm)}:host(.size-lg) .cp-trigger{height:var(--cad-control-h-lg)}.cp-trigger:focus-visible,:host(.is-open) .cp-trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring);outline:none}:host(.is-invalid) .cp-trigger{border-color:var(--cad-danger)}:host(.is-disabled) .cp-trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.cp-swatch{position:relative;width:22px;height:22px;border-radius:6px;border:1px solid var(--cad-border-strong);flex:none;overflow:hidden;background-image:repeating-conic-gradient(var(--cad-elevated) 0 25%,transparent 0 50%);background-size:8px 8px}.cp-swatch i{position:absolute;inset:0;background:inherit}.cp-val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm)}.cp-val.is-ph{color:var(--cad-fg-muted);font-family:var(--cad-font)}.cp-clear{display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted)}.cp-clear:hover{background:var(--cad-hover);color:var(--cad-fg)}.cp-chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}:host(.is-open) .cp-chev{transform:rotate(180deg)}.cp-panel{width:260px;padding:10px;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);display:grid;gap:10px}.cp-panel.is-inline{box-shadow:none}.cp-sv{position:relative;height:150px;border-radius:8px;cursor:crosshair;touch-action:none;background-image:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,transparent)}.cp-sv:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.cp-sv__thumb{position:absolute;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #0006;pointer-events:none}.cp-bars{display:flex;gap:8px;align-items:center}.cp-eye{all:unset;display:grid;place-items:center;width:28px;height:28px;border-radius:6px;border:1px solid var(--cad-border);color:var(--cad-fg-secondary);cursor:pointer}.cp-eye:hover{background:var(--cad-hover)}.cp-sliders{flex:1;display:grid;gap:8px}.cp-bar{position:relative;height:12px;border-radius:6px;cursor:pointer;touch-action:none}.cp-bar:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.cp-bar--hue{background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.cp-bar--alpha{background-image:repeating-conic-gradient(var(--cad-elevated) 0 25%,transparent 0 50%);background-size:8px 8px}.cp-bar__grad{position:absolute;inset:0;border-radius:6px}.cp-bar__thumb{position:absolute;top:50%;width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px #00000059;pointer-events:none}.cp-fields{display:grid;grid-template-columns:2fr repeat(4,1fr);gap:6px}.cp-fields label{display:grid;gap:2px;font:600 9.5px var(--cad-font-mono);color:var(--cad-fg-muted);text-transform:uppercase}.cp-fields input{width:100%;box-sizing:border-box;height:26px;padding:0 6px;border:1px solid var(--cad-input-border);border-radius:5px;background:var(--cad-input-bg);color:var(--cad-fg);font:11.5px var(--cad-font-mono);outline:none}.cp-fields input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.cp-fields input[type=number]{-moz-appearance:textfield}.cp-fields input::-webkit-outer-spin-button,.cp-fields input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.cp-presets{display:grid;grid-template-columns:repeat(8,1fr);gap:6px}.cp-presets button{aspect-ratio:1;border-radius:6px;border:1px solid var(--cad-border-strong);cursor:pointer;padding:0}.cp-presets button:hover{transform:scale(1.1)}.cp-presets button.is-on{outline:2px solid var(--cad-accent);outline-offset:1px}\n"] }]
1691
1691
  }], propDecorators: { format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], alpha: [{ type: i0.Input, args: [{ isSignal: true, alias: "alpha", required: false }] }], inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], svEl: [{ type: i0.ViewChild, args: ['sv', { isSignal: true }] }], hueEl: [{ type: i0.ViewChild, args: ['hue', { isSignal: true }] }], alpEl: [{ type: i0.ViewChild, args: ['alp', { isSignal: true }] }] } });
1692
1692
 
1693
1693
  /**
@@ -2542,7 +2542,7 @@ class CadSheetContainerComponent {
2542
2542
  <footer class="cad-sheet__footer"><ng-container *ngTemplateOutlet="config().footer!" /></footer>
2543
2543
  }
2544
2544
  </div>
2545
- `, isInline: true, styles: [".cad-overlay-pane.cad-sheet-pane{width:100%;max-width:100%}.cad-sheet-container{display:flex;flex-direction:column;width:100%;max-height:92dvh;outline:none;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);transform:translateY(100%);transition:transform .2s var(--cad-ease);will-change:transform}.cad-sheet-container.is-open{transform:none}.cad-sheet-container.is-dragging{transition:none}.cad-sheet-container.h-half{height:50dvh}.cad-sheet-container.h-full{height:92dvh}.cad-sheet-container.h-css{height:var(--cad-sheet-h)}.cad-sheet{display:flex;flex-direction:column;flex:1;min-height:0;background:var(--cad-overlay);border:1px solid var(--cad-border);border-bottom:0;border-radius:16px 16px 0 0;box-shadow:0 -8px 32px #0000002e;overflow:hidden;padding-bottom:env(safe-area-inset-bottom)}.cad-sheet__grip{display:flex;justify-content:center;padding:8px 0 4px;cursor:grab;touch-action:none;flex:none}.cad-sheet__handle{width:36px;height:4px;border-radius:2px;background:var(--cad-border-strong)}.cad-sheet__header{display:flex;align-items:center;gap:8px;padding:6px 16px 10px;flex:none;touch-action:none}.cad-sheet__grip+.cad-sheet__header{padding-top:2px}.cad-sheet__title{margin:0;font-size:14.5px;font-weight:600;color:var(--cad-fg);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cad-sheet__close{display:grid;place-items:center;width:32px;height:32px;border:0;border-radius:var(--cad-radius-sm);background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:0;margin-right:-6px}.cad-sheet__close:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-sheet__close:focus-visible{outline:2px solid var(--cad-ring);outline-offset:1px}.cad-sheet__body{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.cad-sheet__footer{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:10px 16px;border-top:1px solid var(--cad-border);background:var(--cad-bg-subtle);flex:none}.cad-sheet-container .cad-optlist{max-height:none!important;padding:6px 8px}.cad-sheet-container .cad-optlist__opt{min-height:44px;padding:10px 12px;box-sizing:border-box;font-size:var(--cad-font-size-lg)}.cad-sheet-container .cad-optlist__group{padding:12px 12px 4px}.cad-sheet-container .cad-select__panel,.cad-sheet-container .cad-multiselect__panel{border:0;box-shadow:none;border-radius:0;min-width:100%!important;background:transparent}.cad-sheet-container .cad-select__search,.cad-sheet-container .cad-multiselect__head{padding:8px 16px}.cad-sheet-container .cad-select__search input,.cad-sheet-container .cad-multiselect__head input{font-size:var(--cad-font-size-lg);height:32px}.cad-sheet-container .cad-dp__panel{border:0;box-shadow:none;border-radius:0;width:100%;box-sizing:border-box;padding:4px 12px 12px;background:transparent}.cad-sheet-container .cad-dp__grid{width:100%}.cad-sheet-container .cad-dp__day{width:40px;height:40px;font-size:var(--cad-font-size)}.cad-sheet-container .cad-dp__row{justify-content:space-between}.cad-sheet-container .cad-menu{border:0;box-shadow:none;border-radius:0;min-width:100%!important;padding:6px 8px}.cad-sheet-container .cad-menu__item{min-height:44px;padding:10px 12px;box-sizing:border-box;font-size:var(--cad-font-size-lg);white-space:normal}.cad-sheet-container .cad-menu--sub{position:static;border:0;box-shadow:none;padding:0 0 4px 22px;background:transparent}.cad-sheet-container .cad-popover{border:0;box-shadow:none;border-radius:0;animation:none;padding:12px 16px;width:auto!important;min-width:0!important}.cad-sheet-container .cad-popover__arrow{display:none}@media(prefers-reduced-motion:reduce){.cad-sheet-container{transition:opacity .12s;transform:none;opacity:0}.cad-sheet-container.is-open{opacity:1}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i1$1.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2545
+ `, isInline: true, styles: [".cad-overlay-pane.cad-sheet-pane{width:100%;max-width:100%}.cad-sheet-container{display:flex;flex-direction:column;width:100%;max-height:92dvh;outline:none;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);transform:translateY(100%);transition:transform .2s var(--cad-ease);will-change:transform}.cad-sheet-container.is-open{transform:none}.cad-sheet-container.is-dragging{transition:none}.cad-sheet-container.h-half{height:50dvh}.cad-sheet-container.h-full{height:92dvh}.cad-sheet-container.h-css{height:var(--cad-sheet-h)}.cad-sheet{display:flex;flex-direction:column;flex:1;min-height:0;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-bottom:0;border-radius:16px 16px 0 0;box-shadow:0 -8px 32px #0000002e;overflow:hidden;padding-bottom:env(safe-area-inset-bottom)}.cad-sheet__grip{display:flex;justify-content:center;padding:8px 0 4px;cursor:grab;touch-action:none;flex:none}.cad-sheet__handle{width:36px;height:4px;border-radius:2px;background:var(--cad-border-strong)}.cad-sheet__header{display:flex;align-items:center;gap:8px;padding:6px 16px 10px;flex:none;touch-action:none}.cad-sheet__grip+.cad-sheet__header{padding-top:2px}.cad-sheet__title{margin:0;font-size:14.5px;font-weight:600;color:var(--cad-fg);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cad-sheet__close{display:grid;place-items:center;width:32px;height:32px;border:0;border-radius:var(--cad-radius-sm);background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:0;margin-right:-6px}.cad-sheet__close:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-sheet__close:focus-visible{outline:2px solid var(--cad-ring);outline-offset:1px}.cad-sheet__body{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.cad-sheet__footer{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:10px 16px;border-top:1px solid var(--cad-border);background:var(--cad-bg-subtle);flex:none}.cad-sheet-container .cad-optlist{max-height:none!important;padding:6px 8px}.cad-sheet-container .cad-optlist__opt{min-height:44px;padding:10px 12px;box-sizing:border-box;font-size:var(--cad-font-size-lg)}.cad-sheet-container .cad-optlist__group{padding:12px 12px 4px}.cad-sheet-container .cad-select__panel,.cad-sheet-container .cad-multiselect__panel{border:0;box-shadow:none;border-radius:0;min-width:100%!important;background:transparent}.cad-sheet-container .cad-select__search,.cad-sheet-container .cad-multiselect__head{padding:8px 16px}.cad-sheet-container .cad-select__search input,.cad-sheet-container .cad-multiselect__head input{font-size:var(--cad-font-size-lg);height:32px}.cad-sheet-container .cad-dp__panel{border:0;box-shadow:none;border-radius:0;width:100%;box-sizing:border-box;padding:4px 12px 12px;background:transparent}.cad-sheet-container .cad-dp__grid{width:100%}.cad-sheet-container .cad-dp__day{width:40px;height:40px;font-size:var(--cad-font-size)}.cad-sheet-container .cad-dp__row{justify-content:space-between}.cad-sheet-container .cad-menu{border:0;box-shadow:none;border-radius:0;min-width:100%!important;padding:6px 8px}.cad-sheet-container .cad-menu__item{min-height:44px;padding:10px 12px;box-sizing:border-box;font-size:var(--cad-font-size-lg);white-space:normal}.cad-sheet-container .cad-menu--sub{position:static;border:0;box-shadow:none;padding:0 0 4px 22px;background:transparent}.cad-sheet-container .cad-popover{border:0;box-shadow:none;border-radius:0;animation:none;padding:12px 16px;width:auto!important;min-width:0!important}.cad-sheet-container .cad-popover__arrow{display:none}@media(prefers-reduced-motion:reduce){.cad-sheet-container{transition:opacity .12s;transform:none;opacity:0}.cad-sheet-container.is-open{opacity:1}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i1$1.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2546
2546
  }
2547
2547
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadSheetContainerComponent, decorators: [{
2548
2548
  type: Component,
@@ -2575,7 +2575,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
2575
2575
  <footer class="cad-sheet__footer"><ng-container *ngTemplateOutlet="config().footer!" /></footer>
2576
2576
  }
2577
2577
  </div>
2578
- `, styles: [".cad-overlay-pane.cad-sheet-pane{width:100%;max-width:100%}.cad-sheet-container{display:flex;flex-direction:column;width:100%;max-height:92dvh;outline:none;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);transform:translateY(100%);transition:transform .2s var(--cad-ease);will-change:transform}.cad-sheet-container.is-open{transform:none}.cad-sheet-container.is-dragging{transition:none}.cad-sheet-container.h-half{height:50dvh}.cad-sheet-container.h-full{height:92dvh}.cad-sheet-container.h-css{height:var(--cad-sheet-h)}.cad-sheet{display:flex;flex-direction:column;flex:1;min-height:0;background:var(--cad-overlay);border:1px solid var(--cad-border);border-bottom:0;border-radius:16px 16px 0 0;box-shadow:0 -8px 32px #0000002e;overflow:hidden;padding-bottom:env(safe-area-inset-bottom)}.cad-sheet__grip{display:flex;justify-content:center;padding:8px 0 4px;cursor:grab;touch-action:none;flex:none}.cad-sheet__handle{width:36px;height:4px;border-radius:2px;background:var(--cad-border-strong)}.cad-sheet__header{display:flex;align-items:center;gap:8px;padding:6px 16px 10px;flex:none;touch-action:none}.cad-sheet__grip+.cad-sheet__header{padding-top:2px}.cad-sheet__title{margin:0;font-size:14.5px;font-weight:600;color:var(--cad-fg);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cad-sheet__close{display:grid;place-items:center;width:32px;height:32px;border:0;border-radius:var(--cad-radius-sm);background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:0;margin-right:-6px}.cad-sheet__close:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-sheet__close:focus-visible{outline:2px solid var(--cad-ring);outline-offset:1px}.cad-sheet__body{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.cad-sheet__footer{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:10px 16px;border-top:1px solid var(--cad-border);background:var(--cad-bg-subtle);flex:none}.cad-sheet-container .cad-optlist{max-height:none!important;padding:6px 8px}.cad-sheet-container .cad-optlist__opt{min-height:44px;padding:10px 12px;box-sizing:border-box;font-size:var(--cad-font-size-lg)}.cad-sheet-container .cad-optlist__group{padding:12px 12px 4px}.cad-sheet-container .cad-select__panel,.cad-sheet-container .cad-multiselect__panel{border:0;box-shadow:none;border-radius:0;min-width:100%!important;background:transparent}.cad-sheet-container .cad-select__search,.cad-sheet-container .cad-multiselect__head{padding:8px 16px}.cad-sheet-container .cad-select__search input,.cad-sheet-container .cad-multiselect__head input{font-size:var(--cad-font-size-lg);height:32px}.cad-sheet-container .cad-dp__panel{border:0;box-shadow:none;border-radius:0;width:100%;box-sizing:border-box;padding:4px 12px 12px;background:transparent}.cad-sheet-container .cad-dp__grid{width:100%}.cad-sheet-container .cad-dp__day{width:40px;height:40px;font-size:var(--cad-font-size)}.cad-sheet-container .cad-dp__row{justify-content:space-between}.cad-sheet-container .cad-menu{border:0;box-shadow:none;border-radius:0;min-width:100%!important;padding:6px 8px}.cad-sheet-container .cad-menu__item{min-height:44px;padding:10px 12px;box-sizing:border-box;font-size:var(--cad-font-size-lg);white-space:normal}.cad-sheet-container .cad-menu--sub{position:static;border:0;box-shadow:none;padding:0 0 4px 22px;background:transparent}.cad-sheet-container .cad-popover{border:0;box-shadow:none;border-radius:0;animation:none;padding:12px 16px;width:auto!important;min-width:0!important}.cad-sheet-container .cad-popover__arrow{display:none}@media(prefers-reduced-motion:reduce){.cad-sheet-container{transition:opacity .12s;transform:none;opacity:0}.cad-sheet-container.is-open{opacity:1}}\n"] }]
2578
+ `, styles: [".cad-overlay-pane.cad-sheet-pane{width:100%;max-width:100%}.cad-sheet-container{display:flex;flex-direction:column;width:100%;max-height:92dvh;outline:none;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);transform:translateY(100%);transition:transform .2s var(--cad-ease);will-change:transform}.cad-sheet-container.is-open{transform:none}.cad-sheet-container.is-dragging{transition:none}.cad-sheet-container.h-half{height:50dvh}.cad-sheet-container.h-full{height:92dvh}.cad-sheet-container.h-css{height:var(--cad-sheet-h)}.cad-sheet{display:flex;flex-direction:column;flex:1;min-height:0;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-bottom:0;border-radius:16px 16px 0 0;box-shadow:0 -8px 32px #0000002e;overflow:hidden;padding-bottom:env(safe-area-inset-bottom)}.cad-sheet__grip{display:flex;justify-content:center;padding:8px 0 4px;cursor:grab;touch-action:none;flex:none}.cad-sheet__handle{width:36px;height:4px;border-radius:2px;background:var(--cad-border-strong)}.cad-sheet__header{display:flex;align-items:center;gap:8px;padding:6px 16px 10px;flex:none;touch-action:none}.cad-sheet__grip+.cad-sheet__header{padding-top:2px}.cad-sheet__title{margin:0;font-size:14.5px;font-weight:600;color:var(--cad-fg);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cad-sheet__close{display:grid;place-items:center;width:32px;height:32px;border:0;border-radius:var(--cad-radius-sm);background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:0;margin-right:-6px}.cad-sheet__close:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-sheet__close:focus-visible{outline:2px solid var(--cad-ring);outline-offset:1px}.cad-sheet__body{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.cad-sheet__footer{display:flex;justify-content:flex-end;align-items:center;gap:8px;padding:10px 16px;border-top:1px solid var(--cad-border);background:var(--cad-bg-subtle);flex:none}.cad-sheet-container .cad-optlist{max-height:none!important;padding:6px 8px}.cad-sheet-container .cad-optlist__opt{min-height:44px;padding:10px 12px;box-sizing:border-box;font-size:var(--cad-font-size-lg)}.cad-sheet-container .cad-optlist__group{padding:12px 12px 4px}.cad-sheet-container .cad-select__panel,.cad-sheet-container .cad-multiselect__panel{border:0;box-shadow:none;border-radius:0;min-width:100%!important;background:transparent}.cad-sheet-container .cad-select__search,.cad-sheet-container .cad-multiselect__head{padding:8px 16px}.cad-sheet-container .cad-select__search input,.cad-sheet-container .cad-multiselect__head input{font-size:var(--cad-font-size-lg);height:32px}.cad-sheet-container .cad-dp__panel{border:0;box-shadow:none;border-radius:0;width:100%;box-sizing:border-box;padding:4px 12px 12px;background:transparent}.cad-sheet-container .cad-dp__grid{width:100%}.cad-sheet-container .cad-dp__day{width:40px;height:40px;font-size:var(--cad-font-size)}.cad-sheet-container .cad-dp__row{justify-content:space-between}.cad-sheet-container .cad-menu{border:0;box-shadow:none;border-radius:0;min-width:100%!important;padding:6px 8px}.cad-sheet-container .cad-menu__item{min-height:44px;padding:10px 12px;box-sizing:border-box;font-size:var(--cad-font-size-lg);white-space:normal}.cad-sheet-container .cad-menu--sub{position:static;border:0;box-shadow:none;padding:0 0 4px 22px;background:transparent}.cad-sheet-container .cad-popover{border:0;box-shadow:none;border-radius:0;animation:none;padding:12px 16px;width:auto!important;min-width:0!important}.cad-sheet-container .cad-popover__arrow{display:none}@media(prefers-reduced-motion:reduce){.cad-sheet-container{transition:opacity .12s;transform:none;opacity:0}.cad-sheet-container.is-open{opacity:1}}\n"] }]
2579
2579
  }], propDecorators: { closeRequest: [{ type: i0.Output, args: ["closeRequest"] }], attached: [{ type: i0.Output, args: ["attached"] }] } });
2580
2580
  /**
2581
2581
  * CadSheetService — feuille basse (bottom-sheet) partagée par les composants en mode mobile (select, datepicker, menu,
@@ -3214,7 +3214,7 @@ class CadSelectComponent extends CadSelectBase {
3214
3214
  @if (footerTpl(); as f) { <ng-container *ngTemplateOutlet="f.template" /> }
3215
3215
  </div>
3216
3216
  </ng-template>
3217
- `, isInline: true, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.cad-select__trigger{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .cad-select__trigger{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-select__trigger{height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-select__trigger:focus-visible,:host(.is-open) .cad-select__trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-select__trigger{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .cad-select__trigger,:host(.is-invalid) .cad-select__trigger:focus-visible{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-select__trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}:host(.is-readonly) .cad-select__trigger{cursor:default}.cad-select__value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.cad-select__value.is-placeholder,.cad-select__icon{color:var(--cad-fg-muted)}.cad-select__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .cad-select__chev{transform:rotate(180deg)}.cad-select__spin{color:var(--cad-fg-muted)}.cad-select__clear{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.cad-select__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-select__panel{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.cad-select__search{display:flex;align-items:center;gap:6px;padding:6px 10px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-select__search input{flex:1;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm)/1.4 var(--cad-font)}.cad-select__search input::placeholder{color:var(--cad-fg-muted)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadOptionListComponent, selector: "cad-option-list", inputs: ["items", "activeIndex", "isSelected", "multiple", "listId", "maxHeight", "itemTpl", "emptyTpl", "emptyMessage", "emptyFilterMessage", "filtered", "query"], outputs: ["pick", "hover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3217
+ `, isInline: true, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.cad-select__trigger{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .cad-select__trigger{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-select__trigger{height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-select__trigger:focus-visible,:host(.is-open) .cad-select__trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-select__trigger{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .cad-select__trigger,:host(.is-invalid) .cad-select__trigger:focus-visible{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-select__trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}:host(.is-readonly) .cad-select__trigger{cursor:default}.cad-select__value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.cad-select__value.is-placeholder,.cad-select__icon{color:var(--cad-fg-muted)}.cad-select__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .cad-select__chev{transform:rotate(180deg)}.cad-select__spin{color:var(--cad-fg-muted)}.cad-select__clear{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.cad-select__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-select__panel{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.cad-select__search{display:flex;align-items:center;gap:6px;padding:6px 10px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-select__search input{flex:1;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm)/1.4 var(--cad-font)}.cad-select__search input::placeholder{color:var(--cad-fg-muted)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadOptionListComponent, selector: "cad-option-list", inputs: ["items", "activeIndex", "isSelected", "multiple", "listId", "maxHeight", "itemTpl", "emptyTpl", "emptyMessage", "emptyFilterMessage", "filtered", "query"], outputs: ["pick", "hover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3218
3218
  }
3219
3219
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadSelectComponent, decorators: [{
3220
3220
  type: Component,
@@ -3268,7 +3268,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
3268
3268
  @if (footerTpl(); as f) { <ng-container *ngTemplateOutlet="f.template" /> }
3269
3269
  </div>
3270
3270
  </ng-template>
3271
- `, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.cad-select__trigger{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .cad-select__trigger{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-select__trigger{height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-select__trigger:focus-visible,:host(.is-open) .cad-select__trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-select__trigger{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .cad-select__trigger,:host(.is-invalid) .cad-select__trigger:focus-visible{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-select__trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}:host(.is-readonly) .cad-select__trigger{cursor:default}.cad-select__value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.cad-select__value.is-placeholder,.cad-select__icon{color:var(--cad-fg-muted)}.cad-select__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .cad-select__chev{transform:rotate(180deg)}.cad-select__spin{color:var(--cad-fg-muted)}.cad-select__clear{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.cad-select__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-select__panel{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.cad-select__search{display:flex;align-items:center;gap:6px;padding:6px 10px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-select__search input{flex:1;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm)/1.4 var(--cad-font)}.cad-select__search input::placeholder{color:var(--cad-fg-muted)}\n"] }]
3271
+ `, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.cad-select__trigger{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .cad-select__trigger{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-select__trigger{height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-select__trigger:focus-visible,:host(.is-open) .cad-select__trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-select__trigger{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .cad-select__trigger,:host(.is-invalid) .cad-select__trigger:focus-visible{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-select__trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}:host(.is-readonly) .cad-select__trigger{cursor:default}.cad-select__value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.cad-select__value.is-placeholder,.cad-select__icon{color:var(--cad-fg-muted)}.cad-select__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .cad-select__chev{transform:rotate(180deg)}.cad-select__spin{color:var(--cad-fg-muted)}.cad-select__clear{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.cad-select__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-select__panel{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.cad-select__search{display:flex;align-items:center;gap:6px;padding:6px 10px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-select__search input{flex:1;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm)/1.4 var(--cad-font)}.cad-select__search input::placeholder{color:var(--cad-fg-muted)}\n"] }]
3272
3272
  }], propDecorators: { changed: [{ type: i0.Output, args: ["changed"] }] } });
3273
3273
 
3274
3274
  /**
@@ -3425,7 +3425,7 @@ class CadMultiselectComponent extends CadSelectBase {
3425
3425
  }
3426
3426
  </div>
3427
3427
  </ng-template>
3428
- `, isInline: true, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.cad-multiselect__trigger{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:3px 8px 3px var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.display-chip) .cad-multiselect__trigger{padding-left:4px}:host(.size-sm) .cad-multiselect__trigger{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-multiselect__trigger{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-multiselect__trigger:focus-visible,:host(.is-open) .cad-multiselect__trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-multiselect__trigger{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .cad-multiselect__trigger,:host(.is-invalid) .cad-multiselect__trigger:focus-visible{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-multiselect__trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}:host(.is-readonly) .cad-multiselect__trigger{cursor:default}.cad-multiselect__value{flex:1;min-width:0;display:flex;flex-wrap:wrap;align-items:center;gap:4px;overflow:hidden}:host(:not(.display-chip)) .cad-multiselect__value{display:block;white-space:nowrap;text-overflow:ellipsis}.cad-multiselect__value.is-placeholder{color:var(--cad-fg-muted);padding-left:6px}:host(:not(.display-chip)) .cad-multiselect__value.is-placeholder{padding-left:0}.cad-multiselect__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 5px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500;white-space:nowrap}:host(.size-sm) .cad-multiselect__chip{height:18px;font-size:11px}.cad-multiselect__chip-x{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer;color:inherit;opacity:.8}.cad-multiselect__chip-x:hover{opacity:1;background:color-mix(in srgb,var(--cad-accent) 20%,transparent)}.cad-multiselect__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .cad-multiselect__chev{transform:rotate(180deg)}.cad-multiselect__spin{color:var(--cad-fg-muted)}.cad-multiselect__clear{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.cad-multiselect__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-multiselect__panel{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.cad-multiselect__head{display:flex;align-items:center;gap:8px;padding:6px 10px 6px 12px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-multiselect__head input{flex:1;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm)/1.4 var(--cad-font)}.cad-multiselect__head input::placeholder{color:var(--cad-fg-muted)}.cad-multiselect__all{all:unset;display:inline-flex;cursor:pointer}.cad-multiselect__all[disabled]{opacity:.4;cursor:default}.cad-multiselect__all-label{color:var(--cad-fg-secondary);cursor:pointer;font-size:var(--cad-font-size-sm)}.cad-multiselect__check{width:16px;height:16px;box-sizing:border-box;border:1.5px solid var(--cad-border-strong);border-radius:4px;background:var(--cad-input-bg);display:grid;place-items:center;color:var(--cad-fg-on-accent);transition:background var(--cad-dur),border-color var(--cad-dur)}.cad-multiselect__check.is-on,.cad-multiselect__check.is-mixed{background:var(--cad-accent);border-color:var(--cad-accent)}.cad-multiselect__check i{width:8px;height:2px;background:currentColor;border-radius:1px}.cad-multiselect__sheet-foot{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px calc(10px + env(safe-area-inset-bottom));border-top:1px solid var(--cad-border);background:var(--cad-bg-subtle);position:sticky;bottom:0}.cad-multiselect__sheet-btn{display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 18px;border-radius:var(--cad-radius);border:1px solid transparent;background:var(--cad-accent);color:var(--cad-fg-on-accent);font:500 var(--cad-font-size-lg) var(--cad-font);cursor:pointer}.cad-multiselect__sheet-btn.is-ghost{background:transparent;color:var(--cad-fg-secondary)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadOptionListComponent, selector: "cad-option-list", inputs: ["items", "activeIndex", "isSelected", "multiple", "listId", "maxHeight", "itemTpl", "emptyTpl", "emptyMessage", "emptyFilterMessage", "filtered", "query"], outputs: ["pick", "hover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3428
+ `, isInline: true, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.cad-multiselect__trigger{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:3px 8px 3px var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.display-chip) .cad-multiselect__trigger{padding-left:4px}:host(.size-sm) .cad-multiselect__trigger{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-multiselect__trigger{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-multiselect__trigger:focus-visible,:host(.is-open) .cad-multiselect__trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-multiselect__trigger{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .cad-multiselect__trigger,:host(.is-invalid) .cad-multiselect__trigger:focus-visible{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-multiselect__trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}:host(.is-readonly) .cad-multiselect__trigger{cursor:default}.cad-multiselect__value{flex:1;min-width:0;display:flex;flex-wrap:wrap;align-items:center;gap:4px;overflow:hidden}:host(:not(.display-chip)) .cad-multiselect__value{display:block;white-space:nowrap;text-overflow:ellipsis}.cad-multiselect__value.is-placeholder{color:var(--cad-fg-muted);padding-left:6px}:host(:not(.display-chip)) .cad-multiselect__value.is-placeholder{padding-left:0}.cad-multiselect__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 5px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500;white-space:nowrap}:host(.size-sm) .cad-multiselect__chip{height:18px;font-size:11px}.cad-multiselect__chip-x{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer;color:inherit;opacity:.8}.cad-multiselect__chip-x:hover{opacity:1;background:color-mix(in srgb,var(--cad-accent) 20%,transparent)}.cad-multiselect__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .cad-multiselect__chev{transform:rotate(180deg)}.cad-multiselect__spin{color:var(--cad-fg-muted)}.cad-multiselect__clear{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.cad-multiselect__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-multiselect__panel{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.cad-multiselect__head{display:flex;align-items:center;gap:8px;padding:6px 10px 6px 12px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-multiselect__head input{flex:1;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm)/1.4 var(--cad-font)}.cad-multiselect__head input::placeholder{color:var(--cad-fg-muted)}.cad-multiselect__all{all:unset;display:inline-flex;cursor:pointer}.cad-multiselect__all[disabled]{opacity:.4;cursor:default}.cad-multiselect__all-label{color:var(--cad-fg-secondary);cursor:pointer;font-size:var(--cad-font-size-sm)}.cad-multiselect__check{width:16px;height:16px;box-sizing:border-box;border:1.5px solid var(--cad-border-strong);border-radius:4px;background:var(--cad-input-bg);display:grid;place-items:center;color:var(--cad-fg-on-accent);transition:background var(--cad-dur),border-color var(--cad-dur)}.cad-multiselect__check.is-on,.cad-multiselect__check.is-mixed{background:var(--cad-accent);border-color:var(--cad-accent)}.cad-multiselect__check i{width:8px;height:2px;background:currentColor;border-radius:1px}.cad-multiselect__sheet-foot{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px calc(10px + env(safe-area-inset-bottom));border-top:1px solid var(--cad-border);background:var(--cad-bg-subtle);position:sticky;bottom:0}.cad-multiselect__sheet-btn{display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 18px;border-radius:var(--cad-radius);border:1px solid transparent;background:var(--cad-accent);color:var(--cad-fg-on-accent);font:500 var(--cad-font-size-lg) var(--cad-font);cursor:pointer}.cad-multiselect__sheet-btn.is-ghost{background:transparent;color:var(--cad-fg-secondary)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadOptionListComponent, selector: "cad-option-list", inputs: ["items", "activeIndex", "isSelected", "multiple", "listId", "maxHeight", "itemTpl", "emptyTpl", "emptyMessage", "emptyFilterMessage", "filtered", "query"], outputs: ["pick", "hover"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3429
3429
  }
3430
3430
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadMultiselectComponent, decorators: [{
3431
3431
  type: Component,
@@ -3500,7 +3500,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
3500
3500
  }
3501
3501
  </div>
3502
3502
  </ng-template>
3503
- `, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.cad-multiselect__trigger{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:3px 8px 3px var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.display-chip) .cad-multiselect__trigger{padding-left:4px}:host(.size-sm) .cad-multiselect__trigger{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-multiselect__trigger{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-multiselect__trigger:focus-visible,:host(.is-open) .cad-multiselect__trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-multiselect__trigger{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .cad-multiselect__trigger,:host(.is-invalid) .cad-multiselect__trigger:focus-visible{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-multiselect__trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}:host(.is-readonly) .cad-multiselect__trigger{cursor:default}.cad-multiselect__value{flex:1;min-width:0;display:flex;flex-wrap:wrap;align-items:center;gap:4px;overflow:hidden}:host(:not(.display-chip)) .cad-multiselect__value{display:block;white-space:nowrap;text-overflow:ellipsis}.cad-multiselect__value.is-placeholder{color:var(--cad-fg-muted);padding-left:6px}:host(:not(.display-chip)) .cad-multiselect__value.is-placeholder{padding-left:0}.cad-multiselect__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 5px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500;white-space:nowrap}:host(.size-sm) .cad-multiselect__chip{height:18px;font-size:11px}.cad-multiselect__chip-x{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer;color:inherit;opacity:.8}.cad-multiselect__chip-x:hover{opacity:1;background:color-mix(in srgb,var(--cad-accent) 20%,transparent)}.cad-multiselect__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .cad-multiselect__chev{transform:rotate(180deg)}.cad-multiselect__spin{color:var(--cad-fg-muted)}.cad-multiselect__clear{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.cad-multiselect__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-multiselect__panel{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.cad-multiselect__head{display:flex;align-items:center;gap:8px;padding:6px 10px 6px 12px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-multiselect__head input{flex:1;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm)/1.4 var(--cad-font)}.cad-multiselect__head input::placeholder{color:var(--cad-fg-muted)}.cad-multiselect__all{all:unset;display:inline-flex;cursor:pointer}.cad-multiselect__all[disabled]{opacity:.4;cursor:default}.cad-multiselect__all-label{color:var(--cad-fg-secondary);cursor:pointer;font-size:var(--cad-font-size-sm)}.cad-multiselect__check{width:16px;height:16px;box-sizing:border-box;border:1.5px solid var(--cad-border-strong);border-radius:4px;background:var(--cad-input-bg);display:grid;place-items:center;color:var(--cad-fg-on-accent);transition:background var(--cad-dur),border-color var(--cad-dur)}.cad-multiselect__check.is-on,.cad-multiselect__check.is-mixed{background:var(--cad-accent);border-color:var(--cad-accent)}.cad-multiselect__check i{width:8px;height:2px;background:currentColor;border-radius:1px}.cad-multiselect__sheet-foot{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px calc(10px + env(safe-area-inset-bottom));border-top:1px solid var(--cad-border);background:var(--cad-bg-subtle);position:sticky;bottom:0}.cad-multiselect__sheet-btn{display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 18px;border-radius:var(--cad-radius);border:1px solid transparent;background:var(--cad-accent);color:var(--cad-fg-on-accent);font:500 var(--cad-font-size-lg) var(--cad-font);cursor:pointer}.cad-multiselect__sheet-btn.is-ghost{background:transparent;color:var(--cad-fg-secondary)}\n"] }]
3503
+ `, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.cad-multiselect__trigger{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:3px 8px 3px var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.display-chip) .cad-multiselect__trigger{padding-left:4px}:host(.size-sm) .cad-multiselect__trigger{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-multiselect__trigger{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-multiselect__trigger:focus-visible,:host(.is-open) .cad-multiselect__trigger{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-multiselect__trigger{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .cad-multiselect__trigger,:host(.is-invalid) .cad-multiselect__trigger:focus-visible{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-multiselect__trigger{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}:host(.is-readonly) .cad-multiselect__trigger{cursor:default}.cad-multiselect__value{flex:1;min-width:0;display:flex;flex-wrap:wrap;align-items:center;gap:4px;overflow:hidden}:host(:not(.display-chip)) .cad-multiselect__value{display:block;white-space:nowrap;text-overflow:ellipsis}.cad-multiselect__value.is-placeholder{color:var(--cad-fg-muted);padding-left:6px}:host(:not(.display-chip)) .cad-multiselect__value.is-placeholder{padding-left:0}.cad-multiselect__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 5px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500;white-space:nowrap}:host(.size-sm) .cad-multiselect__chip{height:18px;font-size:11px}.cad-multiselect__chip-x{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer;color:inherit;opacity:.8}.cad-multiselect__chip-x:hover{opacity:1;background:color-mix(in srgb,var(--cad-accent) 20%,transparent)}.cad-multiselect__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .cad-multiselect__chev{transform:rotate(180deg)}.cad-multiselect__spin{color:var(--cad-fg-muted)}.cad-multiselect__clear{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.cad-multiselect__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-multiselect__panel{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.cad-multiselect__head{display:flex;align-items:center;gap:8px;padding:6px 10px 6px 12px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-multiselect__head input{flex:1;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm)/1.4 var(--cad-font)}.cad-multiselect__head input::placeholder{color:var(--cad-fg-muted)}.cad-multiselect__all{all:unset;display:inline-flex;cursor:pointer}.cad-multiselect__all[disabled]{opacity:.4;cursor:default}.cad-multiselect__all-label{color:var(--cad-fg-secondary);cursor:pointer;font-size:var(--cad-font-size-sm)}.cad-multiselect__check{width:16px;height:16px;box-sizing:border-box;border:1.5px solid var(--cad-border-strong);border-radius:4px;background:var(--cad-input-bg);display:grid;place-items:center;color:var(--cad-fg-on-accent);transition:background var(--cad-dur),border-color var(--cad-dur)}.cad-multiselect__check.is-on,.cad-multiselect__check.is-mixed{background:var(--cad-accent);border-color:var(--cad-accent)}.cad-multiselect__check i{width:8px;height:2px;background:currentColor;border-radius:1px}.cad-multiselect__sheet-foot{display:flex;justify-content:flex-end;gap:8px;padding:10px 16px calc(10px + env(safe-area-inset-bottom));border-top:1px solid var(--cad-border);background:var(--cad-bg-subtle);position:sticky;bottom:0}.cad-multiselect__sheet-btn{display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 18px;border-radius:var(--cad-radius);border:1px solid transparent;background:var(--cad-accent);color:var(--cad-fg-on-accent);font:500 var(--cad-font-size-lg) var(--cad-font);cursor:pointer}.cad-multiselect__sheet-btn.is-ghost{background:transparent;color:var(--cad-fg-secondary)}\n"] }]
3504
3504
  }], propDecorators: { display: [{ type: i0.Input, args: [{ isSignal: true, alias: "display", required: false }] }], maxSelectedLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelectedLabels", required: false }] }], selectedItemsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedItemsLabel", required: false }] }], showToggleAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "showToggleAll", required: false }] }], selectionLimit: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionLimit", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }], removed: [{ type: i0.Output, args: ["removed"] }] } });
3505
3505
 
3506
3506
  /** CSS du déclencheur/panneau commun aux sélecteurs (treeselect, cascade, combo) — mêmes tokens que cad-select. */
@@ -3522,7 +3522,7 @@ const CAD_SELECT_TRIGGER_STYLES = `
3522
3522
  .st__chev { color: var(--cad-fg-muted); flex: none; transition: transform var(--cad-dur) var(--cad-ease); } :host(.is-open) .st__chev { transform: rotate(180deg); }
3523
3523
  .st__clear, .st__dd { all: unset; display: grid; place-items: center; width: 18px; height: 18px; border-radius: 4px; color: var(--cad-fg-muted); cursor: pointer; } .st__clear:hover, .st__dd:hover { color: var(--cad-fg); background: var(--cad-hover); }
3524
3524
  .st__spin { color: var(--cad-fg-muted); }
3525
- .sp { display: flex; flex-direction: column; box-sizing: border-box; background: var(--cad-overlay); border: 1px solid var(--cad-border); border-radius: 9px; box-shadow: var(--cad-shadow-lg); overflow: hidden; font-family: var(--cad-font); font-size: var(--cad-font-size); color: var(--cad-fg); }
3525
+ .sp { display: flex; flex-direction: column; box-sizing: border-box; background: var(--cad-overlay); --cad-hover: var(--cad-overlay-hover); border: 1px solid var(--cad-border); border-radius: 9px; box-shadow: var(--cad-shadow-lg); overflow: hidden; font-family: var(--cad-font); font-size: var(--cad-font-size); color: var(--cad-fg); }
3526
3526
  .sp__empty { padding: 12px; text-align: center; color: var(--cad-fg-muted); font-size: var(--cad-font-size-sm); }
3527
3527
  `;
3528
3528
 
@@ -4970,7 +4970,7 @@ class CadPopoverComponent {
4970
4970
  <ng-content />
4971
4971
  </div>
4972
4972
  </ng-template>
4973
- `, isInline: true, styles: [".cad-popover{position:relative;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);padding:10px 12px;color:var(--cad-fg);font-family:var(--cad-font);font-size:var(--cad-font-size);box-sizing:border-box;outline:none;animation:cad-pop-in .12s var(--cad-ease)}.cad-popover__arrow{position:absolute;width:10px;height:10px;background:inherit;border:1px solid var(--cad-border);transform:rotate(45deg)}[data-placement=bottom] .cad-popover__arrow{top:-6px;left:50%;margin-left:-5px;border-right:0;border-bottom:0}[data-placement=top] .cad-popover__arrow{bottom:-6px;left:50%;margin-left:-5px;border-left:0;border-top:0}[data-placement=right] .cad-popover__arrow{left:-6px;top:50%;margin-top:-5px;border-right:0;border-top:0}[data-placement=left] .cad-popover__arrow{right:-6px;top:50%;margin-top:-5px;border-left:0;border-bottom:0}@keyframes cad-pop-in{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.cad-popover{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4973
+ `, isInline: true, styles: [".cad-popover{position:relative;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);padding:10px 12px;color:var(--cad-fg);font-family:var(--cad-font);font-size:var(--cad-font-size);box-sizing:border-box;outline:none;animation:cad-pop-in .12s var(--cad-ease)}.cad-popover__arrow{position:absolute;width:10px;height:10px;background:inherit;border:1px solid var(--cad-border);transform:rotate(45deg)}[data-placement=bottom] .cad-popover__arrow{top:-6px;left:50%;margin-left:-5px;border-right:0;border-bottom:0}[data-placement=top] .cad-popover__arrow{bottom:-6px;left:50%;margin-left:-5px;border-left:0;border-top:0}[data-placement=right] .cad-popover__arrow{left:-6px;top:50%;margin-top:-5px;border-right:0;border-top:0}[data-placement=left] .cad-popover__arrow{right:-6px;top:50%;margin-top:-5px;border-left:0;border-bottom:0}@keyframes cad-pop-in{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.cad-popover{animation:none}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4974
4974
  }
4975
4975
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadPopoverComponent, decorators: [{
4976
4976
  type: Component,
@@ -4982,7 +4982,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
4982
4982
  <ng-content />
4983
4983
  </div>
4984
4984
  </ng-template>
4985
- `, styles: [".cad-popover{position:relative;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);padding:10px 12px;color:var(--cad-fg);font-family:var(--cad-font);font-size:var(--cad-font-size);box-sizing:border-box;outline:none;animation:cad-pop-in .12s var(--cad-ease)}.cad-popover__arrow{position:absolute;width:10px;height:10px;background:inherit;border:1px solid var(--cad-border);transform:rotate(45deg)}[data-placement=bottom] .cad-popover__arrow{top:-6px;left:50%;margin-left:-5px;border-right:0;border-bottom:0}[data-placement=top] .cad-popover__arrow{bottom:-6px;left:50%;margin-left:-5px;border-left:0;border-top:0}[data-placement=right] .cad-popover__arrow{left:-6px;top:50%;margin-top:-5px;border-right:0;border-top:0}[data-placement=left] .cad-popover__arrow{right:-6px;top:50%;margin-top:-5px;border-left:0;border-bottom:0}@keyframes cad-pop-in{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.cad-popover{animation:none}}\n"] }]
4985
+ `, styles: [".cad-popover{position:relative;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);padding:10px 12px;color:var(--cad-fg);font-family:var(--cad-font);font-size:var(--cad-font-size);box-sizing:border-box;outline:none;animation:cad-pop-in .12s var(--cad-ease)}.cad-popover__arrow{position:absolute;width:10px;height:10px;background:inherit;border:1px solid var(--cad-border);transform:rotate(45deg)}[data-placement=bottom] .cad-popover__arrow{top:-6px;left:50%;margin-left:-5px;border-right:0;border-bottom:0}[data-placement=top] .cad-popover__arrow{bottom:-6px;left:50%;margin-left:-5px;border-left:0;border-top:0}[data-placement=right] .cad-popover__arrow{left:-6px;top:50%;margin-top:-5px;border-right:0;border-top:0}[data-placement=left] .cad-popover__arrow{right:-6px;top:50%;margin-top:-5px;border-left:0;border-bottom:0}@keyframes cad-pop-in{0%{opacity:0;transform:scale(.98)}to{opacity:1;transform:none}}@media(prefers-reduced-motion:reduce){.cad-popover{animation:none}}\n"] }]
4986
4986
  }], propDecorators: { tpl: [{ type: i0.ViewChild, args: ['tpl', { isSignal: true }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "align", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], dismissOnClickOutside: [{ type: i0.Input, args: [{ isSignal: true, alias: "dismissOnClickOutside", required: false }] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], focusTrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "focusTrap", required: false }] }], showArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "showArrow", required: false }] }], hasBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasBackdrop", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], minWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "minWidth", required: false }] }], mobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobile", required: false }] }], sheetTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "sheetTitle", required: false }] }], visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }, { type: i0.Output, args: ["visibleChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
4987
4987
 
4988
4988
  /** Utilitaires date cadriciel-ui — zéro dépendance. Dates LOCALES (pas d'UTC). */
@@ -5824,7 +5824,7 @@ class CadDatepickerComponent extends CadValueAccessor {
5824
5824
  </div>
5825
5825
  }
5826
5826
  </ng-template>
5827
- `, isInline: true, styles: [":host{display:inline-block;width:100%;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-inline){width:auto}.cad-dp__box{display:flex;align-items:stretch;height:var(--cad-control-h);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);transition:border-color var(--cad-dur),box-shadow var(--cad-dur);cursor:text}:host(.size-sm) .cad-dp__box{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-dp__box{height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-dp__box:focus-within,:host(.is-open) .cad-dp__box{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-dp__box{border-color:var(--cad-danger)}:host(.is-invalid) .cad-dp__box:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-dp__box{opacity:.6;background:var(--cad-bg-subtle);cursor:not-allowed}.cad-dp__input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:inherit;font:inherit;padding:0 var(--cad-control-px);font-variant-numeric:tabular-nums;cursor:inherit}.cad-dp__input::placeholder{color:var(--cad-fg-muted)}.cad-dp__btn{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:0 8px;display:grid;place-items:center}.cad-dp__btn:hover{color:var(--cad-fg)}.cad-dp__cal{padding-right:10px}.cad-dp__panel{background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);padding:10px;width:272px;box-sizing:border-box;-webkit-user-select:none;user-select:none}.cad-dp__panel.is-inline{box-shadow:none;background:var(--cad-surface)}.cad-dp__head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.cad-dp__nav{width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--cad-fg-secondary);cursor:pointer;display:grid;place-items:center}.cad-dp__nav:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-dp__title{display:inline-flex;gap:4px;font-weight:600;text-transform:capitalize}.cad-dp__title button{border:0;background:transparent;color:inherit;font:inherit;font-weight:600;padding:3px 6px;border-radius:6px;cursor:pointer;text-transform:capitalize}.cad-dp__title button:hover{background:var(--cad-hover)}.cad-dp__grid{display:grid;gap:2px}.cad-dp__row{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.has-week .cad-dp__row{grid-template-columns:22px repeat(7,1fr)}.cad-dp__weekdays span{font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--cad-fg-muted);text-align:center;height:22px;line-height:22px}.cad-dp__wk{font:10px var(--cad-font-mono);color:var(--cad-fg-muted);text-align:center;align-self:center}.cad-dp__day{position:relative;height:32px;border:0;border-radius:7px;background:transparent;color:var(--cad-fg);font:inherit;font-size:12.5px;cursor:pointer;font-variant-numeric:tabular-nums}.cad-dp__day:hover:not([disabled]){background:var(--cad-hover)}.cad-dp__day:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-1px}.cad-dp__day.is-out{color:var(--cad-fg-muted);opacity:.7}.cad-dp__day.is-today:after{content:\"\";position:absolute;left:50%;bottom:4px;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:var(--cad-accent)}.cad-dp__day.in-range,.cad-dp__day.is-hover-range{background:var(--cad-accent-soft);border-radius:0;color:var(--cad-fg)}.cad-dp__day.range-start{border-radius:7px 0 0 7px}.cad-dp__day.range-end{border-radius:0 7px 7px 0}.cad-dp__day.range-start.range-end{border-radius:7px}.cad-dp__day.is-sel{background:var(--cad-accent);color:var(--cad-fg-on-accent);font-weight:600}.cad-dp__day.is-sel.is-today:after{background:var(--cad-fg-on-accent)}.cad-dp__day[disabled]{color:var(--cad-fg-muted);opacity:.45;cursor:not-allowed;text-decoration:line-through}.cad-dp__cells{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.cad-dp__cells button{height:36px;border:0;border-radius:7px;background:transparent;color:var(--cad-fg);font:inherit;cursor:pointer;text-transform:capitalize}.cad-dp__cells button:hover:not([disabled]){background:var(--cad-hover)}.cad-dp__cells button.is-now{color:var(--cad-accent);font-weight:600}.cad-dp__cells button.is-sel{background:var(--cad-accent);color:var(--cad-fg-on-accent);font-weight:600}.cad-dp__cells button[disabled]{opacity:.45;cursor:not-allowed}.cad-dp__time{display:flex;align-items:center;justify-content:center;gap:4px;padding-top:8px}.cad-dp__time.has-border{border-top:1px solid var(--cad-border);margin-top:8px}.cad-dp__spin{display:flex;flex-direction:column;align-items:center}.cad-dp__spin button{width:28px;height:20px;border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;border-radius:5px}.cad-dp__spin button:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-dp__spin input{width:36px;height:28px;text-align:center;border:1px solid var(--cad-input-border);border-radius:6px;background:var(--cad-input-bg);color:var(--cad-fg);font:500 14px var(--cad-font-mono);outline:0}.cad-dp__spin input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.cad-dp__colon{font-weight:600;color:var(--cad-fg-muted)}.cad-dp__ampm{margin-left:6px;height:28px;padding:0 8px;border:1px solid var(--cad-input-border);border-radius:6px;background:transparent;color:var(--cad-fg);font:600 11px var(--cad-font);cursor:pointer}.cad-dp__bar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:8px;padding-top:8px;border-top:1px solid var(--cad-border)}.cad-dp__bar button{border:0;background:transparent;color:var(--cad-accent);font:500 12px var(--cad-font);padding:4px 8px;border-radius:6px;cursor:pointer}.cad-dp__bar button:hover{background:var(--cad-accent-soft)}.cad-dp__bar button.is-muted{color:var(--cad-fg-secondary)}.cad-dp__bar button.is-muted:hover{background:var(--cad-hover)}.cad-dp__bar button.is-ok{margin-left:auto;background:var(--cad-accent);color:var(--cad-fg-on-accent);padding:8px 18px;font-size:var(--cad-font-size)}.cad-dp__bar button.is-ok:hover{background:var(--cad-accent-hover)}.cad-dp__panel.is-sheet .cad-dp__bar button{min-height:40px}.cad-dp__count{font-size:11px;color:var(--cad-fg-muted)}\n"], dependencies: [{ kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5827
+ `, isInline: true, styles: [":host{display:inline-block;width:100%;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-inline){width:auto}.cad-dp__box{display:flex;align-items:stretch;height:var(--cad-control-h);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);transition:border-color var(--cad-dur),box-shadow var(--cad-dur);cursor:text}:host(.size-sm) .cad-dp__box{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-dp__box{height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-dp__box:focus-within,:host(.is-open) .cad-dp__box{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-dp__box{border-color:var(--cad-danger)}:host(.is-invalid) .cad-dp__box:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-dp__box{opacity:.6;background:var(--cad-bg-subtle);cursor:not-allowed}.cad-dp__input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:inherit;font:inherit;padding:0 var(--cad-control-px);font-variant-numeric:tabular-nums;cursor:inherit}.cad-dp__input::placeholder{color:var(--cad-fg-muted)}.cad-dp__btn{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:0 8px;display:grid;place-items:center}.cad-dp__btn:hover{color:var(--cad-fg)}.cad-dp__cal{padding-right:10px}.cad-dp__panel{background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);padding:10px;width:272px;box-sizing:border-box;-webkit-user-select:none;user-select:none}.cad-dp__panel.is-inline{box-shadow:none;background:var(--cad-surface)}.cad-dp__head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.cad-dp__nav{width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--cad-fg-secondary);cursor:pointer;display:grid;place-items:center}.cad-dp__nav:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-dp__title{display:inline-flex;gap:4px;font-weight:600;text-transform:capitalize}.cad-dp__title button{border:0;background:transparent;color:inherit;font:inherit;font-weight:600;padding:3px 6px;border-radius:6px;cursor:pointer;text-transform:capitalize}.cad-dp__title button:hover{background:var(--cad-hover)}.cad-dp__grid{display:grid;gap:2px}.cad-dp__row{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.has-week .cad-dp__row{grid-template-columns:22px repeat(7,1fr)}.cad-dp__weekdays span{font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--cad-fg-muted);text-align:center;height:22px;line-height:22px}.cad-dp__wk{font:10px var(--cad-font-mono);color:var(--cad-fg-muted);text-align:center;align-self:center}.cad-dp__day{position:relative;height:32px;border:0;border-radius:7px;background:transparent;color:var(--cad-fg);font:inherit;font-size:12.5px;cursor:pointer;font-variant-numeric:tabular-nums}.cad-dp__day:hover:not([disabled]){background:var(--cad-hover)}.cad-dp__day:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-1px}.cad-dp__day.is-out{color:var(--cad-fg-muted);opacity:.7}.cad-dp__day.is-today:after{content:\"\";position:absolute;left:50%;bottom:4px;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:var(--cad-accent)}.cad-dp__day.in-range,.cad-dp__day.is-hover-range{background:var(--cad-accent-soft);border-radius:0;color:var(--cad-fg)}.cad-dp__day.range-start{border-radius:7px 0 0 7px}.cad-dp__day.range-end{border-radius:0 7px 7px 0}.cad-dp__day.range-start.range-end{border-radius:7px}.cad-dp__day.is-sel{background:var(--cad-accent);color:var(--cad-fg-on-accent);font-weight:600}.cad-dp__day.is-sel.is-today:after{background:var(--cad-fg-on-accent)}.cad-dp__day[disabled]{color:var(--cad-fg-muted);opacity:.45;cursor:not-allowed;text-decoration:line-through}.cad-dp__cells{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.cad-dp__cells button{height:36px;border:0;border-radius:7px;background:transparent;color:var(--cad-fg);font:inherit;cursor:pointer;text-transform:capitalize}.cad-dp__cells button:hover:not([disabled]){background:var(--cad-hover)}.cad-dp__cells button.is-now{color:var(--cad-accent);font-weight:600}.cad-dp__cells button.is-sel{background:var(--cad-accent);color:var(--cad-fg-on-accent);font-weight:600}.cad-dp__cells button[disabled]{opacity:.45;cursor:not-allowed}.cad-dp__time{display:flex;align-items:center;justify-content:center;gap:4px;padding-top:8px}.cad-dp__time.has-border{border-top:1px solid var(--cad-border);margin-top:8px}.cad-dp__spin{display:flex;flex-direction:column;align-items:center}.cad-dp__spin button{width:28px;height:20px;border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;border-radius:5px}.cad-dp__spin button:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-dp__spin input{width:36px;height:28px;text-align:center;border:1px solid var(--cad-input-border);border-radius:6px;background:var(--cad-input-bg);color:var(--cad-fg);font:500 14px var(--cad-font-mono);outline:0}.cad-dp__spin input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.cad-dp__colon{font-weight:600;color:var(--cad-fg-muted)}.cad-dp__ampm{margin-left:6px;height:28px;padding:0 8px;border:1px solid var(--cad-input-border);border-radius:6px;background:transparent;color:var(--cad-fg);font:600 11px var(--cad-font);cursor:pointer}.cad-dp__bar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:8px;padding-top:8px;border-top:1px solid var(--cad-border)}.cad-dp__bar button{border:0;background:transparent;color:var(--cad-accent);font:500 12px var(--cad-font);padding:4px 8px;border-radius:6px;cursor:pointer}.cad-dp__bar button:hover{background:var(--cad-accent-soft)}.cad-dp__bar button.is-muted{color:var(--cad-fg-secondary)}.cad-dp__bar button.is-muted:hover{background:var(--cad-hover)}.cad-dp__bar button.is-ok{margin-left:auto;background:var(--cad-accent);color:var(--cad-fg-on-accent);padding:8px 18px;font-size:var(--cad-font-size)}.cad-dp__bar button.is-ok:hover{background:var(--cad-accent-hover)}.cad-dp__panel.is-sheet .cad-dp__bar button{min-height:40px}.cad-dp__count{font-size:11px;color:var(--cad-fg-muted)}\n"], dependencies: [{ kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5828
5828
  }
5829
5829
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadDatepickerComponent, decorators: [{
5830
5830
  type: Component,
@@ -5954,7 +5954,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
5954
5954
  </div>
5955
5955
  }
5956
5956
  </ng-template>
5957
- `, styles: [":host{display:inline-block;width:100%;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-inline){width:auto}.cad-dp__box{display:flex;align-items:stretch;height:var(--cad-control-h);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);transition:border-color var(--cad-dur),box-shadow var(--cad-dur);cursor:text}:host(.size-sm) .cad-dp__box{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-dp__box{height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-dp__box:focus-within,:host(.is-open) .cad-dp__box{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-dp__box{border-color:var(--cad-danger)}:host(.is-invalid) .cad-dp__box:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-dp__box{opacity:.6;background:var(--cad-bg-subtle);cursor:not-allowed}.cad-dp__input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:inherit;font:inherit;padding:0 var(--cad-control-px);font-variant-numeric:tabular-nums;cursor:inherit}.cad-dp__input::placeholder{color:var(--cad-fg-muted)}.cad-dp__btn{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:0 8px;display:grid;place-items:center}.cad-dp__btn:hover{color:var(--cad-fg)}.cad-dp__cal{padding-right:10px}.cad-dp__panel{background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);padding:10px;width:272px;box-sizing:border-box;-webkit-user-select:none;user-select:none}.cad-dp__panel.is-inline{box-shadow:none;background:var(--cad-surface)}.cad-dp__head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.cad-dp__nav{width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--cad-fg-secondary);cursor:pointer;display:grid;place-items:center}.cad-dp__nav:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-dp__title{display:inline-flex;gap:4px;font-weight:600;text-transform:capitalize}.cad-dp__title button{border:0;background:transparent;color:inherit;font:inherit;font-weight:600;padding:3px 6px;border-radius:6px;cursor:pointer;text-transform:capitalize}.cad-dp__title button:hover{background:var(--cad-hover)}.cad-dp__grid{display:grid;gap:2px}.cad-dp__row{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.has-week .cad-dp__row{grid-template-columns:22px repeat(7,1fr)}.cad-dp__weekdays span{font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--cad-fg-muted);text-align:center;height:22px;line-height:22px}.cad-dp__wk{font:10px var(--cad-font-mono);color:var(--cad-fg-muted);text-align:center;align-self:center}.cad-dp__day{position:relative;height:32px;border:0;border-radius:7px;background:transparent;color:var(--cad-fg);font:inherit;font-size:12.5px;cursor:pointer;font-variant-numeric:tabular-nums}.cad-dp__day:hover:not([disabled]){background:var(--cad-hover)}.cad-dp__day:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-1px}.cad-dp__day.is-out{color:var(--cad-fg-muted);opacity:.7}.cad-dp__day.is-today:after{content:\"\";position:absolute;left:50%;bottom:4px;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:var(--cad-accent)}.cad-dp__day.in-range,.cad-dp__day.is-hover-range{background:var(--cad-accent-soft);border-radius:0;color:var(--cad-fg)}.cad-dp__day.range-start{border-radius:7px 0 0 7px}.cad-dp__day.range-end{border-radius:0 7px 7px 0}.cad-dp__day.range-start.range-end{border-radius:7px}.cad-dp__day.is-sel{background:var(--cad-accent);color:var(--cad-fg-on-accent);font-weight:600}.cad-dp__day.is-sel.is-today:after{background:var(--cad-fg-on-accent)}.cad-dp__day[disabled]{color:var(--cad-fg-muted);opacity:.45;cursor:not-allowed;text-decoration:line-through}.cad-dp__cells{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.cad-dp__cells button{height:36px;border:0;border-radius:7px;background:transparent;color:var(--cad-fg);font:inherit;cursor:pointer;text-transform:capitalize}.cad-dp__cells button:hover:not([disabled]){background:var(--cad-hover)}.cad-dp__cells button.is-now{color:var(--cad-accent);font-weight:600}.cad-dp__cells button.is-sel{background:var(--cad-accent);color:var(--cad-fg-on-accent);font-weight:600}.cad-dp__cells button[disabled]{opacity:.45;cursor:not-allowed}.cad-dp__time{display:flex;align-items:center;justify-content:center;gap:4px;padding-top:8px}.cad-dp__time.has-border{border-top:1px solid var(--cad-border);margin-top:8px}.cad-dp__spin{display:flex;flex-direction:column;align-items:center}.cad-dp__spin button{width:28px;height:20px;border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;border-radius:5px}.cad-dp__spin button:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-dp__spin input{width:36px;height:28px;text-align:center;border:1px solid var(--cad-input-border);border-radius:6px;background:var(--cad-input-bg);color:var(--cad-fg);font:500 14px var(--cad-font-mono);outline:0}.cad-dp__spin input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.cad-dp__colon{font-weight:600;color:var(--cad-fg-muted)}.cad-dp__ampm{margin-left:6px;height:28px;padding:0 8px;border:1px solid var(--cad-input-border);border-radius:6px;background:transparent;color:var(--cad-fg);font:600 11px var(--cad-font);cursor:pointer}.cad-dp__bar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:8px;padding-top:8px;border-top:1px solid var(--cad-border)}.cad-dp__bar button{border:0;background:transparent;color:var(--cad-accent);font:500 12px var(--cad-font);padding:4px 8px;border-radius:6px;cursor:pointer}.cad-dp__bar button:hover{background:var(--cad-accent-soft)}.cad-dp__bar button.is-muted{color:var(--cad-fg-secondary)}.cad-dp__bar button.is-muted:hover{background:var(--cad-hover)}.cad-dp__bar button.is-ok{margin-left:auto;background:var(--cad-accent);color:var(--cad-fg-on-accent);padding:8px 18px;font-size:var(--cad-font-size)}.cad-dp__bar button.is-ok:hover{background:var(--cad-accent-hover)}.cad-dp__panel.is-sheet .cad-dp__bar button{min-height:40px}.cad-dp__count{font-size:11px;color:var(--cad-fg-muted)}\n"] }]
5957
+ `, styles: [":host{display:inline-block;width:100%;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-inline){width:auto}.cad-dp__box{display:flex;align-items:stretch;height:var(--cad-control-h);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);transition:border-color var(--cad-dur),box-shadow var(--cad-dur);cursor:text}:host(.size-sm) .cad-dp__box{height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .cad-dp__box{height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.cad-dp__box:focus-within,:host(.is-open) .cad-dp__box{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .cad-dp__box{border-color:var(--cad-danger)}:host(.is-invalid) .cad-dp__box:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .cad-dp__box{opacity:.6;background:var(--cad-bg-subtle);cursor:not-allowed}.cad-dp__input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:inherit;font:inherit;padding:0 var(--cad-control-px);font-variant-numeric:tabular-nums;cursor:inherit}.cad-dp__input::placeholder{color:var(--cad-fg-muted)}.cad-dp__btn{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:0 8px;display:grid;place-items:center}.cad-dp__btn:hover{color:var(--cad-fg)}.cad-dp__cal{padding-right:10px}.cad-dp__panel{background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg);padding:10px;width:272px;box-sizing:border-box;-webkit-user-select:none;user-select:none}.cad-dp__panel.is-inline{box-shadow:none;background:var(--cad-surface)}.cad-dp__head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.cad-dp__nav{width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--cad-fg-secondary);cursor:pointer;display:grid;place-items:center}.cad-dp__nav:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-dp__title{display:inline-flex;gap:4px;font-weight:600;text-transform:capitalize}.cad-dp__title button{border:0;background:transparent;color:inherit;font:inherit;font-weight:600;padding:3px 6px;border-radius:6px;cursor:pointer;text-transform:capitalize}.cad-dp__title button:hover{background:var(--cad-hover)}.cad-dp__grid{display:grid;gap:2px}.cad-dp__row{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.has-week .cad-dp__row{grid-template-columns:22px repeat(7,1fr)}.cad-dp__weekdays span{font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--cad-fg-muted);text-align:center;height:22px;line-height:22px}.cad-dp__wk{font:10px var(--cad-font-mono);color:var(--cad-fg-muted);text-align:center;align-self:center}.cad-dp__day{position:relative;height:32px;border:0;border-radius:7px;background:transparent;color:var(--cad-fg);font:inherit;font-size:12.5px;cursor:pointer;font-variant-numeric:tabular-nums}.cad-dp__day:hover:not([disabled]){background:var(--cad-hover)}.cad-dp__day:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-1px}.cad-dp__day.is-out{color:var(--cad-fg-muted);opacity:.7}.cad-dp__day.is-today:after{content:\"\";position:absolute;left:50%;bottom:4px;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:var(--cad-accent)}.cad-dp__day.in-range,.cad-dp__day.is-hover-range{background:var(--cad-accent-soft);border-radius:0;color:var(--cad-fg)}.cad-dp__day.range-start{border-radius:7px 0 0 7px}.cad-dp__day.range-end{border-radius:0 7px 7px 0}.cad-dp__day.range-start.range-end{border-radius:7px}.cad-dp__day.is-sel{background:var(--cad-accent);color:var(--cad-fg-on-accent);font-weight:600}.cad-dp__day.is-sel.is-today:after{background:var(--cad-fg-on-accent)}.cad-dp__day[disabled]{color:var(--cad-fg-muted);opacity:.45;cursor:not-allowed;text-decoration:line-through}.cad-dp__cells{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.cad-dp__cells button{height:36px;border:0;border-radius:7px;background:transparent;color:var(--cad-fg);font:inherit;cursor:pointer;text-transform:capitalize}.cad-dp__cells button:hover:not([disabled]){background:var(--cad-hover)}.cad-dp__cells button.is-now{color:var(--cad-accent);font-weight:600}.cad-dp__cells button.is-sel{background:var(--cad-accent);color:var(--cad-fg-on-accent);font-weight:600}.cad-dp__cells button[disabled]{opacity:.45;cursor:not-allowed}.cad-dp__time{display:flex;align-items:center;justify-content:center;gap:4px;padding-top:8px}.cad-dp__time.has-border{border-top:1px solid var(--cad-border);margin-top:8px}.cad-dp__spin{display:flex;flex-direction:column;align-items:center}.cad-dp__spin button{width:28px;height:20px;border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;border-radius:5px}.cad-dp__spin button:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-dp__spin input{width:36px;height:28px;text-align:center;border:1px solid var(--cad-input-border);border-radius:6px;background:var(--cad-input-bg);color:var(--cad-fg);font:500 14px var(--cad-font-mono);outline:0}.cad-dp__spin input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.cad-dp__colon{font-weight:600;color:var(--cad-fg-muted)}.cad-dp__ampm{margin-left:6px;height:28px;padding:0 8px;border:1px solid var(--cad-input-border);border-radius:6px;background:transparent;color:var(--cad-fg);font:600 11px var(--cad-font);cursor:pointer}.cad-dp__bar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:8px;padding-top:8px;border-top:1px solid var(--cad-border)}.cad-dp__bar button{border:0;background:transparent;color:var(--cad-accent);font:500 12px var(--cad-font);padding:4px 8px;border-radius:6px;cursor:pointer}.cad-dp__bar button:hover{background:var(--cad-accent-soft)}.cad-dp__bar button.is-muted{color:var(--cad-fg-secondary)}.cad-dp__bar button.is-muted:hover{background:var(--cad-hover)}.cad-dp__bar button.is-ok{margin-left:auto;background:var(--cad-accent);color:var(--cad-fg-on-accent);padding:8px 18px;font-size:var(--cad-font-size)}.cad-dp__bar button.is-ok:hover{background:var(--cad-accent-hover)}.cad-dp__panel.is-sheet .cad-dp__bar button{min-height:40px}.cad-dp__count{font-size:11px;color:var(--cad-fg-muted)}\n"] }]
5958
5958
  }], ctorParameters: () => [], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], dataType: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataType", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], disabledDates: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDates", required: false }] }], disabledDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDays", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }], showTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTime", required: false }] }], hourFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "hourFormat", required: false }] }], stepMinute: [{ type: i0.Input, args: [{ isSignal: true, alias: "stepMinute", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], showButtonBar: [{ type: i0.Input, args: [{ isSignal: true, alias: "showButtonBar", required: false }] }], showWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWeek", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], readonlyInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonlyInput", required: false }] }], manualInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "manualInput", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], closeOnSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnSelect", required: false }] }], mobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobile", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], monthChange: [{ type: i0.Output, args: ["monthChange"] }], yearChange: [{ type: i0.Output, args: ["yearChange"] }], cleared: [{ type: i0.Output, args: ["cleared"] }], todayClick: [{ type: i0.Output, args: ["todayClick"] }], panelTpl: [{ type: i0.ViewChild, args: ['panelTpl', { isSignal: true }] }], inp: [{ type: i0.ViewChild, args: ['inp', { isSignal: true }] }] } });
5959
5959
 
5960
5960
  /** 'sm' → var(--cad-gap-sm) ; '12px' → 12px ; 'none' → 0. */
@@ -6004,7 +6004,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
6004
6004
  }], ctorParameters: () => [], propDecorators: { cadIf: [{ type: i0.Input, args: [{ isSignal: true, alias: "cadIf", required: true }] }] } });
6005
6005
 
6006
6006
  const J = { start: 'flex-start', center: 'center', end: 'flex-end', between: 'space-between', around: 'space-around', evenly: 'space-evenly' };
6007
- const A = { stretch: 'stretch', start: 'flex-start', center: 'center', end: 'flex-end', baseline: 'baseline' };
6007
+ const A$1 = { stretch: 'stretch', start: 'flex-start', center: 'center', end: 'flex-end', baseline: 'baseline' };
6008
6008
  /** Pile verticale : `<cad-stack gap="sm" align="stretch">` — les enfants s'empilent avec un gap uniforme (jamais de marges). */
6009
6009
  class CadStackComponent {
6010
6010
  gap = input('md', ...(ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []));
@@ -6012,7 +6012,7 @@ class CadStackComponent {
6012
6012
  justify = input('start', ...(ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []));
6013
6013
  inline = input(false, { ...(ngDevMode ? { debugName: "inline" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
6014
6014
  g = computed(() => cadGap(this.gap()), ...(ngDevMode ? [{ debugName: "g" }] : /* istanbul ignore next */ []));
6015
- a = computed(() => A[this.align()], ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
6015
+ a = computed(() => A$1[this.align()], ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
6016
6016
  j = computed(() => J[this.justify()], ...(ngDevMode ? [{ debugName: "j" }] : /* istanbul ignore next */ []));
6017
6017
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadStackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6018
6018
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.20", type: CadStackComponent, isStandalone: true, selector: "cad-stack", inputs: { gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, justify: { classPropertyName: "justify", publicName: "justify", isSignal: true, isRequired: false, transformFunction: null }, inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.gap": "g()", "style.align-items": "a()", "style.justify-content": "j()", "class.is-inline": "inline()" }, classAttribute: "cad-stack" }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [":host{display:flex;flex-direction:column;min-width:0}:host(.is-inline){display:inline-flex}:host ::ng-deep>*{min-width:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -6029,7 +6029,7 @@ class CadClusterComponent {
6029
6029
  wrap = input(true, { ...(ngDevMode ? { debugName: "wrap" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
6030
6030
  inline = input(false, { ...(ngDevMode ? { debugName: "inline" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
6031
6031
  g = computed(() => cadGap(this.gap()), ...(ngDevMode ? [{ debugName: "g" }] : /* istanbul ignore next */ []));
6032
- a = computed(() => A[this.align()], ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
6032
+ a = computed(() => A$1[this.align()], ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
6033
6033
  j = computed(() => J[this.justify()], ...(ngDevMode ? [{ debugName: "j" }] : /* istanbul ignore next */ []));
6034
6034
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadClusterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6035
6035
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.20", type: CadClusterComponent, isStandalone: true, selector: "cad-cluster", inputs: { gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, justify: { classPropertyName: "justify", publicName: "justify", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null }, inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.gap": "g()", "style.align-items": "a()", "style.justify-content": "j()", "style.flex-wrap": "wrap() ? \"wrap\" : \"nowrap\"", "class.is-inline": "inline()" }, classAttribute: "cad-cluster" }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [":host{display:flex;min-width:0}:host(.is-inline){display:inline-flex}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -6054,7 +6054,7 @@ class CadGridComponent {
6054
6054
  tpl = computed(() => this.min() ? `repeat(auto-fit, minmax(min(${this.min()}, 100%), 1fr))` : `repeat(${this.c() ?? 1}, minmax(0, 1fr))`, ...(ngDevMode ? [{ debugName: "tpl" }] : /* istanbul ignore next */ []));
6055
6055
  g = computed(() => cadGap(this.gap()), ...(ngDevMode ? [{ debugName: "g" }] : /* istanbul ignore next */ []));
6056
6056
  rg = computed(() => this.rowGap() ? cadGap(this.rowGap()) : null, ...(ngDevMode ? [{ debugName: "rg" }] : /* istanbul ignore next */ []));
6057
- a = computed(() => A[this.align()], ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
6057
+ a = computed(() => A$1[this.align()], ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
6058
6058
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6059
6059
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.20", type: CadGridComponent, isStandalone: true, selector: "cad-grid", inputs: { cols: { classPropertyName: "cols", publicName: "cols", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, rowGap: { classPropertyName: "rowGap", publicName: "rowGap", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, dense: { classPropertyName: "dense", publicName: "dense", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.grid-template-columns": "tpl()", "style.gap": "g()", "style.row-gap": "rg()", "style.align-items": "a()", "style.grid-auto-flow": "dense() ? \"row dense\" : null" }, classAttribute: "cad-grid" }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [":host{display:grid;min-width:0}:host ::ng-deep>*{min-width:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6060
6060
  }
@@ -6083,7 +6083,7 @@ class CadSplitComponent {
6083
6083
  stackAt = input('sm', ...(ngDevMode ? [{ debugName: "stackAt" }] : /* istanbul ignore next */ []));
6084
6084
  tpl = computed(() => (this.stackAt() && this.bp.down(this.stackAt())) ? '1fr' : this.ratio(), ...(ngDevMode ? [{ debugName: "tpl" }] : /* istanbul ignore next */ []));
6085
6085
  g = computed(() => cadGap(this.gap()), ...(ngDevMode ? [{ debugName: "g" }] : /* istanbul ignore next */ []));
6086
- a = computed(() => A[this.align()], ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
6086
+ a = computed(() => A$1[this.align()], ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
6087
6087
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadSplitComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6088
6088
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.20", type: CadSplitComponent, isStandalone: true, selector: "cad-split", inputs: { ratio: { classPropertyName: "ratio", publicName: "ratio", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, stackAt: { classPropertyName: "stackAt", publicName: "stackAt", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.grid-template-columns": "tpl()", "style.gap": "g()", "style.align-items": "a()" }, classAttribute: "cad-split" }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [":host{display:grid;min-width:0}:host ::ng-deep>*{min-width:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6089
6089
  }
@@ -6114,7 +6114,7 @@ class CadSidebarComponent {
6114
6114
  collapseAt = input('', ...(ngDevMode ? [{ debugName: "collapseAt" }] : /* istanbul ignore next */ []));
6115
6115
  collapsed = computed(() => !!this.collapseAt() && this.bp.down(this.collapseAt()), ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
6116
6116
  g = computed(() => cadGap(this.gap()), ...(ngDevMode ? [{ debugName: "g" }] : /* istanbul ignore next */ []));
6117
- a = computed(() => A[this.align()], ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
6117
+ a = computed(() => A$1[this.align()], ...(ngDevMode ? [{ debugName: "a" }] : /* istanbul ignore next */ []));
6118
6118
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadSidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6119
6119
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.20", type: CadSidebarComponent, isStandalone: true, selector: "cad-sidebar", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, contentMin: { classPropertyName: "contentMin", publicName: "contentMin", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, collapseAt: { classPropertyName: "collapseAt", publicName: "collapseAt", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.gap": "g()", "class.side-left": "side() === \"left\"", "class.is-collapsed": "collapsed()", "style.--cad-sb-w": "width()", "style.--cad-sb-min": "contentMin()", "style.align-items": "a()" }, classAttribute: "cad-sidebar" }, ngImport: i0, template: `<ng-content />`, isInline: true, styles: [":host{display:flex;flex-wrap:wrap;min-width:0}:host ::ng-deep>*{flex-basis:0;flex-grow:999;min-inline-size:var(--cad-sb-min, 60%);min-width:0}:host ::ng-deep>.cad-sidebar__panel{flex-basis:var(--cad-sb-w, 280px);flex-grow:1;min-inline-size:0}:host(.side-left) ::ng-deep>.cad-sidebar__panel{order:-1}:host(.is-collapsed) ::ng-deep>*{flex-basis:100%!important;min-inline-size:0!important}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6120
6120
  }
@@ -6672,7 +6672,7 @@ const CAD_TABLE_STYLES = `
6672
6672
  .dt-bar__btn.is-ghost { border-color: transparent; width: 26px; padding: 0; }
6673
6673
  .dt-bar__btn.is-on { color: var(--cad-accent); background: var(--cad-accent-soft); }
6674
6674
  .dt-bar__cols { position: relative; }
6675
- .dt-bar__menu { position: absolute; right: 0; top: calc(100% + 6px); z-index: 20; min-width: 200px; max-height: 280px; overflow: auto; background: var(--cad-overlay); border: 1px solid var(--cad-border); border-radius: 9px; box-shadow: var(--cad-shadow-lg); padding: 4px; }
6675
+ .dt-bar__menu { position: absolute; right: 0; top: calc(100% + 6px); z-index: 20; min-width: 200px; max-height: 280px; overflow: auto; background: var(--cad-overlay); --cad-hover: var(--cad-overlay-hover); border: 1px solid var(--cad-border); border-radius: 9px; box-shadow: var(--cad-shadow-lg); padding: 4px; }
6676
6676
  .dt-bar__menu label { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; cursor: pointer; font-size: var(--cad-font-size); }
6677
6677
  .dt-bar__menu label:hover { background: var(--cad-hover); }
6678
6678
  .dt-bar__menu label.is-locked { opacity: .5; cursor: default; }
@@ -6869,7 +6869,7 @@ const CAD_TABLE_STYLES_3 = `
6869
6869
  :host(.is-reorderable) .tbl th.can-drag:hover .dh, :host(.is-reorderable) .tbl th.can-drag.cdk-drag-dragging .dh { display: grid; }
6870
6870
  .tbl th.cdk-drag-placeholder { opacity: .35; background: var(--cad-accent-soft); }
6871
6871
  .tbl th.cdk-drag-placeholder::before { content: ''; position: absolute; left: -1px; top: 4px; bottom: 4px; width: 2px; background: var(--cad-accent); }
6872
- .cdk-drag-preview.dt-th-preview { display: flex; align-items: center; height: 38px; padding: 0 12px; box-sizing: border-box; font: 600 var(--cad-font-size-sm) var(--cad-font); color: var(--cad-fg); background: var(--cad-overlay); border: 1px solid var(--cad-border); border-radius: 6px; box-shadow: var(--cad-shadow-lg); list-style: none; }
6872
+ .cdk-drag-preview.dt-th-preview { display: flex; align-items: center; height: 38px; padding: 0 12px; box-sizing: border-box; font: 600 var(--cad-font-size-sm) var(--cad-font); color: var(--cad-fg); background: var(--cad-overlay); --cad-hover: var(--cad-overlay-hover); border: 1px solid var(--cad-border); border-radius: 6px; box-shadow: var(--cad-shadow-lg); list-style: none; }
6873
6873
  .tbl thead tr.cdk-drop-list-dragging th:not(.cdk-drag-placeholder) { transition: transform 200ms cubic-bezier(0, 0, 0.2, 1); }
6874
6874
  .tbl th.cdk-drag-animating { transition: transform 200ms cubic-bezier(0, 0, 0.2, 1); }
6875
6875
  .dt-bar__menu .mv { display: inline-flex; gap: 0; margin-left: auto; }
@@ -6976,7 +6976,7 @@ const CAD_TABLE_STYLES_4 = `
6976
6976
  .tbl tr.dt-row.cdk-drag-placeholder { opacity: 0; }
6977
6977
  .tbl tbody.cdk-drop-list-dragging tr.dt-row:not(.cdk-drag-placeholder) { transition: transform 200ms cubic-bezier(0, 0, 0.2, 1); }
6978
6978
  .tbl tr.dt-row.cdk-drag-placeholder td { border-top: 2px solid var(--cad-accent); }
6979
- .cdk-drag-preview.dt-tr-preview { display: table; table-layout: fixed; box-sizing: border-box; background: var(--cad-overlay); border: 1px solid var(--cad-border); border-radius: 8px; box-shadow: var(--cad-shadow-lg); opacity: .95; font: var(--cad-font-size)/1.4 var(--cad-font); color: var(--cad-fg); }
6979
+ .cdk-drag-preview.dt-tr-preview { display: table; table-layout: fixed; box-sizing: border-box; background: var(--cad-overlay); --cad-hover: var(--cad-overlay-hover); border: 1px solid var(--cad-border); border-radius: 8px; box-shadow: var(--cad-shadow-lg); opacity: .95; font: var(--cad-font-size)/1.4 var(--cad-font); color: var(--cad-fg); }
6980
6980
  .cdk-drag-preview.dt-tr-preview td { padding: 0 12px; height: 42px; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
6981
6981
  :host(.is-stacked) .tbl td.col-drag { display: none; }
6982
6982
 
@@ -8728,7 +8728,7 @@ class CadMenuComponent {
8728
8728
  }
8729
8729
  </div>
8730
8730
  </ng-template>
8731
- `, isInline: true, styles: [":host{display:contents}:host(.is-inline){display:block}.cad-menu{background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);padding:4px;min-width:180px;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);box-sizing:border-box}:host(.is-inline)>.cad-menu{box-shadow:none}.cad-menu__wrap{position:relative}.cad-menu__item{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border-radius:6px;cursor:pointer;white-space:nowrap}.cad-menu__item:hover:not([disabled]),.cad-menu__item.is-active:not([disabled]){background:var(--cad-hover)}.cad-menu__item:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-2px}.cad-menu__item[disabled]{opacity:.5;cursor:not-allowed}.cad-menu__item.sev-danger{color:var(--cad-danger)}.cad-menu__item.sev-danger:hover:not([disabled]){background:var(--cad-danger-soft)}.cad-menu__ph{width:14px;flex:none}.cad-menu__label{flex:1}.cad-menu__kbd{font:11px var(--cad-font-mono);color:var(--cad-fg-muted);margin-left:16px}.cad-menu__badge{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.cad-menu__sub-ic{color:var(--cad-fg-muted);margin-left:8px}.cad-menu__sep{height:1px;background:var(--cad-border);margin:4px 6px}.cad-menu--sub{position:absolute;top:-5px;left:calc(100% + 2px);z-index:1}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8731
+ `, isInline: true, styles: [":host{display:contents}:host(.is-inline){display:block}.cad-menu{background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);padding:4px;min-width:180px;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);box-sizing:border-box}:host(.is-inline)>.cad-menu{box-shadow:none}.cad-menu__wrap{position:relative}.cad-menu__item{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border-radius:6px;cursor:pointer;white-space:nowrap}.cad-menu__item:hover:not([disabled]),.cad-menu__item.is-active:not([disabled]){background:var(--cad-hover)}.cad-menu__item:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-2px}.cad-menu__item[disabled]{opacity:.5;cursor:not-allowed}.cad-menu__item.sev-danger{color:var(--cad-danger)}.cad-menu__item.sev-danger:hover:not([disabled]){background:var(--cad-danger-soft)}.cad-menu__ph{width:14px;flex:none}.cad-menu__label{flex:1}.cad-menu__kbd{font:11px var(--cad-font-mono);color:var(--cad-fg-muted);margin-left:16px}.cad-menu__badge{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.cad-menu__sub-ic{color:var(--cad-fg-muted);margin-left:8px}.cad-menu__sep{height:1px;background:var(--cad-border);margin:4px 6px}.cad-menu--sub{position:absolute;top:-5px;left:calc(100% + 2px);z-index:1}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8732
8732
  }
8733
8733
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadMenuComponent, decorators: [{
8734
8734
  type: Component,
@@ -8768,7 +8768,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
8768
8768
  }
8769
8769
  </div>
8770
8770
  </ng-template>
8771
- `, styles: [":host{display:contents}:host(.is-inline){display:block}.cad-menu{background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);padding:4px;min-width:180px;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);box-sizing:border-box}:host(.is-inline)>.cad-menu{box-shadow:none}.cad-menu__wrap{position:relative}.cad-menu__item{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border-radius:6px;cursor:pointer;white-space:nowrap}.cad-menu__item:hover:not([disabled]),.cad-menu__item.is-active:not([disabled]){background:var(--cad-hover)}.cad-menu__item:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-2px}.cad-menu__item[disabled]{opacity:.5;cursor:not-allowed}.cad-menu__item.sev-danger{color:var(--cad-danger)}.cad-menu__item.sev-danger:hover:not([disabled]){background:var(--cad-danger-soft)}.cad-menu__ph{width:14px;flex:none}.cad-menu__label{flex:1}.cad-menu__kbd{font:11px var(--cad-font-mono);color:var(--cad-fg-muted);margin-left:16px}.cad-menu__badge{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.cad-menu__sub-ic{color:var(--cad-fg-muted);margin-left:8px}.cad-menu__sep{height:1px;background:var(--cad-border);margin:4px 6px}.cad-menu--sub{position:absolute;top:-5px;left:calc(100% + 2px);z-index:1}\n"] }]
8771
+ `, styles: [":host{display:contents}:host(.is-inline){display:block}.cad-menu{background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);padding:4px;min-width:180px;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);box-sizing:border-box}:host(.is-inline)>.cad-menu{box-shadow:none}.cad-menu__wrap{position:relative}.cad-menu__item{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border-radius:6px;cursor:pointer;white-space:nowrap}.cad-menu__item:hover:not([disabled]),.cad-menu__item.is-active:not([disabled]){background:var(--cad-hover)}.cad-menu__item:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-2px}.cad-menu__item[disabled]{opacity:.5;cursor:not-allowed}.cad-menu__item.sev-danger{color:var(--cad-danger)}.cad-menu__item.sev-danger:hover:not([disabled]){background:var(--cad-danger-soft)}.cad-menu__ph{width:14px;flex:none}.cad-menu__label{flex:1}.cad-menu__kbd{font:11px var(--cad-font-mono);color:var(--cad-fg-muted);margin-left:16px}.cad-menu__badge{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.cad-menu__sub-ic{color:var(--cad-fg-muted);margin-left:8px}.cad-menu__sep{height:1px;background:var(--cad-border);margin:4px 6px}.cad-menu--sub{position:absolute;top:-5px;left:calc(100% + 2px);z-index:1}\n"] }]
8772
8772
  }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], popup: [{ type: i0.Input, args: [{ isSignal: true, alias: "popup", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], minWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "minWidth", required: false }] }], closeOnSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnSelect", required: false }] }], mobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobile", required: false }] }], sheetTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "sheetTitle", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], shown: [{ type: i0.Output, args: ["shown"] }], hidden: [{ type: i0.Output, args: ["hidden"] }], panelTpl: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }] } });
8773
8773
 
8774
8774
  /**
@@ -8972,7 +8972,7 @@ class CadMenubarComponent {
8972
8972
  }
8973
8973
  }
8974
8974
  </ng-template>
8975
- `, isInline: true, styles: [":host{display:flex;align-items:center;gap:8px;min-height:48px;padding:0 12px;background:var(--cad-surface);border-bottom:1px solid var(--cad-border);font-family:var(--cad-font);font-size:var(--cad-font-size);position:relative}.cad-menubar__start,.cad-menubar__end{display:flex;align-items:center;gap:8px}.cad-menubar__end{margin-left:auto}.cad-menubar__list{display:flex;align-items:center;gap:2px;list-style:none;margin:0;padding:0}.cad-menubar__root{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 10px;border-radius:7px;color:var(--cad-fg-secondary);font-weight:500;cursor:pointer;position:relative;white-space:nowrap}.cad-menubar__root:hover,.cad-menubar__root.is-open{background:var(--cad-hover);color:var(--cad-fg)}.cad-menubar__root:focus-visible{outline:2px solid var(--cad-ring)}.cad-menubar__root.is-active{color:var(--cad-accent)}.cad-menubar__root.is-active:after{content:\"\";position:absolute;left:10px;right:10px;bottom:-8px;height:2px;border-radius:2px;background:var(--cad-accent)}.cad-menubar__root[disabled],.cad-menubar__root.is-disabled{opacity:.5;cursor:default}.cad-menubar__chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}.is-open .cad-menubar__chev{transform:rotate(180deg)}.cad-menubar__badge{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.cad-menubar__burger{all:unset;display:grid;place-items:center;width:36px;height:36px;border-radius:8px;color:var(--cad-fg-secondary);cursor:pointer}.cad-menubar__burger:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-menubar__mobile{position:absolute;left:0;right:0;top:100%;z-index:20;background:var(--cad-surface);border-bottom:1px solid var(--cad-border);box-shadow:var(--cad-shadow-lg);padding:6px 0;max-height:70vh;overflow:auto}.cad-menubar__mitem{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:10px;width:100%;min-height:44px;padding:0 12px;color:var(--cad-fg);cursor:pointer}.cad-menubar__mitem:hover{background:var(--cad-hover)}.cad-menubar__mitem[disabled]{opacity:.5}.cad-menubar__mlabel{flex:1}.cad-menubar__sep{height:1px;background:var(--cad-border);margin:4px 12px}.cad-menubar__mega{display:flex;gap:22px;padding:14px 16px;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg)}.cad-menubar__col{display:flex;flex-direction:column;gap:2px;min-width:160px}.cad-menubar__colh{font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);padding:4px 8px 8px}.cad-menubar__citem{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;color:var(--cad-fg);cursor:pointer;font-size:var(--cad-font-size)}.cad-menubar__citem:hover{background:var(--cad-hover)}.cad-menubar__citem:focus-visible{outline:2px solid var(--cad-ring)}.cad-menubar__citem[disabled]{opacity:.5}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadMenuComponent, selector: "cad-menu", inputs: ["items", "popup", "ariaLabel", "minWidth", "closeOnSelect", "mobile", "sheetTitle"], outputs: ["itemClick", "shown", "hidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8975
+ `, isInline: true, styles: [":host{display:flex;align-items:center;gap:8px;min-height:48px;padding:0 12px;background:var(--cad-surface);border-bottom:1px solid var(--cad-border);font-family:var(--cad-font);font-size:var(--cad-font-size);position:relative}.cad-menubar__start,.cad-menubar__end{display:flex;align-items:center;gap:8px}.cad-menubar__end{margin-left:auto}.cad-menubar__list{display:flex;align-items:center;gap:2px;list-style:none;margin:0;padding:0}.cad-menubar__root{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 10px;border-radius:7px;color:var(--cad-fg-secondary);font-weight:500;cursor:pointer;position:relative;white-space:nowrap}.cad-menubar__root:hover,.cad-menubar__root.is-open{background:var(--cad-hover);color:var(--cad-fg)}.cad-menubar__root:focus-visible{outline:2px solid var(--cad-ring)}.cad-menubar__root.is-active{color:var(--cad-accent)}.cad-menubar__root.is-active:after{content:\"\";position:absolute;left:10px;right:10px;bottom:-8px;height:2px;border-radius:2px;background:var(--cad-accent)}.cad-menubar__root[disabled],.cad-menubar__root.is-disabled{opacity:.5;cursor:default}.cad-menubar__chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}.is-open .cad-menubar__chev{transform:rotate(180deg)}.cad-menubar__badge{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.cad-menubar__burger{all:unset;display:grid;place-items:center;width:36px;height:36px;border-radius:8px;color:var(--cad-fg-secondary);cursor:pointer}.cad-menubar__burger:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-menubar__mobile{position:absolute;left:0;right:0;top:100%;z-index:20;background:var(--cad-surface);border-bottom:1px solid var(--cad-border);box-shadow:var(--cad-shadow-lg);padding:6px 0;max-height:70vh;overflow:auto}.cad-menubar__mitem{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:10px;width:100%;min-height:44px;padding:0 12px;color:var(--cad-fg);cursor:pointer}.cad-menubar__mitem:hover{background:var(--cad-hover)}.cad-menubar__mitem[disabled]{opacity:.5}.cad-menubar__mlabel{flex:1}.cad-menubar__sep{height:1px;background:var(--cad-border);margin:4px 12px}.cad-menubar__mega{display:flex;gap:22px;padding:14px 16px;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg)}.cad-menubar__col{display:flex;flex-direction:column;gap:2px;min-width:160px}.cad-menubar__colh{font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);padding:4px 8px 8px}.cad-menubar__citem{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;color:var(--cad-fg);cursor:pointer;font-size:var(--cad-font-size)}.cad-menubar__citem:hover{background:var(--cad-hover)}.cad-menubar__citem:focus-visible{outline:2px solid var(--cad-ring)}.cad-menubar__citem[disabled]{opacity:.5}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadMenuComponent, selector: "cad-menu", inputs: ["items", "popup", "ariaLabel", "minWidth", "closeOnSelect", "mobile", "sheetTitle"], outputs: ["itemClick", "shown", "hidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8976
8976
  }
8977
8977
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadMenubarComponent, decorators: [{
8978
8978
  type: Component,
@@ -9035,7 +9035,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
9035
9035
  }
9036
9036
  }
9037
9037
  </ng-template>
9038
- `, styles: [":host{display:flex;align-items:center;gap:8px;min-height:48px;padding:0 12px;background:var(--cad-surface);border-bottom:1px solid var(--cad-border);font-family:var(--cad-font);font-size:var(--cad-font-size);position:relative}.cad-menubar__start,.cad-menubar__end{display:flex;align-items:center;gap:8px}.cad-menubar__end{margin-left:auto}.cad-menubar__list{display:flex;align-items:center;gap:2px;list-style:none;margin:0;padding:0}.cad-menubar__root{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 10px;border-radius:7px;color:var(--cad-fg-secondary);font-weight:500;cursor:pointer;position:relative;white-space:nowrap}.cad-menubar__root:hover,.cad-menubar__root.is-open{background:var(--cad-hover);color:var(--cad-fg)}.cad-menubar__root:focus-visible{outline:2px solid var(--cad-ring)}.cad-menubar__root.is-active{color:var(--cad-accent)}.cad-menubar__root.is-active:after{content:\"\";position:absolute;left:10px;right:10px;bottom:-8px;height:2px;border-radius:2px;background:var(--cad-accent)}.cad-menubar__root[disabled],.cad-menubar__root.is-disabled{opacity:.5;cursor:default}.cad-menubar__chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}.is-open .cad-menubar__chev{transform:rotate(180deg)}.cad-menubar__badge{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.cad-menubar__burger{all:unset;display:grid;place-items:center;width:36px;height:36px;border-radius:8px;color:var(--cad-fg-secondary);cursor:pointer}.cad-menubar__burger:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-menubar__mobile{position:absolute;left:0;right:0;top:100%;z-index:20;background:var(--cad-surface);border-bottom:1px solid var(--cad-border);box-shadow:var(--cad-shadow-lg);padding:6px 0;max-height:70vh;overflow:auto}.cad-menubar__mitem{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:10px;width:100%;min-height:44px;padding:0 12px;color:var(--cad-fg);cursor:pointer}.cad-menubar__mitem:hover{background:var(--cad-hover)}.cad-menubar__mitem[disabled]{opacity:.5}.cad-menubar__mlabel{flex:1}.cad-menubar__sep{height:1px;background:var(--cad-border);margin:4px 12px}.cad-menubar__mega{display:flex;gap:22px;padding:14px 16px;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg)}.cad-menubar__col{display:flex;flex-direction:column;gap:2px;min-width:160px}.cad-menubar__colh{font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);padding:4px 8px 8px}.cad-menubar__citem{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;color:var(--cad-fg);cursor:pointer;font-size:var(--cad-font-size)}.cad-menubar__citem:hover{background:var(--cad-hover)}.cad-menubar__citem:focus-visible{outline:2px solid var(--cad-ring)}.cad-menubar__citem[disabled]{opacity:.5}\n"] }]
9038
+ `, styles: [":host{display:flex;align-items:center;gap:8px;min-height:48px;padding:0 12px;background:var(--cad-surface);border-bottom:1px solid var(--cad-border);font-family:var(--cad-font);font-size:var(--cad-font-size);position:relative}.cad-menubar__start,.cad-menubar__end{display:flex;align-items:center;gap:8px}.cad-menubar__end{margin-left:auto}.cad-menubar__list{display:flex;align-items:center;gap:2px;list-style:none;margin:0;padding:0}.cad-menubar__root{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;gap:6px;height:34px;padding:0 10px;border-radius:7px;color:var(--cad-fg-secondary);font-weight:500;cursor:pointer;position:relative;white-space:nowrap}.cad-menubar__root:hover,.cad-menubar__root.is-open{background:var(--cad-hover);color:var(--cad-fg)}.cad-menubar__root:focus-visible{outline:2px solid var(--cad-ring)}.cad-menubar__root.is-active{color:var(--cad-accent)}.cad-menubar__root.is-active:after{content:\"\";position:absolute;left:10px;right:10px;bottom:-8px;height:2px;border-radius:2px;background:var(--cad-accent)}.cad-menubar__root[disabled],.cad-menubar__root.is-disabled{opacity:.5;cursor:default}.cad-menubar__chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}.is-open .cad-menubar__chev{transform:rotate(180deg)}.cad-menubar__badge{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.cad-menubar__burger{all:unset;display:grid;place-items:center;width:36px;height:36px;border-radius:8px;color:var(--cad-fg-secondary);cursor:pointer}.cad-menubar__burger:hover{background:var(--cad-hover);color:var(--cad-fg)}.cad-menubar__mobile{position:absolute;left:0;right:0;top:100%;z-index:20;background:var(--cad-surface);border-bottom:1px solid var(--cad-border);box-shadow:var(--cad-shadow-lg);padding:6px 0;max-height:70vh;overflow:auto}.cad-menubar__mitem{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:10px;width:100%;min-height:44px;padding:0 12px;color:var(--cad-fg);cursor:pointer}.cad-menubar__mitem:hover{background:var(--cad-hover)}.cad-menubar__mitem[disabled]{opacity:.5}.cad-menubar__mlabel{flex:1}.cad-menubar__sep{height:1px;background:var(--cad-border);margin:4px 12px}.cad-menubar__mega{display:flex;gap:22px;padding:14px 16px;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:10px;box-shadow:var(--cad-shadow-lg)}.cad-menubar__col{display:flex;flex-direction:column;gap:2px;min-width:160px}.cad-menubar__colh{font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);padding:4px 8px 8px}.cad-menubar__citem{all:unset;box-sizing:border-box;display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;color:var(--cad-fg);cursor:pointer;font-size:var(--cad-font-size)}.cad-menubar__citem:hover{background:var(--cad-hover)}.cad-menubar__citem:focus-visible{outline:2px solid var(--cad-ring)}.cad-menubar__citem[disabled]{opacity:.5}\n"] }]
9039
9039
  }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], breakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "breakpoint", required: false }] }], openOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnHover", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], panelTpl: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }] } });
9040
9040
 
9041
9041
  /**
@@ -9284,7 +9284,7 @@ class CadBottomNavComponent {
9284
9284
  </span>
9285
9285
  @if (showLabel(it)) {<span class="cad-bottom-nav__label">{{ it.label }}</span>}
9286
9286
  </ng-template>
9287
- `, isInline: true, styles: [":host{display:block;position:sticky;bottom:0;z-index:20;background:var(--cad-overlay);border-top:1px solid var(--cad-border);padding-bottom:var(--cad-safe-bottom, env(safe-area-inset-bottom, 0px))}:host(.is-hidden){display:none}.cad-bottom-nav__list{display:flex;margin:0;padding:4px 4px 2px;list-style:none}.cad-bottom-nav__list>li{flex:1;min-width:0;display:flex}.cad-bottom-nav__item{all:unset;box-sizing:border-box;flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-height:44px;padding:5px 2px 6px;color:var(--cad-fg-muted);font:10px var(--cad-font);text-align:center;text-decoration:none;border-radius:var(--cad-radius);position:relative}.cad-bottom-nav__item:hover{color:var(--cad-fg-secondary)}.cad-bottom-nav__item:focus-visible{outline:2px solid var(--cad-accent);outline-offset:-2px}.cad-bottom-nav__item.is-active{color:var(--cad-accent)}.cad-bottom-nav__item.is-disabled,.cad-bottom-nav__item:disabled{opacity:.45;cursor:not-allowed}.cad-bottom-nav__icon{position:relative;display:grid;place-items:center;width:100%;height:26px}.cad-bottom-nav__pill{position:absolute;width:38px;height:26px;border-radius:var(--cad-radius-pill);background:transparent;transition:background var(--cad-dur) var(--cad-ease)}.cad-bottom-nav__item.is-active .cad-bottom-nav__pill{background:var(--cad-accent-soft)}.cad-bottom-nav__icon cad-icon{position:relative;z-index:1}.cad-bottom-nav__label{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3;position:relative;z-index:1}.cad-bottom-nav__item.is-active .cad-bottom-nav__label{font-weight:500}.cad-bottom-nav__badge{position:absolute;top:-2px;left:50%;margin-left:6px;z-index:2;min-width:15px;height:15px;padding:0 4px;border-radius:var(--cad-radius-pill);background:var(--cad-danger, #f85149);color:#fff;font-size:9px;font-weight:600;line-height:15px;text-align:center;border:2px solid var(--cad-overlay);box-sizing:content-box}.cad-bottom-nav__badge.is-dot{min-width:8px;height:8px;padding:0;margin-left:8px}:host-context(.cad-touch) .cad-bottom-nav__item{min-height:52px}@media(prefers-reduced-motion:reduce){.cad-bottom-nav__pill{transition:none}}\n"], dependencies: [{ kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9287
+ `, isInline: true, styles: [":host{display:block;position:sticky;bottom:0;z-index:20;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border-top:1px solid var(--cad-border);padding-bottom:var(--cad-safe-bottom, env(safe-area-inset-bottom, 0px))}:host(.is-hidden){display:none}.cad-bottom-nav__list{display:flex;margin:0;padding:4px 4px 2px;list-style:none}.cad-bottom-nav__list>li{flex:1;min-width:0;display:flex}.cad-bottom-nav__item{all:unset;box-sizing:border-box;flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-height:44px;padding:5px 2px 6px;color:var(--cad-fg-muted);font:10px var(--cad-font);text-align:center;text-decoration:none;border-radius:var(--cad-radius);position:relative}.cad-bottom-nav__item:hover{color:var(--cad-fg-secondary)}.cad-bottom-nav__item:focus-visible{outline:2px solid var(--cad-accent);outline-offset:-2px}.cad-bottom-nav__item.is-active{color:var(--cad-accent)}.cad-bottom-nav__item.is-disabled,.cad-bottom-nav__item:disabled{opacity:.45;cursor:not-allowed}.cad-bottom-nav__icon{position:relative;display:grid;place-items:center;width:100%;height:26px}.cad-bottom-nav__pill{position:absolute;width:38px;height:26px;border-radius:var(--cad-radius-pill);background:transparent;transition:background var(--cad-dur) var(--cad-ease)}.cad-bottom-nav__item.is-active .cad-bottom-nav__pill{background:var(--cad-accent-soft)}.cad-bottom-nav__icon cad-icon{position:relative;z-index:1}.cad-bottom-nav__label{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3;position:relative;z-index:1}.cad-bottom-nav__item.is-active .cad-bottom-nav__label{font-weight:500}.cad-bottom-nav__badge{position:absolute;top:-2px;left:50%;margin-left:6px;z-index:2;min-width:15px;height:15px;padding:0 4px;border-radius:var(--cad-radius-pill);background:var(--cad-danger, #f85149);color:#fff;font-size:9px;font-weight:600;line-height:15px;text-align:center;border:2px solid var(--cad-overlay);box-sizing:content-box}.cad-bottom-nav__badge.is-dot{min-width:8px;height:8px;padding:0;margin-left:8px}:host-context(.cad-touch) .cad-bottom-nav__item{min-height:52px}@media(prefers-reduced-motion:reduce){.cad-bottom-nav__pill{transition:none}}\n"], dependencies: [{ kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9288
9288
  }
9289
9289
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadBottomNavComponent, decorators: [{
9290
9290
  type: Component,
@@ -9350,7 +9350,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
9350
9350
  </span>
9351
9351
  @if (showLabel(it)) {<span class="cad-bottom-nav__label">{{ it.label }}</span>}
9352
9352
  </ng-template>
9353
- `, styles: [":host{display:block;position:sticky;bottom:0;z-index:20;background:var(--cad-overlay);border-top:1px solid var(--cad-border);padding-bottom:var(--cad-safe-bottom, env(safe-area-inset-bottom, 0px))}:host(.is-hidden){display:none}.cad-bottom-nav__list{display:flex;margin:0;padding:4px 4px 2px;list-style:none}.cad-bottom-nav__list>li{flex:1;min-width:0;display:flex}.cad-bottom-nav__item{all:unset;box-sizing:border-box;flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-height:44px;padding:5px 2px 6px;color:var(--cad-fg-muted);font:10px var(--cad-font);text-align:center;text-decoration:none;border-radius:var(--cad-radius);position:relative}.cad-bottom-nav__item:hover{color:var(--cad-fg-secondary)}.cad-bottom-nav__item:focus-visible{outline:2px solid var(--cad-accent);outline-offset:-2px}.cad-bottom-nav__item.is-active{color:var(--cad-accent)}.cad-bottom-nav__item.is-disabled,.cad-bottom-nav__item:disabled{opacity:.45;cursor:not-allowed}.cad-bottom-nav__icon{position:relative;display:grid;place-items:center;width:100%;height:26px}.cad-bottom-nav__pill{position:absolute;width:38px;height:26px;border-radius:var(--cad-radius-pill);background:transparent;transition:background var(--cad-dur) var(--cad-ease)}.cad-bottom-nav__item.is-active .cad-bottom-nav__pill{background:var(--cad-accent-soft)}.cad-bottom-nav__icon cad-icon{position:relative;z-index:1}.cad-bottom-nav__label{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3;position:relative;z-index:1}.cad-bottom-nav__item.is-active .cad-bottom-nav__label{font-weight:500}.cad-bottom-nav__badge{position:absolute;top:-2px;left:50%;margin-left:6px;z-index:2;min-width:15px;height:15px;padding:0 4px;border-radius:var(--cad-radius-pill);background:var(--cad-danger, #f85149);color:#fff;font-size:9px;font-weight:600;line-height:15px;text-align:center;border:2px solid var(--cad-overlay);box-sizing:content-box}.cad-bottom-nav__badge.is-dot{min-width:8px;height:8px;padding:0;margin-left:8px}:host-context(.cad-touch) .cad-bottom-nav__item{min-height:52px}@media(prefers-reduced-motion:reduce){.cad-bottom-nav__pill{transition:none}}\n"] }]
9353
+ `, styles: [":host{display:block;position:sticky;bottom:0;z-index:20;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border-top:1px solid var(--cad-border);padding-bottom:var(--cad-safe-bottom, env(safe-area-inset-bottom, 0px))}:host(.is-hidden){display:none}.cad-bottom-nav__list{display:flex;margin:0;padding:4px 4px 2px;list-style:none}.cad-bottom-nav__list>li{flex:1;min-width:0;display:flex}.cad-bottom-nav__item{all:unset;box-sizing:border-box;flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-height:44px;padding:5px 2px 6px;color:var(--cad-fg-muted);font:10px var(--cad-font);text-align:center;text-decoration:none;border-radius:var(--cad-radius);position:relative}.cad-bottom-nav__item:hover{color:var(--cad-fg-secondary)}.cad-bottom-nav__item:focus-visible{outline:2px solid var(--cad-accent);outline-offset:-2px}.cad-bottom-nav__item.is-active{color:var(--cad-accent)}.cad-bottom-nav__item.is-disabled,.cad-bottom-nav__item:disabled{opacity:.45;cursor:not-allowed}.cad-bottom-nav__icon{position:relative;display:grid;place-items:center;width:100%;height:26px}.cad-bottom-nav__pill{position:absolute;width:38px;height:26px;border-radius:var(--cad-radius-pill);background:transparent;transition:background var(--cad-dur) var(--cad-ease)}.cad-bottom-nav__item.is-active .cad-bottom-nav__pill{background:var(--cad-accent-soft)}.cad-bottom-nav__icon cad-icon{position:relative;z-index:1}.cad-bottom-nav__label{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3;position:relative;z-index:1}.cad-bottom-nav__item.is-active .cad-bottom-nav__label{font-weight:500}.cad-bottom-nav__badge{position:absolute;top:-2px;left:50%;margin-left:6px;z-index:2;min-width:15px;height:15px;padding:0 4px;border-radius:var(--cad-radius-pill);background:var(--cad-danger, #f85149);color:#fff;font-size:9px;font-weight:600;line-height:15px;text-align:center;border:2px solid var(--cad-overlay);box-sizing:content-box}.cad-bottom-nav__badge.is-dot{min-width:8px;height:8px;padding:0;margin-left:8px}:host-context(.cad-touch) .cad-bottom-nav__item{min-height:52px}@media(prefers-reduced-motion:reduce){.cad-bottom-nav__pill{transition:none}}\n"] }]
9354
9354
  }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], maxItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxItems", required: false }] }], breakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "breakpoint", required: false }] }], alwaysShow: [{ type: i0.Input, args: [{ isSignal: true, alias: "alwaysShow", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
9355
9355
 
9356
9356
  /**
@@ -10647,7 +10647,7 @@ class CadTableComponent extends CadTableBase {
10647
10647
  cadDownloadCsv([cols.map(c => c.header() || c.field()), ...data.map(r => cols.map(c => { const v = cadResolve(r, c.field()); return this.cellFormatter() ? this.cellFormatter()(v, c, r) : v; }))], opts.filename ?? 'export', opts.separator);
10648
10648
  }
10649
10649
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10650
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: CadTableComponent, isStandalone: true, selector: "cad-table", host: { properties: { "class.is-dense": "dense()", "class.is-striped": "striped()", "class.is-hoverable": "hoverable()", "class.is-bordered": "bordered()", "class.is-borderless": "borderless()", "class.is-sticky-header": "stickyHeader()", "class.has-scroll-height": "!!scrollHeight()", "class.is-resizable": "resizableColumns()", "class.acts-always": "rowActionsAlwaysVisible()", "class.is-loading": "loading()", "class.is-tree": "isTree()", "class.is-grouped": "isGrouped()", "class.has-tree-lines": "showTreeLines()", "class.is-stacked": "resp.stacked()", "class.hide-p2": "resp.hiddenPriorities().has(2)", "class.hide-p3": "resp.hiddenPriorities().has(3)", "class.hide-p4": "resp.hiddenPriorities().has(4)", "class.hide-p5": "resp.hiddenPriorities().has(5)", "class.is-scrolled-x": "sticky.scrolledX()", "class.is-scrolled-x-end": "sticky.scrolledXEnd()", "class.is-virtual": "virtualScroll()", "class.is-reorderable": "reorderableColumns()", "class.has-row-numbers": "showRowNumber()", "class.rows-draggable": "rowDragEnabled()", "class.has-col-menu": "hasColumnMenu()", "class.edit-cell": "editMode() === \"cell\"", "class.edit-row": "editMode() === \"row\" || editMode() === \"row-inline\"", "class.show-edit-icon": "editMode() === \"cell\" && showEditIcon()", "style.--_scroll-h": "scrollHeight() || null", "style.--_detail-pl": "detailPaddingLeft()", "style.--_indent": "indent()" }, classAttribute: "cad-table" }, viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true, isSignal: true }, { propertyName: "dtEl", first: true, predicate: ["dt"], descendants: true, isSignal: true }, { propertyName: "headerMenu", first: true, predicate: ["hmenu"], descendants: true, isSignal: true }, { propertyName: "filterMenu", first: true, predicate: ["fmenu"], descendants: true, isSignal: true }, { propertyName: "inMenu", first: true, predicate: ["inmenu"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"dt\" #dt [class]=\"'dt ' + styleClass()\">\n <!-- barre de s\u00E9lection contextuelle (remplace la barre d'outils) -->\n @if (selectedCount() > 0 && showSelectionBar()) {\n <div class=\"dt-sel\" role=\"region\" aria-live=\"polite\">\n <cad-checkbox [value]=\"allState() === 'all'\" [indeterminate]=\"allState() === 'some'\" ariaLabel=\"Tout s\u00E9lectionner\" (changed)=\"toggleAll()\"/>\n <span>{{ selectedCount() }} {{ selectedCount() > 1 ? selectedLabelPlural() : selectedLabel() }}</span>\n <span class=\"dt-sel__grow\"></span>\n <ng-content select=\"[cadTableSelectionBar]\"/>\n <button type=\"button\" class=\"dt-sel__clear\" aria-label=\"Annuler la s\u00E9lection\" (click)=\"clearSelection()\"><cad-icon name=\"x\" [size]=\"14\"/></button>\n </div>\n } @else if (showToolbar()) {\n <div class=\"dt-bar\">\n @if (title()) {<span class=\"dt-bar__title\">{{ title() }}</span>}\n @if (showCount()) {<span class=\"dt-bar__count\">{{ count() ?? totalFiltered() }}</span>}\n @if (resp.stacked()) {\n <button type=\"button\" class=\"dt-bar__btn dt-bar__filters\" [class.is-on]=\"filtersOpen()\" [attr.aria-expanded]=\"filtersOpen()\" (click)=\"filtersOpen.set(!filtersOpen())\">\n <cad-icon name=\"filter\" [size]=\"13\"/>{{ filtersLabel() }}@if (activeFilterCount() > 0) {<span class=\"dt-bar__count\">{{ activeFilterCount() }}</span>}\n </button>\n }\n <span class=\"dt-bar__tools\" [class.is-open]=\"filtersOpen()\"><ng-content select=\"[cadTableToolbar]\"/></span>\n <span class=\"dt-bar__grow\"></span>\n @if (showSearch()) {\n <div class=\"dt-bar__search\">\n <cad-icon name=\"search\" [size]=\"14\"/>\n <input type=\"search\" [placeholder]=\"searchPlaceholder()\" [value]=\"searchText()\" (input)=\"onSearch($any($event.target).value)\" [attr.aria-label]=\"searchPlaceholder()\"/>\n @if (searchText()) {<button type=\"button\" class=\"dt-bar__clear\" aria-label=\"Effacer la recherche\" (click)=\"onSearch('', true)\"><cad-icon name=\"x\" [size]=\"12\"/></button>}\n </div>\n }\n <span class=\"dt-bar__tools-end\"><ng-content select=\"[cadTableToolbarEnd]\"/></span>\n @if (columnToggle()) {\n <div class=\"dt-bar__cols\">\n <button type=\"button\" class=\"dt-bar__btn\" [class.is-on]=\"colsMenuOpen()\" aria-haspopup=\"true\" [attr.aria-expanded]=\"colsMenuOpen()\" (click)=\"colsMenuOpen.set(!colsMenuOpen())\">\n {{ columnsLabel() }} <cad-icon name=\"chevron-down\" [size]=\"12\"/>\n </button>\n @if (colsMenuOpen()) {\n <div class=\"dt-bar__menu\" role=\"menu\" (keydown.escape)=\"colsMenuOpen.set(false)\">\n <div class=\"dt-bar__menu-title\">{{ columnsLabel() }}</div>\n @for (c of orderedColumns(); track c.id(); let ci = $index; let first = $first; let last = $last) {\n <label [class.is-locked]=\"!c.toggleable()\">\n <cad-checkbox [value]=\"!c.hidden()\" [disabled]=\"!c.toggleable()\" (changed)=\"toggleColumn(c, !$event)\"/>\n <span>{{ c.header() || c.field() }}</span>\n @if (reorderableColumns()) {\n <span class=\"mv\" (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <button type=\"button\" aria-label=\"Monter\" [disabled]=\"first\" (click)=\"moveColumn(ci, ci - 1)\"><cad-icon name=\"chevron-up\" [size]=\"12\"/></button>\n <button type=\"button\" aria-label=\"Descendre\" [disabled]=\"last\" (click)=\"moveColumn(ci, ci + 1)\"><cad-icon name=\"chevron-down\" [size]=\"12\"/></button>\n </span>\n }\n </label>\n }\n </div>\n }\n </div>\n }\n @if (showDensityToggle()) {\n <button type=\"button\" class=\"dt-bar__btn is-ghost dt-bar__density\" [class.is-on]=\"dense()\" [attr.aria-pressed]=\"dense()\" aria-label=\"Densit\u00E9\" title=\"Densit\u00E9\" (click)=\"dense.set(!dense())\"><cad-icon name=\"chevrons-up-down\" [size]=\"14\"/></button>\n }\n </div>\n }\n\n @if (showGroupZone() && !resp.stacked()) {\n <div class=\"dt-gz\" [class.is-empty]=\"!groupFields().length\" cdkDropList [id]=\"gzId\" cdkDropListOrientation=\"horizontal\" [cdkDropListData]=\"groupFields()\" [cdkDropListEnterPredicate]=\"gzEnter\" (cdkDropListDropped)=\"onGroupZoneDrop($event)\">\n <cad-icon name=\"layers\" [size]=\"14\"/>\n @if (!groupFields().length) {<span class=\"dt-gz__hint\">{{ groupZoneLabel() }}</span>}\n @for (f of groupFields(); track f) {\n <span class=\"dt-gz__chip\" cdkDrag [cdkDragData]=\"f\" cdkDragLockAxis=\"x\"><cad-icon name=\"drag\" [size]=\"11\" class=\"dt-gz__drag\"/><span>{{ groupChipLabel(f) }}</span><button type=\"button\" [attr.aria-label]=\"'Ne plus grouper par ' + groupChipLabel(f)\" (click)=\"ungroup(f)\"><cad-icon name=\"x\" [size]=\"11\"/></button></span>\n }\n </div>\n }\n\n <div class=\"dt-scroll\" #scroller (scroll)=\"onScroll()\">\n @if (loading() && hasData()) {<div class=\"dt-loading\"><cad-icon name=\"loader\" [size]=\"22\" spin/></div>}\n <table class=\"tbl\" [class]=\"'tbl ' + tableClass()\" [style]=\"tableStyle()\" [attr.aria-busy]=\"loading() ? 'true' : null\" [attr.aria-rowcount]=\"totalFiltered()\" [attr.role]=\"hierarchical() ? 'treegrid' : null\">\n @if (captionTpl()) {<caption><ng-container *ngTemplateOutlet=\"captionTpl()!.tpl\"/></caption>}\n <colgroup>\n @if (hasNumberColumn()) {<col style=\"width:44px\">}\n @if (hasSelectionColumn()) {<col style=\"width:36px\">}\n @if (rowDragEnabled()) {<col style=\"width:28px\">}\n @if (hasExpandColumn()) {<col style=\"width:30px\">}\n @for (c of visibleColumns(); track c.id()) {<col [style.width]=\"colWidth(c)\" [style.min-width]=\"c.minWidth() || null\" [style.max-width]=\"c.maxWidth() || null\">}\n @if (hasActionsColumn()) {<col [style.width]=\"rowActionsWidth()\">}\n </colgroup>\n <thead>\n @if (headerGroups().length && !resp.stacked()) {\n <tr class=\"hg\">\n @if (hasNumberColumn()) {<th [class]=\"stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\"></th>}\n @if (hasSelectionColumn()) {<th [class]=\"stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\"></th>}\n @if (rowDragEnabled()) {<th [class]=\"stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"></th>}\n @if (hasExpandColumn()) {<th [class]=\"stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"></th>}\n @for (g of headerGroups(); track $index) {<th scope=\"colgroup\" [attr.colspan]=\"g.span\" [class]=\"'hg-cell ' + (g.class || '')\">{{ g.header }}</th>}\n @if (hasActionsColumn()) {<th [class]=\"stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"></th>}\n </tr>\n }\n <tr cdkDropList cdkDropListOrientation=\"horizontal\" [cdkDropListDisabled]=\"!reorderableColumns() && !showGroupZone()\" [cdkDropListSortingDisabled]=\"!reorderableColumns()\" [cdkDropListConnectedTo]=\"showGroupZone() ? [gzId] : []\" (cdkDropListDropped)=\"onColumnDrop($event)\">\n @if (hasNumberColumn()) {<th class=\"col-num\" scope=\"col\" data-sk=\"num\" [class]=\"'col-num ' + stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\">#</th>}\n @if (hasSelectionColumn()) {\n <th class=\"col-sel\" scope=\"col\" data-sk=\"sel\" [class]=\"'col-sel ' + stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\">\n @if (selectionMode() === 'multiple' && selectAll()) {\n <cad-checkbox [value]=\"allState() === 'all'\" [indeterminate]=\"allState() === 'some'\" ariaLabel=\"Tout s\u00E9lectionner\" (changed)=\"toggleAll()\"/>\n }\n </th>\n }\n @if (rowDragEnabled()) {<th class=\"col-drag\" scope=\"col\" data-sk=\"drag\" [class]=\"'col-drag ' + stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"><span hidden>D\u00E9placer</span></th>}\n @if (hasExpandColumn()) {<th class=\"col-exp\" scope=\"col\" data-sk=\"exp\" [class]=\"'col-exp ' + stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"><span hidden>D\u00E9tail</span></th>}\n @for (c of visibleColumns(); track c.id()) {\n <th scope=\"col\" [attr.data-sk]=\"c.id()\" [class]=\"thClass(c) + (canDrag(c) ? ' can-drag' : '') + (showsMenu(c) ? ' has-menu' : '') + (hasColFilter(c) ? ' is-filtered' : '')\" [attr.aria-sort]=\"ariaSort(c)\" [style.width]=\"colWidth(c)\" [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\"\n cdkDrag [cdkDragDisabled]=\"!canDrag(c)\" [cdkDragData]=\"c\" [cdkDragLockAxis]=\"showGroupZone() ? null : 'x'\" cdkDragPreviewClass=\"dt-th-preview\" [cdkDragBoundary]=\"showGroupZone() ? '' : '.tbl thead'\">\n @if (canDrag(c)) {<span class=\"dh\" cdkDragHandle aria-hidden=\"true\" title=\"D\u00E9placer la colonne\"><cad-icon name=\"drag\" [size]=\"12\"/></span>}\n @if (c.headerTpl()) {\n <ng-container *ngTemplateOutlet=\"c.headerTpl()!.tpl; context: { $implicit: c }\"/>\n } @else if (c.sortable()) {\n <button type=\"button\" class=\"hd\" (click)=\"sort(c, $event)\" [attr.aria-label]=\"'Trier par ' + c.header()\">\n <span class=\"hd-txt\">{{ c.header() }}</span>\n <cad-icon [name]=\"sortIcon(c)\" [size]=\"12\"/>\n @if (sortMode() === 'multiple' && sortIndex(c) > 0) {<span class=\"hd-idx\">{{ sortIndex(c) }}</span>}\n </button>\n } @else {\n <span class=\"hd\"><span class=\"hd-txt\">{{ c.header() }}</span></span>\n }\n @if (showsMenu(c)) {<button type=\"button\" class=\"hm\" [class.is-on]=\"menuColumn() === c && !!headerMenu()?.visible()\" aria-label=\"Menu de la colonne\" aria-haspopup=\"menu\" (click)=\"openHeaderMenu(c, $event)\" (pointerdown)=\"$event.stopPropagation()\"><cad-icon name=\"more-vertical\" [size]=\"13\"/></button>}\n @if (isResizable(c)) {<span class=\"rz\" [class.is-active]=\"resizingId() === c.id()\" (pointerdown)=\"startResize($event, c)\" aria-hidden=\"true\"></span>}\n </th>\n }\n @if (hasActionsColumn()) {<th class=\"col-acts\" scope=\"col\" data-sk=\"acts\" [class]=\"'col-acts ' + stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"><span hidden>Actions</span></th>}\n </tr>\n @if (hasFilterRow()) {\n <tr class=\"flt\">\n @if (hasNumberColumn()) {<th [class]=\"stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\"></th>}\n @if (hasSelectionColumn()) {<th [class]=\"stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\"></th>}\n @if (rowDragEnabled()) {<th [class]=\"stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"></th>}\n @if (hasExpandColumn()) {<th [class]=\"stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"></th>}\n @for (c of visibleColumns(); track c.id()) {\n <th [class]=\"stickyClass(c.id())\" [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\">\n @if (c.filterable()) {\n @if (c.filterTpl()) {\n <ng-container *ngTemplateOutlet=\"c.filterTpl()!.tpl; context: { $implicit: c, value: filterValue(c), filter: filterFn(c) }\"/>\n } @else {\n @let kind = filterKind(c);\n @let op = filterOp(c);\n <div class=\"flt-cell\" [class.is-active]=\"hasColFilter(c)\" [class.is-range]=\"op.range\">\n @if (kind === 'boolean') {\n <select [value]=\"filterValue(c) == null ? '' : '' + filterValue(c)\" (change)=\"setFilter(c, $any($event.target).value === '' ? null : $any($event.target).value === 'true')\" [attr.aria-label]=\"'Filtrer ' + c.header()\">\n <option value=\"\">{{ c.filterPlaceholder() || 'Tous' }}</option><option value=\"true\">Oui</option><option value=\"false\">Non</option>\n </select>\n } @else if (kind === 'select' && op.mode !== 'eq') {\n <button type=\"button\" class=\"flt-in\" [class.is-ph]=\"!filterArray(c).length\" [attr.aria-label]=\"'Filtrer ' + c.header()\" (click)=\"openInMenu(c, $event)\">\n <span>{{ filterArray(c).length ? filterArray(c).length + ' s\u00E9lectionn\u00E9' + (filterArray(c).length > 1 ? 's' : '') : (c.filterPlaceholder() || 'Tous') }}</span><cad-icon name=\"chevron-down\" [size]=\"11\"/>\n </button>\n } @else if (kind === 'select') {\n <select [value]=\"filterValue(c) ?? ''\" (change)=\"setFilter(c, $any($event.target).value || null, 'eq')\" [attr.aria-label]=\"'Filtrer ' + c.header()\">\n <option value=\"\">{{ c.filterPlaceholder() || 'Tous' }}</option>\n @for (o of c.filterOptions(); track $index) {<option [value]=\"o.value\" [selected]=\"o.value === filterValue(c)\">{{ o.label }}</option>}\n </select>\n } @else if (!op.needsValue) {\n <span class=\"flt-txt\">{{ op.label }}</span>\n } @else if (op.range) {\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 0)\" placeholder=\"min\" (input)=\"setFilterPart(c, 0, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header() + ' (min)'\"/>\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 1)\" placeholder=\"max\" (input)=\"setFilterPart(c, 1, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header() + ' (max)'\"/>\n } @else {\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 0)\" [placeholder]=\"c.filterPlaceholder() || op.label\" (input)=\"setFilterDebounced(c, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header()\"/>\n }\n @if (kind !== 'boolean') {\n <button type=\"button\" class=\"flt-op\" [class.is-on]=\"hasColFilter(c) || op.mode !== filterOp(c).mode\" [attr.aria-label]=\"'Op\u00E9rateur : ' + op.label\" [title]=\"op.label\" (click)=\"openFilterMenu(c, $event)\"><cad-icon name=\"filter\" [size]=\"12\"/></button>\n }\n @if (hasColFilter(c)) {<button type=\"button\" class=\"flt-x\" aria-label=\"Effacer le filtre\" (click)=\"clearColumnFilter(c)\"><cad-icon name=\"x\" [size]=\"11\"/></button>}\n </div>\n }\n }\n </th>\n }\n @if (hasActionsColumn()) {<th [class]=\"stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"></th>}\n </tr>\n }\n </thead>\n <tbody cdkDropList [cdkDropListDisabled]=\"!rowDragEnabled()\" cdkDropListLockAxis=\"y\" (cdkDropListDropped)=\"onRowDrop($event)\">\n @if (loading() && !hasData()) {\n @for (i of skeletonRows(); track i) {\n <tr class=\"dt-row is-skeleton\" aria-hidden=\"true\">\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id()) {<td [class]=\"tdClass(c)\"><div class=\"skel\" [style.width.%]=\"skeletonWidth(i, $index)\" [style.margin-left]=\"c.effectiveAlign() === 'right' ? 'auto' : null\"></div></td>}\n @if (hasActionsColumn()) {<td></td>}\n </tr>\n }\n } @else if (!displayRows().length) {\n <tr class=\"dt-empty\"><td [attr.colspan]=\"colspan()\">\n @if (emptyTpl()) {<ng-container *ngTemplateOutlet=\"emptyTpl()!.tpl\"/>}\n @else {\n <div class=\"empty\">\n @if (emptyIcon()) {<cad-icon [name]=\"emptyIcon()\" [size]=\"26\" [strokeWidth]=\"1.5\"/>}\n <b>{{ emptyMessage() }}</b>\n @if (emptyHint()) {<span>{{ emptyHint() }}</span>}\n </div>\n }\n </td></tr>\n } @else {\n @if (virtual.range().topPad > 0) {<tr class=\"dt-vpad\" aria-hidden=\"true\"><td [attr.colspan]=\"colspan()\" [style.height.px]=\"virtual.range().topPad\"></td></tr>}\n @for (d of renderRows(); track d.trackKey; let vi = $index) {\n @let i = vi + virtual.range().start;\n @if (d.kind === 'group') {\n <!-- en-t\u00EAte de groupe -->\n <tr class=\"dt-group\" [class.is-expanded]=\"d.node!.expanded\" [style.--_lvl]=\"d.level\" role=\"row\" [attr.aria-level]=\"d.level + 1\" [attr.aria-expanded]=\"d.node!.expanded\">\n <td [attr.colspan]=\"colspan()\" class=\"dt-group__cell\">\n <div class=\"dt-group__inner\">\n @if (hasSelectionColumn() && selectionMode() === 'multiple') {\n <cad-checkbox [value]=\"nodeState(d) === 'on'\" [indeterminate]=\"nodeState(d) === 'some'\" [ariaLabel]=\"'S\u00E9lectionner le groupe ' + d.node!.group!.label\" (changed)=\"toggleGroupSelection(d, $event)\"/>\n }\n <button type=\"button\" class=\"exp\" [attr.aria-expanded]=\"d.node!.expanded\" [attr.aria-label]=\"d.node!.expanded ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleGroup(d.node!)\"><cad-icon name=\"chevron-right\" [size]=\"13\"/></button>\n @if (groupHeaderTpl()) {\n <ng-container *ngTemplateOutlet=\"groupHeaderTpl()!.tpl; context: groupCtx(d)\"/>\n } @else {\n <span class=\"dt-group__label\">{{ d.node!.group!.label }}</span>\n <span class=\"dt-group__count\">{{ d.node!.group!.count }}</span>\n }\n </div>\n </td>\n </tr>\n } @else if (d.kind === 'groupFooter') {\n <!-- pied de groupe (agr\u00E9gats) -->\n <tr class=\"dt-group-foot\" [style.--_lvl]=\"d.level\">\n @if (groupFooterTpl()) {\n <td [attr.colspan]=\"colspan()\"><ng-container *ngTemplateOutlet=\"groupFooterTpl()!.tpl; context: groupCtx(d)\"/></td>\n } @else {\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id(); let ci = $index) {\n <td [class]=\"tdClass(c)\" [attr.data-l]=\"c.header()\">\n @if (ci === 0 && !hasAggregate(c)) {<span class=\"dt-group-foot__label\">Total {{ d.node!.group!.label }}</span>}\n @else if (hasAggregate(c)) {{{ formatCell(d.node!.group!.aggregates[c.field()], c) }}}\n </td>\n }\n @if (hasActionsColumn()) {<td></td>}\n }\n </tr>\n } @else if (resp.stacked() && cardTpl()) {\n <!-- carte custom (mode stack) -->\n <tr class=\"dt-row dt-card\" [class]=\"rowClasses(d.row, i, d)\" [style]=\"rowStyle()?.(d.row, i) || null\" [attr.tabindex]=\"selectionMode() ? 0 : null\" [attr.aria-selected]=\"selectionMode() ? isSelected(d.row) : null\"\n (click)=\"onRowClick(d.row, i, $event)\" (keydown)=\"onRowKey(d, i, $event)\">\n <td [attr.colspan]=\"colspan()\"><ng-container *ngTemplateOutlet=\"cardTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, node: d.node, selected: isSelected(d.row) }\"/></td>\n </tr>\n } @else {\n <!-- ligne -->\n <tr class=\"dt-row\" [class]=\"rowClasses(d.row, i, d)\" [style]=\"rowStyle()?.(d.row, i) || null\" [style.--_lvl]=\"d.level\" [attr.data-key]=\"d.key\" [class.is-editing-row]=\"isRowEditing(d.row)\"\n cdkDrag [cdkDragDisabled]=\"!canDragRow(d.row)\" [cdkDragData]=\"d.row\" cdkDragLockAxis=\"y\" cdkDragPreviewClass=\"dt-tr-preview\" cdkDragBoundary=\".tbl\"\n [attr.tabindex]=\"selectionMode() || hierarchical() ? 0 : null\" [attr.aria-selected]=\"selectionMode() ? isSelected(d.row) : null\"\n [attr.role]=\"hierarchical() ? 'row' : null\" [attr.aria-level]=\"hierarchical() ? d.level + 1 : null\" [attr.aria-expanded]=\"d.node?.hasChildren ? d.node!.expanded : null\"\n [attr.aria-setsize]=\"d.node ? d.node.setSize : null\" [attr.aria-posinset]=\"d.node ? d.node.posInSet : null\"\n (click)=\"onRowClick(d.row, i, $event)\" (dblclick)=\"rowDblClick.emit({ row: d.row, index: i, event: $event })\" (keydown)=\"onRowKey(d, i, $event)\">\n @if (hasNumberColumn()) {<td class=\"col-num\" [class]=\"'col-num ' + stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\">{{ rowNumber(d) }}</td>}\n @if (hasSelectionColumn()) {\n <td class=\"col-sel\" [class]=\"'col-sel ' + stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\">\n @if (canSelect(d.row)) {\n @if (selectionMode() === 'multiple') {\n <cad-checkbox [value]=\"nodeState(d) === 'on'\" [indeterminate]=\"nodeState(d) === 'some'\" [ariaLabel]=\"'S\u00E9lectionner la ligne ' + (i + 1)\" (changed)=\"toggleRow(d.row, i, $event)\"/>\n } @else {\n <cad-checkbox [value]=\"isSelected(d.row)\" [ariaLabel]=\"'S\u00E9lectionner la ligne ' + (i + 1)\" (changed)=\"selectSingle(d.row, i)\"/>\n }\n }\n </td>\n }\n @if (rowDragEnabled()) {\n <td class=\"col-drag\" [class]=\"'col-drag ' + stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\">\n @if (canDragRow(d.row)) {<span class=\"rdh\" cdkDragHandle title=\"D\u00E9placer la ligne\" aria-hidden=\"true\"><cad-icon name=\"drag\" [size]=\"13\"/></span>}\n </td>\n }\n @if (hasExpandColumn()) {\n <td class=\"col-exp\" [class]=\"'col-exp ' + stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\">\n @if (canExpand(d.row)) {\n <button type=\"button\" class=\"exp\" [attr.aria-expanded]=\"isExpanded(d.row)\" [attr.aria-label]=\"isExpanded(d.row) ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleExpand(d.row, $event)\"><cad-icon name=\"chevron-right\" [size]=\"13\"/></button>\n }\n </td>\n }\n @for (c of visibleColumns(); track c.id(); let cFirst = $first) {\n <td [class]=\"tdClass(c) + ' ' + stickyClass(c.id()) + (isTreeColumn(c) ? ' dt-tree-cell' : '') + (cFirst ? ' dt-first' : '') + (editUi.canEditCell(c) ? ' is-editable' : '') + (edit.isEditing(d.row, c) ? ' is-editing' : '')\"\n [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\" [attr.data-l]=\"c.header()\"\n (click)=\"editUi.onCellClick(d.row, c, $event, false)\" (dblclick)=\"editUi.onCellClick(d.row, c, $event, true)\">\n @if (edit.isEditing(d.row, c) && c.field()) {\n <!-- \u00E9diteur inline (mode cell ou row) -->\n <div class=\"dt-editor\" [class.is-invalid]=\"!!edit.cellError(d.row, c)\" (click)=\"$event.stopPropagation()\" (dblclick)=\"$event.stopPropagation()\" (keydown)=\"editUi.onKey(d.row, c, $event)\" (focusout)=\"editUi.onBlur(d.row, c)\">\n @if (c.editorTpl()) {\n <ng-container *ngTemplateOutlet=\"c.editorTpl()!.tpl; context: editUi.ctxFor(d.row, c, i)\"/>\n } @else {\n @switch (c.editor()) {\n @case ('select') {\n <select cadEditFocus [attr.aria-label]=\"c.header()\" (change)=\"editUi.onInput(d.row, c, $any($event.target).value)\">\n @for (o of c.effectiveEditorOptions(); track $index) {<option [value]=\"o.value\" [selected]=\"o.value === edit.valueOf(d.row, c)\">{{ o.label }}</option>}\n </select>\n }\n @case ('checkbox') {<input type=\"checkbox\" cadEditFocus [checked]=\"!!edit.valueOf(d.row, c)\" [attr.aria-label]=\"c.header()\" (change)=\"editUi.onInput(d.row, c, $any($event.target).checked)\"/>}\n @case ('textarea') {<textarea cadEditFocus rows=\"3\" [value]=\"edit.valueOf(d.row, c) ?? ''\" [attr.aria-label]=\"c.header()\" (input)=\"editUi.onInput(d.row, c, $any($event.target).value)\"></textarea>}\n @default {<input cadEditFocus [type]=\"editUi.inputType(c)\" [value]=\"edit.valueOf(d.row, c) ?? ''\" [attr.aria-label]=\"c.header()\" [attr.aria-invalid]=\"edit.cellError(d.row, c) ? 'true' : null\" (input)=\"editUi.onInput(d.row, c, $any($event.target).value)\"/>}\n }\n }\n @if (edit.cellError(d.row, c)) {<span class=\"dt-editor__err\" role=\"alert\">{{ edit.cellError(d.row, c) }}</span>}\n </div>\n } @else {\n @if (editUi.canEditCell(c) && showEditIcon()) {<button type=\"button\" class=\"ce\" tabindex=\"-1\" aria-label=\"Modifier\" (click)=\"$event.stopPropagation(); editUi.startEdit(d.row, c)\"><cad-icon name=\"edit\" [size]=\"11\"/></button>}\n @if (isTreeColumn(c) && d.node) {\n <span class=\"cad-tree-toggle\" [style.--_lvl]=\"d.level\">\n @if (showTreeLines()) { @for (l of levelsOf(d.level); track l) {<i class=\"tl\" aria-hidden=\"true\"></i>} }\n @else {<i class=\"ind\" aria-hidden=\"true\"></i>}\n <button type=\"button\" class=\"tg\" [class.is-leaf]=\"!d.node.hasChildren\" [class.is-open]=\"d.node.expanded\" [attr.tabindex]=\"d.node.hasChildren ? 0 : -1\"\n [attr.aria-expanded]=\"d.node.hasChildren ? d.node.expanded : null\" [attr.aria-label]=\"d.node.expanded ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleNode(d.node, $event)\">\n @if (d.node.loading) {<cad-icon name=\"loader\" [size]=\"12\" spin/>} @else {<cad-icon name=\"chevron-right\" [size]=\"13\"/>}\n </button>\n @if (treeIconOf(d.row)) {<cad-icon class=\"ic\" [name]=\"treeIconOf(d.row)!\" [size]=\"14\"/>}\n </span>\n }\n @if (c.cellTpl()) {\n <ng-container *ngTemplateOutlet=\"c.cellTpl()!.tpl; context: { $implicit: d.row, value: cell(d.row, c), rowIndex: i, column: c, level: d.level, expanded: d.node?.expanded ?? false, hasChildren: d.node?.hasChildren ?? false, node: d.node }\"/>\n } @else {<span class=\"cell-txt\">{{ formatCell(cell(d.row, c), c) }}</span>}\n }\n </td>\n }\n @if (hasActionsColumn()) {\n <td class=\"col-acts\" [class]=\"'col-acts ' + stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"><span class=\"acts\" (click)=\"$event.stopPropagation()\">\n @if ((editMode() === 'row' || editMode() === 'row-inline') && showRowEditButton()) {\n @if (isRowEditing(d.row)) {\n <button type=\"button\" class=\"re ok\" aria-label=\"Enregistrer la ligne\" title=\"Enregistrer\" (click)=\"saveRowEdit(d.row)\"><cad-icon name=\"check\" [size]=\"15\"/></button>\n <button type=\"button\" class=\"re ko\" aria-label=\"Annuler l'\u00E9dition\" title=\"Annuler\" (click)=\"cancelRowEdit(d.row)\"><cad-icon name=\"x\" [size]=\"15\"/></button>\n } @else {\n <button type=\"button\" class=\"re\" aria-label=\"Modifier la ligne\" title=\"Modifier\" (click)=\"initRowEdit(d.row)\"><cad-icon name=\"edit\" [size]=\"14\"/></button>\n }\n }\n @if (rowActionsTpl()) {<ng-container *ngTemplateOutlet=\"rowActionsTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, node: d.node, editing: isRowEditing(d.row) }\"/>}\n </span></td>\n }\n </tr>\n @if (isExpanded(d.row) && hasExpandColumn()) {\n <tr class=\"dt-detail\" [style.--_lvl]=\"d.level\"><td [attr.colspan]=\"colspan()\">\n @if (expansionTpl()) {\n <ng-container *ngTemplateOutlet=\"expansionTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, hiddenColumns: hiddenByPriority(), node: d.node }\"/>\n } @else {\n <div class=\"kv\">\n @for (c of hiddenByPriority(); track c.id()) {<div><b>{{ c.header() || c.field() }}</b>\n @if (c.cellTpl()) {<ng-container *ngTemplateOutlet=\"c.cellTpl()!.tpl; context: { $implicit: d.row, value: cell(d.row, c), rowIndex: i, column: c, level: d.level, expanded: false, hasChildren: false, node: d.node }\"/>}\n @else {{{ formatCell(cell(d.row, c), c) }}}\n </div>}\n </div>\n }\n </td></tr>\n }\n }\n }\n @if (virtual.range().bottomPad > 0) {<tr class=\"dt-vpad\" aria-hidden=\"true\"><td [attr.colspan]=\"colspan()\" [style.height.px]=\"virtual.range().bottomPad\"></td></tr>}\n }\n </tbody>\n @if (footerTpl() || showGrandTotalRow()) {\n <tfoot>\n @if (showGrandTotalRow()) {\n <tr class=\"dt-grand\">\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id(); let ci = $index) {\n <td [class]=\"tdClass(c)\" [attr.data-l]=\"c.header()\">\n @if (ci === 0 && !hasAggregate(c)) {{{ grandTotalLabel() }}}\n @else if (hasAggregate(c)) {{{ formatCell(grandTotal()[c.field()], c) }}}\n </td>\n }\n @if (hasActionsColumn()) {<td></td>}\n </tr>\n }\n @if (footerTpl()) {<ng-container *ngTemplateOutlet=\"footerTpl()!.tpl; context: { $implicit: pageData(), columns: visibleColumns(), aggregates: grandTotal() }\"/>}\n </tfoot>\n }\n </table>\n </div>\n\n @if ((usePaginator() && (paginationTotal() > 0 || lazy())) || showRowCount()) {\n <div class=\"dt-foot\" [class.has-count]=\"showRowCount()\">\n @if (showRowCount()) {\n <span class=\"dt-foot__count\">\n @if (rowCountTpl()) {<ng-container *ngTemplateOutlet=\"rowCountTpl()!.tpl; context: { $implicit: totalRows(), total: totalRows(), filtered: totalFiltered(), selected: selectedCount() }\"/>}\n @else {{{ totalRows() }} {{ rowCountLabel() }}@if (totalFiltered() !== totalRows()) { \u00B7 {{ totalFiltered() }} filtr\u00E9e{{ totalFiltered() > 1 ? 's' : '' }}}@if (selectedCount() > 0) { \u00B7 {{ selectedCount() }} s\u00E9lectionn\u00E9e{{ selectedCount() > 1 ? 's' : '' }}}}\n </span>\n }\n @if (usePaginator() && (paginationTotal() > 0 || lazy())) {\n <cad-paginator [first]=\"first()\" [rows]=\"rows()\" [totalRecords]=\"paginationTotal()\" [rowsPerPageOptions]=\"rowsPerPageOptions()\" [pageLinks]=\"resp.stacked() ? 3 : pageLinks()\"\n [showCurrentPageReport]=\"showCurrentPageReport()\" [currentPageReportTemplate]=\"currentPageReportTemplate()\" [showFirstLastIcon]=\"showFirstLastIcon()\"\n [alwaysShow]=\"alwaysShowPaginator()\" (pageChange)=\"onPage($event)\"/>\n }\n </div>\n }\n <cad-menu #hmenu popup [items]=\"menuItems()\" ariaLabel=\"Menu de la colonne\"/>\n <cad-menu #fmenu popup [items]=\"filterMenuItems()\" ariaLabel=\"Op\u00E9rateur de filtre\" [minWidth]=\"200\"/>\n <cad-menu #inmenu popup [closeOnSelect]=\"false\" [items]=\"inMenuItems()\" ariaLabel=\"Valeurs du filtre\" [minWidth]=\"180\"/>\n</div>\n", styles: [":host{--_row-h: var(--cad-table-row-h, 42px);--_cell-px: 12px;display:block;min-width:0;max-width:100%;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg)}:host(.is-dense){--_row-h: 34px}.dt{border:1px solid var(--cad-border);border-radius:var(--cad-radius-lg);background:var(--cad-surface);overflow:hidden;position:relative}:host(.is-borderless) .dt{border:0;border-radius:0}.dt-bar{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--cad-border);flex-wrap:wrap}.dt-bar__title{font-weight:600;font-size:13.5px;margin-right:4px}.dt-bar__count{font:500 11px var(--cad-font-mono);padding:2px 7px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.dt-bar__grow{flex:1}.dt-bar__search{position:relative;display:flex;align-items:center;width:240px;max-width:100%}.dt-bar__search cad-icon{position:absolute;left:9px;color:var(--cad-fg-muted);pointer-events:none}.dt-bar__search input{width:100%;box-sizing:border-box;height:30px;padding:0 28px 0 30px;font:var(--cad-font-size) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);outline:0;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.dt-bar__search input::placeholder{color:var(--cad-fg-muted)}.dt-bar__search input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.dt-bar__search .dt-bar__clear{position:absolute;right:6px;border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;padding:2px;border-radius:4px}.dt-bar__search .dt-bar__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.dt-bar__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:26px;padding:0 8px;border-radius:var(--cad-radius-sm);border:1px solid var(--cad-border-strong);background:transparent;color:var(--cad-fg-secondary);font:500 var(--cad-font-size-sm) var(--cad-font);cursor:pointer;white-space:nowrap}.dt-bar__btn:hover{background:var(--cad-hover);color:var(--cad-fg)}.dt-bar__btn:focus-visible{outline:2px solid var(--cad-ring);outline-offset:1px}.dt-bar__btn.is-ghost{border-color:transparent;width:26px;padding:0}.dt-bar__btn.is-on{color:var(--cad-accent);background:var(--cad-accent-soft)}.dt-bar__cols{position:relative}.dt-bar__menu{position:absolute;right:0;top:calc(100% + 6px);z-index:20;min-width:200px;max-height:280px;overflow:auto;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);padding:4px}.dt-bar__menu label{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:var(--cad-font-size)}.dt-bar__menu label:hover{background:var(--cad-hover)}.dt-bar__menu label.is-locked{opacity:.5;cursor:default}.dt-bar__menu-title{font:600 10px/1 var(--cad-font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--cad-fg-muted);padding:6px 8px 4px}.dt-sel{display:flex;align-items:center;gap:8px;padding:8px 12px;background:var(--cad-accent-soft);border-bottom:1px solid var(--cad-border);font-size:12.5px;color:var(--cad-accent);font-weight:500;min-height:47px;box-sizing:border-box}.dt-sel__grow{flex:1}.dt-sel__clear{border:0;background:transparent;color:inherit;cursor:pointer;display:grid;place-items:center;width:26px;height:26px;border-radius:6px}.dt-sel__clear:hover{background:var(--cad-accent-soft)}.dt-scroll{overflow:auto;position:relative}:host(.has-scroll-height) .dt-scroll{max-height:var(--_scroll-h);scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent;scrollbar-gutter:stable}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar{width:10px;height:10px}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-thumb{background:var(--cad-border-strong);border-radius:999px;border:2px solid var(--cad-surface)}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-thumb:hover{background:var(--cad-fg-muted)}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-track{background:transparent}.dt-loading{position:absolute;inset:0;display:grid;place-items:center;background:color-mix(in srgb,var(--cad-surface) 55%,transparent);z-index:5}.dt-loading cad-icon{color:var(--cad-accent)}.tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--cad-font-size)}:host(.is-resizable) .tbl{table-layout:fixed}.tbl caption{text-align:left;padding:10px 12px;font-weight:600;color:var(--cad-fg-secondary);font-size:var(--cad-font-size-sm)}.tbl th{position:relative;text-align:left;font-weight:600;font-size:var(--cad-font-size-sm);color:var(--cad-fg-secondary);background:var(--cad-bg-subtle);padding:0 var(--_cell-px);height:38px;border-bottom:1px solid var(--cad-border);white-space:nowrap;-webkit-user-select:none;user-select:none;box-sizing:border-box}:host(.is-sticky-header) .tbl thead th{position:sticky;top:0;z-index:3}.tbl th.al-right{text-align:right}.tbl th.al-center{text-align:center}.tbl th.st-left,.tbl td.st-left{position:sticky;left:0;z-index:2;background:var(--cad-surface)}.tbl th.st-right,.tbl td.st-right{position:sticky;right:0;z-index:2;background:var(--cad-surface)}.tbl th.st-left,.tbl th.st-right{background:var(--cad-bg-subtle);z-index:4}.tbl th .hd{display:inline-flex;align-items:center;gap:4px;max-width:100%}.tbl th.al-right .hd{flex-direction:row-reverse}.tbl th .hd-txt{overflow:hidden;text-overflow:ellipsis}.tbl th button.hd{all:unset;display:inline-flex;align-items:center;gap:4px;cursor:pointer;border-radius:4px;max-width:100%}.tbl th button.hd:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.tbl th .hd cad-icon{opacity:0;transition:opacity var(--cad-dur);flex:none}.tbl th:hover .hd cad-icon{opacity:.6}.tbl th.is-sorted .hd{color:var(--cad-accent)}.tbl th.is-sorted .hd cad-icon{opacity:1}.tbl th .hd-idx{font:600 9px var(--cad-font-mono);background:var(--cad-accent-soft);color:var(--cad-accent);border-radius:999px;padding:1px 4px}.tbl th .rz{position:absolute;right:0;top:8px;bottom:8px;width:5px;cursor:col-resize;z-index:1}.tbl th .rz:after{content:\"\";position:absolute;right:2px;top:0;bottom:0;width:1px;background:var(--cad-border);transition:background var(--cad-dur)}.tbl th .rz:hover:after,.tbl th .rz.is-active:after{background:var(--cad-accent);width:2px}.tbl th.col-sel,.tbl td.col-sel{width:36px;padding-right:0}.tbl th.col-exp,.tbl td.col-exp{width:30px;padding:0 4px}.tbl th.col-acts,.tbl td.col-acts{text-align:right;white-space:nowrap}.tbl tr.flt th{height:auto;padding:6px var(--_cell-px);background:var(--cad-surface);font-weight:400}.tbl tr.flt input,.tbl tr.flt select{width:100%;box-sizing:border-box;height:26px;padding:0 8px;font:var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);outline:0}.tbl tr.flt input:focus,.tbl tr.flt select:focus{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.tbl td{padding:0 var(--_cell-px);height:var(--_row-h);border-bottom:1px solid var(--cad-border);vertical-align:middle;font-variant-numeric:tabular-nums;box-sizing:border-box}.tbl td.al-right{text-align:right}.tbl td.al-center{text-align:center}.tbl td.dt-num{font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm)}.tbl td.is-nowrap{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host(.is-bordered) .tbl td,:host(.is-bordered) .tbl th{border-right:1px solid var(--cad-border)}:host(.is-bordered) .tbl td:last-child,:host(.is-bordered) .tbl th:last-child{border-right:0}.tbl tbody tr:last-child td{border-bottom:0}:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td{background:var(--cad-table-stripe, var(--cad-bg-subtle))}:host(.is-hoverable) .tbl tbody tr.dt-row:hover td{background:var(--cad-hover)}.tbl tbody tr.dt-row.is-selectable{cursor:pointer}.tbl tbody tr.dt-row:focus-visible{outline:none}.tbl tbody tr.dt-row:focus-visible td{background:var(--cad-hover);box-shadow:inset 0 0 0 1px var(--cad-ring)}.tbl tbody tr.dt-row.is-selected td{background:var(--cad-accent-soft)}.tbl tbody tr.dt-row.is-selected td:first-child{box-shadow:inset 3px 0 0 var(--cad-accent)}.tbl tbody tr.dt-row.is-selected:focus-visible td{box-shadow:inset 0 0 0 1px var(--cad-ring)}.tbl tbody tr.dt-row.is-selected:focus-visible td:first-child{box-shadow:inset 3px 0 0 var(--cad-accent),inset 0 0 0 1px var(--cad-ring)}.tbl .exp{width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0}.tbl .exp:hover{background:var(--cad-elevated);color:var(--cad-fg)}.tbl .exp:focus-visible{outline:2px solid var(--cad-ring)}.tbl .exp cad-icon{transition:transform var(--cad-dur)}.tbl tr.is-expanded .exp cad-icon{transform:rotate(90deg)}.tbl .acts{display:inline-flex;gap:2px;align-items:center;opacity:0;transition:opacity var(--cad-dur)}.tbl tr:hover .acts,.tbl tr.is-selected .acts,.tbl tr:focus-within .acts{opacity:1}:host(.acts-always) .tbl .acts{opacity:1}.tbl tr.dt-detail td{background:var(--cad-bg-subtle);height:auto;padding:12px var(--_cell-px) 14px var(--_detail-pl, 58px)}:host(.is-hoverable) .tbl tr.dt-detail:hover td{background:var(--cad-bg-subtle)}.tbl tfoot td{background:var(--cad-bg-subtle);font-weight:600;color:var(--cad-fg-secondary);border-top:1px solid var(--cad-border);border-bottom:0}.kv{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px 22px;font-size:12.5px}.kv b{display:block;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);margin-bottom:4px}.skel{height:12px;border-radius:4px;background:linear-gradient(90deg,var(--cad-elevated),var(--cad-hover),var(--cad-elevated));background-size:200% 100%;animation:cad-tbl-sh 1.4s infinite}@keyframes cad-tbl-sh{to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.skel{animation:none}.tbl .acts,.tbl .exp cad-icon,.tbl th .hd cad-icon{transition:none}}.empty{display:grid;place-items:center;gap:6px;padding:34px 12px;text-align:center;color:var(--cad-fg-secondary);font-size:12.5px}.empty cad-icon{color:var(--cad-fg-muted)}.empty b{color:var(--cad-fg);font-size:var(--cad-font-size)}.dt-foot{display:flex;align-items:center;gap:14px;padding:8px 12px;border-top:1px solid var(--cad-border)}.dt-foot cad-paginator{flex:1}\n", ".tbl th.st-left,.tbl td.st-left,.tbl th.st-right,.tbl td.st-right{position:sticky;z-index:2;background:var(--cad-surface);background-clip:padding-box}.tbl thead th.st-left,.tbl thead th.st-right{z-index:4;background:var(--cad-bg-subtle)}:host(.is-sticky-header) .tbl thead th.st-left,:host(.is-sticky-header) .tbl thead th.st-right{z-index:5}:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td.st-left,:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td.st-right{background:var(--cad-table-stripe, var(--cad-bg-subtle))}:host(.is-hoverable) .tbl tbody tr.dt-row:hover td.st-left,:host(.is-hoverable) .tbl tbody tr.dt-row:hover td.st-right{background:var(--cad-hover)}.tbl tbody tr.dt-row.is-selected td.st-left,.tbl tbody tr.dt-row.is-selected td.st-right{background:color-mix(in srgb,var(--cad-accent) 12%,var(--cad-surface))}.tbl td.st-last-left,.tbl th.st-last-left{transition:box-shadow var(--cad-dur)}:host(.is-scrolled-x) .tbl td.st-last-left,:host(.is-scrolled-x) .tbl th.st-last-left{box-shadow:1px 0 0 var(--cad-border),6px 0 12px -6px #0000002e}:host(:not(.is-scrolled-x-end)) .tbl td.st-first-right,:host(:not(.is-scrolled-x-end)) .tbl th.st-first-right{box-shadow:-1px 0 0 var(--cad-border),-6px 0 12px -6px #0000002e}.tbl td.st-right.col-acts .acts{background:inherit}.tbl td.dt-tree-cell{white-space:nowrap}.tbl td.dt-tree-cell .cell-txt{white-space:normal}.cad-tree-toggle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px}.cad-tree-toggle .ind{display:inline-block;width:calc(var(--_lvl, 0) * var(--_indent, 20px));flex:none}.cad-tree-toggle .tl{display:inline-block;width:var(--_indent, 20px);align-self:stretch;flex:none;position:relative}:host(.has-tree-lines) .tbl td.dt-tree-cell{padding-top:0;padding-bottom:0}:host(.has-tree-lines) .cad-tree-toggle{align-self:stretch;height:var(--_row-h)}:host(.has-tree-lines) .cad-tree-toggle .tl:before{content:\"\";position:absolute;left:9px;top:0;bottom:0;border-left:1px solid var(--cad-border)}.cad-tree-toggle .tg{width:20px;height:20px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0;flex:none}.cad-tree-toggle .tg:hover{background:var(--cad-elevated);color:var(--cad-fg)}.cad-tree-toggle .tg:focus-visible{outline:2px solid var(--cad-ring)}.cad-tree-toggle .tg cad-icon{transition:transform var(--cad-dur)}.cad-tree-toggle .tg.is-open cad-icon{transform:rotate(90deg)}.cad-tree-toggle .tg.is-leaf{visibility:hidden;pointer-events:none}.cad-tree-toggle .ic{color:var(--cad-fg-muted);margin:0 6px 0 2px}.tbl tr.dt-row.lvl-0.has-children td.dt-tree-cell{font-weight:500}.tbl tr.dt-group td{background:var(--cad-bg-subtle);height:34px;padding:0 var(--_cell-px);border-bottom:1px solid var(--cad-border)}.dt-group__inner{display:flex;align-items:center;gap:6px;padding-left:calc(var(--_lvl, 0) * var(--_indent, 20px));font-weight:600;font-size:var(--cad-font-size-sm)}.dt-group__inner .exp{width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0}.dt-group__inner .exp:hover{background:var(--cad-elevated);color:var(--cad-fg)}.dt-group__inner .exp cad-icon{transition:transform var(--cad-dur)}.tbl tr.dt-group.is-expanded .dt-group__inner .exp cad-icon{transform:rotate(90deg)}.dt-group__count{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.tbl tr.dt-group-foot td{background:var(--cad-bg-subtle);height:32px;color:var(--cad-fg-secondary);font-size:var(--cad-font-size-sm);border-bottom:1px solid var(--cad-border)}.tbl tr.dt-group-foot td.dt-num,.tbl tr.dt-grand td.dt-num{font-family:var(--cad-font-mono);font-weight:600}.dt-group-foot__label{padding-left:calc(var(--_lvl, 0) * var(--_indent, 20px) + 26px);font-weight:500}.tbl tfoot tr.dt-grand td{background:var(--cad-bg-subtle);font-weight:600;color:var(--cad-fg);border-top:2px solid var(--cad-border);height:36px}:host(.is-hoverable) .tbl tr.dt-group:hover td,:host(.is-hoverable) .tbl tr.dt-group-foot:hover td{background:var(--cad-bg-subtle)}.tbl tr.dt-detail td{padding-left:calc(var(--_detail-pl, 58px) + var(--_lvl, 0) * var(--_indent, 20px))}.dt-bar__tools,.dt-bar__tools-end{display:contents}.dt-bar__filters{display:inline-flex}.dt-bar__filters .dt-bar__count{padding:1px 6px;font-size:10px}:host(.is-stacked) .dt-bar{gap:8px}:host(.is-stacked) .dt-bar__tools{display:none}:host(.is-stacked) .dt-bar__tools.is-open{display:flex;flex-wrap:wrap;align-items:center;gap:8px;flex-basis:100%;order:10;padding-top:8px;border-top:1px dashed var(--cad-border)}:host(.is-stacked) .dt-bar__grow{display:none}:host(.is-stacked) .dt-bar__search{order:5;flex-basis:100%;width:100%}:host(.is-stacked) .dt-bar__cols,:host(.is-stacked) .dt-bar__density{display:none}:host(.is-stacked) .dt-sel{position:sticky;bottom:0;z-index:6;flex-wrap:wrap;border-top:1px solid var(--cad-border);order:99}:host(.is-stacked) .dt-scroll{overflow-x:hidden}:host(.is-stacked) .tbl,:host(.is-stacked) .tbl tbody,:host(.is-stacked) .tbl tfoot,:host(.is-stacked) .tbl tr,:host(.is-stacked) .tbl td{display:block}:host(.is-stacked) .tbl thead,:host(.is-stacked) .tbl colgroup,:host(.is-stacked) .tbl caption{display:none}:host(.is-stacked) .tbl tr.dt-row{position:relative;padding:10px 12px;border-bottom:1px solid var(--cad-border);height:auto}:host(.is-stacked) .tbl tr.dt-row.has-sel{padding-left:44px}:host(.is-stacked) .tbl tr.dt-row.is-selected{background:var(--cad-accent-soft);box-shadow:inset 3px 0 0 var(--cad-accent)}:host(.is-hoverable.is-stacked) .tbl tr.dt-row:hover{background:var(--cad-hover)}:host(.is-hoverable.is-stacked) .tbl tr.dt-row:hover td,:host(.is-stacked) .tbl tr.dt-row.is-selected td,:host(.is-striped.is-stacked) .tbl tr.dt-row td{background:transparent!important;box-shadow:none!important}:host(.is-stacked) .tbl tr.dt-row:focus-visible{box-shadow:inset 0 0 0 1px var(--cad-ring)}:host(.is-stacked) .tbl td{height:auto;padding:2px 0;border:0;white-space:normal;display:flex;justify-content:space-between;align-items:baseline;gap:12px;font-size:12.5px;position:static}:host(.is-stacked) .tbl td.st-left,:host(.is-stacked) .tbl td.st-right{position:static}:host(.is-stacked) .tbl td[data-l]:before{content:attr(data-l);color:var(--cad-fg-muted);font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.04em;flex:none}:host(.is-stacked) .tbl td.col-sel{position:absolute;left:12px;top:12px;padding:0;width:auto}:host(.is-stacked) .tbl td.col-sel:before,:host(.is-stacked) .tbl td.col-exp:before,:host(.is-stacked) .tbl td.col-acts:before,:host(.is-stacked) .tbl td.dt-tree-cell:before,:host(.is-stacked) .tbl td.dt-first:before{content:none}:host(.is-stacked) .tbl td.col-exp{position:absolute;right:44px;top:8px;padding:0;width:auto}:host(.is-stacked) .tbl td.dt-first,:host(.is-stacked) .tbl td.dt-tree-cell{display:block;font-size:14px;font-weight:500;padding:0 44px 6px 0}:host(.is-stacked) .tbl td.dt-tree-cell .cad-tree-toggle .ind,:host(.is-stacked) .tbl td.dt-tree-cell .cad-tree-toggle .tl{display:none}:host(.is-stacked) .tbl td.col-acts{position:absolute;right:8px;top:8px;padding:0;width:auto}:host(.is-stacked) .tbl .acts{opacity:1}:host(.is-stacked) .tbl td.dt-num{text-align:right}:host(.is-stacked) .tbl tr.dt-detail td{padding:8px 12px 10px}:host(.is-stacked) .tbl tr.dt-row.lvl-1{margin-left:22px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-row.lvl-2{margin-left:44px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-row.lvl-3{margin-left:66px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-group td{padding:8px 12px;height:auto;display:block}:host(.is-stacked) .tbl tr.dt-group-foot{display:flex;flex-wrap:wrap;gap:4px 14px;padding:6px 12px 6px 44px}:host(.is-stacked) .tbl tr.dt-group-foot td{padding:0}:host(.is-stacked) .tbl tr.dt-group-foot td:empty{display:none}:host(.is-stacked) .tbl tfoot tr.dt-grand{padding:8px 12px}:host(.is-stacked) .tbl tfoot tr.dt-grand td:empty{display:none}:host(.is-stacked) .tbl tr.dt-empty td{display:block}:host(.is-stacked) .tbl tr.is-skeleton td{display:block;padding:4px 0}:host(.is-stacked) .tbl tr.dt-card td{padding:0;display:block}:host(.is-stacked) .dt-foot{flex-wrap:wrap;gap:8px}:host(.is-stacked) .dt-foot ::ng-deep .cad-paginator__rpp{display:none}\n", ".tbl th .dh{display:none;position:absolute;left:2px;top:50%;transform:translateY(-50%);width:14px;height:18px;color:var(--cad-fg-muted);cursor:grab;border-radius:3px;place-items:center}.tbl th .dh:hover{color:var(--cad-fg);background:var(--cad-elevated)}:host(.is-reorderable) .tbl th.can-drag{padding-left:calc(var(--_cell-px) + 6px)}:host(.is-reorderable) .tbl th.can-drag:hover .dh,:host(.is-reorderable) .tbl th.can-drag.cdk-drag-dragging .dh{display:grid}.tbl th.cdk-drag-placeholder{opacity:.35;background:var(--cad-accent-soft)}.tbl th.cdk-drag-placeholder:before{content:\"\";position:absolute;left:-1px;top:4px;bottom:4px;width:2px;background:var(--cad-accent)}.cdk-drag-preview.dt-th-preview{display:flex;align-items:center;height:38px;padding:0 12px;box-sizing:border-box;font:600 var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:6px;box-shadow:var(--cad-shadow-lg);list-style:none}.tbl thead tr.cdk-drop-list-dragging th:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.tbl th.cdk-drag-animating{transition:transform .2s cubic-bezier(0,0,.2,1)}.dt-bar__menu .mv{display:inline-flex;gap:0;margin-left:auto}.dt-bar__menu .mv button{border:0;background:transparent;color:var(--cad-fg-muted);width:20px;height:20px;border-radius:4px;cursor:pointer;display:grid;place-items:center;padding:0}.dt-bar__menu .mv button:hover:not([disabled]){background:var(--cad-hover);color:var(--cad-fg)}.dt-bar__menu .mv button[disabled]{opacity:.3;cursor:default}.tbl tr.hg th{height:30px;text-align:center;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);border-bottom:1px solid var(--cad-border)}.tbl tr.hg th.hg-cell{border-left:1px solid var(--cad-border)}.tbl tr.hg th.hg-cell:first-child{border-left:0}:host(.is-sticky-header) .tbl tr.hg th{position:sticky;top:0;z-index:3}:host(.is-sticky-header) .tbl tr.hg+tr th{top:30px}.tbl tr.dt-vpad td{padding:0;border:0;height:auto}:host(.is-virtual) .dt-scroll{overflow-anchor:none}:host(.edit-cell) .tbl td.is-editable{cursor:text;position:relative}:host(.edit-cell.is-hoverable) .tbl tbody tr.dt-row td.is-editable:hover{background:var(--cad-hover);box-shadow:inset 0 0 0 1px var(--cad-border-strong)}:host(.show-edit-icon) .tbl td.is-editable{padding-right:calc(var(--_cell-px) + 16px)}.tbl td .ce{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:20px;height:20px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0;opacity:0;transition:opacity var(--cad-dur),background var(--cad-dur)}.tbl td.is-editable:hover .ce,.tbl td .ce:focus-visible{opacity:.7}.tbl td .ce:hover{opacity:1!important;background:var(--cad-elevated);color:var(--cad-fg)}.tbl td.is-editing{padding-top:0;padding-bottom:0;background:var(--cad-surface)!important;box-shadow:none!important}.dt-editor{position:relative;display:flex;align-items:stretch;min-height:calc(var(--_row-h) - 8px);margin:4px 0}.tbl td.is-editing{height:auto;vertical-align:top}.dt-editor input,.dt-editor select,.dt-editor textarea{width:100%;height:calc(var(--_row-h) - 8px);box-sizing:border-box;padding:0 8px;font:var(--cad-font-size) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-accent);border-radius:var(--cad-radius-sm);outline:0;box-shadow:0 0 0 3px var(--cad-ring)}.dt-editor input[type=number]{font-family:var(--cad-font-mono);text-align:right}.dt-editor textarea{height:auto;min-height:76px;padding:6px 8px;resize:vertical;line-height:1.45;font:var(--cad-font-size)/1.45 var(--cad-font)}.dt-editor input[type=checkbox]{width:16px;height:16px;box-shadow:none;accent-color:var(--cad-accent)}.dt-editor.is-invalid input,.dt-editor.is-invalid select,.dt-editor.is-invalid textarea{border-color:var(--cad-danger);box-shadow:0 0 0 3px var(--cad-danger-soft)}.dt-editor__err{position:absolute;left:0;top:calc(100% + 4px);z-index:6;padding:3px 8px;border-radius:6px;background:var(--cad-danger);color:#fff;font-size:11px;white-space:nowrap;box-shadow:var(--cad-shadow-md);pointer-events:none}.dt-editor__err:before{content:\"\";position:absolute;left:10px;top:-4px;width:8px;height:8px;background:inherit;transform:rotate(45deg)}:host(.edit-row) .tbl tr.dt-row.is-editing-row td{background:var(--cad-accent-soft)}.tbl .acts .re{display:inline-grid;place-items:center;width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--cad-fg-secondary);cursor:pointer;padding:0}.tbl .acts .re:hover{background:var(--cad-hover);color:var(--cad-fg)}.tbl .acts .re.ok{color:var(--cad-success)}.tbl .acts .re.ko{color:var(--cad-danger)}.tbl .acts .re:focus-visible{outline:2px solid var(--cad-ring)}:host(.edit-row) .tbl tr.is-editing-row .acts{opacity:1}\n", ".dt-scroll{scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent}.dt-scroll::-webkit-scrollbar{height:10px;width:10px}.dt-scroll::-webkit-scrollbar-thumb{background:var(--cad-border-strong);border-radius:999px;border:2px solid var(--cad-surface)}.dt-scroll::-webkit-scrollbar-thumb:hover{background:var(--cad-fg-muted)}.dt-scroll::-webkit-scrollbar-track{background:transparent}.tbl th.has-menu{padding-right:calc(var(--_cell-px) + 20px)}.tbl th .hm{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0;opacity:0;transition:opacity var(--cad-dur),background var(--cad-dur);z-index:2}.tbl th:hover .hm,.tbl th .hm:focus-visible,.tbl th .hm.is-on,.tbl th.is-sorted .hm,.tbl th.is-filtered .hm{opacity:1}.tbl th .hm:hover,.tbl th .hm.is-on{background:var(--cad-elevated);color:var(--cad-fg)}.tbl th.is-filtered .hd-txt{color:var(--cad-accent)}:host(.is-resizable) .tbl th.has-menu .hm{right:10px}.tbl tr.flt th{padding:5px 6px}.flt-cell{position:relative;display:flex;align-items:center;gap:4px;min-width:0}.flt-cell input,.flt-cell select,.flt-cell .flt-in{flex:1 1 0;min-width:0;height:28px;padding:0 26px 0 8px;box-sizing:border-box;font:var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);outline:0;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.flt-cell.is-range input{padding-right:8px}.flt-cell.is-range input:last-of-type{padding-right:26px}.flt-cell input:focus,.flt-cell select:focus,.flt-cell .flt-in:focus-visible{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.flt-cell.is-active input,.flt-cell.is-active select,.flt-cell.is-active .flt-in{border-color:var(--cad-accent);background:var(--cad-accent-soft)}.flt-cell .flt-in{display:inline-flex;align-items:center;justify-content:space-between;gap:6px;text-align:left;cursor:pointer}.flt-cell .flt-in.is-ph{color:var(--cad-fg-muted)}.flt-cell .flt-in cad-icon{color:var(--cad-fg-muted);flex:none}.flt-cell .flt-txt{flex:1;height:28px;display:inline-flex;align-items:center;padding:0 26px 0 8px;font:italic var(--cad-font-size-sm) var(--cad-font);color:var(--cad-accent);background:var(--cad-accent-soft);border:1px solid var(--cad-accent);border-radius:var(--cad-radius-sm);box-sizing:border-box}.flt-cell .flt-op{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:20px;height:20px;border:0;border-radius:4px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0}.flt-cell .flt-op:hover,.flt-cell .flt-op.is-on{color:var(--cad-accent);background:var(--cad-accent-soft)}.flt-cell.is-active .flt-op{right:22px}.flt-cell .flt-x{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:18px;height:18px;border:0;border-radius:4px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0}.flt-cell .flt-x:hover{color:var(--cad-danger);background:var(--cad-danger-soft)}.flt-cell select{appearance:none;padding-right:26px}.dt-gz{display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-height:40px;padding:6px 12px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle);color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}.dt-gz.cdk-drop-list-receiving,.dt-gz.cdk-drop-list-dragging{background:var(--cad-accent-soft);color:var(--cad-accent);outline:1px dashed var(--cad-accent);outline-offset:-4px}.dt-gz__hint{font-style:italic}.dt-gz__chip{display:inline-flex;align-items:center;gap:5px;height:26px;padding:0 4px 0 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500;cursor:grab}.dt-gz__chip .dt-gz__drag{opacity:.6}.dt-gz__chip button{width:18px;height:18px;border:0;border-radius:50%;background:transparent;color:inherit;display:grid;place-items:center;cursor:pointer;padding:0}.dt-gz__chip button:hover{background:var(--cad-accent);color:var(--cad-fg-on-accent)}.dt-gz__chip.cdk-drag-placeholder{opacity:.35}.cdk-drag-preview.dt-gz__chip{box-shadow:var(--cad-shadow-md)}:host(.is-stacked) .dt-gz{display:none}.tbl th.col-num,.tbl td.col-num{width:44px;text-align:right;font:11px var(--cad-font-mono);color:var(--cad-fg-muted);background:var(--cad-bg-subtle);padding:0 8px;-webkit-user-select:none;user-select:none}.tbl th.col-num{font-weight:600}.tbl tbody tr:hover td.col-num{background:var(--cad-bg-subtle)}:host(.is-stacked) .tbl td.col-num{position:absolute;left:auto;right:12px;bottom:6px;width:auto;background:transparent;padding:0}:host(.is-stacked) .tbl td.col-num:before{content:none}.tbl th.col-drag,.tbl td.col-drag{width:28px;padding:0 4px}.tbl td.col-drag .rdh{display:inline-grid;place-items:center;width:20px;height:24px;color:var(--cad-fg-muted);cursor:grab;opacity:0;transition:opacity var(--cad-dur);border-radius:4px}.tbl tbody tr:hover td.col-drag .rdh,.tbl tr.cdk-drag-dragging td.col-drag .rdh{opacity:.8}.tbl td.col-drag .rdh:hover{color:var(--cad-fg);background:var(--cad-elevated)}.tbl tr.dt-row.cdk-drag-placeholder{opacity:0}.tbl tbody.cdk-drop-list-dragging tr.dt-row:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.tbl tr.dt-row.cdk-drag-placeholder td{border-top:2px solid var(--cad-accent)}.cdk-drag-preview.dt-tr-preview{display:table;table-layout:fixed;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:8px;box-shadow:var(--cad-shadow-lg);opacity:.95;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg)}.cdk-drag-preview.dt-tr-preview td{padding:0 12px;height:42px;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host(.is-stacked) .tbl td.col-drag{display:none}.dt-foot__count{font:var(--cad-font-size-sm) var(--cad-font-mono);color:var(--cad-fg-secondary);white-space:nowrap}.dt-foot.has-count cad-paginator{flex:1}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadCheckboxComponent, selector: "cad-checkbox", inputs: ["label", "ariaLabel", "indeterminate", "invalid", "readonly"], outputs: ["indeterminateChange", "changed"] }, { kind: "component", type: CadPaginatorComponent, selector: "cad-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "rowsPerPageLabel", "pageLinks", "showCurrentPageReport", "currentPageReportTemplate", "showFirstLastIcon", "showPageLinks", "alwaysShow"], outputs: ["firstChange", "rowsChange", "pageChange"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: CadEditFocusDirective, selector: "[cadEditFocus]" }, { kind: "component", type: CadMenuComponent, selector: "cad-menu", inputs: ["items", "popup", "ariaLabel", "minWidth", "closeOnSelect", "mobile", "sheetTitle"], outputs: ["itemClick", "shown", "hidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10650
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: CadTableComponent, isStandalone: true, selector: "cad-table", host: { properties: { "class.is-dense": "dense()", "class.is-striped": "striped()", "class.is-hoverable": "hoverable()", "class.is-bordered": "bordered()", "class.is-borderless": "borderless()", "class.is-sticky-header": "stickyHeader()", "class.has-scroll-height": "!!scrollHeight()", "class.is-resizable": "resizableColumns()", "class.acts-always": "rowActionsAlwaysVisible()", "class.is-loading": "loading()", "class.is-tree": "isTree()", "class.is-grouped": "isGrouped()", "class.has-tree-lines": "showTreeLines()", "class.is-stacked": "resp.stacked()", "class.hide-p2": "resp.hiddenPriorities().has(2)", "class.hide-p3": "resp.hiddenPriorities().has(3)", "class.hide-p4": "resp.hiddenPriorities().has(4)", "class.hide-p5": "resp.hiddenPriorities().has(5)", "class.is-scrolled-x": "sticky.scrolledX()", "class.is-scrolled-x-end": "sticky.scrolledXEnd()", "class.is-virtual": "virtualScroll()", "class.is-reorderable": "reorderableColumns()", "class.has-row-numbers": "showRowNumber()", "class.rows-draggable": "rowDragEnabled()", "class.has-col-menu": "hasColumnMenu()", "class.edit-cell": "editMode() === \"cell\"", "class.edit-row": "editMode() === \"row\" || editMode() === \"row-inline\"", "class.show-edit-icon": "editMode() === \"cell\" && showEditIcon()", "style.--_scroll-h": "scrollHeight() || null", "style.--_detail-pl": "detailPaddingLeft()", "style.--_indent": "indent()" }, classAttribute: "cad-table" }, viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true, isSignal: true }, { propertyName: "dtEl", first: true, predicate: ["dt"], descendants: true, isSignal: true }, { propertyName: "headerMenu", first: true, predicate: ["hmenu"], descendants: true, isSignal: true }, { propertyName: "filterMenu", first: true, predicate: ["fmenu"], descendants: true, isSignal: true }, { propertyName: "inMenu", first: true, predicate: ["inmenu"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"dt\" #dt [class]=\"'dt ' + styleClass()\">\n <!-- barre de s\u00E9lection contextuelle (remplace la barre d'outils) -->\n @if (selectedCount() > 0 && showSelectionBar()) {\n <div class=\"dt-sel\" role=\"region\" aria-live=\"polite\">\n <cad-checkbox [value]=\"allState() === 'all'\" [indeterminate]=\"allState() === 'some'\" ariaLabel=\"Tout s\u00E9lectionner\" (changed)=\"toggleAll()\"/>\n <span>{{ selectedCount() }} {{ selectedCount() > 1 ? selectedLabelPlural() : selectedLabel() }}</span>\n <span class=\"dt-sel__grow\"></span>\n <ng-content select=\"[cadTableSelectionBar]\"/>\n <button type=\"button\" class=\"dt-sel__clear\" aria-label=\"Annuler la s\u00E9lection\" (click)=\"clearSelection()\"><cad-icon name=\"x\" [size]=\"14\"/></button>\n </div>\n } @else if (showToolbar()) {\n <div class=\"dt-bar\">\n @if (title()) {<span class=\"dt-bar__title\">{{ title() }}</span>}\n @if (showCount()) {<span class=\"dt-bar__count\">{{ count() ?? totalFiltered() }}</span>}\n @if (resp.stacked()) {\n <button type=\"button\" class=\"dt-bar__btn dt-bar__filters\" [class.is-on]=\"filtersOpen()\" [attr.aria-expanded]=\"filtersOpen()\" (click)=\"filtersOpen.set(!filtersOpen())\">\n <cad-icon name=\"filter\" [size]=\"13\"/>{{ filtersLabel() }}@if (activeFilterCount() > 0) {<span class=\"dt-bar__count\">{{ activeFilterCount() }}</span>}\n </button>\n }\n <span class=\"dt-bar__tools\" [class.is-open]=\"filtersOpen()\"><ng-content select=\"[cadTableToolbar]\"/></span>\n <span class=\"dt-bar__grow\"></span>\n @if (showSearch()) {\n <div class=\"dt-bar__search\">\n <cad-icon name=\"search\" [size]=\"14\"/>\n <input type=\"search\" [placeholder]=\"searchPlaceholder()\" [value]=\"searchText()\" (input)=\"onSearch($any($event.target).value)\" [attr.aria-label]=\"searchPlaceholder()\"/>\n @if (searchText()) {<button type=\"button\" class=\"dt-bar__clear\" aria-label=\"Effacer la recherche\" (click)=\"onSearch('', true)\"><cad-icon name=\"x\" [size]=\"12\"/></button>}\n </div>\n }\n <span class=\"dt-bar__tools-end\"><ng-content select=\"[cadTableToolbarEnd]\"/></span>\n @if (columnToggle()) {\n <div class=\"dt-bar__cols\">\n <button type=\"button\" class=\"dt-bar__btn\" [class.is-on]=\"colsMenuOpen()\" aria-haspopup=\"true\" [attr.aria-expanded]=\"colsMenuOpen()\" (click)=\"colsMenuOpen.set(!colsMenuOpen())\">\n {{ columnsLabel() }} <cad-icon name=\"chevron-down\" [size]=\"12\"/>\n </button>\n @if (colsMenuOpen()) {\n <div class=\"dt-bar__menu\" role=\"menu\" (keydown.escape)=\"colsMenuOpen.set(false)\">\n <div class=\"dt-bar__menu-title\">{{ columnsLabel() }}</div>\n @for (c of orderedColumns(); track c.id(); let ci = $index; let first = $first; let last = $last) {\n <label [class.is-locked]=\"!c.toggleable()\">\n <cad-checkbox [value]=\"!c.hidden()\" [disabled]=\"!c.toggleable()\" (changed)=\"toggleColumn(c, !$event)\"/>\n <span>{{ c.header() || c.field() }}</span>\n @if (reorderableColumns()) {\n <span class=\"mv\" (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <button type=\"button\" aria-label=\"Monter\" [disabled]=\"first\" (click)=\"moveColumn(ci, ci - 1)\"><cad-icon name=\"chevron-up\" [size]=\"12\"/></button>\n <button type=\"button\" aria-label=\"Descendre\" [disabled]=\"last\" (click)=\"moveColumn(ci, ci + 1)\"><cad-icon name=\"chevron-down\" [size]=\"12\"/></button>\n </span>\n }\n </label>\n }\n </div>\n }\n </div>\n }\n @if (showDensityToggle()) {\n <button type=\"button\" class=\"dt-bar__btn is-ghost dt-bar__density\" [class.is-on]=\"dense()\" [attr.aria-pressed]=\"dense()\" aria-label=\"Densit\u00E9\" title=\"Densit\u00E9\" (click)=\"dense.set(!dense())\"><cad-icon name=\"chevrons-up-down\" [size]=\"14\"/></button>\n }\n </div>\n }\n\n @if (showGroupZone() && !resp.stacked()) {\n <div class=\"dt-gz\" [class.is-empty]=\"!groupFields().length\" cdkDropList [id]=\"gzId\" cdkDropListOrientation=\"horizontal\" [cdkDropListData]=\"groupFields()\" [cdkDropListEnterPredicate]=\"gzEnter\" (cdkDropListDropped)=\"onGroupZoneDrop($event)\">\n <cad-icon name=\"layers\" [size]=\"14\"/>\n @if (!groupFields().length) {<span class=\"dt-gz__hint\">{{ groupZoneLabel() }}</span>}\n @for (f of groupFields(); track f) {\n <span class=\"dt-gz__chip\" cdkDrag [cdkDragData]=\"f\" cdkDragLockAxis=\"x\"><cad-icon name=\"drag\" [size]=\"11\" class=\"dt-gz__drag\"/><span>{{ groupChipLabel(f) }}</span><button type=\"button\" [attr.aria-label]=\"'Ne plus grouper par ' + groupChipLabel(f)\" (click)=\"ungroup(f)\"><cad-icon name=\"x\" [size]=\"11\"/></button></span>\n }\n </div>\n }\n\n <div class=\"dt-scroll\" #scroller (scroll)=\"onScroll()\">\n @if (loading() && hasData()) {<div class=\"dt-loading\"><cad-icon name=\"loader\" [size]=\"22\" spin/></div>}\n <table class=\"tbl\" [class]=\"'tbl ' + tableClass()\" [style]=\"tableStyle()\" [attr.aria-busy]=\"loading() ? 'true' : null\" [attr.aria-rowcount]=\"totalFiltered()\" [attr.role]=\"hierarchical() ? 'treegrid' : null\">\n @if (captionTpl()) {<caption><ng-container *ngTemplateOutlet=\"captionTpl()!.tpl\"/></caption>}\n <colgroup>\n @if (hasNumberColumn()) {<col style=\"width:44px\">}\n @if (hasSelectionColumn()) {<col style=\"width:36px\">}\n @if (rowDragEnabled()) {<col style=\"width:28px\">}\n @if (hasExpandColumn()) {<col style=\"width:30px\">}\n @for (c of visibleColumns(); track c.id()) {<col [style.width]=\"colWidth(c)\" [style.min-width]=\"c.minWidth() || null\" [style.max-width]=\"c.maxWidth() || null\">}\n @if (hasActionsColumn()) {<col [style.width]=\"rowActionsWidth()\">}\n </colgroup>\n <thead>\n @if (headerGroups().length && !resp.stacked()) {\n <tr class=\"hg\">\n @if (hasNumberColumn()) {<th [class]=\"stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\"></th>}\n @if (hasSelectionColumn()) {<th [class]=\"stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\"></th>}\n @if (rowDragEnabled()) {<th [class]=\"stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"></th>}\n @if (hasExpandColumn()) {<th [class]=\"stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"></th>}\n @for (g of headerGroups(); track $index) {<th scope=\"colgroup\" [attr.colspan]=\"g.span\" [class]=\"'hg-cell ' + (g.class || '')\">{{ g.header }}</th>}\n @if (hasActionsColumn()) {<th [class]=\"stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"></th>}\n </tr>\n }\n <tr cdkDropList cdkDropListOrientation=\"horizontal\" [cdkDropListDisabled]=\"!reorderableColumns() && !showGroupZone()\" [cdkDropListSortingDisabled]=\"!reorderableColumns()\" [cdkDropListConnectedTo]=\"showGroupZone() ? [gzId] : []\" (cdkDropListDropped)=\"onColumnDrop($event)\">\n @if (hasNumberColumn()) {<th class=\"col-num\" scope=\"col\" data-sk=\"num\" [class]=\"'col-num ' + stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\">#</th>}\n @if (hasSelectionColumn()) {\n <th class=\"col-sel\" scope=\"col\" data-sk=\"sel\" [class]=\"'col-sel ' + stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\">\n @if (selectionMode() === 'multiple' && selectAll()) {\n <cad-checkbox [value]=\"allState() === 'all'\" [indeterminate]=\"allState() === 'some'\" ariaLabel=\"Tout s\u00E9lectionner\" (changed)=\"toggleAll()\"/>\n }\n </th>\n }\n @if (rowDragEnabled()) {<th class=\"col-drag\" scope=\"col\" data-sk=\"drag\" [class]=\"'col-drag ' + stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"><span hidden>D\u00E9placer</span></th>}\n @if (hasExpandColumn()) {<th class=\"col-exp\" scope=\"col\" data-sk=\"exp\" [class]=\"'col-exp ' + stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"><span hidden>D\u00E9tail</span></th>}\n @for (c of visibleColumns(); track c.id()) {\n <th scope=\"col\" [attr.data-sk]=\"c.id()\" [class]=\"thClass(c) + (canDrag(c) ? ' can-drag' : '') + (showsMenu(c) ? ' has-menu' : '') + (hasColFilter(c) ? ' is-filtered' : '')\" [attr.aria-sort]=\"ariaSort(c)\" [style.width]=\"colWidth(c)\" [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\"\n cdkDrag [cdkDragDisabled]=\"!canDrag(c)\" [cdkDragData]=\"c\" [cdkDragLockAxis]=\"showGroupZone() ? null : 'x'\" cdkDragPreviewClass=\"dt-th-preview\" [cdkDragBoundary]=\"showGroupZone() ? '' : '.tbl thead'\">\n @if (canDrag(c)) {<span class=\"dh\" cdkDragHandle aria-hidden=\"true\" title=\"D\u00E9placer la colonne\"><cad-icon name=\"drag\" [size]=\"12\"/></span>}\n @if (c.headerTpl()) {\n <ng-container *ngTemplateOutlet=\"c.headerTpl()!.tpl; context: { $implicit: c }\"/>\n } @else if (c.sortable()) {\n <button type=\"button\" class=\"hd\" (click)=\"sort(c, $event)\" [attr.aria-label]=\"'Trier par ' + c.header()\">\n <span class=\"hd-txt\">{{ c.header() }}</span>\n <cad-icon [name]=\"sortIcon(c)\" [size]=\"12\"/>\n @if (sortMode() === 'multiple' && sortIndex(c) > 0) {<span class=\"hd-idx\">{{ sortIndex(c) }}</span>}\n </button>\n } @else {\n <span class=\"hd\"><span class=\"hd-txt\">{{ c.header() }}</span></span>\n }\n @if (showsMenu(c)) {<button type=\"button\" class=\"hm\" [class.is-on]=\"menuColumn() === c && !!headerMenu()?.visible()\" aria-label=\"Menu de la colonne\" aria-haspopup=\"menu\" (click)=\"openHeaderMenu(c, $event)\" (pointerdown)=\"$event.stopPropagation()\"><cad-icon name=\"more-vertical\" [size]=\"13\"/></button>}\n @if (isResizable(c)) {<span class=\"rz\" [class.is-active]=\"resizingId() === c.id()\" (pointerdown)=\"startResize($event, c)\" aria-hidden=\"true\"></span>}\n </th>\n }\n @if (hasActionsColumn()) {<th class=\"col-acts\" scope=\"col\" data-sk=\"acts\" [class]=\"'col-acts ' + stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"><span hidden>Actions</span></th>}\n </tr>\n @if (hasFilterRow()) {\n <tr class=\"flt\">\n @if (hasNumberColumn()) {<th [class]=\"stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\"></th>}\n @if (hasSelectionColumn()) {<th [class]=\"stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\"></th>}\n @if (rowDragEnabled()) {<th [class]=\"stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"></th>}\n @if (hasExpandColumn()) {<th [class]=\"stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"></th>}\n @for (c of visibleColumns(); track c.id()) {\n <th [class]=\"stickyClass(c.id())\" [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\">\n @if (c.filterable()) {\n @if (c.filterTpl()) {\n <ng-container *ngTemplateOutlet=\"c.filterTpl()!.tpl; context: { $implicit: c, value: filterValue(c), filter: filterFn(c) }\"/>\n } @else {\n @let kind = filterKind(c);\n @let op = filterOp(c);\n <div class=\"flt-cell\" [class.is-active]=\"hasColFilter(c)\" [class.is-range]=\"op.range\">\n @if (kind === 'boolean') {\n <select [value]=\"filterValue(c) == null ? '' : '' + filterValue(c)\" (change)=\"setFilter(c, $any($event.target).value === '' ? null : $any($event.target).value === 'true')\" [attr.aria-label]=\"'Filtrer ' + c.header()\">\n <option value=\"\">{{ c.filterPlaceholder() || 'Tous' }}</option><option value=\"true\">Oui</option><option value=\"false\">Non</option>\n </select>\n } @else if (kind === 'select' && op.mode !== 'eq') {\n <button type=\"button\" class=\"flt-in\" [class.is-ph]=\"!filterArray(c).length\" [attr.aria-label]=\"'Filtrer ' + c.header()\" (click)=\"openInMenu(c, $event)\">\n <span>{{ filterArray(c).length ? filterArray(c).length + ' s\u00E9lectionn\u00E9' + (filterArray(c).length > 1 ? 's' : '') : (c.filterPlaceholder() || 'Tous') }}</span><cad-icon name=\"chevron-down\" [size]=\"11\"/>\n </button>\n } @else if (kind === 'select') {\n <select [value]=\"filterValue(c) ?? ''\" (change)=\"setFilter(c, $any($event.target).value || null, 'eq')\" [attr.aria-label]=\"'Filtrer ' + c.header()\">\n <option value=\"\">{{ c.filterPlaceholder() || 'Tous' }}</option>\n @for (o of c.filterOptions(); track $index) {<option [value]=\"o.value\" [selected]=\"o.value === filterValue(c)\">{{ o.label }}</option>}\n </select>\n } @else if (!op.needsValue) {\n <span class=\"flt-txt\">{{ op.label }}</span>\n } @else if (op.range) {\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 0)\" placeholder=\"min\" (input)=\"setFilterPart(c, 0, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header() + ' (min)'\"/>\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 1)\" placeholder=\"max\" (input)=\"setFilterPart(c, 1, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header() + ' (max)'\"/>\n } @else {\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 0)\" [placeholder]=\"c.filterPlaceholder() || op.label\" (input)=\"setFilterDebounced(c, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header()\"/>\n }\n @if (kind !== 'boolean') {\n <button type=\"button\" class=\"flt-op\" [class.is-on]=\"hasColFilter(c) || op.mode !== filterOp(c).mode\" [attr.aria-label]=\"'Op\u00E9rateur : ' + op.label\" [title]=\"op.label\" (click)=\"openFilterMenu(c, $event)\"><cad-icon name=\"filter\" [size]=\"12\"/></button>\n }\n @if (hasColFilter(c)) {<button type=\"button\" class=\"flt-x\" aria-label=\"Effacer le filtre\" (click)=\"clearColumnFilter(c)\"><cad-icon name=\"x\" [size]=\"11\"/></button>}\n </div>\n }\n }\n </th>\n }\n @if (hasActionsColumn()) {<th [class]=\"stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"></th>}\n </tr>\n }\n </thead>\n <tbody cdkDropList [cdkDropListDisabled]=\"!rowDragEnabled()\" cdkDropListLockAxis=\"y\" (cdkDropListDropped)=\"onRowDrop($event)\">\n @if (loading() && !hasData()) {\n @for (i of skeletonRows(); track i) {\n <tr class=\"dt-row is-skeleton\" aria-hidden=\"true\">\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id()) {<td [class]=\"tdClass(c)\"><div class=\"skel\" [style.width.%]=\"skeletonWidth(i, $index)\" [style.margin-left]=\"c.effectiveAlign() === 'right' ? 'auto' : null\"></div></td>}\n @if (hasActionsColumn()) {<td></td>}\n </tr>\n }\n } @else if (!displayRows().length) {\n <tr class=\"dt-empty\"><td [attr.colspan]=\"colspan()\">\n @if (emptyTpl()) {<ng-container *ngTemplateOutlet=\"emptyTpl()!.tpl\"/>}\n @else {\n <div class=\"empty\">\n @if (emptyIcon()) {<cad-icon [name]=\"emptyIcon()\" [size]=\"26\" [strokeWidth]=\"1.5\"/>}\n <b>{{ emptyMessage() }}</b>\n @if (emptyHint()) {<span>{{ emptyHint() }}</span>}\n </div>\n }\n </td></tr>\n } @else {\n @if (virtual.range().topPad > 0) {<tr class=\"dt-vpad\" aria-hidden=\"true\"><td [attr.colspan]=\"colspan()\" [style.height.px]=\"virtual.range().topPad\"></td></tr>}\n @for (d of renderRows(); track d.trackKey; let vi = $index) {\n @let i = vi + virtual.range().start;\n @if (d.kind === 'group') {\n <!-- en-t\u00EAte de groupe -->\n <tr class=\"dt-group\" [class.is-expanded]=\"d.node!.expanded\" [style.--_lvl]=\"d.level\" role=\"row\" [attr.aria-level]=\"d.level + 1\" [attr.aria-expanded]=\"d.node!.expanded\">\n <td [attr.colspan]=\"colspan()\" class=\"dt-group__cell\">\n <div class=\"dt-group__inner\">\n @if (hasSelectionColumn() && selectionMode() === 'multiple') {\n <cad-checkbox [value]=\"nodeState(d) === 'on'\" [indeterminate]=\"nodeState(d) === 'some'\" [ariaLabel]=\"'S\u00E9lectionner le groupe ' + d.node!.group!.label\" (changed)=\"toggleGroupSelection(d, $event)\"/>\n }\n <button type=\"button\" class=\"exp\" [attr.aria-expanded]=\"d.node!.expanded\" [attr.aria-label]=\"d.node!.expanded ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleGroup(d.node!)\"><cad-icon name=\"chevron-right\" [size]=\"13\"/></button>\n @if (groupHeaderTpl()) {\n <ng-container *ngTemplateOutlet=\"groupHeaderTpl()!.tpl; context: groupCtx(d)\"/>\n } @else {\n <span class=\"dt-group__label\">{{ d.node!.group!.label }}</span>\n <span class=\"dt-group__count\">{{ d.node!.group!.count }}</span>\n }\n </div>\n </td>\n </tr>\n } @else if (d.kind === 'groupFooter') {\n <!-- pied de groupe (agr\u00E9gats) -->\n <tr class=\"dt-group-foot\" [style.--_lvl]=\"d.level\">\n @if (groupFooterTpl()) {\n <td [attr.colspan]=\"colspan()\"><ng-container *ngTemplateOutlet=\"groupFooterTpl()!.tpl; context: groupCtx(d)\"/></td>\n } @else {\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id(); let ci = $index) {\n <td [class]=\"tdClass(c)\" [attr.data-l]=\"c.header()\">\n @if (ci === 0 && !hasAggregate(c)) {<span class=\"dt-group-foot__label\">Total {{ d.node!.group!.label }}</span>}\n @else if (hasAggregate(c)) {{{ formatCell(d.node!.group!.aggregates[c.field()], c) }}}\n </td>\n }\n @if (hasActionsColumn()) {<td></td>}\n }\n </tr>\n } @else if (resp.stacked() && cardTpl()) {\n <!-- carte custom (mode stack) -->\n <tr class=\"dt-row dt-card\" [class]=\"rowClasses(d.row, i, d)\" [style]=\"rowStyle()?.(d.row, i) || null\" [attr.tabindex]=\"selectionMode() ? 0 : null\" [attr.aria-selected]=\"selectionMode() ? isSelected(d.row) : null\"\n (click)=\"onRowClick(d.row, i, $event)\" (keydown)=\"onRowKey(d, i, $event)\">\n <td [attr.colspan]=\"colspan()\"><ng-container *ngTemplateOutlet=\"cardTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, node: d.node, selected: isSelected(d.row) }\"/></td>\n </tr>\n } @else {\n <!-- ligne -->\n <tr class=\"dt-row\" [class]=\"rowClasses(d.row, i, d)\" [style]=\"rowStyle()?.(d.row, i) || null\" [style.--_lvl]=\"d.level\" [attr.data-key]=\"d.key\" [class.is-editing-row]=\"isRowEditing(d.row)\"\n cdkDrag [cdkDragDisabled]=\"!canDragRow(d.row)\" [cdkDragData]=\"d.row\" cdkDragLockAxis=\"y\" cdkDragPreviewClass=\"dt-tr-preview\" cdkDragBoundary=\".tbl\"\n [attr.tabindex]=\"selectionMode() || hierarchical() ? 0 : null\" [attr.aria-selected]=\"selectionMode() ? isSelected(d.row) : null\"\n [attr.role]=\"hierarchical() ? 'row' : null\" [attr.aria-level]=\"hierarchical() ? d.level + 1 : null\" [attr.aria-expanded]=\"d.node?.hasChildren ? d.node!.expanded : null\"\n [attr.aria-setsize]=\"d.node ? d.node.setSize : null\" [attr.aria-posinset]=\"d.node ? d.node.posInSet : null\"\n (click)=\"onRowClick(d.row, i, $event)\" (dblclick)=\"rowDblClick.emit({ row: d.row, index: i, event: $event })\" (keydown)=\"onRowKey(d, i, $event)\">\n @if (hasNumberColumn()) {<td class=\"col-num\" [class]=\"'col-num ' + stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\">{{ rowNumber(d) }}</td>}\n @if (hasSelectionColumn()) {\n <td class=\"col-sel\" [class]=\"'col-sel ' + stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\">\n @if (canSelect(d.row)) {\n @if (selectionMode() === 'multiple') {\n <cad-checkbox [value]=\"nodeState(d) === 'on'\" [indeterminate]=\"nodeState(d) === 'some'\" [ariaLabel]=\"'S\u00E9lectionner la ligne ' + (i + 1)\" (changed)=\"toggleRow(d.row, i, $event)\"/>\n } @else {\n <cad-checkbox [value]=\"isSelected(d.row)\" [ariaLabel]=\"'S\u00E9lectionner la ligne ' + (i + 1)\" (changed)=\"selectSingle(d.row, i)\"/>\n }\n }\n </td>\n }\n @if (rowDragEnabled()) {\n <td class=\"col-drag\" [class]=\"'col-drag ' + stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\">\n @if (canDragRow(d.row)) {<span class=\"rdh\" cdkDragHandle title=\"D\u00E9placer la ligne\" aria-hidden=\"true\"><cad-icon name=\"drag\" [size]=\"13\"/></span>}\n </td>\n }\n @if (hasExpandColumn()) {\n <td class=\"col-exp\" [class]=\"'col-exp ' + stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\">\n @if (canExpand(d.row)) {\n <button type=\"button\" class=\"exp\" [attr.aria-expanded]=\"isExpanded(d.row)\" [attr.aria-label]=\"isExpanded(d.row) ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleExpand(d.row, $event)\"><cad-icon name=\"chevron-right\" [size]=\"13\"/></button>\n }\n </td>\n }\n @for (c of visibleColumns(); track c.id(); let cFirst = $first) {\n <td [class]=\"tdClass(c) + ' ' + stickyClass(c.id()) + (isTreeColumn(c) ? ' dt-tree-cell' : '') + (cFirst ? ' dt-first' : '') + (editUi.canEditCell(c) ? ' is-editable' : '') + (edit.isEditing(d.row, c) ? ' is-editing' : '')\"\n [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\" [attr.data-l]=\"c.header()\"\n (click)=\"editUi.onCellClick(d.row, c, $event, false)\" (dblclick)=\"editUi.onCellClick(d.row, c, $event, true)\">\n @if (edit.isEditing(d.row, c) && c.field()) {\n <!-- \u00E9diteur inline (mode cell ou row) -->\n <div class=\"dt-editor\" [class.is-invalid]=\"!!edit.cellError(d.row, c)\" (click)=\"$event.stopPropagation()\" (dblclick)=\"$event.stopPropagation()\" (keydown)=\"editUi.onKey(d.row, c, $event)\" (focusout)=\"editUi.onBlur(d.row, c)\">\n @if (c.editorTpl()) {\n <ng-container *ngTemplateOutlet=\"c.editorTpl()!.tpl; context: editUi.ctxFor(d.row, c, i)\"/>\n } @else {\n @switch (c.editor()) {\n @case ('select') {\n <select cadEditFocus [attr.aria-label]=\"c.header()\" (change)=\"editUi.onInput(d.row, c, $any($event.target).value)\">\n @for (o of c.effectiveEditorOptions(); track $index) {<option [value]=\"o.value\" [selected]=\"o.value === edit.valueOf(d.row, c)\">{{ o.label }}</option>}\n </select>\n }\n @case ('checkbox') {<input type=\"checkbox\" cadEditFocus [checked]=\"!!edit.valueOf(d.row, c)\" [attr.aria-label]=\"c.header()\" (change)=\"editUi.onInput(d.row, c, $any($event.target).checked)\"/>}\n @case ('textarea') {<textarea cadEditFocus rows=\"3\" [value]=\"edit.valueOf(d.row, c) ?? ''\" [attr.aria-label]=\"c.header()\" (input)=\"editUi.onInput(d.row, c, $any($event.target).value)\"></textarea>}\n @default {<input cadEditFocus [type]=\"editUi.inputType(c)\" [value]=\"edit.valueOf(d.row, c) ?? ''\" [attr.aria-label]=\"c.header()\" [attr.aria-invalid]=\"edit.cellError(d.row, c) ? 'true' : null\" (input)=\"editUi.onInput(d.row, c, $any($event.target).value)\"/>}\n }\n }\n @if (edit.cellError(d.row, c)) {<span class=\"dt-editor__err\" role=\"alert\">{{ edit.cellError(d.row, c) }}</span>}\n </div>\n } @else {\n @if (editUi.canEditCell(c) && showEditIcon()) {<button type=\"button\" class=\"ce\" tabindex=\"-1\" aria-label=\"Modifier\" (click)=\"$event.stopPropagation(); editUi.startEdit(d.row, c)\"><cad-icon name=\"edit\" [size]=\"11\"/></button>}\n @if (isTreeColumn(c) && d.node) {\n <span class=\"cad-tree-toggle\" [style.--_lvl]=\"d.level\">\n @if (showTreeLines()) { @for (l of levelsOf(d.level); track l) {<i class=\"tl\" aria-hidden=\"true\"></i>} }\n @else {<i class=\"ind\" aria-hidden=\"true\"></i>}\n <button type=\"button\" class=\"tg\" [class.is-leaf]=\"!d.node.hasChildren\" [class.is-open]=\"d.node.expanded\" [attr.tabindex]=\"d.node.hasChildren ? 0 : -1\"\n [attr.aria-expanded]=\"d.node.hasChildren ? d.node.expanded : null\" [attr.aria-label]=\"d.node.expanded ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleNode(d.node, $event)\">\n @if (d.node.loading) {<cad-icon name=\"loader\" [size]=\"12\" spin/>} @else {<cad-icon name=\"chevron-right\" [size]=\"13\"/>}\n </button>\n @if (treeIconOf(d.row)) {<cad-icon class=\"ic\" [name]=\"treeIconOf(d.row)!\" [size]=\"14\"/>}\n </span>\n }\n @if (c.cellTpl()) {\n <ng-container *ngTemplateOutlet=\"c.cellTpl()!.tpl; context: { $implicit: d.row, value: cell(d.row, c), rowIndex: i, column: c, level: d.level, expanded: d.node?.expanded ?? false, hasChildren: d.node?.hasChildren ?? false, node: d.node }\"/>\n } @else {<span class=\"cell-txt\">{{ formatCell(cell(d.row, c), c) }}</span>}\n }\n </td>\n }\n @if (hasActionsColumn()) {\n <td class=\"col-acts\" [class]=\"'col-acts ' + stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"><span class=\"acts\" (click)=\"$event.stopPropagation()\">\n @if ((editMode() === 'row' || editMode() === 'row-inline') && showRowEditButton()) {\n @if (isRowEditing(d.row)) {\n <button type=\"button\" class=\"re ok\" aria-label=\"Enregistrer la ligne\" title=\"Enregistrer\" (click)=\"saveRowEdit(d.row)\"><cad-icon name=\"check\" [size]=\"15\"/></button>\n <button type=\"button\" class=\"re ko\" aria-label=\"Annuler l'\u00E9dition\" title=\"Annuler\" (click)=\"cancelRowEdit(d.row)\"><cad-icon name=\"x\" [size]=\"15\"/></button>\n } @else {\n <button type=\"button\" class=\"re\" aria-label=\"Modifier la ligne\" title=\"Modifier\" (click)=\"initRowEdit(d.row)\"><cad-icon name=\"edit\" [size]=\"14\"/></button>\n }\n }\n @if (rowActionsTpl()) {<ng-container *ngTemplateOutlet=\"rowActionsTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, node: d.node, editing: isRowEditing(d.row) }\"/>}\n </span></td>\n }\n </tr>\n @if (isExpanded(d.row) && hasExpandColumn()) {\n <tr class=\"dt-detail\" [style.--_lvl]=\"d.level\"><td [attr.colspan]=\"colspan()\">\n @if (expansionTpl()) {\n <ng-container *ngTemplateOutlet=\"expansionTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, hiddenColumns: hiddenByPriority(), node: d.node }\"/>\n } @else {\n <div class=\"kv\">\n @for (c of hiddenByPriority(); track c.id()) {<div><b>{{ c.header() || c.field() }}</b>\n @if (c.cellTpl()) {<ng-container *ngTemplateOutlet=\"c.cellTpl()!.tpl; context: { $implicit: d.row, value: cell(d.row, c), rowIndex: i, column: c, level: d.level, expanded: false, hasChildren: false, node: d.node }\"/>}\n @else {{{ formatCell(cell(d.row, c), c) }}}\n </div>}\n </div>\n }\n </td></tr>\n }\n }\n }\n @if (virtual.range().bottomPad > 0) {<tr class=\"dt-vpad\" aria-hidden=\"true\"><td [attr.colspan]=\"colspan()\" [style.height.px]=\"virtual.range().bottomPad\"></td></tr>}\n }\n </tbody>\n @if (footerTpl() || showGrandTotalRow()) {\n <tfoot>\n @if (showGrandTotalRow()) {\n <tr class=\"dt-grand\">\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id(); let ci = $index) {\n <td [class]=\"tdClass(c)\" [attr.data-l]=\"c.header()\">\n @if (ci === 0 && !hasAggregate(c)) {{{ grandTotalLabel() }}}\n @else if (hasAggregate(c)) {{{ formatCell(grandTotal()[c.field()], c) }}}\n </td>\n }\n @if (hasActionsColumn()) {<td></td>}\n </tr>\n }\n @if (footerTpl()) {<ng-container *ngTemplateOutlet=\"footerTpl()!.tpl; context: { $implicit: pageData(), columns: visibleColumns(), aggregates: grandTotal() }\"/>}\n </tfoot>\n }\n </table>\n </div>\n\n @if ((usePaginator() && (paginationTotal() > 0 || lazy())) || showRowCount()) {\n <div class=\"dt-foot\" [class.has-count]=\"showRowCount()\">\n @if (showRowCount()) {\n <span class=\"dt-foot__count\">\n @if (rowCountTpl()) {<ng-container *ngTemplateOutlet=\"rowCountTpl()!.tpl; context: { $implicit: totalRows(), total: totalRows(), filtered: totalFiltered(), selected: selectedCount() }\"/>}\n @else {{{ totalRows() }} {{ rowCountLabel() }}@if (totalFiltered() !== totalRows()) { \u00B7 {{ totalFiltered() }} filtr\u00E9e{{ totalFiltered() > 1 ? 's' : '' }}}@if (selectedCount() > 0) { \u00B7 {{ selectedCount() }} s\u00E9lectionn\u00E9e{{ selectedCount() > 1 ? 's' : '' }}}}\n </span>\n }\n @if (usePaginator() && (paginationTotal() > 0 || lazy())) {\n <cad-paginator [first]=\"first()\" [rows]=\"rows()\" [totalRecords]=\"paginationTotal()\" [rowsPerPageOptions]=\"rowsPerPageOptions()\" [pageLinks]=\"resp.stacked() ? 3 : pageLinks()\"\n [showCurrentPageReport]=\"showCurrentPageReport()\" [currentPageReportTemplate]=\"currentPageReportTemplate()\" [showFirstLastIcon]=\"showFirstLastIcon()\"\n [alwaysShow]=\"alwaysShowPaginator()\" (pageChange)=\"onPage($event)\"/>\n }\n </div>\n }\n <cad-menu #hmenu popup [items]=\"menuItems()\" ariaLabel=\"Menu de la colonne\"/>\n <cad-menu #fmenu popup [items]=\"filterMenuItems()\" ariaLabel=\"Op\u00E9rateur de filtre\" [minWidth]=\"200\"/>\n <cad-menu #inmenu popup [closeOnSelect]=\"false\" [items]=\"inMenuItems()\" ariaLabel=\"Valeurs du filtre\" [minWidth]=\"180\"/>\n</div>\n", styles: [":host{--_row-h: var(--cad-table-row-h, 42px);--_cell-px: 12px;display:block;min-width:0;max-width:100%;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg)}:host(.is-dense){--_row-h: 34px}.dt{border:1px solid var(--cad-border);border-radius:var(--cad-radius-lg);background:var(--cad-surface);overflow:hidden;position:relative}:host(.is-borderless) .dt{border:0;border-radius:0}.dt-bar{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--cad-border);flex-wrap:wrap}.dt-bar__title{font-weight:600;font-size:13.5px;margin-right:4px}.dt-bar__count{font:500 11px var(--cad-font-mono);padding:2px 7px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.dt-bar__grow{flex:1}.dt-bar__search{position:relative;display:flex;align-items:center;width:240px;max-width:100%}.dt-bar__search cad-icon{position:absolute;left:9px;color:var(--cad-fg-muted);pointer-events:none}.dt-bar__search input{width:100%;box-sizing:border-box;height:30px;padding:0 28px 0 30px;font:var(--cad-font-size) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);outline:0;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.dt-bar__search input::placeholder{color:var(--cad-fg-muted)}.dt-bar__search input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.dt-bar__search .dt-bar__clear{position:absolute;right:6px;border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;padding:2px;border-radius:4px}.dt-bar__search .dt-bar__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.dt-bar__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:26px;padding:0 8px;border-radius:var(--cad-radius-sm);border:1px solid var(--cad-border-strong);background:transparent;color:var(--cad-fg-secondary);font:500 var(--cad-font-size-sm) var(--cad-font);cursor:pointer;white-space:nowrap}.dt-bar__btn:hover{background:var(--cad-hover);color:var(--cad-fg)}.dt-bar__btn:focus-visible{outline:2px solid var(--cad-ring);outline-offset:1px}.dt-bar__btn.is-ghost{border-color:transparent;width:26px;padding:0}.dt-bar__btn.is-on{color:var(--cad-accent);background:var(--cad-accent-soft)}.dt-bar__cols{position:relative}.dt-bar__menu{position:absolute;right:0;top:calc(100% + 6px);z-index:20;min-width:200px;max-height:280px;overflow:auto;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);padding:4px}.dt-bar__menu label{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:var(--cad-font-size)}.dt-bar__menu label:hover{background:var(--cad-hover)}.dt-bar__menu label.is-locked{opacity:.5;cursor:default}.dt-bar__menu-title{font:600 10px/1 var(--cad-font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--cad-fg-muted);padding:6px 8px 4px}.dt-sel{display:flex;align-items:center;gap:8px;padding:8px 12px;background:var(--cad-accent-soft);border-bottom:1px solid var(--cad-border);font-size:12.5px;color:var(--cad-accent);font-weight:500;min-height:47px;box-sizing:border-box}.dt-sel__grow{flex:1}.dt-sel__clear{border:0;background:transparent;color:inherit;cursor:pointer;display:grid;place-items:center;width:26px;height:26px;border-radius:6px}.dt-sel__clear:hover{background:var(--cad-accent-soft)}.dt-scroll{overflow:auto;position:relative}:host(.has-scroll-height) .dt-scroll{max-height:var(--_scroll-h);scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent;scrollbar-gutter:stable}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar{width:10px;height:10px}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-thumb{background:var(--cad-border-strong);border-radius:999px;border:2px solid var(--cad-surface)}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-thumb:hover{background:var(--cad-fg-muted)}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-track{background:transparent}.dt-loading{position:absolute;inset:0;display:grid;place-items:center;background:color-mix(in srgb,var(--cad-surface) 55%,transparent);z-index:5}.dt-loading cad-icon{color:var(--cad-accent)}.tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--cad-font-size)}:host(.is-resizable) .tbl{table-layout:fixed}.tbl caption{text-align:left;padding:10px 12px;font-weight:600;color:var(--cad-fg-secondary);font-size:var(--cad-font-size-sm)}.tbl th{position:relative;text-align:left;font-weight:600;font-size:var(--cad-font-size-sm);color:var(--cad-fg-secondary);background:var(--cad-bg-subtle);padding:0 var(--_cell-px);height:38px;border-bottom:1px solid var(--cad-border);white-space:nowrap;-webkit-user-select:none;user-select:none;box-sizing:border-box}:host(.is-sticky-header) .tbl thead th{position:sticky;top:0;z-index:3}.tbl th.al-right{text-align:right}.tbl th.al-center{text-align:center}.tbl th.st-left,.tbl td.st-left{position:sticky;left:0;z-index:2;background:var(--cad-surface)}.tbl th.st-right,.tbl td.st-right{position:sticky;right:0;z-index:2;background:var(--cad-surface)}.tbl th.st-left,.tbl th.st-right{background:var(--cad-bg-subtle);z-index:4}.tbl th .hd{display:inline-flex;align-items:center;gap:4px;max-width:100%}.tbl th.al-right .hd{flex-direction:row-reverse}.tbl th .hd-txt{overflow:hidden;text-overflow:ellipsis}.tbl th button.hd{all:unset;display:inline-flex;align-items:center;gap:4px;cursor:pointer;border-radius:4px;max-width:100%}.tbl th button.hd:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.tbl th .hd cad-icon{opacity:0;transition:opacity var(--cad-dur);flex:none}.tbl th:hover .hd cad-icon{opacity:.6}.tbl th.is-sorted .hd{color:var(--cad-accent)}.tbl th.is-sorted .hd cad-icon{opacity:1}.tbl th .hd-idx{font:600 9px var(--cad-font-mono);background:var(--cad-accent-soft);color:var(--cad-accent);border-radius:999px;padding:1px 4px}.tbl th .rz{position:absolute;right:0;top:8px;bottom:8px;width:5px;cursor:col-resize;z-index:1}.tbl th .rz:after{content:\"\";position:absolute;right:2px;top:0;bottom:0;width:1px;background:var(--cad-border);transition:background var(--cad-dur)}.tbl th .rz:hover:after,.tbl th .rz.is-active:after{background:var(--cad-accent);width:2px}.tbl th.col-sel,.tbl td.col-sel{width:36px;padding-right:0}.tbl th.col-exp,.tbl td.col-exp{width:30px;padding:0 4px}.tbl th.col-acts,.tbl td.col-acts{text-align:right;white-space:nowrap}.tbl tr.flt th{height:auto;padding:6px var(--_cell-px);background:var(--cad-surface);font-weight:400}.tbl tr.flt input,.tbl tr.flt select{width:100%;box-sizing:border-box;height:26px;padding:0 8px;font:var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);outline:0}.tbl tr.flt input:focus,.tbl tr.flt select:focus{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.tbl td{padding:0 var(--_cell-px);height:var(--_row-h);border-bottom:1px solid var(--cad-border);vertical-align:middle;font-variant-numeric:tabular-nums;box-sizing:border-box}.tbl td.al-right{text-align:right}.tbl td.al-center{text-align:center}.tbl td.dt-num{font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm)}.tbl td.is-nowrap{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host(.is-bordered) .tbl td,:host(.is-bordered) .tbl th{border-right:1px solid var(--cad-border)}:host(.is-bordered) .tbl td:last-child,:host(.is-bordered) .tbl th:last-child{border-right:0}.tbl tbody tr:last-child td{border-bottom:0}:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td{background:var(--cad-table-stripe, var(--cad-bg-subtle))}:host(.is-hoverable) .tbl tbody tr.dt-row:hover td{background:var(--cad-hover)}.tbl tbody tr.dt-row.is-selectable{cursor:pointer}.tbl tbody tr.dt-row:focus-visible{outline:none}.tbl tbody tr.dt-row:focus-visible td{background:var(--cad-hover);box-shadow:inset 0 0 0 1px var(--cad-ring)}.tbl tbody tr.dt-row.is-selected td{background:var(--cad-accent-soft)}.tbl tbody tr.dt-row.is-selected td:first-child{box-shadow:inset 3px 0 0 var(--cad-accent)}.tbl tbody tr.dt-row.is-selected:focus-visible td{box-shadow:inset 0 0 0 1px var(--cad-ring)}.tbl tbody tr.dt-row.is-selected:focus-visible td:first-child{box-shadow:inset 3px 0 0 var(--cad-accent),inset 0 0 0 1px var(--cad-ring)}.tbl .exp{width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0}.tbl .exp:hover{background:var(--cad-elevated);color:var(--cad-fg)}.tbl .exp:focus-visible{outline:2px solid var(--cad-ring)}.tbl .exp cad-icon{transition:transform var(--cad-dur)}.tbl tr.is-expanded .exp cad-icon{transform:rotate(90deg)}.tbl .acts{display:inline-flex;gap:2px;align-items:center;opacity:0;transition:opacity var(--cad-dur)}.tbl tr:hover .acts,.tbl tr.is-selected .acts,.tbl tr:focus-within .acts{opacity:1}:host(.acts-always) .tbl .acts{opacity:1}.tbl tr.dt-detail td{background:var(--cad-bg-subtle);height:auto;padding:12px var(--_cell-px) 14px var(--_detail-pl, 58px)}:host(.is-hoverable) .tbl tr.dt-detail:hover td{background:var(--cad-bg-subtle)}.tbl tfoot td{background:var(--cad-bg-subtle);font-weight:600;color:var(--cad-fg-secondary);border-top:1px solid var(--cad-border);border-bottom:0}.kv{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px 22px;font-size:12.5px}.kv b{display:block;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);margin-bottom:4px}.skel{height:12px;border-radius:4px;background:linear-gradient(90deg,var(--cad-elevated),var(--cad-hover),var(--cad-elevated));background-size:200% 100%;animation:cad-tbl-sh 1.4s infinite}@keyframes cad-tbl-sh{to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.skel{animation:none}.tbl .acts,.tbl .exp cad-icon,.tbl th .hd cad-icon{transition:none}}.empty{display:grid;place-items:center;gap:6px;padding:34px 12px;text-align:center;color:var(--cad-fg-secondary);font-size:12.5px}.empty cad-icon{color:var(--cad-fg-muted)}.empty b{color:var(--cad-fg);font-size:var(--cad-font-size)}.dt-foot{display:flex;align-items:center;gap:14px;padding:8px 12px;border-top:1px solid var(--cad-border)}.dt-foot cad-paginator{flex:1}\n", ".tbl th.st-left,.tbl td.st-left,.tbl th.st-right,.tbl td.st-right{position:sticky;z-index:2;background:var(--cad-surface);background-clip:padding-box}.tbl thead th.st-left,.tbl thead th.st-right{z-index:4;background:var(--cad-bg-subtle)}:host(.is-sticky-header) .tbl thead th.st-left,:host(.is-sticky-header) .tbl thead th.st-right{z-index:5}:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td.st-left,:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td.st-right{background:var(--cad-table-stripe, var(--cad-bg-subtle))}:host(.is-hoverable) .tbl tbody tr.dt-row:hover td.st-left,:host(.is-hoverable) .tbl tbody tr.dt-row:hover td.st-right{background:var(--cad-hover)}.tbl tbody tr.dt-row.is-selected td.st-left,.tbl tbody tr.dt-row.is-selected td.st-right{background:color-mix(in srgb,var(--cad-accent) 12%,var(--cad-surface))}.tbl td.st-last-left,.tbl th.st-last-left{transition:box-shadow var(--cad-dur)}:host(.is-scrolled-x) .tbl td.st-last-left,:host(.is-scrolled-x) .tbl th.st-last-left{box-shadow:1px 0 0 var(--cad-border),6px 0 12px -6px #0000002e}:host(:not(.is-scrolled-x-end)) .tbl td.st-first-right,:host(:not(.is-scrolled-x-end)) .tbl th.st-first-right{box-shadow:-1px 0 0 var(--cad-border),-6px 0 12px -6px #0000002e}.tbl td.st-right.col-acts .acts{background:inherit}.tbl td.dt-tree-cell{white-space:nowrap}.tbl td.dt-tree-cell .cell-txt{white-space:normal}.cad-tree-toggle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px}.cad-tree-toggle .ind{display:inline-block;width:calc(var(--_lvl, 0) * var(--_indent, 20px));flex:none}.cad-tree-toggle .tl{display:inline-block;width:var(--_indent, 20px);align-self:stretch;flex:none;position:relative}:host(.has-tree-lines) .tbl td.dt-tree-cell{padding-top:0;padding-bottom:0}:host(.has-tree-lines) .cad-tree-toggle{align-self:stretch;height:var(--_row-h)}:host(.has-tree-lines) .cad-tree-toggle .tl:before{content:\"\";position:absolute;left:9px;top:0;bottom:0;border-left:1px solid var(--cad-border)}.cad-tree-toggle .tg{width:20px;height:20px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0;flex:none}.cad-tree-toggle .tg:hover{background:var(--cad-elevated);color:var(--cad-fg)}.cad-tree-toggle .tg:focus-visible{outline:2px solid var(--cad-ring)}.cad-tree-toggle .tg cad-icon{transition:transform var(--cad-dur)}.cad-tree-toggle .tg.is-open cad-icon{transform:rotate(90deg)}.cad-tree-toggle .tg.is-leaf{visibility:hidden;pointer-events:none}.cad-tree-toggle .ic{color:var(--cad-fg-muted);margin:0 6px 0 2px}.tbl tr.dt-row.lvl-0.has-children td.dt-tree-cell{font-weight:500}.tbl tr.dt-group td{background:var(--cad-bg-subtle);height:34px;padding:0 var(--_cell-px);border-bottom:1px solid var(--cad-border)}.dt-group__inner{display:flex;align-items:center;gap:6px;padding-left:calc(var(--_lvl, 0) * var(--_indent, 20px));font-weight:600;font-size:var(--cad-font-size-sm)}.dt-group__inner .exp{width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0}.dt-group__inner .exp:hover{background:var(--cad-elevated);color:var(--cad-fg)}.dt-group__inner .exp cad-icon{transition:transform var(--cad-dur)}.tbl tr.dt-group.is-expanded .dt-group__inner .exp cad-icon{transform:rotate(90deg)}.dt-group__count{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.tbl tr.dt-group-foot td{background:var(--cad-bg-subtle);height:32px;color:var(--cad-fg-secondary);font-size:var(--cad-font-size-sm);border-bottom:1px solid var(--cad-border)}.tbl tr.dt-group-foot td.dt-num,.tbl tr.dt-grand td.dt-num{font-family:var(--cad-font-mono);font-weight:600}.dt-group-foot__label{padding-left:calc(var(--_lvl, 0) * var(--_indent, 20px) + 26px);font-weight:500}.tbl tfoot tr.dt-grand td{background:var(--cad-bg-subtle);font-weight:600;color:var(--cad-fg);border-top:2px solid var(--cad-border);height:36px}:host(.is-hoverable) .tbl tr.dt-group:hover td,:host(.is-hoverable) .tbl tr.dt-group-foot:hover td{background:var(--cad-bg-subtle)}.tbl tr.dt-detail td{padding-left:calc(var(--_detail-pl, 58px) + var(--_lvl, 0) * var(--_indent, 20px))}.dt-bar__tools,.dt-bar__tools-end{display:contents}.dt-bar__filters{display:inline-flex}.dt-bar__filters .dt-bar__count{padding:1px 6px;font-size:10px}:host(.is-stacked) .dt-bar{gap:8px}:host(.is-stacked) .dt-bar__tools{display:none}:host(.is-stacked) .dt-bar__tools.is-open{display:flex;flex-wrap:wrap;align-items:center;gap:8px;flex-basis:100%;order:10;padding-top:8px;border-top:1px dashed var(--cad-border)}:host(.is-stacked) .dt-bar__grow{display:none}:host(.is-stacked) .dt-bar__search{order:5;flex-basis:100%;width:100%}:host(.is-stacked) .dt-bar__cols,:host(.is-stacked) .dt-bar__density{display:none}:host(.is-stacked) .dt-sel{position:sticky;bottom:0;z-index:6;flex-wrap:wrap;border-top:1px solid var(--cad-border);order:99}:host(.is-stacked) .dt-scroll{overflow-x:hidden}:host(.is-stacked) .tbl,:host(.is-stacked) .tbl tbody,:host(.is-stacked) .tbl tfoot,:host(.is-stacked) .tbl tr,:host(.is-stacked) .tbl td{display:block}:host(.is-stacked) .tbl thead,:host(.is-stacked) .tbl colgroup,:host(.is-stacked) .tbl caption{display:none}:host(.is-stacked) .tbl tr.dt-row{position:relative;padding:10px 12px;border-bottom:1px solid var(--cad-border);height:auto}:host(.is-stacked) .tbl tr.dt-row.has-sel{padding-left:44px}:host(.is-stacked) .tbl tr.dt-row.is-selected{background:var(--cad-accent-soft);box-shadow:inset 3px 0 0 var(--cad-accent)}:host(.is-hoverable.is-stacked) .tbl tr.dt-row:hover{background:var(--cad-hover)}:host(.is-hoverable.is-stacked) .tbl tr.dt-row:hover td,:host(.is-stacked) .tbl tr.dt-row.is-selected td,:host(.is-striped.is-stacked) .tbl tr.dt-row td{background:transparent!important;box-shadow:none!important}:host(.is-stacked) .tbl tr.dt-row:focus-visible{box-shadow:inset 0 0 0 1px var(--cad-ring)}:host(.is-stacked) .tbl td{height:auto;padding:2px 0;border:0;white-space:normal;display:flex;justify-content:space-between;align-items:baseline;gap:12px;font-size:12.5px;position:static}:host(.is-stacked) .tbl td.st-left,:host(.is-stacked) .tbl td.st-right{position:static}:host(.is-stacked) .tbl td[data-l]:before{content:attr(data-l);color:var(--cad-fg-muted);font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.04em;flex:none}:host(.is-stacked) .tbl td.col-sel{position:absolute;left:12px;top:12px;padding:0;width:auto}:host(.is-stacked) .tbl td.col-sel:before,:host(.is-stacked) .tbl td.col-exp:before,:host(.is-stacked) .tbl td.col-acts:before,:host(.is-stacked) .tbl td.dt-tree-cell:before,:host(.is-stacked) .tbl td.dt-first:before{content:none}:host(.is-stacked) .tbl td.col-exp{position:absolute;right:44px;top:8px;padding:0;width:auto}:host(.is-stacked) .tbl td.dt-first,:host(.is-stacked) .tbl td.dt-tree-cell{display:block;font-size:14px;font-weight:500;padding:0 44px 6px 0}:host(.is-stacked) .tbl td.dt-tree-cell .cad-tree-toggle .ind,:host(.is-stacked) .tbl td.dt-tree-cell .cad-tree-toggle .tl{display:none}:host(.is-stacked) .tbl td.col-acts{position:absolute;right:8px;top:8px;padding:0;width:auto}:host(.is-stacked) .tbl .acts{opacity:1}:host(.is-stacked) .tbl td.dt-num{text-align:right}:host(.is-stacked) .tbl tr.dt-detail td{padding:8px 12px 10px}:host(.is-stacked) .tbl tr.dt-row.lvl-1{margin-left:22px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-row.lvl-2{margin-left:44px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-row.lvl-3{margin-left:66px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-group td{padding:8px 12px;height:auto;display:block}:host(.is-stacked) .tbl tr.dt-group-foot{display:flex;flex-wrap:wrap;gap:4px 14px;padding:6px 12px 6px 44px}:host(.is-stacked) .tbl tr.dt-group-foot td{padding:0}:host(.is-stacked) .tbl tr.dt-group-foot td:empty{display:none}:host(.is-stacked) .tbl tfoot tr.dt-grand{padding:8px 12px}:host(.is-stacked) .tbl tfoot tr.dt-grand td:empty{display:none}:host(.is-stacked) .tbl tr.dt-empty td{display:block}:host(.is-stacked) .tbl tr.is-skeleton td{display:block;padding:4px 0}:host(.is-stacked) .tbl tr.dt-card td{padding:0;display:block}:host(.is-stacked) .dt-foot{flex-wrap:wrap;gap:8px}:host(.is-stacked) .dt-foot ::ng-deep .cad-paginator__rpp{display:none}\n", ".tbl th .dh{display:none;position:absolute;left:2px;top:50%;transform:translateY(-50%);width:14px;height:18px;color:var(--cad-fg-muted);cursor:grab;border-radius:3px;place-items:center}.tbl th .dh:hover{color:var(--cad-fg);background:var(--cad-elevated)}:host(.is-reorderable) .tbl th.can-drag{padding-left:calc(var(--_cell-px) + 6px)}:host(.is-reorderable) .tbl th.can-drag:hover .dh,:host(.is-reorderable) .tbl th.can-drag.cdk-drag-dragging .dh{display:grid}.tbl th.cdk-drag-placeholder{opacity:.35;background:var(--cad-accent-soft)}.tbl th.cdk-drag-placeholder:before{content:\"\";position:absolute;left:-1px;top:4px;bottom:4px;width:2px;background:var(--cad-accent)}.cdk-drag-preview.dt-th-preview{display:flex;align-items:center;height:38px;padding:0 12px;box-sizing:border-box;font:600 var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:6px;box-shadow:var(--cad-shadow-lg);list-style:none}.tbl thead tr.cdk-drop-list-dragging th:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.tbl th.cdk-drag-animating{transition:transform .2s cubic-bezier(0,0,.2,1)}.dt-bar__menu .mv{display:inline-flex;gap:0;margin-left:auto}.dt-bar__menu .mv button{border:0;background:transparent;color:var(--cad-fg-muted);width:20px;height:20px;border-radius:4px;cursor:pointer;display:grid;place-items:center;padding:0}.dt-bar__menu .mv button:hover:not([disabled]){background:var(--cad-hover);color:var(--cad-fg)}.dt-bar__menu .mv button[disabled]{opacity:.3;cursor:default}.tbl tr.hg th{height:30px;text-align:center;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);border-bottom:1px solid var(--cad-border)}.tbl tr.hg th.hg-cell{border-left:1px solid var(--cad-border)}.tbl tr.hg th.hg-cell:first-child{border-left:0}:host(.is-sticky-header) .tbl tr.hg th{position:sticky;top:0;z-index:3}:host(.is-sticky-header) .tbl tr.hg+tr th{top:30px}.tbl tr.dt-vpad td{padding:0;border:0;height:auto}:host(.is-virtual) .dt-scroll{overflow-anchor:none}:host(.edit-cell) .tbl td.is-editable{cursor:text;position:relative}:host(.edit-cell.is-hoverable) .tbl tbody tr.dt-row td.is-editable:hover{background:var(--cad-hover);box-shadow:inset 0 0 0 1px var(--cad-border-strong)}:host(.show-edit-icon) .tbl td.is-editable{padding-right:calc(var(--_cell-px) + 16px)}.tbl td .ce{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:20px;height:20px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0;opacity:0;transition:opacity var(--cad-dur),background var(--cad-dur)}.tbl td.is-editable:hover .ce,.tbl td .ce:focus-visible{opacity:.7}.tbl td .ce:hover{opacity:1!important;background:var(--cad-elevated);color:var(--cad-fg)}.tbl td.is-editing{padding-top:0;padding-bottom:0;background:var(--cad-surface)!important;box-shadow:none!important}.dt-editor{position:relative;display:flex;align-items:stretch;min-height:calc(var(--_row-h) - 8px);margin:4px 0}.tbl td.is-editing{height:auto;vertical-align:top}.dt-editor input,.dt-editor select,.dt-editor textarea{width:100%;height:calc(var(--_row-h) - 8px);box-sizing:border-box;padding:0 8px;font:var(--cad-font-size) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-accent);border-radius:var(--cad-radius-sm);outline:0;box-shadow:0 0 0 3px var(--cad-ring)}.dt-editor input[type=number]{font-family:var(--cad-font-mono);text-align:right}.dt-editor textarea{height:auto;min-height:76px;padding:6px 8px;resize:vertical;line-height:1.45;font:var(--cad-font-size)/1.45 var(--cad-font)}.dt-editor input[type=checkbox]{width:16px;height:16px;box-shadow:none;accent-color:var(--cad-accent)}.dt-editor.is-invalid input,.dt-editor.is-invalid select,.dt-editor.is-invalid textarea{border-color:var(--cad-danger);box-shadow:0 0 0 3px var(--cad-danger-soft)}.dt-editor__err{position:absolute;left:0;top:calc(100% + 4px);z-index:6;padding:3px 8px;border-radius:6px;background:var(--cad-danger);color:#fff;font-size:11px;white-space:nowrap;box-shadow:var(--cad-shadow-md);pointer-events:none}.dt-editor__err:before{content:\"\";position:absolute;left:10px;top:-4px;width:8px;height:8px;background:inherit;transform:rotate(45deg)}:host(.edit-row) .tbl tr.dt-row.is-editing-row td{background:var(--cad-accent-soft)}.tbl .acts .re{display:inline-grid;place-items:center;width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--cad-fg-secondary);cursor:pointer;padding:0}.tbl .acts .re:hover{background:var(--cad-hover);color:var(--cad-fg)}.tbl .acts .re.ok{color:var(--cad-success)}.tbl .acts .re.ko{color:var(--cad-danger)}.tbl .acts .re:focus-visible{outline:2px solid var(--cad-ring)}:host(.edit-row) .tbl tr.is-editing-row .acts{opacity:1}\n", ".dt-scroll{scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent}.dt-scroll::-webkit-scrollbar{height:10px;width:10px}.dt-scroll::-webkit-scrollbar-thumb{background:var(--cad-border-strong);border-radius:999px;border:2px solid var(--cad-surface)}.dt-scroll::-webkit-scrollbar-thumb:hover{background:var(--cad-fg-muted)}.dt-scroll::-webkit-scrollbar-track{background:transparent}.tbl th.has-menu{padding-right:calc(var(--_cell-px) + 20px)}.tbl th .hm{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0;opacity:0;transition:opacity var(--cad-dur),background var(--cad-dur);z-index:2}.tbl th:hover .hm,.tbl th .hm:focus-visible,.tbl th .hm.is-on,.tbl th.is-sorted .hm,.tbl th.is-filtered .hm{opacity:1}.tbl th .hm:hover,.tbl th .hm.is-on{background:var(--cad-elevated);color:var(--cad-fg)}.tbl th.is-filtered .hd-txt{color:var(--cad-accent)}:host(.is-resizable) .tbl th.has-menu .hm{right:10px}.tbl tr.flt th{padding:5px 6px}.flt-cell{position:relative;display:flex;align-items:center;gap:4px;min-width:0}.flt-cell input,.flt-cell select,.flt-cell .flt-in{flex:1 1 0;min-width:0;height:28px;padding:0 26px 0 8px;box-sizing:border-box;font:var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);outline:0;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.flt-cell.is-range input{padding-right:8px}.flt-cell.is-range input:last-of-type{padding-right:26px}.flt-cell input:focus,.flt-cell select:focus,.flt-cell .flt-in:focus-visible{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.flt-cell.is-active input,.flt-cell.is-active select,.flt-cell.is-active .flt-in{border-color:var(--cad-accent);background:var(--cad-accent-soft)}.flt-cell .flt-in{display:inline-flex;align-items:center;justify-content:space-between;gap:6px;text-align:left;cursor:pointer}.flt-cell .flt-in.is-ph{color:var(--cad-fg-muted)}.flt-cell .flt-in cad-icon{color:var(--cad-fg-muted);flex:none}.flt-cell .flt-txt{flex:1;height:28px;display:inline-flex;align-items:center;padding:0 26px 0 8px;font:italic var(--cad-font-size-sm) var(--cad-font);color:var(--cad-accent);background:var(--cad-accent-soft);border:1px solid var(--cad-accent);border-radius:var(--cad-radius-sm);box-sizing:border-box}.flt-cell .flt-op{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:20px;height:20px;border:0;border-radius:4px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0}.flt-cell .flt-op:hover,.flt-cell .flt-op.is-on{color:var(--cad-accent);background:var(--cad-accent-soft)}.flt-cell.is-active .flt-op{right:22px}.flt-cell .flt-x{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:18px;height:18px;border:0;border-radius:4px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0}.flt-cell .flt-x:hover{color:var(--cad-danger);background:var(--cad-danger-soft)}.flt-cell select{appearance:none;padding-right:26px}.dt-gz{display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-height:40px;padding:6px 12px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle);color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}.dt-gz.cdk-drop-list-receiving,.dt-gz.cdk-drop-list-dragging{background:var(--cad-accent-soft);color:var(--cad-accent);outline:1px dashed var(--cad-accent);outline-offset:-4px}.dt-gz__hint{font-style:italic}.dt-gz__chip{display:inline-flex;align-items:center;gap:5px;height:26px;padding:0 4px 0 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500;cursor:grab}.dt-gz__chip .dt-gz__drag{opacity:.6}.dt-gz__chip button{width:18px;height:18px;border:0;border-radius:50%;background:transparent;color:inherit;display:grid;place-items:center;cursor:pointer;padding:0}.dt-gz__chip button:hover{background:var(--cad-accent);color:var(--cad-fg-on-accent)}.dt-gz__chip.cdk-drag-placeholder{opacity:.35}.cdk-drag-preview.dt-gz__chip{box-shadow:var(--cad-shadow-md)}:host(.is-stacked) .dt-gz{display:none}.tbl th.col-num,.tbl td.col-num{width:44px;text-align:right;font:11px var(--cad-font-mono);color:var(--cad-fg-muted);background:var(--cad-bg-subtle);padding:0 8px;-webkit-user-select:none;user-select:none}.tbl th.col-num{font-weight:600}.tbl tbody tr:hover td.col-num{background:var(--cad-bg-subtle)}:host(.is-stacked) .tbl td.col-num{position:absolute;left:auto;right:12px;bottom:6px;width:auto;background:transparent;padding:0}:host(.is-stacked) .tbl td.col-num:before{content:none}.tbl th.col-drag,.tbl td.col-drag{width:28px;padding:0 4px}.tbl td.col-drag .rdh{display:inline-grid;place-items:center;width:20px;height:24px;color:var(--cad-fg-muted);cursor:grab;opacity:0;transition:opacity var(--cad-dur);border-radius:4px}.tbl tbody tr:hover td.col-drag .rdh,.tbl tr.cdk-drag-dragging td.col-drag .rdh{opacity:.8}.tbl td.col-drag .rdh:hover{color:var(--cad-fg);background:var(--cad-elevated)}.tbl tr.dt-row.cdk-drag-placeholder{opacity:0}.tbl tbody.cdk-drop-list-dragging tr.dt-row:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.tbl tr.dt-row.cdk-drag-placeholder td{border-top:2px solid var(--cad-accent)}.cdk-drag-preview.dt-tr-preview{display:table;table-layout:fixed;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:8px;box-shadow:var(--cad-shadow-lg);opacity:.95;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg)}.cdk-drag-preview.dt-tr-preview td{padding:0 12px;height:42px;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host(.is-stacked) .tbl td.col-drag{display:none}.dt-foot__count{font:var(--cad-font-size-sm) var(--cad-font-mono);color:var(--cad-fg-secondary);white-space:nowrap}.dt-foot.has-count cad-paginator{flex:1}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadCheckboxComponent, selector: "cad-checkbox", inputs: ["label", "ariaLabel", "indeterminate", "invalid", "readonly"], outputs: ["indeterminateChange", "changed"] }, { kind: "component", type: CadPaginatorComponent, selector: "cad-paginator", inputs: ["first", "rows", "totalRecords", "rowsPerPageOptions", "rowsPerPageLabel", "pageLinks", "showCurrentPageReport", "currentPageReportTemplate", "showFirstLastIcon", "showPageLinks", "alwaysShow"], outputs: ["firstChange", "rowsChange", "pageChange"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: CadEditFocusDirective, selector: "[cadEditFocus]" }, { kind: "component", type: CadMenuComponent, selector: "cad-menu", inputs: ["items", "popup", "ariaLabel", "minWidth", "closeOnSelect", "mobile", "sheetTitle"], outputs: ["itemClick", "shown", "hidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10651
10651
  }
10652
10652
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadTableComponent, decorators: [{
10653
10653
  type: Component,
@@ -10684,7 +10684,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
10684
10684
  '[style.--_scroll-h]': 'scrollHeight() || null',
10685
10685
  '[style.--_detail-pl]': 'detailPaddingLeft()',
10686
10686
  '[style.--_indent]': 'indent()',
10687
- }, template: "<div class=\"dt\" #dt [class]=\"'dt ' + styleClass()\">\n <!-- barre de s\u00E9lection contextuelle (remplace la barre d'outils) -->\n @if (selectedCount() > 0 && showSelectionBar()) {\n <div class=\"dt-sel\" role=\"region\" aria-live=\"polite\">\n <cad-checkbox [value]=\"allState() === 'all'\" [indeterminate]=\"allState() === 'some'\" ariaLabel=\"Tout s\u00E9lectionner\" (changed)=\"toggleAll()\"/>\n <span>{{ selectedCount() }} {{ selectedCount() > 1 ? selectedLabelPlural() : selectedLabel() }}</span>\n <span class=\"dt-sel__grow\"></span>\n <ng-content select=\"[cadTableSelectionBar]\"/>\n <button type=\"button\" class=\"dt-sel__clear\" aria-label=\"Annuler la s\u00E9lection\" (click)=\"clearSelection()\"><cad-icon name=\"x\" [size]=\"14\"/></button>\n </div>\n } @else if (showToolbar()) {\n <div class=\"dt-bar\">\n @if (title()) {<span class=\"dt-bar__title\">{{ title() }}</span>}\n @if (showCount()) {<span class=\"dt-bar__count\">{{ count() ?? totalFiltered() }}</span>}\n @if (resp.stacked()) {\n <button type=\"button\" class=\"dt-bar__btn dt-bar__filters\" [class.is-on]=\"filtersOpen()\" [attr.aria-expanded]=\"filtersOpen()\" (click)=\"filtersOpen.set(!filtersOpen())\">\n <cad-icon name=\"filter\" [size]=\"13\"/>{{ filtersLabel() }}@if (activeFilterCount() > 0) {<span class=\"dt-bar__count\">{{ activeFilterCount() }}</span>}\n </button>\n }\n <span class=\"dt-bar__tools\" [class.is-open]=\"filtersOpen()\"><ng-content select=\"[cadTableToolbar]\"/></span>\n <span class=\"dt-bar__grow\"></span>\n @if (showSearch()) {\n <div class=\"dt-bar__search\">\n <cad-icon name=\"search\" [size]=\"14\"/>\n <input type=\"search\" [placeholder]=\"searchPlaceholder()\" [value]=\"searchText()\" (input)=\"onSearch($any($event.target).value)\" [attr.aria-label]=\"searchPlaceholder()\"/>\n @if (searchText()) {<button type=\"button\" class=\"dt-bar__clear\" aria-label=\"Effacer la recherche\" (click)=\"onSearch('', true)\"><cad-icon name=\"x\" [size]=\"12\"/></button>}\n </div>\n }\n <span class=\"dt-bar__tools-end\"><ng-content select=\"[cadTableToolbarEnd]\"/></span>\n @if (columnToggle()) {\n <div class=\"dt-bar__cols\">\n <button type=\"button\" class=\"dt-bar__btn\" [class.is-on]=\"colsMenuOpen()\" aria-haspopup=\"true\" [attr.aria-expanded]=\"colsMenuOpen()\" (click)=\"colsMenuOpen.set(!colsMenuOpen())\">\n {{ columnsLabel() }} <cad-icon name=\"chevron-down\" [size]=\"12\"/>\n </button>\n @if (colsMenuOpen()) {\n <div class=\"dt-bar__menu\" role=\"menu\" (keydown.escape)=\"colsMenuOpen.set(false)\">\n <div class=\"dt-bar__menu-title\">{{ columnsLabel() }}</div>\n @for (c of orderedColumns(); track c.id(); let ci = $index; let first = $first; let last = $last) {\n <label [class.is-locked]=\"!c.toggleable()\">\n <cad-checkbox [value]=\"!c.hidden()\" [disabled]=\"!c.toggleable()\" (changed)=\"toggleColumn(c, !$event)\"/>\n <span>{{ c.header() || c.field() }}</span>\n @if (reorderableColumns()) {\n <span class=\"mv\" (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <button type=\"button\" aria-label=\"Monter\" [disabled]=\"first\" (click)=\"moveColumn(ci, ci - 1)\"><cad-icon name=\"chevron-up\" [size]=\"12\"/></button>\n <button type=\"button\" aria-label=\"Descendre\" [disabled]=\"last\" (click)=\"moveColumn(ci, ci + 1)\"><cad-icon name=\"chevron-down\" [size]=\"12\"/></button>\n </span>\n }\n </label>\n }\n </div>\n }\n </div>\n }\n @if (showDensityToggle()) {\n <button type=\"button\" class=\"dt-bar__btn is-ghost dt-bar__density\" [class.is-on]=\"dense()\" [attr.aria-pressed]=\"dense()\" aria-label=\"Densit\u00E9\" title=\"Densit\u00E9\" (click)=\"dense.set(!dense())\"><cad-icon name=\"chevrons-up-down\" [size]=\"14\"/></button>\n }\n </div>\n }\n\n @if (showGroupZone() && !resp.stacked()) {\n <div class=\"dt-gz\" [class.is-empty]=\"!groupFields().length\" cdkDropList [id]=\"gzId\" cdkDropListOrientation=\"horizontal\" [cdkDropListData]=\"groupFields()\" [cdkDropListEnterPredicate]=\"gzEnter\" (cdkDropListDropped)=\"onGroupZoneDrop($event)\">\n <cad-icon name=\"layers\" [size]=\"14\"/>\n @if (!groupFields().length) {<span class=\"dt-gz__hint\">{{ groupZoneLabel() }}</span>}\n @for (f of groupFields(); track f) {\n <span class=\"dt-gz__chip\" cdkDrag [cdkDragData]=\"f\" cdkDragLockAxis=\"x\"><cad-icon name=\"drag\" [size]=\"11\" class=\"dt-gz__drag\"/><span>{{ groupChipLabel(f) }}</span><button type=\"button\" [attr.aria-label]=\"'Ne plus grouper par ' + groupChipLabel(f)\" (click)=\"ungroup(f)\"><cad-icon name=\"x\" [size]=\"11\"/></button></span>\n }\n </div>\n }\n\n <div class=\"dt-scroll\" #scroller (scroll)=\"onScroll()\">\n @if (loading() && hasData()) {<div class=\"dt-loading\"><cad-icon name=\"loader\" [size]=\"22\" spin/></div>}\n <table class=\"tbl\" [class]=\"'tbl ' + tableClass()\" [style]=\"tableStyle()\" [attr.aria-busy]=\"loading() ? 'true' : null\" [attr.aria-rowcount]=\"totalFiltered()\" [attr.role]=\"hierarchical() ? 'treegrid' : null\">\n @if (captionTpl()) {<caption><ng-container *ngTemplateOutlet=\"captionTpl()!.tpl\"/></caption>}\n <colgroup>\n @if (hasNumberColumn()) {<col style=\"width:44px\">}\n @if (hasSelectionColumn()) {<col style=\"width:36px\">}\n @if (rowDragEnabled()) {<col style=\"width:28px\">}\n @if (hasExpandColumn()) {<col style=\"width:30px\">}\n @for (c of visibleColumns(); track c.id()) {<col [style.width]=\"colWidth(c)\" [style.min-width]=\"c.minWidth() || null\" [style.max-width]=\"c.maxWidth() || null\">}\n @if (hasActionsColumn()) {<col [style.width]=\"rowActionsWidth()\">}\n </colgroup>\n <thead>\n @if (headerGroups().length && !resp.stacked()) {\n <tr class=\"hg\">\n @if (hasNumberColumn()) {<th [class]=\"stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\"></th>}\n @if (hasSelectionColumn()) {<th [class]=\"stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\"></th>}\n @if (rowDragEnabled()) {<th [class]=\"stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"></th>}\n @if (hasExpandColumn()) {<th [class]=\"stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"></th>}\n @for (g of headerGroups(); track $index) {<th scope=\"colgroup\" [attr.colspan]=\"g.span\" [class]=\"'hg-cell ' + (g.class || '')\">{{ g.header }}</th>}\n @if (hasActionsColumn()) {<th [class]=\"stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"></th>}\n </tr>\n }\n <tr cdkDropList cdkDropListOrientation=\"horizontal\" [cdkDropListDisabled]=\"!reorderableColumns() && !showGroupZone()\" [cdkDropListSortingDisabled]=\"!reorderableColumns()\" [cdkDropListConnectedTo]=\"showGroupZone() ? [gzId] : []\" (cdkDropListDropped)=\"onColumnDrop($event)\">\n @if (hasNumberColumn()) {<th class=\"col-num\" scope=\"col\" data-sk=\"num\" [class]=\"'col-num ' + stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\">#</th>}\n @if (hasSelectionColumn()) {\n <th class=\"col-sel\" scope=\"col\" data-sk=\"sel\" [class]=\"'col-sel ' + stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\">\n @if (selectionMode() === 'multiple' && selectAll()) {\n <cad-checkbox [value]=\"allState() === 'all'\" [indeterminate]=\"allState() === 'some'\" ariaLabel=\"Tout s\u00E9lectionner\" (changed)=\"toggleAll()\"/>\n }\n </th>\n }\n @if (rowDragEnabled()) {<th class=\"col-drag\" scope=\"col\" data-sk=\"drag\" [class]=\"'col-drag ' + stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"><span hidden>D\u00E9placer</span></th>}\n @if (hasExpandColumn()) {<th class=\"col-exp\" scope=\"col\" data-sk=\"exp\" [class]=\"'col-exp ' + stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"><span hidden>D\u00E9tail</span></th>}\n @for (c of visibleColumns(); track c.id()) {\n <th scope=\"col\" [attr.data-sk]=\"c.id()\" [class]=\"thClass(c) + (canDrag(c) ? ' can-drag' : '') + (showsMenu(c) ? ' has-menu' : '') + (hasColFilter(c) ? ' is-filtered' : '')\" [attr.aria-sort]=\"ariaSort(c)\" [style.width]=\"colWidth(c)\" [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\"\n cdkDrag [cdkDragDisabled]=\"!canDrag(c)\" [cdkDragData]=\"c\" [cdkDragLockAxis]=\"showGroupZone() ? null : 'x'\" cdkDragPreviewClass=\"dt-th-preview\" [cdkDragBoundary]=\"showGroupZone() ? '' : '.tbl thead'\">\n @if (canDrag(c)) {<span class=\"dh\" cdkDragHandle aria-hidden=\"true\" title=\"D\u00E9placer la colonne\"><cad-icon name=\"drag\" [size]=\"12\"/></span>}\n @if (c.headerTpl()) {\n <ng-container *ngTemplateOutlet=\"c.headerTpl()!.tpl; context: { $implicit: c }\"/>\n } @else if (c.sortable()) {\n <button type=\"button\" class=\"hd\" (click)=\"sort(c, $event)\" [attr.aria-label]=\"'Trier par ' + c.header()\">\n <span class=\"hd-txt\">{{ c.header() }}</span>\n <cad-icon [name]=\"sortIcon(c)\" [size]=\"12\"/>\n @if (sortMode() === 'multiple' && sortIndex(c) > 0) {<span class=\"hd-idx\">{{ sortIndex(c) }}</span>}\n </button>\n } @else {\n <span class=\"hd\"><span class=\"hd-txt\">{{ c.header() }}</span></span>\n }\n @if (showsMenu(c)) {<button type=\"button\" class=\"hm\" [class.is-on]=\"menuColumn() === c && !!headerMenu()?.visible()\" aria-label=\"Menu de la colonne\" aria-haspopup=\"menu\" (click)=\"openHeaderMenu(c, $event)\" (pointerdown)=\"$event.stopPropagation()\"><cad-icon name=\"more-vertical\" [size]=\"13\"/></button>}\n @if (isResizable(c)) {<span class=\"rz\" [class.is-active]=\"resizingId() === c.id()\" (pointerdown)=\"startResize($event, c)\" aria-hidden=\"true\"></span>}\n </th>\n }\n @if (hasActionsColumn()) {<th class=\"col-acts\" scope=\"col\" data-sk=\"acts\" [class]=\"'col-acts ' + stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"><span hidden>Actions</span></th>}\n </tr>\n @if (hasFilterRow()) {\n <tr class=\"flt\">\n @if (hasNumberColumn()) {<th [class]=\"stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\"></th>}\n @if (hasSelectionColumn()) {<th [class]=\"stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\"></th>}\n @if (rowDragEnabled()) {<th [class]=\"stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"></th>}\n @if (hasExpandColumn()) {<th [class]=\"stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"></th>}\n @for (c of visibleColumns(); track c.id()) {\n <th [class]=\"stickyClass(c.id())\" [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\">\n @if (c.filterable()) {\n @if (c.filterTpl()) {\n <ng-container *ngTemplateOutlet=\"c.filterTpl()!.tpl; context: { $implicit: c, value: filterValue(c), filter: filterFn(c) }\"/>\n } @else {\n @let kind = filterKind(c);\n @let op = filterOp(c);\n <div class=\"flt-cell\" [class.is-active]=\"hasColFilter(c)\" [class.is-range]=\"op.range\">\n @if (kind === 'boolean') {\n <select [value]=\"filterValue(c) == null ? '' : '' + filterValue(c)\" (change)=\"setFilter(c, $any($event.target).value === '' ? null : $any($event.target).value === 'true')\" [attr.aria-label]=\"'Filtrer ' + c.header()\">\n <option value=\"\">{{ c.filterPlaceholder() || 'Tous' }}</option><option value=\"true\">Oui</option><option value=\"false\">Non</option>\n </select>\n } @else if (kind === 'select' && op.mode !== 'eq') {\n <button type=\"button\" class=\"flt-in\" [class.is-ph]=\"!filterArray(c).length\" [attr.aria-label]=\"'Filtrer ' + c.header()\" (click)=\"openInMenu(c, $event)\">\n <span>{{ filterArray(c).length ? filterArray(c).length + ' s\u00E9lectionn\u00E9' + (filterArray(c).length > 1 ? 's' : '') : (c.filterPlaceholder() || 'Tous') }}</span><cad-icon name=\"chevron-down\" [size]=\"11\"/>\n </button>\n } @else if (kind === 'select') {\n <select [value]=\"filterValue(c) ?? ''\" (change)=\"setFilter(c, $any($event.target).value || null, 'eq')\" [attr.aria-label]=\"'Filtrer ' + c.header()\">\n <option value=\"\">{{ c.filterPlaceholder() || 'Tous' }}</option>\n @for (o of c.filterOptions(); track $index) {<option [value]=\"o.value\" [selected]=\"o.value === filterValue(c)\">{{ o.label }}</option>}\n </select>\n } @else if (!op.needsValue) {\n <span class=\"flt-txt\">{{ op.label }}</span>\n } @else if (op.range) {\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 0)\" placeholder=\"min\" (input)=\"setFilterPart(c, 0, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header() + ' (min)'\"/>\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 1)\" placeholder=\"max\" (input)=\"setFilterPart(c, 1, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header() + ' (max)'\"/>\n } @else {\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 0)\" [placeholder]=\"c.filterPlaceholder() || op.label\" (input)=\"setFilterDebounced(c, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header()\"/>\n }\n @if (kind !== 'boolean') {\n <button type=\"button\" class=\"flt-op\" [class.is-on]=\"hasColFilter(c) || op.mode !== filterOp(c).mode\" [attr.aria-label]=\"'Op\u00E9rateur : ' + op.label\" [title]=\"op.label\" (click)=\"openFilterMenu(c, $event)\"><cad-icon name=\"filter\" [size]=\"12\"/></button>\n }\n @if (hasColFilter(c)) {<button type=\"button\" class=\"flt-x\" aria-label=\"Effacer le filtre\" (click)=\"clearColumnFilter(c)\"><cad-icon name=\"x\" [size]=\"11\"/></button>}\n </div>\n }\n }\n </th>\n }\n @if (hasActionsColumn()) {<th [class]=\"stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"></th>}\n </tr>\n }\n </thead>\n <tbody cdkDropList [cdkDropListDisabled]=\"!rowDragEnabled()\" cdkDropListLockAxis=\"y\" (cdkDropListDropped)=\"onRowDrop($event)\">\n @if (loading() && !hasData()) {\n @for (i of skeletonRows(); track i) {\n <tr class=\"dt-row is-skeleton\" aria-hidden=\"true\">\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id()) {<td [class]=\"tdClass(c)\"><div class=\"skel\" [style.width.%]=\"skeletonWidth(i, $index)\" [style.margin-left]=\"c.effectiveAlign() === 'right' ? 'auto' : null\"></div></td>}\n @if (hasActionsColumn()) {<td></td>}\n </tr>\n }\n } @else if (!displayRows().length) {\n <tr class=\"dt-empty\"><td [attr.colspan]=\"colspan()\">\n @if (emptyTpl()) {<ng-container *ngTemplateOutlet=\"emptyTpl()!.tpl\"/>}\n @else {\n <div class=\"empty\">\n @if (emptyIcon()) {<cad-icon [name]=\"emptyIcon()\" [size]=\"26\" [strokeWidth]=\"1.5\"/>}\n <b>{{ emptyMessage() }}</b>\n @if (emptyHint()) {<span>{{ emptyHint() }}</span>}\n </div>\n }\n </td></tr>\n } @else {\n @if (virtual.range().topPad > 0) {<tr class=\"dt-vpad\" aria-hidden=\"true\"><td [attr.colspan]=\"colspan()\" [style.height.px]=\"virtual.range().topPad\"></td></tr>}\n @for (d of renderRows(); track d.trackKey; let vi = $index) {\n @let i = vi + virtual.range().start;\n @if (d.kind === 'group') {\n <!-- en-t\u00EAte de groupe -->\n <tr class=\"dt-group\" [class.is-expanded]=\"d.node!.expanded\" [style.--_lvl]=\"d.level\" role=\"row\" [attr.aria-level]=\"d.level + 1\" [attr.aria-expanded]=\"d.node!.expanded\">\n <td [attr.colspan]=\"colspan()\" class=\"dt-group__cell\">\n <div class=\"dt-group__inner\">\n @if (hasSelectionColumn() && selectionMode() === 'multiple') {\n <cad-checkbox [value]=\"nodeState(d) === 'on'\" [indeterminate]=\"nodeState(d) === 'some'\" [ariaLabel]=\"'S\u00E9lectionner le groupe ' + d.node!.group!.label\" (changed)=\"toggleGroupSelection(d, $event)\"/>\n }\n <button type=\"button\" class=\"exp\" [attr.aria-expanded]=\"d.node!.expanded\" [attr.aria-label]=\"d.node!.expanded ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleGroup(d.node!)\"><cad-icon name=\"chevron-right\" [size]=\"13\"/></button>\n @if (groupHeaderTpl()) {\n <ng-container *ngTemplateOutlet=\"groupHeaderTpl()!.tpl; context: groupCtx(d)\"/>\n } @else {\n <span class=\"dt-group__label\">{{ d.node!.group!.label }}</span>\n <span class=\"dt-group__count\">{{ d.node!.group!.count }}</span>\n }\n </div>\n </td>\n </tr>\n } @else if (d.kind === 'groupFooter') {\n <!-- pied de groupe (agr\u00E9gats) -->\n <tr class=\"dt-group-foot\" [style.--_lvl]=\"d.level\">\n @if (groupFooterTpl()) {\n <td [attr.colspan]=\"colspan()\"><ng-container *ngTemplateOutlet=\"groupFooterTpl()!.tpl; context: groupCtx(d)\"/></td>\n } @else {\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id(); let ci = $index) {\n <td [class]=\"tdClass(c)\" [attr.data-l]=\"c.header()\">\n @if (ci === 0 && !hasAggregate(c)) {<span class=\"dt-group-foot__label\">Total {{ d.node!.group!.label }}</span>}\n @else if (hasAggregate(c)) {{{ formatCell(d.node!.group!.aggregates[c.field()], c) }}}\n </td>\n }\n @if (hasActionsColumn()) {<td></td>}\n }\n </tr>\n } @else if (resp.stacked() && cardTpl()) {\n <!-- carte custom (mode stack) -->\n <tr class=\"dt-row dt-card\" [class]=\"rowClasses(d.row, i, d)\" [style]=\"rowStyle()?.(d.row, i) || null\" [attr.tabindex]=\"selectionMode() ? 0 : null\" [attr.aria-selected]=\"selectionMode() ? isSelected(d.row) : null\"\n (click)=\"onRowClick(d.row, i, $event)\" (keydown)=\"onRowKey(d, i, $event)\">\n <td [attr.colspan]=\"colspan()\"><ng-container *ngTemplateOutlet=\"cardTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, node: d.node, selected: isSelected(d.row) }\"/></td>\n </tr>\n } @else {\n <!-- ligne -->\n <tr class=\"dt-row\" [class]=\"rowClasses(d.row, i, d)\" [style]=\"rowStyle()?.(d.row, i) || null\" [style.--_lvl]=\"d.level\" [attr.data-key]=\"d.key\" [class.is-editing-row]=\"isRowEditing(d.row)\"\n cdkDrag [cdkDragDisabled]=\"!canDragRow(d.row)\" [cdkDragData]=\"d.row\" cdkDragLockAxis=\"y\" cdkDragPreviewClass=\"dt-tr-preview\" cdkDragBoundary=\".tbl\"\n [attr.tabindex]=\"selectionMode() || hierarchical() ? 0 : null\" [attr.aria-selected]=\"selectionMode() ? isSelected(d.row) : null\"\n [attr.role]=\"hierarchical() ? 'row' : null\" [attr.aria-level]=\"hierarchical() ? d.level + 1 : null\" [attr.aria-expanded]=\"d.node?.hasChildren ? d.node!.expanded : null\"\n [attr.aria-setsize]=\"d.node ? d.node.setSize : null\" [attr.aria-posinset]=\"d.node ? d.node.posInSet : null\"\n (click)=\"onRowClick(d.row, i, $event)\" (dblclick)=\"rowDblClick.emit({ row: d.row, index: i, event: $event })\" (keydown)=\"onRowKey(d, i, $event)\">\n @if (hasNumberColumn()) {<td class=\"col-num\" [class]=\"'col-num ' + stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\">{{ rowNumber(d) }}</td>}\n @if (hasSelectionColumn()) {\n <td class=\"col-sel\" [class]=\"'col-sel ' + stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\">\n @if (canSelect(d.row)) {\n @if (selectionMode() === 'multiple') {\n <cad-checkbox [value]=\"nodeState(d) === 'on'\" [indeterminate]=\"nodeState(d) === 'some'\" [ariaLabel]=\"'S\u00E9lectionner la ligne ' + (i + 1)\" (changed)=\"toggleRow(d.row, i, $event)\"/>\n } @else {\n <cad-checkbox [value]=\"isSelected(d.row)\" [ariaLabel]=\"'S\u00E9lectionner la ligne ' + (i + 1)\" (changed)=\"selectSingle(d.row, i)\"/>\n }\n }\n </td>\n }\n @if (rowDragEnabled()) {\n <td class=\"col-drag\" [class]=\"'col-drag ' + stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\">\n @if (canDragRow(d.row)) {<span class=\"rdh\" cdkDragHandle title=\"D\u00E9placer la ligne\" aria-hidden=\"true\"><cad-icon name=\"drag\" [size]=\"13\"/></span>}\n </td>\n }\n @if (hasExpandColumn()) {\n <td class=\"col-exp\" [class]=\"'col-exp ' + stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\">\n @if (canExpand(d.row)) {\n <button type=\"button\" class=\"exp\" [attr.aria-expanded]=\"isExpanded(d.row)\" [attr.aria-label]=\"isExpanded(d.row) ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleExpand(d.row, $event)\"><cad-icon name=\"chevron-right\" [size]=\"13\"/></button>\n }\n </td>\n }\n @for (c of visibleColumns(); track c.id(); let cFirst = $first) {\n <td [class]=\"tdClass(c) + ' ' + stickyClass(c.id()) + (isTreeColumn(c) ? ' dt-tree-cell' : '') + (cFirst ? ' dt-first' : '') + (editUi.canEditCell(c) ? ' is-editable' : '') + (edit.isEditing(d.row, c) ? ' is-editing' : '')\"\n [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\" [attr.data-l]=\"c.header()\"\n (click)=\"editUi.onCellClick(d.row, c, $event, false)\" (dblclick)=\"editUi.onCellClick(d.row, c, $event, true)\">\n @if (edit.isEditing(d.row, c) && c.field()) {\n <!-- \u00E9diteur inline (mode cell ou row) -->\n <div class=\"dt-editor\" [class.is-invalid]=\"!!edit.cellError(d.row, c)\" (click)=\"$event.stopPropagation()\" (dblclick)=\"$event.stopPropagation()\" (keydown)=\"editUi.onKey(d.row, c, $event)\" (focusout)=\"editUi.onBlur(d.row, c)\">\n @if (c.editorTpl()) {\n <ng-container *ngTemplateOutlet=\"c.editorTpl()!.tpl; context: editUi.ctxFor(d.row, c, i)\"/>\n } @else {\n @switch (c.editor()) {\n @case ('select') {\n <select cadEditFocus [attr.aria-label]=\"c.header()\" (change)=\"editUi.onInput(d.row, c, $any($event.target).value)\">\n @for (o of c.effectiveEditorOptions(); track $index) {<option [value]=\"o.value\" [selected]=\"o.value === edit.valueOf(d.row, c)\">{{ o.label }}</option>}\n </select>\n }\n @case ('checkbox') {<input type=\"checkbox\" cadEditFocus [checked]=\"!!edit.valueOf(d.row, c)\" [attr.aria-label]=\"c.header()\" (change)=\"editUi.onInput(d.row, c, $any($event.target).checked)\"/>}\n @case ('textarea') {<textarea cadEditFocus rows=\"3\" [value]=\"edit.valueOf(d.row, c) ?? ''\" [attr.aria-label]=\"c.header()\" (input)=\"editUi.onInput(d.row, c, $any($event.target).value)\"></textarea>}\n @default {<input cadEditFocus [type]=\"editUi.inputType(c)\" [value]=\"edit.valueOf(d.row, c) ?? ''\" [attr.aria-label]=\"c.header()\" [attr.aria-invalid]=\"edit.cellError(d.row, c) ? 'true' : null\" (input)=\"editUi.onInput(d.row, c, $any($event.target).value)\"/>}\n }\n }\n @if (edit.cellError(d.row, c)) {<span class=\"dt-editor__err\" role=\"alert\">{{ edit.cellError(d.row, c) }}</span>}\n </div>\n } @else {\n @if (editUi.canEditCell(c) && showEditIcon()) {<button type=\"button\" class=\"ce\" tabindex=\"-1\" aria-label=\"Modifier\" (click)=\"$event.stopPropagation(); editUi.startEdit(d.row, c)\"><cad-icon name=\"edit\" [size]=\"11\"/></button>}\n @if (isTreeColumn(c) && d.node) {\n <span class=\"cad-tree-toggle\" [style.--_lvl]=\"d.level\">\n @if (showTreeLines()) { @for (l of levelsOf(d.level); track l) {<i class=\"tl\" aria-hidden=\"true\"></i>} }\n @else {<i class=\"ind\" aria-hidden=\"true\"></i>}\n <button type=\"button\" class=\"tg\" [class.is-leaf]=\"!d.node.hasChildren\" [class.is-open]=\"d.node.expanded\" [attr.tabindex]=\"d.node.hasChildren ? 0 : -1\"\n [attr.aria-expanded]=\"d.node.hasChildren ? d.node.expanded : null\" [attr.aria-label]=\"d.node.expanded ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleNode(d.node, $event)\">\n @if (d.node.loading) {<cad-icon name=\"loader\" [size]=\"12\" spin/>} @else {<cad-icon name=\"chevron-right\" [size]=\"13\"/>}\n </button>\n @if (treeIconOf(d.row)) {<cad-icon class=\"ic\" [name]=\"treeIconOf(d.row)!\" [size]=\"14\"/>}\n </span>\n }\n @if (c.cellTpl()) {\n <ng-container *ngTemplateOutlet=\"c.cellTpl()!.tpl; context: { $implicit: d.row, value: cell(d.row, c), rowIndex: i, column: c, level: d.level, expanded: d.node?.expanded ?? false, hasChildren: d.node?.hasChildren ?? false, node: d.node }\"/>\n } @else {<span class=\"cell-txt\">{{ formatCell(cell(d.row, c), c) }}</span>}\n }\n </td>\n }\n @if (hasActionsColumn()) {\n <td class=\"col-acts\" [class]=\"'col-acts ' + stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"><span class=\"acts\" (click)=\"$event.stopPropagation()\">\n @if ((editMode() === 'row' || editMode() === 'row-inline') && showRowEditButton()) {\n @if (isRowEditing(d.row)) {\n <button type=\"button\" class=\"re ok\" aria-label=\"Enregistrer la ligne\" title=\"Enregistrer\" (click)=\"saveRowEdit(d.row)\"><cad-icon name=\"check\" [size]=\"15\"/></button>\n <button type=\"button\" class=\"re ko\" aria-label=\"Annuler l'\u00E9dition\" title=\"Annuler\" (click)=\"cancelRowEdit(d.row)\"><cad-icon name=\"x\" [size]=\"15\"/></button>\n } @else {\n <button type=\"button\" class=\"re\" aria-label=\"Modifier la ligne\" title=\"Modifier\" (click)=\"initRowEdit(d.row)\"><cad-icon name=\"edit\" [size]=\"14\"/></button>\n }\n }\n @if (rowActionsTpl()) {<ng-container *ngTemplateOutlet=\"rowActionsTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, node: d.node, editing: isRowEditing(d.row) }\"/>}\n </span></td>\n }\n </tr>\n @if (isExpanded(d.row) && hasExpandColumn()) {\n <tr class=\"dt-detail\" [style.--_lvl]=\"d.level\"><td [attr.colspan]=\"colspan()\">\n @if (expansionTpl()) {\n <ng-container *ngTemplateOutlet=\"expansionTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, hiddenColumns: hiddenByPriority(), node: d.node }\"/>\n } @else {\n <div class=\"kv\">\n @for (c of hiddenByPriority(); track c.id()) {<div><b>{{ c.header() || c.field() }}</b>\n @if (c.cellTpl()) {<ng-container *ngTemplateOutlet=\"c.cellTpl()!.tpl; context: { $implicit: d.row, value: cell(d.row, c), rowIndex: i, column: c, level: d.level, expanded: false, hasChildren: false, node: d.node }\"/>}\n @else {{{ formatCell(cell(d.row, c), c) }}}\n </div>}\n </div>\n }\n </td></tr>\n }\n }\n }\n @if (virtual.range().bottomPad > 0) {<tr class=\"dt-vpad\" aria-hidden=\"true\"><td [attr.colspan]=\"colspan()\" [style.height.px]=\"virtual.range().bottomPad\"></td></tr>}\n }\n </tbody>\n @if (footerTpl() || showGrandTotalRow()) {\n <tfoot>\n @if (showGrandTotalRow()) {\n <tr class=\"dt-grand\">\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id(); let ci = $index) {\n <td [class]=\"tdClass(c)\" [attr.data-l]=\"c.header()\">\n @if (ci === 0 && !hasAggregate(c)) {{{ grandTotalLabel() }}}\n @else if (hasAggregate(c)) {{{ formatCell(grandTotal()[c.field()], c) }}}\n </td>\n }\n @if (hasActionsColumn()) {<td></td>}\n </tr>\n }\n @if (footerTpl()) {<ng-container *ngTemplateOutlet=\"footerTpl()!.tpl; context: { $implicit: pageData(), columns: visibleColumns(), aggregates: grandTotal() }\"/>}\n </tfoot>\n }\n </table>\n </div>\n\n @if ((usePaginator() && (paginationTotal() > 0 || lazy())) || showRowCount()) {\n <div class=\"dt-foot\" [class.has-count]=\"showRowCount()\">\n @if (showRowCount()) {\n <span class=\"dt-foot__count\">\n @if (rowCountTpl()) {<ng-container *ngTemplateOutlet=\"rowCountTpl()!.tpl; context: { $implicit: totalRows(), total: totalRows(), filtered: totalFiltered(), selected: selectedCount() }\"/>}\n @else {{{ totalRows() }} {{ rowCountLabel() }}@if (totalFiltered() !== totalRows()) { \u00B7 {{ totalFiltered() }} filtr\u00E9e{{ totalFiltered() > 1 ? 's' : '' }}}@if (selectedCount() > 0) { \u00B7 {{ selectedCount() }} s\u00E9lectionn\u00E9e{{ selectedCount() > 1 ? 's' : '' }}}}\n </span>\n }\n @if (usePaginator() && (paginationTotal() > 0 || lazy())) {\n <cad-paginator [first]=\"first()\" [rows]=\"rows()\" [totalRecords]=\"paginationTotal()\" [rowsPerPageOptions]=\"rowsPerPageOptions()\" [pageLinks]=\"resp.stacked() ? 3 : pageLinks()\"\n [showCurrentPageReport]=\"showCurrentPageReport()\" [currentPageReportTemplate]=\"currentPageReportTemplate()\" [showFirstLastIcon]=\"showFirstLastIcon()\"\n [alwaysShow]=\"alwaysShowPaginator()\" (pageChange)=\"onPage($event)\"/>\n }\n </div>\n }\n <cad-menu #hmenu popup [items]=\"menuItems()\" ariaLabel=\"Menu de la colonne\"/>\n <cad-menu #fmenu popup [items]=\"filterMenuItems()\" ariaLabel=\"Op\u00E9rateur de filtre\" [minWidth]=\"200\"/>\n <cad-menu #inmenu popup [closeOnSelect]=\"false\" [items]=\"inMenuItems()\" ariaLabel=\"Valeurs du filtre\" [minWidth]=\"180\"/>\n</div>\n", styles: [":host{--_row-h: var(--cad-table-row-h, 42px);--_cell-px: 12px;display:block;min-width:0;max-width:100%;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg)}:host(.is-dense){--_row-h: 34px}.dt{border:1px solid var(--cad-border);border-radius:var(--cad-radius-lg);background:var(--cad-surface);overflow:hidden;position:relative}:host(.is-borderless) .dt{border:0;border-radius:0}.dt-bar{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--cad-border);flex-wrap:wrap}.dt-bar__title{font-weight:600;font-size:13.5px;margin-right:4px}.dt-bar__count{font:500 11px var(--cad-font-mono);padding:2px 7px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.dt-bar__grow{flex:1}.dt-bar__search{position:relative;display:flex;align-items:center;width:240px;max-width:100%}.dt-bar__search cad-icon{position:absolute;left:9px;color:var(--cad-fg-muted);pointer-events:none}.dt-bar__search input{width:100%;box-sizing:border-box;height:30px;padding:0 28px 0 30px;font:var(--cad-font-size) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);outline:0;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.dt-bar__search input::placeholder{color:var(--cad-fg-muted)}.dt-bar__search input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.dt-bar__search .dt-bar__clear{position:absolute;right:6px;border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;padding:2px;border-radius:4px}.dt-bar__search .dt-bar__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.dt-bar__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:26px;padding:0 8px;border-radius:var(--cad-radius-sm);border:1px solid var(--cad-border-strong);background:transparent;color:var(--cad-fg-secondary);font:500 var(--cad-font-size-sm) var(--cad-font);cursor:pointer;white-space:nowrap}.dt-bar__btn:hover{background:var(--cad-hover);color:var(--cad-fg)}.dt-bar__btn:focus-visible{outline:2px solid var(--cad-ring);outline-offset:1px}.dt-bar__btn.is-ghost{border-color:transparent;width:26px;padding:0}.dt-bar__btn.is-on{color:var(--cad-accent);background:var(--cad-accent-soft)}.dt-bar__cols{position:relative}.dt-bar__menu{position:absolute;right:0;top:calc(100% + 6px);z-index:20;min-width:200px;max-height:280px;overflow:auto;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);padding:4px}.dt-bar__menu label{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:var(--cad-font-size)}.dt-bar__menu label:hover{background:var(--cad-hover)}.dt-bar__menu label.is-locked{opacity:.5;cursor:default}.dt-bar__menu-title{font:600 10px/1 var(--cad-font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--cad-fg-muted);padding:6px 8px 4px}.dt-sel{display:flex;align-items:center;gap:8px;padding:8px 12px;background:var(--cad-accent-soft);border-bottom:1px solid var(--cad-border);font-size:12.5px;color:var(--cad-accent);font-weight:500;min-height:47px;box-sizing:border-box}.dt-sel__grow{flex:1}.dt-sel__clear{border:0;background:transparent;color:inherit;cursor:pointer;display:grid;place-items:center;width:26px;height:26px;border-radius:6px}.dt-sel__clear:hover{background:var(--cad-accent-soft)}.dt-scroll{overflow:auto;position:relative}:host(.has-scroll-height) .dt-scroll{max-height:var(--_scroll-h);scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent;scrollbar-gutter:stable}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar{width:10px;height:10px}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-thumb{background:var(--cad-border-strong);border-radius:999px;border:2px solid var(--cad-surface)}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-thumb:hover{background:var(--cad-fg-muted)}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-track{background:transparent}.dt-loading{position:absolute;inset:0;display:grid;place-items:center;background:color-mix(in srgb,var(--cad-surface) 55%,transparent);z-index:5}.dt-loading cad-icon{color:var(--cad-accent)}.tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--cad-font-size)}:host(.is-resizable) .tbl{table-layout:fixed}.tbl caption{text-align:left;padding:10px 12px;font-weight:600;color:var(--cad-fg-secondary);font-size:var(--cad-font-size-sm)}.tbl th{position:relative;text-align:left;font-weight:600;font-size:var(--cad-font-size-sm);color:var(--cad-fg-secondary);background:var(--cad-bg-subtle);padding:0 var(--_cell-px);height:38px;border-bottom:1px solid var(--cad-border);white-space:nowrap;-webkit-user-select:none;user-select:none;box-sizing:border-box}:host(.is-sticky-header) .tbl thead th{position:sticky;top:0;z-index:3}.tbl th.al-right{text-align:right}.tbl th.al-center{text-align:center}.tbl th.st-left,.tbl td.st-left{position:sticky;left:0;z-index:2;background:var(--cad-surface)}.tbl th.st-right,.tbl td.st-right{position:sticky;right:0;z-index:2;background:var(--cad-surface)}.tbl th.st-left,.tbl th.st-right{background:var(--cad-bg-subtle);z-index:4}.tbl th .hd{display:inline-flex;align-items:center;gap:4px;max-width:100%}.tbl th.al-right .hd{flex-direction:row-reverse}.tbl th .hd-txt{overflow:hidden;text-overflow:ellipsis}.tbl th button.hd{all:unset;display:inline-flex;align-items:center;gap:4px;cursor:pointer;border-radius:4px;max-width:100%}.tbl th button.hd:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.tbl th .hd cad-icon{opacity:0;transition:opacity var(--cad-dur);flex:none}.tbl th:hover .hd cad-icon{opacity:.6}.tbl th.is-sorted .hd{color:var(--cad-accent)}.tbl th.is-sorted .hd cad-icon{opacity:1}.tbl th .hd-idx{font:600 9px var(--cad-font-mono);background:var(--cad-accent-soft);color:var(--cad-accent);border-radius:999px;padding:1px 4px}.tbl th .rz{position:absolute;right:0;top:8px;bottom:8px;width:5px;cursor:col-resize;z-index:1}.tbl th .rz:after{content:\"\";position:absolute;right:2px;top:0;bottom:0;width:1px;background:var(--cad-border);transition:background var(--cad-dur)}.tbl th .rz:hover:after,.tbl th .rz.is-active:after{background:var(--cad-accent);width:2px}.tbl th.col-sel,.tbl td.col-sel{width:36px;padding-right:0}.tbl th.col-exp,.tbl td.col-exp{width:30px;padding:0 4px}.tbl th.col-acts,.tbl td.col-acts{text-align:right;white-space:nowrap}.tbl tr.flt th{height:auto;padding:6px var(--_cell-px);background:var(--cad-surface);font-weight:400}.tbl tr.flt input,.tbl tr.flt select{width:100%;box-sizing:border-box;height:26px;padding:0 8px;font:var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);outline:0}.tbl tr.flt input:focus,.tbl tr.flt select:focus{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.tbl td{padding:0 var(--_cell-px);height:var(--_row-h);border-bottom:1px solid var(--cad-border);vertical-align:middle;font-variant-numeric:tabular-nums;box-sizing:border-box}.tbl td.al-right{text-align:right}.tbl td.al-center{text-align:center}.tbl td.dt-num{font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm)}.tbl td.is-nowrap{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host(.is-bordered) .tbl td,:host(.is-bordered) .tbl th{border-right:1px solid var(--cad-border)}:host(.is-bordered) .tbl td:last-child,:host(.is-bordered) .tbl th:last-child{border-right:0}.tbl tbody tr:last-child td{border-bottom:0}:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td{background:var(--cad-table-stripe, var(--cad-bg-subtle))}:host(.is-hoverable) .tbl tbody tr.dt-row:hover td{background:var(--cad-hover)}.tbl tbody tr.dt-row.is-selectable{cursor:pointer}.tbl tbody tr.dt-row:focus-visible{outline:none}.tbl tbody tr.dt-row:focus-visible td{background:var(--cad-hover);box-shadow:inset 0 0 0 1px var(--cad-ring)}.tbl tbody tr.dt-row.is-selected td{background:var(--cad-accent-soft)}.tbl tbody tr.dt-row.is-selected td:first-child{box-shadow:inset 3px 0 0 var(--cad-accent)}.tbl tbody tr.dt-row.is-selected:focus-visible td{box-shadow:inset 0 0 0 1px var(--cad-ring)}.tbl tbody tr.dt-row.is-selected:focus-visible td:first-child{box-shadow:inset 3px 0 0 var(--cad-accent),inset 0 0 0 1px var(--cad-ring)}.tbl .exp{width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0}.tbl .exp:hover{background:var(--cad-elevated);color:var(--cad-fg)}.tbl .exp:focus-visible{outline:2px solid var(--cad-ring)}.tbl .exp cad-icon{transition:transform var(--cad-dur)}.tbl tr.is-expanded .exp cad-icon{transform:rotate(90deg)}.tbl .acts{display:inline-flex;gap:2px;align-items:center;opacity:0;transition:opacity var(--cad-dur)}.tbl tr:hover .acts,.tbl tr.is-selected .acts,.tbl tr:focus-within .acts{opacity:1}:host(.acts-always) .tbl .acts{opacity:1}.tbl tr.dt-detail td{background:var(--cad-bg-subtle);height:auto;padding:12px var(--_cell-px) 14px var(--_detail-pl, 58px)}:host(.is-hoverable) .tbl tr.dt-detail:hover td{background:var(--cad-bg-subtle)}.tbl tfoot td{background:var(--cad-bg-subtle);font-weight:600;color:var(--cad-fg-secondary);border-top:1px solid var(--cad-border);border-bottom:0}.kv{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px 22px;font-size:12.5px}.kv b{display:block;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);margin-bottom:4px}.skel{height:12px;border-radius:4px;background:linear-gradient(90deg,var(--cad-elevated),var(--cad-hover),var(--cad-elevated));background-size:200% 100%;animation:cad-tbl-sh 1.4s infinite}@keyframes cad-tbl-sh{to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.skel{animation:none}.tbl .acts,.tbl .exp cad-icon,.tbl th .hd cad-icon{transition:none}}.empty{display:grid;place-items:center;gap:6px;padding:34px 12px;text-align:center;color:var(--cad-fg-secondary);font-size:12.5px}.empty cad-icon{color:var(--cad-fg-muted)}.empty b{color:var(--cad-fg);font-size:var(--cad-font-size)}.dt-foot{display:flex;align-items:center;gap:14px;padding:8px 12px;border-top:1px solid var(--cad-border)}.dt-foot cad-paginator{flex:1}\n", ".tbl th.st-left,.tbl td.st-left,.tbl th.st-right,.tbl td.st-right{position:sticky;z-index:2;background:var(--cad-surface);background-clip:padding-box}.tbl thead th.st-left,.tbl thead th.st-right{z-index:4;background:var(--cad-bg-subtle)}:host(.is-sticky-header) .tbl thead th.st-left,:host(.is-sticky-header) .tbl thead th.st-right{z-index:5}:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td.st-left,:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td.st-right{background:var(--cad-table-stripe, var(--cad-bg-subtle))}:host(.is-hoverable) .tbl tbody tr.dt-row:hover td.st-left,:host(.is-hoverable) .tbl tbody tr.dt-row:hover td.st-right{background:var(--cad-hover)}.tbl tbody tr.dt-row.is-selected td.st-left,.tbl tbody tr.dt-row.is-selected td.st-right{background:color-mix(in srgb,var(--cad-accent) 12%,var(--cad-surface))}.tbl td.st-last-left,.tbl th.st-last-left{transition:box-shadow var(--cad-dur)}:host(.is-scrolled-x) .tbl td.st-last-left,:host(.is-scrolled-x) .tbl th.st-last-left{box-shadow:1px 0 0 var(--cad-border),6px 0 12px -6px #0000002e}:host(:not(.is-scrolled-x-end)) .tbl td.st-first-right,:host(:not(.is-scrolled-x-end)) .tbl th.st-first-right{box-shadow:-1px 0 0 var(--cad-border),-6px 0 12px -6px #0000002e}.tbl td.st-right.col-acts .acts{background:inherit}.tbl td.dt-tree-cell{white-space:nowrap}.tbl td.dt-tree-cell .cell-txt{white-space:normal}.cad-tree-toggle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px}.cad-tree-toggle .ind{display:inline-block;width:calc(var(--_lvl, 0) * var(--_indent, 20px));flex:none}.cad-tree-toggle .tl{display:inline-block;width:var(--_indent, 20px);align-self:stretch;flex:none;position:relative}:host(.has-tree-lines) .tbl td.dt-tree-cell{padding-top:0;padding-bottom:0}:host(.has-tree-lines) .cad-tree-toggle{align-self:stretch;height:var(--_row-h)}:host(.has-tree-lines) .cad-tree-toggle .tl:before{content:\"\";position:absolute;left:9px;top:0;bottom:0;border-left:1px solid var(--cad-border)}.cad-tree-toggle .tg{width:20px;height:20px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0;flex:none}.cad-tree-toggle .tg:hover{background:var(--cad-elevated);color:var(--cad-fg)}.cad-tree-toggle .tg:focus-visible{outline:2px solid var(--cad-ring)}.cad-tree-toggle .tg cad-icon{transition:transform var(--cad-dur)}.cad-tree-toggle .tg.is-open cad-icon{transform:rotate(90deg)}.cad-tree-toggle .tg.is-leaf{visibility:hidden;pointer-events:none}.cad-tree-toggle .ic{color:var(--cad-fg-muted);margin:0 6px 0 2px}.tbl tr.dt-row.lvl-0.has-children td.dt-tree-cell{font-weight:500}.tbl tr.dt-group td{background:var(--cad-bg-subtle);height:34px;padding:0 var(--_cell-px);border-bottom:1px solid var(--cad-border)}.dt-group__inner{display:flex;align-items:center;gap:6px;padding-left:calc(var(--_lvl, 0) * var(--_indent, 20px));font-weight:600;font-size:var(--cad-font-size-sm)}.dt-group__inner .exp{width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0}.dt-group__inner .exp:hover{background:var(--cad-elevated);color:var(--cad-fg)}.dt-group__inner .exp cad-icon{transition:transform var(--cad-dur)}.tbl tr.dt-group.is-expanded .dt-group__inner .exp cad-icon{transform:rotate(90deg)}.dt-group__count{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.tbl tr.dt-group-foot td{background:var(--cad-bg-subtle);height:32px;color:var(--cad-fg-secondary);font-size:var(--cad-font-size-sm);border-bottom:1px solid var(--cad-border)}.tbl tr.dt-group-foot td.dt-num,.tbl tr.dt-grand td.dt-num{font-family:var(--cad-font-mono);font-weight:600}.dt-group-foot__label{padding-left:calc(var(--_lvl, 0) * var(--_indent, 20px) + 26px);font-weight:500}.tbl tfoot tr.dt-grand td{background:var(--cad-bg-subtle);font-weight:600;color:var(--cad-fg);border-top:2px solid var(--cad-border);height:36px}:host(.is-hoverable) .tbl tr.dt-group:hover td,:host(.is-hoverable) .tbl tr.dt-group-foot:hover td{background:var(--cad-bg-subtle)}.tbl tr.dt-detail td{padding-left:calc(var(--_detail-pl, 58px) + var(--_lvl, 0) * var(--_indent, 20px))}.dt-bar__tools,.dt-bar__tools-end{display:contents}.dt-bar__filters{display:inline-flex}.dt-bar__filters .dt-bar__count{padding:1px 6px;font-size:10px}:host(.is-stacked) .dt-bar{gap:8px}:host(.is-stacked) .dt-bar__tools{display:none}:host(.is-stacked) .dt-bar__tools.is-open{display:flex;flex-wrap:wrap;align-items:center;gap:8px;flex-basis:100%;order:10;padding-top:8px;border-top:1px dashed var(--cad-border)}:host(.is-stacked) .dt-bar__grow{display:none}:host(.is-stacked) .dt-bar__search{order:5;flex-basis:100%;width:100%}:host(.is-stacked) .dt-bar__cols,:host(.is-stacked) .dt-bar__density{display:none}:host(.is-stacked) .dt-sel{position:sticky;bottom:0;z-index:6;flex-wrap:wrap;border-top:1px solid var(--cad-border);order:99}:host(.is-stacked) .dt-scroll{overflow-x:hidden}:host(.is-stacked) .tbl,:host(.is-stacked) .tbl tbody,:host(.is-stacked) .tbl tfoot,:host(.is-stacked) .tbl tr,:host(.is-stacked) .tbl td{display:block}:host(.is-stacked) .tbl thead,:host(.is-stacked) .tbl colgroup,:host(.is-stacked) .tbl caption{display:none}:host(.is-stacked) .tbl tr.dt-row{position:relative;padding:10px 12px;border-bottom:1px solid var(--cad-border);height:auto}:host(.is-stacked) .tbl tr.dt-row.has-sel{padding-left:44px}:host(.is-stacked) .tbl tr.dt-row.is-selected{background:var(--cad-accent-soft);box-shadow:inset 3px 0 0 var(--cad-accent)}:host(.is-hoverable.is-stacked) .tbl tr.dt-row:hover{background:var(--cad-hover)}:host(.is-hoverable.is-stacked) .tbl tr.dt-row:hover td,:host(.is-stacked) .tbl tr.dt-row.is-selected td,:host(.is-striped.is-stacked) .tbl tr.dt-row td{background:transparent!important;box-shadow:none!important}:host(.is-stacked) .tbl tr.dt-row:focus-visible{box-shadow:inset 0 0 0 1px var(--cad-ring)}:host(.is-stacked) .tbl td{height:auto;padding:2px 0;border:0;white-space:normal;display:flex;justify-content:space-between;align-items:baseline;gap:12px;font-size:12.5px;position:static}:host(.is-stacked) .tbl td.st-left,:host(.is-stacked) .tbl td.st-right{position:static}:host(.is-stacked) .tbl td[data-l]:before{content:attr(data-l);color:var(--cad-fg-muted);font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.04em;flex:none}:host(.is-stacked) .tbl td.col-sel{position:absolute;left:12px;top:12px;padding:0;width:auto}:host(.is-stacked) .tbl td.col-sel:before,:host(.is-stacked) .tbl td.col-exp:before,:host(.is-stacked) .tbl td.col-acts:before,:host(.is-stacked) .tbl td.dt-tree-cell:before,:host(.is-stacked) .tbl td.dt-first:before{content:none}:host(.is-stacked) .tbl td.col-exp{position:absolute;right:44px;top:8px;padding:0;width:auto}:host(.is-stacked) .tbl td.dt-first,:host(.is-stacked) .tbl td.dt-tree-cell{display:block;font-size:14px;font-weight:500;padding:0 44px 6px 0}:host(.is-stacked) .tbl td.dt-tree-cell .cad-tree-toggle .ind,:host(.is-stacked) .tbl td.dt-tree-cell .cad-tree-toggle .tl{display:none}:host(.is-stacked) .tbl td.col-acts{position:absolute;right:8px;top:8px;padding:0;width:auto}:host(.is-stacked) .tbl .acts{opacity:1}:host(.is-stacked) .tbl td.dt-num{text-align:right}:host(.is-stacked) .tbl tr.dt-detail td{padding:8px 12px 10px}:host(.is-stacked) .tbl tr.dt-row.lvl-1{margin-left:22px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-row.lvl-2{margin-left:44px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-row.lvl-3{margin-left:66px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-group td{padding:8px 12px;height:auto;display:block}:host(.is-stacked) .tbl tr.dt-group-foot{display:flex;flex-wrap:wrap;gap:4px 14px;padding:6px 12px 6px 44px}:host(.is-stacked) .tbl tr.dt-group-foot td{padding:0}:host(.is-stacked) .tbl tr.dt-group-foot td:empty{display:none}:host(.is-stacked) .tbl tfoot tr.dt-grand{padding:8px 12px}:host(.is-stacked) .tbl tfoot tr.dt-grand td:empty{display:none}:host(.is-stacked) .tbl tr.dt-empty td{display:block}:host(.is-stacked) .tbl tr.is-skeleton td{display:block;padding:4px 0}:host(.is-stacked) .tbl tr.dt-card td{padding:0;display:block}:host(.is-stacked) .dt-foot{flex-wrap:wrap;gap:8px}:host(.is-stacked) .dt-foot ::ng-deep .cad-paginator__rpp{display:none}\n", ".tbl th .dh{display:none;position:absolute;left:2px;top:50%;transform:translateY(-50%);width:14px;height:18px;color:var(--cad-fg-muted);cursor:grab;border-radius:3px;place-items:center}.tbl th .dh:hover{color:var(--cad-fg);background:var(--cad-elevated)}:host(.is-reorderable) .tbl th.can-drag{padding-left:calc(var(--_cell-px) + 6px)}:host(.is-reorderable) .tbl th.can-drag:hover .dh,:host(.is-reorderable) .tbl th.can-drag.cdk-drag-dragging .dh{display:grid}.tbl th.cdk-drag-placeholder{opacity:.35;background:var(--cad-accent-soft)}.tbl th.cdk-drag-placeholder:before{content:\"\";position:absolute;left:-1px;top:4px;bottom:4px;width:2px;background:var(--cad-accent)}.cdk-drag-preview.dt-th-preview{display:flex;align-items:center;height:38px;padding:0 12px;box-sizing:border-box;font:600 var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:6px;box-shadow:var(--cad-shadow-lg);list-style:none}.tbl thead tr.cdk-drop-list-dragging th:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.tbl th.cdk-drag-animating{transition:transform .2s cubic-bezier(0,0,.2,1)}.dt-bar__menu .mv{display:inline-flex;gap:0;margin-left:auto}.dt-bar__menu .mv button{border:0;background:transparent;color:var(--cad-fg-muted);width:20px;height:20px;border-radius:4px;cursor:pointer;display:grid;place-items:center;padding:0}.dt-bar__menu .mv button:hover:not([disabled]){background:var(--cad-hover);color:var(--cad-fg)}.dt-bar__menu .mv button[disabled]{opacity:.3;cursor:default}.tbl tr.hg th{height:30px;text-align:center;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);border-bottom:1px solid var(--cad-border)}.tbl tr.hg th.hg-cell{border-left:1px solid var(--cad-border)}.tbl tr.hg th.hg-cell:first-child{border-left:0}:host(.is-sticky-header) .tbl tr.hg th{position:sticky;top:0;z-index:3}:host(.is-sticky-header) .tbl tr.hg+tr th{top:30px}.tbl tr.dt-vpad td{padding:0;border:0;height:auto}:host(.is-virtual) .dt-scroll{overflow-anchor:none}:host(.edit-cell) .tbl td.is-editable{cursor:text;position:relative}:host(.edit-cell.is-hoverable) .tbl tbody tr.dt-row td.is-editable:hover{background:var(--cad-hover);box-shadow:inset 0 0 0 1px var(--cad-border-strong)}:host(.show-edit-icon) .tbl td.is-editable{padding-right:calc(var(--_cell-px) + 16px)}.tbl td .ce{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:20px;height:20px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0;opacity:0;transition:opacity var(--cad-dur),background var(--cad-dur)}.tbl td.is-editable:hover .ce,.tbl td .ce:focus-visible{opacity:.7}.tbl td .ce:hover{opacity:1!important;background:var(--cad-elevated);color:var(--cad-fg)}.tbl td.is-editing{padding-top:0;padding-bottom:0;background:var(--cad-surface)!important;box-shadow:none!important}.dt-editor{position:relative;display:flex;align-items:stretch;min-height:calc(var(--_row-h) - 8px);margin:4px 0}.tbl td.is-editing{height:auto;vertical-align:top}.dt-editor input,.dt-editor select,.dt-editor textarea{width:100%;height:calc(var(--_row-h) - 8px);box-sizing:border-box;padding:0 8px;font:var(--cad-font-size) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-accent);border-radius:var(--cad-radius-sm);outline:0;box-shadow:0 0 0 3px var(--cad-ring)}.dt-editor input[type=number]{font-family:var(--cad-font-mono);text-align:right}.dt-editor textarea{height:auto;min-height:76px;padding:6px 8px;resize:vertical;line-height:1.45;font:var(--cad-font-size)/1.45 var(--cad-font)}.dt-editor input[type=checkbox]{width:16px;height:16px;box-shadow:none;accent-color:var(--cad-accent)}.dt-editor.is-invalid input,.dt-editor.is-invalid select,.dt-editor.is-invalid textarea{border-color:var(--cad-danger);box-shadow:0 0 0 3px var(--cad-danger-soft)}.dt-editor__err{position:absolute;left:0;top:calc(100% + 4px);z-index:6;padding:3px 8px;border-radius:6px;background:var(--cad-danger);color:#fff;font-size:11px;white-space:nowrap;box-shadow:var(--cad-shadow-md);pointer-events:none}.dt-editor__err:before{content:\"\";position:absolute;left:10px;top:-4px;width:8px;height:8px;background:inherit;transform:rotate(45deg)}:host(.edit-row) .tbl tr.dt-row.is-editing-row td{background:var(--cad-accent-soft)}.tbl .acts .re{display:inline-grid;place-items:center;width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--cad-fg-secondary);cursor:pointer;padding:0}.tbl .acts .re:hover{background:var(--cad-hover);color:var(--cad-fg)}.tbl .acts .re.ok{color:var(--cad-success)}.tbl .acts .re.ko{color:var(--cad-danger)}.tbl .acts .re:focus-visible{outline:2px solid var(--cad-ring)}:host(.edit-row) .tbl tr.is-editing-row .acts{opacity:1}\n", ".dt-scroll{scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent}.dt-scroll::-webkit-scrollbar{height:10px;width:10px}.dt-scroll::-webkit-scrollbar-thumb{background:var(--cad-border-strong);border-radius:999px;border:2px solid var(--cad-surface)}.dt-scroll::-webkit-scrollbar-thumb:hover{background:var(--cad-fg-muted)}.dt-scroll::-webkit-scrollbar-track{background:transparent}.tbl th.has-menu{padding-right:calc(var(--_cell-px) + 20px)}.tbl th .hm{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0;opacity:0;transition:opacity var(--cad-dur),background var(--cad-dur);z-index:2}.tbl th:hover .hm,.tbl th .hm:focus-visible,.tbl th .hm.is-on,.tbl th.is-sorted .hm,.tbl th.is-filtered .hm{opacity:1}.tbl th .hm:hover,.tbl th .hm.is-on{background:var(--cad-elevated);color:var(--cad-fg)}.tbl th.is-filtered .hd-txt{color:var(--cad-accent)}:host(.is-resizable) .tbl th.has-menu .hm{right:10px}.tbl tr.flt th{padding:5px 6px}.flt-cell{position:relative;display:flex;align-items:center;gap:4px;min-width:0}.flt-cell input,.flt-cell select,.flt-cell .flt-in{flex:1 1 0;min-width:0;height:28px;padding:0 26px 0 8px;box-sizing:border-box;font:var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);outline:0;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.flt-cell.is-range input{padding-right:8px}.flt-cell.is-range input:last-of-type{padding-right:26px}.flt-cell input:focus,.flt-cell select:focus,.flt-cell .flt-in:focus-visible{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.flt-cell.is-active input,.flt-cell.is-active select,.flt-cell.is-active .flt-in{border-color:var(--cad-accent);background:var(--cad-accent-soft)}.flt-cell .flt-in{display:inline-flex;align-items:center;justify-content:space-between;gap:6px;text-align:left;cursor:pointer}.flt-cell .flt-in.is-ph{color:var(--cad-fg-muted)}.flt-cell .flt-in cad-icon{color:var(--cad-fg-muted);flex:none}.flt-cell .flt-txt{flex:1;height:28px;display:inline-flex;align-items:center;padding:0 26px 0 8px;font:italic var(--cad-font-size-sm) var(--cad-font);color:var(--cad-accent);background:var(--cad-accent-soft);border:1px solid var(--cad-accent);border-radius:var(--cad-radius-sm);box-sizing:border-box}.flt-cell .flt-op{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:20px;height:20px;border:0;border-radius:4px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0}.flt-cell .flt-op:hover,.flt-cell .flt-op.is-on{color:var(--cad-accent);background:var(--cad-accent-soft)}.flt-cell.is-active .flt-op{right:22px}.flt-cell .flt-x{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:18px;height:18px;border:0;border-radius:4px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0}.flt-cell .flt-x:hover{color:var(--cad-danger);background:var(--cad-danger-soft)}.flt-cell select{appearance:none;padding-right:26px}.dt-gz{display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-height:40px;padding:6px 12px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle);color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}.dt-gz.cdk-drop-list-receiving,.dt-gz.cdk-drop-list-dragging{background:var(--cad-accent-soft);color:var(--cad-accent);outline:1px dashed var(--cad-accent);outline-offset:-4px}.dt-gz__hint{font-style:italic}.dt-gz__chip{display:inline-flex;align-items:center;gap:5px;height:26px;padding:0 4px 0 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500;cursor:grab}.dt-gz__chip .dt-gz__drag{opacity:.6}.dt-gz__chip button{width:18px;height:18px;border:0;border-radius:50%;background:transparent;color:inherit;display:grid;place-items:center;cursor:pointer;padding:0}.dt-gz__chip button:hover{background:var(--cad-accent);color:var(--cad-fg-on-accent)}.dt-gz__chip.cdk-drag-placeholder{opacity:.35}.cdk-drag-preview.dt-gz__chip{box-shadow:var(--cad-shadow-md)}:host(.is-stacked) .dt-gz{display:none}.tbl th.col-num,.tbl td.col-num{width:44px;text-align:right;font:11px var(--cad-font-mono);color:var(--cad-fg-muted);background:var(--cad-bg-subtle);padding:0 8px;-webkit-user-select:none;user-select:none}.tbl th.col-num{font-weight:600}.tbl tbody tr:hover td.col-num{background:var(--cad-bg-subtle)}:host(.is-stacked) .tbl td.col-num{position:absolute;left:auto;right:12px;bottom:6px;width:auto;background:transparent;padding:0}:host(.is-stacked) .tbl td.col-num:before{content:none}.tbl th.col-drag,.tbl td.col-drag{width:28px;padding:0 4px}.tbl td.col-drag .rdh{display:inline-grid;place-items:center;width:20px;height:24px;color:var(--cad-fg-muted);cursor:grab;opacity:0;transition:opacity var(--cad-dur);border-radius:4px}.tbl tbody tr:hover td.col-drag .rdh,.tbl tr.cdk-drag-dragging td.col-drag .rdh{opacity:.8}.tbl td.col-drag .rdh:hover{color:var(--cad-fg);background:var(--cad-elevated)}.tbl tr.dt-row.cdk-drag-placeholder{opacity:0}.tbl tbody.cdk-drop-list-dragging tr.dt-row:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.tbl tr.dt-row.cdk-drag-placeholder td{border-top:2px solid var(--cad-accent)}.cdk-drag-preview.dt-tr-preview{display:table;table-layout:fixed;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:8px;box-shadow:var(--cad-shadow-lg);opacity:.95;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg)}.cdk-drag-preview.dt-tr-preview td{padding:0 12px;height:42px;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host(.is-stacked) .tbl td.col-drag{display:none}.dt-foot__count{font:var(--cad-font-size-sm) var(--cad-font-mono);color:var(--cad-fg-secondary);white-space:nowrap}.dt-foot.has-count cad-paginator{flex:1}\n"] }]
10687
+ }, template: "<div class=\"dt\" #dt [class]=\"'dt ' + styleClass()\">\n <!-- barre de s\u00E9lection contextuelle (remplace la barre d'outils) -->\n @if (selectedCount() > 0 && showSelectionBar()) {\n <div class=\"dt-sel\" role=\"region\" aria-live=\"polite\">\n <cad-checkbox [value]=\"allState() === 'all'\" [indeterminate]=\"allState() === 'some'\" ariaLabel=\"Tout s\u00E9lectionner\" (changed)=\"toggleAll()\"/>\n <span>{{ selectedCount() }} {{ selectedCount() > 1 ? selectedLabelPlural() : selectedLabel() }}</span>\n <span class=\"dt-sel__grow\"></span>\n <ng-content select=\"[cadTableSelectionBar]\"/>\n <button type=\"button\" class=\"dt-sel__clear\" aria-label=\"Annuler la s\u00E9lection\" (click)=\"clearSelection()\"><cad-icon name=\"x\" [size]=\"14\"/></button>\n </div>\n } @else if (showToolbar()) {\n <div class=\"dt-bar\">\n @if (title()) {<span class=\"dt-bar__title\">{{ title() }}</span>}\n @if (showCount()) {<span class=\"dt-bar__count\">{{ count() ?? totalFiltered() }}</span>}\n @if (resp.stacked()) {\n <button type=\"button\" class=\"dt-bar__btn dt-bar__filters\" [class.is-on]=\"filtersOpen()\" [attr.aria-expanded]=\"filtersOpen()\" (click)=\"filtersOpen.set(!filtersOpen())\">\n <cad-icon name=\"filter\" [size]=\"13\"/>{{ filtersLabel() }}@if (activeFilterCount() > 0) {<span class=\"dt-bar__count\">{{ activeFilterCount() }}</span>}\n </button>\n }\n <span class=\"dt-bar__tools\" [class.is-open]=\"filtersOpen()\"><ng-content select=\"[cadTableToolbar]\"/></span>\n <span class=\"dt-bar__grow\"></span>\n @if (showSearch()) {\n <div class=\"dt-bar__search\">\n <cad-icon name=\"search\" [size]=\"14\"/>\n <input type=\"search\" [placeholder]=\"searchPlaceholder()\" [value]=\"searchText()\" (input)=\"onSearch($any($event.target).value)\" [attr.aria-label]=\"searchPlaceholder()\"/>\n @if (searchText()) {<button type=\"button\" class=\"dt-bar__clear\" aria-label=\"Effacer la recherche\" (click)=\"onSearch('', true)\"><cad-icon name=\"x\" [size]=\"12\"/></button>}\n </div>\n }\n <span class=\"dt-bar__tools-end\"><ng-content select=\"[cadTableToolbarEnd]\"/></span>\n @if (columnToggle()) {\n <div class=\"dt-bar__cols\">\n <button type=\"button\" class=\"dt-bar__btn\" [class.is-on]=\"colsMenuOpen()\" aria-haspopup=\"true\" [attr.aria-expanded]=\"colsMenuOpen()\" (click)=\"colsMenuOpen.set(!colsMenuOpen())\">\n {{ columnsLabel() }} <cad-icon name=\"chevron-down\" [size]=\"12\"/>\n </button>\n @if (colsMenuOpen()) {\n <div class=\"dt-bar__menu\" role=\"menu\" (keydown.escape)=\"colsMenuOpen.set(false)\">\n <div class=\"dt-bar__menu-title\">{{ columnsLabel() }}</div>\n @for (c of orderedColumns(); track c.id(); let ci = $index; let first = $first; let last = $last) {\n <label [class.is-locked]=\"!c.toggleable()\">\n <cad-checkbox [value]=\"!c.hidden()\" [disabled]=\"!c.toggleable()\" (changed)=\"toggleColumn(c, !$event)\"/>\n <span>{{ c.header() || c.field() }}</span>\n @if (reorderableColumns()) {\n <span class=\"mv\" (click)=\"$event.stopPropagation(); $event.preventDefault()\">\n <button type=\"button\" aria-label=\"Monter\" [disabled]=\"first\" (click)=\"moveColumn(ci, ci - 1)\"><cad-icon name=\"chevron-up\" [size]=\"12\"/></button>\n <button type=\"button\" aria-label=\"Descendre\" [disabled]=\"last\" (click)=\"moveColumn(ci, ci + 1)\"><cad-icon name=\"chevron-down\" [size]=\"12\"/></button>\n </span>\n }\n </label>\n }\n </div>\n }\n </div>\n }\n @if (showDensityToggle()) {\n <button type=\"button\" class=\"dt-bar__btn is-ghost dt-bar__density\" [class.is-on]=\"dense()\" [attr.aria-pressed]=\"dense()\" aria-label=\"Densit\u00E9\" title=\"Densit\u00E9\" (click)=\"dense.set(!dense())\"><cad-icon name=\"chevrons-up-down\" [size]=\"14\"/></button>\n }\n </div>\n }\n\n @if (showGroupZone() && !resp.stacked()) {\n <div class=\"dt-gz\" [class.is-empty]=\"!groupFields().length\" cdkDropList [id]=\"gzId\" cdkDropListOrientation=\"horizontal\" [cdkDropListData]=\"groupFields()\" [cdkDropListEnterPredicate]=\"gzEnter\" (cdkDropListDropped)=\"onGroupZoneDrop($event)\">\n <cad-icon name=\"layers\" [size]=\"14\"/>\n @if (!groupFields().length) {<span class=\"dt-gz__hint\">{{ groupZoneLabel() }}</span>}\n @for (f of groupFields(); track f) {\n <span class=\"dt-gz__chip\" cdkDrag [cdkDragData]=\"f\" cdkDragLockAxis=\"x\"><cad-icon name=\"drag\" [size]=\"11\" class=\"dt-gz__drag\"/><span>{{ groupChipLabel(f) }}</span><button type=\"button\" [attr.aria-label]=\"'Ne plus grouper par ' + groupChipLabel(f)\" (click)=\"ungroup(f)\"><cad-icon name=\"x\" [size]=\"11\"/></button></span>\n }\n </div>\n }\n\n <div class=\"dt-scroll\" #scroller (scroll)=\"onScroll()\">\n @if (loading() && hasData()) {<div class=\"dt-loading\"><cad-icon name=\"loader\" [size]=\"22\" spin/></div>}\n <table class=\"tbl\" [class]=\"'tbl ' + tableClass()\" [style]=\"tableStyle()\" [attr.aria-busy]=\"loading() ? 'true' : null\" [attr.aria-rowcount]=\"totalFiltered()\" [attr.role]=\"hierarchical() ? 'treegrid' : null\">\n @if (captionTpl()) {<caption><ng-container *ngTemplateOutlet=\"captionTpl()!.tpl\"/></caption>}\n <colgroup>\n @if (hasNumberColumn()) {<col style=\"width:44px\">}\n @if (hasSelectionColumn()) {<col style=\"width:36px\">}\n @if (rowDragEnabled()) {<col style=\"width:28px\">}\n @if (hasExpandColumn()) {<col style=\"width:30px\">}\n @for (c of visibleColumns(); track c.id()) {<col [style.width]=\"colWidth(c)\" [style.min-width]=\"c.minWidth() || null\" [style.max-width]=\"c.maxWidth() || null\">}\n @if (hasActionsColumn()) {<col [style.width]=\"rowActionsWidth()\">}\n </colgroup>\n <thead>\n @if (headerGroups().length && !resp.stacked()) {\n <tr class=\"hg\">\n @if (hasNumberColumn()) {<th [class]=\"stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\"></th>}\n @if (hasSelectionColumn()) {<th [class]=\"stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\"></th>}\n @if (rowDragEnabled()) {<th [class]=\"stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"></th>}\n @if (hasExpandColumn()) {<th [class]=\"stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"></th>}\n @for (g of headerGroups(); track $index) {<th scope=\"colgroup\" [attr.colspan]=\"g.span\" [class]=\"'hg-cell ' + (g.class || '')\">{{ g.header }}</th>}\n @if (hasActionsColumn()) {<th [class]=\"stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"></th>}\n </tr>\n }\n <tr cdkDropList cdkDropListOrientation=\"horizontal\" [cdkDropListDisabled]=\"!reorderableColumns() && !showGroupZone()\" [cdkDropListSortingDisabled]=\"!reorderableColumns()\" [cdkDropListConnectedTo]=\"showGroupZone() ? [gzId] : []\" (cdkDropListDropped)=\"onColumnDrop($event)\">\n @if (hasNumberColumn()) {<th class=\"col-num\" scope=\"col\" data-sk=\"num\" [class]=\"'col-num ' + stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\">#</th>}\n @if (hasSelectionColumn()) {\n <th class=\"col-sel\" scope=\"col\" data-sk=\"sel\" [class]=\"'col-sel ' + stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\">\n @if (selectionMode() === 'multiple' && selectAll()) {\n <cad-checkbox [value]=\"allState() === 'all'\" [indeterminate]=\"allState() === 'some'\" ariaLabel=\"Tout s\u00E9lectionner\" (changed)=\"toggleAll()\"/>\n }\n </th>\n }\n @if (rowDragEnabled()) {<th class=\"col-drag\" scope=\"col\" data-sk=\"drag\" [class]=\"'col-drag ' + stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"><span hidden>D\u00E9placer</span></th>}\n @if (hasExpandColumn()) {<th class=\"col-exp\" scope=\"col\" data-sk=\"exp\" [class]=\"'col-exp ' + stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"><span hidden>D\u00E9tail</span></th>}\n @for (c of visibleColumns(); track c.id()) {\n <th scope=\"col\" [attr.data-sk]=\"c.id()\" [class]=\"thClass(c) + (canDrag(c) ? ' can-drag' : '') + (showsMenu(c) ? ' has-menu' : '') + (hasColFilter(c) ? ' is-filtered' : '')\" [attr.aria-sort]=\"ariaSort(c)\" [style.width]=\"colWidth(c)\" [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\"\n cdkDrag [cdkDragDisabled]=\"!canDrag(c)\" [cdkDragData]=\"c\" [cdkDragLockAxis]=\"showGroupZone() ? null : 'x'\" cdkDragPreviewClass=\"dt-th-preview\" [cdkDragBoundary]=\"showGroupZone() ? '' : '.tbl thead'\">\n @if (canDrag(c)) {<span class=\"dh\" cdkDragHandle aria-hidden=\"true\" title=\"D\u00E9placer la colonne\"><cad-icon name=\"drag\" [size]=\"12\"/></span>}\n @if (c.headerTpl()) {\n <ng-container *ngTemplateOutlet=\"c.headerTpl()!.tpl; context: { $implicit: c }\"/>\n } @else if (c.sortable()) {\n <button type=\"button\" class=\"hd\" (click)=\"sort(c, $event)\" [attr.aria-label]=\"'Trier par ' + c.header()\">\n <span class=\"hd-txt\">{{ c.header() }}</span>\n <cad-icon [name]=\"sortIcon(c)\" [size]=\"12\"/>\n @if (sortMode() === 'multiple' && sortIndex(c) > 0) {<span class=\"hd-idx\">{{ sortIndex(c) }}</span>}\n </button>\n } @else {\n <span class=\"hd\"><span class=\"hd-txt\">{{ c.header() }}</span></span>\n }\n @if (showsMenu(c)) {<button type=\"button\" class=\"hm\" [class.is-on]=\"menuColumn() === c && !!headerMenu()?.visible()\" aria-label=\"Menu de la colonne\" aria-haspopup=\"menu\" (click)=\"openHeaderMenu(c, $event)\" (pointerdown)=\"$event.stopPropagation()\"><cad-icon name=\"more-vertical\" [size]=\"13\"/></button>}\n @if (isResizable(c)) {<span class=\"rz\" [class.is-active]=\"resizingId() === c.id()\" (pointerdown)=\"startResize($event, c)\" aria-hidden=\"true\"></span>}\n </th>\n }\n @if (hasActionsColumn()) {<th class=\"col-acts\" scope=\"col\" data-sk=\"acts\" [class]=\"'col-acts ' + stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"><span hidden>Actions</span></th>}\n </tr>\n @if (hasFilterRow()) {\n <tr class=\"flt\">\n @if (hasNumberColumn()) {<th [class]=\"stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\"></th>}\n @if (hasSelectionColumn()) {<th [class]=\"stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\"></th>}\n @if (rowDragEnabled()) {<th [class]=\"stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\"></th>}\n @if (hasExpandColumn()) {<th [class]=\"stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\"></th>}\n @for (c of visibleColumns(); track c.id()) {\n <th [class]=\"stickyClass(c.id())\" [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\">\n @if (c.filterable()) {\n @if (c.filterTpl()) {\n <ng-container *ngTemplateOutlet=\"c.filterTpl()!.tpl; context: { $implicit: c, value: filterValue(c), filter: filterFn(c) }\"/>\n } @else {\n @let kind = filterKind(c);\n @let op = filterOp(c);\n <div class=\"flt-cell\" [class.is-active]=\"hasColFilter(c)\" [class.is-range]=\"op.range\">\n @if (kind === 'boolean') {\n <select [value]=\"filterValue(c) == null ? '' : '' + filterValue(c)\" (change)=\"setFilter(c, $any($event.target).value === '' ? null : $any($event.target).value === 'true')\" [attr.aria-label]=\"'Filtrer ' + c.header()\">\n <option value=\"\">{{ c.filterPlaceholder() || 'Tous' }}</option><option value=\"true\">Oui</option><option value=\"false\">Non</option>\n </select>\n } @else if (kind === 'select' && op.mode !== 'eq') {\n <button type=\"button\" class=\"flt-in\" [class.is-ph]=\"!filterArray(c).length\" [attr.aria-label]=\"'Filtrer ' + c.header()\" (click)=\"openInMenu(c, $event)\">\n <span>{{ filterArray(c).length ? filterArray(c).length + ' s\u00E9lectionn\u00E9' + (filterArray(c).length > 1 ? 's' : '') : (c.filterPlaceholder() || 'Tous') }}</span><cad-icon name=\"chevron-down\" [size]=\"11\"/>\n </button>\n } @else if (kind === 'select') {\n <select [value]=\"filterValue(c) ?? ''\" (change)=\"setFilter(c, $any($event.target).value || null, 'eq')\" [attr.aria-label]=\"'Filtrer ' + c.header()\">\n <option value=\"\">{{ c.filterPlaceholder() || 'Tous' }}</option>\n @for (o of c.filterOptions(); track $index) {<option [value]=\"o.value\" [selected]=\"o.value === filterValue(c)\">{{ o.label }}</option>}\n </select>\n } @else if (!op.needsValue) {\n <span class=\"flt-txt\">{{ op.label }}</span>\n } @else if (op.range) {\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 0)\" placeholder=\"min\" (input)=\"setFilterPart(c, 0, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header() + ' (min)'\"/>\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 1)\" placeholder=\"max\" (input)=\"setFilterPart(c, 1, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header() + ' (max)'\"/>\n } @else {\n <input [type]=\"kind === 'number' ? 'number' : kind === 'date' ? 'date' : 'search'\" [value]=\"filterPart(c, 0)\" [placeholder]=\"c.filterPlaceholder() || op.label\" (input)=\"setFilterDebounced(c, $any($event.target).value)\" [attr.aria-label]=\"'Filtrer ' + c.header()\"/>\n }\n @if (kind !== 'boolean') {\n <button type=\"button\" class=\"flt-op\" [class.is-on]=\"hasColFilter(c) || op.mode !== filterOp(c).mode\" [attr.aria-label]=\"'Op\u00E9rateur : ' + op.label\" [title]=\"op.label\" (click)=\"openFilterMenu(c, $event)\"><cad-icon name=\"filter\" [size]=\"12\"/></button>\n }\n @if (hasColFilter(c)) {<button type=\"button\" class=\"flt-x\" aria-label=\"Effacer le filtre\" (click)=\"clearColumnFilter(c)\"><cad-icon name=\"x\" [size]=\"11\"/></button>}\n </div>\n }\n }\n </th>\n }\n @if (hasActionsColumn()) {<th [class]=\"stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"></th>}\n </tr>\n }\n </thead>\n <tbody cdkDropList [cdkDropListDisabled]=\"!rowDragEnabled()\" cdkDropListLockAxis=\"y\" (cdkDropListDropped)=\"onRowDrop($event)\">\n @if (loading() && !hasData()) {\n @for (i of skeletonRows(); track i) {\n <tr class=\"dt-row is-skeleton\" aria-hidden=\"true\">\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id()) {<td [class]=\"tdClass(c)\"><div class=\"skel\" [style.width.%]=\"skeletonWidth(i, $index)\" [style.margin-left]=\"c.effectiveAlign() === 'right' ? 'auto' : null\"></div></td>}\n @if (hasActionsColumn()) {<td></td>}\n </tr>\n }\n } @else if (!displayRows().length) {\n <tr class=\"dt-empty\"><td [attr.colspan]=\"colspan()\">\n @if (emptyTpl()) {<ng-container *ngTemplateOutlet=\"emptyTpl()!.tpl\"/>}\n @else {\n <div class=\"empty\">\n @if (emptyIcon()) {<cad-icon [name]=\"emptyIcon()\" [size]=\"26\" [strokeWidth]=\"1.5\"/>}\n <b>{{ emptyMessage() }}</b>\n @if (emptyHint()) {<span>{{ emptyHint() }}</span>}\n </div>\n }\n </td></tr>\n } @else {\n @if (virtual.range().topPad > 0) {<tr class=\"dt-vpad\" aria-hidden=\"true\"><td [attr.colspan]=\"colspan()\" [style.height.px]=\"virtual.range().topPad\"></td></tr>}\n @for (d of renderRows(); track d.trackKey; let vi = $index) {\n @let i = vi + virtual.range().start;\n @if (d.kind === 'group') {\n <!-- en-t\u00EAte de groupe -->\n <tr class=\"dt-group\" [class.is-expanded]=\"d.node!.expanded\" [style.--_lvl]=\"d.level\" role=\"row\" [attr.aria-level]=\"d.level + 1\" [attr.aria-expanded]=\"d.node!.expanded\">\n <td [attr.colspan]=\"colspan()\" class=\"dt-group__cell\">\n <div class=\"dt-group__inner\">\n @if (hasSelectionColumn() && selectionMode() === 'multiple') {\n <cad-checkbox [value]=\"nodeState(d) === 'on'\" [indeterminate]=\"nodeState(d) === 'some'\" [ariaLabel]=\"'S\u00E9lectionner le groupe ' + d.node!.group!.label\" (changed)=\"toggleGroupSelection(d, $event)\"/>\n }\n <button type=\"button\" class=\"exp\" [attr.aria-expanded]=\"d.node!.expanded\" [attr.aria-label]=\"d.node!.expanded ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleGroup(d.node!)\"><cad-icon name=\"chevron-right\" [size]=\"13\"/></button>\n @if (groupHeaderTpl()) {\n <ng-container *ngTemplateOutlet=\"groupHeaderTpl()!.tpl; context: groupCtx(d)\"/>\n } @else {\n <span class=\"dt-group__label\">{{ d.node!.group!.label }}</span>\n <span class=\"dt-group__count\">{{ d.node!.group!.count }}</span>\n }\n </div>\n </td>\n </tr>\n } @else if (d.kind === 'groupFooter') {\n <!-- pied de groupe (agr\u00E9gats) -->\n <tr class=\"dt-group-foot\" [style.--_lvl]=\"d.level\">\n @if (groupFooterTpl()) {\n <td [attr.colspan]=\"colspan()\"><ng-container *ngTemplateOutlet=\"groupFooterTpl()!.tpl; context: groupCtx(d)\"/></td>\n } @else {\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id(); let ci = $index) {\n <td [class]=\"tdClass(c)\" [attr.data-l]=\"c.header()\">\n @if (ci === 0 && !hasAggregate(c)) {<span class=\"dt-group-foot__label\">Total {{ d.node!.group!.label }}</span>}\n @else if (hasAggregate(c)) {{{ formatCell(d.node!.group!.aggregates[c.field()], c) }}}\n </td>\n }\n @if (hasActionsColumn()) {<td></td>}\n }\n </tr>\n } @else if (resp.stacked() && cardTpl()) {\n <!-- carte custom (mode stack) -->\n <tr class=\"dt-row dt-card\" [class]=\"rowClasses(d.row, i, d)\" [style]=\"rowStyle()?.(d.row, i) || null\" [attr.tabindex]=\"selectionMode() ? 0 : null\" [attr.aria-selected]=\"selectionMode() ? isSelected(d.row) : null\"\n (click)=\"onRowClick(d.row, i, $event)\" (keydown)=\"onRowKey(d, i, $event)\">\n <td [attr.colspan]=\"colspan()\"><ng-container *ngTemplateOutlet=\"cardTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, node: d.node, selected: isSelected(d.row) }\"/></td>\n </tr>\n } @else {\n <!-- ligne -->\n <tr class=\"dt-row\" [class]=\"rowClasses(d.row, i, d)\" [style]=\"rowStyle()?.(d.row, i) || null\" [style.--_lvl]=\"d.level\" [attr.data-key]=\"d.key\" [class.is-editing-row]=\"isRowEditing(d.row)\"\n cdkDrag [cdkDragDisabled]=\"!canDragRow(d.row)\" [cdkDragData]=\"d.row\" cdkDragLockAxis=\"y\" cdkDragPreviewClass=\"dt-tr-preview\" cdkDragBoundary=\".tbl\"\n [attr.tabindex]=\"selectionMode() || hierarchical() ? 0 : null\" [attr.aria-selected]=\"selectionMode() ? isSelected(d.row) : null\"\n [attr.role]=\"hierarchical() ? 'row' : null\" [attr.aria-level]=\"hierarchical() ? d.level + 1 : null\" [attr.aria-expanded]=\"d.node?.hasChildren ? d.node!.expanded : null\"\n [attr.aria-setsize]=\"d.node ? d.node.setSize : null\" [attr.aria-posinset]=\"d.node ? d.node.posInSet : null\"\n (click)=\"onRowClick(d.row, i, $event)\" (dblclick)=\"rowDblClick.emit({ row: d.row, index: i, event: $event })\" (keydown)=\"onRowKey(d, i, $event)\">\n @if (hasNumberColumn()) {<td class=\"col-num\" [class]=\"'col-num ' + stickyClass('num')\" [style.left.px]=\"stickyLeft('num')\">{{ rowNumber(d) }}</td>}\n @if (hasSelectionColumn()) {\n <td class=\"col-sel\" [class]=\"'col-sel ' + stickyClass('sel')\" [style.left.px]=\"stickyLeft('sel')\">\n @if (canSelect(d.row)) {\n @if (selectionMode() === 'multiple') {\n <cad-checkbox [value]=\"nodeState(d) === 'on'\" [indeterminate]=\"nodeState(d) === 'some'\" [ariaLabel]=\"'S\u00E9lectionner la ligne ' + (i + 1)\" (changed)=\"toggleRow(d.row, i, $event)\"/>\n } @else {\n <cad-checkbox [value]=\"isSelected(d.row)\" [ariaLabel]=\"'S\u00E9lectionner la ligne ' + (i + 1)\" (changed)=\"selectSingle(d.row, i)\"/>\n }\n }\n </td>\n }\n @if (rowDragEnabled()) {\n <td class=\"col-drag\" [class]=\"'col-drag ' + stickyClass('drag')\" [style.left.px]=\"stickyLeft('drag')\">\n @if (canDragRow(d.row)) {<span class=\"rdh\" cdkDragHandle title=\"D\u00E9placer la ligne\" aria-hidden=\"true\"><cad-icon name=\"drag\" [size]=\"13\"/></span>}\n </td>\n }\n @if (hasExpandColumn()) {\n <td class=\"col-exp\" [class]=\"'col-exp ' + stickyClass('exp')\" [style.left.px]=\"stickyLeft('exp')\">\n @if (canExpand(d.row)) {\n <button type=\"button\" class=\"exp\" [attr.aria-expanded]=\"isExpanded(d.row)\" [attr.aria-label]=\"isExpanded(d.row) ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleExpand(d.row, $event)\"><cad-icon name=\"chevron-right\" [size]=\"13\"/></button>\n }\n </td>\n }\n @for (c of visibleColumns(); track c.id(); let cFirst = $first) {\n <td [class]=\"tdClass(c) + ' ' + stickyClass(c.id()) + (isTreeColumn(c) ? ' dt-tree-cell' : '') + (cFirst ? ' dt-first' : '') + (editUi.canEditCell(c) ? ' is-editable' : '') + (edit.isEditing(d.row, c) ? ' is-editing' : '')\"\n [style.left.px]=\"stickyLeft(c.id())\" [style.right.px]=\"stickyRight(c.id())\" [attr.data-l]=\"c.header()\"\n (click)=\"editUi.onCellClick(d.row, c, $event, false)\" (dblclick)=\"editUi.onCellClick(d.row, c, $event, true)\">\n @if (edit.isEditing(d.row, c) && c.field()) {\n <!-- \u00E9diteur inline (mode cell ou row) -->\n <div class=\"dt-editor\" [class.is-invalid]=\"!!edit.cellError(d.row, c)\" (click)=\"$event.stopPropagation()\" (dblclick)=\"$event.stopPropagation()\" (keydown)=\"editUi.onKey(d.row, c, $event)\" (focusout)=\"editUi.onBlur(d.row, c)\">\n @if (c.editorTpl()) {\n <ng-container *ngTemplateOutlet=\"c.editorTpl()!.tpl; context: editUi.ctxFor(d.row, c, i)\"/>\n } @else {\n @switch (c.editor()) {\n @case ('select') {\n <select cadEditFocus [attr.aria-label]=\"c.header()\" (change)=\"editUi.onInput(d.row, c, $any($event.target).value)\">\n @for (o of c.effectiveEditorOptions(); track $index) {<option [value]=\"o.value\" [selected]=\"o.value === edit.valueOf(d.row, c)\">{{ o.label }}</option>}\n </select>\n }\n @case ('checkbox') {<input type=\"checkbox\" cadEditFocus [checked]=\"!!edit.valueOf(d.row, c)\" [attr.aria-label]=\"c.header()\" (change)=\"editUi.onInput(d.row, c, $any($event.target).checked)\"/>}\n @case ('textarea') {<textarea cadEditFocus rows=\"3\" [value]=\"edit.valueOf(d.row, c) ?? ''\" [attr.aria-label]=\"c.header()\" (input)=\"editUi.onInput(d.row, c, $any($event.target).value)\"></textarea>}\n @default {<input cadEditFocus [type]=\"editUi.inputType(c)\" [value]=\"edit.valueOf(d.row, c) ?? ''\" [attr.aria-label]=\"c.header()\" [attr.aria-invalid]=\"edit.cellError(d.row, c) ? 'true' : null\" (input)=\"editUi.onInput(d.row, c, $any($event.target).value)\"/>}\n }\n }\n @if (edit.cellError(d.row, c)) {<span class=\"dt-editor__err\" role=\"alert\">{{ edit.cellError(d.row, c) }}</span>}\n </div>\n } @else {\n @if (editUi.canEditCell(c) && showEditIcon()) {<button type=\"button\" class=\"ce\" tabindex=\"-1\" aria-label=\"Modifier\" (click)=\"$event.stopPropagation(); editUi.startEdit(d.row, c)\"><cad-icon name=\"edit\" [size]=\"11\"/></button>}\n @if (isTreeColumn(c) && d.node) {\n <span class=\"cad-tree-toggle\" [style.--_lvl]=\"d.level\">\n @if (showTreeLines()) { @for (l of levelsOf(d.level); track l) {<i class=\"tl\" aria-hidden=\"true\"></i>} }\n @else {<i class=\"ind\" aria-hidden=\"true\"></i>}\n <button type=\"button\" class=\"tg\" [class.is-leaf]=\"!d.node.hasChildren\" [class.is-open]=\"d.node.expanded\" [attr.tabindex]=\"d.node.hasChildren ? 0 : -1\"\n [attr.aria-expanded]=\"d.node.hasChildren ? d.node.expanded : null\" [attr.aria-label]=\"d.node.expanded ? 'Replier' : 'D\u00E9plier'\" (click)=\"toggleNode(d.node, $event)\">\n @if (d.node.loading) {<cad-icon name=\"loader\" [size]=\"12\" spin/>} @else {<cad-icon name=\"chevron-right\" [size]=\"13\"/>}\n </button>\n @if (treeIconOf(d.row)) {<cad-icon class=\"ic\" [name]=\"treeIconOf(d.row)!\" [size]=\"14\"/>}\n </span>\n }\n @if (c.cellTpl()) {\n <ng-container *ngTemplateOutlet=\"c.cellTpl()!.tpl; context: { $implicit: d.row, value: cell(d.row, c), rowIndex: i, column: c, level: d.level, expanded: d.node?.expanded ?? false, hasChildren: d.node?.hasChildren ?? false, node: d.node }\"/>\n } @else {<span class=\"cell-txt\">{{ formatCell(cell(d.row, c), c) }}</span>}\n }\n </td>\n }\n @if (hasActionsColumn()) {\n <td class=\"col-acts\" [class]=\"'col-acts ' + stickyClass('acts')\" [style.right.px]=\"stickyRight('acts')\"><span class=\"acts\" (click)=\"$event.stopPropagation()\">\n @if ((editMode() === 'row' || editMode() === 'row-inline') && showRowEditButton()) {\n @if (isRowEditing(d.row)) {\n <button type=\"button\" class=\"re ok\" aria-label=\"Enregistrer la ligne\" title=\"Enregistrer\" (click)=\"saveRowEdit(d.row)\"><cad-icon name=\"check\" [size]=\"15\"/></button>\n <button type=\"button\" class=\"re ko\" aria-label=\"Annuler l'\u00E9dition\" title=\"Annuler\" (click)=\"cancelRowEdit(d.row)\"><cad-icon name=\"x\" [size]=\"15\"/></button>\n } @else {\n <button type=\"button\" class=\"re\" aria-label=\"Modifier la ligne\" title=\"Modifier\" (click)=\"initRowEdit(d.row)\"><cad-icon name=\"edit\" [size]=\"14\"/></button>\n }\n }\n @if (rowActionsTpl()) {<ng-container *ngTemplateOutlet=\"rowActionsTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, node: d.node, editing: isRowEditing(d.row) }\"/>}\n </span></td>\n }\n </tr>\n @if (isExpanded(d.row) && hasExpandColumn()) {\n <tr class=\"dt-detail\" [style.--_lvl]=\"d.level\"><td [attr.colspan]=\"colspan()\">\n @if (expansionTpl()) {\n <ng-container *ngTemplateOutlet=\"expansionTpl()!.tpl; context: { $implicit: d.row, rowIndex: i, hiddenColumns: hiddenByPriority(), node: d.node }\"/>\n } @else {\n <div class=\"kv\">\n @for (c of hiddenByPriority(); track c.id()) {<div><b>{{ c.header() || c.field() }}</b>\n @if (c.cellTpl()) {<ng-container *ngTemplateOutlet=\"c.cellTpl()!.tpl; context: { $implicit: d.row, value: cell(d.row, c), rowIndex: i, column: c, level: d.level, expanded: false, hasChildren: false, node: d.node }\"/>}\n @else {{{ formatCell(cell(d.row, c), c) }}}\n </div>}\n </div>\n }\n </td></tr>\n }\n }\n }\n @if (virtual.range().bottomPad > 0) {<tr class=\"dt-vpad\" aria-hidden=\"true\"><td [attr.colspan]=\"colspan()\" [style.height.px]=\"virtual.range().bottomPad\"></td></tr>}\n }\n </tbody>\n @if (footerTpl() || showGrandTotalRow()) {\n <tfoot>\n @if (showGrandTotalRow()) {\n <tr class=\"dt-grand\">\n @if (hasNumberColumn()) {<td class=\"col-num\"></td>}\n @if (hasSelectionColumn()) {<td class=\"col-sel\"></td>}\n @if (rowDragEnabled()) {<td class=\"col-drag\"></td>}\n @if (hasExpandColumn()) {<td class=\"col-exp\"></td>}\n @for (c of visibleColumns(); track c.id(); let ci = $index) {\n <td [class]=\"tdClass(c)\" [attr.data-l]=\"c.header()\">\n @if (ci === 0 && !hasAggregate(c)) {{{ grandTotalLabel() }}}\n @else if (hasAggregate(c)) {{{ formatCell(grandTotal()[c.field()], c) }}}\n </td>\n }\n @if (hasActionsColumn()) {<td></td>}\n </tr>\n }\n @if (footerTpl()) {<ng-container *ngTemplateOutlet=\"footerTpl()!.tpl; context: { $implicit: pageData(), columns: visibleColumns(), aggregates: grandTotal() }\"/>}\n </tfoot>\n }\n </table>\n </div>\n\n @if ((usePaginator() && (paginationTotal() > 0 || lazy())) || showRowCount()) {\n <div class=\"dt-foot\" [class.has-count]=\"showRowCount()\">\n @if (showRowCount()) {\n <span class=\"dt-foot__count\">\n @if (rowCountTpl()) {<ng-container *ngTemplateOutlet=\"rowCountTpl()!.tpl; context: { $implicit: totalRows(), total: totalRows(), filtered: totalFiltered(), selected: selectedCount() }\"/>}\n @else {{{ totalRows() }} {{ rowCountLabel() }}@if (totalFiltered() !== totalRows()) { \u00B7 {{ totalFiltered() }} filtr\u00E9e{{ totalFiltered() > 1 ? 's' : '' }}}@if (selectedCount() > 0) { \u00B7 {{ selectedCount() }} s\u00E9lectionn\u00E9e{{ selectedCount() > 1 ? 's' : '' }}}}\n </span>\n }\n @if (usePaginator() && (paginationTotal() > 0 || lazy())) {\n <cad-paginator [first]=\"first()\" [rows]=\"rows()\" [totalRecords]=\"paginationTotal()\" [rowsPerPageOptions]=\"rowsPerPageOptions()\" [pageLinks]=\"resp.stacked() ? 3 : pageLinks()\"\n [showCurrentPageReport]=\"showCurrentPageReport()\" [currentPageReportTemplate]=\"currentPageReportTemplate()\" [showFirstLastIcon]=\"showFirstLastIcon()\"\n [alwaysShow]=\"alwaysShowPaginator()\" (pageChange)=\"onPage($event)\"/>\n }\n </div>\n }\n <cad-menu #hmenu popup [items]=\"menuItems()\" ariaLabel=\"Menu de la colonne\"/>\n <cad-menu #fmenu popup [items]=\"filterMenuItems()\" ariaLabel=\"Op\u00E9rateur de filtre\" [minWidth]=\"200\"/>\n <cad-menu #inmenu popup [closeOnSelect]=\"false\" [items]=\"inMenuItems()\" ariaLabel=\"Valeurs du filtre\" [minWidth]=\"180\"/>\n</div>\n", styles: [":host{--_row-h: var(--cad-table-row-h, 42px);--_cell-px: 12px;display:block;min-width:0;max-width:100%;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg)}:host(.is-dense){--_row-h: 34px}.dt{border:1px solid var(--cad-border);border-radius:var(--cad-radius-lg);background:var(--cad-surface);overflow:hidden;position:relative}:host(.is-borderless) .dt{border:0;border-radius:0}.dt-bar{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--cad-border);flex-wrap:wrap}.dt-bar__title{font-weight:600;font-size:13.5px;margin-right:4px}.dt-bar__count{font:500 11px var(--cad-font-mono);padding:2px 7px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.dt-bar__grow{flex:1}.dt-bar__search{position:relative;display:flex;align-items:center;width:240px;max-width:100%}.dt-bar__search cad-icon{position:absolute;left:9px;color:var(--cad-fg-muted);pointer-events:none}.dt-bar__search input{width:100%;box-sizing:border-box;height:30px;padding:0 28px 0 30px;font:var(--cad-font-size) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);outline:0;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.dt-bar__search input::placeholder{color:var(--cad-fg-muted)}.dt-bar__search input:focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.dt-bar__search .dt-bar__clear{position:absolute;right:6px;border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;padding:2px;border-radius:4px}.dt-bar__search .dt-bar__clear:hover{color:var(--cad-fg);background:var(--cad-hover)}.dt-bar__btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:26px;padding:0 8px;border-radius:var(--cad-radius-sm);border:1px solid var(--cad-border-strong);background:transparent;color:var(--cad-fg-secondary);font:500 var(--cad-font-size-sm) var(--cad-font);cursor:pointer;white-space:nowrap}.dt-bar__btn:hover{background:var(--cad-hover);color:var(--cad-fg)}.dt-bar__btn:focus-visible{outline:2px solid var(--cad-ring);outline-offset:1px}.dt-bar__btn.is-ghost{border-color:transparent;width:26px;padding:0}.dt-bar__btn.is-on{color:var(--cad-accent);background:var(--cad-accent-soft)}.dt-bar__cols{position:relative}.dt-bar__menu{position:absolute;right:0;top:calc(100% + 6px);z-index:20;min-width:200px;max-height:280px;overflow:auto;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);padding:4px}.dt-bar__menu label{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:var(--cad-font-size)}.dt-bar__menu label:hover{background:var(--cad-hover)}.dt-bar__menu label.is-locked{opacity:.5;cursor:default}.dt-bar__menu-title{font:600 10px/1 var(--cad-font-mono);letter-spacing:.1em;text-transform:uppercase;color:var(--cad-fg-muted);padding:6px 8px 4px}.dt-sel{display:flex;align-items:center;gap:8px;padding:8px 12px;background:var(--cad-accent-soft);border-bottom:1px solid var(--cad-border);font-size:12.5px;color:var(--cad-accent);font-weight:500;min-height:47px;box-sizing:border-box}.dt-sel__grow{flex:1}.dt-sel__clear{border:0;background:transparent;color:inherit;cursor:pointer;display:grid;place-items:center;width:26px;height:26px;border-radius:6px}.dt-sel__clear:hover{background:var(--cad-accent-soft)}.dt-scroll{overflow:auto;position:relative}:host(.has-scroll-height) .dt-scroll{max-height:var(--_scroll-h);scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent;scrollbar-gutter:stable}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar{width:10px;height:10px}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-thumb{background:var(--cad-border-strong);border-radius:999px;border:2px solid var(--cad-surface)}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-thumb:hover{background:var(--cad-fg-muted)}:host(.has-scroll-height) .dt-scroll::-webkit-scrollbar-track{background:transparent}.dt-loading{position:absolute;inset:0;display:grid;place-items:center;background:color-mix(in srgb,var(--cad-surface) 55%,transparent);z-index:5}.dt-loading cad-icon{color:var(--cad-accent)}.tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--cad-font-size)}:host(.is-resizable) .tbl{table-layout:fixed}.tbl caption{text-align:left;padding:10px 12px;font-weight:600;color:var(--cad-fg-secondary);font-size:var(--cad-font-size-sm)}.tbl th{position:relative;text-align:left;font-weight:600;font-size:var(--cad-font-size-sm);color:var(--cad-fg-secondary);background:var(--cad-bg-subtle);padding:0 var(--_cell-px);height:38px;border-bottom:1px solid var(--cad-border);white-space:nowrap;-webkit-user-select:none;user-select:none;box-sizing:border-box}:host(.is-sticky-header) .tbl thead th{position:sticky;top:0;z-index:3}.tbl th.al-right{text-align:right}.tbl th.al-center{text-align:center}.tbl th.st-left,.tbl td.st-left{position:sticky;left:0;z-index:2;background:var(--cad-surface)}.tbl th.st-right,.tbl td.st-right{position:sticky;right:0;z-index:2;background:var(--cad-surface)}.tbl th.st-left,.tbl th.st-right{background:var(--cad-bg-subtle);z-index:4}.tbl th .hd{display:inline-flex;align-items:center;gap:4px;max-width:100%}.tbl th.al-right .hd{flex-direction:row-reverse}.tbl th .hd-txt{overflow:hidden;text-overflow:ellipsis}.tbl th button.hd{all:unset;display:inline-flex;align-items:center;gap:4px;cursor:pointer;border-radius:4px;max-width:100%}.tbl th button.hd:focus-visible{outline:2px solid var(--cad-ring);outline-offset:2px}.tbl th .hd cad-icon{opacity:0;transition:opacity var(--cad-dur);flex:none}.tbl th:hover .hd cad-icon{opacity:.6}.tbl th.is-sorted .hd{color:var(--cad-accent)}.tbl th.is-sorted .hd cad-icon{opacity:1}.tbl th .hd-idx{font:600 9px var(--cad-font-mono);background:var(--cad-accent-soft);color:var(--cad-accent);border-radius:999px;padding:1px 4px}.tbl th .rz{position:absolute;right:0;top:8px;bottom:8px;width:5px;cursor:col-resize;z-index:1}.tbl th .rz:after{content:\"\";position:absolute;right:2px;top:0;bottom:0;width:1px;background:var(--cad-border);transition:background var(--cad-dur)}.tbl th .rz:hover:after,.tbl th .rz.is-active:after{background:var(--cad-accent);width:2px}.tbl th.col-sel,.tbl td.col-sel{width:36px;padding-right:0}.tbl th.col-exp,.tbl td.col-exp{width:30px;padding:0 4px}.tbl th.col-acts,.tbl td.col-acts{text-align:right;white-space:nowrap}.tbl tr.flt th{height:auto;padding:6px var(--_cell-px);background:var(--cad-surface);font-weight:400}.tbl tr.flt input,.tbl tr.flt select{width:100%;box-sizing:border-box;height:26px;padding:0 8px;font:var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);outline:0}.tbl tr.flt input:focus,.tbl tr.flt select:focus{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.tbl td{padding:0 var(--_cell-px);height:var(--_row-h);border-bottom:1px solid var(--cad-border);vertical-align:middle;font-variant-numeric:tabular-nums;box-sizing:border-box}.tbl td.al-right{text-align:right}.tbl td.al-center{text-align:center}.tbl td.dt-num{font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm)}.tbl td.is-nowrap{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host(.is-bordered) .tbl td,:host(.is-bordered) .tbl th{border-right:1px solid var(--cad-border)}:host(.is-bordered) .tbl td:last-child,:host(.is-bordered) .tbl th:last-child{border-right:0}.tbl tbody tr:last-child td{border-bottom:0}:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td{background:var(--cad-table-stripe, var(--cad-bg-subtle))}:host(.is-hoverable) .tbl tbody tr.dt-row:hover td{background:var(--cad-hover)}.tbl tbody tr.dt-row.is-selectable{cursor:pointer}.tbl tbody tr.dt-row:focus-visible{outline:none}.tbl tbody tr.dt-row:focus-visible td{background:var(--cad-hover);box-shadow:inset 0 0 0 1px var(--cad-ring)}.tbl tbody tr.dt-row.is-selected td{background:var(--cad-accent-soft)}.tbl tbody tr.dt-row.is-selected td:first-child{box-shadow:inset 3px 0 0 var(--cad-accent)}.tbl tbody tr.dt-row.is-selected:focus-visible td{box-shadow:inset 0 0 0 1px var(--cad-ring)}.tbl tbody tr.dt-row.is-selected:focus-visible td:first-child{box-shadow:inset 3px 0 0 var(--cad-accent),inset 0 0 0 1px var(--cad-ring)}.tbl .exp{width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0}.tbl .exp:hover{background:var(--cad-elevated);color:var(--cad-fg)}.tbl .exp:focus-visible{outline:2px solid var(--cad-ring)}.tbl .exp cad-icon{transition:transform var(--cad-dur)}.tbl tr.is-expanded .exp cad-icon{transform:rotate(90deg)}.tbl .acts{display:inline-flex;gap:2px;align-items:center;opacity:0;transition:opacity var(--cad-dur)}.tbl tr:hover .acts,.tbl tr.is-selected .acts,.tbl tr:focus-within .acts{opacity:1}:host(.acts-always) .tbl .acts{opacity:1}.tbl tr.dt-detail td{background:var(--cad-bg-subtle);height:auto;padding:12px var(--_cell-px) 14px var(--_detail-pl, 58px)}:host(.is-hoverable) .tbl tr.dt-detail:hover td{background:var(--cad-bg-subtle)}.tbl tfoot td{background:var(--cad-bg-subtle);font-weight:600;color:var(--cad-fg-secondary);border-top:1px solid var(--cad-border);border-bottom:0}.kv{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px 22px;font-size:12.5px}.kv b{display:block;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);margin-bottom:4px}.skel{height:12px;border-radius:4px;background:linear-gradient(90deg,var(--cad-elevated),var(--cad-hover),var(--cad-elevated));background-size:200% 100%;animation:cad-tbl-sh 1.4s infinite}@keyframes cad-tbl-sh{to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.skel{animation:none}.tbl .acts,.tbl .exp cad-icon,.tbl th .hd cad-icon{transition:none}}.empty{display:grid;place-items:center;gap:6px;padding:34px 12px;text-align:center;color:var(--cad-fg-secondary);font-size:12.5px}.empty cad-icon{color:var(--cad-fg-muted)}.empty b{color:var(--cad-fg);font-size:var(--cad-font-size)}.dt-foot{display:flex;align-items:center;gap:14px;padding:8px 12px;border-top:1px solid var(--cad-border)}.dt-foot cad-paginator{flex:1}\n", ".tbl th.st-left,.tbl td.st-left,.tbl th.st-right,.tbl td.st-right{position:sticky;z-index:2;background:var(--cad-surface);background-clip:padding-box}.tbl thead th.st-left,.tbl thead th.st-right{z-index:4;background:var(--cad-bg-subtle)}:host(.is-sticky-header) .tbl thead th.st-left,:host(.is-sticky-header) .tbl thead th.st-right{z-index:5}:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td.st-left,:host(.is-striped) .tbl tbody tr.dt-row:nth-child(2n of.dt-row) td.st-right{background:var(--cad-table-stripe, var(--cad-bg-subtle))}:host(.is-hoverable) .tbl tbody tr.dt-row:hover td.st-left,:host(.is-hoverable) .tbl tbody tr.dt-row:hover td.st-right{background:var(--cad-hover)}.tbl tbody tr.dt-row.is-selected td.st-left,.tbl tbody tr.dt-row.is-selected td.st-right{background:color-mix(in srgb,var(--cad-accent) 12%,var(--cad-surface))}.tbl td.st-last-left,.tbl th.st-last-left{transition:box-shadow var(--cad-dur)}:host(.is-scrolled-x) .tbl td.st-last-left,:host(.is-scrolled-x) .tbl th.st-last-left{box-shadow:1px 0 0 var(--cad-border),6px 0 12px -6px #0000002e}:host(:not(.is-scrolled-x-end)) .tbl td.st-first-right,:host(:not(.is-scrolled-x-end)) .tbl th.st-first-right{box-shadow:-1px 0 0 var(--cad-border),-6px 0 12px -6px #0000002e}.tbl td.st-right.col-acts .acts{background:inherit}.tbl td.dt-tree-cell{white-space:nowrap}.tbl td.dt-tree-cell .cell-txt{white-space:normal}.cad-tree-toggle{display:inline-flex;align-items:center;vertical-align:middle;margin-right:4px}.cad-tree-toggle .ind{display:inline-block;width:calc(var(--_lvl, 0) * var(--_indent, 20px));flex:none}.cad-tree-toggle .tl{display:inline-block;width:var(--_indent, 20px);align-self:stretch;flex:none;position:relative}:host(.has-tree-lines) .tbl td.dt-tree-cell{padding-top:0;padding-bottom:0}:host(.has-tree-lines) .cad-tree-toggle{align-self:stretch;height:var(--_row-h)}:host(.has-tree-lines) .cad-tree-toggle .tl:before{content:\"\";position:absolute;left:9px;top:0;bottom:0;border-left:1px solid var(--cad-border)}.cad-tree-toggle .tg{width:20px;height:20px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0;flex:none}.cad-tree-toggle .tg:hover{background:var(--cad-elevated);color:var(--cad-fg)}.cad-tree-toggle .tg:focus-visible{outline:2px solid var(--cad-ring)}.cad-tree-toggle .tg cad-icon{transition:transform var(--cad-dur)}.cad-tree-toggle .tg.is-open cad-icon{transform:rotate(90deg)}.cad-tree-toggle .tg.is-leaf{visibility:hidden;pointer-events:none}.cad-tree-toggle .ic{color:var(--cad-fg-muted);margin:0 6px 0 2px}.tbl tr.dt-row.lvl-0.has-children td.dt-tree-cell{font-weight:500}.tbl tr.dt-group td{background:var(--cad-bg-subtle);height:34px;padding:0 var(--_cell-px);border-bottom:1px solid var(--cad-border)}.dt-group__inner{display:flex;align-items:center;gap:6px;padding-left:calc(var(--_lvl, 0) * var(--_indent, 20px));font-weight:600;font-size:var(--cad-font-size-sm)}.dt-group__inner .exp{width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:inline-grid;place-items:center;cursor:pointer;padding:0}.dt-group__inner .exp:hover{background:var(--cad-elevated);color:var(--cad-fg)}.dt-group__inner .exp cad-icon{transition:transform var(--cad-dur)}.tbl tr.dt-group.is-expanded .dt-group__inner .exp cad-icon{transform:rotate(90deg)}.dt-group__count{font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.tbl tr.dt-group-foot td{background:var(--cad-bg-subtle);height:32px;color:var(--cad-fg-secondary);font-size:var(--cad-font-size-sm);border-bottom:1px solid var(--cad-border)}.tbl tr.dt-group-foot td.dt-num,.tbl tr.dt-grand td.dt-num{font-family:var(--cad-font-mono);font-weight:600}.dt-group-foot__label{padding-left:calc(var(--_lvl, 0) * var(--_indent, 20px) + 26px);font-weight:500}.tbl tfoot tr.dt-grand td{background:var(--cad-bg-subtle);font-weight:600;color:var(--cad-fg);border-top:2px solid var(--cad-border);height:36px}:host(.is-hoverable) .tbl tr.dt-group:hover td,:host(.is-hoverable) .tbl tr.dt-group-foot:hover td{background:var(--cad-bg-subtle)}.tbl tr.dt-detail td{padding-left:calc(var(--_detail-pl, 58px) + var(--_lvl, 0) * var(--_indent, 20px))}.dt-bar__tools,.dt-bar__tools-end{display:contents}.dt-bar__filters{display:inline-flex}.dt-bar__filters .dt-bar__count{padding:1px 6px;font-size:10px}:host(.is-stacked) .dt-bar{gap:8px}:host(.is-stacked) .dt-bar__tools{display:none}:host(.is-stacked) .dt-bar__tools.is-open{display:flex;flex-wrap:wrap;align-items:center;gap:8px;flex-basis:100%;order:10;padding-top:8px;border-top:1px dashed var(--cad-border)}:host(.is-stacked) .dt-bar__grow{display:none}:host(.is-stacked) .dt-bar__search{order:5;flex-basis:100%;width:100%}:host(.is-stacked) .dt-bar__cols,:host(.is-stacked) .dt-bar__density{display:none}:host(.is-stacked) .dt-sel{position:sticky;bottom:0;z-index:6;flex-wrap:wrap;border-top:1px solid var(--cad-border);order:99}:host(.is-stacked) .dt-scroll{overflow-x:hidden}:host(.is-stacked) .tbl,:host(.is-stacked) .tbl tbody,:host(.is-stacked) .tbl tfoot,:host(.is-stacked) .tbl tr,:host(.is-stacked) .tbl td{display:block}:host(.is-stacked) .tbl thead,:host(.is-stacked) .tbl colgroup,:host(.is-stacked) .tbl caption{display:none}:host(.is-stacked) .tbl tr.dt-row{position:relative;padding:10px 12px;border-bottom:1px solid var(--cad-border);height:auto}:host(.is-stacked) .tbl tr.dt-row.has-sel{padding-left:44px}:host(.is-stacked) .tbl tr.dt-row.is-selected{background:var(--cad-accent-soft);box-shadow:inset 3px 0 0 var(--cad-accent)}:host(.is-hoverable.is-stacked) .tbl tr.dt-row:hover{background:var(--cad-hover)}:host(.is-hoverable.is-stacked) .tbl tr.dt-row:hover td,:host(.is-stacked) .tbl tr.dt-row.is-selected td,:host(.is-striped.is-stacked) .tbl tr.dt-row td{background:transparent!important;box-shadow:none!important}:host(.is-stacked) .tbl tr.dt-row:focus-visible{box-shadow:inset 0 0 0 1px var(--cad-ring)}:host(.is-stacked) .tbl td{height:auto;padding:2px 0;border:0;white-space:normal;display:flex;justify-content:space-between;align-items:baseline;gap:12px;font-size:12.5px;position:static}:host(.is-stacked) .tbl td.st-left,:host(.is-stacked) .tbl td.st-right{position:static}:host(.is-stacked) .tbl td[data-l]:before{content:attr(data-l);color:var(--cad-fg-muted);font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.04em;flex:none}:host(.is-stacked) .tbl td.col-sel{position:absolute;left:12px;top:12px;padding:0;width:auto}:host(.is-stacked) .tbl td.col-sel:before,:host(.is-stacked) .tbl td.col-exp:before,:host(.is-stacked) .tbl td.col-acts:before,:host(.is-stacked) .tbl td.dt-tree-cell:before,:host(.is-stacked) .tbl td.dt-first:before{content:none}:host(.is-stacked) .tbl td.col-exp{position:absolute;right:44px;top:8px;padding:0;width:auto}:host(.is-stacked) .tbl td.dt-first,:host(.is-stacked) .tbl td.dt-tree-cell{display:block;font-size:14px;font-weight:500;padding:0 44px 6px 0}:host(.is-stacked) .tbl td.dt-tree-cell .cad-tree-toggle .ind,:host(.is-stacked) .tbl td.dt-tree-cell .cad-tree-toggle .tl{display:none}:host(.is-stacked) .tbl td.col-acts{position:absolute;right:8px;top:8px;padding:0;width:auto}:host(.is-stacked) .tbl .acts{opacity:1}:host(.is-stacked) .tbl td.dt-num{text-align:right}:host(.is-stacked) .tbl tr.dt-detail td{padding:8px 12px 10px}:host(.is-stacked) .tbl tr.dt-row.lvl-1{margin-left:22px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-row.lvl-2{margin-left:44px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-row.lvl-3{margin-left:66px;border-left:2px solid var(--cad-border)}:host(.is-stacked) .tbl tr.dt-group td{padding:8px 12px;height:auto;display:block}:host(.is-stacked) .tbl tr.dt-group-foot{display:flex;flex-wrap:wrap;gap:4px 14px;padding:6px 12px 6px 44px}:host(.is-stacked) .tbl tr.dt-group-foot td{padding:0}:host(.is-stacked) .tbl tr.dt-group-foot td:empty{display:none}:host(.is-stacked) .tbl tfoot tr.dt-grand{padding:8px 12px}:host(.is-stacked) .tbl tfoot tr.dt-grand td:empty{display:none}:host(.is-stacked) .tbl tr.dt-empty td{display:block}:host(.is-stacked) .tbl tr.is-skeleton td{display:block;padding:4px 0}:host(.is-stacked) .tbl tr.dt-card td{padding:0;display:block}:host(.is-stacked) .dt-foot{flex-wrap:wrap;gap:8px}:host(.is-stacked) .dt-foot ::ng-deep .cad-paginator__rpp{display:none}\n", ".tbl th .dh{display:none;position:absolute;left:2px;top:50%;transform:translateY(-50%);width:14px;height:18px;color:var(--cad-fg-muted);cursor:grab;border-radius:3px;place-items:center}.tbl th .dh:hover{color:var(--cad-fg);background:var(--cad-elevated)}:host(.is-reorderable) .tbl th.can-drag{padding-left:calc(var(--_cell-px) + 6px)}:host(.is-reorderable) .tbl th.can-drag:hover .dh,:host(.is-reorderable) .tbl th.can-drag.cdk-drag-dragging .dh{display:grid}.tbl th.cdk-drag-placeholder{opacity:.35;background:var(--cad-accent-soft)}.tbl th.cdk-drag-placeholder:before{content:\"\";position:absolute;left:-1px;top:4px;bottom:4px;width:2px;background:var(--cad-accent)}.cdk-drag-preview.dt-th-preview{display:flex;align-items:center;height:38px;padding:0 12px;box-sizing:border-box;font:600 var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:6px;box-shadow:var(--cad-shadow-lg);list-style:none}.tbl thead tr.cdk-drop-list-dragging th:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.tbl th.cdk-drag-animating{transition:transform .2s cubic-bezier(0,0,.2,1)}.dt-bar__menu .mv{display:inline-flex;gap:0;margin-left:auto}.dt-bar__menu .mv button{border:0;background:transparent;color:var(--cad-fg-muted);width:20px;height:20px;border-radius:4px;cursor:pointer;display:grid;place-items:center;padding:0}.dt-bar__menu .mv button:hover:not([disabled]){background:var(--cad-hover);color:var(--cad-fg)}.dt-bar__menu .mv button[disabled]{opacity:.3;cursor:default}.tbl tr.hg th{height:30px;text-align:center;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);border-bottom:1px solid var(--cad-border)}.tbl tr.hg th.hg-cell{border-left:1px solid var(--cad-border)}.tbl tr.hg th.hg-cell:first-child{border-left:0}:host(.is-sticky-header) .tbl tr.hg th{position:sticky;top:0;z-index:3}:host(.is-sticky-header) .tbl tr.hg+tr th{top:30px}.tbl tr.dt-vpad td{padding:0;border:0;height:auto}:host(.is-virtual) .dt-scroll{overflow-anchor:none}:host(.edit-cell) .tbl td.is-editable{cursor:text;position:relative}:host(.edit-cell.is-hoverable) .tbl tbody tr.dt-row td.is-editable:hover{background:var(--cad-hover);box-shadow:inset 0 0 0 1px var(--cad-border-strong)}:host(.show-edit-icon) .tbl td.is-editable{padding-right:calc(var(--_cell-px) + 16px)}.tbl td .ce{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:20px;height:20px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0;opacity:0;transition:opacity var(--cad-dur),background var(--cad-dur)}.tbl td.is-editable:hover .ce,.tbl td .ce:focus-visible{opacity:.7}.tbl td .ce:hover{opacity:1!important;background:var(--cad-elevated);color:var(--cad-fg)}.tbl td.is-editing{padding-top:0;padding-bottom:0;background:var(--cad-surface)!important;box-shadow:none!important}.dt-editor{position:relative;display:flex;align-items:stretch;min-height:calc(var(--_row-h) - 8px);margin:4px 0}.tbl td.is-editing{height:auto;vertical-align:top}.dt-editor input,.dt-editor select,.dt-editor textarea{width:100%;height:calc(var(--_row-h) - 8px);box-sizing:border-box;padding:0 8px;font:var(--cad-font-size) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-accent);border-radius:var(--cad-radius-sm);outline:0;box-shadow:0 0 0 3px var(--cad-ring)}.dt-editor input[type=number]{font-family:var(--cad-font-mono);text-align:right}.dt-editor textarea{height:auto;min-height:76px;padding:6px 8px;resize:vertical;line-height:1.45;font:var(--cad-font-size)/1.45 var(--cad-font)}.dt-editor input[type=checkbox]{width:16px;height:16px;box-shadow:none;accent-color:var(--cad-accent)}.dt-editor.is-invalid input,.dt-editor.is-invalid select,.dt-editor.is-invalid textarea{border-color:var(--cad-danger);box-shadow:0 0 0 3px var(--cad-danger-soft)}.dt-editor__err{position:absolute;left:0;top:calc(100% + 4px);z-index:6;padding:3px 8px;border-radius:6px;background:var(--cad-danger);color:#fff;font-size:11px;white-space:nowrap;box-shadow:var(--cad-shadow-md);pointer-events:none}.dt-editor__err:before{content:\"\";position:absolute;left:10px;top:-4px;width:8px;height:8px;background:inherit;transform:rotate(45deg)}:host(.edit-row) .tbl tr.dt-row.is-editing-row td{background:var(--cad-accent-soft)}.tbl .acts .re{display:inline-grid;place-items:center;width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--cad-fg-secondary);cursor:pointer;padding:0}.tbl .acts .re:hover{background:var(--cad-hover);color:var(--cad-fg)}.tbl .acts .re.ok{color:var(--cad-success)}.tbl .acts .re.ko{color:var(--cad-danger)}.tbl .acts .re:focus-visible{outline:2px solid var(--cad-ring)}:host(.edit-row) .tbl tr.is-editing-row .acts{opacity:1}\n", ".dt-scroll{scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent}.dt-scroll::-webkit-scrollbar{height:10px;width:10px}.dt-scroll::-webkit-scrollbar-thumb{background:var(--cad-border-strong);border-radius:999px;border:2px solid var(--cad-surface)}.dt-scroll::-webkit-scrollbar-thumb:hover{background:var(--cad-fg-muted)}.dt-scroll::-webkit-scrollbar-track{background:transparent}.tbl th.has-menu{padding-right:calc(var(--_cell-px) + 20px)}.tbl th .hm{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:22px;height:22px;border:0;border-radius:5px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0;opacity:0;transition:opacity var(--cad-dur),background var(--cad-dur);z-index:2}.tbl th:hover .hm,.tbl th .hm:focus-visible,.tbl th .hm.is-on,.tbl th.is-sorted .hm,.tbl th.is-filtered .hm{opacity:1}.tbl th .hm:hover,.tbl th .hm.is-on{background:var(--cad-elevated);color:var(--cad-fg)}.tbl th.is-filtered .hd-txt{color:var(--cad-accent)}:host(.is-resizable) .tbl th.has-menu .hm{right:10px}.tbl tr.flt th{padding:5px 6px}.flt-cell{position:relative;display:flex;align-items:center;gap:4px;min-width:0}.flt-cell input,.flt-cell select,.flt-cell .flt-in{flex:1 1 0;min-width:0;height:28px;padding:0 26px 0 8px;box-sizing:border-box;font:var(--cad-font-size-sm) var(--cad-font);color:var(--cad-fg);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);outline:0;transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.flt-cell.is-range input{padding-right:8px}.flt-cell.is-range input:last-of-type{padding-right:26px}.flt-cell input:focus,.flt-cell select:focus,.flt-cell .flt-in:focus-visible{border-color:var(--cad-accent);box-shadow:0 0 0 2px var(--cad-ring)}.flt-cell.is-active input,.flt-cell.is-active select,.flt-cell.is-active .flt-in{border-color:var(--cad-accent);background:var(--cad-accent-soft)}.flt-cell .flt-in{display:inline-flex;align-items:center;justify-content:space-between;gap:6px;text-align:left;cursor:pointer}.flt-cell .flt-in.is-ph{color:var(--cad-fg-muted)}.flt-cell .flt-in cad-icon{color:var(--cad-fg-muted);flex:none}.flt-cell .flt-txt{flex:1;height:28px;display:inline-flex;align-items:center;padding:0 26px 0 8px;font:italic var(--cad-font-size-sm) var(--cad-font);color:var(--cad-accent);background:var(--cad-accent-soft);border:1px solid var(--cad-accent);border-radius:var(--cad-radius-sm);box-sizing:border-box}.flt-cell .flt-op{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:20px;height:20px;border:0;border-radius:4px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0}.flt-cell .flt-op:hover,.flt-cell .flt-op.is-on{color:var(--cad-accent);background:var(--cad-accent-soft)}.flt-cell.is-active .flt-op{right:22px}.flt-cell .flt-x{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:18px;height:18px;border:0;border-radius:4px;background:transparent;color:var(--cad-fg-muted);display:grid;place-items:center;cursor:pointer;padding:0}.flt-cell .flt-x:hover{color:var(--cad-danger);background:var(--cad-danger-soft)}.flt-cell select{appearance:none;padding-right:26px}.dt-gz{display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-height:40px;padding:6px 12px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle);color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}.dt-gz.cdk-drop-list-receiving,.dt-gz.cdk-drop-list-dragging{background:var(--cad-accent-soft);color:var(--cad-accent);outline:1px dashed var(--cad-accent);outline-offset:-4px}.dt-gz__hint{font-style:italic}.dt-gz__chip{display:inline-flex;align-items:center;gap:5px;height:26px;padding:0 4px 0 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500;cursor:grab}.dt-gz__chip .dt-gz__drag{opacity:.6}.dt-gz__chip button{width:18px;height:18px;border:0;border-radius:50%;background:transparent;color:inherit;display:grid;place-items:center;cursor:pointer;padding:0}.dt-gz__chip button:hover{background:var(--cad-accent);color:var(--cad-fg-on-accent)}.dt-gz__chip.cdk-drag-placeholder{opacity:.35}.cdk-drag-preview.dt-gz__chip{box-shadow:var(--cad-shadow-md)}:host(.is-stacked) .dt-gz{display:none}.tbl th.col-num,.tbl td.col-num{width:44px;text-align:right;font:11px var(--cad-font-mono);color:var(--cad-fg-muted);background:var(--cad-bg-subtle);padding:0 8px;-webkit-user-select:none;user-select:none}.tbl th.col-num{font-weight:600}.tbl tbody tr:hover td.col-num{background:var(--cad-bg-subtle)}:host(.is-stacked) .tbl td.col-num{position:absolute;left:auto;right:12px;bottom:6px;width:auto;background:transparent;padding:0}:host(.is-stacked) .tbl td.col-num:before{content:none}.tbl th.col-drag,.tbl td.col-drag{width:28px;padding:0 4px}.tbl td.col-drag .rdh{display:inline-grid;place-items:center;width:20px;height:24px;color:var(--cad-fg-muted);cursor:grab;opacity:0;transition:opacity var(--cad-dur);border-radius:4px}.tbl tbody tr:hover td.col-drag .rdh,.tbl tr.cdk-drag-dragging td.col-drag .rdh{opacity:.8}.tbl td.col-drag .rdh:hover{color:var(--cad-fg);background:var(--cad-elevated)}.tbl tr.dt-row.cdk-drag-placeholder{opacity:0}.tbl tbody.cdk-drop-list-dragging tr.dt-row:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.tbl tr.dt-row.cdk-drag-placeholder td{border-top:2px solid var(--cad-accent)}.cdk-drag-preview.dt-tr-preview{display:table;table-layout:fixed;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:8px;box-shadow:var(--cad-shadow-lg);opacity:.95;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg)}.cdk-drag-preview.dt-tr-preview td{padding:0 12px;height:42px;vertical-align:middle;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host(.is-stacked) .tbl td.col-drag{display:none}.dt-foot__count{font:var(--cad-font-size-sm) var(--cad-font-mono);color:var(--cad-fg-secondary);white-space:nowrap}.dt-foot.has-count cad-paginator{flex:1}\n"] }]
10688
10688
  }], ctorParameters: () => [], propDecorators: { scroller: [{ type: i0.ViewChild, args: ['scroller', { isSignal: true }] }], dtEl: [{ type: i0.ViewChild, args: ['dt', { isSignal: true }] }], headerMenu: [{ type: i0.ViewChild, args: ['hmenu', { isSignal: true }] }], filterMenu: [{ type: i0.ViewChild, args: ['fmenu', { isSignal: true }] }], inMenu: [{ type: i0.ViewChild, args: ['inmenu', { isSignal: true }] }] } });
10689
10689
 
10690
10690
  /** Template de nœud : `<ng-template cadTreeNode let-node let-row="row" let-level="level" let-selected="selected">`. */
@@ -11009,7 +11009,7 @@ const CAD_TABLE_PANEL_STYLES = `
11009
11009
  .col-row .dh.is-disabled { visibility: hidden; }
11010
11010
  .col-row .lbl { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
11011
11011
  .col-row .pin { color: var(--cad-fg-muted); }
11012
- .col-row.cdk-drag-preview { background: var(--cad-overlay); border: 1px solid var(--cad-border); box-shadow: var(--cad-shadow-lg); }
11012
+ .col-row.cdk-drag-preview { background: var(--cad-overlay); --cad-hover: var(--cad-overlay-hover); border: 1px solid var(--cad-border); box-shadow: var(--cad-shadow-lg); }
11013
11013
  .col-row.cdk-drag-placeholder { opacity: .3; }
11014
11014
  .cols.cdk-drop-list-dragging .col-row:not(.cdk-drag-placeholder) { transition: transform 180ms cubic-bezier(0,0,.2,1); }
11015
11015
  .all-row { display: flex; align-items: center; gap: 6px; height: 28px; padding: 0 4px; margin-bottom: 4px; }
@@ -11381,7 +11381,7 @@ class CadTablePanelComponent {
11381
11381
  @if (!aggsWritable()) {<div class="empty">Note : <code>aggregates</code> n'est pas un model sur cette table — écoutez <code>(aggregatesChange)</code>.</div>}
11382
11382
  </div>
11383
11383
  </ng-template>
11384
- `, isInline: true, styles: [":host{display:flex;align-items:stretch;height:100%;min-height:0;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg);position:relative}:host(.pos-left){flex-direction:row-reverse}.rail{display:flex;flex-direction:column;gap:2px;width:34px;padding:6px 0;background:var(--cad-bg-subtle);border-left:1px solid var(--cad-border);flex:none}:host(.pos-left) .rail{border-left:0;border-right:1px solid var(--cad-border)}.rail button{all:unset;display:flex;flex-direction:column;align-items:center;gap:6px;padding:10px 0;cursor:pointer;color:var(--cad-fg-secondary);border-radius:6px;margin:0 4px;writing-mode:vertical-rl;font-size:11.5px;font-weight:500;letter-spacing:.02em}.rail button cad-icon{writing-mode:horizontal-tb}.rail button:hover{background:var(--cad-hover);color:var(--cad-fg)}.rail button.is-active{background:var(--cad-accent-soft);color:var(--cad-accent)}.rail button:focus-visible{outline:2px solid var(--cad-ring)}.body{width:var(--_w, 260px);min-width:0;background:var(--cad-bg-subtle);border-left:1px solid var(--cad-border);display:flex;flex-direction:column;overflow:hidden}:host(.pos-left) .body{border-left:0;border-right:1px solid var(--cad-border)}:host(:not(.is-open)) .body{display:none}.body__scroll{flex:1;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent}.sec{padding:10px 12px 12px;border-bottom:1px solid var(--cad-border)}.sec:last-child{border-bottom:0}.sec__ttl{display:flex;align-items:center;gap:6px;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);margin:0 0 8px}.sec__ttl .grow{flex:1}.sec__ttl button.lnk{all:unset;cursor:pointer;color:var(--cad-accent);font:500 11px var(--cad-font);text-transform:none;letter-spacing:0}.sec__ttl button.lnk:hover{text-decoration:underline}.srch{display:flex;align-items:center;gap:6px;height:28px;padding:0 8px;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);margin-bottom:8px;color:var(--cad-fg-muted)}.srch:focus-within{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.srch input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm) var(--cad-font)}.srch input::placeholder{color:var(--cad-fg-muted)}.cols{display:flex;flex-direction:column;gap:1px}.col-row{display:flex;align-items:center;gap:6px;height:28px;padding:0 4px;border-radius:6px;font-size:12.5px}.col-row:hover{background:var(--cad-hover)}.col-row.is-off{color:var(--cad-fg-muted)}.col-row .dh{display:grid;place-items:center;width:16px;height:20px;color:var(--cad-fg-muted);cursor:grab;flex:none;border-radius:3px}.col-row .dh:hover{color:var(--cad-fg);background:var(--cad-elevated)}.col-row .dh.is-disabled{visibility:hidden}.col-row .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-row .pin{color:var(--cad-fg-muted)}.col-row.cdk-drag-preview{background:var(--cad-overlay);border:1px solid var(--cad-border);box-shadow:var(--cad-shadow-lg)}.col-row.cdk-drag-placeholder{opacity:.3}.cols.cdk-drop-list-dragging .col-row:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.all-row{display:flex;align-items:center;gap:6px;height:28px;padding:0 4px;margin-bottom:4px}.all-row .cnt{margin-left:auto;font:500 10.5px var(--cad-font-mono);color:var(--cad-fg-muted)}.drop{min-height:40px;border:1px dashed var(--cad-border-strong);border-radius:8px;padding:6px;display:flex;flex-wrap:wrap;gap:6px;align-items:center;color:var(--cad-fg-muted);font-size:12px;transition:border-color var(--cad-dur),background var(--cad-dur)}.drop.cdk-drop-list-receiving,.drop.cdk-drop-list-dragging{border-color:var(--cad-accent);background:var(--cad-accent-soft)}.drop .hint{display:inline-flex;align-items:center;gap:6px;padding:0 4px}.chip{display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg);font-size:12px;white-space:nowrap}.chip .dh{display:grid;place-items:center;width:12px;color:var(--cad-fg-muted);cursor:grab}.chip .fn{font:500 11px var(--cad-font-mono);color:var(--cad-fg-secondary)}.chip button{all:unset;display:grid;place-items:center;width:16px;height:16px;border-radius:50%;color:var(--cad-fg-muted);cursor:pointer}.chip button:hover{background:var(--cad-hover);color:var(--cad-fg)}.chip.cdk-drag-preview{box-shadow:var(--cad-shadow-lg)}.chip.cdk-drag-placeholder{opacity:.3}.add{all:unset;display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 8px;border-radius:999px;border:1px dashed var(--cad-border-strong);color:var(--cad-fg-secondary);font-size:12px;cursor:pointer}.add:hover{border-color:var(--cad-accent);color:var(--cad-accent)}.picker{display:grid;gap:6px;padding:8px;margin-top:8px;border:1px solid var(--cad-border);border-radius:8px;background:var(--cad-surface)}.picker .row{display:flex;gap:6px}.flt{border:1px solid var(--cad-border);border-radius:8px;background:var(--cad-surface);margin-bottom:6px;overflow:hidden}.flt__hd{display:flex;align-items:center;gap:6px;height:30px;padding:0 8px;cursor:pointer;font-size:12.5px;-webkit-user-select:none;user-select:none}.flt__hd:hover{background:var(--cad-hover)}.flt__hd .chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}.flt.is-open .flt__hd .chev{transform:rotate(90deg)}.flt__hd .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.flt__hd .on{font:600 10px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.flt__hd .clr{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.flt__hd .clr:hover{background:var(--cad-hover);color:var(--cad-fg)}.flt__bd{display:grid;gap:6px;padding:4px 8px 10px}.flt__bd .two{display:grid;grid-template-columns:1fr 1fr;gap:6px}.opts{max-height:160px;overflow:auto;display:grid;gap:2px}.opts label{display:flex;align-items:center;gap:6px;height:24px;font-size:12.5px}.empty{color:var(--cad-fg-muted);font-size:12px;padding:4px 0}:host(.is-overlay){position:absolute;top:0;right:0;bottom:0;z-index:20}:host(.is-overlay.is-open) .body{box-shadow:var(--cad-shadow-lg)}:host(.is-overlay.pos-left){right:auto;left:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadButtonComponent, selector: "button[cadButton], a[cadButton]", inputs: ["severity", "variant", "size", "loading", "disabled", "icon", "block", "value", "pressed"] }, { kind: "component", type: CadCheckboxComponent, selector: "cad-checkbox", inputs: ["label", "ariaLabel", "indeterminate", "invalid", "readonly"], outputs: ["indeterminateChange", "changed"] }, { kind: "component", type: CadSegmentedComponent, selector: "cad-segmented", inputs: ["options", "optionLabel", "optionValue", "multiple", "allowEmpty", "block", "size", "shape", "ariaLabel"], outputs: ["changed"] }, { kind: "component", type: CadSelectComponent, selector: "cad-select", outputs: ["changed"] }, { kind: "component", type: CadNumberComponent, selector: "cad-number", inputs: ["min", "max", "step", "decimals", "locale", "prefix", "suffix", "placeholder", "showButtons", "readonly", "invalid", "size"], outputs: ["changed", "focusChange"] }, { kind: "component", type: CadDatepickerComponent, selector: "cad-datepicker", inputs: ["mode", "selectionMode", "dataType", "format", "placeholder", "min", "max", "disabledDates", "disabledDays", "showIcon", "inline", "showTime", "hourFormat", "stepMinute", "showSeconds", "showButtonBar", "showWeek", "firstDayOfWeek", "locale", "readonlyInput", "manualInput", "clearable", "size", "invalid", "closeOnSelect", "mobile"], outputs: ["changed", "opened", "closed", "monthChange", "yearChange", "cleared", "todayClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11384
+ `, isInline: true, styles: [":host{display:flex;align-items:stretch;height:100%;min-height:0;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg);position:relative}:host(.pos-left){flex-direction:row-reverse}.rail{display:flex;flex-direction:column;gap:2px;width:34px;padding:6px 0;background:var(--cad-bg-subtle);border-left:1px solid var(--cad-border);flex:none}:host(.pos-left) .rail{border-left:0;border-right:1px solid var(--cad-border)}.rail button{all:unset;display:flex;flex-direction:column;align-items:center;gap:6px;padding:10px 0;cursor:pointer;color:var(--cad-fg-secondary);border-radius:6px;margin:0 4px;writing-mode:vertical-rl;font-size:11.5px;font-weight:500;letter-spacing:.02em}.rail button cad-icon{writing-mode:horizontal-tb}.rail button:hover{background:var(--cad-hover);color:var(--cad-fg)}.rail button.is-active{background:var(--cad-accent-soft);color:var(--cad-accent)}.rail button:focus-visible{outline:2px solid var(--cad-ring)}.body{width:var(--_w, 260px);min-width:0;background:var(--cad-bg-subtle);border-left:1px solid var(--cad-border);display:flex;flex-direction:column;overflow:hidden}:host(.pos-left) .body{border-left:0;border-right:1px solid var(--cad-border)}:host(:not(.is-open)) .body{display:none}.body__scroll{flex:1;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent}.sec{padding:10px 12px 12px;border-bottom:1px solid var(--cad-border)}.sec:last-child{border-bottom:0}.sec__ttl{display:flex;align-items:center;gap:6px;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);margin:0 0 8px}.sec__ttl .grow{flex:1}.sec__ttl button.lnk{all:unset;cursor:pointer;color:var(--cad-accent);font:500 11px var(--cad-font);text-transform:none;letter-spacing:0}.sec__ttl button.lnk:hover{text-decoration:underline}.srch{display:flex;align-items:center;gap:6px;height:28px;padding:0 8px;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);margin-bottom:8px;color:var(--cad-fg-muted)}.srch:focus-within{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.srch input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm) var(--cad-font)}.srch input::placeholder{color:var(--cad-fg-muted)}.cols{display:flex;flex-direction:column;gap:1px}.col-row{display:flex;align-items:center;gap:6px;height:28px;padding:0 4px;border-radius:6px;font-size:12.5px}.col-row:hover{background:var(--cad-hover)}.col-row.is-off{color:var(--cad-fg-muted)}.col-row .dh{display:grid;place-items:center;width:16px;height:20px;color:var(--cad-fg-muted);cursor:grab;flex:none;border-radius:3px}.col-row .dh:hover{color:var(--cad-fg);background:var(--cad-elevated)}.col-row .dh.is-disabled{visibility:hidden}.col-row .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-row .pin{color:var(--cad-fg-muted)}.col-row.cdk-drag-preview{background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);box-shadow:var(--cad-shadow-lg)}.col-row.cdk-drag-placeholder{opacity:.3}.cols.cdk-drop-list-dragging .col-row:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.all-row{display:flex;align-items:center;gap:6px;height:28px;padding:0 4px;margin-bottom:4px}.all-row .cnt{margin-left:auto;font:500 10.5px var(--cad-font-mono);color:var(--cad-fg-muted)}.drop{min-height:40px;border:1px dashed var(--cad-border-strong);border-radius:8px;padding:6px;display:flex;flex-wrap:wrap;gap:6px;align-items:center;color:var(--cad-fg-muted);font-size:12px;transition:border-color var(--cad-dur),background var(--cad-dur)}.drop.cdk-drop-list-receiving,.drop.cdk-drop-list-dragging{border-color:var(--cad-accent);background:var(--cad-accent-soft)}.drop .hint{display:inline-flex;align-items:center;gap:6px;padding:0 4px}.chip{display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg);font-size:12px;white-space:nowrap}.chip .dh{display:grid;place-items:center;width:12px;color:var(--cad-fg-muted);cursor:grab}.chip .fn{font:500 11px var(--cad-font-mono);color:var(--cad-fg-secondary)}.chip button{all:unset;display:grid;place-items:center;width:16px;height:16px;border-radius:50%;color:var(--cad-fg-muted);cursor:pointer}.chip button:hover{background:var(--cad-hover);color:var(--cad-fg)}.chip.cdk-drag-preview{box-shadow:var(--cad-shadow-lg)}.chip.cdk-drag-placeholder{opacity:.3}.add{all:unset;display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 8px;border-radius:999px;border:1px dashed var(--cad-border-strong);color:var(--cad-fg-secondary);font-size:12px;cursor:pointer}.add:hover{border-color:var(--cad-accent);color:var(--cad-accent)}.picker{display:grid;gap:6px;padding:8px;margin-top:8px;border:1px solid var(--cad-border);border-radius:8px;background:var(--cad-surface)}.picker .row{display:flex;gap:6px}.flt{border:1px solid var(--cad-border);border-radius:8px;background:var(--cad-surface);margin-bottom:6px;overflow:hidden}.flt__hd{display:flex;align-items:center;gap:6px;height:30px;padding:0 8px;cursor:pointer;font-size:12.5px;-webkit-user-select:none;user-select:none}.flt__hd:hover{background:var(--cad-hover)}.flt__hd .chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}.flt.is-open .flt__hd .chev{transform:rotate(90deg)}.flt__hd .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.flt__hd .on{font:600 10px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.flt__hd .clr{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.flt__hd .clr:hover{background:var(--cad-hover);color:var(--cad-fg)}.flt__bd{display:grid;gap:6px;padding:4px 8px 10px}.flt__bd .two{display:grid;grid-template-columns:1fr 1fr;gap:6px}.opts{max-height:160px;overflow:auto;display:grid;gap:2px}.opts label{display:flex;align-items:center;gap:6px;height:24px;font-size:12.5px}.empty{color:var(--cad-fg-muted);font-size:12px;padding:4px 0}:host(.is-overlay){position:absolute;top:0;right:0;bottom:0;z-index:20}:host(.is-overlay.is-open) .body{box-shadow:var(--cad-shadow-lg)}:host(.is-overlay.pos-left){right:auto;left:0}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadButtonComponent, selector: "button[cadButton], a[cadButton]", inputs: ["severity", "variant", "size", "loading", "disabled", "icon", "block", "value", "pressed"] }, { kind: "component", type: CadCheckboxComponent, selector: "cad-checkbox", inputs: ["label", "ariaLabel", "indeterminate", "invalid", "readonly"], outputs: ["indeterminateChange", "changed"] }, { kind: "component", type: CadSegmentedComponent, selector: "cad-segmented", inputs: ["options", "optionLabel", "optionValue", "multiple", "allowEmpty", "block", "size", "shape", "ariaLabel"], outputs: ["changed"] }, { kind: "component", type: CadSelectComponent, selector: "cad-select", outputs: ["changed"] }, { kind: "component", type: CadNumberComponent, selector: "cad-number", inputs: ["min", "max", "step", "decimals", "locale", "prefix", "suffix", "placeholder", "showButtons", "readonly", "invalid", "size"], outputs: ["changed", "focusChange"] }, { kind: "component", type: CadDatepickerComponent, selector: "cad-datepicker", inputs: ["mode", "selectionMode", "dataType", "format", "placeholder", "min", "max", "disabledDates", "disabledDays", "showIcon", "inline", "showTime", "hourFormat", "stepMinute", "showSeconds", "showButtonBar", "showWeek", "firstDayOfWeek", "locale", "readonlyInput", "manualInput", "clearable", "size", "invalid", "closeOnSelect", "mobile"], outputs: ["changed", "opened", "closed", "monthChange", "yearChange", "cleared", "todayClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11385
11385
  }
11386
11386
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadTablePanelComponent, decorators: [{
11387
11387
  type: Component,
@@ -11512,7 +11512,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
11512
11512
  @if (!aggsWritable()) {<div class="empty">Note : <code>aggregates</code> n'est pas un model sur cette table — écoutez <code>(aggregatesChange)</code>.</div>}
11513
11513
  </div>
11514
11514
  </ng-template>
11515
- `, styles: [":host{display:flex;align-items:stretch;height:100%;min-height:0;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg);position:relative}:host(.pos-left){flex-direction:row-reverse}.rail{display:flex;flex-direction:column;gap:2px;width:34px;padding:6px 0;background:var(--cad-bg-subtle);border-left:1px solid var(--cad-border);flex:none}:host(.pos-left) .rail{border-left:0;border-right:1px solid var(--cad-border)}.rail button{all:unset;display:flex;flex-direction:column;align-items:center;gap:6px;padding:10px 0;cursor:pointer;color:var(--cad-fg-secondary);border-radius:6px;margin:0 4px;writing-mode:vertical-rl;font-size:11.5px;font-weight:500;letter-spacing:.02em}.rail button cad-icon{writing-mode:horizontal-tb}.rail button:hover{background:var(--cad-hover);color:var(--cad-fg)}.rail button.is-active{background:var(--cad-accent-soft);color:var(--cad-accent)}.rail button:focus-visible{outline:2px solid var(--cad-ring)}.body{width:var(--_w, 260px);min-width:0;background:var(--cad-bg-subtle);border-left:1px solid var(--cad-border);display:flex;flex-direction:column;overflow:hidden}:host(.pos-left) .body{border-left:0;border-right:1px solid var(--cad-border)}:host(:not(.is-open)) .body{display:none}.body__scroll{flex:1;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent}.sec{padding:10px 12px 12px;border-bottom:1px solid var(--cad-border)}.sec:last-child{border-bottom:0}.sec__ttl{display:flex;align-items:center;gap:6px;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);margin:0 0 8px}.sec__ttl .grow{flex:1}.sec__ttl button.lnk{all:unset;cursor:pointer;color:var(--cad-accent);font:500 11px var(--cad-font);text-transform:none;letter-spacing:0}.sec__ttl button.lnk:hover{text-decoration:underline}.srch{display:flex;align-items:center;gap:6px;height:28px;padding:0 8px;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);margin-bottom:8px;color:var(--cad-fg-muted)}.srch:focus-within{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.srch input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm) var(--cad-font)}.srch input::placeholder{color:var(--cad-fg-muted)}.cols{display:flex;flex-direction:column;gap:1px}.col-row{display:flex;align-items:center;gap:6px;height:28px;padding:0 4px;border-radius:6px;font-size:12.5px}.col-row:hover{background:var(--cad-hover)}.col-row.is-off{color:var(--cad-fg-muted)}.col-row .dh{display:grid;place-items:center;width:16px;height:20px;color:var(--cad-fg-muted);cursor:grab;flex:none;border-radius:3px}.col-row .dh:hover{color:var(--cad-fg);background:var(--cad-elevated)}.col-row .dh.is-disabled{visibility:hidden}.col-row .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-row .pin{color:var(--cad-fg-muted)}.col-row.cdk-drag-preview{background:var(--cad-overlay);border:1px solid var(--cad-border);box-shadow:var(--cad-shadow-lg)}.col-row.cdk-drag-placeholder{opacity:.3}.cols.cdk-drop-list-dragging .col-row:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.all-row{display:flex;align-items:center;gap:6px;height:28px;padding:0 4px;margin-bottom:4px}.all-row .cnt{margin-left:auto;font:500 10.5px var(--cad-font-mono);color:var(--cad-fg-muted)}.drop{min-height:40px;border:1px dashed var(--cad-border-strong);border-radius:8px;padding:6px;display:flex;flex-wrap:wrap;gap:6px;align-items:center;color:var(--cad-fg-muted);font-size:12px;transition:border-color var(--cad-dur),background var(--cad-dur)}.drop.cdk-drop-list-receiving,.drop.cdk-drop-list-dragging{border-color:var(--cad-accent);background:var(--cad-accent-soft)}.drop .hint{display:inline-flex;align-items:center;gap:6px;padding:0 4px}.chip{display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg);font-size:12px;white-space:nowrap}.chip .dh{display:grid;place-items:center;width:12px;color:var(--cad-fg-muted);cursor:grab}.chip .fn{font:500 11px var(--cad-font-mono);color:var(--cad-fg-secondary)}.chip button{all:unset;display:grid;place-items:center;width:16px;height:16px;border-radius:50%;color:var(--cad-fg-muted);cursor:pointer}.chip button:hover{background:var(--cad-hover);color:var(--cad-fg)}.chip.cdk-drag-preview{box-shadow:var(--cad-shadow-lg)}.chip.cdk-drag-placeholder{opacity:.3}.add{all:unset;display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 8px;border-radius:999px;border:1px dashed var(--cad-border-strong);color:var(--cad-fg-secondary);font-size:12px;cursor:pointer}.add:hover{border-color:var(--cad-accent);color:var(--cad-accent)}.picker{display:grid;gap:6px;padding:8px;margin-top:8px;border:1px solid var(--cad-border);border-radius:8px;background:var(--cad-surface)}.picker .row{display:flex;gap:6px}.flt{border:1px solid var(--cad-border);border-radius:8px;background:var(--cad-surface);margin-bottom:6px;overflow:hidden}.flt__hd{display:flex;align-items:center;gap:6px;height:30px;padding:0 8px;cursor:pointer;font-size:12.5px;-webkit-user-select:none;user-select:none}.flt__hd:hover{background:var(--cad-hover)}.flt__hd .chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}.flt.is-open .flt__hd .chev{transform:rotate(90deg)}.flt__hd .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.flt__hd .on{font:600 10px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.flt__hd .clr{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.flt__hd .clr:hover{background:var(--cad-hover);color:var(--cad-fg)}.flt__bd{display:grid;gap:6px;padding:4px 8px 10px}.flt__bd .two{display:grid;grid-template-columns:1fr 1fr;gap:6px}.opts{max-height:160px;overflow:auto;display:grid;gap:2px}.opts label{display:flex;align-items:center;gap:6px;height:24px;font-size:12.5px}.empty{color:var(--cad-fg-muted);font-size:12px;padding:4px 0}:host(.is-overlay){position:absolute;top:0;right:0;bottom:0;z-index:20}:host(.is-overlay.is-open) .body{box-shadow:var(--cad-shadow-lg)}:host(.is-overlay.pos-left){right:auto;left:0}\n"] }]
11515
+ `, styles: [":host{display:flex;align-items:stretch;height:100%;min-height:0;font:var(--cad-font-size)/1.4 var(--cad-font);color:var(--cad-fg);position:relative}:host(.pos-left){flex-direction:row-reverse}.rail{display:flex;flex-direction:column;gap:2px;width:34px;padding:6px 0;background:var(--cad-bg-subtle);border-left:1px solid var(--cad-border);flex:none}:host(.pos-left) .rail{border-left:0;border-right:1px solid var(--cad-border)}.rail button{all:unset;display:flex;flex-direction:column;align-items:center;gap:6px;padding:10px 0;cursor:pointer;color:var(--cad-fg-secondary);border-radius:6px;margin:0 4px;writing-mode:vertical-rl;font-size:11.5px;font-weight:500;letter-spacing:.02em}.rail button cad-icon{writing-mode:horizontal-tb}.rail button:hover{background:var(--cad-hover);color:var(--cad-fg)}.rail button.is-active{background:var(--cad-accent-soft);color:var(--cad-accent)}.rail button:focus-visible{outline:2px solid var(--cad-ring)}.body{width:var(--_w, 260px);min-width:0;background:var(--cad-bg-subtle);border-left:1px solid var(--cad-border);display:flex;flex-direction:column;overflow:hidden}:host(.pos-left) .body{border-left:0;border-right:1px solid var(--cad-border)}:host(:not(.is-open)) .body{display:none}.body__scroll{flex:1;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:var(--cad-border-strong) transparent}.sec{padding:10px 12px 12px;border-bottom:1px solid var(--cad-border)}.sec:last-child{border-bottom:0}.sec__ttl{display:flex;align-items:center;gap:6px;font:600 10.5px/1 var(--cad-font-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--cad-fg-muted);margin:0 0 8px}.sec__ttl .grow{flex:1}.sec__ttl button.lnk{all:unset;cursor:pointer;color:var(--cad-accent);font:500 11px var(--cad-font);text-transform:none;letter-spacing:0}.sec__ttl button.lnk:hover{text-decoration:underline}.srch{display:flex;align-items:center;gap:6px;height:28px;padding:0 8px;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius-sm);margin-bottom:8px;color:var(--cad-fg-muted)}.srch:focus-within{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.srch input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:var(--cad-font-size-sm) var(--cad-font)}.srch input::placeholder{color:var(--cad-fg-muted)}.cols{display:flex;flex-direction:column;gap:1px}.col-row{display:flex;align-items:center;gap:6px;height:28px;padding:0 4px;border-radius:6px;font-size:12.5px}.col-row:hover{background:var(--cad-hover)}.col-row.is-off{color:var(--cad-fg-muted)}.col-row .dh{display:grid;place-items:center;width:16px;height:20px;color:var(--cad-fg-muted);cursor:grab;flex:none;border-radius:3px}.col-row .dh:hover{color:var(--cad-fg);background:var(--cad-elevated)}.col-row .dh.is-disabled{visibility:hidden}.col-row .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-row .pin{color:var(--cad-fg-muted)}.col-row.cdk-drag-preview{background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);box-shadow:var(--cad-shadow-lg)}.col-row.cdk-drag-placeholder{opacity:.3}.cols.cdk-drop-list-dragging .col-row:not(.cdk-drag-placeholder){transition:transform .18s cubic-bezier(0,0,.2,1)}.all-row{display:flex;align-items:center;gap:6px;height:28px;padding:0 4px;margin-bottom:4px}.all-row .cnt{margin-left:auto;font:500 10.5px var(--cad-font-mono);color:var(--cad-fg-muted)}.drop{min-height:40px;border:1px dashed var(--cad-border-strong);border-radius:8px;padding:6px;display:flex;flex-wrap:wrap;gap:6px;align-items:center;color:var(--cad-fg-muted);font-size:12px;transition:border-color var(--cad-dur),background var(--cad-dur)}.drop.cdk-drop-list-receiving,.drop.cdk-drop-list-dragging{border-color:var(--cad-accent);background:var(--cad-accent-soft)}.drop .hint{display:inline-flex;align-items:center;gap:6px;padding:0 4px}.chip{display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg);font-size:12px;white-space:nowrap}.chip .dh{display:grid;place-items:center;width:12px;color:var(--cad-fg-muted);cursor:grab}.chip .fn{font:500 11px var(--cad-font-mono);color:var(--cad-fg-secondary)}.chip button{all:unset;display:grid;place-items:center;width:16px;height:16px;border-radius:50%;color:var(--cad-fg-muted);cursor:pointer}.chip button:hover{background:var(--cad-hover);color:var(--cad-fg)}.chip.cdk-drag-preview{box-shadow:var(--cad-shadow-lg)}.chip.cdk-drag-placeholder{opacity:.3}.add{all:unset;display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 8px;border-radius:999px;border:1px dashed var(--cad-border-strong);color:var(--cad-fg-secondary);font-size:12px;cursor:pointer}.add:hover{border-color:var(--cad-accent);color:var(--cad-accent)}.picker{display:grid;gap:6px;padding:8px;margin-top:8px;border:1px solid var(--cad-border);border-radius:8px;background:var(--cad-surface)}.picker .row{display:flex;gap:6px}.flt{border:1px solid var(--cad-border);border-radius:8px;background:var(--cad-surface);margin-bottom:6px;overflow:hidden}.flt__hd{display:flex;align-items:center;gap:6px;height:30px;padding:0 8px;cursor:pointer;font-size:12.5px;-webkit-user-select:none;user-select:none}.flt__hd:hover{background:var(--cad-hover)}.flt__hd .chev{color:var(--cad-fg-muted);transition:transform var(--cad-dur)}.flt.is-open .flt__hd .chev{transform:rotate(90deg)}.flt__hd .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.flt__hd .on{font:600 10px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent)}.flt__hd .clr{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.flt__hd .clr:hover{background:var(--cad-hover);color:var(--cad-fg)}.flt__bd{display:grid;gap:6px;padding:4px 8px 10px}.flt__bd .two{display:grid;grid-template-columns:1fr 1fr;gap:6px}.opts{max-height:160px;overflow:auto;display:grid;gap:2px}.opts label{display:flex;align-items:center;gap:6px;height:24px;font-size:12.5px}.empty{color:var(--cad-fg-muted);font-size:12px;padding:4px 0}:host(.is-overlay){position:absolute;top:0;right:0;bottom:0;z-index:20}:host(.is-overlay.is-open) .body{box-shadow:var(--cad-shadow-lg)}:host(.is-overlay.pos-left){right:auto;left:0}\n"] }]
11516
11516
  }], ctorParameters: () => [], propDecorators: { table: [{ type: i0.Input, args: [{ isSignal: true, alias: "table", required: true }] }], tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], activeTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTab", required: false }] }, { type: i0.Output, args: ["activeTabChange"] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], overlayBelow: [{ type: i0.Input, args: [{ isSignal: true, alias: "overlayBelow", required: false }] }], columnsChange: [{ type: i0.Output, args: ["columnsChange"] }], groupsChange: [{ type: i0.Output, args: ["groupsChange"] }], aggregatesChange: [{ type: i0.Output, args: ["aggregatesChange"] }], filtersChange: [{ type: i0.Output, args: ["filtersChange"] }] } });
11517
11517
 
11518
11518
  /** <cad-skeleton width="70%" height="12px" shape="text|rect|circle" [lines]="3" [animation]="true" /> */
@@ -11751,7 +11751,7 @@ class CadTreeselectComponent extends CadValueAccessor {
11751
11751
  @if (isMulti()) {<div class="sp__foot"><button type="button" class="ok" (click)="close()">OK{{ selectedNodes().length ? ' (' + selectedNodes().length + ')' : '' }}</button></div>}
11752
11752
  </div>
11753
11753
  </ng-template>
11754
- `, isInline: true, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".sp__foot{display:flex;justify-content:flex-end;padding:6px 8px;border-top:1px solid var(--cad-border)}.sp__foot .ok{all:unset;padding:4px 12px;border-radius:6px;background:var(--cad-accent);color:var(--cad-fg-on-accent);font-size:var(--cad-font-size-sm);font-weight:500;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadTreeComponent, selector: "cad-tree", inputs: ["value", "treeField", "parentKey", "dataKey", "labelField", "expandedKeys", "selection", "selectionMode", "selectionPropagation", "nodeSelectable", "filter", "filterPlaceholder", "filterBy", "lazyChildren", "hasChildren", "indent", "showLines", "icons", "emptyMessage", "emptyFilterMessage", "ariaLabel", "toggleOnClick"], outputs: ["expandedKeysChange", "selectionChange", "nodeSelect", "nodeUnselect", "nodeExpand", "nodeCollapse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11754
+ `, isInline: true, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".sp__foot{display:flex;justify-content:flex-end;padding:6px 8px;border-top:1px solid var(--cad-border)}.sp__foot .ok{all:unset;padding:4px 12px;border-radius:6px;background:var(--cad-accent);color:var(--cad-fg-on-accent);font-size:var(--cad-font-size-sm);font-weight:500;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadTreeComponent, selector: "cad-tree", inputs: ["value", "treeField", "parentKey", "dataKey", "labelField", "expandedKeys", "selection", "selectionMode", "selectionPropagation", "nodeSelectable", "filter", "filterPlaceholder", "filterBy", "lazyChildren", "hasChildren", "indent", "showLines", "icons", "emptyMessage", "emptyFilterMessage", "ariaLabel", "toggleOnClick"], outputs: ["expandedKeysChange", "selectionChange", "nodeSelect", "nodeUnselect", "nodeExpand", "nodeCollapse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11755
11755
  }
11756
11756
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadTreeselectComponent, decorators: [{
11757
11757
  type: Component,
@@ -11774,7 +11774,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
11774
11774
  @if (isMulti()) {<div class="sp__foot"><button type="button" class="ok" (click)="close()">OK{{ selectedNodes().length ? ' (' + selectedNodes().length + ')' : '' }}</button></div>}
11775
11775
  </div>
11776
11776
  </ng-template>
11777
- `, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".sp__foot{display:flex;justify-content:flex-end;padding:6px 8px;border-top:1px solid var(--cad-border)}.sp__foot .ok{all:unset;padding:4px 12px;border-radius:6px;background:var(--cad-accent);color:var(--cad-fg-on-accent);font-size:var(--cad-font-size-sm);font-weight:500;cursor:pointer}\n"] }]
11777
+ `, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".sp__foot{display:flex;justify-content:flex-end;padding:6px 8px;border-top:1px solid var(--cad-border)}.sp__foot .ok{all:unset;padding:4px 12px;border-radius:6px;background:var(--cad-accent);color:var(--cad-fg-on-accent);font-size:var(--cad-font-size-sm);font-weight:500;cursor:pointer}\n"] }]
11778
11778
  }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], treeField: [{ type: i0.Input, args: [{ isSignal: true, alias: "treeField", required: false }] }], parentKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentKey", required: false }] }], dataKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataKey", required: false }] }], labelField: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelField", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], selectionMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionMode", required: false }] }], selectionPropagation: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionPropagation", required: false }] }], display: [{ type: i0.Input, args: [{ isSignal: true, alias: "display", required: false }] }], selectedItemsLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedItemsLabel", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPlaceholder", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], panelMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxHeight", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], showLines: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLines", required: false }] }], icons: [{ type: i0.Input, args: [{ isSignal: true, alias: "icons", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], nodeExpand: [{ type: i0.Output, args: ["nodeExpand"] }], trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }] } });
11779
11779
 
11780
11780
  /**
@@ -11930,7 +11930,7 @@ class CadCascadeSelectComponent extends CadValueAccessor {
11930
11930
  }
11931
11931
  </div>
11932
11932
  </ng-template>
11933
- `, isInline: true, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".cs{flex-direction:row;padding:4px}.cs__col{list-style:none;margin:0;padding:0 4px 0 0;min-width:160px;max-height:280px;overflow:auto;border-right:1px solid var(--cad-border)}.cs__col:last-child{border-right:0;padding-right:0}.cs__col li{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:var(--cad-font-size)}.cs__col li .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cs__col li .ar{color:var(--cad-fg-muted)}.cs__col li.is-active{background:var(--cad-hover)}.cs__col li.is-on{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11933
+ `, isInline: true, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".cs{flex-direction:row;padding:4px}.cs__col{list-style:none;margin:0;padding:0 4px 0 0;min-width:160px;max-height:280px;overflow:auto;border-right:1px solid var(--cad-border)}.cs__col:last-child{border-right:0;padding-right:0}.cs__col li{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:var(--cad-font-size)}.cs__col li .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cs__col li .ar{color:var(--cad-fg-muted)}.cs__col li.is-active{background:var(--cad-hover)}.cs__col li.is-on{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11934
11934
  }
11935
11935
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadCascadeSelectComponent, decorators: [{
11936
11936
  type: Component,
@@ -11953,7 +11953,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
11953
11953
  }
11954
11954
  </div>
11955
11955
  </ng-template>
11956
- `, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".cs{flex-direction:row;padding:4px}.cs__col{list-style:none;margin:0;padding:0 4px 0 0;min-width:160px;max-height:280px;overflow:auto;border-right:1px solid var(--cad-border)}.cs__col:last-child{border-right:0;padding-right:0}.cs__col li{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:var(--cad-font-size)}.cs__col li .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cs__col li .ar{color:var(--cad-fg-muted)}.cs__col li.is-active{background:var(--cad-hover)}.cs__col li.is-on{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}\n"] }]
11956
+ `, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".cs{flex-direction:row;padding:4px}.cs__col{list-style:none;margin:0;padding:0 4px 0 0;min-width:160px;max-height:280px;overflow:auto;border-right:1px solid var(--cad-border)}.cs__col:last-child{border-right:0;padding-right:0}.cs__col li{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer;font-size:var(--cad-font-size)}.cs__col li .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cs__col li .ar{color:var(--cad-fg-muted)}.cs__col li.is-active{background:var(--cad-hover)}.cs__col li.is-on{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}\n"] }]
11957
11957
  }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], optionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValue", required: false }] }], optionGroupLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupLabel", required: false }] }], optionGroupChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionGroupChildren", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], showPath: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPath", required: false }] }], pathSeparator: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathSeparator", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], groupChange: [{ type: i0.Output, args: ["groupChange"] }], trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }] } });
11958
11958
 
11959
11959
  /**
@@ -12175,7 +12175,7 @@ class CadComboComponent extends CadValueAccessor {
12175
12175
  </ul>
12176
12176
  </div>
12177
12177
  </ng-template>
12178
- `, isInline: true, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".st{cursor:text}.st--multi{align-items:flex-start}.cb__list{list-style:none;margin:0;padding:4px;overflow:auto}.cb__list li{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer}.cb__list li.is-active{background:var(--cad-hover)}.cb__list li.is-on{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12178
+ `, isInline: true, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".st{cursor:text}.st--multi{align-items:flex-start}.cb__list{list-style:none;margin:0;padding:4px;overflow:auto}.cb__list li{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer}.cb__list li.is-active{background:var(--cad-hover)}.cb__list li.is-on{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12179
12179
  }
12180
12180
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadComboComponent, decorators: [{
12181
12181
  type: Component,
@@ -12204,7 +12204,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
12204
12204
  </ul>
12205
12205
  </div>
12206
12206
  </ng-template>
12207
- `, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".st{cursor:text}.st--multi{align-items:flex-start}.cb__list{list-style:none;margin:0;padding:4px;overflow:auto}.cb__list li{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer}.cb__list li.is-active{background:var(--cad-hover)}.cb__list li.is-on{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}\n"] }]
12207
+ `, styles: [":host{display:inline-flex;width:100%;box-sizing:border-box;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg);vertical-align:middle}.st{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;min-height:var(--cad-control-h);padding:0 8px 0 var(--cad-control-px);background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}:host(.size-sm) .st{min-height:var(--cad-control-h-sm);font-size:var(--cad-font-size-sm);border-radius:var(--cad-radius-sm)}:host(.size-lg) .st{min-height:var(--cad-control-h-lg);font-size:var(--cad-font-size-lg)}.st:focus-visible,.st:focus-within,:host(.is-open) .st{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}:host(.is-invalid) .st{border-color:var(--cad-danger)}:host(.is-invalid.is-open) .st,:host(.is-invalid) .st:focus-within{box-shadow:0 0 0 3px var(--cad-danger-soft)}:host(.is-disabled) .st{opacity:.6;cursor:not-allowed;background:var(--cad-bg-subtle)}.st__val{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px}.st__val.is-ph{color:var(--cad-fg-muted)}.st__chips{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:4px;padding:3px 0}.st__chip{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 6px 0 8px;border-radius:999px;background:var(--cad-accent-soft);color:var(--cad-accent);font-size:var(--cad-font-size-sm);font-weight:500}.st__chip button{all:unset;display:grid;place-items:center;width:14px;height:14px;border-radius:50%;cursor:pointer}.st__chip button:hover{background:#00000014}.st__input{flex:1;min-width:40px;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;padding:0;height:calc(var(--cad-control-h) - 2px)}.st__input::placeholder{color:var(--cad-fg-muted)}.st__chev{color:var(--cad-fg-muted);flex:none;transition:transform var(--cad-dur) var(--cad-ease)}:host(.is-open) .st__chev{transform:rotate(180deg)}.st__clear,.st__dd{all:unset;display:grid;place-items:center;width:18px;height:18px;border-radius:4px;color:var(--cad-fg-muted);cursor:pointer}.st__clear:hover,.st__dd:hover{color:var(--cad-fg);background:var(--cad-hover)}.st__spin{color:var(--cad-fg-muted)}.sp{display:flex;flex-direction:column;box-sizing:border-box;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);overflow:hidden;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}.sp__empty{padding:12px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n", ".st{cursor:text}.st--multi{align-items:flex-start}.cb__list{list-style:none;margin:0;padding:4px;overflow:auto}.cb__list li{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;cursor:pointer}.cb__list li.is-active{background:var(--cad-hover)}.cb__list li.is-on{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}\n"] }]
12208
12208
  }], ctorParameters: () => [], propDecorators: { suggestions: [{ type: i0.Input, args: [{ isSignal: true, alias: "suggestions", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], minLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minLength", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], dropdown: [{ type: i0.Input, args: [{ isSignal: true, alias: "dropdown", required: false }] }], forceSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "forceSelection", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], panelMaxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelMaxHeight", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }], completeMethod: [{ type: i0.Output, args: ["completeMethod"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CadSelectItemDirective), { isSignal: true }] }], trigger: [{ type: i0.ViewChild, args: ['trigger', { isSignal: true }] }], inputEl: [{ type: i0.ViewChild, args: ['input', { isSignal: true }] }] } });
12209
12209
 
12210
12210
  let toastSeq = 0;
@@ -12376,7 +12376,7 @@ class CadToastComponent {
12376
12376
  }
12377
12377
  </div>
12378
12378
  }
12379
- `, isInline: true, styles: [":host{position:fixed;display:flex;flex-direction:column;gap:8px;width:340px;max-width:calc(100% - 32px);pointer-events:none;font-family:var(--cad-font)}:host(.pos-top-right){top:16px;right:16px}:host(.pos-top-left){top:16px;left:16px}:host(.pos-bottom-right){bottom:16px;right:16px;flex-direction:column-reverse}:host(.pos-bottom-left){bottom:16px;left:16px;flex-direction:column-reverse}:host(.pos-top-center){top:16px;left:50%;transform:translate(-50%)}:host(.pos-bottom-center){bottom:16px;left:50%;transform:translate(-50%);flex-direction:column-reverse}.cad-toast__item{--_c: var(--cad-accent);position:relative;overflow:hidden;pointer-events:auto;display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:10px;background:var(--cad-overlay);border:1px solid var(--cad-border);border-left:3px solid var(--_c);box-shadow:var(--cad-shadow-lg);color:var(--cad-fg);animation:cad-toast-in .18s var(--cad-ease)}.cad-toast__item.is-out{animation:cad-toast-out .16s var(--cad-ease) forwards}:host(.pos-top-left) .cad-toast__item,:host(.pos-bottom-left) .cad-toast__item{animation-name:cad-toast-in-l}.cad-toast__item.sev-success{--_c: var(--cad-success)}.cad-toast__item.sev-info{--_c: var(--cad-info)}.cad-toast__item.sev-warning{--_c: var(--cad-warning)}.cad-toast__item.sev-danger{--_c: var(--cad-danger)}.cad-toast__item.sev-secondary{--_c: var(--cad-fg-muted)}.cad-toast__item.sev-contrast{--_c: var(--cad-fg);background:var(--cad-fg);color:var(--cad-bg)}.cad-toast__icon{color:var(--_c);margin-top:1px;flex:none}.cad-toast__text{display:grid;gap:2px;flex:1;min-width:0}.cad-toast__text b{font-weight:600;font-size:13px}.cad-toast__text span{color:var(--cad-fg-secondary);font-size:12.5px;line-height:1.4}.sev-contrast .cad-toast__text span{color:inherit;opacity:.8}.cad-toast__actions{display:flex;gap:4px;margin-top:4px;margin-left:-8px}.cad-toast__close{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:2px;border-radius:4px;display:grid;place-items:center;flex:none;margin:-2px -4px 0 0}.cad-toast__close:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-toast__progress{position:absolute;left:0;bottom:0;height:2px;width:100%;background:var(--_c);opacity:.5;transform-origin:left;animation:cad-toast-life linear forwards}@keyframes cad-toast-in{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:none}}@keyframes cad-toast-in-l{0%{opacity:0;transform:translate(-24px)}to{opacity:1;transform:none}}@keyframes cad-toast-out{to{opacity:0;transform:scale(.96)}}@keyframes cad-toast-life{0%{transform:scaleX(1)}to{transform:scaleX(0)}}@media(prefers-reduced-motion:reduce){.cad-toast__item,.cad-toast__item.is-out{animation-duration:1ms}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadButtonComponent, selector: "button[cadButton], a[cadButton]", inputs: ["severity", "variant", "size", "loading", "disabled", "icon", "block", "value", "pressed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12379
+ `, isInline: true, styles: [":host{position:fixed;display:flex;flex-direction:column;gap:8px;width:340px;max-width:calc(100% - 32px);pointer-events:none;font-family:var(--cad-font)}:host(.pos-top-right){top:16px;right:16px}:host(.pos-top-left){top:16px;left:16px}:host(.pos-bottom-right){bottom:16px;right:16px;flex-direction:column-reverse}:host(.pos-bottom-left){bottom:16px;left:16px;flex-direction:column-reverse}:host(.pos-top-center){top:16px;left:50%;transform:translate(-50%)}:host(.pos-bottom-center){bottom:16px;left:50%;transform:translate(-50%);flex-direction:column-reverse}.cad-toast__item{--_c: var(--cad-accent);position:relative;overflow:hidden;pointer-events:auto;display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:10px;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-left:3px solid var(--_c);box-shadow:var(--cad-shadow-lg);color:var(--cad-fg);animation:cad-toast-in .18s var(--cad-ease)}.cad-toast__item.is-out{animation:cad-toast-out .16s var(--cad-ease) forwards}:host(.pos-top-left) .cad-toast__item,:host(.pos-bottom-left) .cad-toast__item{animation-name:cad-toast-in-l}.cad-toast__item.sev-success{--_c: var(--cad-success)}.cad-toast__item.sev-info{--_c: var(--cad-info)}.cad-toast__item.sev-warning{--_c: var(--cad-warning)}.cad-toast__item.sev-danger{--_c: var(--cad-danger)}.cad-toast__item.sev-secondary{--_c: var(--cad-fg-muted)}.cad-toast__item.sev-contrast{--_c: var(--cad-fg);background:var(--cad-fg);color:var(--cad-bg)}.cad-toast__icon{color:var(--_c);margin-top:1px;flex:none}.cad-toast__text{display:grid;gap:2px;flex:1;min-width:0}.cad-toast__text b{font-weight:600;font-size:13px}.cad-toast__text span{color:var(--cad-fg-secondary);font-size:12.5px;line-height:1.4}.sev-contrast .cad-toast__text span{color:inherit;opacity:.8}.cad-toast__actions{display:flex;gap:4px;margin-top:4px;margin-left:-8px}.cad-toast__close{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:2px;border-radius:4px;display:grid;place-items:center;flex:none;margin:-2px -4px 0 0}.cad-toast__close:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-toast__progress{position:absolute;left:0;bottom:0;height:2px;width:100%;background:var(--_c);opacity:.5;transform-origin:left;animation:cad-toast-life linear forwards}@keyframes cad-toast-in{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:none}}@keyframes cad-toast-in-l{0%{opacity:0;transform:translate(-24px)}to{opacity:1;transform:none}}@keyframes cad-toast-out{to{opacity:0;transform:scale(.96)}}@keyframes cad-toast-life{0%{transform:scaleX(1)}to{transform:scaleX(0)}}@media(prefers-reduced-motion:reduce){.cad-toast__item,.cad-toast__item.is-out{animation-duration:1ms}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadButtonComponent, selector: "button[cadButton], a[cadButton]", inputs: ["severity", "variant", "size", "loading", "disabled", "icon", "block", "value", "pressed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12380
12380
  }
12381
12381
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadToastComponent, decorators: [{
12382
12382
  type: Component,
@@ -12409,7 +12409,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
12409
12409
  }
12410
12410
  </div>
12411
12411
  }
12412
- `, styles: [":host{position:fixed;display:flex;flex-direction:column;gap:8px;width:340px;max-width:calc(100% - 32px);pointer-events:none;font-family:var(--cad-font)}:host(.pos-top-right){top:16px;right:16px}:host(.pos-top-left){top:16px;left:16px}:host(.pos-bottom-right){bottom:16px;right:16px;flex-direction:column-reverse}:host(.pos-bottom-left){bottom:16px;left:16px;flex-direction:column-reverse}:host(.pos-top-center){top:16px;left:50%;transform:translate(-50%)}:host(.pos-bottom-center){bottom:16px;left:50%;transform:translate(-50%);flex-direction:column-reverse}.cad-toast__item{--_c: var(--cad-accent);position:relative;overflow:hidden;pointer-events:auto;display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:10px;background:var(--cad-overlay);border:1px solid var(--cad-border);border-left:3px solid var(--_c);box-shadow:var(--cad-shadow-lg);color:var(--cad-fg);animation:cad-toast-in .18s var(--cad-ease)}.cad-toast__item.is-out{animation:cad-toast-out .16s var(--cad-ease) forwards}:host(.pos-top-left) .cad-toast__item,:host(.pos-bottom-left) .cad-toast__item{animation-name:cad-toast-in-l}.cad-toast__item.sev-success{--_c: var(--cad-success)}.cad-toast__item.sev-info{--_c: var(--cad-info)}.cad-toast__item.sev-warning{--_c: var(--cad-warning)}.cad-toast__item.sev-danger{--_c: var(--cad-danger)}.cad-toast__item.sev-secondary{--_c: var(--cad-fg-muted)}.cad-toast__item.sev-contrast{--_c: var(--cad-fg);background:var(--cad-fg);color:var(--cad-bg)}.cad-toast__icon{color:var(--_c);margin-top:1px;flex:none}.cad-toast__text{display:grid;gap:2px;flex:1;min-width:0}.cad-toast__text b{font-weight:600;font-size:13px}.cad-toast__text span{color:var(--cad-fg-secondary);font-size:12.5px;line-height:1.4}.sev-contrast .cad-toast__text span{color:inherit;opacity:.8}.cad-toast__actions{display:flex;gap:4px;margin-top:4px;margin-left:-8px}.cad-toast__close{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:2px;border-radius:4px;display:grid;place-items:center;flex:none;margin:-2px -4px 0 0}.cad-toast__close:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-toast__progress{position:absolute;left:0;bottom:0;height:2px;width:100%;background:var(--_c);opacity:.5;transform-origin:left;animation:cad-toast-life linear forwards}@keyframes cad-toast-in{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:none}}@keyframes cad-toast-in-l{0%{opacity:0;transform:translate(-24px)}to{opacity:1;transform:none}}@keyframes cad-toast-out{to{opacity:0;transform:scale(.96)}}@keyframes cad-toast-life{0%{transform:scaleX(1)}to{transform:scaleX(0)}}@media(prefers-reduced-motion:reduce){.cad-toast__item,.cad-toast__item.is-out{animation-duration:1ms}}\n"] }]
12412
+ `, styles: [":host{position:fixed;display:flex;flex-direction:column;gap:8px;width:340px;max-width:calc(100% - 32px);pointer-events:none;font-family:var(--cad-font)}:host(.pos-top-right){top:16px;right:16px}:host(.pos-top-left){top:16px;left:16px}:host(.pos-bottom-right){bottom:16px;right:16px;flex-direction:column-reverse}:host(.pos-bottom-left){bottom:16px;left:16px;flex-direction:column-reverse}:host(.pos-top-center){top:16px;left:50%;transform:translate(-50%)}:host(.pos-bottom-center){bottom:16px;left:50%;transform:translate(-50%);flex-direction:column-reverse}.cad-toast__item{--_c: var(--cad-accent);position:relative;overflow:hidden;pointer-events:auto;display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:10px;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-left:3px solid var(--_c);box-shadow:var(--cad-shadow-lg);color:var(--cad-fg);animation:cad-toast-in .18s var(--cad-ease)}.cad-toast__item.is-out{animation:cad-toast-out .16s var(--cad-ease) forwards}:host(.pos-top-left) .cad-toast__item,:host(.pos-bottom-left) .cad-toast__item{animation-name:cad-toast-in-l}.cad-toast__item.sev-success{--_c: var(--cad-success)}.cad-toast__item.sev-info{--_c: var(--cad-info)}.cad-toast__item.sev-warning{--_c: var(--cad-warning)}.cad-toast__item.sev-danger{--_c: var(--cad-danger)}.cad-toast__item.sev-secondary{--_c: var(--cad-fg-muted)}.cad-toast__item.sev-contrast{--_c: var(--cad-fg);background:var(--cad-fg);color:var(--cad-bg)}.cad-toast__icon{color:var(--_c);margin-top:1px;flex:none}.cad-toast__text{display:grid;gap:2px;flex:1;min-width:0}.cad-toast__text b{font-weight:600;font-size:13px}.cad-toast__text span{color:var(--cad-fg-secondary);font-size:12.5px;line-height:1.4}.sev-contrast .cad-toast__text span{color:inherit;opacity:.8}.cad-toast__actions{display:flex;gap:4px;margin-top:4px;margin-left:-8px}.cad-toast__close{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;padding:2px;border-radius:4px;display:grid;place-items:center;flex:none;margin:-2px -4px 0 0}.cad-toast__close:hover{color:var(--cad-fg);background:var(--cad-hover)}.cad-toast__progress{position:absolute;left:0;bottom:0;height:2px;width:100%;background:var(--_c);opacity:.5;transform-origin:left;animation:cad-toast-life linear forwards}@keyframes cad-toast-in{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:none}}@keyframes cad-toast-in-l{0%{opacity:0;transform:translate(-24px)}to{opacity:1;transform:none}}@keyframes cad-toast-out{to{opacity:0;transform:scale(.96)}}@keyframes cad-toast-life{0%{transform:scaleX(1)}to{transform:scaleX(0)}}@media(prefers-reduced-motion:reduce){.cad-toast__item,.cad-toast__item.is-out{animation-duration:1ms}}\n"] }]
12413
12413
  }], ctorParameters: () => [], propDecorators: { position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: false }] }], life: [{ type: i0.Input, args: [{ isSignal: true, alias: "life", required: false }] }], maxVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisible", required: false }] }], preventDuplicates: [{ type: i0.Input, args: [{ isSignal: true, alias: "preventDuplicates", required: false }] }], showProgress: [{ type: i0.Input, args: [{ isSignal: true, alias: "showProgress", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], clicked: [{ type: i0.Output, args: ["clicked"] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CadToastItemDirective), { isSignal: true }] }] } });
12414
12414
 
12415
12415
  /**
@@ -13769,7 +13769,7 @@ const CAD_MAP_GLOBAL_STYLES = `
13769
13769
  .cad-map .maplibregl-ctrl-attrib.maplibregl-compact { min-height: 24px; }
13770
13770
  .cad-map .maplibregl-ctrl-attrib-button { ${mask(ico("%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 11v5M12 8v.5'/%3E"))} color: var(--cad-fg-muted); }
13771
13771
  .cad-map .maplibregl-popup { z-index: 5; max-width: 320px !important; }
13772
- .cad-map .maplibregl-popup-content { background: var(--cad-overlay); color: var(--cad-fg); border: 1px solid var(--cad-border); border-radius: 10px; box-shadow: var(--cad-shadow-lg); padding: 10px 12px; font: 12.5px/1.4 var(--cad-font); min-width: 160px; }
13772
+ .cad-map .maplibregl-popup-content { background: var(--cad-overlay); --cad-hover: var(--cad-overlay-hover); color: var(--cad-fg); border: 1px solid var(--cad-border); border-radius: 10px; box-shadow: var(--cad-shadow-lg); padding: 10px 12px; font: 12.5px/1.4 var(--cad-font); min-width: 160px; }
13773
13773
  .cad-map .maplibregl-popup-anchor-bottom .maplibregl-popup-tip { border-top-color: var(--cad-overlay); }
13774
13774
  .cad-map .maplibregl-popup-anchor-top .maplibregl-popup-tip { border-bottom-color: var(--cad-overlay); }
13775
13775
  .cad-map .maplibregl-popup-anchor-left .maplibregl-popup-tip { border-right-color: var(--cad-overlay); }
@@ -14885,7 +14885,7 @@ class CadMapSearchComponent {
14885
14885
  } @else if (open() && q().length >= 3 && !busy() && searched()) {
14886
14886
  <ul class="list"><li class="empty">Aucun résultat</li></ul>
14887
14887
  }
14888
- `, isInline: true, styles: [":host{display:block;position:relative;width:300px;max-width:calc(100% - 80px);font:var(--cad-font-size) var(--cad-font);z-index:6}.box{display:flex;align-items:center;gap:8px;height:34px;padding:0 10px;background:var(--cad-surface);border:1px solid var(--cad-border);border-radius:8px;box-shadow:0 2px 6px #0000001f;color:var(--cad-fg-muted);transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.box.has-focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit}input::placeholder{color:var(--cad-fg-muted)}input::-webkit-search-cancel-button{display:none}.clr{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;width:20px;height:20px;border-radius:4px;padding:0}.clr:hover{background:var(--cad-hover);color:var(--cad-fg)}.spin{color:var(--cad-accent)}.list{position:absolute;left:0;right:0;top:calc(100% + 6px);margin:0;padding:4px;list-style:none;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);max-height:280px;overflow:auto}li{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:pointer;color:var(--cad-fg);font-size:12.5px}li .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}li small{color:var(--cad-fg-muted);font-size:11px;white-space:nowrap}li cad-icon{color:var(--cad-fg-muted)}li.is-active{background:var(--cad-hover)}li.empty{color:var(--cad-fg-muted);cursor:default;font-style:italic}\n"], dependencies: [{ kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14888
+ `, isInline: true, styles: [":host{display:block;position:relative;width:300px;max-width:calc(100% - 80px);font:var(--cad-font-size) var(--cad-font);z-index:6}.box{display:flex;align-items:center;gap:8px;height:34px;padding:0 10px;background:var(--cad-surface);border:1px solid var(--cad-border);border-radius:8px;box-shadow:0 2px 6px #0000001f;color:var(--cad-fg-muted);transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.box.has-focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit}input::placeholder{color:var(--cad-fg-muted)}input::-webkit-search-cancel-button{display:none}.clr{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;width:20px;height:20px;border-radius:4px;padding:0}.clr:hover{background:var(--cad-hover);color:var(--cad-fg)}.spin{color:var(--cad-accent)}.list{position:absolute;left:0;right:0;top:calc(100% + 6px);margin:0;padding:4px;list-style:none;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);max-height:280px;overflow:auto}li{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:pointer;color:var(--cad-fg);font-size:12.5px}li .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}li small{color:var(--cad-fg-muted);font-size:11px;white-space:nowrap}li cad-icon{color:var(--cad-fg-muted)}li.is-active{background:var(--cad-hover)}li.empty{color:var(--cad-fg-muted);cursor:default;font-style:italic}\n"], dependencies: [{ kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14889
14889
  }
14890
14890
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadMapSearchComponent, decorators: [{
14891
14891
  type: Component,
@@ -14908,7 +14908,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
14908
14908
  } @else if (open() && q().length >= 3 && !busy() && searched()) {
14909
14909
  <ul class="list"><li class="empty">Aucun résultat</li></ul>
14910
14910
  }
14911
- `, styles: [":host{display:block;position:relative;width:300px;max-width:calc(100% - 80px);font:var(--cad-font-size) var(--cad-font);z-index:6}.box{display:flex;align-items:center;gap:8px;height:34px;padding:0 10px;background:var(--cad-surface);border:1px solid var(--cad-border);border-radius:8px;box-shadow:0 2px 6px #0000001f;color:var(--cad-fg-muted);transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.box.has-focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit}input::placeholder{color:var(--cad-fg-muted)}input::-webkit-search-cancel-button{display:none}.clr{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;width:20px;height:20px;border-radius:4px;padding:0}.clr:hover{background:var(--cad-hover);color:var(--cad-fg)}.spin{color:var(--cad-accent)}.list{position:absolute;left:0;right:0;top:calc(100% + 6px);margin:0;padding:4px;list-style:none;background:var(--cad-overlay);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);max-height:280px;overflow:auto}li{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:pointer;color:var(--cad-fg);font-size:12.5px}li .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}li small{color:var(--cad-fg-muted);font-size:11px;white-space:nowrap}li cad-icon{color:var(--cad-fg-muted)}li.is-active{background:var(--cad-hover)}li.empty{color:var(--cad-fg-muted);cursor:default;font-style:italic}\n"] }]
14911
+ `, styles: [":host{display:block;position:relative;width:300px;max-width:calc(100% - 80px);font:var(--cad-font-size) var(--cad-font);z-index:6}.box{display:flex;align-items:center;gap:8px;height:34px;padding:0 10px;background:var(--cad-surface);border:1px solid var(--cad-border);border-radius:8px;box-shadow:0 2px 6px #0000001f;color:var(--cad-fg-muted);transition:border-color var(--cad-dur),box-shadow var(--cad-dur)}.box.has-focus{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}input{flex:1 1 0;width:0;min-width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit}input::placeholder{color:var(--cad-fg-muted)}input::-webkit-search-cancel-button{display:none}.clr{border:0;background:transparent;color:var(--cad-fg-muted);cursor:pointer;display:grid;place-items:center;width:20px;height:20px;border-radius:4px;padding:0}.clr:hover{background:var(--cad-hover);color:var(--cad-fg)}.spin{color:var(--cad-accent)}.list{position:absolute;left:0;right:0;top:calc(100% + 6px);margin:0;padding:4px;list-style:none;background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border);border-radius:9px;box-shadow:var(--cad-shadow-lg);max-height:280px;overflow:auto}li{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:pointer;color:var(--cad-fg);font-size:12.5px}li .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}li small{color:var(--cad-fg-muted);font-size:11px;white-space:nowrap}li cad-icon{color:var(--cad-fg-muted)}li.is-active{background:var(--cad-hover)}li.empty{color:var(--cad-fg-muted);cursor:default;font-style:italic}\n"] }]
14912
14912
  }], ctorParameters: () => [], propDecorators: { inp: [{ type: i0.ViewChild, args: ['inp', { isSignal: true }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], limit: [{ type: i0.Input, args: [{ isSignal: true, alias: "limit", required: false }] }], debounce: [{ type: i0.Input, args: [{ isSignal: true, alias: "debounce", required: false }] }], provider: [{ type: i0.Input, args: [{ isSignal: true, alias: "provider", required: false }] }], flyZoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "flyZoom", required: false }] }], marker: [{ type: i0.Input, args: [{ isSignal: true, alias: "marker", required: false }] }], nearMap: [{ type: i0.Input, args: [{ isSignal: true, alias: "nearMap", required: false }] }], select: [{ type: i0.Output, args: ["select"] }], cleared: [{ type: i0.Output, args: ["cleared"] }] } });
14913
14913
  const escapeHtml = (s) => s.replace(/[&<>"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[c]);
14914
14914
 
@@ -17156,7 +17156,7 @@ class CadOrderlistComponent extends CadValueAccessor {
17156
17156
  } @empty { <div class="cad-orderlist__empty">{{ query() ? 'Aucun résultat' : emptyMessage() }}</div> }
17157
17157
  </div>
17158
17158
  </div>
17159
- `, isInline: true, styles: [":host{display:flex;gap:8px;align-items:flex-start;min-width:0;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.controls-top){flex-direction:column}:host(.controls-top) .cad-orderlist__ctrl{flex-direction:row}:host(.is-disabled){opacity:.6}.cad-orderlist__ctrl{display:flex;flex-direction:column;gap:4px;flex:none}.cad-orderlist__box{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);overflow:hidden}:host(:focus-within) .cad-orderlist__box{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.cad-orderlist__hd{display:flex;align-items:center;gap:8px;padding:8px 12px;font-weight:600;font-size:12.5px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle)}.cad-orderlist__hd small{margin-left:auto;font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.cad-orderlist__filter{display:flex;align-items:center;gap:6px;padding:6px 8px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-orderlist__filter input{flex:1 1 0;width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;font-size:var(--cad-font-size-sm)}.cad-orderlist__list{flex:1;overflow-y:auto;padding:4px;outline:none;min-height:40px}.cad-orderlist__item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:default;-webkit-user-select:none;user-select:none;background:var(--cad-input-bg)}:host(.is-striped) .cad-orderlist__item:nth-child(2n){background:var(--cad-bg-subtle)}.cad-orderlist__item:hover,.cad-orderlist__item.is-active{background:var(--cad-hover)}.cad-orderlist__item.is-selected{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}.cad-orderlist__item .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cad-orderlist__item .dh{color:var(--cad-fg-muted);cursor:grab;display:inline-grid;place-items:center}.cad-orderlist__item.cdk-drag-preview{box-shadow:var(--cad-shadow-lg);border:1px solid var(--cad-border);background:var(--cad-overlay);border-radius:6px}.cad-orderlist__ph{height:32px;border:1px dashed var(--cad-accent);border-radius:6px;background:var(--cad-accent-soft);margin:2px 0}.cdk-drop-list-dragging .cad-orderlist__item:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.cad-orderlist__empty{padding:14px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadButtonComponent, selector: "button[cadButton], a[cadButton]", inputs: ["severity", "variant", "size", "loading", "disabled", "icon", "block", "value", "pressed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17159
+ `, isInline: true, styles: [":host{display:flex;gap:8px;align-items:flex-start;min-width:0;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.controls-top){flex-direction:column}:host(.controls-top) .cad-orderlist__ctrl{flex-direction:row}:host(.is-disabled){opacity:.6}.cad-orderlist__ctrl{display:flex;flex-direction:column;gap:4px;flex:none}.cad-orderlist__box{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);overflow:hidden}:host(:focus-within) .cad-orderlist__box{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.cad-orderlist__hd{display:flex;align-items:center;gap:8px;padding:8px 12px;font-weight:600;font-size:12.5px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle)}.cad-orderlist__hd small{margin-left:auto;font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.cad-orderlist__filter{display:flex;align-items:center;gap:6px;padding:6px 8px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-orderlist__filter input{flex:1 1 0;width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;font-size:var(--cad-font-size-sm)}.cad-orderlist__list{flex:1;overflow-y:auto;padding:4px;outline:none;min-height:40px}.cad-orderlist__item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:default;-webkit-user-select:none;user-select:none;background:var(--cad-input-bg)}:host(.is-striped) .cad-orderlist__item:nth-child(2n){background:var(--cad-bg-subtle)}.cad-orderlist__item:hover,.cad-orderlist__item.is-active{background:var(--cad-hover)}.cad-orderlist__item.is-selected{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}.cad-orderlist__item .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cad-orderlist__item .dh{color:var(--cad-fg-muted);cursor:grab;display:inline-grid;place-items:center}.cad-orderlist__item.cdk-drag-preview{box-shadow:var(--cad-shadow-lg);border:1px solid var(--cad-border);background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border-radius:6px}.cad-orderlist__ph{height:32px;border:1px dashed var(--cad-accent);border-radius:6px;background:var(--cad-accent-soft);margin:2px 0}.cdk-drop-list-dragging .cad-orderlist__item:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.cad-orderlist__empty{padding:14px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadButtonComponent, selector: "button[cadButton], a[cadButton]", inputs: ["severity", "variant", "size", "loading", "disabled", "icon", "block", "value", "pressed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17160
17160
  }
17161
17161
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadOrderlistComponent, decorators: [{
17162
17162
  type: Component,
@@ -17184,7 +17184,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
17184
17184
  } @empty { <div class="cad-orderlist__empty">{{ query() ? 'Aucun résultat' : emptyMessage() }}</div> }
17185
17185
  </div>
17186
17186
  </div>
17187
- `, styles: [":host{display:flex;gap:8px;align-items:flex-start;min-width:0;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.controls-top){flex-direction:column}:host(.controls-top) .cad-orderlist__ctrl{flex-direction:row}:host(.is-disabled){opacity:.6}.cad-orderlist__ctrl{display:flex;flex-direction:column;gap:4px;flex:none}.cad-orderlist__box{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);overflow:hidden}:host(:focus-within) .cad-orderlist__box{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.cad-orderlist__hd{display:flex;align-items:center;gap:8px;padding:8px 12px;font-weight:600;font-size:12.5px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle)}.cad-orderlist__hd small{margin-left:auto;font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.cad-orderlist__filter{display:flex;align-items:center;gap:6px;padding:6px 8px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-orderlist__filter input{flex:1 1 0;width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;font-size:var(--cad-font-size-sm)}.cad-orderlist__list{flex:1;overflow-y:auto;padding:4px;outline:none;min-height:40px}.cad-orderlist__item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:default;-webkit-user-select:none;user-select:none;background:var(--cad-input-bg)}:host(.is-striped) .cad-orderlist__item:nth-child(2n){background:var(--cad-bg-subtle)}.cad-orderlist__item:hover,.cad-orderlist__item.is-active{background:var(--cad-hover)}.cad-orderlist__item.is-selected{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}.cad-orderlist__item .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cad-orderlist__item .dh{color:var(--cad-fg-muted);cursor:grab;display:inline-grid;place-items:center}.cad-orderlist__item.cdk-drag-preview{box-shadow:var(--cad-shadow-lg);border:1px solid var(--cad-border);background:var(--cad-overlay);border-radius:6px}.cad-orderlist__ph{height:32px;border:1px dashed var(--cad-accent);border-radius:6px;background:var(--cad-accent-soft);margin:2px 0}.cdk-drop-list-dragging .cad-orderlist__item:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.cad-orderlist__empty{padding:14px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n"] }]
17187
+ `, styles: [":host{display:flex;gap:8px;align-items:flex-start;min-width:0;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.controls-top){flex-direction:column}:host(.controls-top) .cad-orderlist__ctrl{flex-direction:row}:host(.is-disabled){opacity:.6}.cad-orderlist__ctrl{display:flex;flex-direction:column;gap:4px;flex:none}.cad-orderlist__box{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);overflow:hidden}:host(:focus-within) .cad-orderlist__box{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.cad-orderlist__hd{display:flex;align-items:center;gap:8px;padding:8px 12px;font-weight:600;font-size:12.5px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle)}.cad-orderlist__hd small{margin-left:auto;font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.cad-orderlist__filter{display:flex;align-items:center;gap:6px;padding:6px 8px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.cad-orderlist__filter input{flex:1 1 0;width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;font-size:var(--cad-font-size-sm)}.cad-orderlist__list{flex:1;overflow-y:auto;padding:4px;outline:none;min-height:40px}.cad-orderlist__item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:default;-webkit-user-select:none;user-select:none;background:var(--cad-input-bg)}:host(.is-striped) .cad-orderlist__item:nth-child(2n){background:var(--cad-bg-subtle)}.cad-orderlist__item:hover,.cad-orderlist__item.is-active{background:var(--cad-hover)}.cad-orderlist__item.is-selected{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}.cad-orderlist__item .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cad-orderlist__item .dh{color:var(--cad-fg-muted);cursor:grab;display:inline-grid;place-items:center}.cad-orderlist__item.cdk-drag-preview{box-shadow:var(--cad-shadow-lg);border:1px solid var(--cad-border);background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border-radius:6px}.cad-orderlist__ph{height:32px;border:1px dashed var(--cad-accent);border-radius:6px;background:var(--cad-accent-soft);margin:2px 0}.cdk-drop-list-dragging .cad-orderlist__item:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.cad-orderlist__empty{padding:14px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}\n"] }]
17188
17188
  }], propDecorators: { optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], dataKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataKey", required: false }] }], header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], controls: [{ type: i0.Input, args: [{ isSignal: true, alias: "controls", required: false }] }], dragHandle: [{ type: i0.Input, args: [{ isSignal: true, alias: "dragHandle", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPlaceholder", required: false }] }], listHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "listHeight", required: false }] }], stripedRows: [{ type: i0.Input, args: [{ isSignal: true, alias: "stripedRows", required: false }] }], metaKeySelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "metaKeySelection", required: false }] }], emptyMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyMessage", required: false }] }], reorder: [{ type: i0.Output, args: ["reorder"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CadListItemDirective), { isSignal: true }] }], headerTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CadListHeaderDirective), { isSignal: true }] }] } });
17189
17189
 
17190
17190
  /**
@@ -17383,7 +17383,7 @@ class CadPicklistComponent extends CadValueAccessor {
17383
17383
  </div>
17384
17384
  <ng-container *ngTemplateOutlet="listTpl; context: { side: 'target' }"/>
17385
17385
  @if (showTargetControls()) { <div class="pl-ctrl side" role="group" aria-label="Réordonner la cible">@for (b of ORDER; track b.k) {<button cadButton severity="secondary" size="sm" icon [attr.aria-label]="b.l" [title]="b.l" [disabled]="!sel.target().length" (click)="order('target', b.k)"><cad-icon [name]="b.i" [size]="13" [style.transform]="b.rot ? 'rotate(180deg)' : null"/></button>} </div> }
17386
- `, isInline: true, styles: [":host{display:flex;gap:10px;align-items:stretch;min-width:0;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-disabled){opacity:.6}.pl-box{flex:1 1 0;min-width:0;display:flex;flex-direction:column;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);overflow:hidden}.pl-box:focus-within{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.pl-hd{display:flex;align-items:center;gap:8px;padding:8px 12px;font-weight:600;font-size:12.5px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle)}.pl-hd small{margin-left:auto;font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.pl-filter{display:flex;align-items:center;gap:6px;padding:6px 8px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.pl-filter input{flex:1 1 0;width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;font-size:var(--cad-font-size-sm)}.pl-list{flex:1;overflow-y:auto;padding:4px;outline:none;min-height:120px}.pl-item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:grab;-webkit-user-select:none;user-select:none;background:var(--cad-input-bg)}.pl-item:hover{background:var(--cad-hover)}.pl-item.is-selected{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}.pl-item .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pl-item.cdk-drag-preview{box-shadow:var(--cad-shadow-lg);border:1px solid var(--cad-border);background:var(--cad-overlay);border-radius:6px}.pl-ph{height:32px;border:1px dashed var(--cad-accent);border-radius:6px;background:var(--cad-accent-soft);margin:2px 0}.cdk-drop-list-dragging .pl-item:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.pl-list.cdk-drop-list-receiving{background:var(--cad-accent-soft)}.pl-empty{padding:14px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}.pl-ctrl{display:flex;flex-direction:column;gap:4px;justify-content:center;flex:none}:host(.is-stacked){flex-direction:column}:host(.is-stacked) .pl-ctrl{flex-direction:row;justify-content:center}:host(.is-stacked) .pl-ctrl.mid .r{transform:rotate(90deg)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadButtonComponent, selector: "button[cadButton], a[cadButton]", inputs: ["severity", "variant", "size", "loading", "disabled", "icon", "block", "value", "pressed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17386
+ `, isInline: true, styles: [":host{display:flex;gap:10px;align-items:stretch;min-width:0;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-disabled){opacity:.6}.pl-box{flex:1 1 0;min-width:0;display:flex;flex-direction:column;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);overflow:hidden}.pl-box:focus-within{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.pl-hd{display:flex;align-items:center;gap:8px;padding:8px 12px;font-weight:600;font-size:12.5px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle)}.pl-hd small{margin-left:auto;font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.pl-filter{display:flex;align-items:center;gap:6px;padding:6px 8px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.pl-filter input{flex:1 1 0;width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;font-size:var(--cad-font-size-sm)}.pl-list{flex:1;overflow-y:auto;padding:4px;outline:none;min-height:120px}.pl-item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:grab;-webkit-user-select:none;user-select:none;background:var(--cad-input-bg)}.pl-item:hover{background:var(--cad-hover)}.pl-item.is-selected{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}.pl-item .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pl-item.cdk-drag-preview{box-shadow:var(--cad-shadow-lg);border:1px solid var(--cad-border);background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border-radius:6px}.pl-ph{height:32px;border:1px dashed var(--cad-accent);border-radius:6px;background:var(--cad-accent-soft);margin:2px 0}.cdk-drop-list-dragging .pl-item:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.pl-list.cdk-drop-list-receiving{background:var(--cad-accent-soft)}.pl-empty{padding:14px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}.pl-ctrl{display:flex;flex-direction:column;gap:4px;justify-content:center;flex:none}:host(.is-stacked){flex-direction:column}:host(.is-stacked) .pl-ctrl{flex-direction:row;justify-content:center}:host(.is-stacked) .pl-ctrl.mid .r{transform:rotate(90deg)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }, { kind: "component", type: CadButtonComponent, selector: "button[cadButton], a[cadButton]", inputs: ["severity", "variant", "size", "loading", "disabled", "icon", "block", "value", "pressed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17387
17387
  }
17388
17388
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadPicklistComponent, decorators: [{
17389
17389
  type: Component,
@@ -17414,7 +17414,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
17414
17414
  </div>
17415
17415
  <ng-container *ngTemplateOutlet="listTpl; context: { side: 'target' }"/>
17416
17416
  @if (showTargetControls()) { <div class="pl-ctrl side" role="group" aria-label="Réordonner la cible">@for (b of ORDER; track b.k) {<button cadButton severity="secondary" size="sm" icon [attr.aria-label]="b.l" [title]="b.l" [disabled]="!sel.target().length" (click)="order('target', b.k)"><cad-icon [name]="b.i" [size]="13" [style.transform]="b.rot ? 'rotate(180deg)' : null"/></button>} </div> }
17417
- `, styles: [":host{display:flex;gap:10px;align-items:stretch;min-width:0;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-disabled){opacity:.6}.pl-box{flex:1 1 0;min-width:0;display:flex;flex-direction:column;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);overflow:hidden}.pl-box:focus-within{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.pl-hd{display:flex;align-items:center;gap:8px;padding:8px 12px;font-weight:600;font-size:12.5px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle)}.pl-hd small{margin-left:auto;font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.pl-filter{display:flex;align-items:center;gap:6px;padding:6px 8px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.pl-filter input{flex:1 1 0;width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;font-size:var(--cad-font-size-sm)}.pl-list{flex:1;overflow-y:auto;padding:4px;outline:none;min-height:120px}.pl-item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:grab;-webkit-user-select:none;user-select:none;background:var(--cad-input-bg)}.pl-item:hover{background:var(--cad-hover)}.pl-item.is-selected{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}.pl-item .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pl-item.cdk-drag-preview{box-shadow:var(--cad-shadow-lg);border:1px solid var(--cad-border);background:var(--cad-overlay);border-radius:6px}.pl-ph{height:32px;border:1px dashed var(--cad-accent);border-radius:6px;background:var(--cad-accent-soft);margin:2px 0}.cdk-drop-list-dragging .pl-item:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.pl-list.cdk-drop-list-receiving{background:var(--cad-accent-soft)}.pl-empty{padding:14px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}.pl-ctrl{display:flex;flex-direction:column;gap:4px;justify-content:center;flex:none}:host(.is-stacked){flex-direction:column}:host(.is-stacked) .pl-ctrl{flex-direction:row;justify-content:center}:host(.is-stacked) .pl-ctrl.mid .r{transform:rotate(90deg)}\n"] }]
17417
+ `, styles: [":host{display:flex;gap:10px;align-items:stretch;min-width:0;font-family:var(--cad-font);font-size:var(--cad-font-size);color:var(--cad-fg)}:host(.is-disabled){opacity:.6}.pl-box{flex:1 1 0;min-width:0;display:flex;flex-direction:column;background:var(--cad-input-bg);border:1px solid var(--cad-input-border);border-radius:var(--cad-radius);overflow:hidden}.pl-box:focus-within{border-color:var(--cad-accent);box-shadow:0 0 0 3px var(--cad-ring)}.pl-hd{display:flex;align-items:center;gap:8px;padding:8px 12px;font-weight:600;font-size:12.5px;border-bottom:1px solid var(--cad-border);background:var(--cad-bg-subtle)}.pl-hd small{margin-left:auto;font:500 10.5px var(--cad-font-mono);padding:1px 6px;border-radius:999px;background:var(--cad-elevated);color:var(--cad-fg-secondary)}.pl-filter{display:flex;align-items:center;gap:6px;padding:6px 8px;border-bottom:1px solid var(--cad-border);color:var(--cad-fg-muted)}.pl-filter input{flex:1 1 0;width:0;border:0;outline:0;background:transparent;color:var(--cad-fg);font:inherit;font-size:var(--cad-font-size-sm)}.pl-list{flex:1;overflow-y:auto;padding:4px;outline:none;min-height:120px}.pl-item{display:flex;align-items:center;gap:8px;padding:7px 8px;border-radius:6px;cursor:grab;-webkit-user-select:none;user-select:none;background:var(--cad-input-bg)}.pl-item:hover{background:var(--cad-hover)}.pl-item.is-selected{background:var(--cad-accent-soft);color:var(--cad-accent);font-weight:500}.pl-item .lbl{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pl-item.cdk-drag-preview{box-shadow:var(--cad-shadow-lg);border:1px solid var(--cad-border);background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border-radius:6px}.pl-ph{height:32px;border:1px dashed var(--cad-accent);border-radius:6px;background:var(--cad-accent-soft);margin:2px 0}.cdk-drop-list-dragging .pl-item:not(.cdk-drag-placeholder){transition:transform .2s cubic-bezier(0,0,.2,1)}.pl-list.cdk-drop-list-receiving{background:var(--cad-accent-soft)}.pl-empty{padding:14px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm)}.pl-ctrl{display:flex;flex-direction:column;gap:4px;justify-content:center;flex:none}:host(.is-stacked){flex-direction:column}:host(.is-stacked) .pl-ctrl{flex-direction:row;justify-content:center}:host(.is-stacked) .pl-ctrl.mid .r{transform:rotate(90deg)}\n"] }]
17418
17418
  }], ctorParameters: () => [], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabel", required: false }] }], dataKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataKey", required: false }] }], sourceHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceHeader", required: false }] }], targetHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "targetHeader", required: false }] }], sourceEmpty: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceEmpty", required: false }] }], targetEmpty: [{ type: i0.Input, args: [{ isSignal: true, alias: "targetEmpty", required: false }] }], filter: [{ type: i0.Input, args: [{ isSignal: true, alias: "filter", required: false }] }], filterPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPlaceholder", required: false }] }], showSourceControls: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSourceControls", required: false }] }], showTargetControls: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTargetControls", required: false }] }], listHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "listHeight", required: false }] }], responsive: [{ type: i0.Input, args: [{ isSignal: true, alias: "responsive", required: false }] }], stackAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "stackAt", required: false }] }], metaKeySelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "metaKeySelection", required: false }] }], moveToTarget: [{ type: i0.Output, args: ["moveToTarget"] }], moveToSource: [{ type: i0.Output, args: ["moveToSource"] }], moveAllToTarget: [{ type: i0.Output, args: ["moveAllToTarget"] }], moveAllToSource: [{ type: i0.Output, args: ["moveAllToSource"] }], targetReorder: [{ type: i0.Output, args: ["targetReorder"] }], sourceReorder: [{ type: i0.Output, args: ["sourceReorder"] }], changed: [{ type: i0.Output, args: ["changed"] }], itemTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CadListItemDirective), { isSignal: true }] }] } });
17419
17419
 
17420
17420
  /**
@@ -18096,9 +18096,1453 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
18096
18096
  `, styles: [":host{display:block;font-family:var(--cad-font)}.cad-chart__box{position:relative;width:100%;height:var(--cad-chart-h, 280px)}.cad-chart__box canvas{width:100%!important;height:100%!important}.cad-chart__state{position:absolute;inset:0;display:grid;place-items:center}.cad-chart__table{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}:host(.show-table) .cad-chart__table{position:static;width:100%;height:auto;clip:auto;white-space:normal;margin-top:8px;border-collapse:collapse;font-size:12px}:host(.show-table) .cad-chart__table th,:host(.show-table) .cad-chart__table td{border:1px solid var(--cad-border);padding:4px 8px;text-align:right}:host(.show-table) .cad-chart__table th{background:var(--cad-bg-subtle);text-align:left}\n"] }]
18097
18097
  }], ctorParameters: () => [], propDecorators: { canvas: [{ type: i0.ViewChild, args: ['canvas', { isSignal: true }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], plugins: [{ type: i0.Input, args: [{ isSignal: true, alias: "plugins", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], responsive: [{ type: i0.Input, args: [{ isSignal: true, alias: "responsive", required: false }] }], palette: [{ type: i0.Input, args: [{ isSignal: true, alias: "palette", required: false }] }], themed: [{ type: i0.Input, args: [{ isSignal: true, alias: "themed", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], accessibleTable: [{ type: i0.Input, args: [{ isSignal: true, alias: "accessibleTable", required: false }] }], chartClick: [{ type: i0.Output, args: ["chartClick"] }], chartHover: [{ type: i0.Output, args: ["chartHover"] }], ready: [{ type: i0.Output, args: ["ready"] }], error: [{ type: i0.Output, args: ["error"] }] } });
18098
18098
 
18099
+ /**
18100
+ * Modèle de planification commun aux trois vues (taskboard, scheduler, gantt).
18101
+ *
18102
+ * DOCTRINE — aucun champ n'est obligatoire hors `id`. Chaque vue déclare ses prérequis et
18103
+ * son repli : une tâche qu'une vue ne sait pas placer part dans sa zone « non planifié »,
18104
+ * jamais dans le silence. C'est cette règle, et elle seule, qui rend le document commun.
18105
+ *
18106
+ * Les noms suivent les conventions EXISTANTES plutôt qu'une invention maison :
18107
+ * - RFC 5545 (iCalendar) pour l'événement daté et sa récurrence : rrule, exdates, recurrenceId ;
18108
+ * - MS Project / Primavera P6 pour les liens FS/SS/FF/SF et le décalage (lag).
18109
+ * camelCase partout : c'est la convention du reste de la bibliothèque ET celle de slapi,
18110
+ * ce qui donne une correspondance 1 pour 1 entre le JSON et les colonnes.
18111
+ */
18112
+
18113
+ /**
18114
+ * Durées en unités OUVRÉES : '3d', '4h', '90m', '2w', '1.5d', '-2d'.
18115
+ *
18116
+ * Une durée n'a de sens qu'appuyée sur un calendrier : 'd' vaut une JOURNÉE OUVRÉE, dont la
18117
+ * longueur dépend des horaires déclarés (8 h ouvrées ou 24 h). La conversion en minutes se
18118
+ * fait donc via `CadWorkCalendar.dailyMinutes`, jamais par une constante.
18119
+ *
18120
+ * 'w' vaut une semaine OUVRÉE = nombre de jours ouvrés déclarés (5 par défaut), pas 7 jours.
18121
+ */
18122
+ const RE = /^\s*([+-]?\d+(?:[.,]\d+)?)\s*(m|min|h|d|j|w|s)\s*$/i;
18123
+ /**
18124
+ * Analyse une durée. Accepte les alias français ('j' = jour, 's' = semaine) et la virgule
18125
+ * décimale. Rend null si la forme est invalide — l'appelant en fait une anomalie, pas un plantage.
18126
+ */
18127
+ function cadParseDuration(input) {
18128
+ if (input == null || input === '')
18129
+ return null;
18130
+ if (typeof input === 'number')
18131
+ return Number.isFinite(input) ? { value: input, unit: 'd' } : null;
18132
+ const m = RE.exec(String(input));
18133
+ if (!m)
18134
+ return null;
18135
+ const value = Number(m[1].replace(',', '.'));
18136
+ if (!Number.isFinite(value))
18137
+ return null;
18138
+ const u = m[2].toLowerCase();
18139
+ const unit = u === 'min' ? 'm' : u === 'j' ? 'd' : u === 's' ? 'w' : u;
18140
+ return { value, unit };
18141
+ }
18142
+ /**
18143
+ * Convertit une durée en MINUTES OUVRÉES.
18144
+ * `dailyMinutes` = minutes ouvrées d'une journée type, `weekDays` = jours ouvrés par semaine.
18145
+ */
18146
+ function cadDurationToMinutes(d, dailyMinutes, weekDays) {
18147
+ if (!d)
18148
+ return 0;
18149
+ switch (d.unit) {
18150
+ case 'm': return d.value;
18151
+ case 'h': return d.value * 60;
18152
+ case 'd': return d.value * dailyMinutes;
18153
+ case 'w': return d.value * dailyMinutes * Math.max(1, weekDays);
18154
+ }
18155
+ }
18156
+ /** Rend une durée sous sa forme la plus lisible ('3d', '4h', '90m') depuis des minutes ouvrées. */
18157
+ function cadFormatDuration(minutes, dailyMinutes) {
18158
+ const abs = Math.abs(minutes);
18159
+ const sign = minutes < 0 ? '-' : '';
18160
+ if (dailyMinutes > 0 && abs % dailyMinutes === 0)
18161
+ return sign + abs / dailyMinutes + 'd';
18162
+ if (abs % 60 === 0)
18163
+ return sign + abs / 60 + 'h';
18164
+ return sign + abs + 'm';
18165
+ }
18166
+
18167
+ /**
18168
+ * Rang FRACTIONNAIRE : une chaîne ordonnable dans laquelle on peut toujours insérer.
18169
+ *
18170
+ * POURQUOI — déplacer une carte entre deux autres ne doit pas réécrire toute la colonne en
18171
+ * base. À plusieurs utilisateurs, une renumérotation entière garantit les collisions et coûte
18172
+ * un UPDATE par carte. Ici, insérer entre deux voisins produit une nouvelle chaîne comprise
18173
+ * entre les leurs : UN SEUL enregistrement change.
18174
+ *
18175
+ * C'est un FORMAT STOCKÉ, pas une astuce d'affichage — d'où sa place au socle, avant toute vue.
18176
+ *
18177
+ * INVARIANT — un rang produit ici ne se termine JAMAIS par le caractère plancher ('0'), sans
18178
+ * quoi il existerait des couples sans intervalle (rien ne tient entre '0' et '00'). Tous les
18179
+ * rangs manipulés doivent donc venir de ces fonctions.
18180
+ */
18181
+ const A = '0123456789abcdefghijklmnopqrstuvwxyz';
18182
+ const RADIX = A.length;
18183
+ const CH = (v) => A[Math.max(0, Math.min(RADIX - 1, v))];
18184
+ const IDX = (c) => {
18185
+ const i = A.indexOf(c);
18186
+ return i < 0 ? 0 : i;
18187
+ };
18188
+ /** Vrai si la chaîne est un rang exploitable (alphabet connu, pas de plancher final). */
18189
+ function cadIsRank(s) {
18190
+ return typeof s === 'string' && s.length > 0 && !s.endsWith(A[0]) && [...s].every(c => A.includes(c));
18191
+ }
18192
+ /**
18193
+ * Rang strictement compris entre `prev` et `next`.
18194
+ * `prev` absent = insertion en tête, `next` absent = insertion en queue, les deux = première carte.
18195
+ */
18196
+ function cadRankBetween(prev, next) {
18197
+ const a = cadIsRank(prev) ? prev : '';
18198
+ const b = cadIsRank(next) ? next : '';
18199
+ if (a && b && a >= b)
18200
+ throw new Error('cadRankBetween : ' + a + ' n\'est pas avant ' + b);
18201
+ let out = '';
18202
+ for (let i = 0; i < 64; i++) {
18203
+ const va = i < a.length ? IDX(a[i]) : 0; // a épuisé -> plancher
18204
+ const vb = i < b.length ? IDX(b[i]) : RADIX; // b épuisé -> plafond ouvert
18205
+ if (va + 1 < vb)
18206
+ return out + CH((va + vb) >> 1); // de la place : on coupe au milieu
18207
+ out += i < a.length ? a[i] : A[0]; // pas de place : on descend d'un cran
18208
+ }
18209
+ /* Inatteignable en pratique : 64 caractères = plus d'insertions successives au même point
18210
+ que ce qu'une session humaine produit. Le repli reste ordonné. */
18211
+ return out + CH(RADIX >> 1);
18212
+ }
18213
+ /** Rang d'une carte posée AVANT toutes les autres. */
18214
+ const cadRankFirst = (first) => cadRankBetween(null, first);
18215
+ /** Rang d'une carte posée APRÈS toutes les autres. */
18216
+ const cadRankLast = (last) => cadRankBetween(last, null);
18217
+ /**
18218
+ * `n` rangs croissants bien répartis — pour initialiser une colonne ou rattraper des données
18219
+ * qui n'en portaient pas. La répartition laisse de la place entre chaque voisin.
18220
+ */
18221
+ function cadRankSequence(n) {
18222
+ const count = Math.max(0, Math.floor(n));
18223
+ if (!count)
18224
+ return [];
18225
+ const span = RADIX * RADIX;
18226
+ const out = [];
18227
+ for (let i = 0; i < count; i++) {
18228
+ let v = Math.floor(((i + 1) * span) / (count + 1));
18229
+ if (v % RADIX === 0)
18230
+ v += 1; // jamais de plancher final
18231
+ out.push(CH(Math.floor(v / RADIX)) + CH(v % RADIX));
18232
+ }
18233
+ return out;
18234
+ }
18235
+ /** Comparateur de rangs, utilisable tel quel dans un `sort`. */
18236
+ const cadCompareRank = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
18237
+
18238
+ /**
18239
+ * Calendrier ouvré — le référentiel temps partagé par le scheduler et le gantt.
18240
+ *
18241
+ * Tout se calcule en HEURE MURALE locale (pas en millisecondes écoulées) : « 3 jours ouvrés »
18242
+ * veut dire trois fois les horaires déclarés, que la période traverse ou non un changement
18243
+ * d'heure. C'est la seule sémantique qui corresponde à ce qu'un planificateur attend.
18244
+ *
18245
+ * Les exceptions peuvent viser une ressource précise : un congé n'est pas un jour férié.
18246
+ * La recherche est donc toujours « exception de CETTE ressource, sinon exception globale ».
18247
+ */
18248
+ /** Au-delà, on considère le calendrier impraticable plutôt que de boucler (10 ans de jours). */
18249
+ const MAX_SCAN = 3660;
18250
+ const DAY = 1440;
18251
+ const dayStart = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
18252
+ const minutesOf = (d) => d.getHours() * 60 + d.getMinutes();
18253
+ const atMinutes = (day, min) => new Date(day.getFullYear(), day.getMonth(), day.getDate(), Math.floor(min / 60), Math.round(min % 60));
18254
+ /** 'HH:mm' -> minutes depuis minuit. '24:00' vaut la fin de journée. NaN si illisible. */
18255
+ function parseClock(v) {
18256
+ const m = /^\s*(\d{1,2}):(\d{2})\s*$/.exec(String(v ?? ''));
18257
+ if (!m)
18258
+ return NaN;
18259
+ const min = +m[1] * 60 + +m[2];
18260
+ return min >= 0 && min <= DAY ? min : NaN;
18261
+ }
18262
+ /** Nettoie une liste d'horaires : bornes valides, tri, fusion des recouvrements. */
18263
+ function normalizeHours(hours) {
18264
+ const raw = [];
18265
+ for (const h of hours ?? []) {
18266
+ const a = parseClock(h?.from);
18267
+ const b = parseClock(h?.to);
18268
+ if (Number.isNaN(a) || Number.isNaN(b) || b <= a)
18269
+ continue;
18270
+ raw.push([a, b]);
18271
+ }
18272
+ raw.sort((x, y) => x[0] - y[0]);
18273
+ const out = [];
18274
+ for (const [a, b] of raw) {
18275
+ const last = out[out.length - 1];
18276
+ if (last && a <= last[1])
18277
+ last[1] = Math.max(last[1], b);
18278
+ else
18279
+ out.push([a, b]);
18280
+ }
18281
+ return out;
18282
+ }
18283
+ const FULL_DAY = [[0, DAY]];
18284
+ /**
18285
+ * Jours fériés français d'une année, au format 'yyyy-MM-dd' — les huit dates fixes plus les
18286
+ * trois mobiles adossées à Pâques. Évite d'avoir à saisir la liste à la main chaque année.
18287
+ */
18288
+ function cadFrenchHolidays(year) {
18289
+ // Pâques, algorithme grégorien anonyme.
18290
+ const a = year % 19;
18291
+ const b = Math.floor(year / 100);
18292
+ const c = year % 100;
18293
+ const d = Math.floor(b / 4);
18294
+ const e = b % 4;
18295
+ const f = Math.floor((b + 8) / 25);
18296
+ const g = Math.floor((b - f + 1) / 3);
18297
+ const h = (19 * a + b - d - g + 15) % 30;
18298
+ const i = Math.floor(c / 4);
18299
+ const k = c % 4;
18300
+ const l = (32 + 2 * e + 2 * i - h - k) % 7;
18301
+ const m = Math.floor((a + 11 * h + 22 * l) / 451);
18302
+ const month = Math.floor((h + l - 7 * m + 114) / 31);
18303
+ const day = ((h + l - 7 * m + 114) % 31) + 1;
18304
+ const easter = new Date(year, month - 1, day);
18305
+ const fixed = ['01-01', '05-01', '05-08', '07-14', '08-15', '11-01', '11-11', '12-25'];
18306
+ const mobile = [1, 39, 50].map(n => isoOf(addDays(easter, n)));
18307
+ return [...fixed.map(s => year + '-' + s), ...mobile].sort();
18308
+ }
18309
+ /**
18310
+ * Calendrier ouvré immuable. Toute la logique est pure : elle se teste sans DOM et sans horloge.
18311
+ *
18312
+ * ```ts
18313
+ * const cal = new CadWorkCalendar({ workdays: [1,2,3,4,5], holidays: cadFrenchHolidays(2026) });
18314
+ * cal.addMinutes(new Date(2026, 7, 21, 16, 0), 4 * 60); // vendredi 16 h + 4 h ouvrées -> lundi
18315
+ * ```
18316
+ */
18317
+ class CadWorkCalendar {
18318
+ /** Jours ouvrés, 0 = dimanche. */
18319
+ workdays;
18320
+ /** Minutes ouvrées d'une journée type — sert d'étalon à l'unité 'd'. */
18321
+ dailyMinutes;
18322
+ /** Jours ouvrés par semaine — sert d'étalon à l'unité 'w'. */
18323
+ weekDays;
18324
+ base;
18325
+ holidays;
18326
+ /** Clé 'yyyy-MM-dd' pour une exception globale, 'yyyy-MM-dd|ressource' pour une exception ciblée. */
18327
+ exceptions;
18328
+ constructor(spec) {
18329
+ /* Un défaut ne s'applique qu'à ce qui n'a PAS été déclaré. Déclarer `workdays: []`, c'est
18330
+ dire que rien n'est ouvert : le remplacer par lundi-vendredi reviendrait à contredire
18331
+ l'appelant en silence, et rendrait `empty` inatteignable. */
18332
+ this.workdays = new Set(spec?.workdays === undefined
18333
+ ? [1, 2, 3, 4, 5]
18334
+ : spec.workdays.filter(n => Number.isInteger(n) && n >= 0 && n <= 6));
18335
+ this.base = spec?.hours === undefined ? FULL_DAY : normalizeHours(spec.hours);
18336
+ this.dailyMinutes = this.base.reduce((s, [a, b]) => s + (b - a), 0);
18337
+ this.weekDays = this.workdays.size;
18338
+ this.holidays = new Set((spec?.holidays ?? []).filter(s => typeof s === 'string'));
18339
+ const ex = new Map();
18340
+ for (const e of spec?.exceptions ?? []) {
18341
+ if (!e?.date)
18342
+ continue;
18343
+ const key = e.resource ? e.date + '|' + e.resource : e.date;
18344
+ ex.set(key, e.off ? null : normalizeHours(e.hours ?? []));
18345
+ }
18346
+ this.exceptions = ex;
18347
+ }
18348
+ /** Vrai si aucun temps ouvré n'est déclarable — le normaliseur en fait une anomalie. */
18349
+ get empty() {
18350
+ return this.workdays.size === 0 || this.dailyMinutes === 0;
18351
+ }
18352
+ /** Intervalles ouvrés d'une journée, en minutes depuis minuit. Vide = jour chômé. */
18353
+ intervals(date, resource) {
18354
+ if (!isValidDate(date))
18355
+ return [];
18356
+ const iso = isoOf(date);
18357
+ if (resource) {
18358
+ const scoped = this.exceptions.get(iso + '|' + resource);
18359
+ if (scoped !== undefined)
18360
+ return scoped ?? [];
18361
+ // une exception ciblée peut aussi OUVRIR un jour normalement chômé
18362
+ }
18363
+ const global = this.exceptions.get(iso);
18364
+ if (global !== undefined)
18365
+ return global ?? [];
18366
+ if (this.holidays.has(iso))
18367
+ return [];
18368
+ return this.workdays.has(date.getDay()) ? this.base : [];
18369
+ }
18370
+ /** Vrai si la journée comporte au moins un intervalle ouvré. */
18371
+ isWorkday(date, resource) {
18372
+ return this.intervals(date, resource).length > 0;
18373
+ }
18374
+ /** Vrai si l'instant tombe DANS un intervalle ouvré (borne de fin exclue). */
18375
+ isWorkingTime(date, resource) {
18376
+ if (!isValidDate(date))
18377
+ return false;
18378
+ const m = minutesOf(date);
18379
+ return this.intervals(date, resource).some(([a, b]) => m >= a && m < b);
18380
+ }
18381
+ /** Premier instant ouvré à partir de `date` (`date` lui-même s'il l'est). null si introuvable. */
18382
+ nextWorkingStart(date, resource) {
18383
+ const c = this.scanForward(this.cursorOf(date), resource);
18384
+ return c ? atMinutes(c.day, c.min) : null;
18385
+ }
18386
+ /** Dernier instant ouvré jusqu'à `date` (exclu). null si introuvable. */
18387
+ prevWorkingEnd(date, resource) {
18388
+ const c = this.scanBackward(this.cursorOf(date), resource);
18389
+ return c ? atMinutes(c.day, c.min) : null;
18390
+ }
18391
+ /**
18392
+ * Avance (ou recule, si négatif) de `minutes` OUVRÉES depuis `from`.
18393
+ * Rend null si le calendrier ne permet pas d'y arriver (aucun jour ouvré déclaré).
18394
+ */
18395
+ addMinutes(from, minutes, resource) {
18396
+ if (!isValidDate(from) || !Number.isFinite(minutes))
18397
+ return null;
18398
+ if (minutes === 0)
18399
+ return this.nextWorkingStart(from, resource);
18400
+ return minutes > 0
18401
+ ? this.walkForward(from, minutes, resource)
18402
+ : this.walkBackward(from, -minutes, resource);
18403
+ }
18404
+ /** Minutes OUVRÉES entre deux instants. Négatif si `b` précède `a`. */
18405
+ minutesBetween(a, b, resource) {
18406
+ if (!isValidDate(a) || !isValidDate(b))
18407
+ return 0;
18408
+ if (b.getTime() < a.getTime())
18409
+ return -this.minutesBetween(b, a, resource);
18410
+ const end = this.cursorOf(b);
18411
+ let day = dayStart(a);
18412
+ let from = minutesOf(a);
18413
+ let total = 0;
18414
+ for (let guard = 0; guard < MAX_SCAN; guard++) {
18415
+ const last = day.getTime() >= end.day.getTime();
18416
+ const to = last ? end.min : DAY;
18417
+ for (const [s, e] of this.intervals(day, resource)) {
18418
+ const lo = Math.max(s, from);
18419
+ const hi = Math.min(e, to);
18420
+ if (hi > lo)
18421
+ total += hi - lo;
18422
+ }
18423
+ if (last)
18424
+ return total;
18425
+ day = addDays(day, 1);
18426
+ from = 0;
18427
+ }
18428
+ return total;
18429
+ }
18430
+ /* ---------------- interne : un curseur (jour, minute) évite l'ambiguïté de 24:00 -------- */
18431
+ cursorOf(d) {
18432
+ return { day: dayStart(d), min: minutesOf(d) };
18433
+ }
18434
+ scanForward(c, resource) {
18435
+ if (this.empty)
18436
+ return null;
18437
+ let { day, min } = c;
18438
+ for (let i = 0; i < MAX_SCAN; i++) {
18439
+ for (const [s, e] of this.intervals(day, resource)) {
18440
+ if (e > min)
18441
+ return { day, min: Math.max(s, min) };
18442
+ }
18443
+ day = addDays(day, 1);
18444
+ min = 0;
18445
+ }
18446
+ return null;
18447
+ }
18448
+ scanBackward(c, resource) {
18449
+ if (this.empty)
18450
+ return null;
18451
+ let { day, min } = c;
18452
+ for (let i = 0; i < MAX_SCAN; i++) {
18453
+ const ivs = this.intervals(day, resource);
18454
+ for (let k = ivs.length - 1; k >= 0; k--) {
18455
+ const [s, e] = ivs[k];
18456
+ if (s < min)
18457
+ return { day, min: Math.min(e, min) };
18458
+ }
18459
+ day = addDays(day, -1);
18460
+ min = DAY;
18461
+ }
18462
+ return null;
18463
+ }
18464
+ walkForward(from, minutes, resource) {
18465
+ let c = this.scanForward(this.cursorOf(from), resource);
18466
+ if (!c)
18467
+ return null;
18468
+ let left = minutes;
18469
+ for (let guard = 0; guard < MAX_SCAN; guard++) {
18470
+ for (const [s, e] of this.intervals(c.day, resource)) {
18471
+ if (e <= c.min)
18472
+ continue;
18473
+ const start = Math.max(s, c.min);
18474
+ const avail = e - start;
18475
+ if (avail >= left)
18476
+ return atMinutes(c.day, start + left);
18477
+ left -= avail;
18478
+ }
18479
+ c = { day: addDays(c.day, 1), min: 0 };
18480
+ }
18481
+ return null;
18482
+ }
18483
+ walkBackward(from, minutes, resource) {
18484
+ let c = this.scanBackward(this.cursorOf(from), resource);
18485
+ if (!c)
18486
+ return null;
18487
+ let left = minutes;
18488
+ for (let guard = 0; guard < MAX_SCAN; guard++) {
18489
+ const ivs = this.intervals(c.day, resource);
18490
+ for (let k = ivs.length - 1; k >= 0; k--) {
18491
+ const [s, e] = ivs[k];
18492
+ if (s >= c.min)
18493
+ continue;
18494
+ const end = Math.min(e, c.min);
18495
+ const avail = end - s;
18496
+ if (avail >= left)
18497
+ return atMinutes(c.day, end - left);
18498
+ left -= avail;
18499
+ }
18500
+ c = { day: addDays(c.day, -1), min: DAY };
18501
+ }
18502
+ return null;
18503
+ }
18504
+ }
18505
+
18506
+ /**
18507
+ * Axe de temps : graduations, et conversion pixel <-> date.
18508
+ *
18509
+ * LE POINT CRITIQUE — l'axe n'est PAS une division. Écrire `x = (t - t0) / msParPixel` est
18510
+ * faux dès qu'on dézoome : un jour ne fait pas toujours 24 h (changement d'heure), un mois n'a
18511
+ * pas de largeur fixe, une année pas davantage. Février et mars occuperaient alors des largeurs
18512
+ * différentes alors que l'oeil attend des colonnes égales, et le défaut ne se voit qu'en mars
18513
+ * et en octobre — donc jamais pendant le développement.
18514
+ *
18515
+ * Ici, l'axe est une LISTE DE GRADUATIONS de largeur égale, et la conversion est une recherche
18516
+ * dans cette liste suivie d'une interpolation À L'INTÉRIEUR de la graduation trouvée. Chaque
18517
+ * graduation porte sa vraie durée ; l'arithmétique linéaire ne s'applique que localement.
18518
+ *
18519
+ * Corollaire de rendu : la grille de fond n'a pas à exister en DOM. Des graduations de largeur
18520
+ * égale se peignent en `repeating-linear-gradient`, ce qui évite de virtualiser 1 100 colonnes
18521
+ * pour trois ans au jour. Seuls l'en-tête visible et les barres sont rendus.
18522
+ */
18523
+ /** Échelle du bandeau supérieur d'un en-tête à deux étages. */
18524
+ const PARENT = {
18525
+ hour: 'day',
18526
+ day: 'month',
18527
+ week: 'month',
18528
+ month: 'year',
18529
+ quarter: 'year',
18530
+ year: null,
18531
+ };
18532
+ const MAX_TICKS = 20000;
18533
+ const startOfWeek = (d, firstDay) => {
18534
+ const s = startOfDay(d);
18535
+ const delta = (s.getDay() - firstDay + 7) % 7;
18536
+ return addDays(s, -delta);
18537
+ };
18538
+ const startOfQuarter = (d) => new Date(d.getFullYear(), Math.floor(d.getMonth() / 3) * 3, 1);
18539
+ const startOfHour = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours());
18540
+ /** Aligne un instant sur le début de sa graduation. */
18541
+ function cadScaleStart(date, scale, firstDay = 1) {
18542
+ switch (scale) {
18543
+ case 'hour': return startOfHour(date);
18544
+ case 'day': return startOfDay(date);
18545
+ case 'week': return startOfWeek(date, firstDay);
18546
+ case 'month': return startOfMonth(date);
18547
+ case 'quarter': return startOfQuarter(date);
18548
+ case 'year': return new Date(date.getFullYear(), 0, 1);
18549
+ }
18550
+ }
18551
+ /**
18552
+ * Début de la graduation SUIVANTE. Construit en heure locale, donc juste aux changements d'heure.
18553
+ * L'entrée est alignée au préalable : `cadScaleNext(31 janvier, 'month')` rend le 1er février,
18554
+ * jamais le 28 — sans quoi une date de milieu de mois produirait une graduation décalée.
18555
+ */
18556
+ function cadScaleNext(date, scale, firstDay = 1) {
18557
+ const start = cadScaleStart(date, scale, firstDay);
18558
+ switch (scale) {
18559
+ case 'hour': return new Date(start.getFullYear(), start.getMonth(), start.getDate(), start.getHours() + 1);
18560
+ case 'day': return addDays(start, 1);
18561
+ case 'week': return addDays(start, 7);
18562
+ case 'month': return addMonths(start, 1);
18563
+ case 'quarter': return addMonths(start, 3);
18564
+ case 'year': return addYears(start, 1);
18565
+ }
18566
+ }
18567
+ const intl = (locale, opts) => new Intl.DateTimeFormat(locale, opts);
18568
+ function defaultLabel(d, scale, locale) {
18569
+ switch (scale) {
18570
+ case 'hour': return intl(locale, { hour: '2-digit', minute: '2-digit' }).format(d);
18571
+ case 'day': return String(d.getDate());
18572
+ case 'week': return 'S' + isoWeek(d);
18573
+ case 'month': return intl(locale, { month: 'short' }).format(d);
18574
+ case 'quarter': return 'T' + (Math.floor(d.getMonth() / 3) + 1);
18575
+ case 'year': return String(d.getFullYear());
18576
+ }
18577
+ }
18578
+ /** Libellé du bandeau supérieur — plus explicite, puisqu'il porte le contexte. */
18579
+ function bandLabel(d, scale, locale) {
18580
+ switch (scale) {
18581
+ case 'day': return intl(locale, { weekday: 'short', day: 'numeric', month: 'long' }).format(d);
18582
+ case 'month': return intl(locale, { month: 'long', year: 'numeric' }).format(d);
18583
+ case 'year': return String(d.getFullYear());
18584
+ default: return defaultLabel(d, scale, locale);
18585
+ }
18586
+ }
18587
+ /** Une graduation est « majeure » quand elle ouvre l'unité supérieure. */
18588
+ function isMajor(d, scale, firstDay) {
18589
+ switch (scale) {
18590
+ case 'hour': return d.getHours() === 0;
18591
+ case 'day': return d.getDate() === 1;
18592
+ case 'week': return d.getDate() <= 7;
18593
+ case 'month': return d.getMonth() === 0;
18594
+ case 'quarter': return d.getMonth() === 0;
18595
+ case 'year': return true;
18596
+ }
18597
+ }
18598
+ /**
18599
+ * Graduations couvrant [from, to], alignées sur l'échelle.
18600
+ * La dernière graduation dépasse `to` si nécessaire : un axe ne coupe jamais une unité en deux.
18601
+ */
18602
+ function cadPlanTicks(from, to, scale, options = {}) {
18603
+ if (!isValidDate(from) || !isValidDate(to) || to.getTime() < from.getTime())
18604
+ return [];
18605
+ const locale = options.locale ?? 'fr-FR';
18606
+ const firstDay = options.firstDay ?? 1;
18607
+ const label = options.label ?? defaultLabel;
18608
+ const cal = options.calendar ?? null;
18609
+ const today = options.today === null ? null : (options.today ?? new Date());
18610
+ const max = Math.max(1, options.max ?? MAX_TICKS);
18611
+ const limit = to.getTime();
18612
+ const now = today ? today.getTime() : NaN;
18613
+ const out = [];
18614
+ let start = cadScaleStart(from, scale, firstDay);
18615
+ for (let i = 0; i < max; i++) {
18616
+ const end = cadScaleNext(start, scale, firstDay);
18617
+ out.push({
18618
+ start,
18619
+ end,
18620
+ label: label(start, scale, locale),
18621
+ major: isMajor(start, scale, firstDay),
18622
+ off: cal
18623
+ ? scale === 'hour'
18624
+ ? !cal.isWorkingTime(start)
18625
+ : scale === 'day'
18626
+ ? !cal.isWorkday(start)
18627
+ : false
18628
+ : false,
18629
+ today: today ? now >= start.getTime() && now < end.getTime() : false,
18630
+ });
18631
+ if (end.getTime() > limit)
18632
+ break;
18633
+ start = end;
18634
+ }
18635
+ return out;
18636
+ }
18637
+ function cadPlanHeader(from, to, scale, options = {}) {
18638
+ const lower = cadPlanTicks(from, to, scale, options);
18639
+ const parent = PARENT[scale];
18640
+ if (!parent || !lower.length)
18641
+ return { upper: [], lower };
18642
+ const upper = cadPlanTicks(lower[0].start, lower[lower.length - 1].end, parent, {
18643
+ ...options,
18644
+ calendar: null,
18645
+ label: options.label ?? bandLabel,
18646
+ });
18647
+ return { upper, lower };
18648
+ }
18649
+ /**
18650
+ * Conversion pixel <-> date sur une liste de graduations de largeur égale.
18651
+ *
18652
+ * Hors de l'axe, la position est EXTRAPOLÉE sur la durée de la graduation de bord plutôt que
18653
+ * rabattue sur la borne : une barre qui commence avant la fenêtre garde une position cohérente,
18654
+ * et l'appelant décide seul de la découper ou de la masquer.
18655
+ */
18656
+ class CadTimeAxis {
18657
+ ticks;
18658
+ unitWidth;
18659
+ constructor(ticks,
18660
+ /** Largeur d'une graduation, en pixels. */
18661
+ unitWidth) {
18662
+ this.ticks = ticks;
18663
+ this.unitWidth = unitWidth;
18664
+ }
18665
+ get width() { return this.ticks.length * this.unitWidth; }
18666
+ get start() { return this.ticks.length ? this.ticks[0].start : null; }
18667
+ get end() { return this.ticks.length ? this.ticks[this.ticks.length - 1].end : null; }
18668
+ /** Indice de la graduation contenant `t` (millisecondes), par recherche binaire. */
18669
+ indexOf(t) {
18670
+ let lo = 0;
18671
+ let hi = this.ticks.length - 1;
18672
+ while (lo < hi) {
18673
+ const mid = (lo + hi + 1) >> 1;
18674
+ if (this.ticks[mid].start.getTime() <= t)
18675
+ lo = mid;
18676
+ else
18677
+ hi = mid - 1;
18678
+ }
18679
+ return lo;
18680
+ }
18681
+ /** Abscisse d'une date, en pixels depuis le début de l'axe. */
18682
+ xOf(date) {
18683
+ const n = this.ticks.length;
18684
+ if (!n || !isValidDate(date))
18685
+ return 0;
18686
+ const t = date.getTime();
18687
+ const first = this.ticks[0];
18688
+ const last = this.ticks[n - 1];
18689
+ if (t < first.start.getTime()) {
18690
+ const len = first.end.getTime() - first.start.getTime();
18691
+ return len ? ((t - first.start.getTime()) / len) * this.unitWidth : 0;
18692
+ }
18693
+ if (t >= last.end.getTime()) {
18694
+ const len = last.end.getTime() - last.start.getTime();
18695
+ return this.width + (len ? ((t - last.end.getTime()) / len) * this.unitWidth : 0);
18696
+ }
18697
+ const i = this.indexOf(t);
18698
+ const tk = this.ticks[i];
18699
+ const len = tk.end.getTime() - tk.start.getTime();
18700
+ return (i + (len ? (t - tk.start.getTime()) / len : 0)) * this.unitWidth;
18701
+ }
18702
+ /** Date à une abscisse donnée. */
18703
+ dateAt(x) {
18704
+ const n = this.ticks.length;
18705
+ if (!n || !Number.isFinite(x) || this.unitWidth <= 0)
18706
+ return null;
18707
+ const u = x / this.unitWidth;
18708
+ const i = Math.floor(u);
18709
+ if (i < 0) {
18710
+ const first = this.ticks[0];
18711
+ const len = first.end.getTime() - first.start.getTime();
18712
+ return new Date(first.start.getTime() + u * len);
18713
+ }
18714
+ if (i >= n) {
18715
+ const last = this.ticks[n - 1];
18716
+ const len = last.end.getTime() - last.start.getTime();
18717
+ return new Date(last.end.getTime() + (u - n) * len);
18718
+ }
18719
+ const tk = this.ticks[i];
18720
+ const len = tk.end.getTime() - tk.start.getTime();
18721
+ return new Date(tk.start.getTime() + (u - i) * len);
18722
+ }
18723
+ /** Position et largeur d'une barre. La largeur ne descend jamais sous zéro. */
18724
+ spanOf(start, end) {
18725
+ const x = this.xOf(start);
18726
+ return { x, width: Math.max(0, this.xOf(end) - x) };
18727
+ }
18728
+ }
18729
+
18730
+ /**
18731
+ * Normalisation du document de planification : ce que les trois vues consomment réellement.
18732
+ *
18733
+ * RÈGLE FONDATRICE — hors `id`, aucun champ n'est obligatoire. Une tâche sans dates reste une
18734
+ * tâche : le taskboard la montre, le gantt et le scheduler la rangent dans leur zone « non
18735
+ * planifié ». Rien n'est jamais écarté en silence ; tout écart devient une entrée de `issues`
18736
+ * portant un code stable, que l'appelant affiche ou ignore, mais qu'il peut toujours lire.
18737
+ *
18738
+ * Le normaliseur ne DÉCIDE de rien qu'il ne puisse justifier : il ne replanifie pas, ne
18739
+ * réordonne pas les dates, ne corrige pas les chevauchements. Il résout, indexe et signale.
18740
+ */
18741
+ const LINK_TYPES = ['FS', 'SS', 'FF', 'SF'];
18742
+ const clamp01 = (v) => {
18743
+ const n = typeof v === 'number' ? v : Number(v);
18744
+ return Number.isFinite(n) ? Math.max(0, Math.min(1, n)) : 0;
18745
+ };
18746
+ /**
18747
+ * Résout un document brut : dates coercées, durées converties par le calendrier, hiérarchie
18748
+ * établie, rangs complétés, liens validés.
18749
+ */
18750
+ function cadNormalizePlan(plan, options = {}) {
18751
+ const issues = [];
18752
+ const add = (level, code, message, ref) => {
18753
+ issues.push({ level, code, message, ref });
18754
+ };
18755
+ const calendar = new CadWorkCalendar(plan?.calendar);
18756
+ if (calendar.empty)
18757
+ add('error', 'empty-calendar', 'Aucun temps ouvré déclaré : les durées ne peuvent pas être converties.');
18758
+ const resources = (plan?.resources ?? []).filter(r => r && typeof r.id === 'string');
18759
+ const resourceIds = new Set(resources.map(r => r.id));
18760
+ const buckets = [...(plan?.buckets ?? [])]
18761
+ .filter(b => b && typeof b.id === 'string')
18762
+ .map((b, i) => ({ ...b, order: b.order ?? i }))
18763
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
18764
+ const bucketIds = new Set(buckets.map(b => b.id));
18765
+ /* ---- 1. index des tâches, doublons écartés ---- */
18766
+ const raw = new Map();
18767
+ for (const t of plan?.tasks ?? []) {
18768
+ if (!t || typeof t.id !== 'string' || !t.id)
18769
+ continue;
18770
+ if (raw.has(t.id)) {
18771
+ add('error', 'duplicate-task', 'Identifiant en double : la première occurrence est retenue.', t.id);
18772
+ continue;
18773
+ }
18774
+ raw.set(t.id, t);
18775
+ }
18776
+ /* ---- 2. tâches résolues, hors hiérarchie et hors rollup ---- */
18777
+ const tasks = new Map();
18778
+ for (const [id, t] of raw) {
18779
+ let start = toDate(t.start ?? null);
18780
+ let end = toDate(t.end ?? null);
18781
+ const milestone = !!t.milestone;
18782
+ if (t.start != null && t.start !== '' && !start)
18783
+ add('warning', 'bad-date', 'Date de début illisible.', id);
18784
+ if (t.end != null && t.end !== '' && !end)
18785
+ add('warning', 'bad-date', 'Date de fin illisible.', id);
18786
+ if (milestone) {
18787
+ end = start;
18788
+ }
18789
+ else if (t.duration) {
18790
+ const d = cadParseDuration(t.duration);
18791
+ if (!d)
18792
+ add('warning', 'bad-duration', 'Durée illisible : ' + t.duration, id);
18793
+ else {
18794
+ const minutes = cadDurationToMinutes(d, calendar.dailyMinutes, calendar.weekDays);
18795
+ if (start && !end)
18796
+ end = calendar.addMinutes(start, minutes);
18797
+ else if (!start && end)
18798
+ start = calendar.addMinutes(end, -minutes);
18799
+ }
18800
+ }
18801
+ if (start && end && end.getTime() < start.getTime()) {
18802
+ add('warning', 'end-before-start', 'La fin précède le début : la fin est ramenée au début.', id);
18803
+ end = start;
18804
+ }
18805
+ const assignments = (t.assignments ?? [])
18806
+ .filter(a => a && typeof a.resource === 'string')
18807
+ .map(a => {
18808
+ if (!resourceIds.has(a.resource))
18809
+ add('warning', 'unknown-resource', 'Ressource inconnue : ' + a.resource, id);
18810
+ return { resource: a.resource, units: Number.isFinite(a.units) ? a.units : 1 };
18811
+ });
18812
+ if (t.bucket && !bucketIds.has(t.bucket))
18813
+ add('warning', 'unknown-bucket', 'Colonne inconnue : ' + t.bucket, id);
18814
+ tasks.set(id, {
18815
+ id,
18816
+ label: t.label ?? id,
18817
+ parent: null,
18818
+ start,
18819
+ end,
18820
+ milestone,
18821
+ bucket: t.bucket ?? null,
18822
+ rank: cadIsRank(t.rank) ? t.rank : '',
18823
+ assignments,
18824
+ progress: clamp01(t.progress),
18825
+ tags: [...(t.tags ?? [])],
18826
+ color: t.color ?? null,
18827
+ locked: !!t.locked,
18828
+ rrule: t.rrule ?? null,
18829
+ exdates: [...(t.exdates ?? [])],
18830
+ masterId: t.masterId ?? null,
18831
+ recurrenceId: toDate(t.recurrenceId ?? null),
18832
+ level: 0,
18833
+ children: [],
18834
+ scheduled: false,
18835
+ rolled: false,
18836
+ recurring: !!t.rrule,
18837
+ meta: t.meta ?? {},
18838
+ source: t,
18839
+ });
18840
+ }
18841
+ /* ---- 3. hiérarchie : parent inconnu, auto-parent et cycles deviennent des racines ---- */
18842
+ for (const [id, t] of raw) {
18843
+ const node = tasks.get(id);
18844
+ const parent = t.parent ?? null;
18845
+ if (!parent)
18846
+ continue;
18847
+ if (parent === id) {
18848
+ add('error', 'self-parent', 'Une tâche ne peut pas être son propre parent.', id);
18849
+ continue;
18850
+ }
18851
+ if (!tasks.has(parent)) {
18852
+ add('warning', 'unknown-parent', 'Parent inconnu : ' + parent + ' — la tâche devient racine.', id);
18853
+ continue;
18854
+ }
18855
+ node.parent = parent;
18856
+ }
18857
+ for (const node of tasks.values()) {
18858
+ const seen = new Set([node.id]);
18859
+ let cur = node.parent;
18860
+ while (cur) {
18861
+ if (seen.has(cur)) {
18862
+ add('error', 'parent-cycle', 'Cycle de parenté rompu à cette tâche.', node.id);
18863
+ node.parent = null;
18864
+ break;
18865
+ }
18866
+ seen.add(cur);
18867
+ cur = tasks.get(cur)?.parent ?? null;
18868
+ }
18869
+ }
18870
+ /* ---- 4. fratries et rangs : les rangs existants font l'ordre, les manquants sont complétés ---- */
18871
+ const groups = new Map();
18872
+ for (const id of tasks.keys()) {
18873
+ const key = tasks.get(id).parent;
18874
+ const list = groups.get(key);
18875
+ if (list)
18876
+ list.push(id);
18877
+ else
18878
+ groups.set(key, [id]);
18879
+ }
18880
+ for (const [key, ids] of groups) {
18881
+ const ranked = ids.filter(i => tasks.get(i).rank).sort((a, b) => (tasks.get(a).rank < tasks.get(b).rank ? -1 : 1));
18882
+ const unranked = ids.filter(i => !tasks.get(i).rank);
18883
+ const ordered = [...ranked, ...unranked];
18884
+ for (let i = 0; i < ordered.length; i++) {
18885
+ const node = tasks.get(ordered[i]);
18886
+ if (node.rank)
18887
+ continue;
18888
+ node.rank = cadRankBetween(i > 0 ? tasks.get(ordered[i - 1]).rank : null, null);
18889
+ }
18890
+ groups.set(key, ordered);
18891
+ if (key !== null)
18892
+ tasks.get(key).children = ordered;
18893
+ }
18894
+ /* ---- 5. ordre final : parcours en profondeur, niveaux ---- */
18895
+ const roots = groups.get(null) ?? [];
18896
+ const order = [];
18897
+ const walk = (ids, level) => {
18898
+ for (const id of ids) {
18899
+ const node = tasks.get(id);
18900
+ node.level = level;
18901
+ order.push(node);
18902
+ if (node.children.length)
18903
+ walk(node.children, level + 1);
18904
+ }
18905
+ };
18906
+ walk(roots, 0);
18907
+ /* ---- 6. barres récapitulatives : un parent sans dates prend l'étendue de ses descendants ---- */
18908
+ if (options.rollup !== false) {
18909
+ for (let i = order.length - 1; i >= 0; i--) {
18910
+ const node = order[i];
18911
+ if (!node.children.length || (node.start && node.end))
18912
+ continue;
18913
+ let lo = null;
18914
+ let hi = null;
18915
+ for (const cid of node.children) {
18916
+ const c = tasks.get(cid);
18917
+ if (c.start)
18918
+ lo = lo === null ? c.start.getTime() : Math.min(lo, c.start.getTime());
18919
+ if (c.end)
18920
+ hi = hi === null ? c.end.getTime() : Math.max(hi, c.end.getTime());
18921
+ }
18922
+ if (lo !== null && hi !== null) {
18923
+ node.start = new Date(lo);
18924
+ node.end = new Date(hi);
18925
+ node.rolled = true;
18926
+ }
18927
+ }
18928
+ }
18929
+ for (const node of order)
18930
+ node.scheduled = !!(node.start && node.end);
18931
+ /* ---- 7. liens ---- */
18932
+ const links = [];
18933
+ const seenLink = new Set();
18934
+ for (const l of plan?.links ?? []) {
18935
+ if (!l || typeof l.from !== 'string' || typeof l.to !== 'string')
18936
+ continue;
18937
+ if (l.from === l.to) {
18938
+ add('error', 'self-link', 'Une tâche ne peut pas dépendre d\'elle-même.', l.from);
18939
+ continue;
18940
+ }
18941
+ if (!tasks.has(l.from) || !tasks.has(l.to)) {
18942
+ add('warning', 'unknown-link-end', 'Lien ignoré : ' + l.from + ' -> ' + l.to + ' vise une tâche absente.', l.id);
18943
+ continue;
18944
+ }
18945
+ const key = l.from + '>' + l.to;
18946
+ if (seenLink.has(key))
18947
+ continue;
18948
+ seenLink.add(key);
18949
+ const d = l.lag ? cadParseDuration(l.lag) : null;
18950
+ if (l.lag && !d)
18951
+ add('warning', 'bad-duration', 'Décalage illisible : ' + l.lag, l.id);
18952
+ links.push({
18953
+ id: l.id ?? key,
18954
+ from: l.from,
18955
+ to: l.to,
18956
+ type: LINK_TYPES.includes(l.type) ? l.type : 'FS',
18957
+ lagMinutes: cadDurationToMinutes(d, calendar.dailyMinutes, calendar.weekDays),
18958
+ });
18959
+ }
18960
+ for (const id of cadFindLinkCycle(links)) {
18961
+ add('error', 'link-cycle', 'Cette tâche participe à un cycle de dépendances.', id);
18962
+ }
18963
+ /* ---- 8. étendue ---- */
18964
+ let lo = null;
18965
+ let hi = null;
18966
+ for (const t of order) {
18967
+ if (!t.scheduled)
18968
+ continue;
18969
+ lo = lo === null ? t.start.getTime() : Math.min(lo, t.start.getTime());
18970
+ hi = hi === null ? t.end.getTime() : Math.max(hi, t.end.getTime());
18971
+ }
18972
+ return {
18973
+ tasks: order,
18974
+ byId: tasks,
18975
+ roots,
18976
+ links,
18977
+ resources,
18978
+ buckets,
18979
+ calendar,
18980
+ range: lo !== null && hi !== null ? { start: new Date(lo), end: new Date(hi) } : null,
18981
+ issues,
18982
+ };
18983
+ }
18984
+ /**
18985
+ * Identifiants participant à un cycle de dépendances, par tri topologique (Kahn) :
18986
+ * ce qui ne sort jamais de la file est exactement ce qui est pris dans un cycle.
18987
+ * Nécessaire bien avant le moteur de replanification — un cycle non détecté s'y traduirait
18988
+ * par une boucle infinie plutôt que par un message.
18989
+ */
18990
+ function cadFindLinkCycle(links) {
18991
+ const out = new Map();
18992
+ const indeg = new Map();
18993
+ for (const l of links) {
18994
+ const edges = out.get(l.from);
18995
+ if (edges)
18996
+ edges.push(l.to);
18997
+ else
18998
+ out.set(l.from, [l.to]);
18999
+ if (!indeg.has(l.from))
19000
+ indeg.set(l.from, 0);
19001
+ indeg.set(l.to, (indeg.get(l.to) ?? 0) + 1);
19002
+ }
19003
+ const queue = [...indeg.keys()].filter(k => !indeg.get(k));
19004
+ let seen = 0;
19005
+ while (queue.length) {
19006
+ const id = queue.shift();
19007
+ seen++;
19008
+ for (const next of out.get(id) ?? []) {
19009
+ const n = (indeg.get(next) ?? 0) - 1;
19010
+ indeg.set(next, n);
19011
+ if (n === 0)
19012
+ queue.push(next);
19013
+ }
19014
+ }
19015
+ return seen === indeg.size ? [] : [...indeg.keys()].filter(k => (indeg.get(k) ?? 0) > 0);
19016
+ }
19017
+ /** Tâches qu'aucune vue temporelle ne sait placer — la zone « non planifié », jamais le silence. */
19018
+ const cadUnscheduled = (plan) => plan.tasks.filter(t => !t.scheduled);
19019
+
19020
+ /** Styles de cad-taskboard (présentations cartes et liste). Tokens --cad-* uniquement. */
19021
+ const CAD_TASKBOARD_STYLES = `
19022
+ :host { display: flex; flex-direction: column; min-height: 0; height: 100%; font: var(--cad-font-size)/1.35 var(--cad-font); color: var(--cad-fg); background: var(--cad-bg); }
19023
+
19024
+ /* ---------------- présentation CARTES ---------------- */
19025
+ .tb__board { flex: 1; min-height: 0; display: flex; gap: 12px; padding: 12px; overflow-x: auto; overflow-y: hidden; scrollbar-gutter: stable; }
19026
+ .tb__col { flex: 0 0 var(--cad-taskboard-col, 258px); display: flex; flex-direction: column; min-height: 0; background: var(--cad-bg-subtle); border: 1px solid var(--cad-border); border-radius: var(--cad-radius); }
19027
+ .tb__head { display: flex; align-items: center; gap: 8px; padding: 9px 11px; border-bottom: 1px solid var(--cad-border); }
19028
+ .tb__dot { width: 8px; height: 8px; border-radius: 50%; flex: none; background: var(--_c, var(--cad-border-strong)); }
19029
+ .tb__name { font-weight: 500; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19030
+ .tb__count { font-family: var(--cad-font-mono); font-size: var(--cad-font-size-sm); padding: 2px 7px; border-radius: var(--cad-radius-pill); background: var(--cad-elevated); color: var(--cad-fg-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
19031
+ .tb__count.is-full { background: var(--cad-warning-soft); color: var(--cad-warning); }
19032
+ .tb__count.is-over { background: var(--cad-danger-soft); color: var(--cad-danger); font-weight: 500; }
19033
+
19034
+ .tb__list { flex: 1; min-height: 0; overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 8px; scrollbar-gutter: stable; }
19035
+ .tb__list.cdk-drop-list-dragging { background: var(--cad-accent-soft); }
19036
+
19037
+ .tb__card { background: var(--cad-surface); border: 1px solid var(--cad-border); border-radius: var(--cad-radius-sm); padding: 9px 10px; box-shadow: var(--cad-shadow-sm); display: flex; flex-direction: column; gap: 7px; cursor: grab; user-select: none; transition: border-color var(--cad-dur) var(--cad-ease), box-shadow var(--cad-dur) var(--cad-ease); }
19038
+ .tb__card:hover { border-color: var(--cad-border-strong); box-shadow: var(--cad-shadow-md); }
19039
+ .tb__card:focus-visible { outline: 2px solid var(--cad-ring); outline-offset: 1px; }
19040
+ .tb__card.is-orphan { border-left: 2px dashed var(--cad-warning); }
19041
+ :host(.is-static) .tb__card, :host(.is-static) .tb__row { cursor: default; }
19042
+
19043
+ .tb__title { font-weight: 500; line-height: 1.32; }
19044
+ .tb__meta { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
19045
+ .tb__tag { font-family: var(--cad-font-mono); font-size: 10px; padding: 2px 6px; border-radius: var(--cad-radius-sm); background: var(--cad-elevated); color: var(--cad-fg-secondary); }
19046
+ .tb__due { font-family: var(--cad-font-mono); font-size: var(--cad-font-size-sm); color: var(--cad-fg-muted); font-variant-numeric: tabular-nums; }
19047
+ .tb__due.is-late { color: var(--cad-danger); font-weight: 500; }
19048
+ .tb__sp { flex: 1 1 auto; }
19049
+ .tb__prog { height: 3px; border-radius: var(--cad-radius-pill); background: var(--cad-elevated); overflow: hidden; }
19050
+ .tb__prog i { display: block; height: 100%; border-radius: var(--cad-radius-pill); background: var(--cad-accent); }
19051
+ .tb__prog.is-done i { background: var(--cad-success); }
19052
+
19053
+ .tb__empty { padding: 14px 10px; text-align: center; color: var(--cad-fg-muted); font-size: var(--cad-font-size-sm); border: 1px dashed var(--cad-border-strong); border-radius: var(--cad-radius-sm); }
19054
+
19055
+ /* ---------------- présentation LISTE ---------------- */
19056
+ .tb__rows { flex: 1; min-height: 0; overflow-y: auto; padding-bottom: 12px; scrollbar-gutter: stable; }
19057
+ .tb__grp { display: flex; align-items: center; gap: 8px; width: 100%; padding: 8px 14px; background: var(--cad-bg-subtle); border-top: 1px solid var(--cad-border); border-bottom: 1px solid var(--cad-border); position: sticky; top: 0; z-index: 1; cursor: pointer; text-align: left; font: inherit; color: inherit; }
19058
+ .tb__grp:hover { background: var(--cad-hover); }
19059
+ .tb__grp:focus-visible { outline: 2px solid var(--cad-ring); outline-offset: -2px; }
19060
+ .tb__grp cad-icon { color: var(--cad-fg-muted); transition: transform var(--cad-dur) var(--cad-ease); }
19061
+ .tb__grp.is-collapsed cad-icon { transform: rotate(-90deg); }
19062
+ .tb__grp b { font-weight: 500; }
19063
+
19064
+ .tb__group-list { display: block; }
19065
+ .tb__row { display: grid; grid-template-columns: 1fr 92px 88px 26px; align-items: center; gap: 12px; padding: 8px 14px; border-bottom: 1px solid var(--cad-border); cursor: grab; user-select: none; background: var(--cad-bg); }
19066
+ .tb__row:hover { background: var(--cad-hover); }
19067
+ .tb__row:focus-visible { outline: 2px solid var(--cad-ring); outline-offset: -2px; }
19068
+ .tb__row.is-orphan { box-shadow: inset 2px 0 0 var(--cad-warning); }
19069
+ .tb__main { min-width: 0; display: flex; flex-direction: column; gap: 4px; }
19070
+ .tb__main .tb__title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
19071
+ .tb__pct { display: flex; align-items: center; gap: 7px; }
19072
+ .tb__pct .tb__prog { flex: 1; }
19073
+ .tb__pct span { font-family: var(--cad-font-mono); font-size: 10px; color: var(--cad-fg-muted); font-variant-numeric: tabular-nums; }
19074
+
19075
+ /* sous le seuil, la liste se resserre : l'échéance rejoint le titre, l'avancement s'efface */
19076
+ :host(.is-compact) .tb__row { grid-template-columns: 1fr 26px; }
19077
+ :host(.is-compact) .tb__cell-due, :host(.is-compact) .tb__pct { display: none; }
19078
+ :host(.is-compact) .tb__mob { display: inline-flex; }
19079
+ .tb__mob { display: none; align-items: center; gap: 7px; }
19080
+
19081
+ /* ---------------- glisser (CDK) ---------------- */
19082
+ .cdk-drag-preview { box-shadow: var(--cad-shadow-lg); border-radius: var(--cad-radius-sm); background: var(--cad-overlay); --cad-hover: var(--cad-overlay-hover); border: 1px solid var(--cad-border); }
19083
+ .cdk-drag-placeholder { opacity: .34; }
19084
+ .cdk-drag-animating { transition: transform 180ms var(--cad-ease); }
19085
+ .tb__list.cdk-drop-list-dragging .tb__card:not(.cdk-drag-placeholder),
19086
+ .tb__group-list.cdk-drop-list-dragging .tb__row:not(.cdk-drag-placeholder) { transition: transform 180ms var(--cad-ease); }
19087
+
19088
+ /* annonce aux lecteurs d'écran — hors flux, jamais display:none (elle ne serait plus lue) */
19089
+ .tb__live { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
19090
+
19091
+ @media (prefers-reduced-motion: reduce) { .cdk-drag-animating, .tb__list.cdk-drop-list-dragging .tb__card, .tb__grp cad-icon { transition: none; } }
19092
+ `;
19093
+
19094
+ /** Contenu d'une carte : `<ng-template cadTaskCard let-task let-bucket="bucket">`. */
19095
+ class CadTaskCardDirective {
19096
+ tpl = inject(TemplateRef);
19097
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadTaskCardDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
19098
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.20", type: CadTaskCardDirective, isStandalone: true, selector: "[cadTaskCard]", ngImport: i0 });
19099
+ }
19100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadTaskCardDirective, decorators: [{
19101
+ type: Directive,
19102
+ args: [{ selector: '[cadTaskCard]', standalone: true }]
19103
+ }] });
19104
+ /** Contenu d'une ligne : `<ng-template cadTaskRow let-task let-group="group">`. */
19105
+ class CadTaskRowDirective {
19106
+ tpl = inject(TemplateRef);
19107
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadTaskRowDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
19108
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.20", type: CadTaskRowDirective, isStandalone: true, selector: "[cadTaskRow]", ngImport: i0 });
19109
+ }
19110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadTaskRowDirective, decorators: [{
19111
+ type: Directive,
19112
+ args: [{ selector: '[cadTaskRow]', standalone: true }]
19113
+ }] });
19114
+ const EMPTY_PATCH = { src: undefined, map: new Map() };
19115
+ const NO_RESOURCE = ' none';
19116
+ /**
19117
+ * <cad-taskboard [plan]="plan" mode="auto" groupBy="bucket" (taskMove) (taskAssign) (taskOpen) (wipExceeded)>
19118
+ * <ng-template cadTaskCard let-t>…</ng-template>
19119
+ * <ng-template cadTaskRow let-t>…</ng-template>
19120
+ * </cad-taskboard>
19121
+ *
19122
+ * UNE SEULE ENTRÉE sépare les deux présentations : `mode`. On transforme la présentation, jamais
19123
+ * l'architecture de l'information — mêmes tâches, même rang, même geste, même intention. `auto`
19124
+ * bascule en liste sous le seuil mobile, sur le patron de `cad-nav-drawer`.
19125
+ *
19126
+ * LE COMPOSANT N'ÉCRIT JAMAIS. Il émet `taskMove` / `taskAssign` et laisse l'application décider :
19127
+ * c'est ce qui rend la source indifférente (slapi ou document statique). Pour que le geste reste
19128
+ * vivant sans mentir, il conserve un CORRECTIF LOCAL optimiste, abandonné dès qu'un nouveau `plan`
19129
+ * arrive — l'entrée n'est jamais mutée, et l'affichage suit l'application si elle refuse.
19130
+ *
19131
+ * La limite de travail en cours ALERTE mais ne bloque pas : un tableau qui refuse un geste sans
19132
+ * l'expliquer se contourne au lieu d'être lu.
19133
+ *
19134
+ * Clavier : Entrée / Espace ouvrent la tâche ; Ctrl (ou Cmd) + flèches la déplacent — gauche et
19135
+ * droite changent de colonne, haut et bas changent de rang. Chaque déplacement est annoncé.
19136
+ */
19137
+ class CadTaskboardComponent {
19138
+ /** Document de planification brut ; il est normalisé en interne et jamais muté. */
19139
+ plan = input(null, ...(ngDevMode ? [{ debugName: "plan" }] : /* istanbul ignore next */ []));
19140
+ /** 'board' = cartes, 'list' = lignes groupées, 'auto' = liste sous le seuil mobile. */
19141
+ mode = input('auto', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
19142
+ /** Regroupement de la présentation liste. Par personne, le glisser réaffecte au lieu de ranger. */
19143
+ groupBy = input('bucket', ...(ngDevMode ? [{ debugName: "groupBy" }] : /* istanbul ignore next */ []));
19144
+ dragDisabled = input(false, { ...(ngDevMode ? { debugName: "dragDisabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
19145
+ /** Groupes repliés (présentation liste). */
19146
+ collapsedKeys = model(new Set(), ...(ngDevMode ? [{ debugName: "collapsedKeys" }] : /* istanbul ignore next */ []));
19147
+ emptyText = input('Rien ici', ...(ngDevMode ? [{ debugName: "emptyText" }] : /* istanbul ignore next */ []));
19148
+ ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
19149
+ /** Format d'échéance (jetons de `formatDate`). */
19150
+ dateFormat = input('dd/MM', ...(ngDevMode ? [{ debugName: "dateFormat" }] : /* istanbul ignore next */ []));
19151
+ /** Instant de référence pour « en retard ». Explicite en test, sinon maintenant. */
19152
+ today = input(null, ...(ngDevMode ? [{ debugName: "today" }] : /* istanbul ignore next */ []));
19153
+ taskMove = output();
19154
+ taskAssign = output();
19155
+ taskOpen = output();
19156
+ wipExceeded = output();
19157
+ cardTpl = contentChild(CadTaskCardDirective, ...(ngDevMode ? [{ debugName: "cardTpl" }] : /* istanbul ignore next */ []));
19158
+ rowTpl = contentChild(CadTaskRowDirective, ...(ngDevMode ? [{ debugName: "rowTpl" }] : /* istanbul ignore next */ []));
19159
+ orphanHint = 'Sans colonne connue — rangée par défaut, jamais escamotée';
19160
+ announcement = signal('', ...(ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []));
19161
+ bp = inject(CadBreakpointService);
19162
+ patch = signal(EMPTY_PATCH, ...(ngDevMode ? [{ debugName: "patch" }] : /* istanbul ignore next */ []));
19163
+ /** Document résolu par le socle de planification. */
19164
+ normalized = computed(() => cadNormalizePlan(this.plan()), ...(ngDevMode ? [{ debugName: "normalized" }] : /* istanbul ignore next */ []));
19165
+ /** Présentation effective, une fois `auto` tranché par le seuil. */
19166
+ view = computed(() => {
19167
+ const m = this.mode();
19168
+ return m === 'auto' ? (this.bp.isMobile() ? 'list' : 'board') : m;
19169
+ }, ...(ngDevMode ? [{ debugName: "view" }] : /* istanbul ignore next */ []));
19170
+ compact = computed(() => this.view() === 'list' && this.bp.isMobile(), ...(ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []));
19171
+ /** Tâches après application du correctif optimiste (abandonné dès que `plan` change). */
19172
+ tasks = computed(() => {
19173
+ const base = this.normalized().tasks;
19174
+ const p = this.patch();
19175
+ if (p.src !== this.plan() || !p.map.size)
19176
+ return base;
19177
+ return base.map(t => {
19178
+ const o = p.map.get(t.id);
19179
+ if (!o)
19180
+ return t;
19181
+ const next = { ...t, rank: o.rank };
19182
+ if (o.bucket !== undefined)
19183
+ next.bucket = o.bucket;
19184
+ if (o.resource !== undefined) {
19185
+ next.assignments = o.resource ? [{ resource: o.resource, units: t.assignments[0]?.units ?? 1 }] : [];
19186
+ }
19187
+ return next;
19188
+ });
19189
+ }, ...(ngDevMode ? [{ debugName: "tasks" }] : /* istanbul ignore next */ []));
19190
+ /** Colonnes déclarées, ou une colonne implicite : un tableau sans colonne reste un tableau. */
19191
+ declared = computed(() => {
19192
+ const b = this.normalized().buckets;
19193
+ return b.length ? b : [{ id: '', label: 'Tâches' }];
19194
+ }, ...(ngDevMode ? [{ debugName: "declared" }] : /* istanbul ignore next */ []));
19195
+ /** Colonnes (cartes, ou liste groupée par colonne) ou personnes (liste groupée par personne). */
19196
+ columns = computed(() => {
19197
+ const tasks = this.tasks();
19198
+ const byRank = (a, b) => (a.rank < b.rank ? -1 : a.rank > b.rank ? 1 : 0);
19199
+ if (this.view() === 'list' && this.groupBy() === 'resource') {
19200
+ const res = this.normalized().resources;
19201
+ const known = new Set(res.map(r => r.id));
19202
+ const groups = res.map(r => ({
19203
+ id: r.id,
19204
+ label: r['label'] ?? r.id,
19205
+ color: r.color ?? null,
19206
+ wipLimit: null,
19207
+ tasks: tasks.filter(t => t.assignments[0]?.resource === r.id).sort(byRank),
19208
+ }));
19209
+ groups.push({
19210
+ id: NO_RESOURCE,
19211
+ label: 'Non affectées',
19212
+ color: null,
19213
+ wipLimit: null,
19214
+ tasks: tasks.filter(t => !t.assignments.length || !known.has(t.assignments[0].resource)).sort(byRank),
19215
+ });
19216
+ return groups;
19217
+ }
19218
+ return this.declared().map((b, i) => ({
19219
+ id: b.id,
19220
+ label: b.label ?? b.id,
19221
+ color: b.color ?? null,
19222
+ wipLimit: b.wipLimit ?? null,
19223
+ tasks: tasks.filter(t => (this.isOrphan(t) ? i === 0 : t.bucket === b.id)).sort(byRank),
19224
+ }));
19225
+ }, ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
19226
+ /* ---------------- lecture ---------------- */
19227
+ /** Colonne réelle d'une tâche : la sienne si elle existe, sinon la première. Jamais « nulle part ». */
19228
+ bucketOf(t) {
19229
+ const declared = this.declared();
19230
+ return declared.some(b => b.id === t.bucket) ? t.bucket : declared[0].id;
19231
+ }
19232
+ isOrphan(t) {
19233
+ return !this.declared().some(b => b.id === t.bucket);
19234
+ }
19235
+ countOf(c) {
19236
+ return c.wipLimit == null ? String(c.tasks.length) : c.tasks.length + '/' + c.wipLimit;
19237
+ }
19238
+ wipState(c) {
19239
+ if (c.wipLimit == null)
19240
+ return 'none';
19241
+ return c.tasks.length > c.wipLimit ? 'over' : c.tasks.length === c.wipLimit ? 'full' : 'none';
19242
+ }
19243
+ due(t) {
19244
+ return t.end ? formatDate(t.end, this.dateFormat()) : '';
19245
+ }
19246
+ isLate(t) {
19247
+ return !!t.end && t.progress < 1 && t.end.getTime() < (this.today() ?? new Date()).getTime();
19248
+ }
19249
+ pct(t) { return Math.round(t.progress * 100); }
19250
+ labelOfResource(id) {
19251
+ const r = this.normalized().resources.find(x => x.id === id);
19252
+ return (r?.['label'] ?? id).slice(0, 24);
19253
+ }
19254
+ /** Initiales d'une personne : « S. Zuccatti » donne SZ, « Charles » donne CH. */
19255
+ initialsOfResource(id) {
19256
+ const mots = this.labelOfResource(id).split(/[\s.'-]+/).filter(Boolean);
19257
+ return (mots.length > 1 ? mots[0][0] + mots[1][0] : (mots[0] ?? id).slice(0, 2)).toUpperCase();
19258
+ }
19259
+ colorOfResource(id) {
19260
+ return this.normalized().resources.find(x => x.id === id)?.color ?? null;
19261
+ }
19262
+ isCollapsed(key) { return this.collapsedKeys().has(key); }
19263
+ toggle(key) {
19264
+ const next = new Set(this.collapsedKeys());
19265
+ if (next.has(key))
19266
+ next.delete(key);
19267
+ else
19268
+ next.add(key);
19269
+ this.collapsedKeys.set(next);
19270
+ }
19271
+ open(t, event) {
19272
+ this.taskOpen.emit({ id: t.id, task: t, event });
19273
+ }
19274
+ /* ---------------- déplacement ---------------- */
19275
+ onDrop(e, kind) {
19276
+ const same = e.previousContainer === e.container;
19277
+ this.apply(e.item.data, e.container.data, e.currentIndex, kind, same ? e.previousIndex : -1);
19278
+ }
19279
+ onKey(e, t, colId) {
19280
+ if (e.key === 'Enter' || e.key === ' ') {
19281
+ e.preventDefault();
19282
+ this.open(t, e);
19283
+ return;
19284
+ }
19285
+ if ((!e.ctrlKey && !e.metaKey) || this.dragDisabled() || t.locked)
19286
+ return;
19287
+ const cols = this.columns();
19288
+ const ci = cols.findIndex(c => c.id === colId);
19289
+ if (ci < 0)
19290
+ return;
19291
+ const here = cols[ci].tasks.findIndex(x => x.id === t.id);
19292
+ const kind = this.view() === 'list' ? this.groupBy() : 'bucket';
19293
+ if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {
19294
+ const to = here + (e.key === 'ArrowUp' ? -1 : 1);
19295
+ if (to < 0 || to >= cols[ci].tasks.length)
19296
+ return;
19297
+ e.preventDefault();
19298
+ this.apply(t.id, colId, to, kind, here);
19299
+ }
19300
+ else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
19301
+ const target = cols[ci + (e.key === 'ArrowLeft' ? -1 : 1)];
19302
+ if (!target)
19303
+ return;
19304
+ e.preventDefault();
19305
+ this.apply(t.id, target.id, Math.min(here, target.tasks.length), kind, -1);
19306
+ }
19307
+ }
19308
+ /**
19309
+ * Calcule le nouveau rang entre les deux voisins, pose le correctif optimiste et ÉMET.
19310
+ * `fromIndex` >= 0 signale un déplacement dans le même groupe : le voisinage se lit alors sur
19311
+ * la liste privée de la tâche déplacée, exactement comme le fait `moveItemInArray`.
19312
+ */
19313
+ apply(id, target, index, kind, fromIndex) {
19314
+ const task = this.tasks().find(t => t.id === id);
19315
+ const column = this.columns().find(c => c.id === target);
19316
+ if (!task || !column)
19317
+ return;
19318
+ const items = column.tasks.filter(t => t.id !== id);
19319
+ const at = Math.max(0, Math.min(index, items.length));
19320
+ const rank = cadRankBetween(items[at - 1]?.rank ?? null, items[at]?.rank ?? null);
19321
+ const previousRank = task.rank;
19322
+ if (fromIndex === at)
19323
+ return;
19324
+ const current = this.patch();
19325
+ const map = new Map(current.src === this.plan() ? current.map : []);
19326
+ if (kind === 'resource') {
19327
+ const from = task.assignments[0]?.resource ?? null;
19328
+ const to = target === NO_RESOURCE ? null : target;
19329
+ map.set(id, { ...map.get(id), resource: to, rank });
19330
+ this.patch.set({ src: this.plan(), map });
19331
+ this.taskAssign.emit({ id, task, from, to, rank });
19332
+ this.announce(task, target, column.label, at, 'affectée à ');
19333
+ return;
19334
+ }
19335
+ const from = this.bucketOf(task);
19336
+ map.set(id, { ...map.get(id), bucket: target, rank });
19337
+ this.patch.set({ src: this.plan(), map });
19338
+ this.taskMove.emit({ id, task, from, to: target, rank, previousRank, index: at });
19339
+ this.announce(task, target, column.label, at, 'déplacée dans ');
19340
+ const after = this.columns().find(c => c.id === target);
19341
+ if (after && after.wipLimit != null && after.tasks.length > after.wipLimit) {
19342
+ this.wipExceeded.emit({ bucket: target, limit: after.wipLimit, count: after.tasks.length });
19343
+ }
19344
+ }
19345
+ /** L'annonce ne dit pas « déplacé » : elle dit OÙ et À QUELLE PLACE — la seule information utile sans la vue. */
19346
+ announce(task, key, label, at, verb) {
19347
+ const total = this.columns().find(c => c.id === key)?.tasks.length ?? 0;
19348
+ this.announcement.set(task.label + ' — ' + verb + label + ', position ' + (at + 1) + ' sur ' + total + '.');
19349
+ }
19350
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadTaskboardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19351
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: CadTaskboardComponent, isStandalone: true, selector: "cad-taskboard", inputs: { plan: { classPropertyName: "plan", publicName: "plan", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, dragDisabled: { classPropertyName: "dragDisabled", publicName: "dragDisabled", isSignal: true, isRequired: false, transformFunction: null }, collapsedKeys: { classPropertyName: "collapsedKeys", publicName: "collapsedKeys", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, dateFormat: { classPropertyName: "dateFormat", publicName: "dateFormat", isSignal: true, isRequired: false, transformFunction: null }, today: { classPropertyName: "today", publicName: "today", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsedKeys: "collapsedKeysChange", taskMove: "taskMove", taskAssign: "taskAssign", taskOpen: "taskOpen", wipExceeded: "wipExceeded" }, host: { properties: { "class.is-compact": "compact()", "class.is-static": "dragDisabled()", "attr.aria-label": "ariaLabel() || null" }, classAttribute: "cad-taskboard" }, queries: [{ propertyName: "cardTpl", first: true, predicate: CadTaskCardDirective, descendants: true, isSignal: true }, { propertyName: "rowTpl", first: true, predicate: CadTaskRowDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
19352
+ <p class="tb__live" role="status" aria-live="polite">{{ announcement() }}</p>
19353
+
19354
+ @if (view() === 'board') {
19355
+ <div class="tb__board" cdkDropListGroup>
19356
+ @for (col of columns(); track col.id) {
19357
+ <section class="tb__col">
19358
+ <header class="tb__head">
19359
+ <span class="tb__dot" [style.--_c]="col.color"></span>
19360
+ <span class="tb__name">{{ col.label }}</span>
19361
+ <span class="tb__count" [class.is-full]="wipState(col) === 'full'" [class.is-over]="wipState(col) === 'over'"
19362
+ [attr.title]="col.wipLimit != null ? 'Limite de travail en cours' : null">{{ countOf(col) }}</span>
19363
+ </header>
19364
+ <div class="tb__list" cdkDropList [cdkDropListData]="col.id" [cdkDropListDisabled]="dragDisabled()"
19365
+ (cdkDropListDropped)="onDrop($event, 'bucket')" [attr.aria-label]="col.label">
19366
+ @for (t of col.tasks; track t.id) {
19367
+ <article class="tb__card" cdkDrag [cdkDragData]="t.id" [cdkDragDisabled]="dragDisabled() || t.locked"
19368
+ tabindex="0" role="button" [attr.data-id]="t.id" [class.is-orphan]="isOrphan(t)"
19369
+ [attr.title]="isOrphan(t) ? orphanHint : null"
19370
+ (click)="open(t, $event)" (keydown)="onKey($event, t, col.id)">
19371
+ @if (cardTpl()) {
19372
+ <ng-container *ngTemplateOutlet="cardTpl()!.tpl; context: { $implicit: t, bucket: col.id }"/>
19373
+ } @else {
19374
+ <p class="tb__title">{{ t.label }}</p>
19375
+ @if (t.progress > 0) {<div class="tb__prog" [class.is-done]="t.progress >= 1"><i [style.width.%]="t.progress * 100"></i></div>}
19376
+ <div class="tb__meta">
19377
+ @for (g of t.tags; track g) {<span class="tb__tag">{{ g }}</span>}
19378
+ <span class="tb__sp"></span>
19379
+ @if (t.end) {<span class="tb__due" [class.is-late]="isLate(t)" title="Échéance">{{ due(t) }}</span>}
19380
+ @for (a of t.assignments; track a.resource) {
19381
+ <cad-avatar size="sm" [text]="initialsOfResource(a.resource)" [color]="colorOfResource(a.resource)" [title]="labelOfResource(a.resource)"/>
19382
+ }
19383
+ </div>
19384
+ }
19385
+ </article>
19386
+ } @empty {
19387
+ <p class="tb__empty">{{ emptyText() }}</p>
19388
+ }
19389
+ </div>
19390
+ </section>
19391
+ }
19392
+ </div>
19393
+ } @else {
19394
+ <div class="tb__rows" cdkDropListGroup>
19395
+ @for (col of columns(); track col.id) {
19396
+ <button type="button" class="tb__grp" [class.is-collapsed]="isCollapsed(col.id)"
19397
+ [attr.aria-expanded]="!isCollapsed(col.id)" (click)="toggle(col.id)">
19398
+ <cad-icon name="chevron-down" [size]="14"/>
19399
+ <span class="tb__dot" [style.--_c]="col.color"></span>
19400
+ <b>{{ col.label }}</b>
19401
+ <span class="tb__sp"></span>
19402
+ <span class="tb__count" [class.is-full]="wipState(col) === 'full'" [class.is-over]="wipState(col) === 'over'">{{ countOf(col) }}</span>
19403
+ </button>
19404
+ @if (!isCollapsed(col.id)) {
19405
+ <div class="tb__group-list" cdkDropList [cdkDropListData]="col.id" [cdkDropListDisabled]="dragDisabled()"
19406
+ (cdkDropListDropped)="onDrop($event, groupBy())" [attr.aria-label]="col.label">
19407
+ @for (t of col.tasks; track t.id) {
19408
+ <div class="tb__row" cdkDrag [cdkDragData]="t.id" [cdkDragDisabled]="dragDisabled() || t.locked"
19409
+ tabindex="0" role="button" [attr.data-id]="t.id" [class.is-orphan]="isOrphan(t)"
19410
+ [attr.title]="isOrphan(t) ? orphanHint : null"
19411
+ (click)="open(t, $event)" (keydown)="onKey($event, t, col.id)">
19412
+ @if (rowTpl()) {
19413
+ <ng-container *ngTemplateOutlet="rowTpl()!.tpl; context: { $implicit: t, group: col.id }"/>
19414
+ } @else {
19415
+ <div class="tb__main">
19416
+ <span class="tb__title">{{ t.label }}</span>
19417
+ <div class="tb__meta">
19418
+ @for (g of t.tags; track g) {<span class="tb__tag">{{ g }}</span>}
19419
+ @if (t.end) {<span class="tb__mob tb__due" [class.is-late]="isLate(t)">{{ due(t) }}</span>}
19420
+ </div>
19421
+ </div>
19422
+ <span class="tb__due tb__cell-due" [class.is-late]="isLate(t)">{{ t.end ? due(t) : '—' }}</span>
19423
+ <div class="tb__pct">
19424
+ <div class="tb__prog" [class.is-done]="t.progress >= 1"><i [style.width.%]="t.progress * 100"></i></div>
19425
+ <span>{{ pct(t) }}%</span>
19426
+ </div>
19427
+ @if (t.assignments.length) {
19428
+ <cad-avatar size="sm" [text]="initialsOfResource(t.assignments[0].resource)"
19429
+ [color]="colorOfResource(t.assignments[0].resource)" [title]="labelOfResource(t.assignments[0].resource)"/>
19430
+ } @else {<span class="tb__due">—</span>}
19431
+ }
19432
+ </div>
19433
+ } @empty {
19434
+ <p class="tb__empty" style="margin: 10px 14px">{{ emptyText() }}</p>
19435
+ }
19436
+ </div>
19437
+ }
19438
+ }
19439
+ </div>
19440
+ }
19441
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;min-height:0;height:100%;font:var(--cad-font-size)/1.35 var(--cad-font);color:var(--cad-fg);background:var(--cad-bg)}.tb__board{flex:1;min-height:0;display:flex;gap:12px;padding:12px;overflow-x:auto;overflow-y:hidden;scrollbar-gutter:stable}.tb__col{flex:0 0 var(--cad-taskboard-col, 258px);display:flex;flex-direction:column;min-height:0;background:var(--cad-bg-subtle);border:1px solid var(--cad-border);border-radius:var(--cad-radius)}.tb__head{display:flex;align-items:center;gap:8px;padding:9px 11px;border-bottom:1px solid var(--cad-border)}.tb__dot{width:8px;height:8px;border-radius:50%;flex:none;background:var(--_c, var(--cad-border-strong))}.tb__name{font-weight:500;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb__count{font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm);padding:2px 7px;border-radius:var(--cad-radius-pill);background:var(--cad-elevated);color:var(--cad-fg-muted);font-variant-numeric:tabular-nums;white-space:nowrap}.tb__count.is-full{background:var(--cad-warning-soft);color:var(--cad-warning)}.tb__count.is-over{background:var(--cad-danger-soft);color:var(--cad-danger);font-weight:500}.tb__list{flex:1;min-height:0;overflow-y:auto;padding:8px;display:flex;flex-direction:column;gap:8px;scrollbar-gutter:stable}.tb__list.cdk-drop-list-dragging{background:var(--cad-accent-soft)}.tb__card{background:var(--cad-surface);border:1px solid var(--cad-border);border-radius:var(--cad-radius-sm);padding:9px 10px;box-shadow:var(--cad-shadow-sm);display:flex;flex-direction:column;gap:7px;cursor:grab;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}.tb__card:hover{border-color:var(--cad-border-strong);box-shadow:var(--cad-shadow-md)}.tb__card:focus-visible{outline:2px solid var(--cad-ring);outline-offset:1px}.tb__card.is-orphan{border-left:2px dashed var(--cad-warning)}:host(.is-static) .tb__card,:host(.is-static) .tb__row{cursor:default}.tb__title{font-weight:500;line-height:1.32}.tb__meta{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.tb__tag{font-family:var(--cad-font-mono);font-size:10px;padding:2px 6px;border-radius:var(--cad-radius-sm);background:var(--cad-elevated);color:var(--cad-fg-secondary)}.tb__due{font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm);color:var(--cad-fg-muted);font-variant-numeric:tabular-nums}.tb__due.is-late{color:var(--cad-danger);font-weight:500}.tb__sp{flex:1 1 auto}.tb__prog{height:3px;border-radius:var(--cad-radius-pill);background:var(--cad-elevated);overflow:hidden}.tb__prog i{display:block;height:100%;border-radius:var(--cad-radius-pill);background:var(--cad-accent)}.tb__prog.is-done i{background:var(--cad-success)}.tb__empty{padding:14px 10px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm);border:1px dashed var(--cad-border-strong);border-radius:var(--cad-radius-sm)}.tb__rows{flex:1;min-height:0;overflow-y:auto;padding-bottom:12px;scrollbar-gutter:stable}.tb__grp{display:flex;align-items:center;gap:8px;width:100%;padding:8px 14px;background:var(--cad-bg-subtle);border-top:1px solid var(--cad-border);border-bottom:1px solid var(--cad-border);position:sticky;top:0;z-index:1;cursor:pointer;text-align:left;font:inherit;color:inherit}.tb__grp:hover{background:var(--cad-hover)}.tb__grp:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-2px}.tb__grp cad-icon{color:var(--cad-fg-muted);transition:transform var(--cad-dur) var(--cad-ease)}.tb__grp.is-collapsed cad-icon{transform:rotate(-90deg)}.tb__grp b{font-weight:500}.tb__group-list{display:block}.tb__row{display:grid;grid-template-columns:1fr 92px 88px 26px;align-items:center;gap:12px;padding:8px 14px;border-bottom:1px solid var(--cad-border);cursor:grab;-webkit-user-select:none;user-select:none;background:var(--cad-bg)}.tb__row:hover{background:var(--cad-hover)}.tb__row:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-2px}.tb__row.is-orphan{box-shadow:inset 2px 0 0 var(--cad-warning)}.tb__main{min-width:0;display:flex;flex-direction:column;gap:4px}.tb__main .tb__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb__pct{display:flex;align-items:center;gap:7px}.tb__pct .tb__prog{flex:1}.tb__pct span{font-family:var(--cad-font-mono);font-size:10px;color:var(--cad-fg-muted);font-variant-numeric:tabular-nums}:host(.is-compact) .tb__row{grid-template-columns:1fr 26px}:host(.is-compact) .tb__cell-due,:host(.is-compact) .tb__pct{display:none}:host(.is-compact) .tb__mob{display:inline-flex}.tb__mob{display:none;align-items:center;gap:7px}.cdk-drag-preview{box-shadow:var(--cad-shadow-lg);border-radius:var(--cad-radius-sm);background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border)}.cdk-drag-placeholder{opacity:.34}.cdk-drag-animating{transition:transform .18s var(--cad-ease)}.tb__list.cdk-drop-list-dragging .tb__card:not(.cdk-drag-placeholder),.tb__group-list.cdk-drop-list-dragging .tb__row:not(.cdk-drag-placeholder){transition:transform .18s var(--cad-ease)}.tb__live{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}@media(prefers-reduced-motion:reduce){.cdk-drag-animating,.tb__list.cdk-drop-list-dragging .tb__card,.tb__grp cad-icon{transition:none}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "component", type: CadAvatarComponent, selector: "cad-avatar", inputs: ["src", "text", "icon", "size", "shape", "color", "label"] }, { kind: "component", type: CadIconComponent, selector: "cad-icon", inputs: ["name", "size", "strokeWidth", "label", "title", "spin", "filled", "flip", "rotate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19442
+ }
19443
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: CadTaskboardComponent, decorators: [{
19444
+ type: Component,
19445
+ args: [{ selector: 'cad-taskboard', standalone: true, imports: [NgTemplateOutlet, CdkDrag, CdkDropList, CdkDropListGroup, CadAvatarComponent, CadIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: {
19446
+ class: 'cad-taskboard',
19447
+ '[class.is-compact]': 'compact()',
19448
+ '[class.is-static]': 'dragDisabled()',
19449
+ '[attr.aria-label]': 'ariaLabel() || null',
19450
+ }, template: `
19451
+ <p class="tb__live" role="status" aria-live="polite">{{ announcement() }}</p>
19452
+
19453
+ @if (view() === 'board') {
19454
+ <div class="tb__board" cdkDropListGroup>
19455
+ @for (col of columns(); track col.id) {
19456
+ <section class="tb__col">
19457
+ <header class="tb__head">
19458
+ <span class="tb__dot" [style.--_c]="col.color"></span>
19459
+ <span class="tb__name">{{ col.label }}</span>
19460
+ <span class="tb__count" [class.is-full]="wipState(col) === 'full'" [class.is-over]="wipState(col) === 'over'"
19461
+ [attr.title]="col.wipLimit != null ? 'Limite de travail en cours' : null">{{ countOf(col) }}</span>
19462
+ </header>
19463
+ <div class="tb__list" cdkDropList [cdkDropListData]="col.id" [cdkDropListDisabled]="dragDisabled()"
19464
+ (cdkDropListDropped)="onDrop($event, 'bucket')" [attr.aria-label]="col.label">
19465
+ @for (t of col.tasks; track t.id) {
19466
+ <article class="tb__card" cdkDrag [cdkDragData]="t.id" [cdkDragDisabled]="dragDisabled() || t.locked"
19467
+ tabindex="0" role="button" [attr.data-id]="t.id" [class.is-orphan]="isOrphan(t)"
19468
+ [attr.title]="isOrphan(t) ? orphanHint : null"
19469
+ (click)="open(t, $event)" (keydown)="onKey($event, t, col.id)">
19470
+ @if (cardTpl()) {
19471
+ <ng-container *ngTemplateOutlet="cardTpl()!.tpl; context: { $implicit: t, bucket: col.id }"/>
19472
+ } @else {
19473
+ <p class="tb__title">{{ t.label }}</p>
19474
+ @if (t.progress > 0) {<div class="tb__prog" [class.is-done]="t.progress >= 1"><i [style.width.%]="t.progress * 100"></i></div>}
19475
+ <div class="tb__meta">
19476
+ @for (g of t.tags; track g) {<span class="tb__tag">{{ g }}</span>}
19477
+ <span class="tb__sp"></span>
19478
+ @if (t.end) {<span class="tb__due" [class.is-late]="isLate(t)" title="Échéance">{{ due(t) }}</span>}
19479
+ @for (a of t.assignments; track a.resource) {
19480
+ <cad-avatar size="sm" [text]="initialsOfResource(a.resource)" [color]="colorOfResource(a.resource)" [title]="labelOfResource(a.resource)"/>
19481
+ }
19482
+ </div>
19483
+ }
19484
+ </article>
19485
+ } @empty {
19486
+ <p class="tb__empty">{{ emptyText() }}</p>
19487
+ }
19488
+ </div>
19489
+ </section>
19490
+ }
19491
+ </div>
19492
+ } @else {
19493
+ <div class="tb__rows" cdkDropListGroup>
19494
+ @for (col of columns(); track col.id) {
19495
+ <button type="button" class="tb__grp" [class.is-collapsed]="isCollapsed(col.id)"
19496
+ [attr.aria-expanded]="!isCollapsed(col.id)" (click)="toggle(col.id)">
19497
+ <cad-icon name="chevron-down" [size]="14"/>
19498
+ <span class="tb__dot" [style.--_c]="col.color"></span>
19499
+ <b>{{ col.label }}</b>
19500
+ <span class="tb__sp"></span>
19501
+ <span class="tb__count" [class.is-full]="wipState(col) === 'full'" [class.is-over]="wipState(col) === 'over'">{{ countOf(col) }}</span>
19502
+ </button>
19503
+ @if (!isCollapsed(col.id)) {
19504
+ <div class="tb__group-list" cdkDropList [cdkDropListData]="col.id" [cdkDropListDisabled]="dragDisabled()"
19505
+ (cdkDropListDropped)="onDrop($event, groupBy())" [attr.aria-label]="col.label">
19506
+ @for (t of col.tasks; track t.id) {
19507
+ <div class="tb__row" cdkDrag [cdkDragData]="t.id" [cdkDragDisabled]="dragDisabled() || t.locked"
19508
+ tabindex="0" role="button" [attr.data-id]="t.id" [class.is-orphan]="isOrphan(t)"
19509
+ [attr.title]="isOrphan(t) ? orphanHint : null"
19510
+ (click)="open(t, $event)" (keydown)="onKey($event, t, col.id)">
19511
+ @if (rowTpl()) {
19512
+ <ng-container *ngTemplateOutlet="rowTpl()!.tpl; context: { $implicit: t, group: col.id }"/>
19513
+ } @else {
19514
+ <div class="tb__main">
19515
+ <span class="tb__title">{{ t.label }}</span>
19516
+ <div class="tb__meta">
19517
+ @for (g of t.tags; track g) {<span class="tb__tag">{{ g }}</span>}
19518
+ @if (t.end) {<span class="tb__mob tb__due" [class.is-late]="isLate(t)">{{ due(t) }}</span>}
19519
+ </div>
19520
+ </div>
19521
+ <span class="tb__due tb__cell-due" [class.is-late]="isLate(t)">{{ t.end ? due(t) : '—' }}</span>
19522
+ <div class="tb__pct">
19523
+ <div class="tb__prog" [class.is-done]="t.progress >= 1"><i [style.width.%]="t.progress * 100"></i></div>
19524
+ <span>{{ pct(t) }}%</span>
19525
+ </div>
19526
+ @if (t.assignments.length) {
19527
+ <cad-avatar size="sm" [text]="initialsOfResource(t.assignments[0].resource)"
19528
+ [color]="colorOfResource(t.assignments[0].resource)" [title]="labelOfResource(t.assignments[0].resource)"/>
19529
+ } @else {<span class="tb__due">—</span>}
19530
+ }
19531
+ </div>
19532
+ } @empty {
19533
+ <p class="tb__empty" style="margin: 10px 14px">{{ emptyText() }}</p>
19534
+ }
19535
+ </div>
19536
+ }
19537
+ }
19538
+ </div>
19539
+ }
19540
+ `, styles: [":host{display:flex;flex-direction:column;min-height:0;height:100%;font:var(--cad-font-size)/1.35 var(--cad-font);color:var(--cad-fg);background:var(--cad-bg)}.tb__board{flex:1;min-height:0;display:flex;gap:12px;padding:12px;overflow-x:auto;overflow-y:hidden;scrollbar-gutter:stable}.tb__col{flex:0 0 var(--cad-taskboard-col, 258px);display:flex;flex-direction:column;min-height:0;background:var(--cad-bg-subtle);border:1px solid var(--cad-border);border-radius:var(--cad-radius)}.tb__head{display:flex;align-items:center;gap:8px;padding:9px 11px;border-bottom:1px solid var(--cad-border)}.tb__dot{width:8px;height:8px;border-radius:50%;flex:none;background:var(--_c, var(--cad-border-strong))}.tb__name{font-weight:500;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb__count{font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm);padding:2px 7px;border-radius:var(--cad-radius-pill);background:var(--cad-elevated);color:var(--cad-fg-muted);font-variant-numeric:tabular-nums;white-space:nowrap}.tb__count.is-full{background:var(--cad-warning-soft);color:var(--cad-warning)}.tb__count.is-over{background:var(--cad-danger-soft);color:var(--cad-danger);font-weight:500}.tb__list{flex:1;min-height:0;overflow-y:auto;padding:8px;display:flex;flex-direction:column;gap:8px;scrollbar-gutter:stable}.tb__list.cdk-drop-list-dragging{background:var(--cad-accent-soft)}.tb__card{background:var(--cad-surface);border:1px solid var(--cad-border);border-radius:var(--cad-radius-sm);padding:9px 10px;box-shadow:var(--cad-shadow-sm);display:flex;flex-direction:column;gap:7px;cursor:grab;-webkit-user-select:none;user-select:none;transition:border-color var(--cad-dur) var(--cad-ease),box-shadow var(--cad-dur) var(--cad-ease)}.tb__card:hover{border-color:var(--cad-border-strong);box-shadow:var(--cad-shadow-md)}.tb__card:focus-visible{outline:2px solid var(--cad-ring);outline-offset:1px}.tb__card.is-orphan{border-left:2px dashed var(--cad-warning)}:host(.is-static) .tb__card,:host(.is-static) .tb__row{cursor:default}.tb__title{font-weight:500;line-height:1.32}.tb__meta{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.tb__tag{font-family:var(--cad-font-mono);font-size:10px;padding:2px 6px;border-radius:var(--cad-radius-sm);background:var(--cad-elevated);color:var(--cad-fg-secondary)}.tb__due{font-family:var(--cad-font-mono);font-size:var(--cad-font-size-sm);color:var(--cad-fg-muted);font-variant-numeric:tabular-nums}.tb__due.is-late{color:var(--cad-danger);font-weight:500}.tb__sp{flex:1 1 auto}.tb__prog{height:3px;border-radius:var(--cad-radius-pill);background:var(--cad-elevated);overflow:hidden}.tb__prog i{display:block;height:100%;border-radius:var(--cad-radius-pill);background:var(--cad-accent)}.tb__prog.is-done i{background:var(--cad-success)}.tb__empty{padding:14px 10px;text-align:center;color:var(--cad-fg-muted);font-size:var(--cad-font-size-sm);border:1px dashed var(--cad-border-strong);border-radius:var(--cad-radius-sm)}.tb__rows{flex:1;min-height:0;overflow-y:auto;padding-bottom:12px;scrollbar-gutter:stable}.tb__grp{display:flex;align-items:center;gap:8px;width:100%;padding:8px 14px;background:var(--cad-bg-subtle);border-top:1px solid var(--cad-border);border-bottom:1px solid var(--cad-border);position:sticky;top:0;z-index:1;cursor:pointer;text-align:left;font:inherit;color:inherit}.tb__grp:hover{background:var(--cad-hover)}.tb__grp:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-2px}.tb__grp cad-icon{color:var(--cad-fg-muted);transition:transform var(--cad-dur) var(--cad-ease)}.tb__grp.is-collapsed cad-icon{transform:rotate(-90deg)}.tb__grp b{font-weight:500}.tb__group-list{display:block}.tb__row{display:grid;grid-template-columns:1fr 92px 88px 26px;align-items:center;gap:12px;padding:8px 14px;border-bottom:1px solid var(--cad-border);cursor:grab;-webkit-user-select:none;user-select:none;background:var(--cad-bg)}.tb__row:hover{background:var(--cad-hover)}.tb__row:focus-visible{outline:2px solid var(--cad-ring);outline-offset:-2px}.tb__row.is-orphan{box-shadow:inset 2px 0 0 var(--cad-warning)}.tb__main{min-width:0;display:flex;flex-direction:column;gap:4px}.tb__main .tb__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb__pct{display:flex;align-items:center;gap:7px}.tb__pct .tb__prog{flex:1}.tb__pct span{font-family:var(--cad-font-mono);font-size:10px;color:var(--cad-fg-muted);font-variant-numeric:tabular-nums}:host(.is-compact) .tb__row{grid-template-columns:1fr 26px}:host(.is-compact) .tb__cell-due,:host(.is-compact) .tb__pct{display:none}:host(.is-compact) .tb__mob{display:inline-flex}.tb__mob{display:none;align-items:center;gap:7px}.cdk-drag-preview{box-shadow:var(--cad-shadow-lg);border-radius:var(--cad-radius-sm);background:var(--cad-overlay);--cad-hover: var(--cad-overlay-hover);border:1px solid var(--cad-border)}.cdk-drag-placeholder{opacity:.34}.cdk-drag-animating{transition:transform .18s var(--cad-ease)}.tb__list.cdk-drop-list-dragging .tb__card:not(.cdk-drag-placeholder),.tb__group-list.cdk-drop-list-dragging .tb__row:not(.cdk-drag-placeholder){transition:transform .18s var(--cad-ease)}.tb__live{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}@media(prefers-reduced-motion:reduce){.cdk-drag-animating,.tb__list.cdk-drop-list-dragging .tb__card,.tb__grp cad-icon{transition:none}}\n"] }]
19541
+ }], propDecorators: { plan: [{ type: i0.Input, args: [{ isSignal: true, alias: "plan", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], groupBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupBy", required: false }] }], dragDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "dragDisabled", required: false }] }], collapsedKeys: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedKeys", required: false }] }, { type: i0.Output, args: ["collapsedKeysChange"] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], dateFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFormat", required: false }] }], today: [{ type: i0.Input, args: [{ isSignal: true, alias: "today", required: false }] }], taskMove: [{ type: i0.Output, args: ["taskMove"] }], taskAssign: [{ type: i0.Output, args: ["taskAssign"] }], taskOpen: [{ type: i0.Output, args: ["taskOpen"] }], wipExceeded: [{ type: i0.Output, args: ["wipExceeded"] }], cardTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CadTaskCardDirective), { isSignal: true }] }], rowTpl: [{ type: i0.ContentChild, args: [i0.forwardRef(() => CadTaskRowDirective), { isSignal: true }] }] } });
19542
+
18099
19543
  /**
18100
19544
  * Generated bundle index. Do not edit.
18101
19545
  */
18102
19546
 
18103
- 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 };
19547
+ 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, 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, addDays, addMonths, addYears, cadAggregate, cadApplyColumnOrder, cadApplyMask, cadArea, cadAutosizeWidth, cadBasemapThumbnail, cadBoundsOf, cadCategories, cadCentroid, cadColorExpr, cadCompare, cadCompareRank, cadCurrentOperator, cadDefaultMatchMode, cadDistance, cadDownloadCsv, cadDurationToMinutes, 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, cadMoveColumn, cadMoveItems, cadNormalize, cadNormalizeOptions, cadNormalizePlan, cadNumberExpr, cadPadBounds, cadParseColor, cadParseDuration, cadParseResponsive, cadPlanHeader, cadPlanTicks, cadPropsTable, cadRankBetween, cadRankFirst, cadRankLast, cadRankSequence, cadResolve, cadResolveResponsive, cadResponsive, cadRgbToHsl, cadRgbToHsv, cadRingArea, cadRowKey, cadRowPredicate, cadSameValue, cadScaleNext, cadScaleStart, cadSortData, cadStartResize, cadStyleToExpressions, cadUnmask, cadUnscheduled, 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 };
18104
19548
  //# sourceMappingURL=cadriciel-ui.mjs.map