@kksdev/ds-angular 1.7.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9595,7 +9595,7 @@ class DsTimePickerPanelComponent {
9595
9595
  const val = this.value();
9596
9596
  const fmt = this.format();
9597
9597
  this.parseAndSetValue(val, fmt);
9598
- }, { allowSignalWrites: true });
9598
+ });
9599
9599
  }
9600
9600
  ngAfterViewInit() {
9601
9601
  this.initialized = true;
@@ -10494,10 +10494,12 @@ class DsTreeNodeComponent {
10494
10494
  }, ...(ngDevMode ? [{ debugName: "isIndeterminate" }] : []));
10495
10495
  nodeIcon = computed(() => {
10496
10496
  const node = this.node();
10497
- // Custom icon
10497
+ // Custom icon with optional expanded variant
10498
10498
  if (node.icon) {
10499
- // TODO: support custom icons
10500
- return this.fileIcon;
10499
+ if (this.hasChildren() && this.isExpanded() && node.expandedIcon) {
10500
+ return node.expandedIcon;
10501
+ }
10502
+ return node.icon;
10501
10503
  }
10502
10504
  // Default folder/file icons
10503
10505
  if (this.hasChildren()) {
@@ -12023,11 +12025,11 @@ class DsCalendar {
12023
12025
  effect(() => {
12024
12026
  const value = this.value();
12025
12027
  this.displayDate.set(new Date(value));
12026
- }, { allowSignalWrites: true });
12028
+ });
12027
12029
  // Synchroniser currentMode avec mode
12028
12030
  effect(() => {
12029
12031
  this.currentMode.set(this.mode());
12030
- }, { allowSignalWrites: true });
12032
+ });
12031
12033
  }
12032
12034
  // =========================================================================
12033
12035
  // MÉTHODES PUBLIQUES
@@ -14987,11 +14989,11 @@ class DsSidebar {
14987
14989
  }
14988
14990
  }
