@kksdev/ds-angular 1.10.0 → 1.12.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.
@@ -1,12 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, Component, output, HostBinding, model, signal, computed, forwardRef, effect, ElementRef, ViewChildren, ViewChild, EventEmitter, inject, HostListener, ContentChild, Output, Directive, DestroyRef, Injectable, contentChildren, untracked, ChangeDetectionStrategy, viewChild, Input, ViewEncapsulation } from '@angular/core';
2
+ import { input, Component, output, HostBinding, model, signal, computed, forwardRef, effect, ElementRef, ViewChildren, ViewChild, EventEmitter, inject, HostListener, ContentChild, Output, Directive, DestroyRef, Injectable, contentChildren, untracked, ChangeDetectionStrategy, viewChild, Input, ViewEncapsulation, isDevMode } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule, DOCUMENT, NgClass, NgTemplateOutlet } from '@angular/common';
5
5
  import * as i1$1 from '@fortawesome/angular-fontawesome';
6
6
  import { FaIconComponent, FontAwesomeModule } from '@fortawesome/angular-fontawesome';
7
7
  import * as i1$4 from '@angular/forms';
8
8
  import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
9
- import { faInfoCircle, faTimesCircle, faExclamationTriangle, faCheckCircle, faTimes, faEye, faEyeSlash, faClose, faCircleInfo, faCircleXmark, faCircleExclamation, faCircleCheck, faChevronDown, faChevronLeft, faChevronRight, faAnglesLeft, faAnglesRight, faCheck, faSearch, faXmark, faSpinner, faCalendar, faCloudArrowUp, faFile, faFileImage, faFilePdf, faFileWord, faFileExcel, faInbox, faStar, faStarHalfStroke, faClock, faFolder, faFolderOpen, faCircle, faCircleHalfStroke, faTriangleExclamation, faMinus, faPlus, faEyeDropper, faExternalLinkAlt, faBars, faAngleLeft, faAngleRight } from '@fortawesome/free-solid-svg-icons';
9
+ import { faInfoCircle, faTimesCircle, faExclamationTriangle, faCheckCircle, faTimes, faEye, faEyeSlash, faClose, faCircleInfo, faCircleXmark, faCircleExclamation, faCircleCheck, faChevronDown, faChevronLeft, faChevronRight, faAnglesLeft, faAnglesRight, faCheck, faSearch, faXmark, faSpinner, faCalendar, faCloudArrowUp, faFile, faFileImage, faFilePdf, faFileWord, faFileExcel, faInbox, faStar, faStarHalfStroke, faClock, faFolder, faFolderOpen, faCircle, faCircleHalfStroke, faTriangleExclamation, faMinus, faPlus, faEyeDropper, faExternalLinkAlt, faBars, faAngleLeft, faAngleRight, faExclamationCircle } from '@fortawesome/free-solid-svg-icons';
10
10
  import * as i1$2 from '@angular/router';
11
11
  import { RouterModule, Router } from '@angular/router';
12
12
  import * as i1$3 from '@angular/cdk/overlay';
@@ -10651,6 +10651,8 @@ class DsTreeNodeComponent {
10651
10651
  selectable = input(true, ...(ngDevMode ? [{ debugName: "selectable" }] : []));
10652
10652
  checkable = input(false, ...(ngDevMode ? [{ debugName: "checkable" }] : []));
10653
10653
  showIcon = input(true, ...(ngDevMode ? [{ debugName: "showIcon" }] : []));
10654
+ showLine = input(false, ...(ngDevMode ? [{ debugName: "showLine" }] : []));
10655
+ isLast = input(false, ...(ngDevMode ? [{ debugName: "isLast" }] : []));
10654
10656
  selectedNodeId = input(null, ...(ngDevMode ? [{ debugName: "selectedNodeId" }] : []));
10655
10657
  expandedNodeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "expandedNodeIds" }] : []));
10656
10658
  checkedNodeIds = input(new Set(), ...(ngDevMode ? [{ debugName: "checkedNodeIds" }] : []));
@@ -10730,11 +10732,13 @@ class DsTreeNodeComponent {
10730
10732
  }
10731
10733
  }