14989
14991
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
14990
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsSidebar, isStandalone: true, selector: "ds-sidebar", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, responsiveBreakpoint: { classPropertyName: "responsiveBreakpoint", publicName: "responsiveBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, autoCollapseOnMobile: { classPropertyName: "autoCollapseOnMobile", publicName: "autoCollapseOnMobile", isSignal: true, isRequired: false, transformFunction: null }, showTooltips: { classPropertyName: "showTooltips", publicName: "showTooltips", isSignal: true, isRequired: false, transformFunction: null }, collapsedTrigger: { classPropertyName: "collapsedTrigger", publicName: "collapsedTrigger", isSignal: true, isRequired: false, transformFunction: null }, initialActiveItemId: { classPropertyName: "initialActiveItemId", publicName: "initialActiveItemId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", itemExpand: "itemExpand", modeChange: "modeChange", overlayOpened: "overlayOpened", overlayClosed: "overlayClosed" }, viewQueries: [{ propertyName: "sidebarContainer", first: true, predicate: ["sidebarContainer"], descendants: true }, { propertyName: "itemComponents", predicate: DsSidebarItemComponent, descendants: true }], ngImport: i0, template: "<!-- Backdrop (mode overlay) -->\n@if (internalMode() === 'overlay' && isOverlayOpen()) {\n <div\n class=\"ds-sidebar__backdrop\"\n (click)=\"handleBackdropClick()\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Sidebar container -->\n<nav\n #sidebarContainer\n [class]=\"containerClasses()\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"navigation\"\n (keydown)=\"handleKeyDown($event)\">\n\n <!-- Header -->\n <div class=\"ds-sidebar__header\">\n <ng-content select=\"[sidebar-header]\"></ng-content>\n\n <!-- Toggle button -->\n @if (collapsible() && internalMode() !== 'overlay') {\n <button\n type=\"button\"\n class=\"ds-sidebar__toggle-btn\"\n [attr.aria-label]=\"internalMode() === 'collapsed' ? 'D\u00E9velopper la sidebar' : 'R\u00E9duire la sidebar'\"\n [attr.aria-expanded]=\"internalMode() === 'full'\"\n (click)=\"toggleMode()\">\n <fa-icon [icon]=\"internalMode() === 'collapsed' ? expandIcon : collapseIcon\" />\n </button>\n }\n\n <!-- Close button (overlay mode) -->\n @if (internalMode() === 'overlay' && isOverlayOpen()) {\n <button\n type=\"button\"\n class=\"ds-sidebar__close-btn\"\n aria-label=\"Fermer le menu\"\n (click)=\"closeOverlay()\">\n <fa-icon [icon]=\"collapseIcon\" />\n </button>\n }\n </div>\n\n <!-- Body (items) -->\n <div class=\"ds-sidebar__body\" role=\"menubar\" aria-orientation=\"vertical\">\n @for (item of items(); track item.id) {\n <ds-sidebar-item\n [item]=\"item\"\n [level]=\"0\"\n [mode]=\"internalMode()\"\n [showTooltip]=\"showTooltips()\"\n [sidebarPosition]=\"position()\"\n [collapsedTrigger]=\"collapsedTrigger()\"\n [expandedItemIds]=\"expandedItemIds()\"\n [activeItemId]=\"activeItemId()\"\n (itemClick)=\"handleItemClick($event)\"\n (itemToggle)=\"handleItemToggle($event)\"\n (itemKeydown)=\"handleItemKeydown($event)\" />\n }\n </div>\n\n <!-- Footer -->\n <div class=\"ds-sidebar__footer\">\n <ng-content select=\"[sidebar-footer]\"></ng-content>\n </div>\n</nav>\n\n<!-- Bouton expand (mode collapsed uniquement) - \u00E0 l'ext\u00E9rieur du nav pour \u00E9viter overflow:hidden -->\n@if (collapsible() && internalMode() === 'collapsed') {\n <button\n type=\"button\"\n class=\"ds-sidebar__expand-btn\"\n [class.ds-sidebar__expand-btn--left]=\"position() === 'right'\"\n aria-label=\"D\u00E9velopper la sidebar\"\n (click)=\"toggleMode()\">\n <fa-icon [icon]=\"expandIcon\" />\n </button>\n}\n\n<!-- Trigger button (overlay mode, quand ferm\u00E9) -->\n@if (internalMode() === 'overlay' && !isOverlayOpen()) {\n <button\n type=\"button\"\n class=\"ds-sidebar__trigger\"\n [class.ds-sidebar__trigger--left]=\"position() === 'left'\"\n [class.ds-sidebar__trigger--right]=\"position() === 'right'\"\n aria-label=\"Ouvrir le menu\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"isOverlayOpen()\"\n (click)=\"openOverlay()\">\n <fa-icon [icon]=\"menuIcon\" />\n </button>\n}\n", styles: [":host{display:flex;position:relative;height:100%}.ds-sidebar__backdrop{position:fixed;inset:0;background:var(--sidebar-backdrop-bg, rgba(0, 0, 0, .5));z-index:var(--z-index-full, 9999);opacity:0;animation:fadeIn var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease forwards}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.ds-sidebar{display:flex;flex-direction:column;height:100%;position:relative;overflow:hidden;background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));transition:width var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease,transform var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease}.ds-sidebar--left{border-right:1px solid var(--sidebar-border, var(--border-default, #e5e7eb))}.ds-sidebar--right{border-left:1px solid var(--sidebar-border, var(--border-default, #e5e7eb))}.ds-sidebar--full{width:var(--sidebar-width-md, 240px)}.ds-sidebar--full.ds-sidebar--sm{width:var(--sidebar-width-sm, 200px)}.ds-sidebar--full.ds-sidebar--lg{width:var(--sidebar-width-lg, 280px)}.ds-sidebar--collapsed{width:var(--sidebar-width-collapsed, 64px)}.ds-sidebar--collapsed .ds-sidebar__header,.ds-sidebar--collapsed .ds-sidebar__footer{padding:var(--space-2, .5rem);justify-content:center}.ds-sidebar--collapsed .ds-sidebar__toggle-btn{display:none}.ds-sidebar--overlay{position:fixed;top:0;bottom:0;z-index:var(--z-index-full, 9999);box-shadow:var(--sidebar-shadow, var(--shadow-3, 0 10px 25px rgba(0, 0, 0, .1)));transform:translate(-100%)}.ds-sidebar--overlay.ds-sidebar--left{left:0}.ds-sidebar--overlay.ds-sidebar--right{right:0;transform:translate(100%)}.ds-sidebar--overlay.ds-sidebar--overlay-open{transform:translate(0)}.ds-sidebar--overlay{width:var(--sidebar-width-md, 240px)}.ds-sidebar--overlay.ds-sidebar--sm{width:var(--sidebar-width-sm, 200px)}.ds-sidebar--overlay.ds-sidebar--lg{width:var(--sidebar-width-lg, 280px)}.ds-sidebar__header{display:flex;align-items:center;justify-content:space-between;padding:var(--sidebar-header-padding, var(--space-4, 1rem));border-bottom:1px solid var(--sidebar-border, var(--border-default, #e5e7eb));flex-shrink:0;min-height:60px;position:relative;z-index:1}:host ::ng-deep .ds-sidebar__header img{max-height:32px;width:auto}:host ::ng-deep .ds-sidebar__header h1,:host ::ng-deep .ds-sidebar__header h2,:host ::ng-deep .ds-sidebar__header h3{margin:0;font-size:var(--font-size-lg, 1.125rem);font-weight:600}.ds-sidebar__header .ds-sidebar-logo{max-height:32px;width:auto}.ds-sidebar__header .ds-sidebar-title{margin:0;font-size:var(--font-size-lg, 1.125rem);font-weight:600}.ds-sidebar__toggle-btn,.ds-sidebar__close-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:var(--sidebar-item-radius, var(--radius-1-5, 6px));background:transparent;color:var(--sidebar-text, var(--text-default, #1f2937));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease;flex-shrink:0}.ds-sidebar__toggle-btn:hover,.ds-sidebar__close-btn:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__toggle-btn:focus-visible,.ds-sidebar__close-btn:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__body{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--sidebar-body-padding, var(--space-2, .5rem))}.ds-sidebar__body::-webkit-scrollbar{width:6px}.ds-sidebar__body::-webkit-scrollbar-track{background:transparent}.ds-sidebar__body::-webkit-scrollbar-thumb{background:var(--sidebar-scrollbar-thumb, var(--gray-300, #d1d5db));border-radius:3px}.ds-sidebar__body::-webkit-scrollbar-thumb:hover{background:var(--sidebar-scrollbar-thumb-hover, var(--gray-400, #9ca3af))}.ds-sidebar__footer{padding:var(--sidebar-footer-padding, var(--space-4, 1rem));border-top:1px solid var(--sidebar-border, var(--border-default, #e5e7eb));flex-shrink:0}.ds-sidebar__footer:empty{display:none}:host ::ng-deep .ds-sidebar__footer button{width:100%}.ds-sidebar__footer .ds-sidebar-footer-btn{width:100%}.ds-sidebar__trigger{position:fixed;top:var(--space-4, 1rem);z-index:var(--z-index-3, 998);display:flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border:none;border-radius:var(--radius-2, 8px);background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));box-shadow:var(--sidebar-trigger-shadow, var(--shadow-2, 0 4px 12px rgba(0, 0, 0, .1)));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,transform var(--duration-fast, .15s) ease}.ds-sidebar__trigger--left{left:var(--space-4, 1rem)}.ds-sidebar__trigger--right{right:var(--space-4, 1rem)}.ds-sidebar__trigger:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__trigger:active{transform:scale(.95)}.ds-sidebar__trigger:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__expand-btn{position:absolute;top:50%;left:var(--sidebar-width-collapsed, 64px);transform:translateY(-50%) translate(-50%);display:flex;align-items:center;justify-content:center;width:24px;height:48px;padding:0;border:none;border-radius:0 var(--sidebar-item-radius, var(--radius-1-5, 6px)) var(--sidebar-item-radius, var(--radius-1-5, 6px)) 0;background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));cursor:pointer;box-shadow:var(--shadow-2, 0 4px 12px rgba(0, 0, 0, .1));z-index:2;transition:background-color var(--duration-fast, .15s) ease}.ds-sidebar__expand-btn:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__expand-btn:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__expand-btn--left{left:auto;right:var(--sidebar-width-collapsed, 64px);transform:translateY(-50%) translate(50%);border-radius:var(--sidebar-item-radius, var(--radius-1-5, 6px)) 0 0 var(--sidebar-item-radius, var(--radius-1-5, 6px))}:host-context(.theme-dark) .ds-sidebar{background:var(--sidebar-bg, var(--surface-default));color:var(--sidebar-text, var(--text-default))}:host-context(.theme-dark) .ds-sidebar__backdrop{background:var(--sidebar-backdrop-bg, rgba(0, 0, 0, .7))}:host-context(.theme-dark) .ds-sidebar__trigger,:host-context(.theme-dark) .ds-sidebar__expand-btn{background:var(--sidebar-bg, var(--surface-default));color:var(--sidebar-text, var(--text-default))}@keyframes slideInLeft{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}@media print{.ds-sidebar,.ds-sidebar__backdrop,.ds-sidebar__trigger{display:none!important}}::ng-deep .ds-sidebar-popover-backdrop{background:transparent}::ng-deep .ds-sidebar-popover-panel{z-index:var(--z-index-3, 1000)}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .ds-sidebar-logo-text,:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .logo-text{display:none}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .ds-sidebar-logo-icon,:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .logo-icon{margin:0 auto}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .sidebar-logo{padding:0;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "component", type: DsSidebarItemComponent, selector: "ds-sidebar-item", inputs: ["item", "level", "mode", "showTooltip", "expandedItemIds", "activeItemId", "sidebarPosition", "collapsedTrigger"], outputs: ["itemClick", "itemToggle", "itemKeydown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14992
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsSidebar, isStandalone: true, selector: "ds-sidebar", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, responsiveBreakpoint: { classPropertyName: "responsiveBreakpoint", publicName: "responsiveBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, autoCollapseOnMobile: { classPropertyName: "autoCollapseOnMobile", publicName: "autoCollapseOnMobile", isSignal: true, isRequired: false, transformFunction: null }, showTooltips: { classPropertyName: "showTooltips", publicName: "showTooltips", isSignal: true, isRequired: false, transformFunction: null }, collapsedTrigger: { classPropertyName: "collapsedTrigger", publicName: "collapsedTrigger", isSignal: true, isRequired: false, transformFunction: null }, initialActiveItemId: { classPropertyName: "initialActiveItemId", publicName: "initialActiveItemId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick", itemExpand: "itemExpand", modeChange: "modeChange", overlayOpened: "overlayOpened", overlayClosed: "overlayClosed" }, viewQueries: [{ propertyName: "sidebarContainer", first: true, predicate: ["sidebarContainer"], descendants: true }, { propertyName: "itemComponents", predicate: DsSidebarItemComponent, descendants: true }], ngImport: i0, template: "<!-- Backdrop (mode overlay) -->\n@if (internalMode() === 'overlay' && isOverlayOpen()) {\n <div\n class=\"ds-sidebar__backdrop\"\n (click)=\"handleBackdropClick()\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Sidebar container -->\n<nav\n #sidebarContainer\n [class]=\"containerClasses()\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"navigation\"\n (keydown)=\"handleKeyDown($event)\">\n\n <!-- Header -->\n <div class=\"ds-sidebar__header\">\n <ng-content select=\"[sidebar-header]\"></ng-content>\n\n <!-- Toggle button -->\n @if (collapsible() && internalMode() !== 'overlay') {\n <button\n type=\"button\"\n class=\"ds-sidebar__toggle-btn\"\n [attr.aria-label]=\"internalMode() === 'collapsed' ? 'D\u00E9velopper la sidebar' : 'R\u00E9duire la sidebar'\"\n [attr.aria-expanded]=\"internalMode() === 'full'\"\n (click)=\"toggleMode()\">\n <fa-icon [icon]=\"internalMode() === 'collapsed' ? expandIcon : collapseIcon\" />\n </button>\n }\n\n <!-- Close button (overlay mode) -->\n @if (internalMode() === 'overlay' && isOverlayOpen()) {\n <button\n type=\"button\"\n class=\"ds-sidebar__close-btn\"\n aria-label=\"Fermer le menu\"\n (click)=\"closeOverlay()\">\n <fa-icon [icon]=\"collapseIcon\" />\n </button>\n }\n </div>\n\n <!-- Body (items) -->\n <div class=\"ds-sidebar__body\" role=\"menubar\" aria-orientation=\"vertical\">\n @for (item of items(); track item.id) {\n <ds-sidebar-item\n [item]=\"item\"\n [level]=\"0\"\n [mode]=\"internalMode()\"\n [showTooltip]=\"showTooltips()\"\n [sidebarPosition]=\"position()\"\n [collapsedTrigger]=\"collapsedTrigger()\"\n [expandedItemIds]=\"expandedItemIds()\"\n [activeItemId]=\"activeItemId()\"\n (itemClick)=\"handleItemClick($event)\"\n (itemToggle)=\"handleItemToggle($event)\"\n (itemKeydown)=\"handleItemKeydown($event)\" />\n }\n </div>\n\n <!-- Footer -->\n <div class=\"ds-sidebar__footer\">\n <ng-content select=\"[sidebar-footer]\"></ng-content>\n </div>\n</nav>\n\n<!-- Bouton expand (mode collapsed uniquement) - \u00E0 l'ext\u00E9rieur du nav pour \u00E9viter overflow:hidden -->\n@if (collapsible() && internalMode() === 'collapsed') {\n <button\n type=\"button\"\n class=\"ds-sidebar__expand-btn\"\n [class.ds-sidebar__expand-btn--left]=\"position() === 'right'\"\n aria-label=\"D\u00E9velopper la sidebar\"\n (click)=\"toggleMode()\">\n <fa-icon [icon]=\"expandIcon\" />\n </button>\n}\n\n<!-- Trigger button (overlay mode, quand ferm\u00E9) -->\n@if (internalMode() === 'overlay' && !isOverlayOpen()) {\n <button\n type=\"button\"\n class=\"ds-sidebar__trigger\"\n [class.ds-sidebar__trigger--left]=\"position() === 'left'\"\n [class.ds-sidebar__trigger--right]=\"position() === 'right'\"\n aria-label=\"Ouvrir le menu\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"isOverlayOpen()\"\n (click)=\"openOverlay()\">\n <fa-icon [icon]=\"menuIcon\" />\n </button>\n}\n", styles: [":host{display:flex;position:relative;height:100%}.ds-sidebar__backdrop{position:fixed;inset:0;background:var(--sidebar-backdrop-bg, rgba(0, 0, 0, .5));z-index:var(--z-index-full, 9999);opacity:0;animation:fadeIn var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease forwards}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.ds-sidebar{display:flex;flex-direction:column;height:100%;position:relative;overflow:hidden;background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));transition:width var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease,transform var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease}.ds-sidebar--left{border-right:1px solid var(--sidebar-border, var(--border-default, #e5e7eb))}.ds-sidebar--right{border-left:1px solid var(--sidebar-border, var(--border-default, #e5e7eb))}.ds-sidebar--full{width:var(--sidebar-width-md, 240px)}.ds-sidebar--full.ds-sidebar--sm{width:var(--sidebar-width-sm, 200px)}.ds-sidebar--full.ds-sidebar--lg{width:var(--sidebar-width-lg, 280px)}.ds-sidebar--collapsed{width:var(--sidebar-width-collapsed, 64px)}.ds-sidebar--collapsed .ds-sidebar__header,.ds-sidebar--collapsed .ds-sidebar__footer{padding:var(--space-2, .5rem);justify-content:center}.ds-sidebar--collapsed .ds-sidebar__toggle-btn{display:none}.ds-sidebar--overlay{position:fixed;top:0;bottom:0;z-index:var(--z-index-full, 9999);box-shadow:var(--sidebar-shadow, var(--shadow-3, 0 10px 25px rgba(0, 0, 0, .1)));transform:translate(-100%);width:var(--sidebar-width-md, 240px)}.ds-sidebar--overlay.ds-sidebar--left{left:0}.ds-sidebar--overlay.ds-sidebar--right{right:0;transform:translate(100%)}.ds-sidebar--overlay.ds-sidebar--overlay-open{transform:translate(0)}.ds-sidebar--overlay.ds-sidebar--sm{width:var(--sidebar-width-sm, 200px)}.ds-sidebar--overlay.ds-sidebar--lg{width:var(--sidebar-width-lg, 280px)}.ds-sidebar__header{display:flex;align-items:center;justify-content:space-between;padding:var(--sidebar-header-padding, var(--space-4, 1rem));border-bottom:1px solid var(--sidebar-border, var(--border-default, #e5e7eb));flex-shrink:0;min-height:60px;position:relative;z-index:1}:host ::ng-deep .ds-sidebar__header img{max-height:32px;width:auto}:host ::ng-deep .ds-sidebar__header h1,:host ::ng-deep .ds-sidebar__header h2,:host ::ng-deep .ds-sidebar__header h3{margin:0;font-size:var(--font-size-lg, 1.125rem);font-weight:600}.ds-sidebar__header .ds-sidebar-logo{max-height:32px;width:auto}.ds-sidebar__header .ds-sidebar-title{margin:0;font-size:var(--font-size-lg, 1.125rem);font-weight:600}.ds-sidebar__toggle-btn,.ds-sidebar__close-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:var(--sidebar-item-radius, var(--radius-1-5, 6px));background:transparent;color:var(--sidebar-text, var(--text-default, #1f2937));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease;flex-shrink:0}.ds-sidebar__toggle-btn:hover,.ds-sidebar__close-btn:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__toggle-btn:focus-visible,.ds-sidebar__close-btn:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__body{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--sidebar-body-padding, var(--space-2, .5rem))}.ds-sidebar__body::-webkit-scrollbar{width:6px}.ds-sidebar__body::-webkit-scrollbar-track{background:transparent}.ds-sidebar__body::-webkit-scrollbar-thumb{background:var(--sidebar-scrollbar-thumb, var(--gray-300, #d1d5db));border-radius:3px}.ds-sidebar__body::-webkit-scrollbar-thumb:hover{background:var(--sidebar-scrollbar-thumb-hover, var(--gray-400, #9ca3af))}.ds-sidebar__footer{padding:var(--sidebar-footer-padding, var(--space-4, 1rem));border-top:1px solid var(--sidebar-border, var(--border-default, #e5e7eb));flex-shrink:0}.ds-sidebar__footer:empty{display:none}:host ::ng-deep .ds-sidebar__footer button{width:100%}.ds-sidebar__footer .ds-sidebar-footer-btn{width:100%}.ds-sidebar__trigger{position:fixed;top:var(--space-4, 1rem);z-index:var(--z-index-3, 998);display:flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border:none;border-radius:var(--radius-2, 8px);background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));box-shadow:var(--sidebar-trigger-shadow, var(--shadow-2, 0 4px 12px rgba(0, 0, 0, .1)));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,transform var(--duration-fast, .15s) ease}.ds-sidebar__trigger--left{left:var(--space-4, 1rem)}.ds-sidebar__trigger--right{right:var(--space-4, 1rem)}.ds-sidebar__trigger:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__trigger:active{transform:scale(.95)}.ds-sidebar__trigger:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__expand-btn{position:absolute;top:50%;left:var(--sidebar-width-collapsed, 64px);transform:translateY(-50%) translate(-50%);display:flex;align-items:center;justify-content:center;width:24px;height:48px;padding:0;border:none;border-radius:0 var(--sidebar-item-radius, var(--radius-1-5, 6px)) var(--sidebar-item-radius, var(--radius-1-5, 6px)) 0;background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));cursor:pointer;box-shadow:var(--shadow-2, 0 4px 12px rgba(0, 0, 0, .1));z-index:2;transition:background-color var(--duration-fast, .15s) ease}.ds-sidebar__expand-btn:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__expand-btn:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__expand-btn--left{left:auto;right:var(--sidebar-width-collapsed, 64px);transform:translateY(-50%) translate(50%);border-radius:var(--sidebar-item-radius, var(--radius-1-5, 6px)) 0 0 var(--sidebar-item-radius, var(--radius-1-5, 6px))}:host-context(.theme-dark) .ds-sidebar{background:var(--sidebar-bg, var(--surface-default));color:var(--sidebar-text, var(--text-default))}:host-context(.theme-dark) .ds-sidebar__backdrop{background:var(--sidebar-backdrop-bg, rgba(0, 0, 0, .7))}:host-context(.theme-dark) .ds-sidebar__trigger,:host-context(.theme-dark) .ds-sidebar__expand-btn{background:var(--sidebar-bg, var(--surface-default));color:var(--sidebar-text, var(--text-default))}@keyframes slideInLeft{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}@media print{.ds-sidebar,.ds-sidebar__backdrop,.ds-sidebar__trigger{display:none!important}}::ng-deep .ds-sidebar-popover-backdrop{background:transparent}::ng-deep .ds-sidebar-popover-panel{z-index:var(--z-index-3, 1000)}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .ds-sidebar-logo-text,:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .logo-text{display:none}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .ds-sidebar-logo-icon,:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .logo-icon{margin:0 auto}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .sidebar-logo{padding:0;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "component", type: DsSidebarItemComponent, selector: "ds-sidebar-item", inputs: ["item", "level", "mode", "showTooltip", "expandedItemIds", "activeItemId", "sidebarPosition", "collapsedTrigger"], outputs: ["itemClick", "itemToggle", "itemKeydown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14991
14993
  }
14992
14994
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsSidebar, decorators: [{
14993
14995
  type: Component,
14994
- args: [{ selector: 'ds-sidebar', standalone: true, imports: [CommonModule, FontAwesomeModule, DsSidebarItemComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Backdrop (mode overlay) -->\n@if (internalMode() === 'overlay' && isOverlayOpen()) {\n <div\n class=\"ds-sidebar__backdrop\"\n (click)=\"handleBackdropClick()\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Sidebar container -->\n<nav\n #sidebarContainer\n [class]=\"containerClasses()\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"navigation\"\n (keydown)=\"handleKeyDown($event)\">\n\n <!-- Header -->\n <div class=\"ds-sidebar__header\">\n <ng-content select=\"[sidebar-header]\"></ng-content>\n\n <!-- Toggle button -->\n @if (collapsible() && internalMode() !== 'overlay') {\n <button\n type=\"button\"\n class=\"ds-sidebar__toggle-btn\"\n [attr.aria-label]=\"internalMode() === 'collapsed' ? 'D\u00E9velopper la sidebar' : 'R\u00E9duire la sidebar'\"\n [attr.aria-expanded]=\"internalMode() === 'full'\"\n (click)=\"toggleMode()\">\n <fa-icon [icon]=\"internalMode() === 'collapsed' ? expandIcon : collapseIcon\" />\n </button>\n }\n\n <!-- Close button (overlay mode) -->\n @if (internalMode() === 'overlay' && isOverlayOpen()) {\n <button\n type=\"button\"\n class=\"ds-sidebar__close-btn\"\n aria-label=\"Fermer le menu\"\n (click)=\"closeOverlay()\">\n <fa-icon [icon]=\"collapseIcon\" />\n </button>\n }\n </div>\n\n <!-- Body (items) -->\n <div class=\"ds-sidebar__body\" role=\"menubar\" aria-orientation=\"vertical\">\n @for (item of items(); track item.id) {\n <ds-sidebar-item\n [item]=\"item\"\n [level]=\"0\"\n [mode]=\"internalMode()\"\n [showTooltip]=\"showTooltips()\"\n [sidebarPosition]=\"position()\"\n [collapsedTrigger]=\"collapsedTrigger()\"\n [expandedItemIds]=\"expandedItemIds()\"\n [activeItemId]=\"activeItemId()\"\n (itemClick)=\"handleItemClick($event)\"\n (itemToggle)=\"handleItemToggle($event)\"\n (itemKeydown)=\"handleItemKeydown($event)\" />\n }\n </div>\n\n <!-- Footer -->\n <div class=\"ds-sidebar__footer\">\n <ng-content select=\"[sidebar-footer]\"></ng-content>\n </div>\n</nav>\n\n<!-- Bouton expand (mode collapsed uniquement) - \u00E0 l'ext\u00E9rieur du nav pour \u00E9viter overflow:hidden -->\n@if (collapsible() && internalMode() === 'collapsed') {\n <button\n type=\"button\"\n class=\"ds-sidebar__expand-btn\"\n [class.ds-sidebar__expand-btn--left]=\"position() === 'right'\"\n aria-label=\"D\u00E9velopper la sidebar\"\n (click)=\"toggleMode()\">\n <fa-icon [icon]=\"expandIcon\" />\n </button>\n}\n\n<!-- Trigger button (overlay mode, quand ferm\u00E9) -->\n@if (internalMode() === 'overlay' && !isOverlayOpen()) {\n <button\n type=\"button\"\n class=\"ds-sidebar__trigger\"\n [class.ds-sidebar__trigger--left]=\"position() === 'left'\"\n [class.ds-sidebar__trigger--right]=\"position() === 'right'\"\n aria-label=\"Ouvrir le menu\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"isOverlayOpen()\"\n (click)=\"openOverlay()\">\n <fa-icon [icon]=\"menuIcon\" />\n </button>\n}\n", styles: [":host{display:flex;position:relative;height:100%}.ds-sidebar__backdrop{position:fixed;inset:0;background:var(--sidebar-backdrop-bg, rgba(0, 0, 0, .5));z-index:var(--z-index-full, 9999);opacity:0;animation:fadeIn var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease forwards}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.ds-sidebar{display:flex;flex-direction:column;height:100%;position:relative;overflow:hidden;background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));transition:width var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease,transform var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease}.ds-sidebar--left{border-right:1px solid var(--sidebar-border, var(--border-default, #e5e7eb))}.ds-sidebar--right{border-left:1px solid var(--sidebar-border, var(--border-default, #e5e7eb))}.ds-sidebar--full{width:var(--sidebar-width-md, 240px)}.ds-sidebar--full.ds-sidebar--sm{width:var(--sidebar-width-sm, 200px)}.ds-sidebar--full.ds-sidebar--lg{width:var(--sidebar-width-lg, 280px)}.ds-sidebar--collapsed{width:var(--sidebar-width-collapsed, 64px)}.ds-sidebar--collapsed .ds-sidebar__header,.ds-sidebar--collapsed .ds-sidebar__footer{padding:var(--space-2, .5rem);justify-content:center}.ds-sidebar--collapsed .ds-sidebar__toggle-btn{display:none}.ds-sidebar--overlay{position:fixed;top:0;bottom:0;z-index:var(--z-index-full, 9999);box-shadow:var(--sidebar-shadow, var(--shadow-3, 0 10px 25px rgba(0, 0, 0, .1)));transform:translate(-100%)}.ds-sidebar--overlay.ds-sidebar--left{left:0}.ds-sidebar--overlay.ds-sidebar--right{right:0;transform:translate(100%)}.ds-sidebar--overlay.ds-sidebar--overlay-open{transform:translate(0)}.ds-sidebar--overlay{width:var(--sidebar-width-md, 240px)}.ds-sidebar--overlay.ds-sidebar--sm{width:var(--sidebar-width-sm, 200px)}.ds-sidebar--overlay.ds-sidebar--lg{width:var(--sidebar-width-lg, 280px)}.ds-sidebar__header{display:flex;align-items:center;justify-content:space-between;padding:var(--sidebar-header-padding, var(--space-4, 1rem));border-bottom:1px solid var(--sidebar-border, var(--border-default, #e5e7eb));flex-shrink:0;min-height:60px;position:relative;z-index:1}:host ::ng-deep .ds-sidebar__header img{max-height:32px;width:auto}:host ::ng-deep .ds-sidebar__header h1,:host ::ng-deep .ds-sidebar__header h2,:host ::ng-deep .ds-sidebar__header h3{margin:0;font-size:var(--font-size-lg, 1.125rem);font-weight:600}.ds-sidebar__header .ds-sidebar-logo{max-height:32px;width:auto}.ds-sidebar__header .ds-sidebar-title{margin:0;font-size:var(--font-size-lg, 1.125rem);font-weight:600}.ds-sidebar__toggle-btn,.ds-sidebar__close-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:var(--sidebar-item-radius, var(--radius-1-5, 6px));background:transparent;color:var(--sidebar-text, var(--text-default, #1f2937));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease;flex-shrink:0}.ds-sidebar__toggle-btn:hover,.ds-sidebar__close-btn:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__toggle-btn:focus-visible,.ds-sidebar__close-btn:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__body{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--sidebar-body-padding, var(--space-2, .5rem))}.ds-sidebar__body::-webkit-scrollbar{width:6px}.ds-sidebar__body::-webkit-scrollbar-track{background:transparent}.ds-sidebar__body::-webkit-scrollbar-thumb{background:var(--sidebar-scrollbar-thumb, var(--gray-300, #d1d5db));border-radius:3px}.ds-sidebar__body::-webkit-scrollbar-thumb:hover{background:var(--sidebar-scrollbar-thumb-hover, var(--gray-400, #9ca3af))}.ds-sidebar__footer{padding:var(--sidebar-footer-padding, var(--space-4, 1rem));border-top:1px solid var(--sidebar-border, var(--border-default, #e5e7eb));flex-shrink:0}.ds-sidebar__footer:empty{display:none}:host ::ng-deep .ds-sidebar__footer button{width:100%}.ds-sidebar__footer .ds-sidebar-footer-btn{width:100%}.ds-sidebar__trigger{position:fixed;top:var(--space-4, 1rem);z-index:var(--z-index-3, 998);display:flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border:none;border-radius:var(--radius-2, 8px);background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));box-shadow:var(--sidebar-trigger-shadow, var(--shadow-2, 0 4px 12px rgba(0, 0, 0, .1)));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,transform var(--duration-fast, .15s) ease}.ds-sidebar__trigger--left{left:var(--space-4, 1rem)}.ds-sidebar__trigger--right{right:var(--space-4, 1rem)}.ds-sidebar__trigger:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__trigger:active{transform:scale(.95)}.ds-sidebar__trigger:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__expand-btn{position:absolute;top:50%;left:var(--sidebar-width-collapsed, 64px);transform:translateY(-50%) translate(-50%);display:flex;align-items:center;justify-content:center;width:24px;height:48px;padding:0;border:none;border-radius:0 var(--sidebar-item-radius, var(--radius-1-5, 6px)) var(--sidebar-item-radius, var(--radius-1-5, 6px)) 0;background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));cursor:pointer;box-shadow:var(--shadow-2, 0 4px 12px rgba(0, 0, 0, .1));z-index:2;transition:background-color var(--duration-fast, .15s) ease}.ds-sidebar__expand-btn:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__expand-btn:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__expand-btn--left{left:auto;right:var(--sidebar-width-collapsed, 64px);transform:translateY(-50%) translate(50%);border-radius:var(--sidebar-item-radius, var(--radius-1-5, 6px)) 0 0 var(--sidebar-item-radius, var(--radius-1-5, 6px))}:host-context(.theme-dark) .ds-sidebar{background:var(--sidebar-bg, var(--surface-default));color:var(--sidebar-text, var(--text-default))}:host-context(.theme-dark) .ds-sidebar__backdrop{background:var(--sidebar-backdrop-bg, rgba(0, 0, 0, .7))}:host-context(.theme-dark) .ds-sidebar__trigger,:host-context(.theme-dark) .ds-sidebar__expand-btn{background:var(--sidebar-bg, var(--surface-default));color:var(--sidebar-text, var(--text-default))}@keyframes slideInLeft{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}@media print{.ds-sidebar,.ds-sidebar__backdrop,.ds-sidebar__trigger{display:none!important}}::ng-deep .ds-sidebar-popover-backdrop{background:transparent}::ng-deep .ds-sidebar-popover-panel{z-index:var(--z-index-3, 1000)}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .ds-sidebar-logo-text,:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .logo-text{display:none}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .ds-sidebar-logo-icon,:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .logo-icon{margin:0 auto}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .sidebar-logo{padding:0;justify-content:center}\n"] }]
14996
+ args: [{ selector: 'ds-sidebar', standalone: true, imports: [CommonModule, FontAwesomeModule, DsSidebarItemComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Backdrop (mode overlay) -->\n@if (internalMode() === 'overlay' && isOverlayOpen()) {\n <div\n class=\"ds-sidebar__backdrop\"\n (click)=\"handleBackdropClick()\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Sidebar container -->\n<nav\n #sidebarContainer\n [class]=\"containerClasses()\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"navigation\"\n (keydown)=\"handleKeyDown($event)\">\n\n <!-- Header -->\n <div class=\"ds-sidebar__header\">\n <ng-content select=\"[sidebar-header]\"></ng-content>\n\n <!-- Toggle button -->\n @if (collapsible() && internalMode() !== 'overlay') {\n <button\n type=\"button\"\n class=\"ds-sidebar__toggle-btn\"\n [attr.aria-label]=\"internalMode() === 'collapsed' ? 'D\u00E9velopper la sidebar' : 'R\u00E9duire la sidebar'\"\n [attr.aria-expanded]=\"internalMode() === 'full'\"\n (click)=\"toggleMode()\">\n <fa-icon [icon]=\"internalMode() === 'collapsed' ? expandIcon : collapseIcon\" />\n </button>\n }\n\n <!-- Close button (overlay mode) -->\n @if (internalMode() === 'overlay' && isOverlayOpen()) {\n <button\n type=\"button\"\n class=\"ds-sidebar__close-btn\"\n aria-label=\"Fermer le menu\"\n (click)=\"closeOverlay()\">\n <fa-icon [icon]=\"collapseIcon\" />\n </button>\n }\n </div>\n\n <!-- Body (items) -->\n <div class=\"ds-sidebar__body\" role=\"menubar\" aria-orientation=\"vertical\">\n @for (item of items(); track item.id) {\n <ds-sidebar-item\n [item]=\"item\"\n [level]=\"0\"\n [mode]=\"internalMode()\"\n [showTooltip]=\"showTooltips()\"\n [sidebarPosition]=\"position()\"\n [collapsedTrigger]=\"collapsedTrigger()\"\n [expandedItemIds]=\"expandedItemIds()\"\n [activeItemId]=\"activeItemId()\"\n (itemClick)=\"handleItemClick($event)\"\n (itemToggle)=\"handleItemToggle($event)\"\n (itemKeydown)=\"handleItemKeydown($event)\" />\n }\n </div>\n\n <!-- Footer -->\n <div class=\"ds-sidebar__footer\">\n <ng-content select=\"[sidebar-footer]\"></ng-content>\n </div>\n</nav>\n\n<!-- Bouton expand (mode collapsed uniquement) - \u00E0 l'ext\u00E9rieur du nav pour \u00E9viter overflow:hidden -->\n@if (collapsible() && internalMode() === 'collapsed') {\n <button\n type=\"button\"\n class=\"ds-sidebar__expand-btn\"\n [class.ds-sidebar__expand-btn--left]=\"position() === 'right'\"\n aria-label=\"D\u00E9velopper la sidebar\"\n (click)=\"toggleMode()\">\n <fa-icon [icon]=\"expandIcon\" />\n </button>\n}\n\n<!-- Trigger button (overlay mode, quand ferm\u00E9) -->\n@if (internalMode() === 'overlay' && !isOverlayOpen()) {\n <button\n type=\"button\"\n class=\"ds-sidebar__trigger\"\n [class.ds-sidebar__trigger--left]=\"position() === 'left'\"\n [class.ds-sidebar__trigger--right]=\"position() === 'right'\"\n aria-label=\"Ouvrir le menu\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"isOverlayOpen()\"\n (click)=\"openOverlay()\">\n <fa-icon [icon]=\"menuIcon\" />\n </button>\n}\n", styles: [":host{display:flex;position:relative;height:100%}.ds-sidebar__backdrop{position:fixed;inset:0;background:var(--sidebar-backdrop-bg, rgba(0, 0, 0, .5));z-index:var(--z-index-full, 9999);opacity:0;animation:fadeIn var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease forwards}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.ds-sidebar{display:flex;flex-direction:column;height:100%;position:relative;overflow:hidden;background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));transition:width var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease,transform var(--sidebar-transition-duration, var(--duration-normal, .2s)) ease}.ds-sidebar--left{border-right:1px solid var(--sidebar-border, var(--border-default, #e5e7eb))}.ds-sidebar--right{border-left:1px solid var(--sidebar-border, var(--border-default, #e5e7eb))}.ds-sidebar--full{width:var(--sidebar-width-md, 240px)}.ds-sidebar--full.ds-sidebar--sm{width:var(--sidebar-width-sm, 200px)}.ds-sidebar--full.ds-sidebar--lg{width:var(--sidebar-width-lg, 280px)}.ds-sidebar--collapsed{width:var(--sidebar-width-collapsed, 64px)}.ds-sidebar--collapsed .ds-sidebar__header,.ds-sidebar--collapsed .ds-sidebar__footer{padding:var(--space-2, .5rem);justify-content:center}.ds-sidebar--collapsed .ds-sidebar__toggle-btn{display:none}.ds-sidebar--overlay{position:fixed;top:0;bottom:0;z-index:var(--z-index-full, 9999);box-shadow:var(--sidebar-shadow, var(--shadow-3, 0 10px 25px rgba(0, 0, 0, .1)));transform:translate(-100%);width:var(--sidebar-width-md, 240px)}.ds-sidebar--overlay.ds-sidebar--left{left:0}.ds-sidebar--overlay.ds-sidebar--right{right:0;transform:translate(100%)}.ds-sidebar--overlay.ds-sidebar--overlay-open{transform:translate(0)}.ds-sidebar--overlay.ds-sidebar--sm{width:var(--sidebar-width-sm, 200px)}.ds-sidebar--overlay.ds-sidebar--lg{width:var(--sidebar-width-lg, 280px)}.ds-sidebar__header{display:flex;align-items:center;justify-content:space-between;padding:var(--sidebar-header-padding, var(--space-4, 1rem));border-bottom:1px solid var(--sidebar-border, var(--border-default, #e5e7eb));flex-shrink:0;min-height:60px;position:relative;z-index:1}:host ::ng-deep .ds-sidebar__header img{max-height:32px;width:auto}:host ::ng-deep .ds-sidebar__header h1,:host ::ng-deep .ds-sidebar__header h2,:host ::ng-deep .ds-sidebar__header h3{margin:0;font-size:var(--font-size-lg, 1.125rem);font-weight:600}.ds-sidebar__header .ds-sidebar-logo{max-height:32px;width:auto}.ds-sidebar__header .ds-sidebar-title{margin:0;font-size:var(--font-size-lg, 1.125rem);font-weight:600}.ds-sidebar__toggle-btn,.ds-sidebar__close-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:var(--sidebar-item-radius, var(--radius-1-5, 6px));background:transparent;color:var(--sidebar-text, var(--text-default, #1f2937));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease;flex-shrink:0}.ds-sidebar__toggle-btn:hover,.ds-sidebar__close-btn:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__toggle-btn:focus-visible,.ds-sidebar__close-btn:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__body{flex:1;overflow-y:auto;overflow-x:hidden;padding:var(--sidebar-body-padding, var(--space-2, .5rem))}.ds-sidebar__body::-webkit-scrollbar{width:6px}.ds-sidebar__body::-webkit-scrollbar-track{background:transparent}.ds-sidebar__body::-webkit-scrollbar-thumb{background:var(--sidebar-scrollbar-thumb, var(--gray-300, #d1d5db));border-radius:3px}.ds-sidebar__body::-webkit-scrollbar-thumb:hover{background:var(--sidebar-scrollbar-thumb-hover, var(--gray-400, #9ca3af))}.ds-sidebar__footer{padding:var(--sidebar-footer-padding, var(--space-4, 1rem));border-top:1px solid var(--sidebar-border, var(--border-default, #e5e7eb));flex-shrink:0}.ds-sidebar__footer:empty{display:none}:host ::ng-deep .ds-sidebar__footer button{width:100%}.ds-sidebar__footer .ds-sidebar-footer-btn{width:100%}.ds-sidebar__trigger{position:fixed;top:var(--space-4, 1rem);z-index:var(--z-index-3, 998);display:flex;align-items:center;justify-content:center;width:44px;height:44px;padding:0;border:none;border-radius:var(--radius-2, 8px);background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));box-shadow:var(--sidebar-trigger-shadow, var(--shadow-2, 0 4px 12px rgba(0, 0, 0, .1)));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,transform var(--duration-fast, .15s) ease}.ds-sidebar__trigger--left{left:var(--space-4, 1rem)}.ds-sidebar__trigger--right{right:var(--space-4, 1rem)}.ds-sidebar__trigger:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__trigger:active{transform:scale(.95)}.ds-sidebar__trigger:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__expand-btn{position:absolute;top:50%;left:var(--sidebar-width-collapsed, 64px);transform:translateY(-50%) translate(-50%);display:flex;align-items:center;justify-content:center;width:24px;height:48px;padding:0;border:none;border-radius:0 var(--sidebar-item-radius, var(--radius-1-5, 6px)) var(--sidebar-item-radius, var(--radius-1-5, 6px)) 0;background:var(--sidebar-bg, var(--surface-default, #ffffff));color:var(--sidebar-text, var(--text-default, #1f2937));cursor:pointer;box-shadow:var(--shadow-2, 0 4px 12px rgba(0, 0, 0, .1));z-index:2;transition:background-color var(--duration-fast, .15s) ease}.ds-sidebar__expand-btn:hover{background:var(--sidebar-item-hover-bg, var(--gray-100, rgba(0, 0, 0, .05)))}.ds-sidebar__expand-btn:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:2px}.ds-sidebar__expand-btn--left{left:auto;right:var(--sidebar-width-collapsed, 64px);transform:translateY(-50%) translate(50%);border-radius:var(--sidebar-item-radius, var(--radius-1-5, 6px)) 0 0 var(--sidebar-item-radius, var(--radius-1-5, 6px))}:host-context(.theme-dark) .ds-sidebar{background:var(--sidebar-bg, var(--surface-default));color:var(--sidebar-text, var(--text-default))}:host-context(.theme-dark) .ds-sidebar__backdrop{background:var(--sidebar-backdrop-bg, rgba(0, 0, 0, .7))}:host-context(.theme-dark) .ds-sidebar__trigger,:host-context(.theme-dark) .ds-sidebar__expand-btn{background:var(--sidebar-bg, var(--surface-default));color:var(--sidebar-text, var(--text-default))}@keyframes slideInLeft{0%{transform:translate(-100%)}to{transform:translate(0)}}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}@media print{.ds-sidebar,.ds-sidebar__backdrop,.ds-sidebar__trigger{display:none!important}}::ng-deep .ds-sidebar-popover-backdrop{background:transparent}::ng-deep .ds-sidebar-popover-panel{z-index:var(--z-index-3, 1000)}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .ds-sidebar-logo-text,:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .logo-text{display:none}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .ds-sidebar-logo-icon,:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .logo-icon{margin:0 auto}:host ::ng-deep .ds-sidebar--collapsed .ds-sidebar__header .sidebar-logo{padding:0;justify-content:center}\n"] }]
14995
14997
  }], ctorParameters: () => [], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], position: [{ type: i0.Input, args: [{ isSignal: true, alias: "position", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], responsiveBreakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "responsiveBreakpoint", required: false }] }], autoCollapseOnMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoCollapseOnMobile", required: false }] }], showTooltips: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTooltips", required: false }] }], collapsedTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedTrigger", required: false }] }], initialActiveItemId: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialActiveItemId", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], itemExpand: [{ type: i0.Output, args: ["itemExpand"] }], modeChange: [{ type: i0.Output, args: ["modeChange"] }], overlayOpened: [{ type: i0.Output, args: ["overlayOpened"] }], overlayClosed: [{ type: i0.Output, args: ["overlayClosed"] }], sidebarContainer: [{
14996
14998
  type: ViewChild,
14997
14999
  args: ['sidebarContainer']
@@ -15542,11 +15544,11 @@ class DsListItem {
15542
15544
  }
15543
15545
  }
15544
15546
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsListItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
15545
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsListItem, isStandalone: true, selector: "ds-list-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, indicator: { classPropertyName: "indicator", publicName: "indicator", isSignal: true, isRequired: false, transformFunction: null }, indicatorColor: { classPropertyName: "indicatorColor", publicName: "indicatorColor", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, completed: { classPropertyName: "completed", publicName: "completed", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange", clicked: "clicked" }, ngImport: i0, template: "<div\n [class]=\"itemClasses()\"\n [attr.role]=\"role()\"\n [attr.tabindex]=\"tabindex()\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.aria-selected]=\"selected() || null\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n>\n <!-- Indicateur de priorit\u00E9/statut -->\n @if (showIndicator()) {\n <span\n class=\"ds-list-item__indicator\"\n [class.ds-list-item__indicator--bar]=\"isBarIndicator()\"\n [class.ds-list-item__indicator--dot]=\"isDotIndicator()\"\n [style.--indicator-color]=\"resolveIndicatorColor()\"\n aria-hidden=\"true\"\n ></span>\n }\n\n <!-- Checkbox -->\n @if (checkable()) {\n <primitive-checkbox\n class=\"ds-list-item__checkbox\"\n [checked]=\"checked()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n size=\"sm\"\n (checkedChange)=\"handleCheckedChange($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n\n <!-- Contenu principal -->\n <div class=\"ds-list-item__content\">\n <span class=\"ds-list-item__title\">{{ title() }}</span>\n\n @if (subtitle()) {\n <span class=\"ds-list-item__subtitle\">{{ subtitle() }}</span>\n }\n\n <!-- Slot pour contenu additionnel inline (tags, badges) -->\n <ng-content select=\"[inline]\" />\n </div>\n\n <!-- Zone de m\u00E9tadonn\u00E9es (time, duration, etc.) -->\n <div class=\"ds-list-item__meta\">\n <ng-content select=\"[meta]\" />\n </div>\n\n <!-- Actions (boutons, menus) - visibles au hover -->\n <div class=\"ds-list-item__actions\">\n <ng-content select=\"[actions]\" />\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.ds-list-item{display:flex;align-items:center;gap:var(--space-2, 8px);padding:0 var(--space-3, 12px);border-radius:var(--radius-1, 4px);cursor:default;transition:background-color .15s ease}.ds-list-item--sm{height:32px}.ds-list-item--sm .ds-list-item__title{font-size:var(--font-size-1, 12px)}.ds-list-item--sm .ds-list-item__subtitle{font-size:var(--font-size-0, 11px)}.ds-list-item--sm .ds-list-item__indicator--bar{height:14px}.ds-list-item--sm .ds-list-item__indicator--dot{width:6px;height:6px}.ds-list-item--md{height:40px}.ds-list-item--md .ds-list-item__title{font-size:var(--font-size-2, 14px)}.ds-list-item--md .ds-list-item__subtitle{font-size:var(--font-size-1, 12px)}.ds-list-item--md .ds-list-item__indicator--bar{height:18px}.ds-list-item--md .ds-list-item__indicator--dot{width:8px;height:8px}.ds-list-item--lg{height:48px}.ds-list-item--lg .ds-list-item__title{font-size:var(--font-size-3, 16px)}.ds-list-item--lg .ds-list-item__subtitle{font-size:var(--font-size-2, 14px)}.ds-list-item--lg .ds-list-item__indicator--bar{height:22px}.ds-list-item--lg .ds-list-item__indicator--dot{width:10px;height:10px}.ds-list-item--clickable{cursor:pointer}.ds-list-item--clickable:hover{background-color:var(--background-hover, rgba(255, 255, 255, .08))}.ds-list-item--clickable:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-list-item--clickable:active{background-color:var(--background-active, rgba(255, 255, 255, .12))}.ds-list-item--completed .ds-list-item__title{color:var(--text-muted, #9ca3af);text-decoration:line-through}.ds-list-item--completed .ds-list-item__subtitle{text-decoration:line-through}.ds-list-item--completed .ds-list-item__meta{opacity:.5}.ds-list-item--disabled{opacity:.5;pointer-events:none;cursor:not-allowed}.ds-list-item--selected{background-color:var(--background-selected, rgba(59, 130, 246, .1))}.ds-list-item--selected:hover{background-color:var(--background-selected-hover, rgba(59, 130, 246, .15))}.ds-list-item__indicator{flex-shrink:0;background-color:var(--indicator-color, var(--color-neutral, #6b7280))}.ds-list-item__indicator--bar{width:3px;border-radius:2px}.ds-list-item__indicator--dot{border-radius:50%}.ds-list-item__checkbox{flex-shrink:0}.ds-list-item__content{flex:1;display:flex;align-items:center;gap:var(--space-2, 8px);min-width:0}.ds-list-item__title{font-weight:var(--font-weight-normal, 400);color:var(--text-default, #f3f4f6);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-list-item__subtitle{color:var(--text-muted, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-list-item__meta{display:flex;align-items:center;gap:var(--space-2, 8px);flex-shrink:0;font-size:var(--font-size-1, 12px);color:var(--text-muted, #9ca3af)}.ds-list-item__actions{display:flex;align-items:center;gap:var(--space-1, 4px);flex-shrink:0;opacity:0;transition:opacity .15s ease}.ds-list-item:hover .ds-list-item__actions,.ds-list-item:focus-within .ds-list-item__actions{opacity:1}::ng-deep [inline]{flex-shrink:0}::ng-deep [meta]{display:inline-flex;align-items:center}::ng-deep [actions]{display:inline-flex;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: PrimitiveCheckbox, selector: "primitive-checkbox", inputs: ["checked", "indeterminate", "disabled", "size", "label", "checkboxId"], outputs: ["checkedChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15547
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsListItem, isStandalone: true, selector: "ds-list-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, indicator: { classPropertyName: "indicator", publicName: "indicator", isSignal: true, isRequired: false, transformFunction: null }, indicatorColor: { classPropertyName: "indicatorColor", publicName: "indicatorColor", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, completed: { classPropertyName: "completed", publicName: "completed", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checkedChange: "checkedChange", clicked: "clicked" }, ngImport: i0, template: "<div\n [class]=\"itemClasses()\"\n [attr.role]=\"role()\"\n [attr.tabindex]=\"tabindex()\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.aria-selected]=\"selected() || null\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n>\n <!-- Indicateur de priorit\u00E9/statut (toute la hauteur) -->\n @if (showIndicator()) {\n <span\n class=\"ds-list-item__indicator\"\n [class.ds-list-item__indicator--bar]=\"isBarIndicator()\"\n [class.ds-list-item__indicator--dot]=\"isDotIndicator()\"\n [style.--indicator-color]=\"resolveIndicatorColor()\"\n aria-hidden=\"true\"\n ></span>\n }\n\n <!-- Wrapper des lignes -->\n <div class=\"ds-list-item__wrapper\">\n <!-- Ligne 1 : Checkbox + Titre + Meta + Actions -->\n <div class=\"ds-list-item__row ds-list-item__row--primary\">\n <!-- Checkbox -->\n @if (checkable()) {\n <primitive-checkbox\n class=\"ds-list-item__checkbox\"\n [checked]=\"checked()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n size=\"sm\"\n (checkedChange)=\"handleCheckedChange($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n\n <!-- Contenu principal -->\n <div class=\"ds-list-item__content\">\n <span class=\"ds-list-item__title\">{{ title() }}</span>\n\n @if (subtitle()) {\n <span class=\"ds-list-item__subtitle\">{{ subtitle() }}</span>\n }\n\n <!-- Slot pour contenu additionnel inline (tags, badges) -->\n <ng-content select=\"[inline]\" />\n </div>\n\n <!-- Zone de m\u00E9tadonn\u00E9es (time, duration, etc.) -->\n <div class=\"ds-list-item__meta\">\n <ng-content select=\"[meta]\" />\n </div>\n\n <!-- Actions (boutons, menus) - visibles au hover -->\n <div class=\"ds-list-item__actions\">\n <ng-content select=\"[actions]\" />\n </div>\n </div>\n\n <!-- Ligne 2 : Contenu secondaire (optionnel) -->\n <div class=\"ds-list-item__row ds-list-item__row--secondary\">\n <ng-content select=\"[secondary]\" />\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.ds-list-item{display:flex;align-items:stretch;gap:var(--space-2, 8px);padding:0 var(--space-3, 12px);border-radius:var(--radius-1, 4px);cursor:default;transition:background-color .15s ease}.ds-list-item__wrapper{flex:1;display:flex;flex-direction:column;justify-content:center;min-width:0;padding:var(--space-2, 8px) 0}.ds-list-item__row{display:flex;align-items:center;gap:var(--space-2, 8px)}.ds-list-item__row--primary{min-height:24px}.ds-list-item__row--secondary{padding-left:calc(16px + var(--space-2, 8px));padding-top:var(--space-1, 4px)}.ds-list-item__row--secondary:empty{display:none}.ds-list-item--sm .ds-list-item__wrapper{padding:var(--space-1, 4px) 0}.ds-list-item--sm .ds-list-item__row--primary{min-height:20px}.ds-list-item--sm .ds-list-item__title{font-size:var(--font-size-1, 12px)}.ds-list-item--sm .ds-list-item__subtitle{font-size:var(--font-size-0, 11px)}.ds-list-item--sm .ds-list-item__indicator--bar{width:3px;align-self:stretch}.ds-list-item--sm .ds-list-item__indicator--dot{width:6px;height:6px}.ds-list-item--sm .ds-list-item__row--secondary{padding-left:calc(14px + var(--space-1, 4px))}.ds-list-item--md .ds-list-item__row--primary{min-height:24px}.ds-list-item--md .ds-list-item__title{font-size:var(--font-size-2, 14px)}.ds-list-item--md .ds-list-item__subtitle{font-size:var(--font-size-1, 12px)}.ds-list-item--md .ds-list-item__indicator--bar{width:3px;align-self:stretch}.ds-list-item--md .ds-list-item__indicator--dot{width:8px;height:8px}.ds-list-item--lg .ds-list-item__wrapper{padding:var(--space-3, 12px) 0}.ds-list-item--lg .ds-list-item__row--primary{min-height:28px}.ds-list-item--lg .ds-list-item__title{font-size:var(--font-size-3, 16px)}.ds-list-item--lg .ds-list-item__subtitle{font-size:var(--font-size-2, 14px)}.ds-list-item--lg .ds-list-item__indicator--bar{width:4px;align-self:stretch}.ds-list-item--lg .ds-list-item__indicator--dot{width:10px;height:10px}.ds-list-item--lg .ds-list-item__row--secondary{padding-left:calc(18px + var(--space-2, 8px))}.ds-list-item--clickable{cursor:pointer}.ds-list-item--clickable:hover{background-color:var(--background-hover, rgba(255, 255, 255, .08))}.ds-list-item--clickable:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-list-item--clickable:active{background-color:var(--background-active, rgba(255, 255, 255, .12))}.ds-list-item--completed .ds-list-item__title{color:var(--text-muted, #9ca3af);text-decoration:line-through}.ds-list-item--completed .ds-list-item__subtitle{text-decoration:line-through}.ds-list-item--completed .ds-list-item__meta{opacity:.5}.ds-list-item--disabled{opacity:.5;pointer-events:none;cursor:not-allowed}.ds-list-item--selected{background-color:var(--background-selected, rgba(59, 130, 246, .1))}.ds-list-item--selected:hover{background-color:var(--background-selected-hover, rgba(59, 130, 246, .15))}.ds-list-item__indicator{flex-shrink:0;background-color:var(--indicator-color, var(--color-neutral, #6b7280))}.ds-list-item__indicator--bar{width:3px;border-radius:2px;align-self:stretch}.ds-list-item__indicator--dot{border-radius:50%;align-self:center}.ds-list-item__checkbox{flex-shrink:0}.ds-list-item__content{flex:1;display:flex;align-items:center;gap:var(--space-2, 8px);min-width:0}.ds-list-item__title{font-weight:var(--font-weight-normal, 400);color:var(--text-default, #f3f4f6);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-list-item__subtitle{color:var(--text-muted, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-list-item__meta{display:flex;align-items:center;gap:var(--space-2, 8px);flex-shrink:0;font-size:var(--font-size-1, 12px);color:var(--text-muted, #9ca3af)}.ds-list-item__actions{display:flex;align-items:center;gap:var(--space-1, 4px);flex-shrink:0;opacity:0;transition:opacity .15s ease}.ds-list-item:hover .ds-list-item__actions,.ds-list-item:focus-within .ds-list-item__actions{opacity:1}::ng-deep [inline]{flex-shrink:0}::ng-deep [meta]{display:inline-flex;align-items:center}::ng-deep [actions]{display:inline-flex;align-items:center}::ng-deep [secondary]{display:flex;align-items:center;gap:var(--space-1, 4px);flex-wrap:wrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: PrimitiveCheckbox, selector: "primitive-checkbox", inputs: ["checked", "indeterminate", "disabled", "size", "label", "checkboxId"], outputs: ["checkedChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15546
15548
  }
15547
15549
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsListItem, decorators: [{
15548
15550
  type: Component,
15549
- args: [{ selector: 'ds-list-item', standalone: true, imports: [CommonModule, PrimitiveCheckbox], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [class]=\"itemClasses()\"\n [attr.role]=\"role()\"\n [attr.tabindex]=\"tabindex()\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.aria-selected]=\"selected() || null\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n>\n <!-- Indicateur de priorit\u00E9/statut -->\n @if (showIndicator()) {\n <span\n class=\"ds-list-item__indicator\"\n [class.ds-list-item__indicator--bar]=\"isBarIndicator()\"\n [class.ds-list-item__indicator--dot]=\"isDotIndicator()\"\n [style.--indicator-color]=\"resolveIndicatorColor()\"\n aria-hidden=\"true\"\n ></span>\n }\n\n <!-- Checkbox -->\n @if (checkable()) {\n <primitive-checkbox\n class=\"ds-list-item__checkbox\"\n [checked]=\"checked()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n size=\"sm\"\n (checkedChange)=\"handleCheckedChange($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n\n <!-- Contenu principal -->\n <div class=\"ds-list-item__content\">\n <span class=\"ds-list-item__title\">{{ title() }}</span>\n\n @if (subtitle()) {\n <span class=\"ds-list-item__subtitle\">{{ subtitle() }}</span>\n }\n\n <!-- Slot pour contenu additionnel inline (tags, badges) -->\n <ng-content select=\"[inline]\" />\n </div>\n\n <!-- Zone de m\u00E9tadonn\u00E9es (time, duration, etc.) -->\n <div class=\"ds-list-item__meta\">\n <ng-content select=\"[meta]\" />\n </div>\n\n <!-- Actions (boutons, menus) - visibles au hover -->\n <div class=\"ds-list-item__actions\">\n <ng-content select=\"[actions]\" />\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.ds-list-item{display:flex;align-items:center;gap:var(--space-2, 8px);padding:0 var(--space-3, 12px);border-radius:var(--radius-1, 4px);cursor:default;transition:background-color .15s ease}.ds-list-item--sm{height:32px}.ds-list-item--sm .ds-list-item__title{font-size:var(--font-size-1, 12px)}.ds-list-item--sm .ds-list-item__subtitle{font-size:var(--font-size-0, 11px)}.ds-list-item--sm .ds-list-item__indicator--bar{height:14px}.ds-list-item--sm .ds-list-item__indicator--dot{width:6px;height:6px}.ds-list-item--md{height:40px}.ds-list-item--md .ds-list-item__title{font-size:var(--font-size-2, 14px)}.ds-list-item--md .ds-list-item__subtitle{font-size:var(--font-size-1, 12px)}.ds-list-item--md .ds-list-item__indicator--bar{height:18px}.ds-list-item--md .ds-list-item__indicator--dot{width:8px;height:8px}.ds-list-item--lg{height:48px}.ds-list-item--lg .ds-list-item__title{font-size:var(--font-size-3, 16px)}.ds-list-item--lg .ds-list-item__subtitle{font-size:var(--font-size-2, 14px)}.ds-list-item--lg .ds-list-item__indicator--bar{height:22px}.ds-list-item--lg .ds-list-item__indicator--dot{width:10px;height:10px}.ds-list-item--clickable{cursor:pointer}.ds-list-item--clickable:hover{background-color:var(--background-hover, rgba(255, 255, 255, .08))}.ds-list-item--clickable:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-list-item--clickable:active{background-color:var(--background-active, rgba(255, 255, 255, .12))}.ds-list-item--completed .ds-list-item__title{color:var(--text-muted, #9ca3af);text-decoration:line-through}.ds-list-item--completed .ds-list-item__subtitle{text-decoration:line-through}.ds-list-item--completed .ds-list-item__meta{opacity:.5}.ds-list-item--disabled{opacity:.5;pointer-events:none;cursor:not-allowed}.ds-list-item--selected{background-color:var(--background-selected, rgba(59, 130, 246, .1))}.ds-list-item--selected:hover{background-color:var(--background-selected-hover, rgba(59, 130, 246, .15))}.ds-list-item__indicator{flex-shrink:0;background-color:var(--indicator-color, var(--color-neutral, #6b7280))}.ds-list-item__indicator--bar{width:3px;border-radius:2px}.ds-list-item__indicator--dot{border-radius:50%}.ds-list-item__checkbox{flex-shrink:0}.ds-list-item__content{flex:1;display:flex;align-items:center;gap:var(--space-2, 8px);min-width:0}.ds-list-item__title{font-weight:var(--font-weight-normal, 400);color:var(--text-default, #f3f4f6);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-list-item__subtitle{color:var(--text-muted, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-list-item__meta{display:flex;align-items:center;gap:var(--space-2, 8px);flex-shrink:0;font-size:var(--font-size-1, 12px);color:var(--text-muted, #9ca3af)}.ds-list-item__actions{display:flex;align-items:center;gap:var(--space-1, 4px);flex-shrink:0;opacity:0;transition:opacity .15s ease}.ds-list-item:hover .ds-list-item__actions,.ds-list-item:focus-within .ds-list-item__actions{opacity:1}::ng-deep [inline]{flex-shrink:0}::ng-deep [meta]{display:inline-flex;align-items:center}::ng-deep [actions]{display:inline-flex;align-items:center}\n"] }]
15551
+ args: [{ selector: 'ds-list-item', standalone: true, imports: [CommonModule, PrimitiveCheckbox], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [class]=\"itemClasses()\"\n [attr.role]=\"role()\"\n [attr.tabindex]=\"tabindex()\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.aria-selected]=\"selected() || null\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n>\n <!-- Indicateur de priorit\u00E9/statut (toute la hauteur) -->\n @if (showIndicator()) {\n <span\n class=\"ds-list-item__indicator\"\n [class.ds-list-item__indicator--bar]=\"isBarIndicator()\"\n [class.ds-list-item__indicator--dot]=\"isDotIndicator()\"\n [style.--indicator-color]=\"resolveIndicatorColor()\"\n aria-hidden=\"true\"\n ></span>\n }\n\n <!-- Wrapper des lignes -->\n <div class=\"ds-list-item__wrapper\">\n <!-- Ligne 1 : Checkbox + Titre + Meta + Actions -->\n <div class=\"ds-list-item__row ds-list-item__row--primary\">\n <!-- Checkbox -->\n @if (checkable()) {\n <primitive-checkbox\n class=\"ds-list-item__checkbox\"\n [checked]=\"checked()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n size=\"sm\"\n (checkedChange)=\"handleCheckedChange($event)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n\n <!-- Contenu principal -->\n <div class=\"ds-list-item__content\">\n <span class=\"ds-list-item__title\">{{ title() }}</span>\n\n @if (subtitle()) {\n <span class=\"ds-list-item__subtitle\">{{ subtitle() }}</span>\n }\n\n <!-- Slot pour contenu additionnel inline (tags, badges) -->\n <ng-content select=\"[inline]\" />\n </div>\n\n <!-- Zone de m\u00E9tadonn\u00E9es (time, duration, etc.) -->\n <div class=\"ds-list-item__meta\">\n <ng-content select=\"[meta]\" />\n </div>\n\n <!-- Actions (boutons, menus) - visibles au hover -->\n <div class=\"ds-list-item__actions\">\n <ng-content select=\"[actions]\" />\n </div>\n </div>\n\n <!-- Ligne 2 : Contenu secondaire (optionnel) -->\n <div class=\"ds-list-item__row ds-list-item__row--secondary\">\n <ng-content select=\"[secondary]\" />\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.ds-list-item{display:flex;align-items:stretch;gap:var(--space-2, 8px);padding:0 var(--space-3, 12px);border-radius:var(--radius-1, 4px);cursor:default;transition:background-color .15s ease}.ds-list-item__wrapper{flex:1;display:flex;flex-direction:column;justify-content:center;min-width:0;padding:var(--space-2, 8px) 0}.ds-list-item__row{display:flex;align-items:center;gap:var(--space-2, 8px)}.ds-list-item__row--primary{min-height:24px}.ds-list-item__row--secondary{padding-left:calc(16px + var(--space-2, 8px));padding-top:var(--space-1, 4px)}.ds-list-item__row--secondary:empty{display:none}.ds-list-item--sm .ds-list-item__wrapper{padding:var(--space-1, 4px) 0}.ds-list-item--sm .ds-list-item__row--primary{min-height:20px}.ds-list-item--sm .ds-list-item__title{font-size:var(--font-size-1, 12px)}.ds-list-item--sm .ds-list-item__subtitle{font-size:var(--font-size-0, 11px)}.ds-list-item--sm .ds-list-item__indicator--bar{width:3px;align-self:stretch}.ds-list-item--sm .ds-list-item__indicator--dot{width:6px;height:6px}.ds-list-item--sm .ds-list-item__row--secondary{padding-left:calc(14px + var(--space-1, 4px))}.ds-list-item--md .ds-list-item__row--primary{min-height:24px}.ds-list-item--md .ds-list-item__title{font-size:var(--font-size-2, 14px)}.ds-list-item--md .ds-list-item__subtitle{font-size:var(--font-size-1, 12px)}.ds-list-item--md .ds-list-item__indicator--bar{width:3px;align-self:stretch}.ds-list-item--md .ds-list-item__indicator--dot{width:8px;height:8px}.ds-list-item--lg .ds-list-item__wrapper{padding:var(--space-3, 12px) 0}.ds-list-item--lg .ds-list-item__row--primary{min-height:28px}.ds-list-item--lg .ds-list-item__title{font-size:var(--font-size-3, 16px)}.ds-list-item--lg .ds-list-item__subtitle{font-size:var(--font-size-2, 14px)}.ds-list-item--lg .ds-list-item__indicator--bar{width:4px;align-self:stretch}.ds-list-item--lg .ds-list-item__indicator--dot{width:10px;height:10px}.ds-list-item--lg .ds-list-item__row--secondary{padding-left:calc(18px + var(--space-2, 8px))}.ds-list-item--clickable{cursor:pointer}.ds-list-item--clickable:hover{background-color:var(--background-hover, rgba(255, 255, 255, .08))}.ds-list-item--clickable:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-list-item--clickable:active{background-color:var(--background-active, rgba(255, 255, 255, .12))}.ds-list-item--completed .ds-list-item__title{color:var(--text-muted, #9ca3af);text-decoration:line-through}.ds-list-item--completed .ds-list-item__subtitle{text-decoration:line-through}.ds-list-item--completed .ds-list-item__meta{opacity:.5}.ds-list-item--disabled{opacity:.5;pointer-events:none;cursor:not-allowed}.ds-list-item--selected{background-color:var(--background-selected, rgba(59, 130, 246, .1))}.ds-list-item--selected:hover{background-color:var(--background-selected-hover, rgba(59, 130, 246, .15))}.ds-list-item__indicator{flex-shrink:0;background-color:var(--indicator-color, var(--color-neutral, #6b7280))}.ds-list-item__indicator--bar{width:3px;border-radius:2px;align-self:stretch}.ds-list-item__indicator--dot{border-radius:50%;align-self:center}.ds-list-item__checkbox{flex-shrink:0}.ds-list-item__content{flex:1;display:flex;align-items:center;gap:var(--space-2, 8px);min-width:0}.ds-list-item__title{font-weight:var(--font-weight-normal, 400);color:var(--text-default, #f3f4f6);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-list-item__subtitle{color:var(--text-muted, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-list-item__meta{display:flex;align-items:center;gap:var(--space-2, 8px);flex-shrink:0;font-size:var(--font-size-1, 12px);color:var(--text-muted, #9ca3af)}.ds-list-item__actions{display:flex;align-items:center;gap:var(--space-1, 4px);flex-shrink:0;opacity:0;transition:opacity .15s ease}.ds-list-item:hover .ds-list-item__actions,.ds-list-item:focus-within .ds-list-item__actions{opacity:1}::ng-deep [inline]{flex-shrink:0}::ng-deep [meta]{display:inline-flex;align-items:center}::ng-deep [actions]{display:inline-flex;align-items:center}::ng-deep [secondary]{display:flex;align-items:center;gap:var(--space-1, 4px);flex-wrap:wrap}\n"] }]
15550
15552
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], indicator: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicator", required: false }] }], indicatorColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "indicatorColor", required: false }] }], checkable: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkable", required: false }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], completed: [{ type: i0.Input, args: [{ isSignal: true, alias: "completed", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], clickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clickable", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], checkedChange: [{ type: i0.Output, args: ["checkedChange"] }], clicked: [{ type: i0.Output, args: ["clicked"] }] } });
15551
15553
 
15552
15554
  /**
@@ -15927,6 +15929,611 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
15927
15929
  args: [{ selector: 'ds-list-group', standalone: true, imports: [CommonModule, FontAwesomeModule, DsBadge], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"groupClasses()\">\n <!-- Header du groupe -->\n <div\n class=\"ds-list-group__header\"\n [attr.role]=\"isCollapsible() ? 'button' : null\"\n [attr.tabindex]=\"isCollapsible() ? 0 : null\"\n [attr.aria-expanded]=\"isCollapsible() ? isExpanded() : null\"\n (click)=\"toggle()\"\n (keydown)=\"handleKeyDown($event)\"\n >\n <!-- Chevron (collapsible uniquement) -->\n @if (isCollapsible()) {\n <fa-icon\n [icon]=\"chevronIcon()\"\n class=\"ds-list-group__chevron\"\n [class.ds-list-group__chevron--expanded]=\"isExpanded()\"\n />\n }\n\n <!-- Ic\u00F4ne personnalis\u00E9e -->\n @if (icon()) {\n <fa-icon [icon]=\"icon()!\" class=\"ds-list-group__icon\" />\n }\n\n <!-- Titre -->\n <span class=\"ds-list-group__title\">{{ title() }}</span>\n\n <!-- Sous-titre -->\n @if (subtitle()) {\n <span class=\"ds-list-group__subtitle\">{{ subtitle() }}</span>\n }\n\n <!-- Compteur (badge) -->\n @if (showCount()) {\n <ds-badge type=\"neutral\" size=\"sm\" class=\"ds-list-group__count\">\n {{ count() }}\n </ds-badge>\n }\n </div>\n\n <!-- Contenu du groupe -->\n @if (isExpanded()) {\n <div\n class=\"ds-list-group__content\"\n role=\"group\"\n [attr.aria-label]=\"title()\"\n >\n <ng-content />\n </div>\n }\n</div>\n", styles: [":host{display:block}.ds-list-group__header{display:flex;align-items:center;gap:var(--space-2, 8px);padding:var(--space-2, 8px) var(--space-3, 12px);font-size:var(--font-size-1, 12px);font-weight:var(--font-weight-semibold, 600);color:var(--text-muted, #9ca3af);text-transform:uppercase;letter-spacing:.05em;-webkit-user-select:none;user-select:none}.ds-list-group--collapsible .ds-list-group__header{cursor:pointer;border-radius:var(--radius-1, 4px);transition:background-color .15s ease}.ds-list-group--collapsible .ds-list-group__header:hover{background-color:var(--background-hover, rgba(255, 255, 255, .05))}.ds-list-group--collapsible .ds-list-group__header:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-list-group--sticky .ds-list-group__header{position:sticky;top:0;background:var(--background-main, #111827);z-index:10;border-bottom:1px solid var(--border-default, #374151)}.ds-list-group__chevron{font-size:10px;color:var(--text-muted, #9ca3af);transition:transform .2s ease;flex-shrink:0}.ds-list-group__chevron--expanded,.ds-list-group--collapsed .ds-list-group__chevron{transform:rotate(0)}.ds-list-group__icon{font-size:var(--font-size-2, 14px);color:var(--text-muted, #9ca3af);flex-shrink:0}.ds-list-group__title{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-list-group__subtitle{font-weight:var(--font-weight-normal, 400);color:var(--text-muted, #6b7280);text-transform:none;letter-spacing:normal}.ds-list-group__count{flex-shrink:0}.ds-list-group--collapsed .ds-list-group__content{display:none}\n"] }]
15928
15930
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], count: [{ type: i0.Input, args: [{ isSignal: true, alias: "count", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }], sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }] } });
15929
15931
 
15932
+ /**
15933
+ * Chip coloré pour afficher une entité sélectionnée dans ds-entity-picker
15934
+ *
15935
+ * @example
15936
+ * ```html
15937
+ * <ds-entity-chip
15938
+ * [option]="{ value: '1', label: 'Important', color: '#ef4444', emoji: '🏷️' }"
15939
+ * [removable]="true"
15940
+ * (removed)="onRemove()"
15941
+ * />
15942
+ * ```
15943
+ */
15944
+ class DsEntityChip {
15945
+ /** Option à afficher */
15946
+ option = input.required(...(ngDevMode ? [{ debugName: "option" }] : []));
15947
+ /** Taille du chip */
15948
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
15949
+ /** Afficher le bouton de suppression */
15950
+ removable = input(true, ...(ngDevMode ? [{ debugName: "removable" }] : []));
15951
+ /** Chip désactivé */
15952
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
15953
+ /** Événement de suppression */
15954
+ removed = output();
15955
+ /** Icône de fermeture */
15956
+ closeIcon = faXmark;
15957
+ /** Couleur du chip (depuis l'option ou fallback) */
15958
+ chipColor = computed(() => {
15959
+ return this.option().color || 'var(--gray-400)';
15960
+ }, ...(ngDevMode ? [{ debugName: "chipColor" }] : []));
15961
+ /** Couleur de fond (10% opacity) */
15962
+ backgroundColor = computed(() => {
15963
+ const color = this.option().color;
15964
+ if (!color) {
15965
+ return 'var(--gray-100)';
15966
+ }
15967
+ // Utilise color-mix pour créer une version transparente
15968
+ return `color-mix(in srgb, ${color} 12%, transparent)`;
15969
+ }, ...(ngDevMode ? [{ debugName: "backgroundColor" }] : []));
15970
+ /** Gestion du clic sur le bouton supprimer */
15971
+ handleRemove(event) {
15972
+ event.stopPropagation();
15973
+ event.preventDefault();
15974
+ if (this.disabled()) {
15975
+ return;
15976
+ }
15977
+ this.removed.emit(this.option());
15978
+ }
15979
+ /** Gestion du clavier */
15980
+ handleKeyDown(event) {
15981
+ if (this.disabled()) {
15982
+ return;
15983
+ }
15984
+ if (this.removable() && (event.key === 'Delete' || event.key === 'Backspace')) {
15985
+ event.preventDefault();
15986
+ this.removed.emit(this.option());
15987
+ }
15988
+ }
15989
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsEntityChip, deps: [], target: i0.ɵɵFactoryTarget.Component });
15990
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsEntityChip, isStandalone: true, selector: "ds-entity-chip", inputs: { option: { classPropertyName: "option", publicName: "option", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, removable: { classPropertyName: "removable", publicName: "removable", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { removed: "removed" }, ngImport: i0, template: `
15991
+ <div
15992
+ class="ds-entity-chip"
15993
+ [class.ds-entity-chip--sm]="size() === 'sm'"
15994
+ [class.ds-entity-chip--md]="size() === 'md'"
15995
+ [class.ds-entity-chip--lg]="size() === 'lg'"
15996
+ [class.ds-entity-chip--disabled]="disabled()"
15997
+ [style.--chip-color]="chipColor()"
15998
+ [style.background-color]="backgroundColor()"
15999
+ [style.border-color]="chipColor()"
16000
+ [attr.tabindex]="disabled() ? -1 : 0"
16001
+ (keydown)="handleKeyDown($event)"
16002
+ >
16003
+ @if (option().emoji) {
16004
+ <span class="ds-entity-chip__emoji">{{ option().emoji }}</span>
16005
+ } @else if (option().icon) {
16006
+ <fa-icon
16007
+ class="ds-entity-chip__icon"
16008
+ [icon]="option().icon!"
16009
+ [fixedWidth]="true"
16010
+ [style.color]="chipColor()"
16011
+ />
16012
+ }
16013
+
16014
+ <span class="ds-entity-chip__label">{{ option().label }}</span>
16015
+
16016
+ @if (removable() && !disabled()) {
16017
+ <button
16018
+ type="button"
16019
+ class="ds-entity-chip__remove"
16020
+ [attr.aria-label]="'Supprimer ' + option().label"
16021
+ (click)="handleRemove($event)"
16022
+ >
16023
+ <fa-icon [icon]="closeIcon" [fixedWidth]="true" />
16024
+ </button>
16025
+ }
16026
+ </div>
16027
+ `, isInline: true, styles: [".ds-entity-chip{display:inline-flex;align-items:center;gap:var(--space-1, .25rem);padding:var(--space-1, .25rem) var(--space-2, .5rem);border-radius:var(--radius-md, 6px);font-family:var(--font-family-base, sans-serif);font-size:var(--font-size-sm, .875rem);font-weight:500;line-height:1.4;border:1px solid var(--chip-color, var(--gray-300));background-color:color-mix(in srgb,var(--chip-color, var(--gray-300)) 10%,transparent);color:var(--text-default, #1a1a1a);transition:background-color var(--duration-fast, .15s) var(--easing-default, ease),transform var(--duration-fast, .15s) var(--easing-default, ease);-webkit-user-select:none;user-select:none;outline:none;max-width:200px}.ds-entity-chip:focus-visible{box-shadow:0 0 0 2px var(--background-main, #fff),0 0 0 4px var(--chip-color, var(--color-primary))}.ds-entity-chip__emoji{flex-shrink:0;font-size:1em}.ds-entity-chip__icon{flex-shrink:0;font-size:.875em}.ds-entity-chip__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.ds-entity-chip__remove{display:flex;align-items:center;justify-content:center;padding:var(--space-0-5, .125rem);margin:0;margin-left:var(--space-1, .25rem);background:none;border:none;border-radius:var(--radius-sm, 4px);cursor:pointer;color:var(--chip-color, var(--gray-600));opacity:.7;transition:opacity var(--duration-fast, .15s) var(--easing-default, ease),background-color var(--duration-fast, .15s) var(--easing-default, ease),transform var(--duration-fast, .15s) var(--easing-default, ease);flex-shrink:0}.ds-entity-chip__remove:hover{opacity:1;background-color:color-mix(in srgb,var(--chip-color, var(--gray-300)) 20%,transparent)}.ds-entity-chip__remove:active{transform:scale(.9)}.ds-entity-chip__remove:focus-visible{outline:none;opacity:1;box-shadow:0 0 0 2px var(--chip-color, var(--color-primary))}.ds-entity-chip__remove fa-icon{font-size:.75rem}.ds-entity-chip--sm{padding:var(--space-0-5, .125rem) var(--space-1-5, .375rem);font-size:var(--font-size-xs, .75rem);gap:var(--space-0-5, .125rem);max-width:150px}.ds-entity-chip--sm .ds-entity-chip__remove{padding:.0625rem}.ds-entity-chip--sm .ds-entity-chip__remove fa-icon{font-size:.625rem}.ds-entity-chip--lg{padding:var(--space-1-5, .375rem) var(--space-3, .75rem);font-size:var(--font-size-base, 1rem);gap:var(--space-2, .5rem);max-width:250px}.ds-entity-chip--lg .ds-entity-chip__remove fa-icon{font-size:.875rem}.ds-entity-chip--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
16028
+ }
16029
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsEntityChip, decorators: [{
16030
+ type: Component,
16031
+ args: [{ selector: 'ds-entity-chip', standalone: true, imports: [CommonModule, FontAwesomeModule], template: `
16032
+ <div
16033
+ class="ds-entity-chip"
16034
+ [class.ds-entity-chip--sm]="size() === 'sm'"
16035
+ [class.ds-entity-chip--md]="size() === 'md'"
16036
+ [class.ds-entity-chip--lg]="size() === 'lg'"
16037
+ [class.ds-entity-chip--disabled]="disabled()"
16038
+ [style.--chip-color]="chipColor()"
16039
+ [style.background-color]="backgroundColor()"
16040
+ [style.border-color]="chipColor()"
16041
+ [attr.tabindex]="disabled() ? -1 : 0"
16042
+ (keydown)="handleKeyDown($event)"
16043
+ >
16044
+ @if (option().emoji) {
16045
+ <span class="ds-entity-chip__emoji">{{ option().emoji }}</span>
16046
+ } @else if (option().icon) {
16047
+ <fa-icon
16048
+ class="ds-entity-chip__icon"
16049
+ [icon]="option().icon!"
16050
+ [fixedWidth]="true"
16051
+ [style.color]="chipColor()"
16052
+ />
16053
+ }
16054
+
16055
+ <span class="ds-entity-chip__label">{{ option().label }}</span>
16056
+
16057
+ @if (removable() && !disabled()) {
16058
+ <button
16059
+ type="button"
16060
+ class="ds-entity-chip__remove"
16061
+ [attr.aria-label]="'Supprimer ' + option().label"
16062
+ (click)="handleRemove($event)"
16063
+ >
16064
+ <fa-icon [icon]="closeIcon" [fixedWidth]="true" />
16065
+ </button>
16066
+ }
16067
+ </div>
16068
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ds-entity-chip{display:inline-flex;align-items:center;gap:var(--space-1, .25rem);padding:var(--space-1, .25rem) var(--space-2, .5rem);border-radius:var(--radius-md, 6px);font-family:var(--font-family-base, sans-serif);font-size:var(--font-size-sm, .875rem);font-weight:500;line-height:1.4;border:1px solid var(--chip-color, var(--gray-300));background-color:color-mix(in srgb,var(--chip-color, var(--gray-300)) 10%,transparent);color:var(--text-default, #1a1a1a);transition:background-color var(--duration-fast, .15s) var(--easing-default, ease),transform var(--duration-fast, .15s) var(--easing-default, ease);-webkit-user-select:none;user-select:none;outline:none;max-width:200px}.ds-entity-chip:focus-visible{box-shadow:0 0 0 2px var(--background-main, #fff),0 0 0 4px var(--chip-color, var(--color-primary))}.ds-entity-chip__emoji{flex-shrink:0;font-size:1em}.ds-entity-chip__icon{flex-shrink:0;font-size:.875em}.ds-entity-chip__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.ds-entity-chip__remove{display:flex;align-items:center;justify-content:center;padding:var(--space-0-5, .125rem);margin:0;margin-left:var(--space-1, .25rem);background:none;border:none;border-radius:var(--radius-sm, 4px);cursor:pointer;color:var(--chip-color, var(--gray-600));opacity:.7;transition:opacity var(--duration-fast, .15s) var(--easing-default, ease),background-color var(--duration-fast, .15s) var(--easing-default, ease),transform var(--duration-fast, .15s) var(--easing-default, ease);flex-shrink:0}.ds-entity-chip__remove:hover{opacity:1;background-color:color-mix(in srgb,var(--chip-color, var(--gray-300)) 20%,transparent)}.ds-entity-chip__remove:active{transform:scale(.9)}.ds-entity-chip__remove:focus-visible{outline:none;opacity:1;box-shadow:0 0 0 2px var(--chip-color, var(--color-primary))}.ds-entity-chip__remove fa-icon{font-size:.75rem}.ds-entity-chip--sm{padding:var(--space-0-5, .125rem) var(--space-1-5, .375rem);font-size:var(--font-size-xs, .75rem);gap:var(--space-0-5, .125rem);max-width:150px}.ds-entity-chip--sm .ds-entity-chip__remove{padding:.0625rem}.ds-entity-chip--sm .ds-entity-chip__remove fa-icon{font-size:.625rem}.ds-entity-chip--lg{padding:var(--space-1-5, .375rem) var(--space-3, .75rem);font-size:var(--font-size-base, 1rem);gap:var(--space-2, .5rem);max-width:250px}.ds-entity-chip--lg .ds-entity-chip__remove fa-icon{font-size:.875rem}.ds-entity-chip--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}\n"] }]
16069
+ }], propDecorators: { option: [{ type: i0.Input, args: [{ isSignal: true, alias: "option", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], removable: [{ type: i0.Input, args: [{ isSignal: true, alias: "removable", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], removed: [{ type: i0.Output, args: ["removed"] }] } });
16070
+
16071
+ /**
16072
+ * Entity Picker - Sélecteur d'entités riches
16073
+ *
16074
+ * Permet la sélection d'entités avec icônes, couleurs, emojis.
16075
+ * Supporte la sélection simple et multiple avec affichage en chips colorés.
16076
+ *
16077
+ * @example
16078
+ * ```html
16079
+ * <!-- Sélection simple -->
16080
+ * <ds-entity-picker
16081
+ * [options]="tags"
16082
+ * [(ngModel)]="selectedTag"
16083
+ * placeholder="Choisir un tag"
16084
+ * />
16085
+ *
16086
+ * <!-- Sélection multiple -->
16087
+ * <ds-entity-picker
16088
+ * [options]="categories"
16089
+ * [multiple]="true"
16090
+ * [(ngModel)]="selectedCategories"
16091
+ * [allowCreate]="true"
16092
+ * (createRequested)="onCreateCategory($event)"
16093
+ * />
16094
+ * ```
16095
+ */
16096
+ class DsEntityPicker {
16097
+ // ─────────────────────────────────────────────────────────────────────────────
16098
+ // Inputs
16099
+ // ─────────────────────────────────────────────────────────────────────────────
16100
+ /** Liste des options disponibles */
16101
+ options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
16102
+ /** Active la sélection multiple */
16103
+ multiple = input(false, ...(ngDevMode ? [{ debugName: "multiple" }] : []));
16104
+ /** Permet la création d'options à la volée */
16105
+ allowCreate = input(false, ...(ngDevMode ? [{ debugName: "allowCreate" }] : []));
16106
+ /** Placeholder du champ de recherche */
16107
+ placeholder = input('Rechercher...', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
16108
+ /** Taille du composant */
16109
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
16110
+ /** Mode d'affichage des sélections multiples */
16111
+ displayMode = input('chip', ...(ngDevMode ? [{ debugName: "displayMode" }] : []));
16112
+ /** Afficher le bouton clear */
16113
+ clearable = input(true, ...(ngDevMode ? [{ debugName: "clearable" }] : []));
16114
+ /** Nombre maximum de sélections (multi-select) */
16115
+ maxSelections = input(undefined, ...(ngDevMode ? [{ debugName: "maxSelections" }] : []));
16116
+ /** Label du champ */
16117
+ label = input('', ...(ngDevMode ? [{ debugName: "label" }] : []));
16118
+ /** Message d'erreur */
16119
+ error = input('', ...(ngDevMode ? [{ debugName: "error" }] : []));
16120
+ /** Texte d'aide */
16121
+ helper = input('', ...(ngDevMode ? [{ debugName: "helper" }] : []));
16122
+ /** Champ désactivé */
16123
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
16124
+ /** Champ obligatoire */
16125
+ required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : []));
16126
+ /** Caractères minimum avant filtrage */
16127
+ minChars = input(0, ...(ngDevMode ? [{ debugName: "minChars" }] : []));
16128
+ /** Texte si aucun résultat */
16129
+ noResultsText = input('Aucun résultat', ...(ngDevMode ? [{ debugName: "noResultsText" }] : []));
16130
+ /** Template du texte de création (utiliser {query} comme placeholder) */
16131
+ createText = input('Créer "{query}"', ...(ngDevMode ? [{ debugName: "createText" }] : []));
16132
+ /** Nom du champ (pour formulaires) */
16133
+ name = input('', ...(ngDevMode ? [{ debugName: "name" }] : []));
16134
+ // ─────────────────────────────────────────────────────────────────────────────
16135
+ // Outputs
16136
+ // ─────────────────────────────────────────────────────────────────────────────
16137
+ /** Émis lors d'un changement de sélection */
16138
+ selectionChange = output();
16139
+ /** Émis lors d'une demande de création */
16140
+ createRequested = output();
16141
+ /** Émis lors d'un changement de recherche */
16142
+ searchChange = output();
16143
+ /** Émis à l'ouverture du panel */
16144
+ opened = output();
16145
+ /** Émis à la fermeture du panel */
16146
+ closed = output();
16147
+ // ─────────────────────────────────────────────────────────────────────────────
16148
+ // Internal state
16149
+ // ─────────────────────────────────────────────────────────────────────────────
16150
+ isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
16151
+ searchQuery = signal('', ...(ngDevMode ? [{ debugName: "searchQuery" }] : []));
16152
+ focusedIndex = signal(-1, ...(ngDevMode ? [{ debugName: "focusedIndex" }] : []));
16153
+ internalValue = signal(null, ...(ngDevMode ? [{ debugName: "internalValue" }] : []));
16154
+ cvaDisabled = signal(false, ...(ngDevMode ? [{ debugName: "cvaDisabled" }] : []));
16155
+ inputElement;
16156
+ listbox;
16157
+ onChange = () => { };
16158
+ onTouched = () => { };
16159
+ // Icons
16160
+ iconPlus = faPlus;
16161
+ iconChevron = faChevronDown;
16162
+ iconClear = faXmark;
16163
+ iconSearch = faSearch;
16164
+ // CDK Overlay positions
16165
+ overlayPositions = AUTOCOMPLETE_POSITIONS;
16166
+ // ─────────────────────────────────────────────────────────────────────────────
16167
+ // Computed
16168
+ // ─────────────────────────────────────────────────────────────────────────────
16169
+ isDisabled = computed(() => this.disabled() || this.cvaDisabled(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
16170
+ /** Options sélectionnées (objets complets) */
16171
+ selectedOptions = computed(() => {
16172
+ const value = this.internalValue();
16173
+ const opts = this.options();
16174
+ if (value === null)
16175
+ return [];
16176
+ if (this.multiple()) {
16177
+ const values = Array.isArray(value) ? value : [value];
16178
+ return opts.filter(opt => values.includes(opt.value));
16179
+ }
16180
+ else {
16181
+ const found = opts.find(opt => opt.value === value);
16182
+ return found ? [found] : [];
16183
+ }
16184
+ }, ...(ngDevMode ? [{ debugName: "selectedOptions" }] : []));
16185
+ /** Texte affiché dans l'input (mode single) */
16186
+ displayValue = computed(() => {
16187
+ if (this.multiple())
16188
+ return '';
16189
+ const selected = this.selectedOptions();
16190
+ return selected.length > 0 ? selected[0].label : '';
16191
+ }, ...(ngDevMode ? [{ debugName: "displayValue" }] : []));
16192
+ /** Options filtrées selon la recherche */
16193
+ filteredOptions = computed(() => {
16194
+ const query = this.searchQuery().toLowerCase().trim();
16195
+ const minLen = this.minChars();
16196
+ const selected = this.selectedOptions().map(o => o.value);
16197
+ if (query.length < minLen) {
16198
+ // En multi-select, exclure les options déjà sélectionnées
16199
+ if (this.multiple()) {
16200
+ return this.options().filter(opt => !selected.includes(opt.value));
16201
+ }
16202
+ return this.options();
16203
+ }
16204
+ let results = this.options().filter(opt => {
16205
+ const matchLabel = opt.label.toLowerCase().includes(query);
16206
+ const matchDesc = opt.description?.toLowerCase().includes(query);
16207
+ return matchLabel || matchDesc;
16208
+ });
16209
+ // En multi-select, exclure les options déjà sélectionnées
16210
+ if (this.multiple()) {
16211
+ results = results.filter(opt => !selected.includes(opt.value));
16212
+ }
16213
+ return results;
16214
+ }, ...(ngDevMode ? [{ debugName: "filteredOptions" }] : []));
16215
+ /** Peut créer une nouvelle option */
16216
+ canCreate = computed(() => {
16217
+ if (!this.allowCreate())
16218
+ return false;
16219
+ const query = this.searchQuery().trim();
16220
+ if (!query)
16221
+ return false;
16222
+ // Vérifie si l'option n'existe pas déjà
16223
+ const exists = this.options().some(opt => opt.label.toLowerCase() === query.toLowerCase());
16224
+ return !exists;
16225
+ }, ...(ngDevMode ? [{ debugName: "canCreate" }] : []));
16226
+ /** Afficher le dropdown */
16227
+ shouldShowDropdown = computed(() => {
16228
+ return this.isOpen();
16229
+ }, ...(ngDevMode ? [{ debugName: "shouldShowDropdown" }] : []));
16230
+ /** Classes du container */
16231
+ containerClasses = computed(() => ({
16232
+ 'ds-entity-picker': true,
16233
+ 'ds-entity-picker--open': this.isOpen(),
16234
+ 'ds-entity-picker--disabled': this.isDisabled(),
16235
+ 'ds-entity-picker--error': !!this.error(),
16236
+ 'ds-entity-picker--multiple': this.multiple(),
16237
+ [`ds-entity-picker--${this.size()}`]: true,
16238
+ }), ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
16239
+ /** Classes de l'input */
16240
+ inputClasses = computed(() => ({
16241
+ 'ds-entity-picker__input': true,
16242
+ 'ds-entity-picker__input--has-value': this.multiple()
16243
+ ? this.selectedOptions().length > 0
16244
+ : !!this.internalValue(),
16245
+ }), ...(ngDevMode ? [{ debugName: "inputClasses" }] : []));
16246
+ /** ID unique pour le listbox */
16247
+ listboxId = computed(() => `${this.name() || 'entity-picker'}-listbox`, ...(ngDevMode ? [{ debugName: "listboxId" }] : []));
16248
+ /** ID unique pour l'input */
16249
+ inputId = computed(() => `${this.name() || 'entity-picker'}-input`, ...(ngDevMode ? [{ debugName: "inputId" }] : []));
16250
+ /** Texte du compteur (mode count) */
16251
+ countText = computed(() => {
16252
+ const count = this.selectedOptions().length;
16253
+ if (count === 0)
16254
+ return '';
16255
+ return `${count} sélectionné${count > 1 ? 's' : ''}`;
16256
+ }, ...(ngDevMode ? [{ debugName: "countText" }] : []));
16257
+ /** Limite de sélection atteinte */
16258
+ maxReached = computed(() => {
16259
+ const max = this.maxSelections();
16260
+ if (max === undefined)
16261
+ return false;
16262
+ return this.selectedOptions().length >= max;
16263
+ }, ...(ngDevMode ? [{ debugName: "maxReached" }] : []));
16264
+ /** Texte formaté pour l'option de création */
16265
+ formattedCreateText = computed(() => {
16266
+ return this.createText().replace('{query}', this.searchQuery());
16267
+ }, ...(ngDevMode ? [{ debugName: "formattedCreateText" }] : []));
16268
+ // ─────────────────────────────────────────────────────────────────────────────
16269
+ // ControlValueAccessor
16270
+ // ─────────────────────────────────────────────────────────────────────────────
16271
+ writeValue(value) {
16272
+ this.internalValue.set(value);
16273
+ }
16274
+ registerOnChange(fn) {
16275
+ this.onChange = fn;
16276
+ }
16277
+ registerOnTouched(fn) {
16278
+ this.onTouched = fn;
16279
+ }
16280
+ setDisabledState(isDisabled) {
16281
+ this.cvaDisabled.set(isDisabled);
16282
+ }
16283
+ // ─────────────────────────────────────────────────────────────────────────────
16284
+ // Public methods
16285
+ // ─────────────────────────────────────────────────────────────────────────────
16286
+ onInputFocus() {
16287
+ if (this.isDisabled())
16288
+ return;
16289
+ this.open();
16290
+ }
16291
+ onInputBlur() {
16292
+ this.onTouched();
16293
+ // Fermeture retardée pour permettre le clic sur une option
16294
+ setTimeout(() => {
16295
+ if (!this.isOpen())
16296
+ return;
16297
+ this.close();
16298
+ }, 200);
16299
+ }
16300
+ onSearchInput(event) {
16301
+ const input = event.target;
16302
+ this.searchQuery.set(input.value);
16303
+ this.searchChange.emit(input.value);
16304
+ this.focusedIndex.set(0);
16305
+ if (!this.isOpen() && input.value.length >= this.minChars()) {
16306
+ this.open();
16307
+ }
16308
+ }
16309
+ open() {
16310
+ if (this.isDisabled() || this.isOpen())
16311
+ return;
16312
+ this.isOpen.set(true);
16313
+ this.focusedIndex.set(0);
16314
+ this.opened.emit();
16315
+ }
16316
+ close() {
16317
+ if (!this.isOpen())
16318
+ return;
16319
+ this.isOpen.set(false);
16320
+ this.searchQuery.set('');
16321
+ this.focusedIndex.set(-1);
16322
+ this.closed.emit();
16323
+ }
16324
+ selectOption(option) {
16325
+ if (option.disabled || this.isDisabled())
16326
+ return;
16327
+ if (this.multiple()) {
16328
+ // Mode multi-sélection
16329
+ const current = this.internalValue() || [];
16330
+ const newValues = [...current, option.value];
16331
+ this.internalValue.set(newValues);
16332
+ this.onChange(newValues);
16333
+ // Émettre les options complètes
16334
+ const selectedOpts = this.options().filter(o => newValues.includes(o.value));
16335
+ this.selectionChange.emit(selectedOpts);
16336
+ // Reset recherche mais garde le panel ouvert
16337
+ this.searchQuery.set('');
16338
+ this.inputElement?.nativeElement?.focus();
16339
+ }
16340
+ else {
16341
+ // Mode sélection simple
16342
+ this.internalValue.set(option.value);
16343
+ this.onChange(option.value);
16344
+ this.selectionChange.emit(option);
16345
+ this.close();
16346
+ }
16347
+ }
16348
+ removeOption(option) {
16349
+ if (!this.multiple() || this.isDisabled())
16350
+ return;
16351
+ const current = this.internalValue() || [];
16352
+ const newValues = current.filter(v => v !== option.value);
16353
+ this.internalValue.set(newValues.length > 0 ? newValues : null);
16354
+ this.onChange(newValues.length > 0 ? newValues : null);
16355
+ const selectedOpts = this.options().filter(o => newValues.includes(o.value));
16356
+ this.selectionChange.emit(selectedOpts.length > 0 ? selectedOpts : null);
16357
+ }
16358
+ clear(event) {
16359
+ event?.stopPropagation();
16360
+ event?.preventDefault();
16361
+ if (this.isDisabled())
16362
+ return;
16363
+ this.internalValue.set(this.multiple() ? [] : null);
16364
+ this.onChange(this.multiple() ? [] : null);
16365
+ this.selectionChange.emit(null);
16366
+ this.searchQuery.set('');
16367
+ this.inputElement?.nativeElement?.focus();
16368
+ }
16369
+ requestCreate() {
16370
+ if (!this.canCreate())
16371
+ return;
16372
+ const value = this.searchQuery().trim();
16373
+ this.createRequested.emit(value);
16374
+ this.searchQuery.set('');
16375
+ this.close();
16376
+ }
16377
+ // ─────────────────────────────────────────────────────────────────────────────
16378
+ // Keyboard navigation
16379
+ // ─────────────────────────────────────────────────────────────────────────────
16380
+ onKeyDown(event) {
16381
+ if (this.isDisabled())
16382
+ return;
16383
+ switch (event.key) {
16384
+ case 'ArrowDown':
16385
+ event.preventDefault();
16386
+ if (!this.isOpen()) {
16387
+ this.open();
16388
+ }
16389
+ else {
16390
+ this.moveFocus(1);
16391
+ }
16392
+ break;
16393
+ case 'ArrowUp':
16394
+ event.preventDefault();
16395
+ if (this.isOpen()) {
16396
+ this.moveFocus(-1);
16397
+ }
16398
+ break;
16399
+ case 'Enter':
16400
+ if (this.isOpen()) {
16401
+ event.preventDefault();
16402
+ const idx = this.focusedIndex();
16403
+ const options = this.filteredOptions();
16404
+ if (idx >= 0 && options[idx] && !options[idx].disabled) {
16405
+ this.selectOption(options[idx]);
16406
+ }
16407
+ else if (this.canCreate()) {
16408
+ this.requestCreate();
16409
+ }
16410
+ }
16411
+ break;
16412
+ case 'Escape':
16413
+ if (this.isOpen()) {
16414
+ event.preventDefault();
16415
+ this.close();
16416
+ }
16417
+ break;
16418
+ case 'Backspace':
16419
+ // Supprimer le dernier chip si l'input est vide en mode multi
16420
+ if (this.multiple() && !this.searchQuery()) {
16421
+ const selected = this.selectedOptions();
16422
+ if (selected.length > 0) {
16423
+ this.removeOption(selected[selected.length - 1]);
16424
+ }
16425
+ }
16426
+ break;
16427
+ case 'Tab':
16428
+ if (this.isOpen()) {
16429
+ this.close();
16430
+ }
16431
+ break;
16432
+ }
16433
+ }
16434
+ // ─────────────────────────────────────────────────────────────────────────────
16435
+ // Click outside
16436
+ // ─────────────────────────────────────────────────────────────────────────────
16437
+ onDocumentClick(event) {
16438
+ const target = event.target;
16439
+ if (!target.closest('.ds-entity-picker')) {
16440
+ this.close();
16441
+ }
16442
+ }
16443
+ // ─────────────────────────────────────────────────────────────────────────────
16444
+ // Helpers
16445
+ // ─────────────────────────────────────────────────────────────────────────────
16446
+ moveFocus(delta) {
16447
+ const options = this.filteredOptions();
16448
+ const canCreateOpt = this.canCreate() ? 1 : 0;
16449
+ const total = options.length + canCreateOpt;
16450
+ if (total === 0)
16451
+ return;
16452
+ let newIndex = this.focusedIndex() + delta;
16453
+ // Wrap around
16454
+ if (newIndex < 0)
16455
+ newIndex = total - 1;
16456
+ if (newIndex >= total)
16457
+ newIndex = 0;
16458
+ // Skip disabled options
16459
+ let attempts = 0;
16460
+ while (newIndex < options.length && options[newIndex]?.disabled && attempts < total) {
16461
+ newIndex += delta;
16462
+ if (newIndex < 0)
16463
+ newIndex = total - 1;
16464
+ if (newIndex >= total)
16465
+ newIndex = 0;
16466
+ attempts++;
16467
+ }
16468
+ this.focusedIndex.set(newIndex);
16469
+ this.scrollFocusedOptionIntoView();
16470
+ }
16471
+ scrollFocusedOptionIntoView() {
16472
+ const index = this.focusedIndex();
16473
+ if (index < 0)
16474
+ return;
16475
+ const optionId = this.getOptionId(index);
16476
+ const optionElement = document.getElementById(optionId);
16477
+ if (optionElement) {
16478
+ optionElement.scrollIntoView({
16479
+ block: 'nearest',
16480
+ behavior: 'smooth',
16481
+ });
16482
+ }
16483
+ }
16484
+ isOptionFocused(index) {
16485
+ return this.focusedIndex() === index;
16486
+ }
16487
+ isOptionSelected(option) {
16488
+ const value = this.internalValue();
16489
+ if (value === null)
16490
+ return false;
16491
+ if (this.multiple()) {
16492
+ return value.includes(option.value);
16493
+ }
16494
+ return value === option.value;
16495
+ }
16496
+ getOptionId(index) {
16497
+ return `${this.name() || 'entity-picker'}-option-${index}`;
16498
+ }
16499
+ isCreateFocused() {
16500
+ return this.canCreate() && this.focusedIndex() === this.filteredOptions().length;
16501
+ }
16502
+ trackOption(_, option) {
16503
+ return option.value;
16504
+ }
16505
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsEntityPicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
16506
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsEntityPicker, isStandalone: true, selector: "ds-entity-picker", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, allowCreate: { classPropertyName: "allowCreate", publicName: "allowCreate", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, displayMode: { classPropertyName: "displayMode", publicName: "displayMode", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, maxSelections: { classPropertyName: "maxSelections", publicName: "maxSelections", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, helper: { classPropertyName: "helper", publicName: "helper", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, minChars: { classPropertyName: "minChars", publicName: "minChars", isSignal: true, isRequired: false, transformFunction: null }, noResultsText: { classPropertyName: "noResultsText", publicName: "noResultsText", isSignal: true, isRequired: false, transformFunction: null }, createText: { classPropertyName: "createText", publicName: "createText", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange", createRequested: "createRequested", searchChange: "searchChange", opened: "opened", closed: "closed" }, host: { listeners: { "keydown": "onKeyDown($event)", "document:click": "onDocumentClick($event)" } }, providers: [
16507
+ {
16508
+ provide: NG_VALUE_ACCESSOR,
16509
+ useExisting: forwardRef(() => DsEntityPicker),
16510
+ multi: true,
16511
+ },
16512
+ ], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }, { propertyName: "listbox", first: true, predicate: ["listbox"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"containerClasses()\">\n <!-- Label -->\n @if (label()) {\n <label class=\"ds-entity-picker__label\" [attr.for]=\"inputId()\">\n {{ label() }}\n @if (required()) {\n <span class=\"ds-entity-picker__required\">*</span>\n }\n </label>\n }\n\n <!-- Input wrapper -->\n <div class=\"ds-entity-picker__wrapper\"\n #triggerOrigin=\"cdkOverlayOrigin\"\n cdkOverlayOrigin>\n <!-- Chips (mode multiple) -->\n @if (multiple() && displayMode() === 'chip') {\n <div class=\"ds-entity-picker__chips\">\n @for (option of selectedOptions(); track option.value) {\n <ds-entity-chip\n [option]=\"option\"\n [size]=\"size()\"\n [removable]=\"!isDisabled()\"\n [disabled]=\"isDisabled()\"\n (removed)=\"removeOption($event)\"\n />\n }\n </div>\n }\n\n <!-- Count badge (mode count) -->\n @if (multiple() && displayMode() === 'count' && selectedOptions().length > 0) {\n <span class=\"ds-entity-picker__count\">\n {{ countText() }}\n </span>\n }\n\n <!-- Input -->\n <div class=\"ds-entity-picker__input-container\">\n <input\n #inputElement\n type=\"text\"\n [id]=\"inputId()\"\n [ngClass]=\"inputClasses()\"\n [placeholder]=\"multiple() ? placeholder() : (displayValue() || placeholder())\"\n [disabled]=\"isDisabled()\"\n [value]=\"multiple() ? searchQuery() : (searchQuery() || displayValue())\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-autocomplete]=\"'list'\"\n [attr.aria-controls]=\"listboxId()\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? getOptionId(focusedIndex()) : null\"\n role=\"combobox\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (input)=\"onSearchInput($event)\"\n />\n\n <!-- Icons -->\n <span class=\"ds-entity-picker__icons\">\n @if (clearable() && (selectedOptions().length > 0 || searchQuery())) {\n <button\n type=\"button\"\n class=\"ds-entity-picker__clear\"\n aria-label=\"Effacer\"\n tabindex=\"-1\"\n (mousedown)=\"clear($event)\"\n >\n <fa-icon [icon]=\"iconClear\" />\n </button>\n }\n <span class=\"ds-entity-picker__arrow\" [class.ds-entity-picker__arrow--open]=\"isOpen()\">\n <fa-icon [icon]=\"iconChevron\" />\n </span>\n </span>\n </div>\n </div>\n\n <!-- Dropdown (CDK Overlay) -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"shouldShowDropdown()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"triggerOrigin.elementRef.nativeElement.offsetWidth\"\n [cdkConnectedOverlayHasBackdrop]=\"false\"\n [cdkConnectedOverlayPanelClass]=\"'ds-entity-picker-overlay'\">\n <div class=\"ds-entity-picker__dropdown\" role=\"presentation\">\n <ul\n #listbox\n [id]=\"listboxId()\"\n class=\"ds-entity-picker__listbox\"\n role=\"listbox\"\n [attr.aria-label]=\"label() || 'Options'\"\n [attr.aria-multiselectable]=\"multiple()\"\n >\n @for (option of filteredOptions(); track trackOption($index, option); let i = $index) {\n <li\n [id]=\"getOptionId(i)\"\n class=\"ds-entity-picker__option\"\n [class.ds-entity-picker__option--focused]=\"isOptionFocused(i)\"\n [class.ds-entity-picker__option--selected]=\"isOptionSelected(option)\"\n [class.ds-entity-picker__option--disabled]=\"option.disabled || maxReached()\"\n [style.--option-color]=\"option.color || 'var(--gray-400)'\"\n role=\"option\"\n [attr.aria-selected]=\"isOptionSelected(option)\"\n [attr.aria-disabled]=\"option.disabled || maxReached()\"\n (mousedown)=\"selectOption(option)\"\n >\n <!-- Indicateur de couleur -->\n @if (option.color) {\n <span\n class=\"ds-entity-picker__option-indicator\"\n [style.background-color]=\"option.color\"\n ></span>\n }\n\n <!-- Emoji ou ic\u00F4ne -->\n @if (option.emoji) {\n <span class=\"ds-entity-picker__option-emoji\">{{ option.emoji }}</span>\n } @else if (option.icon) {\n <fa-icon\n class=\"ds-entity-picker__option-icon\"\n [icon]=\"option.icon\"\n [style.color]=\"option.color\"\n />\n }\n\n <!-- Contenu texte -->\n <span class=\"ds-entity-picker__option-content\">\n <span class=\"ds-entity-picker__option-label\">{{ option.label }}</span>\n @if (option.description) {\n <span class=\"ds-entity-picker__option-description\">{{ option.description }}</span>\n }\n </span>\n\n <!-- Check si s\u00E9lectionn\u00E9 -->\n @if (isOptionSelected(option)) {\n <svg\n class=\"ds-entity-picker__check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n }\n </li>\n } @empty {\n @if (!canCreate()) {\n <li class=\"ds-entity-picker__empty\" role=\"option\" aria-disabled=\"true\">\n {{ noResultsText() }}\n </li>\n }\n }\n\n <!-- Option de cr\u00E9ation -->\n @if (canCreate()) {\n <li\n class=\"ds-entity-picker__option ds-entity-picker__option--create\"\n [class.ds-entity-picker__option--focused]=\"isCreateFocused()\"\n role=\"option\"\n (mousedown)=\"requestCreate()\"\n >\n <fa-icon class=\"ds-entity-picker__option-icon\" [icon]=\"iconPlus\" />\n <span class=\"ds-entity-picker__option-content\">\n <span class=\"ds-entity-picker__option-label\">\n {{ formattedCreateText() }}\n </span>\n </span>\n </li>\n }\n </ul>\n </div>\n </ng-template>\n\n <!-- Helper / Error -->\n @if (error()) {\n <span class=\"ds-entity-picker__error\" role=\"alert\">{{ error() }}</span>\n } @else if (helper()) {\n <span class=\"ds-entity-picker__helper\">{{ helper() }}</span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ds-entity-picker{display:flex;flex-direction:column;gap:var(--space-1, .25rem);position:relative;width:100%;font-family:var(--font-family-base, sans-serif)}.ds-entity-picker__label{display:block;font-size:var(--font-size-sm, .875rem);font-weight:500;color:var(--text-default, #1a1a1a);margin-bottom:var(--space-1, .25rem)}.ds-entity-picker__required{color:var(--error, #ef4444);margin-left:var(--space-0-5, .125rem)}.ds-entity-picker__wrapper{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1, .25rem);padding:var(--space-1-5, .375rem) var(--space-2, .5rem);min-height:var(--input-height-md, 40px);background-color:var(--input-bg, #fff);border:1px solid var(--input-border, #d1d5db);border-radius:var(--radius-md, 6px);transition:border-color var(--duration-fast, .15s) var(--easing-default, ease),box-shadow var(--duration-fast, .15s) var(--easing-default, ease);cursor:text}.ds-entity-picker__wrapper:hover:not(.ds-entity-picker--disabled .ds-entity-picker__wrapper){border-color:var(--input-border-hover, #9ca3af)}.ds-entity-picker--open .ds-entity-picker__wrapper,.ds-entity-picker__wrapper:focus-within{border-color:var(--color-primary, #6366f1);box-shadow:0 0 0 3px var(--primary-100, rgba(99, 102, 241, .1))}.ds-entity-picker--error .ds-entity-picker__wrapper{border-color:var(--error, #ef4444)}.ds-entity-picker--error .ds-entity-picker__wrapper:focus-within{box-shadow:0 0 0 3px var(--error-100, rgba(239, 68, 68, .1))}.ds-entity-picker--disabled .ds-entity-picker__wrapper{background-color:var(--input-bg-disabled, #f3f4f6);border-color:var(--input-border-disabled, #e5e7eb);cursor:not-allowed;opacity:.6}.ds-entity-picker__chips{display:flex;flex-wrap:wrap;gap:var(--space-1, .25rem);max-width:100%}.ds-entity-picker__count{display:inline-flex;align-items:center;padding:var(--space-0-5, .125rem) var(--space-2, .5rem);background-color:var(--primary-100, #eef2ff);color:var(--color-primary, #6366f1);font-size:var(--font-size-sm, .875rem);font-weight:500;border-radius:var(--radius-pill, 9999px)}.ds-entity-picker__input-container{display:flex;align-items:center;flex:1;min-width:120px;position:relative}.ds-entity-picker__input{flex:1;min-width:0;padding:var(--space-1, .25rem) 0;border:none;background:transparent;font-family:inherit;font-size:var(--font-size-base, 1rem);color:var(--text-default, #1a1a1a);outline:none}.ds-entity-picker__input::placeholder{color:var(--text-muted, #9ca3af)}.ds-entity-picker__input:disabled{cursor:not-allowed}.ds-entity-picker__icons{display:flex;align-items:center;gap:var(--space-1, .25rem);margin-left:var(--space-1, .25rem);flex-shrink:0}.ds-entity-picker__clear{display:flex;align-items:center;justify-content:center;padding:var(--space-1, .25rem);border:none;background:none;color:var(--text-muted, #9ca3af);cursor:pointer;border-radius:var(--radius-sm, 4px);transition:color var(--duration-fast, .15s) var(--easing-default, ease),background-color var(--duration-fast, .15s) var(--easing-default, ease)}.ds-entity-picker__clear:hover{color:var(--text-default, #1a1a1a);background-color:var(--gray-100, #f3f4f6)}.ds-entity-picker__arrow{display:flex;align-items:center;color:var(--text-muted, #9ca3af);transition:transform var(--duration-fast, .15s) var(--easing-default, ease)}.ds-entity-picker__arrow--open{transform:rotate(180deg)}.ds-entity-picker__dropdown{background-color:var(--dropdown-bg, #fff);border:1px solid var(--dropdown-border, #e5e7eb);border-radius:var(--radius-md, 6px);box-shadow:var(--shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, .1));max-height:280px;overflow-y:auto;animation:slideDown .15s ease-out}@keyframes slideDown{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.ds-entity-picker__listbox{list-style:none;margin:0;padding:var(--space-1, .25rem)}.ds-entity-picker__option{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-2, .5rem) var(--space-3, .75rem);border-radius:var(--radius-sm, 4px);cursor:pointer;transition:background-color var(--duration-fast, .15s) var(--easing-default, ease)}.ds-entity-picker__option:hover:not(.ds-entity-picker__option--disabled){background-color:var(--gray-50, #f9fafb)}.ds-entity-picker__option--focused:not(.ds-entity-picker__option--disabled){background-color:var(--gray-100, #f3f4f6)}.ds-entity-picker__option--selected{background-color:var(--primary-50, #eef2ff)}.ds-entity-picker__option--selected:hover{background-color:var(--primary-100, #e0e7ff)}.ds-entity-picker__option--disabled{opacity:.5;cursor:not-allowed}.ds-entity-picker__option--create{border-top:1px solid var(--gray-200, #e5e7eb);margin-top:var(--space-1, .25rem);padding-top:var(--space-3, .75rem);color:var(--color-primary, #6366f1)}.ds-entity-picker__option--create .ds-entity-picker__option-icon{color:var(--color-primary, #6366f1)}.ds-entity-picker__option-indicator{width:4px;height:100%;min-height:24px;border-radius:var(--radius-pill, 9999px);flex-shrink:0;margin-right:var(--space-1, .25rem)}.ds-entity-picker__option-emoji{font-size:1.125rem;flex-shrink:0}.ds-entity-picker__option-icon{font-size:1rem;flex-shrink:0;color:var(--option-color, var(--gray-600))}.ds-entity-picker__option-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--space-0-5, .125rem)}.ds-entity-picker__option-label{font-size:var(--font-size-base, 1rem);color:var(--text-default, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-entity-picker__option-description{font-size:var(--font-size-sm, .875rem);color:var(--text-muted, #6b7280);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-entity-picker__check{flex-shrink:0;color:var(--color-primary, #6366f1)}.ds-entity-picker__empty{padding:var(--space-3, .75rem);text-align:center;color:var(--text-muted, #9ca3af);font-size:var(--font-size-sm, .875rem)}.ds-entity-picker__helper,.ds-entity-picker__error{font-size:var(--font-size-sm, .875rem);margin-top:var(--space-1, .25rem)}.ds-entity-picker__helper{color:var(--text-muted, #6b7280)}.ds-entity-picker__error{color:var(--error, #ef4444)}.ds-entity-picker--sm .ds-entity-picker__wrapper{min-height:var(--input-height-sm, 32px);padding:var(--space-1, .25rem) var(--space-1-5, .375rem)}.ds-entity-picker--sm .ds-entity-picker__input{font-size:var(--font-size-sm, .875rem)}.ds-entity-picker--sm .ds-entity-picker__option{padding:var(--space-1-5, .375rem) var(--space-2, .5rem)}.ds-entity-picker--sm .ds-entity-picker__option-label{font-size:var(--font-size-sm, .875rem)}.ds-entity-picker--sm .ds-entity-picker__option-description{font-size:var(--font-size-xs, .75rem)}.ds-entity-picker--lg .ds-entity-picker__wrapper{min-height:var(--input-height-lg, 48px);padding:var(--space-2, .5rem) var(--space-3, .75rem)}.ds-entity-picker--lg .ds-entity-picker__input{font-size:var(--font-size-lg, 1.125rem)}.ds-entity-picker--lg .ds-entity-picker__option{padding:var(--space-3, .75rem) var(--space-4, 1rem)}.ds-entity-picker--lg .ds-entity-picker__option-label{font-size:var(--font-size-lg, 1.125rem)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "component", type: DsEntityChip, selector: "ds-entity-chip", inputs: ["option", "size", "removable", "disabled"], outputs: ["removed"] }, { 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"], 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 });
16513
+ }
16514
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsEntityPicker, decorators: [{
16515
+ type: Component,
16516
+ args: [{ selector: 'ds-entity-picker', standalone: true, imports: [CommonModule, FontAwesomeModule, DsEntityChip, CdkConnectedOverlay, CdkOverlayOrigin], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
16517
+ {
16518
+ provide: NG_VALUE_ACCESSOR,
16519
+ useExisting: forwardRef(() => DsEntityPicker),
16520
+ multi: true,
16521
+ },
16522
+ ], template: "<div [ngClass]=\"containerClasses()\">\n <!-- Label -->\n @if (label()) {\n <label class=\"ds-entity-picker__label\" [attr.for]=\"inputId()\">\n {{ label() }}\n @if (required()) {\n <span class=\"ds-entity-picker__required\">*</span>\n }\n </label>\n }\n\n <!-- Input wrapper -->\n <div class=\"ds-entity-picker__wrapper\"\n #triggerOrigin=\"cdkOverlayOrigin\"\n cdkOverlayOrigin>\n <!-- Chips (mode multiple) -->\n @if (multiple() && displayMode() === 'chip') {\n <div class=\"ds-entity-picker__chips\">\n @for (option of selectedOptions(); track option.value) {\n <ds-entity-chip\n [option]=\"option\"\n [size]=\"size()\"\n [removable]=\"!isDisabled()\"\n [disabled]=\"isDisabled()\"\n (removed)=\"removeOption($event)\"\n />\n }\n </div>\n }\n\n <!-- Count badge (mode count) -->\n @if (multiple() && displayMode() === 'count' && selectedOptions().length > 0) {\n <span class=\"ds-entity-picker__count\">\n {{ countText() }}\n </span>\n }\n\n <!-- Input -->\n <div class=\"ds-entity-picker__input-container\">\n <input\n #inputElement\n type=\"text\"\n [id]=\"inputId()\"\n [ngClass]=\"inputClasses()\"\n [placeholder]=\"multiple() ? placeholder() : (displayValue() || placeholder())\"\n [disabled]=\"isDisabled()\"\n [value]=\"multiple() ? searchQuery() : (searchQuery() || displayValue())\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-autocomplete]=\"'list'\"\n [attr.aria-controls]=\"listboxId()\"\n [attr.aria-activedescendant]=\"focusedIndex() >= 0 ? getOptionId(focusedIndex()) : null\"\n role=\"combobox\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (input)=\"onSearchInput($event)\"\n />\n\n <!-- Icons -->\n <span class=\"ds-entity-picker__icons\">\n @if (clearable() && (selectedOptions().length > 0 || searchQuery())) {\n <button\n type=\"button\"\n class=\"ds-entity-picker__clear\"\n aria-label=\"Effacer\"\n tabindex=\"-1\"\n (mousedown)=\"clear($event)\"\n >\n <fa-icon [icon]=\"iconClear\" />\n </button>\n }\n <span class=\"ds-entity-picker__arrow\" [class.ds-entity-picker__arrow--open]=\"isOpen()\">\n <fa-icon [icon]=\"iconChevron\" />\n </span>\n </span>\n </div>\n </div>\n\n <!-- Dropdown (CDK Overlay) -->\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"shouldShowDropdown()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"triggerOrigin.elementRef.nativeElement.offsetWidth\"\n [cdkConnectedOverlayHasBackdrop]=\"false\"\n [cdkConnectedOverlayPanelClass]=\"'ds-entity-picker-overlay'\">\n <div class=\"ds-entity-picker__dropdown\" role=\"presentation\">\n <ul\n #listbox\n [id]=\"listboxId()\"\n class=\"ds-entity-picker__listbox\"\n role=\"listbox\"\n [attr.aria-label]=\"label() || 'Options'\"\n [attr.aria-multiselectable]=\"multiple()\"\n >\n @for (option of filteredOptions(); track trackOption($index, option); let i = $index) {\n <li\n [id]=\"getOptionId(i)\"\n class=\"ds-entity-picker__option\"\n [class.ds-entity-picker__option--focused]=\"isOptionFocused(i)\"\n [class.ds-entity-picker__option--selected]=\"isOptionSelected(option)\"\n [class.ds-entity-picker__option--disabled]=\"option.disabled || maxReached()\"\n [style.--option-color]=\"option.color || 'var(--gray-400)'\"\n role=\"option\"\n [attr.aria-selected]=\"isOptionSelected(option)\"\n [attr.aria-disabled]=\"option.disabled || maxReached()\"\n (mousedown)=\"selectOption(option)\"\n >\n <!-- Indicateur de couleur -->\n @if (option.color) {\n <span\n class=\"ds-entity-picker__option-indicator\"\n [style.background-color]=\"option.color\"\n ></span>\n }\n\n <!-- Emoji ou ic\u00F4ne -->\n @if (option.emoji) {\n <span class=\"ds-entity-picker__option-emoji\">{{ option.emoji }}</span>\n } @else if (option.icon) {\n <fa-icon\n class=\"ds-entity-picker__option-icon\"\n [icon]=\"option.icon\"\n [style.color]=\"option.color\"\n />\n }\n\n <!-- Contenu texte -->\n <span class=\"ds-entity-picker__option-content\">\n <span class=\"ds-entity-picker__option-label\">{{ option.label }}</span>\n @if (option.description) {\n <span class=\"ds-entity-picker__option-description\">{{ option.description }}</span>\n }\n </span>\n\n <!-- Check si s\u00E9lectionn\u00E9 -->\n @if (isOptionSelected(option)) {\n <svg\n class=\"ds-entity-picker__check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n >\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n }\n </li>\n } @empty {\n @if (!canCreate()) {\n <li class=\"ds-entity-picker__empty\" role=\"option\" aria-disabled=\"true\">\n {{ noResultsText() }}\n </li>\n }\n }\n\n <!-- Option de cr\u00E9ation -->\n @if (canCreate()) {\n <li\n class=\"ds-entity-picker__option ds-entity-picker__option--create\"\n [class.ds-entity-picker__option--focused]=\"isCreateFocused()\"\n role=\"option\"\n (mousedown)=\"requestCreate()\"\n >\n <fa-icon class=\"ds-entity-picker__option-icon\" [icon]=\"iconPlus\" />\n <span class=\"ds-entity-picker__option-content\">\n <span class=\"ds-entity-picker__option-label\">\n {{ formattedCreateText() }}\n </span>\n </span>\n </li>\n }\n </ul>\n </div>\n </ng-template>\n\n <!-- Helper / Error -->\n @if (error()) {\n <span class=\"ds-entity-picker__error\" role=\"alert\">{{ error() }}</span>\n } @else if (helper()) {\n <span class=\"ds-entity-picker__helper\">{{ helper() }}</span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ds-entity-picker{display:flex;flex-direction:column;gap:var(--space-1, .25rem);position:relative;width:100%;font-family:var(--font-family-base, sans-serif)}.ds-entity-picker__label{display:block;font-size:var(--font-size-sm, .875rem);font-weight:500;color:var(--text-default, #1a1a1a);margin-bottom:var(--space-1, .25rem)}.ds-entity-picker__required{color:var(--error, #ef4444);margin-left:var(--space-0-5, .125rem)}.ds-entity-picker__wrapper{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1, .25rem);padding:var(--space-1-5, .375rem) var(--space-2, .5rem);min-height:var(--input-height-md, 40px);background-color:var(--input-bg, #fff);border:1px solid var(--input-border, #d1d5db);border-radius:var(--radius-md, 6px);transition:border-color var(--duration-fast, .15s) var(--easing-default, ease),box-shadow var(--duration-fast, .15s) var(--easing-default, ease);cursor:text}.ds-entity-picker__wrapper:hover:not(.ds-entity-picker--disabled .ds-entity-picker__wrapper){border-color:var(--input-border-hover, #9ca3af)}.ds-entity-picker--open .ds-entity-picker__wrapper,.ds-entity-picker__wrapper:focus-within{border-color:var(--color-primary, #6366f1);box-shadow:0 0 0 3px var(--primary-100, rgba(99, 102, 241, .1))}.ds-entity-picker--error .ds-entity-picker__wrapper{border-color:var(--error, #ef4444)}.ds-entity-picker--error .ds-entity-picker__wrapper:focus-within{box-shadow:0 0 0 3px var(--error-100, rgba(239, 68, 68, .1))}.ds-entity-picker--disabled .ds-entity-picker__wrapper{background-color:var(--input-bg-disabled, #f3f4f6);border-color:var(--input-border-disabled, #e5e7eb);cursor:not-allowed;opacity:.6}.ds-entity-picker__chips{display:flex;flex-wrap:wrap;gap:var(--space-1, .25rem);max-width:100%}.ds-entity-picker__count{display:inline-flex;align-items:center;padding:var(--space-0-5, .125rem) var(--space-2, .5rem);background-color:var(--primary-100, #eef2ff);color:var(--color-primary, #6366f1);font-size:var(--font-size-sm, .875rem);font-weight:500;border-radius:var(--radius-pill, 9999px)}.ds-entity-picker__input-container{display:flex;align-items:center;flex:1;min-width:120px;position:relative}.ds-entity-picker__input{flex:1;min-width:0;padding:var(--space-1, .25rem) 0;border:none;background:transparent;font-family:inherit;font-size:var(--font-size-base, 1rem);color:var(--text-default, #1a1a1a);outline:none}.ds-entity-picker__input::placeholder{color:var(--text-muted, #9ca3af)}.ds-entity-picker__input:disabled{cursor:not-allowed}.ds-entity-picker__icons{display:flex;align-items:center;gap:var(--space-1, .25rem);margin-left:var(--space-1, .25rem);flex-shrink:0}.ds-entity-picker__clear{display:flex;align-items:center;justify-content:center;padding:var(--space-1, .25rem);border:none;background:none;color:var(--text-muted, #9ca3af);cursor:pointer;border-radius:var(--radius-sm, 4px);transition:color var(--duration-fast, .15s) var(--easing-default, ease),background-color var(--duration-fast, .15s) var(--easing-default, ease)}.ds-entity-picker__clear:hover{color:var(--text-default, #1a1a1a);background-color:var(--gray-100, #f3f4f6)}.ds-entity-picker__arrow{display:flex;align-items:center;color:var(--text-muted, #9ca3af);transition:transform var(--duration-fast, .15s) var(--easing-default, ease)}.ds-entity-picker__arrow--open{transform:rotate(180deg)}.ds-entity-picker__dropdown{background-color:var(--dropdown-bg, #fff);border:1px solid var(--dropdown-border, #e5e7eb);border-radius:var(--radius-md, 6px);box-shadow:var(--shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, .1));max-height:280px;overflow-y:auto;animation:slideDown .15s ease-out}@keyframes slideDown{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.ds-entity-picker__listbox{list-style:none;margin:0;padding:var(--space-1, .25rem)}.ds-entity-picker__option{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-2, .5rem) var(--space-3, .75rem);border-radius:var(--radius-sm, 4px);cursor:pointer;transition:background-color var(--duration-fast, .15s) var(--easing-default, ease)}.ds-entity-picker__option:hover:not(.ds-entity-picker__option--disabled){background-color:var(--gray-50, #f9fafb)}.ds-entity-picker__option--focused:not(.ds-entity-picker__option--disabled){background-color:var(--gray-100, #f3f4f6)}.ds-entity-picker__option--selected{background-color:var(--primary-50, #eef2ff)}.ds-entity-picker__option--selected:hover{background-color:var(--primary-100, #e0e7ff)}.ds-entity-picker__option--disabled{opacity:.5;cursor:not-allowed}.ds-entity-picker__option--create{border-top:1px solid var(--gray-200, #e5e7eb);margin-top:var(--space-1, .25rem);padding-top:var(--space-3, .75rem);color:var(--color-primary, #6366f1)}.ds-entity-picker__option--create .ds-entity-picker__option-icon{color:var(--color-primary, #6366f1)}.ds-entity-picker__option-indicator{width:4px;height:100%;min-height:24px;border-radius:var(--radius-pill, 9999px);flex-shrink:0;margin-right:var(--space-1, .25rem)}.ds-entity-picker__option-emoji{font-size:1.125rem;flex-shrink:0}.ds-entity-picker__option-icon{font-size:1rem;flex-shrink:0;color:var(--option-color, var(--gray-600))}.ds-entity-picker__option-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--space-0-5, .125rem)}.ds-entity-picker__option-label{font-size:var(--font-size-base, 1rem);color:var(--text-default, #1a1a1a);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-entity-picker__option-description{font-size:var(--font-size-sm, .875rem);color:var(--text-muted, #6b7280);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-entity-picker__check{flex-shrink:0;color:var(--color-primary, #6366f1)}.ds-entity-picker__empty{padding:var(--space-3, .75rem);text-align:center;color:var(--text-muted, #9ca3af);font-size:var(--font-size-sm, .875rem)}.ds-entity-picker__helper,.ds-entity-picker__error{font-size:var(--font-size-sm, .875rem);margin-top:var(--space-1, .25rem)}.ds-entity-picker__helper{color:var(--text-muted, #6b7280)}.ds-entity-picker__error{color:var(--error, #ef4444)}.ds-entity-picker--sm .ds-entity-picker__wrapper{min-height:var(--input-height-sm, 32px);padding:var(--space-1, .25rem) var(--space-1-5, .375rem)}.ds-entity-picker--sm .ds-entity-picker__input{font-size:var(--font-size-sm, .875rem)}.ds-entity-picker--sm .ds-entity-picker__option{padding:var(--space-1-5, .375rem) var(--space-2, .5rem)}.ds-entity-picker--sm .ds-entity-picker__option-label{font-size:var(--font-size-sm, .875rem)}.ds-entity-picker--sm .ds-entity-picker__option-description{font-size:var(--font-size-xs, .75rem)}.ds-entity-picker--lg .ds-entity-picker__wrapper{min-height:var(--input-height-lg, 48px);padding:var(--space-2, .5rem) var(--space-3, .75rem)}.ds-entity-picker--lg .ds-entity-picker__input{font-size:var(--font-size-lg, 1.125rem)}.ds-entity-picker--lg .ds-entity-picker__option{padding:var(--space-3, .75rem) var(--space-4, 1rem)}.ds-entity-picker--lg .ds-entity-picker__option-label{font-size:var(--font-size-lg, 1.125rem)}\n"] }]
16523
+ }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], allowCreate: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowCreate", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], displayMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "displayMode", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], maxSelections: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSelections", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], helper: [{ type: i0.Input, args: [{ isSignal: true, alias: "helper", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], minChars: [{ type: i0.Input, args: [{ isSignal: true, alias: "minChars", required: false }] }], noResultsText: [{ type: i0.Input, args: [{ isSignal: true, alias: "noResultsText", required: false }] }], createText: [{ type: i0.Input, args: [{ isSignal: true, alias: "createText", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], createRequested: [{ type: i0.Output, args: ["createRequested"] }], searchChange: [{ type: i0.Output, args: ["searchChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], inputElement: [{
16524
+ type: ViewChild,
16525
+ args: ['inputElement']
16526
+ }], listbox: [{
16527
+ type: ViewChild,
16528
+ args: ['listbox']
16529
+ }], onKeyDown: [{
16530
+ type: HostListener,
16531
+ args: ['keydown', ['$event']]
16532
+ }], onDocumentClick: [{
16533
+ type: HostListener,
16534
+ args: ['document:click', ['$event']]
16535
+ }] } });
16536
+
15930
16537
  /*
15931
16538
  * Components barrel export
15932
16539
  */
@@ -16413,5 +17020,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
16413
17020
  * Generated bundle index. Do not edit.
16414
17021
  */
16415
17022
 
16416
- export { AUTOCOMPLETE_POSITIONS, DROPDOWN_POSITIONS, DROPDOWN_POSITIONS_RIGHT, DROPDOWN_POSITIONS_TOP, DsAccordion, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCalendar, DsCard, DsCarousel, DsCheckbox, DsCheckboxList, DsChip, DsColorPicker, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDrawer, DsDropdown, DsEmpty, DsFileUpload, DsI18nService, DsInputField, DsInputNumber, DsInputTextarea, DsList, DsListGroup, DsListItem, DsMenu, DsModalComponent, DsNavList, DsNotificationContainerComponent, DsNotificationItemComponent, DsNotificationService, DsPagination, DsPasswordStrength, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsRating, DsSearchInput, DsSegmentedControl, DsSelect, DsSidebar, DsSidebarFooterItemComponent, DsSidebarItemComponent, DsSkeleton, DsSlider, DsStepper, DsTable, DsTabs, DsTimePicker, DsTimeline, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, DsTransfer, DsTree, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, SIDEBAR_POPOVER_POSITIONS_LEFT, SIDEBAR_POPOVER_POSITIONS_RIGHT, TOOLTIP_POSITIONS, generateId, generateShortId };
17023
+ export { AUTOCOMPLETE_POSITIONS, DROPDOWN_POSITIONS, DROPDOWN_POSITIONS_RIGHT, DROPDOWN_POSITIONS_TOP, DsAccordion, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCalendar, DsCard, DsCarousel, DsCheckbox, DsCheckboxList, DsChip, DsColorPicker, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDrawer, DsDropdown, DsEmpty, DsEntityChip, DsEntityPicker, DsFileUpload, DsI18nService, DsInputField, DsInputNumber, DsInputTextarea, DsList, DsListGroup, DsListItem, DsMenu, DsModalComponent, DsNavList, DsNotificationContainerComponent, DsNotificationItemComponent, DsNotificationService, DsPagination, DsPasswordStrength, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsRating, DsSearchInput, DsSegmentedControl, DsSelect, DsSidebar, DsSidebarFooterItemComponent, DsSidebarItemComponent, DsSkeleton, DsSlider, DsStepper, DsTable, DsTabs, DsTimePicker, DsTimeline, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, DsTransfer, DsTree, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, SIDEBAR_POPOVER_POSITIONS_LEFT, SIDEBAR_POPOVER_POSITIONS_RIGHT, TOOLTIP_POSITIONS, generateId, generateShortId };
16417
17024
  //# sourceMappingURL=kksdev-ds-angular.mjs.map