10732
10734
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTreeNodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10733
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsTreeNodeComponent, isStandalone: true, selector: "ds-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, selectedNodeId: { classPropertyName: "selectedNodeId", publicName: "selectedNodeId", isSignal: true, isRequired: false, transformFunction: null }, expandedNodeIds: { classPropertyName: "expandedNodeIds", publicName: "expandedNodeIds", isSignal: true, isRequired: false, transformFunction: null }, checkedNodeIds: { classPropertyName: "checkedNodeIds", publicName: "checkedNodeIds", isSignal: true, isRequired: false, transformFunction: null }, getIndeterminateState: { classPropertyName: "getIndeterminateState", publicName: "getIndeterminateState", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeClick: "nodeClick", nodeToggle: "nodeToggle", nodeCheck: "nodeCheck" }, ngImport: i0, template: `
10735
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsTreeNodeComponent, isStandalone: true, selector: "ds-tree-node", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, showLine: { classPropertyName: "showLine", publicName: "showLine", isSignal: true, isRequired: false, transformFunction: null }, isLast: { classPropertyName: "isLast", publicName: "isLast", isSignal: true, isRequired: false, transformFunction: null }, selectedNodeId: { classPropertyName: "selectedNodeId", publicName: "selectedNodeId", isSignal: true, isRequired: false, transformFunction: null }, expandedNodeIds: { classPropertyName: "expandedNodeIds", publicName: "expandedNodeIds", isSignal: true, isRequired: false, transformFunction: null }, checkedNodeIds: { classPropertyName: "checkedNodeIds", publicName: "checkedNodeIds", isSignal: true, isRequired: false, transformFunction: null }, getIndeterminateState: { classPropertyName: "getIndeterminateState", publicName: "getIndeterminateState", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeClick: "nodeClick", nodeToggle: "nodeToggle", nodeCheck: "nodeCheck" }, ngImport: i0, template: `
10734
10736
  <div
10735
10737
  class="ds-tree-node"
10736
10738
  [class.ds-tree-node--selected]="isSelected()"
10737
10739
  [class.ds-tree-node--disabled]="node().disabled"
10740
+ [class.ds-tree-node--with-line]="showLine()"
10741
+ [class.ds-tree-node--last]="isLast()"
10738
10742
  [attr.role]="'treeitem'"
10739
10743
  [attr.aria-selected]="isSelected()"
10740
10744
  [attr.aria-expanded]="hasChildren() ? isExpanded() : null"
@@ -10747,6 +10751,11 @@ class DsTreeNodeComponent {
10747
10751
  (keydown.arrowLeft)="handleArrowLeft($event)">
10748
10752
 
10749
10753
  <div class="ds-tree-node__content" [style.padding-left.px]="level() * 20">
10754
+ <!-- Ligne horizontale (si showLine et niveau > 0) -->
10755
+ @if (showLine() && level() > 0) {
10756
+ <span class="ds-tree-node__line-horizontal"></span>
10757
+ }
10758
+
10750
10759
  <!-- Expand/collapse toggle -->
10751
10760
  @if (hasChildren()) {
10752
10761
  <button
@@ -10791,14 +10800,16 @@ class DsTreeNodeComponent {
10791
10800
 
10792
10801
  <!-- Children (recursive) -->
10793
10802
  @if (hasChildren() && isExpanded()) {
10794
- <div class="ds-tree-node__children" role="group">
10795
- @for (child of node().children; track child.id) {
10803
+ <div class="ds-tree-node__children" [class.ds-tree-node__children--with-line]="showLine()" role="group">
10804
+ @for (child of node().children; track child.id; let last = $last) {
10796
10805
  <ds-tree-node
10797
10806
  [node]="child"
10798
10807
  [level]="level() + 1"
10799
10808
  [selectable]="selectable()"
10800
10809
  [checkable]="checkable()"
10801
10810
  [showIcon]="showIcon()"
10811
+ [showLine]="showLine()"
10812
+ [isLast]="last"
10802
10813
  [selectedNodeId]="selectedNodeId()"
10803
10814
  [expandedNodeIds]="expandedNodeIds()"
10804
10815
  [checkedNodeIds]="checkedNodeIds()"
@@ -10810,7 +10821,7 @@ class DsTreeNodeComponent {
10810
10821
  }
10811
10822
  </div>
10812
10823
  }
10813
- `, isInline: true, styles: [".ds-tree-node{display:block;cursor:pointer;outline:none}.ds-tree-node__content{display:flex;align-items:center;gap:var(--space-2);padding:var(--tree-node-padding, var(--space-1, .25rem) var(--space-2, .5rem));border-radius:var(--radius-1);transition:background-color .15s ease;-webkit-user-select:none;user-select:none}.ds-tree-node__content:hover:not(.ds-tree-node--disabled .ds-tree-node__content){background-color:var(--tree-node-hover-bg, var(--gray-100))}.ds-tree-node:focus-visible .ds-tree-node__content{box-shadow:0 0 0 2px var(--color-primary)}.ds-tree-node--selected .ds-tree-node__content{background-color:var(--tree-node-selected-bg, var(--blue-100));color:var(--tree-node-selected-text, var(--color-primary))}.ds-tree-node--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;background:transparent;border:none;cursor:pointer;padding:0;color:var(--tree-toggle-color, var(--gray-600));transition:transform .2s ease;outline:none}.ds-tree-node__toggle:hover{color:var(--tree-toggle-hover-color, var(--gray-900))}.ds-tree-node__toggle:focus-visible{box-shadow:0 0 0 2px var(--color-primary);border-radius:var(--radius-1)}.ds-tree-node__toggle fa-icon{font-size:12px}.ds-tree-node__toggle-placeholder{display:inline-block;width:20px;height:20px}.ds-tree-node__checkbox{margin:0;cursor:pointer}.ds-tree-node__checkbox:disabled{cursor:not-allowed}.ds-tree-node__icon{color:var(--tree-icon-color, var(--gray-600));font-size:var(--tree-icon-size, 16px);flex-shrink:0}.ds-tree-node__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--tree-label-font-size, var(--font-size-base))}.ds-tree-node__children{margin-left:0}\n"], dependencies: [{ kind: "component", type: DsTreeNodeComponent, selector: "ds-tree-node", inputs: ["node", "level", "selectable", "checkable", "showIcon", "selectedNodeId", "expandedNodeIds", "checkedNodeIds", "getIndeterminateState"], outputs: ["nodeClick", "nodeToggle", "nodeCheck"] }, { 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 });
10824
+ `, isInline: true, styles: [".ds-tree-node{display:block;cursor:pointer;outline:none}.ds-tree-node__content{display:flex;align-items:center;gap:var(--space-2);padding:var(--tree-node-padding, var(--space-1, .25rem) var(--space-2, .5rem));border-radius:var(--radius-1);transition:background-color .15s ease;-webkit-user-select:none;user-select:none}.ds-tree-node__content:hover:not(.ds-tree-node--disabled .ds-tree-node__content){background-color:var(--tree-node-hover-bg, var(--gray-100))}.ds-tree-node:focus-visible .ds-tree-node__content{box-shadow:0 0 0 2px var(--color-primary)}.ds-tree-node--selected .ds-tree-node__content{background-color:var(--tree-node-selected-bg, var(--blue-100));color:var(--tree-node-selected-text, var(--color-primary))}.ds-tree-node--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;background:transparent;border:none;cursor:pointer;padding:0;color:var(--tree-toggle-color, var(--gray-600));transition:transform .2s ease;outline:none}.ds-tree-node__toggle:hover{color:var(--tree-toggle-hover-color, var(--gray-900))}.ds-tree-node__toggle:focus-visible{box-shadow:0 0 0 2px var(--color-primary);border-radius:var(--radius-1)}.ds-tree-node__toggle fa-icon{font-size:12px}.ds-tree-node__toggle-placeholder{display:inline-block;width:20px;height:20px}.ds-tree-node__checkbox{margin:0;cursor:pointer}.ds-tree-node__checkbox:disabled{cursor:not-allowed}.ds-tree-node__icon{color:var(--tree-icon-color, var(--gray-600));font-size:var(--tree-icon-size, 16px);flex-shrink:0}.ds-tree-node__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--tree-label-font-size, var(--font-size-base))}.ds-tree-node__children{margin-left:0}.ds-tree-node__children--with-line{position:relative;margin-left:var(--tree-indent, 20px)}.ds-tree-node--with-line,.ds-tree-node--with-line .ds-tree-node__content{position:relative}.ds-tree-node--with-line .ds-tree-node__line-horizontal{position:absolute;left:calc(var(--tree-indent, 20px) * -1);top:50%;transform:translateY(-50%);width:12px;height:var(--tree-line-width, 1px);background-color:var(--tree-line-color, var(--gray-300))}.ds-tree-node--with-line:before{content:\"\";position:absolute;left:calc(var(--tree-indent, 20px) * -1);top:0;bottom:0;width:var(--tree-line-width, 1px);background-color:var(--tree-line-color, var(--gray-300))}.ds-tree-node--with-line.ds-tree-node--last:before{bottom:auto;height:50%}.ds-tree-node--with-line:not(.ds-tree-node__children--with-line>.ds-tree-node):before{display:none}\n"], dependencies: [{ kind: "component", type: DsTreeNodeComponent, selector: "ds-tree-node", inputs: ["node", "level", "selectable", "checkable", "showIcon", "showLine", "isLast", "selectedNodeId", "expandedNodeIds", "checkedNodeIds", "getIndeterminateState"], outputs: ["nodeClick", "nodeToggle", "nodeCheck"] }, { 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 });
10814
10825
  }
10815
10826
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTreeNodeComponent, decorators: [{
10816
10827
  type: Component,
@@ -10819,6 +10830,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
10819
10830
  class="ds-tree-node"
10820
10831
  [class.ds-tree-node--selected]="isSelected()"
10821
10832
  [class.ds-tree-node--disabled]="node().disabled"
10833
+ [class.ds-tree-node--with-line]="showLine()"
10834
+ [class.ds-tree-node--last]="isLast()"
10822
10835
  [attr.role]="'treeitem'"
10823
10836
  [attr.aria-selected]="isSelected()"
10824
10837
  [attr.aria-expanded]="hasChildren() ? isExpanded() : null"
@@ -10831,6 +10844,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
10831
10844
  (keydown.arrowLeft)="handleArrowLeft($event)">
10832
10845
 
10833
10846
  <div class="ds-tree-node__content" [style.padding-left.px]="level() * 20">
10847
+ <!-- Ligne horizontale (si showLine et niveau > 0) -->
10848
+ @if (showLine() && level() > 0) {
10849
+ <span class="ds-tree-node__line-horizontal"></span>
10850
+ }
10851
+
10834
10852
  <!-- Expand/collapse toggle -->
10835
10853
  @if (hasChildren()) {
10836
10854
  <button
@@ -10875,14 +10893,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
10875
10893
 
10876
10894
  <!-- Children (recursive) -->
10877
10895
  @if (hasChildren() && isExpanded()) {
10878
- <div class="ds-tree-node__children" role="group">
10879
- @for (child of node().children; track child.id) {
10896
+ <div class="ds-tree-node__children" [class.ds-tree-node__children--with-line]="showLine()" role="group">
10897
+ @for (child of node().children; track child.id; let last = $last) {
10880
10898
  <ds-tree-node
10881
10899
  [node]="child"
10882
10900
  [level]="level() + 1"
10883
10901
  [selectable]="selectable()"
10884
10902
  [checkable]="checkable()"
10885
10903
  [showIcon]="showIcon()"
10904
+ [showLine]="showLine()"
10905
+ [isLast]="last"
10886
10906
  [selectedNodeId]="selectedNodeId()"
10887
10907
  [expandedNodeIds]="expandedNodeIds()"
10888
10908
  [checkedNodeIds]="checkedNodeIds()"
@@ -10894,8 +10914,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
10894
10914
  }
10895
10915
  </div>
10896
10916
  }
10897
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ds-tree-node{display:block;cursor:pointer;outline:none}.ds-tree-node__content{display:flex;align-items:center;gap:var(--space-2);padding:var(--tree-node-padding, var(--space-1, .25rem) var(--space-2, .5rem));border-radius:var(--radius-1);transition:background-color .15s ease;-webkit-user-select:none;user-select:none}.ds-tree-node__content:hover:not(.ds-tree-node--disabled .ds-tree-node__content){background-color:var(--tree-node-hover-bg, var(--gray-100))}.ds-tree-node:focus-visible .ds-tree-node__content{box-shadow:0 0 0 2px var(--color-primary)}.ds-tree-node--selected .ds-tree-node__content{background-color:var(--tree-node-selected-bg, var(--blue-100));color:var(--tree-node-selected-text, var(--color-primary))}.ds-tree-node--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;background:transparent;border:none;cursor:pointer;padding:0;color:var(--tree-toggle-color, var(--gray-600));transition:transform .2s ease;outline:none}.ds-tree-node__toggle:hover{color:var(--tree-toggle-hover-color, var(--gray-900))}.ds-tree-node__toggle:focus-visible{box-shadow:0 0 0 2px var(--color-primary);border-radius:var(--radius-1)}.ds-tree-node__toggle fa-icon{font-size:12px}.ds-tree-node__toggle-placeholder{display:inline-block;width:20px;height:20px}.ds-tree-node__checkbox{margin:0;cursor:pointer}.ds-tree-node__checkbox:disabled{cursor:not-allowed}.ds-tree-node__icon{color:var(--tree-icon-color, var(--gray-600));font-size:var(--tree-icon-size, 16px);flex-shrink:0}.ds-tree-node__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--tree-label-font-size, var(--font-size-base))}.ds-tree-node__children{margin-left:0}\n"] }]
10898
- }], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], checkable: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkable", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], selectedNodeId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedNodeId", required: false }] }], expandedNodeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedNodeIds", required: false }] }], checkedNodeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkedNodeIds", required: false }] }], getIndeterminateState: [{ type: i0.Input, args: [{ isSignal: true, alias: "getIndeterminateState", required: false }] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeToggle: [{ type: i0.Output, args: ["nodeToggle"] }], nodeCheck: [{ type: i0.Output, args: ["nodeCheck"] }] } });
10917
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ds-tree-node{display:block;cursor:pointer;outline:none}.ds-tree-node__content{display:flex;align-items:center;gap:var(--space-2);padding:var(--tree-node-padding, var(--space-1, .25rem) var(--space-2, .5rem));border-radius:var(--radius-1);transition:background-color .15s ease;-webkit-user-select:none;user-select:none}.ds-tree-node__content:hover:not(.ds-tree-node--disabled .ds-tree-node__content){background-color:var(--tree-node-hover-bg, var(--gray-100))}.ds-tree-node:focus-visible .ds-tree-node__content{box-shadow:0 0 0 2px var(--color-primary)}.ds-tree-node--selected .ds-tree-node__content{background-color:var(--tree-node-selected-bg, var(--blue-100));color:var(--tree-node-selected-text, var(--color-primary))}.ds-tree-node--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-tree-node__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;background:transparent;border:none;cursor:pointer;padding:0;color:var(--tree-toggle-color, var(--gray-600));transition:transform .2s ease;outline:none}.ds-tree-node__toggle:hover{color:var(--tree-toggle-hover-color, var(--gray-900))}.ds-tree-node__toggle:focus-visible{box-shadow:0 0 0 2px var(--color-primary);border-radius:var(--radius-1)}.ds-tree-node__toggle fa-icon{font-size:12px}.ds-tree-node__toggle-placeholder{display:inline-block;width:20px;height:20px}.ds-tree-node__checkbox{margin:0;cursor:pointer}.ds-tree-node__checkbox:disabled{cursor:not-allowed}.ds-tree-node__icon{color:var(--tree-icon-color, var(--gray-600));font-size:var(--tree-icon-size, 16px);flex-shrink:0}.ds-tree-node__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--tree-label-font-size, var(--font-size-base))}.ds-tree-node__children{margin-left:0}.ds-tree-node__children--with-line{position:relative;margin-left:var(--tree-indent, 20px)}.ds-tree-node--with-line,.ds-tree-node--with-line .ds-tree-node__content{position:relative}.ds-tree-node--with-line .ds-tree-node__line-horizontal{position:absolute;left:calc(var(--tree-indent, 20px) * -1);top:50%;transform:translateY(-50%);width:12px;height:var(--tree-line-width, 1px);background-color:var(--tree-line-color, var(--gray-300))}.ds-tree-node--with-line:before{content:\"\";position:absolute;left:calc(var(--tree-indent, 20px) * -1);top:0;bottom:0;width:var(--tree-line-width, 1px);background-color:var(--tree-line-color, var(--gray-300))}.ds-tree-node--with-line.ds-tree-node--last:before{bottom:auto;height:50%}.ds-tree-node--with-line:not(.ds-tree-node__children--with-line>.ds-tree-node):before{display:none}\n"] }]
10918
+ }], propDecorators: { node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], checkable: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkable", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], showLine: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLine", required: false }] }], isLast: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLast", required: false }] }], selectedNodeId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedNodeId", required: false }] }], expandedNodeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedNodeIds", required: false }] }], checkedNodeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkedNodeIds", required: false }] }], getIndeterminateState: [{ type: i0.Input, args: [{ isSignal: true, alias: "getIndeterminateState", required: false }] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeToggle: [{ type: i0.Output, args: ["nodeToggle"] }], nodeCheck: [{ type: i0.Output, args: ["nodeCheck"] }] } });
10899
10919
 
10900
10920
  /**
10901
10921
  * DsTree - Composant d'affichage hiérarchique
@@ -11069,11 +11089,11 @@ class DsTree {
11069
11089
  this.expandedNodeIds.set(expandedIds);
11070
11090
  }
11071
11091
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTree, deps: [], target: i0.ɵɵFactoryTarget.Component });
11072
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsTree, isStandalone: true, selector: "ds-tree", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, expandAll: { classPropertyName: "expandAll", publicName: "expandAll", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, showLine: { classPropertyName: "showLine", publicName: "showLine", isSignal: true, isRequired: false, transformFunction: null }, draggable: { classPropertyName: "draggable", publicName: "draggable", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, loadChildren: { classPropertyName: "loadChildren", publicName: "loadChildren", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeSelect: "nodeSelect", nodeExpand: "nodeExpand", nodeCheck: "nodeCheck" }, ngImport: i0, template: "<div [class]=\"containerClasses()\" role=\"tree\">\n @if (processedData().length === 0) {\n <div class=\"ds-tree__empty\">\n <p>No data available</p>\n </div>\n } @else {\n @for (node of processedData(); track node.id) {\n <ds-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [selectable]=\"selectable()\"\n [checkable]=\"checkable()\"\n [showIcon]=\"showIcon()\"\n [selectedNodeId]=\"selectedNodeId()\"\n [expandedNodeIds]=\"expandedNodeIds()\"\n [checkedNodeIds]=\"checkedNodeIds()\"\n [getIndeterminateState]=\"getIndeterminateState.bind(this)\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeToggle)=\"onNodeToggle($event)\"\n (nodeCheck)=\"onNodeCheck($event.node, $event.checked)\">\n </ds-tree-node>\n }\n }\n</div>\n", styles: [".ds-tree{display:block;width:100%;background-color:var(--tree-bg, var(--white));border:1px solid var(--tree-border, var(--gray-300));border-radius:var(--radius-2);padding:var(--space-2);max-height:400px;overflow-y:auto}.ds-tree__empty{display:flex;align-items:center;justify-content:center;padding:var(--space-8);color:var(--text-muted, var(--gray-500));font-size:var(--font-size-sm)}.ds-tree--sm{font-size:var(--font-size-sm);padding:var(--space-1)}.ds-tree--lg{font-size:var(--font-size-lg);padding:var(--space-3)}.ds-tree::-webkit-scrollbar{width:8px}.ds-tree::-webkit-scrollbar-track{background:var(--gray-100);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb{background:var(--gray-400);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb:hover{background:var(--gray-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsTreeNodeComponent, selector: "ds-tree-node", inputs: ["node", "level", "selectable", "checkable", "showIcon", "selectedNodeId", "expandedNodeIds", "checkedNodeIds", "getIndeterminateState"], outputs: ["nodeClick", "nodeToggle", "nodeCheck"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11092
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsTree, isStandalone: true, selector: "ds-tree", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, checkable: { classPropertyName: "checkable", publicName: "checkable", isSignal: true, isRequired: false, transformFunction: null }, expandAll: { classPropertyName: "expandAll", publicName: "expandAll", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, showLine: { classPropertyName: "showLine", publicName: "showLine", isSignal: true, isRequired: false, transformFunction: null }, draggable: { classPropertyName: "draggable", publicName: "draggable", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, loadChildren: { classPropertyName: "loadChildren", publicName: "loadChildren", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeSelect: "nodeSelect", nodeExpand: "nodeExpand", nodeCheck: "nodeCheck" }, ngImport: i0, template: "<div [class]=\"containerClasses()\" role=\"tree\">\n @if (processedData().length === 0) {\n <div class=\"ds-tree__empty\">\n <p>No data available</p>\n </div>\n } @else {\n @for (node of processedData(); track node.id; let last = $last) {\n <ds-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [selectable]=\"selectable()\"\n [checkable]=\"checkable()\"\n [showIcon]=\"showIcon()\"\n [showLine]=\"showLine()\"\n [isLast]=\"last\"\n [selectedNodeId]=\"selectedNodeId()\"\n [expandedNodeIds]=\"expandedNodeIds()\"\n [checkedNodeIds]=\"checkedNodeIds()\"\n [getIndeterminateState]=\"getIndeterminateState.bind(this)\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeToggle)=\"onNodeToggle($event)\"\n (nodeCheck)=\"onNodeCheck($event.node, $event.checked)\">\n </ds-tree-node>\n }\n }\n</div>\n", styles: [".ds-tree{display:block;width:100%;background-color:var(--tree-bg, var(--white));border:1px solid var(--tree-border, var(--gray-300));border-radius:var(--radius-2);padding:var(--space-2);max-height:400px;overflow-y:auto}.ds-tree__empty{display:flex;align-items:center;justify-content:center;padding:var(--space-8);color:var(--text-muted, var(--gray-500));font-size:var(--font-size-sm)}.ds-tree--sm{font-size:var(--font-size-sm);padding:var(--space-1)}.ds-tree--lg{font-size:var(--font-size-lg);padding:var(--space-3)}.ds-tree::-webkit-scrollbar{width:8px}.ds-tree::-webkit-scrollbar-track{background:var(--gray-100);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb{background:var(--gray-400);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb:hover{background:var(--gray-500)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DsTreeNodeComponent, selector: "ds-tree-node", inputs: ["node", "level", "selectable", "checkable", "showIcon", "showLine", "isLast", "selectedNodeId", "expandedNodeIds", "checkedNodeIds", "getIndeterminateState"], outputs: ["nodeClick", "nodeToggle", "nodeCheck"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11073
11093
  }
11074
11094
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTree, decorators: [{
11075
11095
  type: Component,
11076
- args: [{ selector: 'ds-tree', standalone: true, imports: [CommonModule, DsTreeNodeComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"containerClasses()\" role=\"tree\">\n @if (processedData().length === 0) {\n <div class=\"ds-tree__empty\">\n <p>No data available</p>\n </div>\n } @else {\n @for (node of processedData(); track node.id) {\n <ds-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [selectable]=\"selectable()\"\n [checkable]=\"checkable()\"\n [showIcon]=\"showIcon()\"\n [selectedNodeId]=\"selectedNodeId()\"\n [expandedNodeIds]=\"expandedNodeIds()\"\n [checkedNodeIds]=\"checkedNodeIds()\"\n [getIndeterminateState]=\"getIndeterminateState.bind(this)\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeToggle)=\"onNodeToggle($event)\"\n (nodeCheck)=\"onNodeCheck($event.node, $event.checked)\">\n </ds-tree-node>\n }\n }\n</div>\n", styles: [".ds-tree{display:block;width:100%;background-color:var(--tree-bg, var(--white));border:1px solid var(--tree-border, var(--gray-300));border-radius:var(--radius-2);padding:var(--space-2);max-height:400px;overflow-y:auto}.ds-tree__empty{display:flex;align-items:center;justify-content:center;padding:var(--space-8);color:var(--text-muted, var(--gray-500));font-size:var(--font-size-sm)}.ds-tree--sm{font-size:var(--font-size-sm);padding:var(--space-1)}.ds-tree--lg{font-size:var(--font-size-lg);padding:var(--space-3)}.ds-tree::-webkit-scrollbar{width:8px}.ds-tree::-webkit-scrollbar-track{background:var(--gray-100);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb{background:var(--gray-400);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb:hover{background:var(--gray-500)}\n"] }]
11096
+ args: [{ selector: 'ds-tree', standalone: true, imports: [CommonModule, DsTreeNodeComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"containerClasses()\" role=\"tree\">\n @if (processedData().length === 0) {\n <div class=\"ds-tree__empty\">\n <p>No data available</p>\n </div>\n } @else {\n @for (node of processedData(); track node.id; let last = $last) {\n <ds-tree-node\n [node]=\"node\"\n [level]=\"0\"\n [selectable]=\"selectable()\"\n [checkable]=\"checkable()\"\n [showIcon]=\"showIcon()\"\n [showLine]=\"showLine()\"\n [isLast]=\"last\"\n [selectedNodeId]=\"selectedNodeId()\"\n [expandedNodeIds]=\"expandedNodeIds()\"\n [checkedNodeIds]=\"checkedNodeIds()\"\n [getIndeterminateState]=\"getIndeterminateState.bind(this)\"\n (nodeClick)=\"onNodeClick($event)\"\n (nodeToggle)=\"onNodeToggle($event)\"\n (nodeCheck)=\"onNodeCheck($event.node, $event.checked)\">\n </ds-tree-node>\n }\n }\n</div>\n", styles: [".ds-tree{display:block;width:100%;background-color:var(--tree-bg, var(--white));border:1px solid var(--tree-border, var(--gray-300));border-radius:var(--radius-2);padding:var(--space-2);max-height:400px;overflow-y:auto}.ds-tree__empty{display:flex;align-items:center;justify-content:center;padding:var(--space-8);color:var(--text-muted, var(--gray-500));font-size:var(--font-size-sm)}.ds-tree--sm{font-size:var(--font-size-sm);padding:var(--space-1)}.ds-tree--lg{font-size:var(--font-size-lg);padding:var(--space-3)}.ds-tree::-webkit-scrollbar{width:8px}.ds-tree::-webkit-scrollbar-track{background:var(--gray-100);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb{background:var(--gray-400);border-radius:var(--radius-1)}.ds-tree::-webkit-scrollbar-thumb:hover{background:var(--gray-500)}\n"] }]
11077
11097
  }], ctorParameters: () => [], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], checkable: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkable", required: false }] }], expandAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandAll", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], showLine: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLine", required: false }] }], draggable: [{ type: i0.Input, args: [{ isSignal: true, alias: "draggable", required: false }] }], virtualScroll: [{ type: i0.Input, args: [{ isSignal: true, alias: "virtualScroll", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], loadChildren: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadChildren", required: false }] }], nodeSelect: [{ type: i0.Output, args: ["nodeSelect"] }], nodeExpand: [{ type: i0.Output, args: ["nodeExpand"] }], nodeCheck: [{ type: i0.Output, args: ["nodeCheck"] }] } });
11078
11098
 
11079
11099
  /**
@@ -14439,7 +14459,7 @@ class DsSidebarItemComponent {
14439
14459
  }
14440
14460
  </div>
14441
14461
  }
14442
- `, isInline: true, styles: [":host{display:block}.ds-sidebar-item{display:flex;align-items:center;gap:var(--space-2, .5rem);min-height:var(--sidebar-item-height, 44px);padding:var(--sidebar-item-padding, .5rem 1rem);border-radius:var(--sidebar-item-radius, 6px);cursor:pointer;color:var(--sidebar-text, inherit);text-decoration:none;transition:background-color .15s ease,color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.ds-sidebar-item:hover:not(.ds-sidebar-item--disabled){background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-item--active{background:var(--sidebar-item-active-bg, rgba(59, 130, 246, .1));color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--active .ds-sidebar-item__icon{color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-item--collapsed-mode{justify-content:center;padding:var(--space-2, .5rem);gap:0}.ds-sidebar-item--collapsed-mode .ds-sidebar-item__icon{margin:0}.ds-sidebar-item__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;flex-shrink:0;transition:transform .2s ease}.ds-sidebar-item__toggle:hover{color:var(--color-primary, #3b82f6)}.ds-sidebar-item__toggle-placeholder{width:20px;flex-shrink:0}.ds-sidebar-item__icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);color:var(--sidebar-icon-color, currentColor);opacity:.8}.ds-sidebar-item__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:inherit;font-size:var(--font-size-sm, .875rem);line-height:1.4}.ds-sidebar-item__label--router-active{font-weight:600}.ds-sidebar-item__external-icon{margin-left:var(--space-1, .25rem);font-size:.75em;opacity:.6}.ds-sidebar-item__badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-item__badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-item__badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-item__badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-item__badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-item__badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-item__badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-item__divider{height:1px;margin:var(--space-2, .5rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}.ds-sidebar-popover{background:var(--popover-bg, var(--sidebar-bg, #ffffff));border:1px solid var(--popover-border, var(--sidebar-border, #e5e7eb));border-radius:var(--popover-radius, 8px);box-shadow:var(--popover-shadow, var(--shadow-2, 0 4px 6px -1px rgba(0, 0, 0, .1)));min-width:200px;max-width:280px;overflow:hidden;animation:popoverSlideIn .15s ease-out}@keyframes popoverSlideIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.ds-sidebar-popover__header{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-3, .75rem) var(--space-4, 1rem);background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .03));border-bottom:1px solid var(--sidebar-border, rgba(0, 0, 0, .1));font-weight:600;font-size:var(--font-size-sm, .875rem);color:var(--sidebar-text, inherit)}.ds-sidebar-popover__header-icon{font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__header-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__body{padding:var(--space-1, .25rem) 0;max-height:300px;overflow-y:auto}.ds-sidebar-popover__item{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-2, .5rem) var(--space-4, 1rem);cursor:pointer;color:var(--sidebar-text, inherit);transition:background-color .15s ease;outline:none;font-size:var(--font-size-sm, .875rem)}.ds-sidebar-popover__item:hover,.ds-sidebar-popover__item--active{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-popover__item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-popover__item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-popover__item-icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__item-badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-popover__item-badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-popover__item-badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-popover__item-badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-popover__item-badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-popover__item-badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-popover__item-badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-popover__item-chevron{font-size:.75rem;opacity:.5;flex-shrink:0}.ds-sidebar-popover__divider{height:1px;margin:var(--space-1, .25rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}.ds-sidebar-item--popover-open{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}\n"], dependencies: [{ kind: "component", type: DsSidebarItemComponent, selector: "ds-sidebar-item", inputs: ["item", "level", "mode", "showTooltip", "expandedItemIds", "activeItemId", "sidebarPosition", "collapsedTrigger"], outputs: ["itemClick", "itemToggle", "itemKeydown"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { 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: "directive", type: DsTooltip, selector: "[dsTooltip]", inputs: ["dsTooltip"] }, { 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 });
14462
+ `, isInline: true, styles: [":host{display:block}.ds-sidebar-item{display:flex;align-items:center;gap:var(--space-2, .5rem);min-height:var(--sidebar-item-height, 44px);padding:var(--sidebar-item-padding, .5rem 1rem);border-radius:var(--sidebar-item-radius, 6px);cursor:pointer;color:var(--sidebar-text, inherit);text-decoration:none;transition:background-color .15s ease,color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.ds-sidebar-item:hover:not(.ds-sidebar-item--disabled){background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-item--active{background:var(--sidebar-item-active-bg, rgba(59, 130, 246, .1));color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--active .ds-sidebar-item__icon{color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-item--collapsed-mode{justify-content:center;padding:var(--space-2, .5rem);gap:0}.ds-sidebar-item--collapsed-mode .ds-sidebar-item__icon{margin:0}.ds-sidebar-item--popover-open{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;flex-shrink:0;transition:transform .2s ease}.ds-sidebar-item__toggle:hover{color:var(--color-primary, #3b82f6)}.ds-sidebar-item__toggle-placeholder{width:20px;flex-shrink:0}.ds-sidebar-item__icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);color:var(--sidebar-icon-color, currentColor);opacity:.8}.ds-sidebar-item__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:inherit;font-size:var(--font-size-sm, .875rem);line-height:1.4}.ds-sidebar-item__label--router-active{font-weight:600}.ds-sidebar-item__external-icon{margin-left:var(--space-1, .25rem);font-size:.75em;opacity:.6}.ds-sidebar-item__badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-item__badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-item__badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-item__badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-item__badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-item__badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-item__badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-item__divider{height:1px;margin:var(--space-2, .5rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}.ds-sidebar-popover{background:var(--popover-bg, var(--sidebar-bg, #ffffff));border:1px solid var(--popover-border, var(--sidebar-border, #e5e7eb));border-radius:var(--popover-radius, 8px);box-shadow:var(--popover-shadow, var(--shadow-2, 0 4px 6px -1px rgba(0, 0, 0, .1)));min-width:200px;max-width:280px;overflow:hidden;animation:popoverSlideIn .15s ease-out}.ds-sidebar-popover__header{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-3, .75rem) var(--space-4, 1rem);background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .03));border-bottom:1px solid var(--sidebar-border, rgba(0, 0, 0, .1));font-weight:600;font-size:var(--font-size-sm, .875rem);color:var(--sidebar-text, inherit)}.ds-sidebar-popover__header-icon{font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__header-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__body{padding:var(--space-1, .25rem) 0;max-height:300px;overflow-y:auto}.ds-sidebar-popover__item{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-2, .5rem) var(--space-4, 1rem);cursor:pointer;color:var(--sidebar-text, inherit);transition:background-color .15s ease;outline:none;font-size:var(--font-size-sm, .875rem)}.ds-sidebar-popover__item:hover,.ds-sidebar-popover__item--active{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-popover__item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-popover__item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-popover__item-icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__item-badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-popover__item-badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-popover__item-badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-popover__item-badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-popover__item-badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-popover__item-badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-popover__item-badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-popover__item-chevron{font-size:.75rem;opacity:.5;flex-shrink:0}.ds-sidebar-popover__divider{height:1px;margin:var(--space-1, .25rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}@keyframes popoverSlideIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}\n"], dependencies: [{ kind: "component", type: DsSidebarItemComponent, selector: "ds-sidebar-item", inputs: ["item", "level", "mode", "showTooltip", "expandedItemIds", "activeItemId", "sidebarPosition", "collapsedTrigger"], outputs: ["itemClick", "itemToggle", "itemKeydown"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { 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: "directive", type: DsTooltip, selector: "[dsTooltip]", inputs: ["dsTooltip"] }, { 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 });
14443
14463
  }
14444
14464
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsSidebarItemComponent, decorators: [{
14445
14465
  type: Component,
@@ -14624,7 +14644,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
14624
14644
  }
14625
14645
  </div>
14626
14646
  }
14627
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.ds-sidebar-item{display:flex;align-items:center;gap:var(--space-2, .5rem);min-height:var(--sidebar-item-height, 44px);padding:var(--sidebar-item-padding, .5rem 1rem);border-radius:var(--sidebar-item-radius, 6px);cursor:pointer;color:var(--sidebar-text, inherit);text-decoration:none;transition:background-color .15s ease,color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.ds-sidebar-item:hover:not(.ds-sidebar-item--disabled){background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-item--active{background:var(--sidebar-item-active-bg, rgba(59, 130, 246, .1));color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--active .ds-sidebar-item__icon{color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-item--collapsed-mode{justify-content:center;padding:var(--space-2, .5rem);gap:0}.ds-sidebar-item--collapsed-mode .ds-sidebar-item__icon{margin:0}.ds-sidebar-item__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;flex-shrink:0;transition:transform .2s ease}.ds-sidebar-item__toggle:hover{color:var(--color-primary, #3b82f6)}.ds-sidebar-item__toggle-placeholder{width:20px;flex-shrink:0}.ds-sidebar-item__icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);color:var(--sidebar-icon-color, currentColor);opacity:.8}.ds-sidebar-item__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:inherit;font-size:var(--font-size-sm, .875rem);line-height:1.4}.ds-sidebar-item__label--router-active{font-weight:600}.ds-sidebar-item__external-icon{margin-left:var(--space-1, .25rem);font-size:.75em;opacity:.6}.ds-sidebar-item__badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-item__badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-item__badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-item__badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-item__badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-item__badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-item__badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-item__divider{height:1px;margin:var(--space-2, .5rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}.ds-sidebar-popover{background:var(--popover-bg, var(--sidebar-bg, #ffffff));border:1px solid var(--popover-border, var(--sidebar-border, #e5e7eb));border-radius:var(--popover-radius, 8px);box-shadow:var(--popover-shadow, var(--shadow-2, 0 4px 6px -1px rgba(0, 0, 0, .1)));min-width:200px;max-width:280px;overflow:hidden;animation:popoverSlideIn .15s ease-out}@keyframes popoverSlideIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.ds-sidebar-popover__header{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-3, .75rem) var(--space-4, 1rem);background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .03));border-bottom:1px solid var(--sidebar-border, rgba(0, 0, 0, .1));font-weight:600;font-size:var(--font-size-sm, .875rem);color:var(--sidebar-text, inherit)}.ds-sidebar-popover__header-icon{font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__header-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__body{padding:var(--space-1, .25rem) 0;max-height:300px;overflow-y:auto}.ds-sidebar-popover__item{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-2, .5rem) var(--space-4, 1rem);cursor:pointer;color:var(--sidebar-text, inherit);transition:background-color .15s ease;outline:none;font-size:var(--font-size-sm, .875rem)}.ds-sidebar-popover__item:hover,.ds-sidebar-popover__item--active{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-popover__item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-popover__item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-popover__item-icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__item-badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-popover__item-badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-popover__item-badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-popover__item-badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-popover__item-badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-popover__item-badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-popover__item-badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-popover__item-chevron{font-size:.75rem;opacity:.5;flex-shrink:0}.ds-sidebar-popover__divider{height:1px;margin:var(--space-1, .25rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}.ds-sidebar-item--popover-open{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}\n"] }]
14647
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.ds-sidebar-item{display:flex;align-items:center;gap:var(--space-2, .5rem);min-height:var(--sidebar-item-height, 44px);padding:var(--sidebar-item-padding, .5rem 1rem);border-radius:var(--sidebar-item-radius, 6px);cursor:pointer;color:var(--sidebar-text, inherit);text-decoration:none;transition:background-color .15s ease,color .15s ease;outline:none;-webkit-user-select:none;user-select:none}.ds-sidebar-item:hover:not(.ds-sidebar-item--disabled){background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-item--active{background:var(--sidebar-item-active-bg, rgba(59, 130, 246, .1));color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--active .ds-sidebar-item__icon{color:var(--sidebar-item-active-text, #3b82f6)}.ds-sidebar-item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-item--collapsed-mode{justify-content:center;padding:var(--space-2, .5rem);gap:0}.ds-sidebar-item--collapsed-mode .ds-sidebar-item__icon{margin:0}.ds-sidebar-item--popover-open{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-item__toggle{display:flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;color:inherit;cursor:pointer;flex-shrink:0;transition:transform .2s ease}.ds-sidebar-item__toggle:hover{color:var(--color-primary, #3b82f6)}.ds-sidebar-item__toggle-placeholder{width:20px;flex-shrink:0}.ds-sidebar-item__icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);color:var(--sidebar-icon-color, currentColor);opacity:.8}.ds-sidebar-item__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;color:inherit;font-size:var(--font-size-sm, .875rem);line-height:1.4}.ds-sidebar-item__label--router-active{font-weight:600}.ds-sidebar-item__external-icon{margin-left:var(--space-1, .25rem);font-size:.75em;opacity:.6}.ds-sidebar-item__badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-item__badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-item__badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-item__badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-item__badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-item__badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-item__badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-item__divider{height:1px;margin:var(--space-2, .5rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}.ds-sidebar-popover{background:var(--popover-bg, var(--sidebar-bg, #ffffff));border:1px solid var(--popover-border, var(--sidebar-border, #e5e7eb));border-radius:var(--popover-radius, 8px);box-shadow:var(--popover-shadow, var(--shadow-2, 0 4px 6px -1px rgba(0, 0, 0, .1)));min-width:200px;max-width:280px;overflow:hidden;animation:popoverSlideIn .15s ease-out}.ds-sidebar-popover__header{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-3, .75rem) var(--space-4, 1rem);background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .03));border-bottom:1px solid var(--sidebar-border, rgba(0, 0, 0, .1));font-weight:600;font-size:var(--font-size-sm, .875rem);color:var(--sidebar-text, inherit)}.ds-sidebar-popover__header-icon{font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__header-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__body{padding:var(--space-1, .25rem) 0;max-height:300px;overflow-y:auto}.ds-sidebar-popover__item{display:flex;align-items:center;gap:var(--space-2, .5rem);padding:var(--space-2, .5rem) var(--space-4, 1rem);cursor:pointer;color:var(--sidebar-text, inherit);transition:background-color .15s ease;outline:none;font-size:var(--font-size-sm, .875rem)}.ds-sidebar-popover__item:hover,.ds-sidebar-popover__item--active{background:var(--sidebar-item-hover-bg, rgba(0, 0, 0, .05))}.ds-sidebar-popover__item:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px}.ds-sidebar-popover__item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.ds-sidebar-popover__item-icon{flex-shrink:0;font-size:var(--icon-size-md, 1rem);opacity:.8}.ds-sidebar-popover__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-sidebar-popover__item-badge{display:inline-flex;align-items:center;justify-content:center;min-width:var(--sidebar-badge-size, 20px);height:var(--sidebar-badge-size, 20px);padding:0 var(--space-1-5, .375rem);border-radius:var(--radius-round, 9999px);font-size:var(--font-size-xs, .75rem);font-weight:600;flex-shrink:0}.ds-sidebar-popover__item-badge--default{background:var(--gray-200, #e5e7eb);color:var(--gray-800, #1f2937)}.ds-sidebar-popover__item-badge--primary{background:var(--color-primary, #3b82f6);color:#fff}.ds-sidebar-popover__item-badge--success{background:var(--success, #10b981);color:#fff}.ds-sidebar-popover__item-badge--warning{background:var(--warning, #f59e0b);color:#fff}.ds-sidebar-popover__item-badge--error{background:var(--error, #ef4444);color:#fff}.ds-sidebar-popover__item-badge--info{background:var(--info, #06b6d4);color:#fff}.ds-sidebar-popover__item-chevron{font-size:.75rem;opacity:.5;flex-shrink:0}.ds-sidebar-popover__divider{height:1px;margin:var(--space-1, .25rem) var(--space-4, 1rem);background:var(--sidebar-border, rgba(0, 0, 0, .1))}@keyframes popoverSlideIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}\n"] }]
14628
14648
  }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], showTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTooltip", required: false }] }], expandedItemIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedItemIds", required: false }] }], activeItemId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeItemId", required: false }] }], sidebarPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebarPosition", required: false }] }], collapsedTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedTrigger", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }], itemToggle: [{ type: i0.Output, args: ["itemToggle"] }], itemKeydown: [{ type: i0.Output, args: ["itemKeydown"] }] } });
14629
14649
 
14630
14650
  /**
@@ -16734,6 +16754,357 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
16734
16754
  args: ['document:click', ['$event']]
16735
16755
  }] } });
16736
16756
 
16757
+ /** Positions pour le popup overlay */
16758
+ const INPUT_DATE_POSITIONS = [
16759
+ {
16760
+ originX: 'start',
16761
+ originY: 'bottom',
16762
+ overlayX: 'start',
16763
+ overlayY: 'top',
16764
+ offsetY: 4,
16765
+ },
16766
+ {
16767
+ originX: 'start',
16768
+ originY: 'top',
16769
+ overlayX: 'start',
16770
+ overlayY: 'bottom',
16771
+ offsetY: -4,
16772
+ },
16773
+ {
16774
+ originX: 'end',
16775
+ originY: 'bottom',
16776
+ overlayX: 'end',
16777
+ overlayY: 'top',
16778
+ offsetY: 4,
16779
+ },
16780
+ {
16781
+ originX: 'end',
16782
+ originY: 'top',
16783
+ overlayX: 'end',
16784
+ overlayY: 'bottom',
16785
+ offsetY: -4,
16786
+ },
16787
+ ];
16788
+ /**
16789
+ * Parse une chaîne de date au format dd/MM/yyyy, dd-MM-yyyy, dd.MM.yyyy ou dd MM yyyy
16790
+ */
16791
+ function parseDate(input) {
16792
+ if (!input || !input.trim()) {
16793
+ return { valid: true, date: null };
16794
+ }
16795
+ const trimmed = input.trim();
16796
+ // Regex multi-format: dd/MM/yyyy, dd-MM-yyyy, dd.MM.yyyy, dd MM yyyy
16797
+ const regex = /^(\d{1,2})[\/\-\.\s](\d{1,2})[\/\-\.\s](\d{4})$/;
16798
+ const match = trimmed.match(regex);
16799
+ if (!match) {
16800
+ return { valid: false, date: null, error: 'invalid_format' };
16801
+ }
16802
+ const day = parseInt(match[1], 10);
16803
+ const month = parseInt(match[2], 10);
16804
+ const year = parseInt(match[3], 10);
16805
+ // Validation des valeurs
16806
+ if (month < 1 || month > 12) {
16807
+ return { valid: false, date: null, error: 'invalid_date' };
16808
+ }
16809
+ if (day < 1 || day > 31) {
16810
+ return { valid: false, date: null, error: 'invalid_date' };
16811
+ }
16812
+ // Créer la date en heure locale (pas UTC)
16813
+ const date = new Date(year, month - 1, day, 0, 0, 0, 0);
16814
+ // Vérifier que la date est valide (ex: 31/02 créera une date en mars)
16815
+ if (date.getDate() !== day || date.getMonth() !== month - 1 || date.getFullYear() !== year) {
16816
+ return { valid: false, date: null, error: 'invalid_date' };
16817
+ }
16818
+ return { valid: true, date };
16819
+ }
16820
+ /**
16821
+ * Formate une date au format dd/MM/yyyy
16822
+ */
16823
+ function formatDate(date) {
16824
+ if (!date)
16825
+ return '';
16826
+ const day = date.getDate().toString().padStart(2, '0');
16827
+ const month = (date.getMonth() + 1).toString().padStart(2, '0');
16828
+ const year = date.getFullYear();
16829
+ return `${day}/${month}/${year}`;
16830
+ }
16831
+ /**
16832
+ * DsInputDate - Composant de saisie de date avec calendrier popup
16833
+ *
16834
+ * @description
16835
+ * Input textuel avec icône calendrier et popup DsDatePicker pour la sélection
16836
+ * de date dans les formulaires. Supporte la saisie manuelle et les contraintes min/max.
16837
+ *
16838
+ * @example
16839
+ * ```html
16840
+ * <ds-input-date
16841
+ * [(ngModel)]="selectedDate"
16842
+ * label="Date de naissance"
16843
+ * placeholder="jj/mm/aaaa">
16844
+ * </ds-input-date>
16845
+ * ```
16846
+ */
16847
+ class DsInputDate {
16848
+ // ViewChild - référence à l'élément input pour le focus
16849
+ inputElementRef;
16850
+ // Inputs
16851
+ value = input(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
16852
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
16853
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
16854
+ readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : []));
16855
+ placeholder = input('dd/mm/yyyy', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
16856
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : []));
16857
+ error = input(undefined, ...(ngDevMode ? [{ debugName: "error" }] : []));
16858
+ helper = input(undefined, ...(ngDevMode ? [{ debugName: "helper" }] : []));
16859
+ minDate = input(null, ...(ngDevMode ? [{ debugName: "minDate" }] : []));
16860
+ maxDate = input(null, ...(ngDevMode ? [{ debugName: "maxDate" }] : []));
16861
+ clearable = input(true, ...(ngDevMode ? [{ debugName: "clearable" }] : []));
16862
+ // Outputs
16863
+ dateChange = output();
16864
+ // Icons
16865
+ calendarIcon = faCalendar;
16866
+ clearIcon = faTimes;
16867
+ errorIcon = faExclamationCircle;
16868
+ // Overlay positions
16869
+ overlayPositions = INPUT_DATE_POSITIONS;
16870
+ // Unique ID for aria-controls
16871
+ panelId = `ds-input-date-panel-${Math.random().toString(36).substr(2, 9)}`;
16872
+ // State
16873
+ isOpen = signal(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
16874
+ internalValue = signal(null, ...(ngDevMode ? [{ debugName: "internalValue" }] : []));
16875
+ isFocused = signal(false, ...(ngDevMode ? [{ debugName: "isFocused" }] : []));
16876
+ inputText = signal('', ...(ngDevMode ? [{ debugName: "inputText" }] : []));
16877
+ hasParseError = signal(false, ...(ngDevMode ? [{ debugName: "hasParseError" }] : []));
16878
+ // ControlValueAccessor
16879
+ onChange = () => { };
16880
+ onTouched = () => { };
16881
+ hasExternalValue = signal(false, ...(ngDevMode ? [{ debugName: "hasExternalValue" }] : []));
16882
+ // Computed
16883
+ displayValue = computed(() => {
16884
+ const text = this.inputText();
16885
+ if (text)
16886
+ return text;
16887
+ return formatDate(this.internalValue());
16888
+ }, ...(ngDevMode ? [{ debugName: "displayValue" }] : []));
16889
+ containerClasses = computed(() => {
16890
+ const classes = ['ds-input-date'];
16891
+ classes.push(`ds-input-date--${this.size()}`);
16892
+ if (this.disabled())
16893
+ classes.push('ds-input-date--disabled');
16894
+ if (this.readonly())
16895
+ classes.push('ds-input-date--readonly');
16896
+ if (this.isFocused())
16897
+ classes.push('ds-input-date--focused');
16898
+ if (this.isOpen())
16899
+ classes.push('ds-input-date--open');
16900
+ if (this.inputState() === 'error')
16901
+ classes.push('ds-input-date--error');
16902
+ return classes.join(' ');
16903
+ }, ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
16904
+ isDisabled = computed(() => this.disabled() || this.readonly(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
16905
+ inputState = computed(() => {
16906
+ if (this.hasParseError() || this.error())
16907
+ return 'error';
16908
+ return 'default';
16909
+ }, ...(ngDevMode ? [{ debugName: "inputState" }] : []));
16910
+ showClearButton = computed(() => {
16911
+ return this.clearable() && this.internalValue() !== null && !this.isDisabled();
16912
+ }, ...(ngDevMode ? [{ debugName: "showClearButton" }] : []));
16913
+ effectiveMinDate = computed(() => {
16914
+ const min = this.minDate();
16915
+ const max = this.maxDate();
16916
+ // Si minDate > maxDate (config invalide), ignorer les contraintes
16917
+ if (min && max && min > max) {
16918
+ console.warn('[DsInputDate] minDate > maxDate: constraints ignored');
16919
+ return null;
16920
+ }
16921
+ return min;
16922
+ }, ...(ngDevMode ? [{ debugName: "effectiveMinDate" }] : []));
16923
+ effectiveMaxDate = computed(() => {
16924
+ const min = this.minDate();
16925
+ const max = this.maxDate();
16926
+ // Si minDate > maxDate (config invalide), ignorer les contraintes
16927
+ if (min && max && min > max) {
16928
+ return null;
16929
+ }
16930
+ return max;
16931
+ }, ...(ngDevMode ? [{ debugName: "effectiveMaxDate" }] : []));
16932
+ constructor() {
16933
+ // Sync external value with internal
16934
+ effect(() => {
16935
+ const val = this.value();
16936
+ if (!this.hasExternalValue() && val !== this.internalValue()) {
16937
+ this.internalValue.set(val);
16938
+ this.inputText.set(formatDate(val));
16939
+ }
16940
+ });
16941
+ }
16942
+ // ControlValueAccessor implementation
16943
+ writeValue(value) {
16944
+ this.hasExternalValue.set(true);
16945
+ this.internalValue.set(value);
16946
+ this.inputText.set(formatDate(value));
16947
+ this.hasParseError.set(false);
16948
+ }
16949
+ registerOnChange(fn) {
16950
+ this.onChange = fn;
16951
+ }
16952
+ registerOnTouched(fn) {
16953
+ this.onTouched = fn;
16954
+ }
16955
+ setDisabledState(isDisabled) {
16956
+ // Géré par input disabled
16957
+ }
16958
+ // Event handlers
16959
+ toggle() {
16960
+ if (this.isDisabled())
16961
+ return;
16962
+ if (this.isOpen()) {
16963
+ this.close();
16964
+ }
16965
+ else {
16966
+ this.open();
16967
+ }
16968
+ }
16969
+ open() {
16970
+ if (this.isDisabled() || this.isOpen())
16971
+ return;
16972
+ this.isOpen.set(true);
16973
+ }
16974
+ close() {
16975
+ if (!this.isOpen())
16976
+ return;
16977
+ this.isOpen.set(false);
16978
+ }
16979
+ onInputFocus() {
16980
+ if (!this.disabled()) {
16981
+ this.isFocused.set(true);
16982
+ }
16983
+ }
16984
+ onInputBlur() {
16985
+ this.isFocused.set(false);
16986
+ this.onTouched();
16987
+ // Parse et valide la saisie
16988
+ const text = this.inputText();
16989
+ if (!text) {
16990
+ // Champ vidé
16991
+ if (this.internalValue() !== null) {
16992
+ this.updateValue(null);
16993
+ }
16994
+ this.hasParseError.set(false);
16995
+ return;
16996
+ }
16997
+ const result = parseDate(text);
16998
+ if (!result.valid) {
16999
+ this.hasParseError.set(true);
17000
+ return;
17001
+ }
17002
+ // Validation des contraintes min/max
17003
+ if (result.date) {
17004
+ const min = this.effectiveMinDate();
17005
+ const max = this.effectiveMaxDate();
17006
+ if (min && result.date < min) {
17007
+ this.hasParseError.set(true);
17008
+ return;
17009
+ }
17010
+ if (max && result.date > max) {
17011
+ this.hasParseError.set(true);
17012
+ return;
17013
+ }
17014
+ }
17015
+ this.hasParseError.set(false);
17016
+ if (result.date !== this.internalValue()) {
17017
+ this.updateValue(result.date);
17018
+ }
17019
+ // Reformatter la saisie
17020
+ this.inputText.set(formatDate(result.date));
17021
+ }
17022
+ onInputChange(event) {
17023
+ const input = event.target;
17024
+ this.inputText.set(input.value);
17025
+ // Le parsing/validation se fait uniquement au blur
17026
+ }
17027
+ onInputKeydown(event) {
17028
+ if (this.isDisabled())
17029
+ return;
17030
+ switch (event.key) {
17031
+ case 'Enter':
17032
+ case 'ArrowDown':
17033
+ event.preventDefault();
17034
+ this.open();
17035
+ break;
17036
+ case 'Escape':
17037
+ if (this.isOpen()) {
17038
+ event.preventDefault();
17039
+ this.close();
17040
+ }
17041
+ break;
17042
+ }
17043
+ }
17044
+ onCalendarIconClick(event) {
17045
+ event.preventDefault();
17046
+ event.stopPropagation();
17047
+ this.toggle();
17048
+ }
17049
+ onDateSelected(date) {
17050
+ this.updateValue(date);
17051
+ this.inputText.set(formatDate(date));
17052
+ this.hasParseError.set(false);
17053
+ this.close();
17054
+ this.inputElementRef?.nativeElement.focus();
17055
+ }
17056
+ onBackdropClick() {
17057
+ this.close();
17058
+ }
17059
+ onOverlayKeydown(event) {
17060
+ if (event.key === 'Escape') {
17061
+ this.close();
17062
+ this.inputElementRef?.nativeElement.focus();
17063
+ }
17064
+ }
17065
+ clearValue(event) {
17066
+ event.preventDefault();
17067
+ event.stopPropagation();
17068
+ this.updateValue(null);
17069
+ this.inputText.set('');
17070
+ this.hasParseError.set(false);
17071
+ this.inputElementRef?.nativeElement.focus();
17072
+ }
17073
+ updateValue(value) {
17074
+ this.hasExternalValue.set(true);
17075
+ this.internalValue.set(value);
17076
+ this.onChange(value);
17077
+ this.dateChange.emit(value);
17078
+ }
17079
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsInputDate, deps: [], target: i0.ɵɵFactoryTarget.Component });
17080
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsInputDate, isStandalone: true, selector: "ds-input-date", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", 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 }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dateChange: "dateChange" }, providers: [
17081
+ {
17082
+ provide: NG_VALUE_ACCESSOR,
17083
+ useExisting: forwardRef(() => DsInputDate),
17084
+ multi: true,
17085
+ },
17086
+ ], viewQueries: [{ propertyName: "inputElementRef", first: true, predicate: ["inputElement"], descendants: true }], ngImport: i0, template: "<div [class]=\"containerClasses()\">\n <!-- Label -->\n @if (label()) {\n <label class=\"ds-input-date__label\" [attr.for]=\"panelId + '-input'\">\n {{ label() }}\n </label>\n }\n\n <!-- Input container -->\n <div\n class=\"ds-input-date__wrapper\"\n #triggerOrigin=\"cdkOverlayOrigin\"\n cdkOverlayOrigin>\n\n <input\n #inputElement\n type=\"text\"\n class=\"ds-input-date__input\"\n [id]=\"panelId + '-input'\"\n [value]=\"displayValue()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId : null\"\n [attr.aria-invalid]=\"inputState() === 'error'\"\n (input)=\"onInputChange($event)\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onInputKeydown($event)\">\n\n <!-- Icons zone -->\n <div class=\"ds-input-date__icons\">\n <!-- Clear button -->\n @if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ds-input-date__clear\"\n tabindex=\"-1\"\n aria-label=\"Effacer la date\"\n (click)=\"clearValue($event)\">\n <fa-icon [icon]=\"clearIcon\" aria-hidden=\"true\"></fa-icon>\n </button>\n }\n\n <!-- Calendar icon -->\n <button\n type=\"button\"\n class=\"ds-input-date__calendar-btn\"\n [disabled]=\"isDisabled()\"\n tabindex=\"-1\"\n aria-label=\"Ouvrir le calendrier\"\n (click)=\"onCalendarIconClick($event)\">\n <fa-icon [icon]=\"calendarIcon\" aria-hidden=\"true\"></fa-icon>\n </button>\n </div>\n </div>\n\n <!-- Helper / Error message -->\n @if (error() || hasParseError()) {\n <div class=\"ds-input-date__error\">\n <fa-icon [icon]=\"errorIcon\" aria-hidden=\"true\"></fa-icon>\n <span>{{ error() || 'Format de date invalide' }}</span>\n </div>\n } @else if (helper()) {\n <div class=\"ds-input-date__helper\">{{ helper() }}</div>\n }\n</div>\n\n<!-- Date Picker Overlay -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayPanelClass]=\"'ds-input-date-overlay'\"\n (backdropClick)=\"onBackdropClick()\"\n (overlayKeydown)=\"onOverlayKeydown($event)\">\n\n <div\n class=\"ds-input-date__popup\"\n [id]=\"panelId\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"S\u00E9lectionner une date\">\n <ds-date-picker\n [mode]=\"'single'\"\n [minDate]=\"effectiveMinDate()\"\n [maxDate]=\"effectiveMaxDate()\"\n [showTodayButton]=\"true\"\n [showClearButton]=\"false\"\n (dateChange)=\"onDateSelected($event)\">\n </ds-date-picker>\n </div>\n</ng-template>\n", styles: [":host{display:inline-flex;width:100%}.ds-input-date{display:flex;flex-direction:column;gap:var(--space-1);width:100%}.ds-input-date__label{display:block;color:var(--input-label-color);font-size:var(--input-label-font-size);font-weight:500;margin-bottom:var(--input-label-margin-bottom)}.ds-input-date__wrapper{position:relative;display:flex;align-items:center}.ds-input-date__input{flex:1;width:100%;height:var(--input-height-md);padding:0 var(--ds-input-date-icon-zone-width, 72px) 0 var(--input-padding-default);background-color:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-border-radius);color:var(--input-text);font-size:var(--input-font-size-md);outline:none;transition:all .2s ease}.ds-input-date__input::placeholder{color:var(--input-placeholder)}.ds-input-date__input:hover:not(:disabled):not([readonly]){border-color:var(--input-hover-border)}.ds-input-date__input:focus:not(:disabled){border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.ds-input-date__input:disabled{opacity:.5;cursor:not-allowed;background-color:var(--input-disabled-bg)}.ds-input-date__input[readonly]{cursor:default;background-color:var(--input-disabled-bg)}.ds-input-date__icons{position:absolute;right:0;top:0;bottom:0;display:flex;align-items:center;gap:var(--space-1);padding-right:var(--space-2)}.ds-input-date__clear{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;border:none;border-radius:var(--radius-1);color:var(--input-icon);cursor:pointer;transition:all .15s ease}.ds-input-date__clear:hover{background-color:var(--surface-hover);color:var(--text-default)}.ds-input-date__clear:focus-visible{outline:2px solid var(--input-focus-border);outline-offset:1px}.ds-input-date__clear fa-icon{font-size:14px}.ds-input-date__calendar-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:var(--radius-1);color:var(--input-icon);cursor:pointer;transition:all .15s ease}.ds-input-date__calendar-btn:hover:not(:disabled){background-color:var(--surface-hover);color:var(--color-primary)}.ds-input-date__calendar-btn:focus-visible{outline:2px solid var(--input-focus-border);outline-offset:1px}.ds-input-date__calendar-btn:disabled{opacity:.5;cursor:not-allowed}.ds-input-date__calendar-btn fa-icon{font-size:16px}.ds-input-date__helper{font-size:var(--font-size-1);color:var(--text-muted)}.ds-input-date__error{display:flex;align-items:center;gap:var(--space-1);font-size:var(--font-size-1);color:var(--text-error)}.ds-input-date__error fa-icon{font-size:12px}.ds-input-date__popup{background-color:var(--surface-default);border:1px solid var(--border-color);border-radius:var(--radius-2);box-shadow:var(--shadow-3);overflow:hidden}.ds-input-date--sm .ds-input-date__input{height:var(--input-height-sm);padding-left:var(--space-2);font-size:var(--input-font-size-sm)}.ds-input-date--sm .ds-input-date__calendar-btn{width:24px;height:24px}.ds-input-date--sm .ds-input-date__calendar-btn fa-icon{font-size:14px}.ds-input-date--sm .ds-input-date__clear{width:20px;height:20px}.ds-input-date--sm .ds-input-date__clear fa-icon{font-size:12px}.ds-input-date--lg .ds-input-date__input{height:var(--input-height-lg);padding-left:var(--space-3);font-size:var(--input-font-size-lg)}.ds-input-date--lg .ds-input-date__calendar-btn{width:32px;height:32px}.ds-input-date--lg .ds-input-date__calendar-btn fa-icon{font-size:18px}.ds-input-date--lg .ds-input-date__clear{width:28px;height:28px}.ds-input-date--lg .ds-input-date__clear fa-icon{font-size:16px}.ds-input-date--focused .ds-input-date__input{border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.ds-input-date--open .ds-input-date__calendar-btn{color:var(--color-primary)}.ds-input-date--error .ds-input-date__input{border-color:var(--input-error-border)}.ds-input-date--error .ds-input-date__input:focus{border-color:var(--input-error-border);box-shadow:0 0 0 2px color-mix(in oklab,var(--error) 20%,transparent)}.ds-input-date--error .ds-input-date__calendar-btn{color:var(--error)}.ds-input-date--disabled{pointer-events:none;opacity:.5}.ds-input-date--readonly .ds-input-date__calendar-btn{pointer-events:none}::ng-deep .ds-input-date-overlay{z-index:1000}\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: "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"] }, { kind: "component", type: DsDatePicker, selector: "ds-date-picker", inputs: ["size", "mode", "disabled", "minDate", "maxDate", "showTodayButton", "showClearButton", "todayLabel", "clearLabel", "prevMonthLabel", "nextMonthLabel", "presets", "showPresets", "showRangePreview"], outputs: ["dateChange", "rangeChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
17087
+ }
17088
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsInputDate, decorators: [{
17089
+ type: Component,
17090
+ args: [{ selector: 'ds-input-date', standalone: true, imports: [
17091
+ CommonModule,
17092
+ FontAwesomeModule,
17093
+ CdkConnectedOverlay,
17094
+ CdkOverlayOrigin,
17095
+ DsDatePicker,
17096
+ ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
17097
+ {
17098
+ provide: NG_VALUE_ACCESSOR,
17099
+ useExisting: forwardRef(() => DsInputDate),
17100
+ multi: true,
17101
+ },
17102
+ ], template: "<div [class]=\"containerClasses()\">\n <!-- Label -->\n @if (label()) {\n <label class=\"ds-input-date__label\" [attr.for]=\"panelId + '-input'\">\n {{ label() }}\n </label>\n }\n\n <!-- Input container -->\n <div\n class=\"ds-input-date__wrapper\"\n #triggerOrigin=\"cdkOverlayOrigin\"\n cdkOverlayOrigin>\n\n <input\n #inputElement\n type=\"text\"\n class=\"ds-input-date__input\"\n [id]=\"panelId + '-input'\"\n [value]=\"displayValue()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? panelId : null\"\n [attr.aria-invalid]=\"inputState() === 'error'\"\n (input)=\"onInputChange($event)\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onInputKeydown($event)\">\n\n <!-- Icons zone -->\n <div class=\"ds-input-date__icons\">\n <!-- Clear button -->\n @if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ds-input-date__clear\"\n tabindex=\"-1\"\n aria-label=\"Effacer la date\"\n (click)=\"clearValue($event)\">\n <fa-icon [icon]=\"clearIcon\" aria-hidden=\"true\"></fa-icon>\n </button>\n }\n\n <!-- Calendar icon -->\n <button\n type=\"button\"\n class=\"ds-input-date__calendar-btn\"\n [disabled]=\"isDisabled()\"\n tabindex=\"-1\"\n aria-label=\"Ouvrir le calendrier\"\n (click)=\"onCalendarIconClick($event)\">\n <fa-icon [icon]=\"calendarIcon\" aria-hidden=\"true\"></fa-icon>\n </button>\n </div>\n </div>\n\n <!-- Helper / Error message -->\n @if (error() || hasParseError()) {\n <div class=\"ds-input-date__error\">\n <fa-icon [icon]=\"errorIcon\" aria-hidden=\"true\"></fa-icon>\n <span>{{ error() || 'Format de date invalide' }}</span>\n </div>\n } @else if (helper()) {\n <div class=\"ds-input-date__helper\">{{ helper() }}</div>\n }\n</div>\n\n<!-- Date Picker Overlay -->\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n [cdkConnectedOverlayPanelClass]=\"'ds-input-date-overlay'\"\n (backdropClick)=\"onBackdropClick()\"\n (overlayKeydown)=\"onOverlayKeydown($event)\">\n\n <div\n class=\"ds-input-date__popup\"\n [id]=\"panelId\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"S\u00E9lectionner une date\">\n <ds-date-picker\n [mode]=\"'single'\"\n [minDate]=\"effectiveMinDate()\"\n [maxDate]=\"effectiveMaxDate()\"\n [showTodayButton]=\"true\"\n [showClearButton]=\"false\"\n (dateChange)=\"onDateSelected($event)\">\n </ds-date-picker>\n </div>\n</ng-template>\n", styles: [":host{display:inline-flex;width:100%}.ds-input-date{display:flex;flex-direction:column;gap:var(--space-1);width:100%}.ds-input-date__label{display:block;color:var(--input-label-color);font-size:var(--input-label-font-size);font-weight:500;margin-bottom:var(--input-label-margin-bottom)}.ds-input-date__wrapper{position:relative;display:flex;align-items:center}.ds-input-date__input{flex:1;width:100%;height:var(--input-height-md);padding:0 var(--ds-input-date-icon-zone-width, 72px) 0 var(--input-padding-default);background-color:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-border-radius);color:var(--input-text);font-size:var(--input-font-size-md);outline:none;transition:all .2s ease}.ds-input-date__input::placeholder{color:var(--input-placeholder)}.ds-input-date__input:hover:not(:disabled):not([readonly]){border-color:var(--input-hover-border)}.ds-input-date__input:focus:not(:disabled){border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.ds-input-date__input:disabled{opacity:.5;cursor:not-allowed;background-color:var(--input-disabled-bg)}.ds-input-date__input[readonly]{cursor:default;background-color:var(--input-disabled-bg)}.ds-input-date__icons{position:absolute;right:0;top:0;bottom:0;display:flex;align-items:center;gap:var(--space-1);padding-right:var(--space-2)}.ds-input-date__clear{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;border:none;border-radius:var(--radius-1);color:var(--input-icon);cursor:pointer;transition:all .15s ease}.ds-input-date__clear:hover{background-color:var(--surface-hover);color:var(--text-default)}.ds-input-date__clear:focus-visible{outline:2px solid var(--input-focus-border);outline-offset:1px}.ds-input-date__clear fa-icon{font-size:14px}.ds-input-date__calendar-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;border:none;border-radius:var(--radius-1);color:var(--input-icon);cursor:pointer;transition:all .15s ease}.ds-input-date__calendar-btn:hover:not(:disabled){background-color:var(--surface-hover);color:var(--color-primary)}.ds-input-date__calendar-btn:focus-visible{outline:2px solid var(--input-focus-border);outline-offset:1px}.ds-input-date__calendar-btn:disabled{opacity:.5;cursor:not-allowed}.ds-input-date__calendar-btn fa-icon{font-size:16px}.ds-input-date__helper{font-size:var(--font-size-1);color:var(--text-muted)}.ds-input-date__error{display:flex;align-items:center;gap:var(--space-1);font-size:var(--font-size-1);color:var(--text-error)}.ds-input-date__error fa-icon{font-size:12px}.ds-input-date__popup{background-color:var(--surface-default);border:1px solid var(--border-color);border-radius:var(--radius-2);box-shadow:var(--shadow-3);overflow:hidden}.ds-input-date--sm .ds-input-date__input{height:var(--input-height-sm);padding-left:var(--space-2);font-size:var(--input-font-size-sm)}.ds-input-date--sm .ds-input-date__calendar-btn{width:24px;height:24px}.ds-input-date--sm .ds-input-date__calendar-btn fa-icon{font-size:14px}.ds-input-date--sm .ds-input-date__clear{width:20px;height:20px}.ds-input-date--sm .ds-input-date__clear fa-icon{font-size:12px}.ds-input-date--lg .ds-input-date__input{height:var(--input-height-lg);padding-left:var(--space-3);font-size:var(--input-font-size-lg)}.ds-input-date--lg .ds-input-date__calendar-btn{width:32px;height:32px}.ds-input-date--lg .ds-input-date__calendar-btn fa-icon{font-size:18px}.ds-input-date--lg .ds-input-date__clear{width:28px;height:28px}.ds-input-date--lg .ds-input-date__clear fa-icon{font-size:16px}.ds-input-date--focused .ds-input-date__input{border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.ds-input-date--open .ds-input-date__calendar-btn{color:var(--color-primary)}.ds-input-date--error .ds-input-date__input{border-color:var(--input-error-border)}.ds-input-date--error .ds-input-date__input:focus{border-color:var(--input-error-border);box-shadow:0 0 0 2px color-mix(in oklab,var(--error) 20%,transparent)}.ds-input-date--error .ds-input-date__calendar-btn{color:var(--error)}.ds-input-date--disabled{pointer-events:none;opacity:.5}.ds-input-date--readonly .ds-input-date__calendar-btn{pointer-events:none}::ng-deep .ds-input-date-overlay{z-index:1000}\n"] }]
17103
+ }], ctorParameters: () => [], propDecorators: { inputElementRef: [{
17104
+ type: ViewChild,
17105
+ args: ['inputElement']
17106
+ }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", 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 }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], dateChange: [{ type: i0.Output, args: ["dateChange"] }] } });
17107
+
16737
17108
  /*
16738
17109
  * Components barrel export
16739
17110
  */
@@ -17139,7 +17510,9 @@ class DsI18nService {
17139
17510
  this._locale.set(locale);
17140
17511
  }
17141
17512
  else {
17142
- console.warn(`[DsI18nService] Locale '${locale}' not supported. Using 'fr'.`);
17513
+ if (isDevMode()) {
17514
+ console.warn(`[DsI18nService] Locale '${locale}' not supported. Using 'fr'.`);
17515
+ }
17143
17516
  this._locale.set('fr');
17144
17517
  }
17145
17518
  }
@@ -17220,5 +17593,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
17220
17593
  * Generated bundle index. Do not edit.
17221
17594
  */
17222
17595
 
17223
- export { AUTOCOMPLETE_POSITIONS, DROPDOWN_POSITIONS, DROPDOWN_POSITIONS_RIGHT, DROPDOWN_POSITIONS_TOP, DsAccordion, DsAccordionItem, 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 };
17596
+ export { AUTOCOMPLETE_POSITIONS, DROPDOWN_POSITIONS, DROPDOWN_POSITIONS_RIGHT, DROPDOWN_POSITIONS_TOP, DsAccordion, DsAccordionItem, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCalendar, DsCard, DsCarousel, DsCheckbox, DsCheckboxList, DsChip, DsColorPicker, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDrawer, DsDropdown, DsEmpty, DsEntityChip, DsEntityPicker, DsFileUpload, DsI18nService, DsInputDate, 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 };
17224
17597
  //# sourceMappingURL=kksdev-ds-angular.mjs.map