@kksdev/ds-angular 1.2.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,14 +2,14 @@ import * as i0 from '@angular/core';
2
2
  import { input, Component, output, HostBinding, model, signal, computed, forwardRef, effect, ElementRef, ViewChildren, ViewChild, EventEmitter, inject, HostListener, ContentChild, Output, Directive, DestroyRef, Injectable, ChangeDetectionStrategy, viewChild } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule, DOCUMENT, NgClass } from '@angular/common';
5
- import * as i2 from '@fortawesome/angular-fontawesome';
5
+ import * as i1$1 from '@fortawesome/angular-fontawesome';
6
6
  import { FaIconComponent, FontAwesomeModule } from '@fortawesome/angular-fontawesome';
7
- import * as i1$3 from '@angular/forms';
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 } from '@fortawesome/free-solid-svg-icons';
10
- import * as i1$1 from '@angular/router';
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 } from '@fortawesome/free-solid-svg-icons';
10
+ import * as i1$2 from '@angular/router';
11
11
  import { RouterModule } from '@angular/router';
12
- import * as i1$2 from '@angular/cdk/overlay';
12
+ import * as i1$3 from '@angular/cdk/overlay';
13
13
  import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
14
14
  import { FocusTrapFactory } from '@angular/cdk/a11y';
15
15
  import { TemplatePortal, ComponentPortal } from '@angular/cdk/portal';
@@ -250,7 +250,7 @@ class PrimitiveBadge {
250
250
  return this.customStyles();
251
251
  }
252
252
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: PrimitiveBadge, deps: [], target: i0.ɵɵFactoryTarget.Component });
253
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: PrimitiveBadge, isStandalone: true, selector: "primitive-badge", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, iconStart: { classPropertyName: "iconStart", publicName: "iconStart", isSignal: true, isRequired: false, transformFunction: null }, iconEnd: { classPropertyName: "iconEnd", publicName: "iconEnd", isSignal: true, isRequired: false, transformFunction: null }, customStyles: { classPropertyName: "customStyles", publicName: "customStyles", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<span [ngClass]=\"badgeClasses\" [ngStyle]=\"styleOverrides\" [attr.data-type]=\"type()\">\n @if (iconStart()) {\n <fa-icon [icon]=\"iconStart()!\" class=\"icon-start\" />\n }\n <ng-content></ng-content>\n @if (iconEnd()) {\n <fa-icon [icon]=\"iconEnd()!\" class=\"icon-end\" />\n }\n</span>\n", styles: ["@charset \"UTF-8\";:host{display:inline-flex}span{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-1);min-height:var(--badge-height);padding:var(--badge-padding-vertical-md) var(--badge-padding-horizontal-md);font-weight:var(--font-weight-medium);font-size:var(--badge-font-size-md);line-height:var(--line-height-tight);border-radius:var(--badge-radius);white-space:nowrap;border:1px solid transparent;background-color:var(--badge-bg);color:var(--badge-text);border-color:var(--badge-border-color, transparent);transition:background-color var(--duration-fast) var(--easing-out),color var(--duration-fast) var(--easing-out),border-color var(--duration-fast) var(--easing-out)}span.outline{background-color:transparent;color:var(--badge-outline-text-color, var(--badge-border-color, var(--badge-bg)));border-color:var(--badge-border-color, var(--badge-bg))}span.primary{--badge-bg: var(--badge-primary-bg);--badge-text: var(--badge-primary-text);--badge-border-color: var(--badge-primary-bg)}span.secondary{--badge-bg: var(--badge-secondary-bg);--badge-text: var(--badge-secondary-text);--badge-border-color: var(--badge-secondary-bg)}span.success{--badge-bg: var(--badge-success-bg);--badge-text: var(--badge-success-text);--badge-border-color: var(--badge-success-bg)}span.warning{--badge-bg: var(--badge-warning-bg);--badge-text: var(--badge-warning-text);--badge-border-color: var(--badge-warning-bg);--badge-outline-text-color: var(--badge-warning-outline-text, var(--badge-warning-bg))}span.error{--badge-bg: var(--badge-error-bg);--badge-text: var(--badge-error-text);--badge-border-color: var(--badge-error-bg)}span.info{--badge-bg: var(--badge-info-bg);--badge-text: var(--badge-info-text);--badge-border-color: var(--badge-info-bg)}span.neutral{--badge-bg: var(--badge-neutral-bg);--badge-text: var(--badge-neutral-text);--badge-border-color: var(--badge-neutral-bg)}span.accent{--badge-bg: var(--badge-accent-bg);--badge-text: var(--badge-accent-text);--badge-border-color: var(--badge-accent-bg)}span.sm{font-size:var(--badge-font-size-sm);padding:var(--badge-padding-vertical-sm) var(--badge-padding-horizontal-sm)}span.md{font-size:var(--badge-font-size-md);padding:var(--badge-padding-vertical-md) var(--badge-padding-horizontal-md)}span.lg{font-size:var(--badge-font-size-lg);padding:var(--badge-padding-vertical-lg) var(--badge-padding-horizontal-lg)}span.rounded{border-radius:var(--badge-radius)}span.pill{border-radius:var(--badge-pill-radius)}.icon-start,.icon-end{font-size:var(--icon-size-sm)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
253
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: PrimitiveBadge, isStandalone: true, selector: "primitive-badge", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, iconStart: { classPropertyName: "iconStart", publicName: "iconStart", isSignal: true, isRequired: false, transformFunction: null }, iconEnd: { classPropertyName: "iconEnd", publicName: "iconEnd", isSignal: true, isRequired: false, transformFunction: null }, customStyles: { classPropertyName: "customStyles", publicName: "customStyles", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<span [ngClass]=\"badgeClasses\" [ngStyle]=\"styleOverrides\" [attr.data-type]=\"type()\">\n @if (iconStart()) {\n <fa-icon [icon]=\"iconStart()!\" class=\"icon-start\" />\n }\n <ng-content></ng-content>\n @if (iconEnd()) {\n <fa-icon [icon]=\"iconEnd()!\" class=\"icon-end\" />\n }\n</span>\n", styles: ["@charset \"UTF-8\";:host{display:inline-flex}span{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-1);min-height:var(--badge-height);padding:var(--badge-padding-vertical-md) var(--badge-padding-horizontal-md);font-weight:var(--font-weight-medium);font-size:var(--badge-font-size-md);line-height:var(--line-height-tight);border-radius:var(--badge-radius);white-space:nowrap;border:1px solid transparent;background-color:var(--badge-bg);color:var(--badge-text);border-color:var(--badge-border-color, transparent);transition:background-color var(--duration-fast) var(--easing-out),color var(--duration-fast) var(--easing-out),border-color var(--duration-fast) var(--easing-out)}span.outline{background-color:transparent;color:var(--badge-outline-text-color, var(--badge-border-color, var(--badge-bg)));border-color:var(--badge-border-color, var(--badge-bg))}span.primary{--badge-bg: var(--badge-primary-bg);--badge-text: var(--badge-primary-text);--badge-border-color: var(--badge-primary-bg)}span.secondary{--badge-bg: var(--badge-secondary-bg);--badge-text: var(--badge-secondary-text);--badge-border-color: var(--badge-secondary-bg)}span.success{--badge-bg: var(--badge-success-bg);--badge-text: var(--badge-success-text);--badge-border-color: var(--badge-success-bg)}span.warning{--badge-bg: var(--badge-warning-bg);--badge-text: var(--badge-warning-text);--badge-border-color: var(--badge-warning-bg);--badge-outline-text-color: var(--badge-warning-outline-text, var(--badge-warning-bg))}span.error{--badge-bg: var(--badge-error-bg);--badge-text: var(--badge-error-text);--badge-border-color: var(--badge-error-bg)}span.info{--badge-bg: var(--badge-info-bg);--badge-text: var(--badge-info-text);--badge-border-color: var(--badge-info-bg)}span.neutral{--badge-bg: var(--badge-neutral-bg);--badge-text: var(--badge-neutral-text);--badge-border-color: var(--badge-neutral-bg)}span.accent{--badge-bg: var(--badge-accent-bg);--badge-text: var(--badge-accent-text);--badge-border-color: var(--badge-accent-bg)}span.sm{font-size:var(--badge-font-size-sm);padding:var(--badge-padding-vertical-sm) var(--badge-padding-horizontal-sm)}span.md{font-size:var(--badge-font-size-md);padding:var(--badge-padding-vertical-md) var(--badge-padding-horizontal-md)}span.lg{font-size:var(--badge-font-size-lg);padding:var(--badge-padding-vertical-lg) var(--badge-padding-horizontal-lg)}span.rounded{border-radius:var(--badge-radius)}span.pill{border-radius:var(--badge-pill-radius)}.icon-start,.icon-end{font-size:var(--icon-size-sm)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: 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"] }] });
254
254
  }
255
255
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: PrimitiveBadge, decorators: [{
256
256
  type: Component,
@@ -505,7 +505,7 @@ class PrimitiveButton {
505
505
  }
506
506
  }
507
507
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: PrimitiveButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
508
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: PrimitiveButton, isStandalone: true, selector: "primitive-button", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", 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 }, iconStart: { classPropertyName: "iconStart", publicName: "iconStart", isSignal: true, isRequired: false, transformFunction: null }, iconEnd: { classPropertyName: "iconEnd", publicName: "iconEnd", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, block: { classPropertyName: "block", publicName: "block", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, host: { properties: { "class.block": "this.hostBlock" } }, ngImport: i0, template: "<button\n [type]=\"type()\"\n [class]=\"buttonClasses\"\n [disabled]=\"disabled()\"\n (click)=\"handleClick()\">\n @if (iconStart()) {\n <fa-icon [icon]=\"iconStart()!\" class=\"icon-start\" />\n }\n <ng-content></ng-content>\n @if (iconEnd()) {\n <fa-icon [icon]=\"iconEnd()!\" class=\"icon-end\" />\n }\n</button>\n", styles: [":host{display:inline-flex}:host.block{display:flex;width:100%}:host.block button,button.block{width:100%}button{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);padding:var(--btn-padding-vertical-md) var(--btn-padding-horizontal-md);border:1px solid transparent;border-radius:var(--btn-radius);font-weight:var(--font-weight-medium);font-size:var(--btn-font-size-md);cursor:pointer;transition:all var(--duration-fast) var(--easing-default)}button.primary{background-color:var(--btn-primary-bg);color:var(--btn-primary-text);border-color:var(--btn-primary-border)}button.primary:hover:not(:disabled){background-color:var(--btn-primary-hover-bg);color:var(--btn-primary-hover-text)}button.secondary{background-color:var(--btn-secondary-bg);color:var(--btn-secondary-text);border-color:var(--btn-secondary-border)}button.secondary:hover:not(:disabled){background-color:var(--btn-secondary-hover-bg);color:var(--btn-secondary-hover-text)}button.ghost{background-color:var(--btn-ghost-bg);color:var(--btn-ghost-text);border-color:var(--btn-ghost-border)}button.ghost:hover:not(:disabled){background-color:var(--btn-ghost-hover-bg);color:var(--btn-ghost-hover-text)}button.success{background-color:var(--btn-success-bg);color:var(--btn-success-text);border-color:var(--btn-success-border)}button.success:hover:not(:disabled){background-color:var(--btn-success-hover-bg);color:var(--btn-success-hover-text)}button.warning{background-color:var(--btn-warning-bg);color:var(--btn-warning-text);border-color:var(--btn-warning-border)}button.warning:hover:not(:disabled){background-color:var(--btn-warning-hover-bg);color:var(--btn-warning-hover-text)}button.error{background-color:var(--btn-error-bg);color:var(--btn-error-text);border-color:var(--btn-error-border)}button.error:hover:not(:disabled){background-color:var(--btn-error-hover-bg);color:var(--btn-error-hover-text)}button.info{background-color:var(--btn-info-bg);color:var(--btn-info-text);border-color:var(--btn-info-border)}button.info:hover:not(:disabled){background-color:var(--btn-info-hover-bg);color:var(--btn-info-hover-text)}button.outline{background-color:transparent;border:1px solid currentColor}button.outline.primary{color:var(--btn-primary-bg);border-color:var(--btn-primary-bg)}button.outline.primary:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-primary-bg) 15%,transparent)}button.outline.secondary{color:var(--btn-secondary-bg);border-color:var(--btn-secondary-bg)}button.outline.secondary:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-secondary-bg) 15%,transparent)}button.outline.ghost{color:var(--btn-ghost-text);border-color:transparent}button.outline.ghost:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-ghost-bg) 15%,transparent);border-color:var(--btn-ghost-hover-bg)}button.outline.success{color:var(--btn-success-bg);border-color:var(--btn-success-bg)}button.outline.success:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-success-bg) 15%,transparent)}button.outline.warning{color:var(--btn-warning-bg);border-color:var(--btn-warning-bg)}button.outline.warning:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-warning-bg) 15%,transparent)}button.outline.error{color:var(--btn-error-bg);border-color:var(--btn-error-bg)}button.outline.error:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-error-bg) 15%,transparent)}button.outline.info{color:var(--btn-info-bg);border-color:var(--btn-info-bg)}button.outline.info:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-info-bg) 15%,transparent)}button.sm{font-size:var(--btn-font-size-sm);padding:var(--btn-padding-vertical-sm) var(--btn-padding-horizontal-sm)}button.md{font-size:var(--btn-font-size-md);padding:var(--btn-padding-vertical-md) var(--btn-padding-horizontal-md)}button.lg{font-size:var(--btn-font-size-lg);padding:var(--btn-padding-vertical-lg) var(--btn-padding-horizontal-lg)}button:disabled{opacity:.6;cursor:not-allowed}.icon-start{margin-right:var(--space-1)}.icon-end{margin-left:var(--space-1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
508
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: PrimitiveButton, isStandalone: true, selector: "primitive-button", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", 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 }, iconStart: { classPropertyName: "iconStart", publicName: "iconStart", isSignal: true, isRequired: false, transformFunction: null }, iconEnd: { classPropertyName: "iconEnd", publicName: "iconEnd", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, block: { classPropertyName: "block", publicName: "block", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, host: { properties: { "class.block": "this.hostBlock" } }, ngImport: i0, template: "<button\n [type]=\"type()\"\n [class]=\"buttonClasses\"\n [disabled]=\"disabled()\"\n (click)=\"handleClick()\">\n @if (iconStart()) {\n <fa-icon [icon]=\"iconStart()!\" class=\"icon-start\" />\n }\n <ng-content></ng-content>\n @if (iconEnd()) {\n <fa-icon [icon]=\"iconEnd()!\" class=\"icon-end\" />\n }\n</button>\n", styles: [":host{display:inline-flex}:host.block{display:flex;width:100%}:host.block button,button.block{width:100%}button{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);padding:var(--btn-padding-vertical-md) var(--btn-padding-horizontal-md);border:1px solid transparent;border-radius:var(--btn-radius);font-weight:var(--font-weight-medium);font-size:var(--btn-font-size-md);cursor:pointer;transition:all var(--duration-fast) var(--easing-default)}button.primary{background-color:var(--btn-primary-bg);color:var(--btn-primary-text);border-color:var(--btn-primary-border)}button.primary:hover:not(:disabled){background-color:var(--btn-primary-hover-bg);color:var(--btn-primary-hover-text)}button.secondary{background-color:var(--btn-secondary-bg);color:var(--btn-secondary-text);border-color:var(--btn-secondary-border)}button.secondary:hover:not(:disabled){background-color:var(--btn-secondary-hover-bg);color:var(--btn-secondary-hover-text)}button.ghost{background-color:var(--btn-ghost-bg);color:var(--btn-ghost-text);border-color:var(--btn-ghost-border)}button.ghost:hover:not(:disabled){background-color:var(--btn-ghost-hover-bg);color:var(--btn-ghost-hover-text)}button.success{background-color:var(--btn-success-bg);color:var(--btn-success-text);border-color:var(--btn-success-border)}button.success:hover:not(:disabled){background-color:var(--btn-success-hover-bg);color:var(--btn-success-hover-text)}button.warning{background-color:var(--btn-warning-bg);color:var(--btn-warning-text);border-color:var(--btn-warning-border)}button.warning:hover:not(:disabled){background-color:var(--btn-warning-hover-bg);color:var(--btn-warning-hover-text)}button.error{background-color:var(--btn-error-bg);color:var(--btn-error-text);border-color:var(--btn-error-border)}button.error:hover:not(:disabled){background-color:var(--btn-error-hover-bg);color:var(--btn-error-hover-text)}button.info{background-color:var(--btn-info-bg);color:var(--btn-info-text);border-color:var(--btn-info-border)}button.info:hover:not(:disabled){background-color:var(--btn-info-hover-bg);color:var(--btn-info-hover-text)}button.outline{background-color:transparent;border:1px solid currentColor}button.outline.primary{color:var(--btn-primary-bg);border-color:var(--btn-primary-bg)}button.outline.primary:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-primary-bg) 15%,transparent)}button.outline.secondary{color:var(--btn-secondary-bg);border-color:var(--btn-secondary-bg)}button.outline.secondary:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-secondary-bg) 15%,transparent)}button.outline.ghost{color:var(--btn-ghost-text);border-color:transparent}button.outline.ghost:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-ghost-bg) 15%,transparent);border-color:var(--btn-ghost-hover-bg)}button.outline.success{color:var(--btn-success-bg);border-color:var(--btn-success-bg)}button.outline.success:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-success-bg) 15%,transparent)}button.outline.warning{color:var(--btn-warning-bg);border-color:var(--btn-warning-bg)}button.outline.warning:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-warning-bg) 15%,transparent)}button.outline.error{color:var(--btn-error-bg);border-color:var(--btn-error-bg)}button.outline.error:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-error-bg) 15%,transparent)}button.outline.info{color:var(--btn-info-bg);border-color:var(--btn-info-bg)}button.outline.info:hover:not(:disabled){background-color:color-mix(in srgb,var(--btn-info-bg) 15%,transparent)}button.sm{font-size:var(--btn-font-size-sm);padding:var(--btn-padding-vertical-sm) var(--btn-padding-horizontal-sm)}button.md{font-size:var(--btn-font-size-md);padding:var(--btn-padding-vertical-md) var(--btn-padding-horizontal-md)}button.lg{font-size:var(--btn-font-size-lg);padding:var(--btn-padding-vertical-lg) var(--btn-padding-horizontal-lg)}button:disabled{opacity:.6;cursor:not-allowed}.icon-start{margin-right:var(--space-1)}.icon-end{margin-left:var(--space-1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: 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"] }] });
509
509
  }
510
510
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: PrimitiveButton, decorators: [{
511
511
  type: Component,
@@ -1239,7 +1239,7 @@ class PrimitiveInput {
1239
1239
  this.inputFocused.emit();
1240
1240
  }
1241
1241
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: PrimitiveInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
1242
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: PrimitiveInput, isStandalone: true, selector: "primitive-input", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", 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 }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, maxlength: { classPropertyName: "maxlength", publicName: "maxlength", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, iconStart: { classPropertyName: "iconStart", publicName: "iconStart", isSignal: true, isRequired: false, transformFunction: null }, iconEnd: { classPropertyName: "iconEnd", publicName: "iconEnd", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedBy: { classPropertyName: "ariaDescribedBy", publicName: "ariaDescribedBy", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", inputChanged: "inputChanged", inputBlurred: "inputBlurred", inputFocused: "inputFocused" }, ngImport: i0, template: "<div class=\"input-wrapper\" [class]=\"wrapperClasses\">\n @if (iconStart()) {\n <fa-icon [icon]=\"iconStart()!\" class=\"icon-start\" />\n }\n <input\n [attr.id]=\"id()\"\n [attr.name]=\"name()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.maxLength]=\"maxlength()\"\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [value]=\"value()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedBy()\"\n [attr.aria-invalid]=\"state() === 'error' ? 'true' : 'false'\"\n [attr.aria-readonly]=\"readonly() ? 'true' : 'false'\"\n [attr.aria-disabled]=\"disabled() ? 'true' : 'false'\"\n [attr.aria-required]=\"required() ? 'true' : 'false'\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n (focus)=\"handleFocus()\"\n />\n @if (iconEnd()) {\n <fa-icon [icon]=\"iconEnd()!\" class=\"icon-end\" />\n }\n</div>\n", styles: [":host{display:inline-flex}.input-wrapper{position:relative;display:inline-flex;align-items:center;gap:var(--space-2);width:100%;padding:0 var(--input-padding-horizontal-md);background-color:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);transition:all var(--duration-fast) var(--easing-default)}.input-wrapper:hover:not(.disabled){border-color:var(--input-hover-border)}.input-wrapper:focus-within{border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.input-wrapper.disabled{cursor:not-allowed;opacity:.8}.input-wrapper.readonly{background-color:var(--input-disabled-bg)}input{flex:1;height:var(--input-height-md);padding:0;border:none;background:transparent;font-size:var(--input-font-size-md);font-weight:var(--font-weight-normal);color:var(--input-text);outline:none}input::placeholder{color:var(--input-placeholder)}input:disabled{cursor:not-allowed;opacity:.6}input:read-only{color:var(--input-placeholder);cursor:default}.input-wrapper.outline{background:transparent;border-width:2px}.input-wrapper.ghost{background:transparent;border:none;border-bottom:1px solid var(--input-border);border-radius:0}.input-wrapper.ghost:focus-within{border-bottom-color:var(--input-focus-border);box-shadow:none}.input-wrapper.sm{padding:0 var(--input-padding-horizontal-sm)}.input-wrapper.sm input{height:var(--input-height-sm);font-size:var(--input-font-size-sm)}.input-wrapper.md{padding:0 var(--input-padding-horizontal-md)}.input-wrapper.md input{height:var(--input-height-md);font-size:var(--input-font-size-md)}.input-wrapper.lg{padding:0 var(--input-padding-horizontal-lg)}.input-wrapper.lg input{height:var(--input-height-lg);font-size:var(--input-font-size-lg)}.input-wrapper.success{border-color:var(--input-success-border)}.input-wrapper.warning{border-color:var(--input-warning-border)}.input-wrapper.error{border-color:var(--input-error-border)}.input-wrapper.ghost.success{border-bottom-color:var(--input-success-border)}.input-wrapper.ghost.warning{border-bottom-color:var(--input-warning-border)}.input-wrapper.ghost.error{border-bottom-color:var(--input-error-border)}.icon-start,.icon-end{color:var(--input-icon);font-size:var(--input-icon-size-md)}.input-wrapper.sm .icon-start,.input-wrapper.sm .icon-end{font-size:var(--input-icon-size-sm)}.input-wrapper.lg .icon-start,.input-wrapper.lg .icon-end{font-size:var(--input-icon-size-lg)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
1242
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: PrimitiveInput, isStandalone: true, selector: "primitive-input", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, autocomplete: { classPropertyName: "autocomplete", publicName: "autocomplete", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", 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 }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, maxlength: { classPropertyName: "maxlength", publicName: "maxlength", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, iconStart: { classPropertyName: "iconStart", publicName: "iconStart", isSignal: true, isRequired: false, transformFunction: null }, iconEnd: { classPropertyName: "iconEnd", publicName: "iconEnd", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedBy: { classPropertyName: "ariaDescribedBy", publicName: "ariaDescribedBy", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", inputChanged: "inputChanged", inputBlurred: "inputBlurred", inputFocused: "inputFocused" }, ngImport: i0, template: "<div class=\"input-wrapper\" [class]=\"wrapperClasses\">\n @if (iconStart()) {\n <fa-icon [icon]=\"iconStart()!\" class=\"icon-start\" />\n }\n <input\n [attr.id]=\"id()\"\n [attr.name]=\"name()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.maxLength]=\"maxlength()\"\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [value]=\"value()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-describedby]=\"ariaDescribedBy()\"\n [attr.aria-invalid]=\"state() === 'error' ? 'true' : 'false'\"\n [attr.aria-readonly]=\"readonly() ? 'true' : 'false'\"\n [attr.aria-disabled]=\"disabled() ? 'true' : 'false'\"\n [attr.aria-required]=\"required() ? 'true' : 'false'\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n (focus)=\"handleFocus()\"\n />\n @if (iconEnd()) {\n <fa-icon [icon]=\"iconEnd()!\" class=\"icon-end\" />\n }\n</div>\n", styles: [":host{display:inline-flex}.input-wrapper{position:relative;display:inline-flex;align-items:center;gap:var(--space-2);width:100%;padding:0 var(--input-padding-horizontal-md);background-color:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);transition:all var(--duration-fast) var(--easing-default)}.input-wrapper:hover:not(.disabled){border-color:var(--input-hover-border)}.input-wrapper:focus-within{border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.input-wrapper.disabled{cursor:not-allowed;opacity:.8}.input-wrapper.readonly{background-color:var(--input-disabled-bg)}input{flex:1;height:var(--input-height-md);padding:0;border:none;background:transparent;font-size:var(--input-font-size-md);font-weight:var(--font-weight-normal);color:var(--input-text);outline:none}input::placeholder{color:var(--input-placeholder)}input:disabled{cursor:not-allowed;opacity:.6}input:read-only{color:var(--input-placeholder);cursor:default}.input-wrapper.outline{background:transparent;border-width:2px}.input-wrapper.ghost{background:transparent;border:none;border-bottom:1px solid var(--input-border);border-radius:0}.input-wrapper.ghost:focus-within{border-bottom-color:var(--input-focus-border);box-shadow:none}.input-wrapper.sm{padding:0 var(--input-padding-horizontal-sm)}.input-wrapper.sm input{height:var(--input-height-sm);font-size:var(--input-font-size-sm)}.input-wrapper.md{padding:0 var(--input-padding-horizontal-md)}.input-wrapper.md input{height:var(--input-height-md);font-size:var(--input-font-size-md)}.input-wrapper.lg{padding:0 var(--input-padding-horizontal-lg)}.input-wrapper.lg input{height:var(--input-height-lg);font-size:var(--input-font-size-lg)}.input-wrapper.success{border-color:var(--input-success-border)}.input-wrapper.warning{border-color:var(--input-warning-border)}.input-wrapper.error{border-color:var(--input-error-border)}.input-wrapper.ghost.success{border-bottom-color:var(--input-success-border)}.input-wrapper.ghost.warning{border-bottom-color:var(--input-warning-border)}.input-wrapper.ghost.error{border-bottom-color:var(--input-error-border)}.icon-start,.icon-end{color:var(--input-icon);font-size:var(--input-icon-size-md)}.input-wrapper.sm .icon-start,.input-wrapper.sm .icon-end{font-size:var(--input-icon-size-sm)}.input-wrapper.lg .icon-start,.input-wrapper.lg .icon-end{font-size:var(--input-icon-size-lg)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: 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"] }] });
1243
1243
  }
1244
1244
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: PrimitiveInput, decorators: [{
1245
1245
  type: Component,
@@ -1986,7 +1986,7 @@ class PrimitiveTextarea {
1986
1986
  this.inputFocused.emit();
1987
1987
  }
1988
1988
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: PrimitiveTextarea, deps: [], target: i0.ɵɵFactoryTarget.Component });
1989
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: PrimitiveTextarea, isStandalone: true, selector: "primitive-textarea", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", 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 }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, resize: { classPropertyName: "resize", publicName: "resize", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, cols: { classPropertyName: "cols", publicName: "cols", isSignal: true, isRequired: false, transformFunction: null }, maxlength: { classPropertyName: "maxlength", publicName: "maxlength", isSignal: true, isRequired: false, transformFunction: null }, iconStart: { classPropertyName: "iconStart", publicName: "iconStart", isSignal: true, isRequired: false, transformFunction: null }, iconEnd: { classPropertyName: "iconEnd", publicName: "iconEnd", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedBy: { classPropertyName: "ariaDescribedBy", publicName: "ariaDescribedBy", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", inputChanged: "inputChanged", inputBlurred: "inputBlurred", inputFocused: "inputFocused" }, ngImport: i0, template: "<div class=\"textarea-wrapper\" [class]=\"wrapperClasses\">\n @if (iconStart()) {\n <fa-icon [icon]=\"iconStart()!\" class=\"icon-start\" />\n }\n <textarea\n [id]=\"id()\"\n [name]=\"name()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [attr.rows]=\"rows()\"\n [attr.cols]=\"cols()\"\n [attr.maxLength]=\"maxlength()\"\n [value]=\"value()\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n (focus)=\"handleFocus()\"\n [style.resize]=\"resize()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"state() === 'error' ? 'true' : 'false'\"\n [attr.aria-readonly]=\"readonly() ? 'true' : 'false'\"\n [attr.aria-disabled]=\"disabled() ? 'true' : 'false'\"\n [attr.aria-required]=\"required() ? 'true' : 'false'\"\n [attr.aria-describedby]=\"ariaDescribedBy()\"\n ></textarea>\n @if (iconEnd()) {\n <fa-icon [icon]=\"iconEnd()!\" class=\"icon-end\" />\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:inline-flex;width:100%}.textarea-wrapper{position:relative;display:inline-flex;align-items:flex-start;gap:var(--space-2);width:100%;padding:var(--space-2) var(--input-padding-horizontal-md);background-color:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);transition:all var(--duration-fast) var(--easing-default)}.textarea-wrapper:hover:not(.disabled):not(.readonly){border-color:var(--input-hover-border)}.textarea-wrapper:focus-within{border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.textarea-wrapper.disabled{cursor:not-allowed;opacity:.85}.textarea-wrapper.readonly{background-color:var(--input-disabled-bg)}.textarea-wrapper.readonly textarea{color:var(--input-placeholder)}.textarea-wrapper.disabled textarea{color:var(--input-disabled-text)}textarea{flex:1;width:100%;min-height:var(--input-height-lg);border:none;background:transparent;font-size:var(--input-font-size-md);font-weight:var(--font-weight-normal);color:var(--input-text);line-height:var(--line-height-normal);resize:none;outline:none;padding:0}textarea::placeholder{color:var(--input-placeholder)}textarea:disabled{cursor:not-allowed;opacity:.6}.textarea-wrapper.outline{background:transparent;border-width:2px}.textarea-wrapper.ghost{background:transparent;border:none;border-bottom:1px solid var(--input-border);border-radius:0;padding-right:0;padding-left:0}.textarea-wrapper.ghost:focus-within{border-bottom-color:var(--input-focus-border);box-shadow:none}.textarea-wrapper.sm{padding:var(--space-1) var(--input-padding-horizontal-sm)}.textarea-wrapper.sm textarea{min-height:var(--input-height-sm);font-size:var(--input-font-size-sm)}.textarea-wrapper.md{padding:var(--space-2) var(--input-padding-horizontal-md)}.textarea-wrapper.md textarea{min-height:var(--input-height-md);font-size:var(--input-font-size-md)}.textarea-wrapper.lg{padding:var(--space-3) var(--input-padding-horizontal-lg)}.textarea-wrapper.lg textarea{min-height:var(--input-height-lg);font-size:var(--input-font-size-lg)}.textarea-wrapper.success{border-color:var(--input-success-border)}.textarea-wrapper.warning{border-color:var(--input-warning-border)}.textarea-wrapper.error{border-color:var(--input-error-border)}.textarea-wrapper.ghost.success{border-bottom-color:var(--input-success-border)}.textarea-wrapper.ghost.warning{border-bottom-color:var(--input-warning-border)}.textarea-wrapper.ghost.error{border-bottom-color:var(--input-error-border)}.icon-start,.icon-end{color:var(--input-icon);font-size:var(--input-icon-size-md);margin-top:var(--space-1)}.textarea-wrapper.sm .icon-start,.textarea-wrapper.sm .icon-end{font-size:var(--input-icon-size-sm)}.textarea-wrapper.lg .icon-start,.textarea-wrapper.lg .icon-end{font-size:var(--input-icon-size-lg)}.textarea-wrapper.has-icon-start textarea{margin-left:var(--space-1)}.textarea-wrapper.has-icon-end textarea{margin-right:var(--space-1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
1989
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: PrimitiveTextarea, isStandalone: true, selector: "primitive-textarea", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", 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 }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, resize: { classPropertyName: "resize", publicName: "resize", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, cols: { classPropertyName: "cols", publicName: "cols", isSignal: true, isRequired: false, transformFunction: null }, maxlength: { classPropertyName: "maxlength", publicName: "maxlength", isSignal: true, isRequired: false, transformFunction: null }, iconStart: { classPropertyName: "iconStart", publicName: "iconStart", isSignal: true, isRequired: false, transformFunction: null }, iconEnd: { classPropertyName: "iconEnd", publicName: "iconEnd", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedBy: { classPropertyName: "ariaDescribedBy", publicName: "ariaDescribedBy", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", inputChanged: "inputChanged", inputBlurred: "inputBlurred", inputFocused: "inputFocused" }, ngImport: i0, template: "<div class=\"textarea-wrapper\" [class]=\"wrapperClasses\">\n @if (iconStart()) {\n <fa-icon [icon]=\"iconStart()!\" class=\"icon-start\" />\n }\n <textarea\n [id]=\"id()\"\n [name]=\"name()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [attr.rows]=\"rows()\"\n [attr.cols]=\"cols()\"\n [attr.maxLength]=\"maxlength()\"\n [value]=\"value()\"\n (input)=\"handleInput($event)\"\n (blur)=\"handleBlur()\"\n (focus)=\"handleFocus()\"\n [style.resize]=\"resize()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-invalid]=\"state() === 'error' ? 'true' : 'false'\"\n [attr.aria-readonly]=\"readonly() ? 'true' : 'false'\"\n [attr.aria-disabled]=\"disabled() ? 'true' : 'false'\"\n [attr.aria-required]=\"required() ? 'true' : 'false'\"\n [attr.aria-describedby]=\"ariaDescribedBy()\"\n ></textarea>\n @if (iconEnd()) {\n <fa-icon [icon]=\"iconEnd()!\" class=\"icon-end\" />\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:inline-flex;width:100%}.textarea-wrapper{position:relative;display:inline-flex;align-items:flex-start;gap:var(--space-2);width:100%;padding:var(--space-2) var(--input-padding-horizontal-md);background-color:var(--input-bg);border:1px solid var(--input-border);border-radius:var(--input-radius);transition:all var(--duration-fast) var(--easing-default)}.textarea-wrapper:hover:not(.disabled):not(.readonly){border-color:var(--input-hover-border)}.textarea-wrapper:focus-within{border-color:var(--input-focus-border);box-shadow:var(--input-focus-shadow)}.textarea-wrapper.disabled{cursor:not-allowed;opacity:.85}.textarea-wrapper.readonly{background-color:var(--input-disabled-bg)}.textarea-wrapper.readonly textarea{color:var(--input-placeholder)}.textarea-wrapper.disabled textarea{color:var(--input-disabled-text)}textarea{flex:1;width:100%;min-height:var(--input-height-lg);border:none;background:transparent;font-size:var(--input-font-size-md);font-weight:var(--font-weight-normal);color:var(--input-text);line-height:var(--line-height-normal);resize:none;outline:none;padding:0}textarea::placeholder{color:var(--input-placeholder)}textarea:disabled{cursor:not-allowed;opacity:.6}.textarea-wrapper.outline{background:transparent;border-width:2px}.textarea-wrapper.ghost{background:transparent;border:none;border-bottom:1px solid var(--input-border);border-radius:0;padding-right:0;padding-left:0}.textarea-wrapper.ghost:focus-within{border-bottom-color:var(--input-focus-border);box-shadow:none}.textarea-wrapper.sm{padding:var(--space-1) var(--input-padding-horizontal-sm)}.textarea-wrapper.sm textarea{min-height:var(--input-height-sm);font-size:var(--input-font-size-sm)}.textarea-wrapper.md{padding:var(--space-2) var(--input-padding-horizontal-md)}.textarea-wrapper.md textarea{min-height:var(--input-height-md);font-size:var(--input-font-size-md)}.textarea-wrapper.lg{padding:var(--space-3) var(--input-padding-horizontal-lg)}.textarea-wrapper.lg textarea{min-height:var(--input-height-lg);font-size:var(--input-font-size-lg)}.textarea-wrapper.success{border-color:var(--input-success-border)}.textarea-wrapper.warning{border-color:var(--input-warning-border)}.textarea-wrapper.error{border-color:var(--input-error-border)}.textarea-wrapper.ghost.success{border-bottom-color:var(--input-success-border)}.textarea-wrapper.ghost.warning{border-bottom-color:var(--input-warning-border)}.textarea-wrapper.ghost.error{border-bottom-color:var(--input-error-border)}.icon-start,.icon-end{color:var(--input-icon);font-size:var(--input-icon-size-md);margin-top:var(--space-1)}.textarea-wrapper.sm .icon-start,.textarea-wrapper.sm .icon-end{font-size:var(--input-icon-size-sm)}.textarea-wrapper.lg .icon-start,.textarea-wrapper.lg .icon-end{font-size:var(--input-icon-size-lg)}.textarea-wrapper.has-icon-start textarea{margin-left:var(--space-1)}.textarea-wrapper.has-icon-end textarea{margin-right:var(--space-1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: 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"] }] });
1990
1990
  }
1991
1991
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: PrimitiveTextarea, decorators: [{
1992
1992
  type: Component,
@@ -2349,7 +2349,7 @@ class DsAlert {
2349
2349
  this.closed.emit();
2350
2350
  }
2351
2351
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsAlert, deps: [], target: i0.ɵɵFactoryTarget.Component });
2352
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsAlert, isStandalone: true, selector: "ds-alert", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, ngImport: i0, template: "<div\n [class]=\"alertClasses.join(' ')\"\n role=\"alert\"\n [attr.aria-hidden]=\"hidden() ? 'true' : null\"\n>\n @if (showIcon()) {\n <div class=\"ds-alert__icon\" aria-hidden=\"true\">\n <fa-icon [icon]=\"currentIcon\"></fa-icon>\n </div>\n }\n\n <div class=\"ds-alert__content\">\n <ng-content></ng-content>\n </div>\n\n @if (closable()) {\n <button\n class=\"ds-alert__close\"\n type=\"button\"\n aria-label=\"Fermer l'alerte\"\n (click)=\"handleClose()\"\n >\n <fa-icon [icon]=\"closeIcon\"></fa-icon>\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ds-alert{display:flex;align-items:flex-start;gap:var(--alert-gap, var(--space-3));border-radius:var(--alert-radius, var(--radius-2));border-width:1px;border-style:solid;transition:all var(--duration-fast, .15s) ease}.ds-alert--success{background-color:var(--alert-success-bg, var(--bg-success));border-color:var(--alert-success-border, var(--success));color:var(--alert-success-text, var(--text-success))}.ds-alert--success .ds-alert__icon{color:var(--alert-success-icon, var(--success))}.ds-alert--warning{background-color:var(--alert-warning-bg, var(--bg-warning));border-color:var(--alert-warning-border, var(--warning));color:var(--alert-warning-text, var(--text-warning))}.ds-alert--warning .ds-alert__icon{color:var(--alert-warning-icon, var(--warning))}.ds-alert--error{background-color:var(--alert-error-bg, var(--bg-error));border-color:var(--alert-error-border, var(--error));color:var(--alert-error-text, var(--text-error))}.ds-alert--error .ds-alert__icon{color:var(--alert-error-icon, var(--error))}.ds-alert--info{background-color:var(--alert-info-bg, var(--bg-info));border-color:var(--alert-info-border, var(--info));color:var(--alert-info-text, var(--text-info))}.ds-alert--info .ds-alert__icon{color:var(--alert-info-icon, var(--info))}.ds-alert--sm{padding:var(--alert-padding-sm, var(--space-2));font-size:var(--alert-font-size-sm, var(--font-size-2))}.ds-alert--sm .ds-alert__icon{font-size:var(--alert-icon-size-sm, 16px)}.ds-alert--sm .ds-alert__close{width:20px;height:20px;font-size:12px}.ds-alert--md{padding:var(--alert-padding-md, var(--space-3));font-size:var(--alert-font-size-md, var(--font-size-3))}.ds-alert--md .ds-alert__icon{font-size:var(--alert-icon-size-md, 20px)}.ds-alert--md .ds-alert__close{width:24px;height:24px;font-size:14px}.ds-alert--lg{padding:var(--alert-padding-lg, var(--space-4));font-size:var(--alert-font-size-lg, var(--font-size-4))}.ds-alert--lg .ds-alert__icon{font-size:var(--alert-icon-size-lg, 24px)}.ds-alert--lg .ds-alert__close{width:28px;height:28px;font-size:16px}.ds-alert--hidden{display:none}.ds-alert__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center;line-height:1}.ds-alert__content{flex:1;min-width:0}.ds-alert__content>:first-child{margin-top:0}.ds-alert__content>:last-child{margin-bottom:0}.ds-alert__close{flex-shrink:0;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-1, 4px);cursor:pointer;transition:all var(--duration-fast, .15s) ease;color:currentColor;opacity:.7}.ds-alert__close:hover{opacity:1;background-color:var(--hover-bg, rgba(0, 0, 0, .05))}.ds-alert__close:active{transform:scale(.95)}.ds-alert__close:focus-visible{outline:2px solid currentColor;outline-offset:2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
2352
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsAlert, isStandalone: true, selector: "ds-alert", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, hidden: { classPropertyName: "hidden", publicName: "hidden", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, ngImport: i0, template: "<div\n [class]=\"alertClasses.join(' ')\"\n role=\"alert\"\n [attr.aria-hidden]=\"hidden() ? 'true' : null\"\n>\n @if (showIcon()) {\n <div class=\"ds-alert__icon\" aria-hidden=\"true\">\n <fa-icon [icon]=\"currentIcon\"></fa-icon>\n </div>\n }\n\n <div class=\"ds-alert__content\">\n <ng-content></ng-content>\n </div>\n\n @if (closable()) {\n <button\n class=\"ds-alert__close\"\n type=\"button\"\n aria-label=\"Fermer l'alerte\"\n (click)=\"handleClose()\"\n >\n <fa-icon [icon]=\"closeIcon\"></fa-icon>\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ds-alert{display:flex;align-items:flex-start;gap:var(--alert-gap, var(--space-3));border-radius:var(--alert-radius, var(--radius-2));border-width:1px;border-style:solid;transition:all var(--duration-fast, .15s) ease}.ds-alert--success{background-color:var(--alert-success-bg, var(--bg-success));border-color:var(--alert-success-border, var(--success));color:var(--alert-success-text, var(--text-success))}.ds-alert--success .ds-alert__icon{color:var(--alert-success-icon, var(--success))}.ds-alert--warning{background-color:var(--alert-warning-bg, var(--bg-warning));border-color:var(--alert-warning-border, var(--warning));color:var(--alert-warning-text, var(--text-warning))}.ds-alert--warning .ds-alert__icon{color:var(--alert-warning-icon, var(--warning))}.ds-alert--error{background-color:var(--alert-error-bg, var(--bg-error));border-color:var(--alert-error-border, var(--error));color:var(--alert-error-text, var(--text-error))}.ds-alert--error .ds-alert__icon{color:var(--alert-error-icon, var(--error))}.ds-alert--info{background-color:var(--alert-info-bg, var(--bg-info));border-color:var(--alert-info-border, var(--info));color:var(--alert-info-text, var(--text-info))}.ds-alert--info .ds-alert__icon{color:var(--alert-info-icon, var(--info))}.ds-alert--sm{padding:var(--alert-padding-sm, var(--space-2));font-size:var(--alert-font-size-sm, var(--font-size-2))}.ds-alert--sm .ds-alert__icon{font-size:var(--alert-icon-size-sm, 16px)}.ds-alert--sm .ds-alert__close{width:20px;height:20px;font-size:12px}.ds-alert--md{padding:var(--alert-padding-md, var(--space-3));font-size:var(--alert-font-size-md, var(--font-size-3))}.ds-alert--md .ds-alert__icon{font-size:var(--alert-icon-size-md, 20px)}.ds-alert--md .ds-alert__close{width:24px;height:24px;font-size:14px}.ds-alert--lg{padding:var(--alert-padding-lg, var(--space-4));font-size:var(--alert-font-size-lg, var(--font-size-4))}.ds-alert--lg .ds-alert__icon{font-size:var(--alert-icon-size-lg, 24px)}.ds-alert--lg .ds-alert__close{width:28px;height:28px;font-size:16px}.ds-alert--hidden{display:none}.ds-alert__icon{flex-shrink:0;display:flex;align-items:center;justify-content:center;line-height:1}.ds-alert__content{flex:1;min-width:0}.ds-alert__content>:first-child{margin-top:0}.ds-alert__content>:last-child{margin-bottom:0}.ds-alert__close{flex-shrink:0;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-1, 4px);cursor:pointer;transition:all var(--duration-fast, .15s) ease;color:currentColor;opacity:.7}.ds-alert__close:hover{opacity:1;background-color:var(--hover-bg, rgba(0, 0, 0, .05))}.ds-alert__close:active{transform:scale(.95)}.ds-alert__close:focus-visible{outline:2px solid currentColor;outline-offset:2px}\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"] }] });
2353
2353
  }
2354
2354
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsAlert, decorators: [{
2355
2355
  type: Component,
@@ -2447,7 +2447,7 @@ class DsBreadcrumb {
2447
2447
  return index;
2448
2448
  }
2449
2449
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsBreadcrumb, deps: [], target: i0.ɵɵFactoryTarget.Component });
2450
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsBreadcrumb, isStandalone: true, selector: "ds-breadcrumb", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, maxItems: { classPropertyName: "maxItems", publicName: "maxItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClicked: "itemClicked" }, ngImport: i0, template: "<nav class=\"ds-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol class=\"ds-breadcrumb__list\">\n @for (item of visibleItems; track trackByIndex($index)) {\n <li class=\"ds-breadcrumb__item\" [class.ds-breadcrumb__item--active]=\"isLastItem($index)\">\n @if (item.href && !item.disabled && !isLastItem($index)) {\n <a\n [routerLink]=\"item.href\"\n class=\"ds-breadcrumb__link\"\n (click)=\"onItemClick(item, $event)\"\n [attr.aria-current]=\"isLastItem($index) ? 'page' : null\"\n >\n {{ item.label }}\n </a>\n } @else {\n <span\n class=\"ds-breadcrumb__text\"\n [class.ds-breadcrumb__text--disabled]=\"item.disabled\"\n [attr.aria-current]=\"isLastItem($index) ? 'page' : null\"\n >\n {{ item.label }}\n </span>\n }\n\n @if (!isLastItem($index)) {\n <span class=\"ds-breadcrumb__separator\" aria-hidden=\"true\">{{ separator() }}</span>\n }\n </li>\n }\n </ol>\n</nav>\n", styles: [".ds-breadcrumb{font-size:var(--breadcrumb-font-size)}.ds-breadcrumb__list{display:flex;align-items:center;flex-wrap:wrap;gap:var(--breadcrumb-spacing);list-style:none;padding:0;margin:0}.ds-breadcrumb__item{display:flex;align-items:center;gap:var(--breadcrumb-spacing)}.ds-breadcrumb__item--active .ds-breadcrumb__text{color:var(--breadcrumb-active);font-weight:var(--font-weight-medium)}.ds-breadcrumb__link{color:var(--breadcrumb-link);text-decoration:none;padding:var(--breadcrumb-item-padding);border-radius:var(--radius-1);transition:color var(--transition-default)}.ds-breadcrumb__link:hover{color:var(--breadcrumb-link-hover)}.ds-breadcrumb__link:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.ds-breadcrumb__text{padding:var(--breadcrumb-item-padding);color:var(--breadcrumb-active)}.ds-breadcrumb__text--disabled{color:var(--text-disabled);cursor:default}.ds-breadcrumb__separator{color:var(--breadcrumb-separator-color);-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
2450
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsBreadcrumb, isStandalone: true, selector: "ds-breadcrumb", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, maxItems: { classPropertyName: "maxItems", publicName: "maxItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClicked: "itemClicked" }, ngImport: i0, template: "<nav class=\"ds-breadcrumb\" aria-label=\"Breadcrumb\">\n <ol class=\"ds-breadcrumb__list\">\n @for (item of visibleItems; track trackByIndex($index)) {\n <li class=\"ds-breadcrumb__item\" [class.ds-breadcrumb__item--active]=\"isLastItem($index)\">\n @if (item.href && !item.disabled && !isLastItem($index)) {\n <a\n [routerLink]=\"item.href\"\n class=\"ds-breadcrumb__link\"\n (click)=\"onItemClick(item, $event)\"\n [attr.aria-current]=\"isLastItem($index) ? 'page' : null\"\n >\n {{ item.label }}\n </a>\n } @else {\n <span\n class=\"ds-breadcrumb__text\"\n [class.ds-breadcrumb__text--disabled]=\"item.disabled\"\n [attr.aria-current]=\"isLastItem($index) ? 'page' : null\"\n >\n {{ item.label }}\n </span>\n }\n\n @if (!isLastItem($index)) {\n <span class=\"ds-breadcrumb__separator\" aria-hidden=\"true\">{{ separator() }}</span>\n }\n </li>\n }\n </ol>\n</nav>\n", styles: [".ds-breadcrumb{font-size:var(--breadcrumb-font-size)}.ds-breadcrumb__list{display:flex;align-items:center;flex-wrap:wrap;gap:var(--breadcrumb-spacing);list-style:none;padding:0;margin:0}.ds-breadcrumb__item{display:flex;align-items:center;gap:var(--breadcrumb-spacing)}.ds-breadcrumb__item--active .ds-breadcrumb__text{color:var(--breadcrumb-active);font-weight:var(--font-weight-medium)}.ds-breadcrumb__link{color:var(--breadcrumb-link);text-decoration:none;padding:var(--breadcrumb-item-padding);border-radius:var(--radius-1);transition:color var(--transition-default)}.ds-breadcrumb__link:hover{color:var(--breadcrumb-link-hover)}.ds-breadcrumb__link:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.ds-breadcrumb__text{padding:var(--breadcrumb-item-padding);color:var(--breadcrumb-active)}.ds-breadcrumb__text--disabled{color:var(--text-disabled);cursor:default}.ds-breadcrumb__separator{color:var(--breadcrumb-separator-color);-webkit-user-select:none;user-select:none}\n"], dependencies: [{ 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"] }] });
2451
2451
  }
2452
2452
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsBreadcrumb, decorators: [{
2453
2453
  type: Component,
@@ -3279,7 +3279,7 @@ class DsDropdown {
3279
3279
  useExisting: forwardRef(() => DsDropdown),
3280
3280
  multi: true,
3281
3281
  },
3282
- ], viewQueries: [{ propertyName: "triggerButton", first: true, predicate: ["triggerButton"], descendants: true, read: ElementRef }, { propertyName: "menuItems", predicate: ["menuItemRef"], descendants: true }], ngImport: i0, template: "<primitive-button\n #triggerOrigin=\"cdkOverlayOrigin\"\n #triggerButton\n cdkOverlayOrigin\n [attr.id]=\"id()\"\n [type]=\"buttonType()\"\n [variant]=\"type()\"\n [appearance]=\"variant()\"\n [size]=\"size()\"\n [block]=\"block()\"\n [disabled]=\"isDisabled()\"\n [iconStart]=\"effectiveStartIcon()\"\n [iconEnd]=\"effectiveEndIcon()\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"isMenuOpen()\"\n [attr.aria-controls]=\"isMenuOpen() ? id() + '-menu' : null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledBy() ?? null\"\n (clicked)=\"toggleMenu()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n @if (loading()) {\n <span class=\"spinner\" aria-hidden=\"true\"></span>\n } @else {\n <ng-content></ng-content>\n }\n</primitive-button>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"isMenuOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'menu-overlay'\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\n (backdropClick)=\"closeMenu()\"\n (detach)=\"onOverlayDetach()\"\n>\n <div\n class=\"menu-sort-and-group\"\n role=\"menu\"\n [attr.id]=\"id() + '-menu'\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n >\n @for (item of dropdownItems(); track item.code; let index = $index) {\n <button\n #menuItemRef\n type=\"button\"\n class=\"menu-item-content\"\n [class.active]=\"isItemActive(item.code)\"\n [attr.id]=\"id() + '-option-' + item.code\"\n [attr.aria-checked]=\"isItemActive(item.code)\"\n [attr.data-index]=\"index\"\n role=\"menuitemradio\"\n (click)=\"setSelectedItem(item.code)\"\n (keydown)=\"onMenuKeydown($event, index)\"\n (mouseenter)=\"onMenuMouseEnter(index)\"\n >\n @if (item.startIcon) {\n <fa-icon\n [icon]=\"item.startIcon\"\n [style.color]=\"item.iconColor || null\">\n </fa-icon>\n }\n <span>{{ item.label }}</span>\n @if (isItemActive(item.code) && item.endIcon) {\n <fa-icon\n [icon]=\"item.endIcon\"\n [style.color]=\"item.iconColor || null\">\n </fa-icon>\n }\n </button>\n }\n </div>\n</ng-template>\n", styles: [":host{display:inline-flex}.menu-sort-and-group{background:var(--dropdown-bg);border:1px solid var(--dropdown-border-color);border-radius:var(--dropdown-radius);box-shadow:var(--dropdown-shadow);padding:var(--dropdown-padding);min-width:var(--dropdown-min-width)}.menu-item-content{display:flex;align-items:center;width:100%;gap:var(--dropdown-gap);padding:var(--dropdown-item-padding-y) var(--dropdown-item-padding-x);border-radius:var(--dropdown-item-radius);border:none;cursor:pointer;color:var(--dropdown-item-color);background:transparent;transition:background-color var(--duration-fast) var(--easing-default),color var(--duration-fast) var(--easing-default)}.menu-item-content fa-icon{flex-shrink:0}.menu-item-content span{flex:1;text-align:left}.menu-item-content.active{background:var(--dropdown-item-active-bg);color:var(--dropdown-item-active-color);font-weight:var(--font-weight-semibold)}.menu-item-content:not(.active):hover{background:var(--dropdown-item-hover-bg);color:var(--dropdown-item-hover-color)}.menu-item-content:focus-visible{outline:2px solid var(--focus-color);outline-offset:2px}.menu-item-content:active{opacity:.9}.menu-overlay{background:var(--dropdown-backdrop)}.spinner{border:2px solid var(--spinner-border);border-top-color:var(--spinner-border-active);border-radius:50%;width:1em;height:1em;animation:spin .6s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: PrimitiveButton, selector: "primitive-button", inputs: ["type", "variant", "size", "disabled", "iconStart", "iconEnd", "appearance", "block"], outputs: ["clicked"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { 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"] }] });
3282
+ ], viewQueries: [{ propertyName: "triggerButton", first: true, predicate: ["triggerButton"], descendants: true, read: ElementRef }, { propertyName: "menuItems", predicate: ["menuItemRef"], descendants: true }], ngImport: i0, template: "<primitive-button\n #triggerOrigin=\"cdkOverlayOrigin\"\n #triggerButton\n cdkOverlayOrigin\n [attr.id]=\"id()\"\n [type]=\"buttonType()\"\n [variant]=\"type()\"\n [appearance]=\"variant()\"\n [size]=\"size()\"\n [block]=\"block()\"\n [disabled]=\"isDisabled()\"\n [iconStart]=\"effectiveStartIcon()\"\n [iconEnd]=\"effectiveEndIcon()\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"isMenuOpen()\"\n [attr.aria-controls]=\"isMenuOpen() ? id() + '-menu' : null\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledBy() ?? null\"\n (clicked)=\"toggleMenu()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n @if (loading()) {\n <span class=\"spinner\" aria-hidden=\"true\"></span>\n } @else {\n <ng-content></ng-content>\n }\n</primitive-button>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"triggerOrigin\"\n [cdkConnectedOverlayOpen]=\"isMenuOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'menu-overlay'\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\n (backdropClick)=\"closeMenu()\"\n (detach)=\"onOverlayDetach()\"\n>\n <div\n class=\"menu-sort-and-group\"\n role=\"menu\"\n [attr.id]=\"id() + '-menu'\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n >\n @for (item of dropdownItems(); track item.code; let index = $index) {\n <button\n #menuItemRef\n type=\"button\"\n class=\"menu-item-content\"\n [class.active]=\"isItemActive(item.code)\"\n [attr.id]=\"id() + '-option-' + item.code\"\n [attr.aria-checked]=\"isItemActive(item.code)\"\n [attr.data-index]=\"index\"\n role=\"menuitemradio\"\n (click)=\"setSelectedItem(item.code)\"\n (keydown)=\"onMenuKeydown($event, index)\"\n (mouseenter)=\"onMenuMouseEnter(index)\"\n >\n @if (item.startIcon) {\n <fa-icon\n [icon]=\"item.startIcon\"\n [style.color]=\"item.iconColor || null\">\n </fa-icon>\n }\n <span>{{ item.label }}</span>\n @if (isItemActive(item.code) && item.endIcon) {\n <fa-icon\n [icon]=\"item.endIcon\"\n [style.color]=\"item.iconColor || null\">\n </fa-icon>\n }\n </button>\n }\n </div>\n</ng-template>\n", styles: [":host{display:inline-flex}.menu-sort-and-group{background:var(--dropdown-bg);border:1px solid var(--dropdown-border-color);border-radius:var(--dropdown-radius);box-shadow:var(--dropdown-shadow);padding:var(--dropdown-padding);min-width:var(--dropdown-min-width)}.menu-item-content{display:flex;align-items:center;width:100%;gap:var(--dropdown-gap);padding:var(--dropdown-item-padding-y) var(--dropdown-item-padding-x);border-radius:var(--dropdown-item-radius);border:none;cursor:pointer;color:var(--dropdown-item-color);background:transparent;transition:background-color var(--duration-fast) var(--easing-default),color var(--duration-fast) var(--easing-default)}.menu-item-content fa-icon{flex-shrink:0}.menu-item-content span{flex:1;text-align:left}.menu-item-content.active{background:var(--dropdown-item-active-bg);color:var(--dropdown-item-active-color);font-weight:var(--font-weight-semibold)}.menu-item-content:not(.active):hover{background:var(--dropdown-item-hover-bg);color:var(--dropdown-item-hover-color)}.menu-item-content:focus-visible{outline:2px solid var(--focus-color);outline-offset:2px}.menu-item-content:active{opacity:.9}.menu-overlay{background:var(--dropdown-backdrop)}.spinner{border:2px solid var(--spinner-border);border-top-color:var(--spinner-border-active);border-radius:50%;width:1em;height:1em;animation:spin .6s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: PrimitiveButton, selector: "primitive-button", inputs: ["type", "variant", "size", "disabled", "iconStart", "iconEnd", "appearance", "block"], outputs: ["clicked"] }, { kind: "component", type: 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"] }] });
3283
3283
  }
3284
3284
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsDropdown, decorators: [{
3285
3285
  type: Component,
@@ -3427,7 +3427,7 @@ class DsInputField {
3427
3427
  useExisting: forwardRef(() => DsInputField),
3428
3428
  multi: true,
3429
3429
  },
3430
- ], ngImport: i0, template: "<div\n class=\"ds-input-field\"\n [ngClass]=\"[\n variant(),\n inputState(),\n isDisabled() ? 'is-disabled' : '',\n readonly() ? 'is-readonly' : ''\n ]\">\n @if (label()) {\n <label [for]=\"id()\" [attr.data-state]=\"inputState()\">\n {{ label() }}\n @if (required()) {\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <div class=\"input-container\">\n <primitive-input\n [id]=\"id()\"\n [name]=\"name()\"\n [autocomplete]=\"autocomplete()\"\n [ariaLabel]=\"ariaLabel()\"\n [ariaDescribedBy]=\"ariaDescribedBy()\"\n [maxlength]=\"maxlength()\"\n [placeholder]=\"placeholder()\"\n [type]=\"actualType()\"\n [disabled]=\"isDisabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [state]=\"inputState()\"\n [size]=\"size()\"\n [appearance]=\"variant()\"\n [iconStart]=\"iconStart()\"\n [iconEnd]=\"iconEnd()\"\n [value]=\"internalValue()\"\n (valueChange)=\"onPrimitiveValueChange($event)\"\n (inputBlurred)=\"onInputBlur()\"\n >\n </primitive-input>\n\n @if (showClearButton()) {\n <button\n type=\"button\"\n class=\"icon-btn clear\"\n (click)=\"clearValue()\"\n aria-label=\"Clear input\">\n <fa-icon [icon]=\"faClose\" />\n </button>\n }\n\n @if (showTogglePassword()) {\n <button\n type=\"button\"\n class=\"icon-btn toggle\"\n (click)=\"togglePasswordVisibility()\"\n [attr.aria-label]=\"passwordVisible() ? 'Hide password' : 'Show password'\">\n <fa-icon [icon]=\"passwordVisible() ? faEyeSlash : faEye\" />\n </button>\n }\n </div>\n\n @if (error()) {\n <p class=\"error\" [id]=\"errorId()\" role=\"alert\">\n {{ error() }}\n </p>\n }\n\n @if (!error() && helper()) {\n <p class=\"helper\" [id]=\"helperId()\">\n {{ helper() }}\n </p>\n }\n\n @if (maxlength()) {\n <p class=\"counter\" [id]=\"counterId()\">\n {{ characterCount() }}/{{ maxlength() }}\n </p>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%}.ds-input-field{display:flex;flex-direction:column;gap:var(--space-1);width:100%}.ds-input-field.error label{color:var(--input-error-border, var(--error))}.ds-input-field.success label{color:var(--input-success-border, var(--success))}.ds-input-field.warning label{color:var(--input-warning-border, var(--warning))}.ds-input-field.is-disabled label,.ds-input-field.is-readonly label{color:var(--text-muted)}label{display:block;font-weight:var(--font-weight-medium);font-size:var(--input-label-font-size, var(--font-size-2));color:var(--input-label-color, var(--text-default));margin-bottom:var(--space-1)}label .required{color:var(--input-error-border, var(--error));margin-left:var(--space-1)}.input-container{position:relative;display:flex;align-items:center;width:100%}.input-container primitive-input{flex:1}.icon-btn{position:absolute;right:var(--space-2);display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;color:var(--input-icon, var(--text-muted));cursor:pointer;border-radius:var(--radius-1);transition:all var(--duration-fast) var(--easing-default)}.icon-btn:hover{background:var(--surface-hover);color:var(--text-default)}.icon-btn:active{transform:scale(.95)}.icon-btn fa-icon{font-size:var(--icon-size-md)}.ds-input-field.is-disabled .icon-btn,.ds-input-field.is-readonly .icon-btn{cursor:not-allowed;opacity:.4;pointer-events:none}.icon-btn.clear{right:calc(var(--space-2) + 40px)}.icon-btn.toggle{right:var(--space-2)}.helper{font-size:var(--font-size-1);color:var(--text-muted);margin:0}.ds-input-field.success .helper{color:var(--input-success-border, var(--success))}.ds-input-field.warning .helper{color:var(--input-warning-border, var(--warning))}.error{font-size:var(--font-size-1);color:var(--input-error-border, var(--error));margin:0}.counter{font-size:var(--font-size-1);color:var(--text-muted);text-align:right;margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "component", type: PrimitiveInput, selector: "primitive-input", inputs: ["id", "name", "autocomplete", "placeholder", "type", "disabled", "readonly", "required", "maxlength", "state", "size", "appearance", "iconStart", "iconEnd", "ariaLabel", "ariaDescribedBy", "value"], outputs: ["valueChange", "inputChanged", "inputBlurred", "inputFocused"] }] });
3430
+ ], ngImport: i0, template: "<div\n class=\"ds-input-field\"\n [ngClass]=\"[\n variant(),\n inputState(),\n isDisabled() ? 'is-disabled' : '',\n readonly() ? 'is-readonly' : ''\n ]\">\n @if (label()) {\n <label [for]=\"id()\" [attr.data-state]=\"inputState()\">\n {{ label() }}\n @if (required()) {\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <div class=\"input-container\">\n <primitive-input\n [id]=\"id()\"\n [name]=\"name()\"\n [autocomplete]=\"autocomplete()\"\n [ariaLabel]=\"ariaLabel()\"\n [ariaDescribedBy]=\"ariaDescribedBy()\"\n [maxlength]=\"maxlength()\"\n [placeholder]=\"placeholder()\"\n [type]=\"actualType()\"\n [disabled]=\"isDisabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [state]=\"inputState()\"\n [size]=\"size()\"\n [appearance]=\"variant()\"\n [iconStart]=\"iconStart()\"\n [iconEnd]=\"iconEnd()\"\n [value]=\"internalValue()\"\n (valueChange)=\"onPrimitiveValueChange($event)\"\n (inputBlurred)=\"onInputBlur()\"\n >\n </primitive-input>\n\n @if (showClearButton()) {\n <button\n type=\"button\"\n class=\"icon-btn clear\"\n (click)=\"clearValue()\"\n aria-label=\"Clear input\">\n <fa-icon [icon]=\"faClose\" />\n </button>\n }\n\n @if (showTogglePassword()) {\n <button\n type=\"button\"\n class=\"icon-btn toggle\"\n (click)=\"togglePasswordVisibility()\"\n [attr.aria-label]=\"passwordVisible() ? 'Hide password' : 'Show password'\">\n <fa-icon [icon]=\"passwordVisible() ? faEyeSlash : faEye\" />\n </button>\n }\n </div>\n\n @if (error()) {\n <p class=\"error\" [id]=\"errorId()\" role=\"alert\">\n {{ error() }}\n </p>\n }\n\n @if (!error() && helper()) {\n <p class=\"helper\" [id]=\"helperId()\">\n {{ helper() }}\n </p>\n }\n\n @if (maxlength()) {\n <p class=\"counter\" [id]=\"counterId()\">\n {{ characterCount() }}/{{ maxlength() }}\n </p>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%}.ds-input-field{display:flex;flex-direction:column;gap:var(--space-1);width:100%}.ds-input-field.error label{color:var(--input-error-border, var(--error))}.ds-input-field.success label{color:var(--input-success-border, var(--success))}.ds-input-field.warning label{color:var(--input-warning-border, var(--warning))}.ds-input-field.is-disabled label,.ds-input-field.is-readonly label{color:var(--text-muted)}label{display:block;font-weight:var(--font-weight-medium);font-size:var(--input-label-font-size, var(--font-size-2));color:var(--input-label-color, var(--text-default));margin-bottom:var(--space-1)}label .required{color:var(--input-error-border, var(--error));margin-left:var(--space-1)}.input-container{position:relative;display:flex;align-items:center;width:100%}.input-container primitive-input{flex:1}.icon-btn{position:absolute;right:var(--space-2);display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;color:var(--input-icon, var(--text-muted));cursor:pointer;border-radius:var(--radius-1);transition:all var(--duration-fast) var(--easing-default)}.icon-btn:hover{background:var(--surface-hover);color:var(--text-default)}.icon-btn:active{transform:scale(.95)}.icon-btn fa-icon{font-size:var(--icon-size-md)}.ds-input-field.is-disabled .icon-btn,.ds-input-field.is-readonly .icon-btn{cursor:not-allowed;opacity:.4;pointer-events:none}.icon-btn.clear{right:calc(var(--space-2) + 40px)}.icon-btn.toggle{right:var(--space-2)}.helper{font-size:var(--font-size-1);color:var(--text-muted);margin:0}.ds-input-field.success .helper{color:var(--input-success-border, var(--success))}.ds-input-field.warning .helper{color:var(--input-warning-border, var(--warning))}.error{font-size:var(--font-size-1);color:var(--input-error-border, var(--error));margin:0}.counter{font-size:var(--font-size-1);color:var(--text-muted);text-align:right;margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "component", type: PrimitiveInput, selector: "primitive-input", inputs: ["id", "name", "autocomplete", "placeholder", "type", "disabled", "readonly", "required", "maxlength", "state", "size", "appearance", "iconStart", "iconEnd", "ariaLabel", "ariaDescribedBy", "value"], outputs: ["valueChange", "inputChanged", "inputBlurred", "inputFocused"] }] });
3431
3431
  }
3432
3432
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsInputField, decorators: [{
3433
3433
  type: Component,
@@ -3612,7 +3612,7 @@ class DsInputTextarea {
3612
3612
  useExisting: forwardRef(() => DsInputTextarea),
3613
3613
  multi: true,
3614
3614
  },
3615
- ], viewQueries: [{ propertyName: "textareaHost", first: true, predicate: ["textareaHost"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"ds-input-textarea\"\n [ngClass]=\"[\n variant(),\n inputState(),\n isDisabled() ? 'is-disabled' : '',\n readonly() ? 'is-readonly' : ''\n ]\">\n @if (label()) {\n <label [for]=\"id()\" [attr.data-state]=\"inputState()\">\n {{ label() }}\n @if (required()) {\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <div class=\"textarea-container\">\n <primitive-textarea\n #textareaHost\n [id]=\"id()\"\n [name]=\"name()\"\n [placeholder]=\"placeholder()\"\n [rows]=\"rows()\"\n [cols]=\"cols()\"\n [maxlength]=\"maxlength()\"\n [resize]=\"textareaResize()\"\n [state]=\"inputState()\"\n [size]=\"size()\"\n [appearance]=\"variant()\"\n [iconStart]=\"iconStart()\"\n [iconEnd]=\"iconEnd()\"\n [disabled]=\"isDisabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [ariaLabel]=\"ariaLabel()\"\n [value]=\"internalValue()\"\n [ariaDescribedBy]=\"ariaDescribedBy()\"\n (valueChange)=\"onPrimitiveValueChange($event)\"\n (inputBlurred)=\"onInputBlur()\"\n >\n </primitive-textarea>\n\n @if (showClearButton()) {\n <button\n type=\"button\"\n class=\"icon-btn clear\"\n (click)=\"clearValue()\"\n aria-label=\"Clear textarea\">\n <fa-icon [icon]=\"faClose\" />\n </button>\n }\n </div>\n\n @if (error()) {\n <p class=\"error\" [id]=\"arErrorId()\" role=\"alert\">{{ error() }}</p>\n }\n\n @if (!error() && helper()) {\n <p class=\"helper\" [id]=\"arHelperId()\">{{ helper() }}</p>\n }\n\n @if (maxlength()) {\n <p class=\"counter\" [id]=\"arCounterId()\">\n {{ characterCount() }}/{{ maxlength() }}\n </p>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%}.ds-input-textarea{display:flex;flex-direction:column;gap:var(--space-1);width:100%}.ds-input-textarea.error label{color:var(--input-error-border, var(--error))}.ds-input-textarea.success label{color:var(--input-success-border, var(--success))}.ds-input-textarea.warning label{color:var(--input-warning-border, var(--warning))}.ds-input-textarea.is-disabled label,.ds-input-textarea.is-readonly label{color:var(--text-muted)}label{display:block;font-weight:var(--font-weight-medium);font-size:var(--input-label-font-size, var(--font-size-2));color:var(--input-label-color, var(--text-default));margin-bottom:var(--space-1)}label .required{color:var(--input-error-border, var(--error));margin-left:var(--space-1)}.textarea-container{position:relative;display:flex;width:100%}.textarea-container primitive-textarea{flex:1}.icon-btn{position:absolute;top:var(--space-2);right:var(--space-2);display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;color:var(--input-icon, var(--text-muted));cursor:pointer;border-radius:var(--radius-1);transition:all var(--duration-fast) var(--easing-default)}.icon-btn:hover{background:var(--surface-hover);color:var(--text-default)}.icon-btn:active{transform:scale(.95)}.icon-btn fa-icon{font-size:var(--icon-size-md)}.ds-input-textarea.is-disabled .icon-btn,.ds-input-textarea.is-readonly .icon-btn{cursor:not-allowed;opacity:.4;pointer-events:none}.helper{font-size:var(--font-size-1);color:var(--text-muted);margin:0}.ds-input-textarea.success .helper{color:var(--input-success-border, var(--success))}.ds-input-textarea.warning .helper{color:var(--input-warning-border, var(--warning))}.error{font-size:var(--font-size-1);color:var(--input-error-border, var(--error));margin:0}.counter{font-size:var(--font-size-1);color:var(--text-muted);text-align:right;margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PrimitiveTextarea, selector: "primitive-textarea", inputs: ["id", "name", "placeholder", "disabled", "readonly", "required", "state", "size", "appearance", "resize", "rows", "cols", "maxlength", "iconStart", "iconEnd", "ariaLabel", "ariaDescribedBy", "value"], outputs: ["valueChange", "inputChanged", "inputBlurred", "inputFocused"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
3615
+ ], viewQueries: [{ propertyName: "textareaHost", first: true, predicate: ["textareaHost"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"ds-input-textarea\"\n [ngClass]=\"[\n variant(),\n inputState(),\n isDisabled() ? 'is-disabled' : '',\n readonly() ? 'is-readonly' : ''\n ]\">\n @if (label()) {\n <label [for]=\"id()\" [attr.data-state]=\"inputState()\">\n {{ label() }}\n @if (required()) {\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <div class=\"textarea-container\">\n <primitive-textarea\n #textareaHost\n [id]=\"id()\"\n [name]=\"name()\"\n [placeholder]=\"placeholder()\"\n [rows]=\"rows()\"\n [cols]=\"cols()\"\n [maxlength]=\"maxlength()\"\n [resize]=\"textareaResize()\"\n [state]=\"inputState()\"\n [size]=\"size()\"\n [appearance]=\"variant()\"\n [iconStart]=\"iconStart()\"\n [iconEnd]=\"iconEnd()\"\n [disabled]=\"isDisabled()\"\n [readonly]=\"readonly()\"\n [required]=\"required()\"\n [ariaLabel]=\"ariaLabel()\"\n [value]=\"internalValue()\"\n [ariaDescribedBy]=\"ariaDescribedBy()\"\n (valueChange)=\"onPrimitiveValueChange($event)\"\n (inputBlurred)=\"onInputBlur()\"\n >\n </primitive-textarea>\n\n @if (showClearButton()) {\n <button\n type=\"button\"\n class=\"icon-btn clear\"\n (click)=\"clearValue()\"\n aria-label=\"Clear textarea\">\n <fa-icon [icon]=\"faClose\" />\n </button>\n }\n </div>\n\n @if (error()) {\n <p class=\"error\" [id]=\"arErrorId()\" role=\"alert\">{{ error() }}</p>\n }\n\n @if (!error() && helper()) {\n <p class=\"helper\" [id]=\"arHelperId()\">{{ helper() }}</p>\n }\n\n @if (maxlength()) {\n <p class=\"counter\" [id]=\"arCounterId()\">\n {{ characterCount() }}/{{ maxlength() }}\n </p>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%}.ds-input-textarea{display:flex;flex-direction:column;gap:var(--space-1);width:100%}.ds-input-textarea.error label{color:var(--input-error-border, var(--error))}.ds-input-textarea.success label{color:var(--input-success-border, var(--success))}.ds-input-textarea.warning label{color:var(--input-warning-border, var(--warning))}.ds-input-textarea.is-disabled label,.ds-input-textarea.is-readonly label{color:var(--text-muted)}label{display:block;font-weight:var(--font-weight-medium);font-size:var(--input-label-font-size, var(--font-size-2));color:var(--input-label-color, var(--text-default));margin-bottom:var(--space-1)}label .required{color:var(--input-error-border, var(--error));margin-left:var(--space-1)}.textarea-container{position:relative;display:flex;width:100%}.textarea-container primitive-textarea{flex:1}.icon-btn{position:absolute;top:var(--space-2);right:var(--space-2);display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;color:var(--input-icon, var(--text-muted));cursor:pointer;border-radius:var(--radius-1);transition:all var(--duration-fast) var(--easing-default)}.icon-btn:hover{background:var(--surface-hover);color:var(--text-default)}.icon-btn:active{transform:scale(.95)}.icon-btn fa-icon{font-size:var(--icon-size-md)}.ds-input-textarea.is-disabled .icon-btn,.ds-input-textarea.is-readonly .icon-btn{cursor:not-allowed;opacity:.4;pointer-events:none}.helper{font-size:var(--font-size-1);color:var(--text-muted);margin:0}.ds-input-textarea.success .helper{color:var(--input-success-border, var(--success))}.ds-input-textarea.warning .helper{color:var(--input-warning-border, var(--warning))}.error{font-size:var(--font-size-1);color:var(--input-error-border, var(--error));margin:0}.counter{font-size:var(--font-size-1);color:var(--text-muted);text-align:right;margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PrimitiveTextarea, selector: "primitive-textarea", inputs: ["id", "name", "placeholder", "disabled", "readonly", "required", "state", "size", "appearance", "resize", "rows", "cols", "maxlength", "iconStart", "iconEnd", "ariaLabel", "ariaDescribedBy", "value"], outputs: ["valueChange", "inputChanged", "inputBlurred", "inputFocused"] }, { kind: "component", type: 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"] }] });
3616
3616
  }
3617
3617
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsInputTextarea, decorators: [{
3618
3618
  type: Component,
@@ -3767,7 +3767,7 @@ class DsModalComponent {
3767
3767
  body.classList.remove('modal-open');
3768
3768
  }
3769
3769
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3770
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsModalComponent, isStandalone: true, selector: "ds-modal", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdrop: { classPropertyName: "closeOnBackdrop", publicName: "closeOnBackdrop", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "opened", closed: "closed" }, host: { listeners: { "document:keydown.escape": "handleEscape($event)" } }, queries: [{ propertyName: "projectedIcon", first: true, predicate: ["icon"], descendants: true }], viewQueries: [{ propertyName: "modalContainer", first: true, predicate: ["modalContainer"], descendants: true }, { propertyName: "closeButton", first: true, predicate: ["closeButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "@if (shouldRenderOverlay()) {\n <div class=\"overlay\" role=\"presentation\" (click)=\"onBackdropClick()\"></div>\n}\n@if (open()) {\n <div #modalContainer\n class=\"modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"modalTitleId\"\n [attr.aria-describedby]=\"modalDescId\"\n [ngClass]=\"modalClasses()\"\n >\n <header class=\"modal-header\">\n @if (showIcon()) {\n <div class=\"modal-icon\">\n <ng-content select=\"[icon]\"></ng-content>\n @if (shouldRenderDefaultIcon() && resolvedIcon()) {\n <fa-icon [icon]=\"resolvedIcon()!\"></fa-icon>\n }\n </div>\n }\n <h3 [id]=\"modalTitleId\">{{ title() }}</h3>\n @if (closable()) {\n <primitive-button\n #closeButton\n class=\"close-btn\"\n variant=\"ghost\"\n appearance=\"outline\"\n size=\"sm\"\n (clicked)=\"close()\"\n aria-label=\"Fermer la fen\u00EAtre\"\n >\u2715</primitive-button>\n }\n </header>\n <div class=\"modal-content\" (scroll)=\"onScroll($event)\">\n <section [id]=\"modalDescId\"><ng-content></ng-content></section>\n </div>\n <footer class=\"modal-footer\" [class.with-shadow]=\"isScrolled()\">\n <ng-content select=\"[footer]\"></ng-content>\n </footer>\n </div>\n}\n", styles: [".overlay{position:fixed;inset:0;background:var(--modal-backdrop);-webkit-backdrop-filter:blur(var(--modal-overlay-blur));backdrop-filter:blur(var(--modal-overlay-blur));z-index:var(--modal-overlay-z-index)}.modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--modal-bg);color:var(--modal-text);padding:var(--modal-padding);border-radius:var(--modal-radius);box-shadow:var(--modal-shadow-depth);max-height:var(--modal-max-height);border:1px solid var(--modal-border-color);z-index:var(--modal-overlay-z-index);width:min(95vw,var(--modal-size-md));display:flex;flex-direction:column;overflow:hidden;animation:scaleIn .25s var(--easing-default)}.modal-sm{width:min(95vw,var(--modal-size-sm))}.modal-md{width:min(95vw,var(--modal-size-md))}.modal-lg{width:min(95vw,var(--modal-size-lg))}.modal-header{display:flex;align-items:center;gap:var(--modal-section-gap);position:relative;padding-bottom:var(--modal-section-gap);margin-bottom:var(--modal-section-gap);border-bottom:1px solid var(--modal-divider)}.modal-header h3{margin:0;font-size:var(--font-size-5);font-weight:var(--font-weight-semibold)}.modal-header .modal-icon{width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;border-radius:50%;flex-shrink:0;background:var(--color-primary);color:var(--gray-50);animation:popIn .3s var(--easing-default)}.modal-header .close-btn{position:absolute;top:0;right:0}.modal-header .close-btn button{background:transparent;border:none;font-size:var(--font-size-4);cursor:pointer;color:var(--text-muted);padding:0;line-height:var(--line-height-tight);transition:color var(--duration-fast) var(--easing-default)}.modal-header .close-btn button:hover{color:var(--text-default)}.modal-success .modal-header h3{color:var(--modal-type-success-color)}.modal-warning .modal-header h3{color:var(--modal-type-warning-color)}.modal-error .modal-header h3{color:var(--modal-type-error-color)}.modal-info .modal-header h3{color:var(--modal-type-info-color)}.modal-success .modal-icon{background:var(--modal-type-success-color);color:var(--modal-type-success-contrast)}.modal-warning .modal-icon{background:var(--modal-type-warning-color);color:var(--modal-type-warning-contrast)}.modal-error .modal-icon{background:var(--modal-type-error-color);color:var(--modal-type-error-contrast)}.modal-info .modal-icon{background:var(--modal-type-info-color);color:var(--modal-type-info-contrast)}.modal-content{flex:1;overflow-y:auto;font-size:var(--font-size-2);display:flex;flex-direction:column;gap:var(--space-2);margin-bottom:var(--modal-section-gap)}.modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-3);padding-top:var(--space-2);padding-bottom:var(--modal-footer-padding);padding-inline:0;border-top:1px solid var(--modal-divider);flex-wrap:wrap}@media (max-width: 480px){.modal-footer{flex-direction:column;align-items:stretch;justify-content:center}.modal-footer ds-button{width:100%}}.modal-footer.with-shadow{box-shadow:var(--modal-footer-shadow, inset 0 1px 0 var(--modal-divider))}@keyframes scaleIn{0%{opacity:0;transform:translate(-50%,-50%) scale(.95)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes popIn{0%{transform:scale(.8);opacity:0}to{transform:scale(1);opacity:1}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "component", type: PrimitiveButton, selector: "primitive-button", inputs: ["type", "variant", "size", "disabled", "iconStart", "iconEnd", "appearance", "block"], outputs: ["clicked"] }] });
3770
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsModalComponent, isStandalone: true, selector: "ds-modal", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdrop: { classPropertyName: "closeOnBackdrop", publicName: "closeOnBackdrop", isSignal: true, isRequired: false, transformFunction: null }, showIcon: { classPropertyName: "showIcon", publicName: "showIcon", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "opened", closed: "closed" }, host: { listeners: { "document:keydown.escape": "handleEscape($event)" } }, queries: [{ propertyName: "projectedIcon", first: true, predicate: ["icon"], descendants: true }], viewQueries: [{ propertyName: "modalContainer", first: true, predicate: ["modalContainer"], descendants: true }, { propertyName: "closeButton", first: true, predicate: ["closeButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "@if (shouldRenderOverlay()) {\n <div class=\"overlay\" role=\"presentation\" (click)=\"onBackdropClick()\"></div>\n}\n@if (open()) {\n <div #modalContainer\n class=\"modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"modalTitleId\"\n [attr.aria-describedby]=\"modalDescId\"\n [ngClass]=\"modalClasses()\"\n >\n <header class=\"modal-header\">\n @if (showIcon()) {\n <div class=\"modal-icon\">\n <ng-content select=\"[icon]\"></ng-content>\n @if (shouldRenderDefaultIcon() && resolvedIcon()) {\n <fa-icon [icon]=\"resolvedIcon()!\"></fa-icon>\n }\n </div>\n }\n <h3 [id]=\"modalTitleId\">{{ title() }}</h3>\n @if (closable()) {\n <primitive-button\n #closeButton\n class=\"close-btn\"\n variant=\"ghost\"\n appearance=\"outline\"\n size=\"sm\"\n (clicked)=\"close()\"\n aria-label=\"Fermer la fen\u00EAtre\"\n >\u2715</primitive-button>\n }\n </header>\n <div class=\"modal-content\" (scroll)=\"onScroll($event)\">\n <section [id]=\"modalDescId\"><ng-content></ng-content></section>\n </div>\n <footer class=\"modal-footer\" [class.with-shadow]=\"isScrolled()\">\n <ng-content select=\"[footer]\"></ng-content>\n </footer>\n </div>\n}\n", styles: [".overlay{position:fixed;inset:0;background:var(--modal-backdrop);-webkit-backdrop-filter:blur(var(--modal-overlay-blur));backdrop-filter:blur(var(--modal-overlay-blur));z-index:var(--modal-overlay-z-index)}.modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--modal-bg);color:var(--modal-text);padding:var(--modal-padding);border-radius:var(--modal-radius);box-shadow:var(--modal-shadow-depth);max-height:var(--modal-max-height);border:1px solid var(--modal-border-color);z-index:var(--modal-overlay-z-index);width:min(95vw,var(--modal-size-md));display:flex;flex-direction:column;overflow:hidden;animation:scaleIn .25s var(--easing-default)}.modal-sm{width:min(95vw,var(--modal-size-sm))}.modal-md{width:min(95vw,var(--modal-size-md))}.modal-lg{width:min(95vw,var(--modal-size-lg))}.modal-header{display:flex;align-items:center;gap:var(--modal-section-gap);position:relative;padding-bottom:var(--modal-section-gap);margin-bottom:var(--modal-section-gap);border-bottom:1px solid var(--modal-divider)}.modal-header h3{margin:0;font-size:var(--font-size-5);font-weight:var(--font-weight-semibold)}.modal-header .modal-icon{width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;border-radius:50%;flex-shrink:0;background:var(--color-primary);color:var(--gray-50);animation:popIn .3s var(--easing-default)}.modal-header .close-btn{position:absolute;top:0;right:0}.modal-header .close-btn button{background:transparent;border:none;font-size:var(--font-size-4);cursor:pointer;color:var(--text-muted);padding:0;line-height:var(--line-height-tight);transition:color var(--duration-fast) var(--easing-default)}.modal-header .close-btn button:hover{color:var(--text-default)}.modal-success .modal-header h3{color:var(--modal-type-success-color)}.modal-warning .modal-header h3{color:var(--modal-type-warning-color)}.modal-error .modal-header h3{color:var(--modal-type-error-color)}.modal-info .modal-header h3{color:var(--modal-type-info-color)}.modal-success .modal-icon{background:var(--modal-type-success-color);color:var(--modal-type-success-contrast)}.modal-warning .modal-icon{background:var(--modal-type-warning-color);color:var(--modal-type-warning-contrast)}.modal-error .modal-icon{background:var(--modal-type-error-color);color:var(--modal-type-error-contrast)}.modal-info .modal-icon{background:var(--modal-type-info-color);color:var(--modal-type-info-contrast)}.modal-content{flex:1;overflow-y:auto;font-size:var(--font-size-2);display:flex;flex-direction:column;gap:var(--space-2);margin-bottom:var(--modal-section-gap)}.modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--space-3);padding-top:var(--space-2);padding-bottom:var(--modal-footer-padding);padding-inline:0;border-top:1px solid var(--modal-divider);flex-wrap:wrap}@media (max-width: 480px){.modal-footer{flex-direction:column;align-items:stretch;justify-content:center}.modal-footer ds-button{width:100%}}.modal-footer.with-shadow{box-shadow:var(--modal-footer-shadow, inset 0 1px 0 var(--modal-divider))}@keyframes scaleIn{0%{opacity:0;transform:translate(-50%,-50%) scale(.95)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes popIn{0%{transform:scale(.8);opacity:0}to{transform:scale(1);opacity:1}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "component", type: PrimitiveButton, selector: "primitive-button", inputs: ["type", "variant", "size", "disabled", "iconStart", "iconEnd", "appearance", "block"], outputs: ["clicked"] }] });
3771
3771
  }
3772
3772
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsModalComponent, decorators: [{
3773
3773
  type: Component,
@@ -3942,7 +3942,7 @@ class DsPopover {
3942
3942
  ngOnDestroy() {
3943
3943
  this.close();
3944
3944
  }
3945
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsPopover, deps: [{ token: i0.ElementRef }, { token: i1$2.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
3945
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsPopover, deps: [{ token: i0.ElementRef }, { token: i1$3.Overlay }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
3946
3946
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.15", type: DsPopover, isStandalone: true, selector: "[dsPopover]", inputs: { dsPopover: { classPropertyName: "dsPopover", publicName: "dsPopover", isSignal: true, isRequired: true, transformFunction: null }, dsPopoverTrigger: { classPropertyName: "dsPopoverTrigger", publicName: "dsPopoverTrigger", isSignal: true, isRequired: false, transformFunction: null }, dsPopoverCloseOnBackdrop: { classPropertyName: "dsPopoverCloseOnBackdrop", publicName: "dsPopoverCloseOnBackdrop", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick($event)", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "document:keydown.escape": "onEscape()" } }, ngImport: i0 });
3947
3947
  }
3948
3948
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsPopover, decorators: [{
@@ -3951,7 +3951,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
3951
3951
  selector: '[dsPopover]',
3952
3952
  standalone: true,
3953
3953
  }]
3954
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1$2.Overlay }, { type: i0.ViewContainerRef }], propDecorators: { dsPopover: [{ type: i0.Input, args: [{ isSignal: true, alias: "dsPopover", required: true }] }], dsPopoverTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "dsPopoverTrigger", required: false }] }], dsPopoverCloseOnBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "dsPopoverCloseOnBackdrop", required: false }] }], onClick: [{
3954
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1$3.Overlay }, { type: i0.ViewContainerRef }], propDecorators: { dsPopover: [{ type: i0.Input, args: [{ isSignal: true, alias: "dsPopover", required: true }] }], dsPopoverTrigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "dsPopoverTrigger", required: false }] }], dsPopoverCloseOnBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "dsPopoverCloseOnBackdrop", required: false }] }], onClick: [{
3955
3955
  type: HostListener,
3956
3956
  args: ['click', ['$event']]
3957
3957
  }], onMouseEnter: [{
@@ -4478,7 +4478,7 @@ class DsToastComponent {
4478
4478
  }
4479
4479
  }
4480
4480
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4481
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsToastComponent, isStandalone: true, selector: "ds-toast", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, actionLabel: { classPropertyName: "actionLabel", publicName: "actionLabel", isSignal: true, isRequired: false, transformFunction: null }, pauseOnHover: { classPropertyName: "pauseOnHover", publicName: "pauseOnHover", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", action: "action" }, ngImport: i0, template: "<div class=\"toast\" [ngClass]=\"[type(), position()]\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\n <fa-icon class=\"icon\" [icon]=\"currentIcon()\"></fa-icon>\n <span class=\"message\">{{ message() }}</span>\n\n @if (actionLabel()) {\n <button class=\"action-btn\" type=\"button\" (click)=\"handleAction()\">\n {{ actionLabel() }}\n </button>\n }\n\n @if (closable()) {\n <button class=\"close-btn\" (click)=\"close()\" aria-label=\"Close toast\">\n <fa-icon [icon]=\"faClose\" />\n </button>\n }\n</div>\n", styles: [".toast{display:flex;align-items:flex-start;gap:var(--toast-gap);padding:var(--toast-padding);border-radius:var(--toast-radius-base);color:var(--toast-text);border:var(--toast-border-width) solid var(--toast-border);box-shadow:var(--toast-shadow-depth);background:var(--toast-bg, var(--background-secondary));animation:fadeInUp .3s var(--easing-default);min-width:260px}.toast.success{background:var(--toast-success-bg);color:var(--toast-success-text);border-left:4px solid var(--toast-success-border)}.toast.warning{background:var(--toast-warning-bg);color:var(--toast-warning-text);border-left:4px solid var(--toast-warning-border)}.toast.error{background:var(--toast-error-bg);color:var(--toast-error-text);border-left:4px solid var(--toast-error-border)}.toast.info{background:var(--toast-info-bg);color:var(--toast-info-text);border-left:4px solid var(--toast-info-border)}.toast .icon{font-size:var(--toast-icon-size)}.toast .message{flex:1;font-size:var(--font-size-2);line-height:var(--line-height-normal);margin:0}.toast .action-btn{background:transparent;border:none;color:var(--color-primary);font-weight:var(--font-weight-semibold);cursor:pointer;padding:0;margin-left:var(--space-2);text-decoration:underline}.toast .action-btn:hover{opacity:.85}.toast .close-btn{background:none;border:none;cursor:pointer;font-size:var(--icon-size-sm);margin-left:auto;color:var(--text-muted);transition:color var(--duration-fast) var(--easing-default)}.toast .close-btn:hover{color:var(--text-default)}@keyframes fadeInUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
4481
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsToastComponent, isStandalone: true, selector: "ds-toast", inputs: { message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: true, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, actionLabel: { classPropertyName: "actionLabel", publicName: "actionLabel", isSignal: true, isRequired: false, transformFunction: null }, pauseOnHover: { classPropertyName: "pauseOnHover", publicName: "pauseOnHover", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", action: "action" }, ngImport: i0, template: "<div class=\"toast\" [ngClass]=\"[type(), position()]\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\n <fa-icon class=\"icon\" [icon]=\"currentIcon()\"></fa-icon>\n <span class=\"message\">{{ message() }}</span>\n\n @if (actionLabel()) {\n <button class=\"action-btn\" type=\"button\" (click)=\"handleAction()\">\n {{ actionLabel() }}\n </button>\n }\n\n @if (closable()) {\n <button class=\"close-btn\" (click)=\"close()\" aria-label=\"Close toast\">\n <fa-icon [icon]=\"faClose\" />\n </button>\n }\n</div>\n", styles: [".toast{display:flex;align-items:flex-start;gap:var(--toast-gap);padding:var(--toast-padding);border-radius:var(--toast-radius-base);color:var(--toast-text);border:var(--toast-border-width) solid var(--toast-border);box-shadow:var(--toast-shadow-depth);background:var(--toast-bg, var(--background-secondary));animation:fadeInUp .3s var(--easing-default);min-width:260px}.toast.success{background:var(--toast-success-bg);color:var(--toast-success-text);border-left:4px solid var(--toast-success-border)}.toast.warning{background:var(--toast-warning-bg);color:var(--toast-warning-text);border-left:4px solid var(--toast-warning-border)}.toast.error{background:var(--toast-error-bg);color:var(--toast-error-text);border-left:4px solid var(--toast-error-border)}.toast.info{background:var(--toast-info-bg);color:var(--toast-info-text);border-left:4px solid var(--toast-info-border)}.toast .icon{font-size:var(--toast-icon-size)}.toast .message{flex:1;font-size:var(--font-size-2);line-height:var(--line-height-normal);margin:0}.toast .action-btn{background:transparent;border:none;color:var(--color-primary);font-weight:var(--font-weight-semibold);cursor:pointer;padding:0;margin-left:var(--space-2);text-decoration:underline}.toast .action-btn:hover{opacity:.85}.toast .close-btn{background:none;border:none;cursor:pointer;font-size:var(--icon-size-sm);margin-left:auto;color:var(--text-muted);transition:color var(--duration-fast) var(--easing-default)}.toast .close-btn:hover{color:var(--text-default)}@keyframes fadeInUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: 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"] }] });
4482
4482
  }
4483
4483
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsToastComponent, decorators: [{
4484
4484
  type: Component,
@@ -4812,7 +4812,7 @@ class DsTooltip {
4812
4812
  this.clearHideTimeout();
4813
4813
  this.hide();
4814
4814
  }
4815
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTooltip, deps: [{ token: i0.ElementRef }, { token: i1$2.Overlay }, { token: i0.ViewContainerRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive });
4815
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTooltip, deps: [{ token: i0.ElementRef }, { token: i1$3.Overlay }, { token: i0.ViewContainerRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive });
4816
4816
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.15", type: DsTooltip, isStandalone: true, selector: "[dsTooltip]", inputs: { dsTooltip: { classPropertyName: "dsTooltip", publicName: "dsTooltip", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "focus": "onFocus()", "blur": "onBlur()" } }, ngImport: i0 });
4817
4817
  }
4818
4818
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsTooltip, decorators: [{
@@ -4821,7 +4821,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
4821
4821
  selector: '[dsTooltip]',
4822
4822
  standalone: true,
4823
4823
  }]
4824
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1$2.Overlay }, { type: i0.ViewContainerRef }, { type: i0.Injector }], propDecorators: { dsTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "dsTooltip", required: true }] }], onMouseEnter: [{
4824
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1$3.Overlay }, { type: i0.ViewContainerRef }, { type: i0.Injector }], propDecorators: { dsTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "dsTooltip", required: true }] }], onMouseEnter: [{
4825
4825
  type: HostListener,
4826
4826
  args: ['mouseenter']
4827
4827
  }], onMouseLeave: [{
@@ -5034,7 +5034,7 @@ class DsAccordion {
5034
5034
  return `accordion-content-${item.id}`;
5035
5035
  }
5036
5036
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsAccordion, deps: [], target: i0.ɵɵFactoryTarget.Component });
5037
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsAccordion, isStandalone: true, selector: "ds-accordion", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, expandedIds: { classPropertyName: "expandedIds", publicName: "expandedIds", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemChange: "itemChange" }, ngImport: i0, template: "<div [ngClass]=\"containerClasses()\">\n @for (item of items(); track item.id; let i = $index) {\n <div [ngClass]=\"getItemClasses(item)\">\n <!-- Header -->\n <button\n type=\"button\"\n class=\"ds-accordion__header\"\n [id]=\"getHeaderId(item)\"\n [attr.aria-expanded]=\"isExpanded(item.id)\"\n [attr.aria-controls]=\"getContentId(item)\"\n [disabled]=\"disabled() || item.disabled\"\n (click)=\"toggleItem(item)\"\n (keydown)=\"onKeydown($event, item, i)\">\n <span class=\"ds-accordion__title\">{{ item.header }}</span>\n <fa-icon\n class=\"ds-accordion__icon\"\n [icon]=\"faChevronDown\"\n [class.ds-accordion__icon--rotated]=\"isExpanded(item.id)\"\n aria-hidden=\"true\">\n </fa-icon>\n </button>\n\n <!-- Contenu -->\n <div\n class=\"ds-accordion__content\"\n [id]=\"getContentId(item)\"\n role=\"region\"\n [attr.aria-labelledby]=\"getHeaderId(item)\"\n [attr.aria-hidden]=\"!isExpanded(item.id)\"\n [class.ds-accordion__content--expanded]=\"isExpanded(item.id)\">\n <div class=\"ds-accordion__body\">\n {{ item.content }}\n </div>\n </div>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ds-accordion{font-family:var(--font-family-base)}.ds-accordion__item--disabled{opacity:.5;pointer-events:none}.ds-accordion__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--accordion-header-padding-md, var(--space-4));background-color:var(--accordion-header-bg, var(--background-main));border:none;cursor:pointer;text-align:left;font-family:inherit;font-size:var(--accordion-header-font-size-md, var(--font-size-3));font-weight:var(--font-weight-medium);color:var(--accordion-header-text, var(--text-default));transition:background-color var(--duration-fast) ease}.ds-accordion__header:hover:not(:disabled){background-color:var(--accordion-header-hover-bg, var(--surface-hover))}.ds-accordion__header:focus{outline:none;box-shadow:inset 0 0 0 2px var(--accordion-focus-color, var(--color-primary))}.ds-accordion__header:disabled{cursor:not-allowed}.ds-accordion__title{flex:1}.ds-accordion__icon{flex-shrink:0;transition:transform var(--duration-normal) ease;color:var(--accordion-icon-color, var(--text-muted))}.ds-accordion__icon--rotated{transform:rotate(180deg)}.ds-accordion__content{max-height:0;overflow:hidden;transition:max-height var(--duration-normal) ease-out}.ds-accordion__content--expanded{max-height:var(--accordion-content-max-height)}.ds-accordion__body{padding:var(--accordion-body-padding-md, var(--space-4));color:var(--accordion-body-text, var(--text-muted));font-size:var(--accordion-body-font-size-md, var(--font-size-2));line-height:var(--line-height-relaxed)}.ds-accordion--default .ds-accordion__item{border-bottom:var(--accordion-border-width) solid var(--accordion-border-color, var(--border-color))}.ds-accordion--default .ds-accordion__item:last-child{border-bottom:none}.ds-accordion--bordered{border:var(--accordion-border-width) solid var(--accordion-border-color, var(--border-color));border-radius:var(--accordion-radius, var(--radius-2));overflow:hidden}.ds-accordion--bordered .ds-accordion__item{border-bottom:var(--accordion-border-width) solid var(--accordion-border-color, var(--border-color))}.ds-accordion--bordered .ds-accordion__item:last-child{border-bottom:none}.ds-accordion--separated .ds-accordion__item{margin-bottom:var(--accordion-item-gap, var(--space-2));border:var(--accordion-border-width) solid var(--accordion-border-color, var(--border-color));border-radius:var(--accordion-radius, var(--radius-2));overflow:hidden}.ds-accordion--separated .ds-accordion__item:last-child{margin-bottom:0}.ds-accordion--separated .ds-accordion__item--expanded{border-color:var(--accordion-expanded-border-color, var(--color-primary))}.ds-accordion--sm .ds-accordion__header{padding:var(--accordion-header-padding-sm, var(--space-2) var(--space-3));font-size:var(--accordion-header-font-size-sm, var(--font-size-2))}.ds-accordion--sm .ds-accordion__body{padding:var(--accordion-body-padding-sm, var(--space-2) var(--space-3));font-size:var(--accordion-body-font-size-sm, var(--font-size-1))}.ds-accordion--lg .ds-accordion__header{padding:var(--accordion-header-padding-lg, var(--space-5) var(--space-6));font-size:var(--accordion-header-font-size-lg, var(--font-size-4))}.ds-accordion--lg .ds-accordion__body{padding:var(--accordion-body-padding-lg, var(--space-5) var(--space-6));font-size:var(--accordion-body-font-size-lg, var(--font-size-3))}.ds-accordion--disabled{opacity:.5;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
5037
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsAccordion, isStandalone: true, selector: "ds-accordion", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, expandedIds: { classPropertyName: "expandedIds", publicName: "expandedIds", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemChange: "itemChange" }, ngImport: i0, template: "<div [ngClass]=\"containerClasses()\">\n @for (item of items(); track item.id; let i = $index) {\n <div [ngClass]=\"getItemClasses(item)\">\n <!-- Header -->\n <button\n type=\"button\"\n class=\"ds-accordion__header\"\n [id]=\"getHeaderId(item)\"\n [attr.aria-expanded]=\"isExpanded(item.id)\"\n [attr.aria-controls]=\"getContentId(item)\"\n [disabled]=\"disabled() || item.disabled\"\n (click)=\"toggleItem(item)\"\n (keydown)=\"onKeydown($event, item, i)\">\n <span class=\"ds-accordion__title\">{{ item.header }}</span>\n <fa-icon\n class=\"ds-accordion__icon\"\n [icon]=\"faChevronDown\"\n [class.ds-accordion__icon--rotated]=\"isExpanded(item.id)\"\n aria-hidden=\"true\">\n </fa-icon>\n </button>\n\n <!-- Contenu -->\n <div\n class=\"ds-accordion__content\"\n [id]=\"getContentId(item)\"\n role=\"region\"\n [attr.aria-labelledby]=\"getHeaderId(item)\"\n [attr.aria-hidden]=\"!isExpanded(item.id)\"\n [class.ds-accordion__content--expanded]=\"isExpanded(item.id)\">\n <div class=\"ds-accordion__body\">\n {{ item.content }}\n </div>\n </div>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ds-accordion{font-family:var(--font-family-base)}.ds-accordion__item--disabled{opacity:.5;pointer-events:none}.ds-accordion__header{display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--accordion-header-padding-md, var(--space-4));background-color:var(--accordion-header-bg, var(--background-main));border:none;cursor:pointer;text-align:left;font-family:inherit;font-size:var(--accordion-header-font-size-md, var(--font-size-3));font-weight:var(--font-weight-medium);color:var(--accordion-header-text, var(--text-default));transition:background-color var(--duration-fast) ease}.ds-accordion__header:hover:not(:disabled){background-color:var(--accordion-header-hover-bg, var(--surface-hover))}.ds-accordion__header:focus{outline:none;box-shadow:inset 0 0 0 2px var(--accordion-focus-color, var(--color-primary))}.ds-accordion__header:disabled{cursor:not-allowed}.ds-accordion__title{flex:1}.ds-accordion__icon{flex-shrink:0;transition:transform var(--duration-normal) ease;color:var(--accordion-icon-color, var(--text-muted))}.ds-accordion__icon--rotated{transform:rotate(180deg)}.ds-accordion__content{max-height:0;overflow:hidden;transition:max-height var(--duration-normal) ease-out}.ds-accordion__content--expanded{max-height:var(--accordion-content-max-height)}.ds-accordion__body{padding:var(--accordion-body-padding-md, var(--space-4));color:var(--accordion-body-text, var(--text-muted));font-size:var(--accordion-body-font-size-md, var(--font-size-2));line-height:var(--line-height-relaxed)}.ds-accordion--default .ds-accordion__item{border-bottom:var(--accordion-border-width) solid var(--accordion-border-color, var(--border-color))}.ds-accordion--default .ds-accordion__item:last-child{border-bottom:none}.ds-accordion--bordered{border:var(--accordion-border-width) solid var(--accordion-border-color, var(--border-color));border-radius:var(--accordion-radius, var(--radius-2));overflow:hidden}.ds-accordion--bordered .ds-accordion__item{border-bottom:var(--accordion-border-width) solid var(--accordion-border-color, var(--border-color))}.ds-accordion--bordered .ds-accordion__item:last-child{border-bottom:none}.ds-accordion--separated .ds-accordion__item{margin-bottom:var(--accordion-item-gap, var(--space-2));border:var(--accordion-border-width) solid var(--accordion-border-color, var(--border-color));border-radius:var(--accordion-radius, var(--radius-2));overflow:hidden}.ds-accordion--separated .ds-accordion__item:last-child{margin-bottom:0}.ds-accordion--separated .ds-accordion__item--expanded{border-color:var(--accordion-expanded-border-color, var(--color-primary))}.ds-accordion--sm .ds-accordion__header{padding:var(--accordion-header-padding-sm, var(--space-2) var(--space-3));font-size:var(--accordion-header-font-size-sm, var(--font-size-2))}.ds-accordion--sm .ds-accordion__body{padding:var(--accordion-body-padding-sm, var(--space-2) var(--space-3));font-size:var(--accordion-body-font-size-sm, var(--font-size-1))}.ds-accordion--lg .ds-accordion__header{padding:var(--accordion-header-padding-lg, var(--space-5) var(--space-6));font-size:var(--accordion-header-font-size-lg, var(--font-size-4))}.ds-accordion--lg .ds-accordion__body{padding:var(--accordion-body-padding-lg, var(--space-5) var(--space-6));font-size:var(--accordion-body-font-size-lg, var(--font-size-3))}.ds-accordion--disabled{opacity:.5;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }] });
5038
5038
  }
5039
5039
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsAccordion, decorators: [{
5040
5040
  type: Component,
@@ -5300,7 +5300,7 @@ class DsPagination {
5300
5300
  }
5301
5301
  }
5302
5302
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsPagination, deps: [], target: i0.ɵɵFactoryTarget.Component });
5303
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsPagination, isStandalone: true, selector: "ds-pagination", inputs: { totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: true, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showFirstLast: { classPropertyName: "showFirstLast", publicName: "showFirstLast", isSignal: true, isRequired: false, transformFunction: null }, showPageSizeSelector: { classPropertyName: "showPageSizeSelector", publicName: "showPageSizeSelector", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, maxVisiblePages: { classPropertyName: "maxVisiblePages", publicName: "maxVisiblePages", isSignal: true, isRequired: false, transformFunction: null }, showInfo: { classPropertyName: "showInfo", publicName: "showInfo", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, ngImport: i0, template: "<nav\n [ngClass]=\"containerClasses()\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"navigation\">\n\n <!-- Info: X - Y sur Z -->\n @if (showInfo()) {\n <span class=\"ds-pagination__info\">\n {{ startItem() }} - {{ endItem() }} sur {{ totalItems() }}\n </span>\n }\n\n <!-- S\u00E9lecteur de taille de page -->\n @if (showPageSizeSelector()) {\n <div class=\"ds-pagination__size-selector\">\n <label class=\"ds-pagination__size-label\" for=\"page-size\">\n Par page:\n </label>\n <select\n id=\"page-size\"\n class=\"ds-pagination__size-select\"\n [value]=\"pageSize()\"\n [disabled]=\"disabled()\"\n (change)=\"onPageSizeChange($event)\">\n @for (option of pageSizeOptions(); track option) {\n <option [value]=\"option\">{{ option }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Navigation -->\n <div class=\"ds-pagination__nav\">\n <!-- Premi\u00E8re page -->\n @if (showFirstLast()) {\n <button\n type=\"button\"\n class=\"ds-pagination__btn ds-pagination__btn--first\"\n [disabled]=\"!canGoPrevious()\"\n [attr.aria-label]=\"'Aller \u00E0 la premi\u00E8re page'\"\n (click)=\"goToFirst()\">\n <fa-icon [icon]=\"faAnglesLeft\" aria-hidden=\"true\"></fa-icon>\n </button>\n }\n\n <!-- Page pr\u00E9c\u00E9dente -->\n <button\n type=\"button\"\n class=\"ds-pagination__btn ds-pagination__btn--prev\"\n [disabled]=\"!canGoPrevious()\"\n [attr.aria-label]=\"'Aller \u00E0 la page pr\u00E9c\u00E9dente'\"\n (click)=\"goToPrevious()\">\n <fa-icon [icon]=\"faChevronLeft\" aria-hidden=\"true\"></fa-icon>\n </button>\n\n <!-- Ellipsis d\u00E9but -->\n @if (showStartEllipsis()) {\n <span class=\"ds-pagination__ellipsis\" aria-hidden=\"true\">...</span>\n }\n\n <!-- Pages -->\n @for (page of visiblePages(); track page) {\n <button\n type=\"button\"\n class=\"ds-pagination__btn ds-pagination__btn--page\"\n [class.ds-pagination__btn--active]=\"page === normalizedCurrentPage()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'Page ' + page\"\n [attr.aria-current]=\"page === normalizedCurrentPage() ? 'page' : null\"\n (click)=\"goToPage(page)\"\n (keydown)=\"onPageKeydown($event, page)\">\n {{ page }}\n </button>\n }\n\n <!-- Ellipsis fin -->\n @if (showEndEllipsis()) {\n <span class=\"ds-pagination__ellipsis\" aria-hidden=\"true\">...</span>\n }\n\n <!-- Page suivante -->\n <button\n type=\"button\"\n class=\"ds-pagination__btn ds-pagination__btn--next\"\n [disabled]=\"!canGoNext()\"\n [attr.aria-label]=\"'Aller \u00E0 la page suivante'\"\n (click)=\"goToNext()\">\n <fa-icon [icon]=\"faChevronRight\" aria-hidden=\"true\"></fa-icon>\n </button>\n\n <!-- Derni\u00E8re page -->\n @if (showFirstLast()) {\n <button\n type=\"button\"\n class=\"ds-pagination__btn ds-pagination__btn--last\"\n [disabled]=\"!canGoNext()\"\n [attr.aria-label]=\"'Aller \u00E0 la derni\u00E8re page'\"\n (click)=\"goToLast()\">\n <fa-icon [icon]=\"faAnglesRight\" aria-hidden=\"true\"></fa-icon>\n </button>\n }\n </div>\n</nav>\n", styles: ["@charset \"UTF-8\";.ds-pagination{display:flex;align-items:center;gap:var(--pagination-gap-md, var(--space-4));font-family:var(--font-family-base)}.ds-pagination__info{color:var(--pagination-info-color, var(--text-muted));font-size:var(--pagination-font-size-md, var(--font-size-2));white-space:nowrap}.ds-pagination__size-selector{display:flex;align-items:center;gap:var(--space-2)}.ds-pagination__size-label{color:var(--pagination-info-color, var(--text-muted));font-size:var(--pagination-font-size-md, var(--font-size-2));white-space:nowrap}.ds-pagination__size-select{padding:var(--pagination-btn-padding-md, var(--space-1)) var(--space-2);border:1px solid var(--pagination-btn-border, var(--border-color));border-radius:var(--pagination-btn-radius, var(--radius-2));background-color:var(--pagination-btn-bg, var(--background-main));color:var(--pagination-btn-text, var(--text-default));font-size:var(--pagination-font-size-md, var(--font-size-2));cursor:pointer;transition:border-color var(--duration-fast) ease,box-shadow var(--duration-fast) ease}.ds-pagination__size-select:hover:not(:disabled){border-color:var(--pagination-btn-hover-border, var(--color-primary))}.ds-pagination__size-select:focus{outline:none;border-color:var(--pagination-btn-focus-border, var(--color-primary));box-shadow:var(--input-focus-shadow)}.ds-pagination__size-select:disabled{opacity:.5;cursor:not-allowed}.ds-pagination__nav{display:flex;align-items:center;gap:var(--pagination-gap-sm, var(--space-1))}.ds-pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:var(--pagination-btn-size-md);height:var(--pagination-btn-size-md);padding:var(--pagination-btn-padding-md, var(--space-1)) var(--space-2);border:1px solid var(--pagination-btn-border, var(--border-color));border-radius:var(--pagination-btn-radius, var(--radius-2));background-color:var(--pagination-btn-bg, var(--background-main));color:var(--pagination-btn-text, var(--text-default));font-size:var(--pagination-font-size-md, var(--font-size-2));font-weight:var(--font-weight-medium);cursor:pointer;transition:all var(--duration-fast) ease}.ds-pagination__btn:hover:not(:disabled):not(.ds-pagination__btn--active){background-color:var(--pagination-btn-hover-bg, var(--surface-hover));border-color:var(--pagination-btn-hover-border, var(--color-primary))}.ds-pagination__btn:focus{outline:none;border-color:var(--pagination-btn-focus-border, var(--color-primary));box-shadow:var(--input-focus-shadow)}.ds-pagination__btn:disabled{opacity:.5;cursor:not-allowed}.ds-pagination__btn--active{background-color:var(--pagination-active-bg, var(--color-primary));border-color:var(--pagination-active-bg, var(--color-primary));color:var(--pagination-active-text, var(--gray-50))}.ds-pagination__btn--active:hover{background-color:var(--pagination-active-hover-bg, var(--btn-primary-hover-bg))}.ds-pagination__btn--first,.ds-pagination__btn--last,.ds-pagination__btn--prev,.ds-pagination__btn--next{min-width:var(--pagination-btn-size-md);padding:var(--pagination-btn-padding-md, var(--space-1))}.ds-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;min-width:var(--pagination-btn-size-md);height:var(--pagination-btn-size-md);color:var(--pagination-info-color, var(--text-muted));font-size:var(--pagination-font-size-md, var(--font-size-2))}.ds-pagination--sm{gap:var(--pagination-gap-sm, var(--space-2))}.ds-pagination--sm .ds-pagination__info,.ds-pagination--sm .ds-pagination__size-label{font-size:var(--pagination-font-size-sm, var(--font-size-1))}.ds-pagination--sm .ds-pagination__btn{min-width:var(--pagination-btn-size-sm);height:var(--pagination-btn-size-sm);font-size:var(--pagination-font-size-sm, var(--font-size-1));padding:var(--pagination-btn-padding-sm, var(--space-1))}.ds-pagination--sm .ds-pagination__ellipsis{min-width:var(--pagination-btn-size-sm);height:var(--pagination-btn-size-sm);font-size:var(--pagination-font-size-sm, var(--font-size-1))}.ds-pagination--sm .ds-pagination__size-select{font-size:var(--pagination-font-size-sm, var(--font-size-1));padding:var(--pagination-btn-padding-sm, var(--space-1))}.ds-pagination--lg{gap:var(--pagination-gap-lg, var(--space-6))}.ds-pagination--lg .ds-pagination__info,.ds-pagination--lg .ds-pagination__size-label{font-size:var(--pagination-font-size-lg, var(--font-size-3))}.ds-pagination--lg .ds-pagination__btn{min-width:var(--pagination-btn-size-lg);height:var(--pagination-btn-size-lg);font-size:var(--pagination-font-size-lg, var(--font-size-3));padding:var(--pagination-btn-padding-lg, var(--space-2)) var(--space-3)}.ds-pagination--lg .ds-pagination__ellipsis{min-width:var(--pagination-btn-size-lg);height:var(--pagination-btn-size-lg);font-size:var(--pagination-font-size-lg, var(--font-size-3))}.ds-pagination--lg .ds-pagination__size-select{font-size:var(--pagination-font-size-lg, var(--font-size-3));padding:var(--pagination-btn-padding-lg, var(--space-2)) var(--space-3)}.ds-pagination--disabled{opacity:.5;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
5303
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsPagination, isStandalone: true, selector: "ds-pagination", inputs: { totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: true, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, currentPage: { classPropertyName: "currentPage", publicName: "currentPage", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showFirstLast: { classPropertyName: "showFirstLast", publicName: "showFirstLast", isSignal: true, isRequired: false, transformFunction: null }, showPageSizeSelector: { classPropertyName: "showPageSizeSelector", publicName: "showPageSizeSelector", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, maxVisiblePages: { classPropertyName: "maxVisiblePages", publicName: "maxVisiblePages", isSignal: true, isRequired: false, transformFunction: null }, showInfo: { classPropertyName: "showInfo", publicName: "showInfo", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, ngImport: i0, template: "<nav\n [ngClass]=\"containerClasses()\"\n [attr.aria-label]=\"ariaLabel()\"\n role=\"navigation\">\n\n <!-- Info: X - Y sur Z -->\n @if (showInfo()) {\n <span class=\"ds-pagination__info\">\n {{ startItem() }} - {{ endItem() }} sur {{ totalItems() }}\n </span>\n }\n\n <!-- S\u00E9lecteur de taille de page -->\n @if (showPageSizeSelector()) {\n <div class=\"ds-pagination__size-selector\">\n <label class=\"ds-pagination__size-label\" for=\"page-size\">\n Par page:\n </label>\n <select\n id=\"page-size\"\n class=\"ds-pagination__size-select\"\n [value]=\"pageSize()\"\n [disabled]=\"disabled()\"\n (change)=\"onPageSizeChange($event)\">\n @for (option of pageSizeOptions(); track option) {\n <option [value]=\"option\">{{ option }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Navigation -->\n <div class=\"ds-pagination__nav\">\n <!-- Premi\u00E8re page -->\n @if (showFirstLast()) {\n <button\n type=\"button\"\n class=\"ds-pagination__btn ds-pagination__btn--first\"\n [disabled]=\"!canGoPrevious()\"\n [attr.aria-label]=\"'Aller \u00E0 la premi\u00E8re page'\"\n (click)=\"goToFirst()\">\n <fa-icon [icon]=\"faAnglesLeft\" aria-hidden=\"true\"></fa-icon>\n </button>\n }\n\n <!-- Page pr\u00E9c\u00E9dente -->\n <button\n type=\"button\"\n class=\"ds-pagination__btn ds-pagination__btn--prev\"\n [disabled]=\"!canGoPrevious()\"\n [attr.aria-label]=\"'Aller \u00E0 la page pr\u00E9c\u00E9dente'\"\n (click)=\"goToPrevious()\">\n <fa-icon [icon]=\"faChevronLeft\" aria-hidden=\"true\"></fa-icon>\n </button>\n\n <!-- Ellipsis d\u00E9but -->\n @if (showStartEllipsis()) {\n <span class=\"ds-pagination__ellipsis\" aria-hidden=\"true\">...</span>\n }\n\n <!-- Pages -->\n @for (page of visiblePages(); track page) {\n <button\n type=\"button\"\n class=\"ds-pagination__btn ds-pagination__btn--page\"\n [class.ds-pagination__btn--active]=\"page === normalizedCurrentPage()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'Page ' + page\"\n [attr.aria-current]=\"page === normalizedCurrentPage() ? 'page' : null\"\n (click)=\"goToPage(page)\"\n (keydown)=\"onPageKeydown($event, page)\">\n {{ page }}\n </button>\n }\n\n <!-- Ellipsis fin -->\n @if (showEndEllipsis()) {\n <span class=\"ds-pagination__ellipsis\" aria-hidden=\"true\">...</span>\n }\n\n <!-- Page suivante -->\n <button\n type=\"button\"\n class=\"ds-pagination__btn ds-pagination__btn--next\"\n [disabled]=\"!canGoNext()\"\n [attr.aria-label]=\"'Aller \u00E0 la page suivante'\"\n (click)=\"goToNext()\">\n <fa-icon [icon]=\"faChevronRight\" aria-hidden=\"true\"></fa-icon>\n </button>\n\n <!-- Derni\u00E8re page -->\n @if (showFirstLast()) {\n <button\n type=\"button\"\n class=\"ds-pagination__btn ds-pagination__btn--last\"\n [disabled]=\"!canGoNext()\"\n [attr.aria-label]=\"'Aller \u00E0 la derni\u00E8re page'\"\n (click)=\"goToLast()\">\n <fa-icon [icon]=\"faAnglesRight\" aria-hidden=\"true\"></fa-icon>\n </button>\n }\n </div>\n</nav>\n", styles: ["@charset \"UTF-8\";.ds-pagination{display:flex;align-items:center;gap:var(--pagination-gap-md, var(--space-4));font-family:var(--font-family-base)}.ds-pagination__info{color:var(--pagination-info-color, var(--text-muted));font-size:var(--pagination-font-size-md, var(--font-size-2));white-space:nowrap}.ds-pagination__size-selector{display:flex;align-items:center;gap:var(--space-2)}.ds-pagination__size-label{color:var(--pagination-info-color, var(--text-muted));font-size:var(--pagination-font-size-md, var(--font-size-2));white-space:nowrap}.ds-pagination__size-select{padding:var(--pagination-btn-padding-md, var(--space-1)) var(--space-2);border:1px solid var(--pagination-btn-border, var(--border-color));border-radius:var(--pagination-btn-radius, var(--radius-2));background-color:var(--pagination-btn-bg, var(--background-main));color:var(--pagination-btn-text, var(--text-default));font-size:var(--pagination-font-size-md, var(--font-size-2));cursor:pointer;transition:border-color var(--duration-fast) ease,box-shadow var(--duration-fast) ease}.ds-pagination__size-select:hover:not(:disabled){border-color:var(--pagination-btn-hover-border, var(--color-primary))}.ds-pagination__size-select:focus{outline:none;border-color:var(--pagination-btn-focus-border, var(--color-primary));box-shadow:var(--input-focus-shadow)}.ds-pagination__size-select:disabled{opacity:.5;cursor:not-allowed}.ds-pagination__nav{display:flex;align-items:center;gap:var(--pagination-gap-sm, var(--space-1))}.ds-pagination__btn{display:inline-flex;align-items:center;justify-content:center;min-width:var(--pagination-btn-size-md);height:var(--pagination-btn-size-md);padding:var(--pagination-btn-padding-md, var(--space-1)) var(--space-2);border:1px solid var(--pagination-btn-border, var(--border-color));border-radius:var(--pagination-btn-radius, var(--radius-2));background-color:var(--pagination-btn-bg, var(--background-main));color:var(--pagination-btn-text, var(--text-default));font-size:var(--pagination-font-size-md, var(--font-size-2));font-weight:var(--font-weight-medium);cursor:pointer;transition:all var(--duration-fast) ease}.ds-pagination__btn:hover:not(:disabled):not(.ds-pagination__btn--active){background-color:var(--pagination-btn-hover-bg, var(--surface-hover));border-color:var(--pagination-btn-hover-border, var(--color-primary))}.ds-pagination__btn:focus{outline:none;border-color:var(--pagination-btn-focus-border, var(--color-primary));box-shadow:var(--input-focus-shadow)}.ds-pagination__btn:disabled{opacity:.5;cursor:not-allowed}.ds-pagination__btn--active{background-color:var(--pagination-active-bg, var(--color-primary));border-color:var(--pagination-active-bg, var(--color-primary));color:var(--pagination-active-text, var(--gray-50))}.ds-pagination__btn--active:hover{background-color:var(--pagination-active-hover-bg, var(--btn-primary-hover-bg))}.ds-pagination__btn--first,.ds-pagination__btn--last,.ds-pagination__btn--prev,.ds-pagination__btn--next{min-width:var(--pagination-btn-size-md);padding:var(--pagination-btn-padding-md, var(--space-1))}.ds-pagination__ellipsis{display:inline-flex;align-items:center;justify-content:center;min-width:var(--pagination-btn-size-md);height:var(--pagination-btn-size-md);color:var(--pagination-info-color, var(--text-muted));font-size:var(--pagination-font-size-md, var(--font-size-2))}.ds-pagination--sm{gap:var(--pagination-gap-sm, var(--space-2))}.ds-pagination--sm .ds-pagination__info,.ds-pagination--sm .ds-pagination__size-label{font-size:var(--pagination-font-size-sm, var(--font-size-1))}.ds-pagination--sm .ds-pagination__btn{min-width:var(--pagination-btn-size-sm);height:var(--pagination-btn-size-sm);font-size:var(--pagination-font-size-sm, var(--font-size-1));padding:var(--pagination-btn-padding-sm, var(--space-1))}.ds-pagination--sm .ds-pagination__ellipsis{min-width:var(--pagination-btn-size-sm);height:var(--pagination-btn-size-sm);font-size:var(--pagination-font-size-sm, var(--font-size-1))}.ds-pagination--sm .ds-pagination__size-select{font-size:var(--pagination-font-size-sm, var(--font-size-1));padding:var(--pagination-btn-padding-sm, var(--space-1))}.ds-pagination--lg{gap:var(--pagination-gap-lg, var(--space-6))}.ds-pagination--lg .ds-pagination__info,.ds-pagination--lg .ds-pagination__size-label{font-size:var(--pagination-font-size-lg, var(--font-size-3))}.ds-pagination--lg .ds-pagination__btn{min-width:var(--pagination-btn-size-lg);height:var(--pagination-btn-size-lg);font-size:var(--pagination-font-size-lg, var(--font-size-3));padding:var(--pagination-btn-padding-lg, var(--space-2)) var(--space-3)}.ds-pagination--lg .ds-pagination__ellipsis{min-width:var(--pagination-btn-size-lg);height:var(--pagination-btn-size-lg);font-size:var(--pagination-font-size-lg, var(--font-size-3))}.ds-pagination--lg .ds-pagination__size-select{font-size:var(--pagination-font-size-lg, var(--font-size-3));padding:var(--pagination-btn-padding-lg, var(--space-2)) var(--space-3)}.ds-pagination--disabled{opacity:.5;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }] });
5304
5304
  }
5305
5305
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsPagination, decorators: [{
5306
5306
  type: Component,
@@ -5537,7 +5537,7 @@ class DsStepper {
5537
5537
  return `Étape ${index + 1}: ${step.label} - ${stateLabels[state]}`;
5538
5538
  }
5539
5539
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsStepper, deps: [], target: i0.ɵɵFactoryTarget.Component });
5540
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsStepper, isStandalone: true, selector: "ds-stepper", inputs: { steps: { classPropertyName: "steps", publicName: "steps", isSignal: true, isRequired: true, transformFunction: null }, activeStep: { classPropertyName: "activeStep", publicName: "activeStep", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, linear: { classPropertyName: "linear", publicName: "linear", isSignal: true, isRequired: false, transformFunction: null }, showDescriptions: { classPropertyName: "showDescriptions", publicName: "showDescriptions", isSignal: true, isRequired: false, transformFunction: null }, showConnector: { classPropertyName: "showConnector", publicName: "showConnector", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { stepChange: "stepChange" }, ngImport: i0, template: "<div\n [ngClass]=\"containerClasses()\"\n role=\"tablist\"\n [attr.aria-orientation]=\"orientation()\">\n\n @for (step of steps(); track step.label; let i = $index; let last = $last) {\n <!-- \u00C9tape -->\n <div\n [ngClass]=\"getStepClasses(step, i)\"\n role=\"tab\"\n [attr.aria-selected]=\"i === normalizedActiveStep()\"\n [attr.aria-label]=\"getStepAriaLabel(step, i)\"\n [attr.tabindex]=\"i === normalizedActiveStep() ? 0 : -1\"\n (click)=\"goToStep(i)\"\n (keydown)=\"onKeydown($event, i)\">\n\n <!-- Indicateur -->\n <div class=\"ds-stepper__indicator\">\n @switch (getStepState(step, i)) {\n @case ('completed') {\n <fa-icon [icon]=\"faCheck\" aria-hidden=\"true\"></fa-icon>\n }\n @case ('error') {\n <fa-icon [icon]=\"faExclamationTriangle\" aria-hidden=\"true\"></fa-icon>\n }\n @default {\n <span class=\"ds-stepper__number\">{{ i + 1 }}</span>\n }\n }\n </div>\n\n <!-- Contenu -->\n <div class=\"ds-stepper__content\">\n <span class=\"ds-stepper__label\">\n {{ step.label }}\n @if (step.optional) {\n <span class=\"ds-stepper__optional\">(Optionnel)</span>\n }\n </span>\n @if (showDescriptions() && step.description) {\n <span class=\"ds-stepper__description\">{{ step.description }}</span>\n }\n </div>\n </div>\n\n <!-- Connecteur -->\n @if (showConnector() && !last) {\n <div\n class=\"ds-stepper__connector\"\n [class.ds-stepper__connector--completed]=\"i < normalizedActiveStep()\"\n aria-hidden=\"true\">\n </div>\n }\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ds-stepper{display:flex;font-family:var(--font-family-base)}.ds-stepper--horizontal{flex-direction:row;align-items:flex-start}.ds-stepper--horizontal .ds-stepper__step{flex-direction:column;align-items:center;text-align:center}.ds-stepper--horizontal .ds-stepper__connector{flex:1;height:var(--stepper-connector-width);min-width:var(--stepper-connector-min-length);margin-top:calc(var(--stepper-indicator-size-md) / 2);background-color:var(--stepper-connector-color, var(--border-color))}.ds-stepper--horizontal .ds-stepper__connector--completed{background-color:var(--stepper-completed-bg, var(--success))}.ds-stepper--horizontal .ds-stepper__content{margin-top:var(--stepper-gap-horizontal, var(--space-2))}.ds-stepper--vertical{flex-direction:column}.ds-stepper--vertical .ds-stepper__step{flex-direction:row;align-items:flex-start}.ds-stepper--vertical .ds-stepper__connector{width:var(--stepper-connector-width);min-height:var(--stepper-connector-min-length);margin-left:calc(var(--stepper-indicator-size-md) / 2);margin-top:var(--space-1);margin-bottom:var(--space-1);background-color:var(--stepper-connector-color, var(--border-color))}.ds-stepper--vertical .ds-stepper__connector--completed{background-color:var(--stepper-completed-bg, var(--success))}.ds-stepper--vertical .ds-stepper__content{margin-left:var(--stepper-gap-vertical, var(--space-3))}.ds-stepper--clickable .ds-stepper__step:not(.ds-stepper__step--disabled){cursor:pointer}.ds-stepper--clickable .ds-stepper__step:not(.ds-stepper__step--disabled):hover .ds-stepper__indicator{transform:scale(1.1)}.ds-stepper__step{display:flex;outline:none;transition:opacity var(--duration-fast) ease}.ds-stepper__step:focus-visible .ds-stepper__indicator{box-shadow:var(--input-focus-shadow)}.ds-stepper__step--pending .ds-stepper__indicator{background-color:var(--stepper-pending-bg, var(--background-secondary));color:var(--stepper-pending-text, var(--text-muted));border-color:var(--stepper-pending-border, var(--border-color))}.ds-stepper__step--pending .ds-stepper__label{color:var(--stepper-pending-text, var(--text-muted))}.ds-stepper__step--active .ds-stepper__indicator{background-color:var(--stepper-active-bg, var(--color-primary));color:var(--stepper-active-text, var(--gray-50));border-color:var(--stepper-active-bg, var(--color-primary))}.ds-stepper__step--active .ds-stepper__label{color:var(--text-default);font-weight:var(--font-weight-semibold)}.ds-stepper__step--completed .ds-stepper__indicator{background-color:var(--stepper-completed-bg, var(--success));color:var(--stepper-completed-text, var(--gray-50));border-color:var(--stepper-completed-bg, var(--success))}.ds-stepper__step--completed .ds-stepper__label{color:var(--text-default)}.ds-stepper__step--error .ds-stepper__indicator{background-color:var(--stepper-error-bg, var(--error));color:var(--stepper-error-text, var(--gray-50));border-color:var(--stepper-error-bg, var(--error))}.ds-stepper__step--error .ds-stepper__label{color:var(--stepper-error-bg, var(--error))}.ds-stepper__step--disabled{opacity:.5;cursor:not-allowed}.ds-stepper__indicator{display:flex;align-items:center;justify-content:center;width:var(--stepper-indicator-size-md);height:var(--stepper-indicator-size-md);border-radius:50%;border:var(--stepper-indicator-border-width) solid;font-weight:var(--font-weight-semibold);font-size:var(--stepper-indicator-font-size-md, var(--font-size-2));flex-shrink:0;transition:transform var(--duration-fast) ease,background-color var(--duration-fast) ease,border-color var(--duration-fast) ease}.ds-stepper__number{line-height:1}.ds-stepper__content{display:flex;flex-direction:column}.ds-stepper__label{font-size:var(--stepper-label-font-size-md, var(--font-size-2));font-weight:var(--font-weight-medium);color:var(--text-default);transition:color var(--duration-fast) ease}.ds-stepper__optional{font-size:var(--stepper-description-font-size-md, var(--font-size-1));font-weight:var(--font-weight-normal);color:var(--text-subtle);margin-left:var(--space-1)}.ds-stepper__description{font-size:var(--stepper-description-font-size-md, var(--font-size-1));color:var(--text-muted);margin-top:var(--space-1)}.ds-stepper__connector{transition:background-color var(--duration-normal) ease}.ds-stepper--sm .ds-stepper__indicator{width:var(--stepper-indicator-size-sm);height:var(--stepper-indicator-size-sm);font-size:var(--stepper-indicator-font-size-sm, var(--font-size-1))}.ds-stepper--sm .ds-stepper__label{font-size:var(--stepper-label-font-size-sm, var(--font-size-1))}.ds-stepper--sm .ds-stepper__description{font-size:var(--stepper-description-font-size-sm, var(--font-size-small))}.ds-stepper--sm.ds-stepper--horizontal .ds-stepper__connector{margin-top:calc(var(--stepper-indicator-size-sm) / 2)}.ds-stepper--sm.ds-stepper--vertical .ds-stepper__connector{margin-left:calc(var(--stepper-indicator-size-sm) / 2)}.ds-stepper--lg .ds-stepper__indicator{width:var(--stepper-indicator-size-lg);height:var(--stepper-indicator-size-lg);font-size:var(--stepper-indicator-font-size-lg, var(--font-size-3))}.ds-stepper--lg .ds-stepper__label{font-size:var(--stepper-label-font-size-lg, var(--font-size-3))}.ds-stepper--lg .ds-stepper__description{font-size:var(--stepper-description-font-size-lg, var(--font-size-2))}.ds-stepper--lg.ds-stepper--horizontal .ds-stepper__connector{margin-top:calc(var(--stepper-indicator-size-lg) / 2)}.ds-stepper--lg.ds-stepper--vertical .ds-stepper__connector{margin-left:calc(var(--stepper-indicator-size-lg) / 2)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
5540
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsStepper, isStandalone: true, selector: "ds-stepper", inputs: { steps: { classPropertyName: "steps", publicName: "steps", isSignal: true, isRequired: true, transformFunction: null }, activeStep: { classPropertyName: "activeStep", publicName: "activeStep", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, linear: { classPropertyName: "linear", publicName: "linear", isSignal: true, isRequired: false, transformFunction: null }, showDescriptions: { classPropertyName: "showDescriptions", publicName: "showDescriptions", isSignal: true, isRequired: false, transformFunction: null }, showConnector: { classPropertyName: "showConnector", publicName: "showConnector", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { stepChange: "stepChange" }, ngImport: i0, template: "<div\n [ngClass]=\"containerClasses()\"\n role=\"tablist\"\n [attr.aria-orientation]=\"orientation()\">\n\n @for (step of steps(); track step.label; let i = $index; let last = $last) {\n <!-- \u00C9tape -->\n <div\n [ngClass]=\"getStepClasses(step, i)\"\n role=\"tab\"\n [attr.aria-selected]=\"i === normalizedActiveStep()\"\n [attr.aria-label]=\"getStepAriaLabel(step, i)\"\n [attr.tabindex]=\"i === normalizedActiveStep() ? 0 : -1\"\n (click)=\"goToStep(i)\"\n (keydown)=\"onKeydown($event, i)\">\n\n <!-- Indicateur -->\n <div class=\"ds-stepper__indicator\">\n @switch (getStepState(step, i)) {\n @case ('completed') {\n <fa-icon [icon]=\"faCheck\" aria-hidden=\"true\"></fa-icon>\n }\n @case ('error') {\n <fa-icon [icon]=\"faExclamationTriangle\" aria-hidden=\"true\"></fa-icon>\n }\n @default {\n <span class=\"ds-stepper__number\">{{ i + 1 }}</span>\n }\n }\n </div>\n\n <!-- Contenu -->\n <div class=\"ds-stepper__content\">\n <span class=\"ds-stepper__label\">\n {{ step.label }}\n @if (step.optional) {\n <span class=\"ds-stepper__optional\">(Optionnel)</span>\n }\n </span>\n @if (showDescriptions() && step.description) {\n <span class=\"ds-stepper__description\">{{ step.description }}</span>\n }\n </div>\n </div>\n\n <!-- Connecteur -->\n @if (showConnector() && !last) {\n <div\n class=\"ds-stepper__connector\"\n [class.ds-stepper__connector--completed]=\"i < normalizedActiveStep()\"\n aria-hidden=\"true\">\n </div>\n }\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ds-stepper{display:flex;font-family:var(--font-family-base)}.ds-stepper--horizontal{flex-direction:row;align-items:flex-start}.ds-stepper--horizontal .ds-stepper__step{flex-direction:column;align-items:center;text-align:center}.ds-stepper--horizontal .ds-stepper__connector{flex:1;height:var(--stepper-connector-width);min-width:var(--stepper-connector-min-length);margin-top:calc(var(--stepper-indicator-size-md) / 2);background-color:var(--stepper-connector-color, var(--border-color))}.ds-stepper--horizontal .ds-stepper__connector--completed{background-color:var(--stepper-completed-bg, var(--success))}.ds-stepper--horizontal .ds-stepper__content{margin-top:var(--stepper-gap-horizontal, var(--space-2))}.ds-stepper--vertical{flex-direction:column}.ds-stepper--vertical .ds-stepper__step{flex-direction:row;align-items:flex-start}.ds-stepper--vertical .ds-stepper__connector{width:var(--stepper-connector-width);min-height:var(--stepper-connector-min-length);margin-left:calc(var(--stepper-indicator-size-md) / 2);margin-top:var(--space-1);margin-bottom:var(--space-1);background-color:var(--stepper-connector-color, var(--border-color))}.ds-stepper--vertical .ds-stepper__connector--completed{background-color:var(--stepper-completed-bg, var(--success))}.ds-stepper--vertical .ds-stepper__content{margin-left:var(--stepper-gap-vertical, var(--space-3))}.ds-stepper--clickable .ds-stepper__step:not(.ds-stepper__step--disabled){cursor:pointer}.ds-stepper--clickable .ds-stepper__step:not(.ds-stepper__step--disabled):hover .ds-stepper__indicator{transform:scale(1.1)}.ds-stepper__step{display:flex;outline:none;transition:opacity var(--duration-fast) ease}.ds-stepper__step:focus-visible .ds-stepper__indicator{box-shadow:var(--input-focus-shadow)}.ds-stepper__step--pending .ds-stepper__indicator{background-color:var(--stepper-pending-bg, var(--background-secondary));color:var(--stepper-pending-text, var(--text-muted));border-color:var(--stepper-pending-border, var(--border-color))}.ds-stepper__step--pending .ds-stepper__label{color:var(--stepper-pending-text, var(--text-muted))}.ds-stepper__step--active .ds-stepper__indicator{background-color:var(--stepper-active-bg, var(--color-primary));color:var(--stepper-active-text, var(--gray-50));border-color:var(--stepper-active-bg, var(--color-primary))}.ds-stepper__step--active .ds-stepper__label{color:var(--text-default);font-weight:var(--font-weight-semibold)}.ds-stepper__step--completed .ds-stepper__indicator{background-color:var(--stepper-completed-bg, var(--success));color:var(--stepper-completed-text, var(--gray-50));border-color:var(--stepper-completed-bg, var(--success))}.ds-stepper__step--completed .ds-stepper__label{color:var(--text-default)}.ds-stepper__step--error .ds-stepper__indicator{background-color:var(--stepper-error-bg, var(--error));color:var(--stepper-error-text, var(--gray-50));border-color:var(--stepper-error-bg, var(--error))}.ds-stepper__step--error .ds-stepper__label{color:var(--stepper-error-bg, var(--error))}.ds-stepper__step--disabled{opacity:.5;cursor:not-allowed}.ds-stepper__indicator{display:flex;align-items:center;justify-content:center;width:var(--stepper-indicator-size-md);height:var(--stepper-indicator-size-md);border-radius:50%;border:var(--stepper-indicator-border-width) solid;font-weight:var(--font-weight-semibold);font-size:var(--stepper-indicator-font-size-md, var(--font-size-2));flex-shrink:0;transition:transform var(--duration-fast) ease,background-color var(--duration-fast) ease,border-color var(--duration-fast) ease}.ds-stepper__number{line-height:1}.ds-stepper__content{display:flex;flex-direction:column}.ds-stepper__label{font-size:var(--stepper-label-font-size-md, var(--font-size-2));font-weight:var(--font-weight-medium);color:var(--text-default);transition:color var(--duration-fast) ease}.ds-stepper__optional{font-size:var(--stepper-description-font-size-md, var(--font-size-1));font-weight:var(--font-weight-normal);color:var(--text-subtle);margin-left:var(--space-1)}.ds-stepper__description{font-size:var(--stepper-description-font-size-md, var(--font-size-1));color:var(--text-muted);margin-top:var(--space-1)}.ds-stepper__connector{transition:background-color var(--duration-normal) ease}.ds-stepper--sm .ds-stepper__indicator{width:var(--stepper-indicator-size-sm);height:var(--stepper-indicator-size-sm);font-size:var(--stepper-indicator-font-size-sm, var(--font-size-1))}.ds-stepper--sm .ds-stepper__label{font-size:var(--stepper-label-font-size-sm, var(--font-size-1))}.ds-stepper--sm .ds-stepper__description{font-size:var(--stepper-description-font-size-sm, var(--font-size-small))}.ds-stepper--sm.ds-stepper--horizontal .ds-stepper__connector{margin-top:calc(var(--stepper-indicator-size-sm) / 2)}.ds-stepper--sm.ds-stepper--vertical .ds-stepper__connector{margin-left:calc(var(--stepper-indicator-size-sm) / 2)}.ds-stepper--lg .ds-stepper__indicator{width:var(--stepper-indicator-size-lg);height:var(--stepper-indicator-size-lg);font-size:var(--stepper-indicator-font-size-lg, var(--font-size-3))}.ds-stepper--lg .ds-stepper__label{font-size:var(--stepper-label-font-size-lg, var(--font-size-3))}.ds-stepper--lg .ds-stepper__description{font-size:var(--stepper-description-font-size-lg, var(--font-size-2))}.ds-stepper--lg.ds-stepper--horizontal .ds-stepper__connector{margin-top:calc(var(--stepper-indicator-size-lg) / 2)}.ds-stepper--lg.ds-stepper--vertical .ds-stepper__connector{margin-left:calc(var(--stepper-indicator-size-lg) / 2)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }] });
5541
5541
  }
5542
5542
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsStepper, decorators: [{
5543
5543
  type: Component,
@@ -6342,7 +6342,7 @@ class DsContainer {
6342
6342
  <div [class]="containerClasses()" [style]="containerStyle()">
6343
6343
  <ng-content />
6344
6344
  </div>
6345
- `, isInline: true, styles: [".ds-container{width:100%;max-width:var(--container-max-width, 960px);box-sizing:border-box}.ds-container--center{margin-left:auto;margin-right:auto}.ds-container--fluid{max-width:100%}.ds-container--sm{max-width:540px}.ds-container--md{max-width:720px}.ds-container--lg{max-width:960px}.ds-container--xl{max-width:1140px}.ds-container--2xl{max-width:1320px}.ds-container--gutter-none{padding-left:0;padding-right:0}.ds-container--gutter-sm{padding-left:var(--space-4, 1rem);padding-right:var(--space-4, 1rem)}.ds-container--gutter-md{padding-left:var(--space-6, 1.5rem);padding-right:var(--space-6, 1.5rem)}.ds-container--gutter-lg{padding-left:var(--space-8, 2rem);padding-right:var(--space-8, 2rem)}.ds-container--padding-y-none{padding-top:0;padding-bottom:0}.ds-container--padding-y-sm{padding-top:var(--space-4, 1rem);padding-bottom:var(--space-4, 1rem)}.ds-container--padding-y-md{padding-top:var(--space-6, 1.5rem);padding-bottom:var(--space-6, 1.5rem)}.ds-container--padding-y-lg{padding-top:var(--space-8, 2rem);padding-bottom:var(--space-8, 2rem)}@media (max-width: 575.98px){.ds-container--gutter-lg{padding-left:var(--space-4, 1rem);padding-right:var(--space-4, 1rem)}.ds-container--gutter-md{padding-left:var(--space-3, .75rem);padding-right:var(--space-3, .75rem)}}@media (min-width: 576px) and (max-width: 767.98px){.ds-container--gutter-lg{padding-left:var(--space-5, 1.25rem);padding-right:var(--space-5, 1.25rem)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6345
+ `, isInline: true, styles: [".ds-container{width:100%;max-width:var(--ds-container-lg, 960px);box-sizing:border-box}.ds-container--center{margin-left:auto;margin-right:auto}.ds-container--fluid{max-width:100%}.ds-container--sm{max-width:var(--ds-container-sm, 540px)}.ds-container--md{max-width:var(--ds-container-md, 720px)}.ds-container--lg{max-width:var(--ds-container-lg, 960px)}.ds-container--xl{max-width:var(--ds-container-xl, 1140px)}.ds-container--2xl{max-width:var(--ds-container-2xl, 1320px)}.ds-container--gutter-none{padding-left:0;padding-right:0}.ds-container--gutter-sm{padding-left:var(--ds-container-gutter-sm, var(--space-4));padding-right:var(--ds-container-gutter-sm, var(--space-4))}.ds-container--gutter-md{padding-left:var(--ds-container-gutter-md, var(--space-6));padding-right:var(--ds-container-gutter-md, var(--space-6))}.ds-container--gutter-lg{padding-left:var(--ds-container-gutter-lg, var(--space-8));padding-right:var(--ds-container-gutter-lg, var(--space-8))}.ds-container--padding-y-none{padding-top:0;padding-bottom:0}.ds-container--padding-y-sm{padding-top:var(--space-4);padding-bottom:var(--space-4)}.ds-container--padding-y-md{padding-top:var(--space-6);padding-bottom:var(--space-6)}.ds-container--padding-y-lg{padding-top:var(--space-8);padding-bottom:var(--space-8)}@media (max-width: var(--breakpoint-sm, 575.98px)){.ds-container--gutter-lg{padding-left:var(--space-4);padding-right:var(--space-4)}.ds-container--gutter-md{padding-left:var(--space-3);padding-right:var(--space-3)}}@media (min-width: var(--breakpoint-sm, 576px)) and (max-width: var(--breakpoint-md, 767.98px)){.ds-container--gutter-lg{padding-left:var(--space-5);padding-right:var(--space-5)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6346
6346
  }
6347
6347
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsContainer, decorators: [{
6348
6348
  type: Component,
@@ -6350,7 +6350,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
6350
6350
  <div [class]="containerClasses()" [style]="containerStyle()">
6351
6351
  <ng-content />
6352
6352
  </div>
6353
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ds-container{width:100%;max-width:var(--container-max-width, 960px);box-sizing:border-box}.ds-container--center{margin-left:auto;margin-right:auto}.ds-container--fluid{max-width:100%}.ds-container--sm{max-width:540px}.ds-container--md{max-width:720px}.ds-container--lg{max-width:960px}.ds-container--xl{max-width:1140px}.ds-container--2xl{max-width:1320px}.ds-container--gutter-none{padding-left:0;padding-right:0}.ds-container--gutter-sm{padding-left:var(--space-4, 1rem);padding-right:var(--space-4, 1rem)}.ds-container--gutter-md{padding-left:var(--space-6, 1.5rem);padding-right:var(--space-6, 1.5rem)}.ds-container--gutter-lg{padding-left:var(--space-8, 2rem);padding-right:var(--space-8, 2rem)}.ds-container--padding-y-none{padding-top:0;padding-bottom:0}.ds-container--padding-y-sm{padding-top:var(--space-4, 1rem);padding-bottom:var(--space-4, 1rem)}.ds-container--padding-y-md{padding-top:var(--space-6, 1.5rem);padding-bottom:var(--space-6, 1.5rem)}.ds-container--padding-y-lg{padding-top:var(--space-8, 2rem);padding-bottom:var(--space-8, 2rem)}@media (max-width: 575.98px){.ds-container--gutter-lg{padding-left:var(--space-4, 1rem);padding-right:var(--space-4, 1rem)}.ds-container--gutter-md{padding-left:var(--space-3, .75rem);padding-right:var(--space-3, .75rem)}}@media (min-width: 576px) and (max-width: 767.98px){.ds-container--gutter-lg{padding-left:var(--space-5, 1.25rem);padding-right:var(--space-5, 1.25rem)}}\n"] }]
6353
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".ds-container{width:100%;max-width:var(--ds-container-lg, 960px);box-sizing:border-box}.ds-container--center{margin-left:auto;margin-right:auto}.ds-container--fluid{max-width:100%}.ds-container--sm{max-width:var(--ds-container-sm, 540px)}.ds-container--md{max-width:var(--ds-container-md, 720px)}.ds-container--lg{max-width:var(--ds-container-lg, 960px)}.ds-container--xl{max-width:var(--ds-container-xl, 1140px)}.ds-container--2xl{max-width:var(--ds-container-2xl, 1320px)}.ds-container--gutter-none{padding-left:0;padding-right:0}.ds-container--gutter-sm{padding-left:var(--ds-container-gutter-sm, var(--space-4));padding-right:var(--ds-container-gutter-sm, var(--space-4))}.ds-container--gutter-md{padding-left:var(--ds-container-gutter-md, var(--space-6));padding-right:var(--ds-container-gutter-md, var(--space-6))}.ds-container--gutter-lg{padding-left:var(--ds-container-gutter-lg, var(--space-8));padding-right:var(--ds-container-gutter-lg, var(--space-8))}.ds-container--padding-y-none{padding-top:0;padding-bottom:0}.ds-container--padding-y-sm{padding-top:var(--space-4);padding-bottom:var(--space-4)}.ds-container--padding-y-md{padding-top:var(--space-6);padding-bottom:var(--space-6)}.ds-container--padding-y-lg{padding-top:var(--space-8);padding-bottom:var(--space-8)}@media (max-width: var(--breakpoint-sm, 575.98px)){.ds-container--gutter-lg{padding-left:var(--space-4);padding-right:var(--space-4)}.ds-container--gutter-md{padding-left:var(--space-3);padding-right:var(--space-3)}}@media (min-width: var(--breakpoint-sm, 576px)) and (max-width: var(--breakpoint-md, 767.98px)){.ds-container--gutter-lg{padding-left:var(--space-5);padding-right:var(--space-5)}}\n"] }]
6354
6354
  }], propDecorators: { maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], center: [{ type: i0.Input, args: [{ isSignal: true, alias: "center", required: false }] }], gutter: [{ type: i0.Input, args: [{ isSignal: true, alias: "gutter", required: false }] }], paddingY: [{ type: i0.Input, args: [{ isSignal: true, alias: "paddingY", required: false }] }], customClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "customClass", required: false }] }] } });
6355
6355
 
6356
6356
  /**
@@ -6531,7 +6531,7 @@ class DsSearchInput {
6531
6531
  </button>
6532
6532
  }
6533
6533
  </div>
6534
- `, isInline: true, styles: [".ds-search-input{display:flex;align-items:center;position:relative;width:100%;background:var(--input-bg, var(--background-main, #fff));border:1px solid var(--input-border-color, var(--border-default, #d1d5db));border-radius:var(--input-border-radius, var(--radius-2, 6px));transition:border-color .2s ease,box-shadow .2s ease}.ds-search-input:focus-within{border-color:var(--input-focus-border, var(--color-primary, #3b82f6));box-shadow:0 0 0 3px var(--input-focus-shadow, rgba(59, 130, 246, .25))}.ds-search-input--sm{height:var(--input-height-sm, 32px)}.ds-search-input--sm .ds-search-input__input{font-size:var(--font-size-2, .875rem);padding:0 var(--space-2, .5rem)}.ds-search-input--sm .ds-search-input__icon{font-size:12px}.ds-search-input--sm .ds-search-input__icon--search{margin-left:var(--space-2, .5rem)}.ds-search-input--sm .ds-search-input__clear{margin-right:var(--space-1, .25rem);width:20px;height:20px}.ds-search-input--md{height:var(--input-height-md, 40px)}.ds-search-input--md .ds-search-input__input{font-size:var(--font-size-3, 1rem);padding:0 var(--space-3, .75rem)}.ds-search-input--md .ds-search-input__icon{font-size:14px}.ds-search-input--md .ds-search-input__icon--search{margin-left:var(--space-3, .75rem)}.ds-search-input--md .ds-search-input__clear{margin-right:var(--space-2, .5rem);width:24px;height:24px}.ds-search-input--lg{height:var(--input-height-lg, 48px)}.ds-search-input--lg .ds-search-input__input{font-size:var(--font-size-4, 1.125rem);padding:0 var(--space-4, 1rem)}.ds-search-input--lg .ds-search-input__icon{font-size:16px}.ds-search-input--lg .ds-search-input__icon--search{margin-left:var(--space-4, 1rem)}.ds-search-input--lg .ds-search-input__clear{margin-right:var(--space-3, .75rem);width:28px;height:28px}.ds-search-input--disabled{opacity:.6;cursor:not-allowed;background:var(--input-disabled-bg, var(--background-subtle, #f9fafb))}.ds-search-input--disabled .ds-search-input__input{cursor:not-allowed}.ds-search-input--loading .ds-search-input__icon--loading{color:var(--color-primary, #3b82f6)}.ds-search-input__icon{flex-shrink:0;color:var(--text-muted, #6b7280)}.ds-search-input__icon--search{pointer-events:none}.ds-search-input__icon--loading{margin-right:var(--space-2, .5rem)}.ds-search-input__icon--spin{animation:ds-search-spin 1s linear infinite}@keyframes ds-search-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ds-search-input__input{flex:1;border:none;background:transparent;color:var(--text-default, #1f2937);outline:none;min-width:0}.ds-search-input__input::placeholder{color:var(--text-muted, #9ca3af)}.ds-search-input__input:disabled{color:var(--text-muted, #9ca3af)}.ds-search-input__clear{display:flex;align-items:center;justify-content:center;flex-shrink:0;border:none;background:transparent;color:var(--text-muted, #6b7280);cursor:pointer;border-radius:var(--radius-1, 4px);transition:background-color .15s ease,color .15s ease}.ds-search-input__clear:hover{background:var(--background-subtle, #f3f4f6);color:var(--text-default, #1f2937)}.ds-search-input__clear:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:1px}.ds-search-input__clear:active{background:var(--background-muted, #e5e7eb)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6534
+ `, isInline: true, styles: [".ds-search-input{display:flex;align-items:center;position:relative;width:100%;background:var(--search-input-bg, var(--input-bg, var(--background-main)));border:1px solid var(--search-input-border, var(--input-border-color, var(--border-default)));border-radius:var(--search-input-radius, var(--radius-2));transition:border-color var(--duration-fast, .2s) ease,box-shadow var(--duration-fast, .2s) ease}.ds-search-input:focus-within{border-color:var(--search-input-focus-border, var(--input-focus-border, var(--color-primary)));box-shadow:var(--search-input-focus-shadow, var(--input-focus-shadow))}.ds-search-input--sm{height:var(--search-input-height-sm, 32px)}.ds-search-input--sm .ds-search-input__input{font-size:var(--search-input-font-size-sm, var(--font-size-2));padding:0 var(--search-input-padding-sm, var(--space-2))}.ds-search-input--sm .ds-search-input__icon{font-size:var(--search-input-icon-size-sm, 12px)}.ds-search-input--sm .ds-search-input__icon--search{margin-left:var(--search-input-padding-sm, var(--space-2))}.ds-search-input--sm .ds-search-input__clear{margin-right:var(--space-1);width:var(--search-input-clear-size-sm, 20px);height:var(--search-input-clear-size-sm, 20px)}.ds-search-input--md{height:var(--search-input-height-md, 40px)}.ds-search-input--md .ds-search-input__input{font-size:var(--search-input-font-size-md, var(--font-size-3));padding:0 var(--search-input-padding-md, var(--space-3))}.ds-search-input--md .ds-search-input__icon{font-size:var(--search-input-icon-size-md, 14px)}.ds-search-input--md .ds-search-input__icon--search{margin-left:var(--search-input-padding-md, var(--space-3))}.ds-search-input--md .ds-search-input__clear{margin-right:var(--space-2);width:var(--search-input-clear-size-md, 24px);height:var(--search-input-clear-size-md, 24px)}.ds-search-input--lg{height:var(--search-input-height-lg, 48px)}.ds-search-input--lg .ds-search-input__input{font-size:var(--search-input-font-size-lg, var(--font-size-4));padding:0 var(--search-input-padding-lg, var(--space-4))}.ds-search-input--lg .ds-search-input__icon{font-size:var(--search-input-icon-size-lg, 16px)}.ds-search-input--lg .ds-search-input__icon--search{margin-left:var(--search-input-padding-lg, var(--space-4))}.ds-search-input--lg .ds-search-input__clear{margin-right:var(--space-3);width:var(--search-input-clear-size-lg, 28px);height:var(--search-input-clear-size-lg, 28px)}.ds-search-input--disabled{opacity:.6;cursor:not-allowed;background:var(--search-input-disabled-bg, var(--input-disabled-bg, var(--bg-disabled)))}.ds-search-input--disabled .ds-search-input__input{cursor:not-allowed}.ds-search-input--loading .ds-search-input__icon--loading{color:var(--search-input-loading-color, var(--color-primary))}.ds-search-input__icon{flex-shrink:0;color:var(--search-input-icon-color, var(--text-muted))}.ds-search-input__icon--search{pointer-events:none}.ds-search-input__icon--loading{margin-right:var(--space-2)}.ds-search-input__icon--spin{animation:ds-search-spin 1s linear infinite}@keyframes ds-search-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ds-search-input__input{flex:1;border:none;background:transparent;color:var(--search-input-text, var(--text-default));outline:none;min-width:0}.ds-search-input__input::placeholder{color:var(--search-input-placeholder, var(--text-muted))}.ds-search-input__input:disabled{color:var(--search-input-disabled-text, var(--text-disabled))}.ds-search-input__clear{display:flex;align-items:center;justify-content:center;flex-shrink:0;border:none;background:transparent;color:var(--search-input-clear-color, var(--text-muted));cursor:pointer;border-radius:var(--radius-1);transition:background-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease}.ds-search-input__clear:hover{background:var(--search-input-clear-hover-bg, var(--surface-hover));color:var(--search-input-clear-hover-color, var(--text-default))}.ds-search-input__clear:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-search-input__clear:active{background:var(--search-input-clear-active-bg, var(--surface-raised))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { 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 });
6535
6535
  }
6536
6536
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsSearchInput, decorators: [{
6537
6537
  type: Component,
@@ -6579,9 +6579,58 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
6579
6579
  useExisting: forwardRef(() => DsSearchInput),
6580
6580
  multi: true,
6581
6581
  },
6582
- ], styles: [".ds-search-input{display:flex;align-items:center;position:relative;width:100%;background:var(--input-bg, var(--background-main, #fff));border:1px solid var(--input-border-color, var(--border-default, #d1d5db));border-radius:var(--input-border-radius, var(--radius-2, 6px));transition:border-color .2s ease,box-shadow .2s ease}.ds-search-input:focus-within{border-color:var(--input-focus-border, var(--color-primary, #3b82f6));box-shadow:0 0 0 3px var(--input-focus-shadow, rgba(59, 130, 246, .25))}.ds-search-input--sm{height:var(--input-height-sm, 32px)}.ds-search-input--sm .ds-search-input__input{font-size:var(--font-size-2, .875rem);padding:0 var(--space-2, .5rem)}.ds-search-input--sm .ds-search-input__icon{font-size:12px}.ds-search-input--sm .ds-search-input__icon--search{margin-left:var(--space-2, .5rem)}.ds-search-input--sm .ds-search-input__clear{margin-right:var(--space-1, .25rem);width:20px;height:20px}.ds-search-input--md{height:var(--input-height-md, 40px)}.ds-search-input--md .ds-search-input__input{font-size:var(--font-size-3, 1rem);padding:0 var(--space-3, .75rem)}.ds-search-input--md .ds-search-input__icon{font-size:14px}.ds-search-input--md .ds-search-input__icon--search{margin-left:var(--space-3, .75rem)}.ds-search-input--md .ds-search-input__clear{margin-right:var(--space-2, .5rem);width:24px;height:24px}.ds-search-input--lg{height:var(--input-height-lg, 48px)}.ds-search-input--lg .ds-search-input__input{font-size:var(--font-size-4, 1.125rem);padding:0 var(--space-4, 1rem)}.ds-search-input--lg .ds-search-input__icon{font-size:16px}.ds-search-input--lg .ds-search-input__icon--search{margin-left:var(--space-4, 1rem)}.ds-search-input--lg .ds-search-input__clear{margin-right:var(--space-3, .75rem);width:28px;height:28px}.ds-search-input--disabled{opacity:.6;cursor:not-allowed;background:var(--input-disabled-bg, var(--background-subtle, #f9fafb))}.ds-search-input--disabled .ds-search-input__input{cursor:not-allowed}.ds-search-input--loading .ds-search-input__icon--loading{color:var(--color-primary, #3b82f6)}.ds-search-input__icon{flex-shrink:0;color:var(--text-muted, #6b7280)}.ds-search-input__icon--search{pointer-events:none}.ds-search-input__icon--loading{margin-right:var(--space-2, .5rem)}.ds-search-input__icon--spin{animation:ds-search-spin 1s linear infinite}@keyframes ds-search-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ds-search-input__input{flex:1;border:none;background:transparent;color:var(--text-default, #1f2937);outline:none;min-width:0}.ds-search-input__input::placeholder{color:var(--text-muted, #9ca3af)}.ds-search-input__input:disabled{color:var(--text-muted, #9ca3af)}.ds-search-input__clear{display:flex;align-items:center;justify-content:center;flex-shrink:0;border:none;background:transparent;color:var(--text-muted, #6b7280);cursor:pointer;border-radius:var(--radius-1, 4px);transition:background-color .15s ease,color .15s ease}.ds-search-input__clear:hover{background:var(--background-subtle, #f3f4f6);color:var(--text-default, #1f2937)}.ds-search-input__clear:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:1px}.ds-search-input__clear:active{background:var(--background-muted, #e5e7eb)}\n"] }]
6582
+ ], styles: [".ds-search-input{display:flex;align-items:center;position:relative;width:100%;background:var(--search-input-bg, var(--input-bg, var(--background-main)));border:1px solid var(--search-input-border, var(--input-border-color, var(--border-default)));border-radius:var(--search-input-radius, var(--radius-2));transition:border-color var(--duration-fast, .2s) ease,box-shadow var(--duration-fast, .2s) ease}.ds-search-input:focus-within{border-color:var(--search-input-focus-border, var(--input-focus-border, var(--color-primary)));box-shadow:var(--search-input-focus-shadow, var(--input-focus-shadow))}.ds-search-input--sm{height:var(--search-input-height-sm, 32px)}.ds-search-input--sm .ds-search-input__input{font-size:var(--search-input-font-size-sm, var(--font-size-2));padding:0 var(--search-input-padding-sm, var(--space-2))}.ds-search-input--sm .ds-search-input__icon{font-size:var(--search-input-icon-size-sm, 12px)}.ds-search-input--sm .ds-search-input__icon--search{margin-left:var(--search-input-padding-sm, var(--space-2))}.ds-search-input--sm .ds-search-input__clear{margin-right:var(--space-1);width:var(--search-input-clear-size-sm, 20px);height:var(--search-input-clear-size-sm, 20px)}.ds-search-input--md{height:var(--search-input-height-md, 40px)}.ds-search-input--md .ds-search-input__input{font-size:var(--search-input-font-size-md, var(--font-size-3));padding:0 var(--search-input-padding-md, var(--space-3))}.ds-search-input--md .ds-search-input__icon{font-size:var(--search-input-icon-size-md, 14px)}.ds-search-input--md .ds-search-input__icon--search{margin-left:var(--search-input-padding-md, var(--space-3))}.ds-search-input--md .ds-search-input__clear{margin-right:var(--space-2);width:var(--search-input-clear-size-md, 24px);height:var(--search-input-clear-size-md, 24px)}.ds-search-input--lg{height:var(--search-input-height-lg, 48px)}.ds-search-input--lg .ds-search-input__input{font-size:var(--search-input-font-size-lg, var(--font-size-4));padding:0 var(--search-input-padding-lg, var(--space-4))}.ds-search-input--lg .ds-search-input__icon{font-size:var(--search-input-icon-size-lg, 16px)}.ds-search-input--lg .ds-search-input__icon--search{margin-left:var(--search-input-padding-lg, var(--space-4))}.ds-search-input--lg .ds-search-input__clear{margin-right:var(--space-3);width:var(--search-input-clear-size-lg, 28px);height:var(--search-input-clear-size-lg, 28px)}.ds-search-input--disabled{opacity:.6;cursor:not-allowed;background:var(--search-input-disabled-bg, var(--input-disabled-bg, var(--bg-disabled)))}.ds-search-input--disabled .ds-search-input__input{cursor:not-allowed}.ds-search-input--loading .ds-search-input__icon--loading{color:var(--search-input-loading-color, var(--color-primary))}.ds-search-input__icon{flex-shrink:0;color:var(--search-input-icon-color, var(--text-muted))}.ds-search-input__icon--search{pointer-events:none}.ds-search-input__icon--loading{margin-right:var(--space-2)}.ds-search-input__icon--spin{animation:ds-search-spin 1s linear infinite}@keyframes ds-search-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.ds-search-input__input{flex:1;border:none;background:transparent;color:var(--search-input-text, var(--text-default));outline:none;min-width:0}.ds-search-input__input::placeholder{color:var(--search-input-placeholder, var(--text-muted))}.ds-search-input__input:disabled{color:var(--search-input-disabled-text, var(--text-disabled))}.ds-search-input__clear{display:flex;align-items:center;justify-content:center;flex-shrink:0;border:none;background:transparent;color:var(--search-input-clear-color, var(--text-muted));cursor:pointer;border-radius:var(--radius-1);transition:background-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease}.ds-search-input__clear:hover{background:var(--search-input-clear-hover-bg, var(--surface-hover));color:var(--search-input-clear-hover-color, var(--text-default))}.ds-search-input__clear:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-search-input__clear:active{background:var(--search-input-clear-active-bg, var(--surface-raised))}\n"] }]
6583
6583
  }], ctorParameters: () => [], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], debounceMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "debounceMs", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], minChars: [{ type: i0.Input, args: [{ isSignal: true, alias: "minChars", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaDescribedBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaDescribedBy", required: false }] }], search: [{ type: i0.Output, args: ["search"] }], searchImmediate: [{ type: i0.Output, args: ["searchImmediate"] }], cleared: [{ type: i0.Output, args: ["cleared"] }], inputRef: [{ type: i0.ViewChild, args: ['inputRef', { isSignal: true }] }] } });
6584
6584
 
6585
+ /** Presets prédéfinis pour le mode range */
6586
+ const DEFAULT_DATE_PRESETS = [
6587
+ {
6588
+ label: "Aujourd'hui",
6589
+ getValue: () => {
6590
+ const today = new Date();
6591
+ today.setHours(0, 0, 0, 0);
6592
+ return { start: today, end: today };
6593
+ },
6594
+ },
6595
+ {
6596
+ label: '7 derniers jours',
6597
+ getValue: () => {
6598
+ const end = new Date();
6599
+ end.setHours(0, 0, 0, 0);
6600
+ const start = new Date(end);
6601
+ start.setDate(start.getDate() - 6);
6602
+ return { start, end };
6603
+ },
6604
+ },
6605
+ {
6606
+ label: '30 derniers jours',
6607
+ getValue: () => {
6608
+ const end = new Date();
6609
+ end.setHours(0, 0, 0, 0);
6610
+ const start = new Date(end);
6611
+ start.setDate(start.getDate() - 29);
6612
+ return { start, end };
6613
+ },
6614
+ },
6615
+ {
6616
+ label: 'Ce mois',
6617
+ getValue: () => {
6618
+ const now = new Date();
6619
+ const start = new Date(now.getFullYear(), now.getMonth(), 1);
6620
+ const end = new Date(now.getFullYear(), now.getMonth() + 1, 0);
6621
+ return { start, end };
6622
+ },
6623
+ },
6624
+ {
6625
+ label: 'Mois dernier',
6626
+ getValue: () => {
6627
+ const now = new Date();
6628
+ const start = new Date(now.getFullYear(), now.getMonth() - 1, 1);
6629
+ const end = new Date(now.getFullYear(), now.getMonth(), 0);
6630
+ return { start, end };
6631
+ },
6632
+ },
6633
+ ];
6585
6634
  /**
6586
6635
  * DsDatePicker - Composant de sélection de date
6587
6636
  *
@@ -6620,6 +6669,12 @@ class DsDatePicker {
6620
6669
  prevMonthLabel = input('Mois précédent', ...(ngDevMode ? [{ debugName: "prevMonthLabel" }] : []));
6621
6670
  /** Label bouton mois suivant */
6622
6671
  nextMonthLabel = input('Mois suivant', ...(ngDevMode ? [{ debugName: "nextMonthLabel" }] : []));
6672
+ /** Presets pour le mode range */
6673
+ presets = input([], ...(ngDevMode ? [{ debugName: "presets" }] : []));
6674
+ /** Afficher les presets */
6675
+ showPresets = input(false, ...(ngDevMode ? [{ debugName: "showPresets" }] : []));
6676
+ /** Activer le preview au survol en mode range */
6677
+ showRangePreview = input(true, ...(ngDevMode ? [{ debugName: "showRangePreview" }] : []));
6623
6678
  /** Événement de changement de date (mode single) */
6624
6679
  dateChange = output();
6625
6680
  /** Événement de changement de range */
@@ -6643,6 +6698,7 @@ class DsDatePicker {
6643
6698
  rangeEnd = signal(null, ...(ngDevMode ? [{ debugName: "rangeEnd" }] : []));
6644
6699
  showMonthPicker = signal(false, ...(ngDevMode ? [{ debugName: "showMonthPicker" }] : []));
6645
6700
  showYearPicker = signal(false, ...(ngDevMode ? [{ debugName: "showYearPicker" }] : []));
6701
+ hoveredDate = signal(null, ...(ngDevMode ? [{ debugName: "hoveredDate" }] : []));
6646
6702
  /** Callbacks CVA */
6647
6703
  onChange = () => { };
6648
6704
  onTouched = () => { };
@@ -6693,6 +6749,7 @@ class DsDatePicker {
6693
6749
  const isRangeStart = this.isRangeStartDate(date);
6694
6750
  const isRangeEnd = this.isRangeEndDate(date);
6695
6751
  const isInRange = this.isDateInRange(date);
6752
+ const isInPreviewRange = this.isDateInPreviewRange(date);
6696
6753
  const isDisabled = this.isDateDisabled(date);
6697
6754
  week.push({
6698
6755
  date,
@@ -6703,6 +6760,7 @@ class DsDatePicker {
6703
6760
  isRangeStart,
6704
6761
  isRangeEnd,
6705
6762
  isInRange,
6763
+ isInPreviewRange,
6706
6764
  isDisabled,
6707
6765
  ariaLabel: this.formatDateForAria(date),
6708
6766
  });
@@ -6872,6 +6930,44 @@ class DsDatePicker {
6872
6930
  return false;
6873
6931
  return date > start && date < end;
6874
6932
  }
6933
+ isDateInPreviewRange(date) {
6934
+ if (this.mode() !== 'range' || !this.showRangePreview())
6935
+ return false;
6936
+ const start = this.rangeStart();
6937
+ const end = this.rangeEnd();
6938
+ const hovered = this.hoveredDate();
6939
+ // Seulement si on a un start mais pas de end, et on survole
6940
+ if (!start || end || !hovered)
6941
+ return false;
6942
+ const minDate = start < hovered ? start : hovered;
6943
+ const maxDate = start < hovered ? hovered : start;
6944
+ return date > minDate && date < maxDate;
6945
+ }
6946
+ onDayMouseEnter(date) {
6947
+ if (date && this.mode() === 'range' && this.showRangePreview() && this.rangeStart() && !this.rangeEnd()) {
6948
+ this.hoveredDate.set(date);
6949
+ }
6950
+ }
6951
+ onDayMouseLeave() {
6952
+ this.hoveredDate.set(null);
6953
+ }
6954
+ selectPreset(preset) {
6955
+ const range = preset.getValue();
6956
+ this.rangeStart.set(range.start);
6957
+ this.rangeEnd.set(range.end);
6958
+ this.rangeChange.emit(range);
6959
+ this.onChange(range);
6960
+ // Naviguer vers le mois du début
6961
+ if (range.start) {
6962
+ this.currentMonth.set(range.start.getMonth());
6963
+ this.currentYear.set(range.start.getFullYear());
6964
+ }
6965
+ }
6966
+ /** Presets effectifs (utilise les presets fournis ou les défauts) */
6967
+ effectivePresets = computed(() => {
6968
+ const custom = this.presets();
6969
+ return custom.length > 0 ? custom : DEFAULT_DATE_PRESETS;
6970
+ }, ...(ngDevMode ? [{ debugName: "effectivePresets" }] : []));
6875
6971
  isDateDisabled(date) {
6876
6972
  const min = this.minDate();
6877
6973
  const max = this.maxDate();
@@ -6926,7 +7022,7 @@ class DsDatePicker {
6926
7022
  // Géré via l'input signal
6927
7023
  }
6928
7024
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsDatePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
6929
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsDatePicker, isStandalone: true, selector: "ds-date-picker", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", 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 }, showTodayButton: { classPropertyName: "showTodayButton", publicName: "showTodayButton", isSignal: true, isRequired: false, transformFunction: null }, showClearButton: { classPropertyName: "showClearButton", publicName: "showClearButton", isSignal: true, isRequired: false, transformFunction: null }, todayLabel: { classPropertyName: "todayLabel", publicName: "todayLabel", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, prevMonthLabel: { classPropertyName: "prevMonthLabel", publicName: "prevMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, nextMonthLabel: { classPropertyName: "nextMonthLabel", publicName: "nextMonthLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dateChange: "dateChange", rangeChange: "rangeChange" }, providers: [
7025
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsDatePicker, isStandalone: true, selector: "ds-date-picker", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", 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 }, showTodayButton: { classPropertyName: "showTodayButton", publicName: "showTodayButton", isSignal: true, isRequired: false, transformFunction: null }, showClearButton: { classPropertyName: "showClearButton", publicName: "showClearButton", isSignal: true, isRequired: false, transformFunction: null }, todayLabel: { classPropertyName: "todayLabel", publicName: "todayLabel", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, prevMonthLabel: { classPropertyName: "prevMonthLabel", publicName: "prevMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, nextMonthLabel: { classPropertyName: "nextMonthLabel", publicName: "nextMonthLabel", isSignal: true, isRequired: false, transformFunction: null }, presets: { classPropertyName: "presets", publicName: "presets", isSignal: true, isRequired: false, transformFunction: null }, showPresets: { classPropertyName: "showPresets", publicName: "showPresets", isSignal: true, isRequired: false, transformFunction: null }, showRangePreview: { classPropertyName: "showRangePreview", publicName: "showRangePreview", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dateChange: "dateChange", rangeChange: "rangeChange" }, providers: [
6930
7026
  {
6931
7027
  provide: NG_VALUE_ACCESSOR,
6932
7028
  useExisting: forwardRef(() => DsDatePicker),
@@ -7032,13 +7128,16 @@ class DsDatePicker {
7032
7128
  [class.ds-date-picker__day--range-start]="day.isRangeStart"
7033
7129
  [class.ds-date-picker__day--range-end]="day.isRangeEnd"
7034
7130
  [class.ds-date-picker__day--in-range]="day.isInRange"
7131
+ [class.ds-date-picker__day--in-preview]="day.isInPreviewRange"
7035
7132
  [class.ds-date-picker__day--disabled]="day.isDisabled"
7036
7133
  [disabled]="disabled() || day.isDisabled"
7037
7134
  role="gridcell"
7038
7135
  [attr.aria-selected]="day.isSelected"
7039
7136
  [attr.aria-label]="day.ariaLabel"
7040
7137
  (click)="selectDate(day.date)"
7041
- (keydown)="onDayKeydown($event, day.date)">
7138
+ (keydown)="onDayKeydown($event, day.date)"
7139
+ (mouseenter)="onDayMouseEnter(day.date)"
7140
+ (mouseleave)="onDayMouseLeave()">
7042
7141
  {{ day.dayNumber }}
7043
7142
  </button>
7044
7143
  }
@@ -7047,6 +7146,21 @@ class DsDatePicker {
7047
7146
  </div>
7048
7147
  </div>
7049
7148
 
7149
+ <!-- Presets (mode range uniquement) -->
7150
+ @if (showPresets() && mode() === 'range') {
7151
+ <div class="ds-date-picker__presets">
7152
+ @for (preset of effectivePresets(); track preset.label) {
7153
+ <button
7154
+ type="button"
7155
+ class="ds-date-picker__preset"
7156
+ [disabled]="disabled()"
7157
+ (click)="selectPreset(preset)">
7158
+ {{ preset.label }}
7159
+ </button>
7160
+ }
7161
+ </div>
7162
+ }
7163
+
7050
7164
  <!-- Actions -->
7051
7165
  @if (showTodayButton() || showClearButton()) {
7052
7166
  <div class="ds-date-picker__actions">
@@ -7072,7 +7186,7 @@ class DsDatePicker {
7072
7186
  }
7073
7187
  }
7074
7188
  </div>
7075
- `, isInline: true, styles: [".ds-date-picker{display:inline-flex;flex-direction:column;background:var(--datepicker-bg, var(--background-main, #fff));border:1px solid var(--datepicker-border, var(--border-default, #d1d5db));border-radius:var(--datepicker-radius, var(--radius-2, 6px));box-shadow:var(--datepicker-shadow, var(--shadow-md, 0 4px 6px -1px rgba(0, 0, 0, .1)));overflow:hidden;-webkit-user-select:none;user-select:none}.ds-date-picker--sm{width:260px;font-size:var(--font-size-2, .875rem)}.ds-date-picker--sm .ds-date-picker__header{padding:var(--space-2, .5rem)}.ds-date-picker--sm .ds-date-picker__nav{width:24px;height:24px}.ds-date-picker--sm .ds-date-picker__day{width:28px;height:28px}.ds-date-picker--sm .ds-date-picker__weekday{width:28px;height:24px}.ds-date-picker--md{width:300px;font-size:var(--font-size-3, 1rem)}.ds-date-picker--md .ds-date-picker__header{padding:var(--space-3, .75rem)}.ds-date-picker--md .ds-date-picker__nav{width:32px;height:32px}.ds-date-picker--md .ds-date-picker__day{width:36px;height:36px}.ds-date-picker--md .ds-date-picker__weekday{width:36px;height:28px}.ds-date-picker--lg{width:360px;font-size:var(--font-size-4, 1.125rem)}.ds-date-picker--lg .ds-date-picker__header{padding:var(--space-4, 1rem)}.ds-date-picker--lg .ds-date-picker__nav{width:40px;height:40px}.ds-date-picker--lg .ds-date-picker__day{width:44px;height:44px}.ds-date-picker--lg .ds-date-picker__weekday{width:44px;height:32px}.ds-date-picker--disabled{opacity:.6;pointer-events:none}.ds-date-picker__header{display:flex;align-items:center;justify-content:space-between;background:var(--datepicker-header-bg, var(--background-subtle, #f9fafb));border-bottom:1px solid var(--datepicker-border, var(--border-default, #d1d5db))}.ds-date-picker__title{display:flex;align-items:center;gap:var(--space-1, .25rem)}.ds-date-picker__month-btn,.ds-date-picker__year-btn{padding:var(--space-1, .25rem) var(--space-2, .5rem);background:transparent;border:none;border-radius:var(--radius-1, 4px);color:var(--text-default, #1f2937);font-weight:600;cursor:pointer;transition:background-color .15s ease}.ds-date-picker__month-btn:hover:not(:disabled),.ds-date-picker__year-btn:hover:not(:disabled){background:var(--background-muted, #e5e7eb)}.ds-date-picker__month-btn:focus-visible,.ds-date-picker__year-btn:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:1px}.ds-date-picker__month-btn:disabled,.ds-date-picker__year-btn:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__nav{display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-1, 4px);color:var(--text-muted, #6b7280);cursor:pointer;transition:background-color .15s ease,color .15s ease}.ds-date-picker__nav:hover:not(:disabled){background:var(--background-muted, #e5e7eb);color:var(--text-default, #1f2937)}.ds-date-picker__nav:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:1px}.ds-date-picker__nav:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__calendar{padding:var(--space-2, .5rem)}.ds-date-picker__weekdays{display:flex;margin-bottom:var(--space-1, .25rem)}.ds-date-picker__weekday{display:flex;align-items:center;justify-content:center;color:var(--text-muted, #6b7280);font-size:.75em;font-weight:500;text-transform:uppercase}.ds-date-picker__days{display:flex;flex-direction:column;gap:var(--space-1, .25rem)}.ds-date-picker__week{display:flex}.ds-date-picker__day{display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-1, 4px);color:var(--text-default, #1f2937);font-weight:400;cursor:pointer;transition:background-color .15s ease,color .15s ease}.ds-date-picker__day:hover:not(:disabled):not(.ds-date-picker__day--selected){background:var(--background-subtle, #f3f4f6)}.ds-date-picker__day:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px;z-index:1}.ds-date-picker__day--other-month{color:var(--text-muted, #9ca3af)}.ds-date-picker__day--today{font-weight:600;border:1px solid var(--color-primary, #3b82f6)}.ds-date-picker__day--selected{background:var(--color-primary, #3b82f6);color:var(--color-primary-text, #fff);font-weight:600}.ds-date-picker__day--selected:hover:not(:disabled){background:var(--color-primary-hover, #2563eb)}.ds-date-picker__day--range-start{background:var(--color-primary, #3b82f6);color:var(--color-primary-text, #fff);border-radius:var(--radius-1, 4px) 0 0 var(--radius-1, 4px)}.ds-date-picker__day--range-end{background:var(--color-primary, #3b82f6);color:var(--color-primary-text, #fff);border-radius:0 var(--radius-1, 4px) var(--radius-1, 4px) 0}.ds-date-picker__day--in-range{background:var(--color-primary-subtle, rgba(59, 130, 246, .15));border-radius:0}.ds-date-picker__day--disabled{opacity:.4;cursor:not-allowed}.ds-date-picker__month-picker,.ds-date-picker__year-picker{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-2, .5rem);padding:var(--space-3, .75rem);max-height:240px;overflow-y:auto}.ds-date-picker__month-option,.ds-date-picker__year-option{padding:var(--space-2, .5rem);background:transparent;border:1px solid transparent;border-radius:var(--radius-1, 4px);color:var(--text-default, #1f2937);cursor:pointer;transition:background-color .15s ease,border-color .15s ease}.ds-date-picker__month-option:hover:not(:disabled),.ds-date-picker__year-option:hover:not(:disabled){background:var(--background-subtle, #f3f4f6);border-color:var(--border-default, #d1d5db)}.ds-date-picker__month-option:focus-visible,.ds-date-picker__year-option:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:1px}.ds-date-picker__month-option--selected,.ds-date-picker__year-option--selected{background:var(--color-primary, #3b82f6);color:var(--color-primary-text, #fff);border-color:var(--color-primary, #3b82f6)}.ds-date-picker__month-option--selected:hover:not(:disabled),.ds-date-picker__year-option--selected:hover:not(:disabled){background:var(--color-primary-hover, #2563eb);border-color:var(--color-primary-hover, #2563eb)}.ds-date-picker__month-option:disabled,.ds-date-picker__year-option:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__actions{display:flex;justify-content:center;gap:var(--space-2, .5rem);padding:var(--space-2, .5rem);border-top:1px solid var(--datepicker-border, var(--border-default, #d1d5db));background:var(--datepicker-footer-bg, var(--background-subtle, #f9fafb))}.ds-date-picker__action{padding:var(--space-1, .25rem) var(--space-3, .75rem);background:transparent;border:1px solid var(--border-default, #d1d5db);border-radius:var(--radius-1, 4px);color:var(--text-default, #1f2937);font-size:.875em;cursor:pointer;transition:background-color .15s ease,border-color .15s ease}.ds-date-picker__action:hover:not(:disabled){background:var(--background-muted, #e5e7eb);border-color:var(--border-hover, #9ca3af)}.ds-date-picker__action:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:1px}.ds-date-picker__action:disabled{cursor:not-allowed;opacity:.5}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7189
+ `, isInline: true, styles: [".ds-date-picker{display:inline-flex;flex-direction:column;background:var(--datepicker-bg, var(--background-main));border:1px solid var(--datepicker-border, var(--border-default));border-radius:var(--datepicker-radius, var(--radius-2));box-shadow:var(--datepicker-shadow, var(--shadow-2));overflow:hidden;-webkit-user-select:none;user-select:none}.ds-date-picker--sm{width:var(--datepicker-width-sm, 260px);font-size:var(--datepicker-font-size-sm, var(--font-size-2))}.ds-date-picker--sm .ds-date-picker__header{padding:var(--datepicker-header-padding-sm, var(--space-2))}.ds-date-picker--sm .ds-date-picker__nav{width:var(--datepicker-nav-size-sm, 24px);height:var(--datepicker-nav-size-sm, 24px)}.ds-date-picker--sm .ds-date-picker__day{width:var(--datepicker-day-size-sm, 28px);height:var(--datepicker-day-size-sm, 28px)}.ds-date-picker--sm .ds-date-picker__weekday{width:var(--datepicker-day-size-sm, 28px);height:var(--datepicker-weekday-height-sm, 24px)}.ds-date-picker--md{width:var(--datepicker-width-md, 300px);font-size:var(--datepicker-font-size-md, var(--font-size-3))}.ds-date-picker--md .ds-date-picker__header{padding:var(--datepicker-header-padding-md, var(--space-3))}.ds-date-picker--md .ds-date-picker__nav{width:var(--datepicker-nav-size-md, 32px);height:var(--datepicker-nav-size-md, 32px)}.ds-date-picker--md .ds-date-picker__day{width:var(--datepicker-day-size-md, 36px);height:var(--datepicker-day-size-md, 36px)}.ds-date-picker--md .ds-date-picker__weekday{width:var(--datepicker-day-size-md, 36px);height:var(--datepicker-weekday-height-md, 28px)}.ds-date-picker--lg{width:var(--datepicker-width-lg, 360px);font-size:var(--datepicker-font-size-lg, var(--font-size-4))}.ds-date-picker--lg .ds-date-picker__header{padding:var(--datepicker-header-padding-lg, var(--space-4))}.ds-date-picker--lg .ds-date-picker__nav{width:var(--datepicker-nav-size-lg, 40px);height:var(--datepicker-nav-size-lg, 40px)}.ds-date-picker--lg .ds-date-picker__day{width:var(--datepicker-day-size-lg, 44px);height:var(--datepicker-day-size-lg, 44px)}.ds-date-picker--lg .ds-date-picker__weekday{width:var(--datepicker-day-size-lg, 44px);height:var(--datepicker-weekday-height-lg, 32px)}.ds-date-picker--disabled{opacity:.6;pointer-events:none}.ds-date-picker__header{display:flex;align-items:center;justify-content:space-between;background:var(--datepicker-header-bg, var(--surface-raised));border-bottom:1px solid var(--datepicker-border, var(--border-default))}.ds-date-picker__title{display:flex;align-items:center;gap:var(--space-1)}.ds-date-picker__month-btn,.ds-date-picker__year-btn{padding:var(--space-1) var(--space-2);background:transparent;border:none;border-radius:var(--radius-1);color:var(--datepicker-title-color, var(--text-default));font-weight:600;cursor:pointer;transition:background-color var(--duration-fast, .15s) ease}.ds-date-picker__month-btn:hover:not(:disabled),.ds-date-picker__year-btn:hover:not(:disabled){background:var(--datepicker-btn-hover-bg, var(--surface-hover))}.ds-date-picker__month-btn:focus-visible,.ds-date-picker__year-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-date-picker__month-btn:disabled,.ds-date-picker__year-btn:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__nav{display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-1);color:var(--datepicker-nav-color, var(--text-muted));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease}.ds-date-picker__nav:hover:not(:disabled){background:var(--datepicker-btn-hover-bg, var(--surface-hover));color:var(--text-default)}.ds-date-picker__nav:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-date-picker__nav:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__calendar{padding:var(--datepicker-calendar-padding, var(--space-2))}.ds-date-picker__weekdays{display:flex;margin-bottom:var(--datepicker-calendar-gap, var(--space-1))}.ds-date-picker__weekday{display:flex;align-items:center;justify-content:center;color:var(--datepicker-weekday-color, var(--text-muted));font-size:.75em;font-weight:500;text-transform:uppercase}.ds-date-picker__days{display:flex;flex-direction:column;gap:var(--datepicker-calendar-gap, var(--space-1))}.ds-date-picker__week{display:flex}.ds-date-picker__day{display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-1);color:var(--datepicker-day-color, var(--text-default));font-weight:400;cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease}.ds-date-picker__day:hover:not(:disabled):not(.ds-date-picker__day--selected){background:var(--datepicker-day-hover-bg, var(--surface-hover))}.ds-date-picker__day:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px;z-index:1}.ds-date-picker__day--other-month{color:var(--datepicker-day-other-color, var(--text-muted))}.ds-date-picker__day--today{font-weight:600;border:1px solid var(--datepicker-today-border, var(--color-primary))}.ds-date-picker__day--selected{background:var(--datepicker-selected-bg, var(--color-primary));color:var(--datepicker-selected-text, var(--gray-50));font-weight:600}.ds-date-picker__day--selected:hover:not(:disabled){background:var(--datepicker-selected-hover-bg, color-mix(in oklab, var(--color-primary) 85%, var(--background-main)))}.ds-date-picker__day--range-start{background:var(--datepicker-selected-bg, var(--color-primary));color:var(--datepicker-selected-text, var(--gray-50));border-radius:var(--radius-1) 0 0 var(--radius-1)}.ds-date-picker__day--range-end{background:var(--datepicker-selected-bg, var(--color-primary));color:var(--datepicker-selected-text, var(--gray-50));border-radius:0 var(--radius-1) var(--radius-1) 0}.ds-date-picker__day--in-range{background:var(--datepicker-range-bg, color-mix(in oklab, var(--color-primary) 15%, transparent));border-radius:0}.ds-date-picker__day--in-preview{background:var(--datepicker-preview-bg, color-mix(in oklab, var(--color-primary) 10%, transparent));border-radius:0}.ds-date-picker__day--disabled{opacity:.4;cursor:not-allowed}.ds-date-picker__month-picker,.ds-date-picker__year-picker{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-2);padding:var(--space-3);max-height:240px;overflow-y:auto}.ds-date-picker__month-option,.ds-date-picker__year-option{padding:var(--space-2);background:transparent;border:1px solid transparent;border-radius:var(--radius-1);color:var(--datepicker-option-color, var(--text-default));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,border-color var(--duration-fast, .15s) ease}.ds-date-picker__month-option:hover:not(:disabled),.ds-date-picker__year-option:hover:not(:disabled){background:var(--datepicker-option-hover-bg, var(--surface-hover));border-color:var(--border-default)}.ds-date-picker__month-option:focus-visible,.ds-date-picker__year-option:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-date-picker__month-option--selected,.ds-date-picker__year-option--selected{background:var(--datepicker-selected-bg, var(--color-primary));color:var(--datepicker-selected-text, var(--gray-50));border-color:var(--datepicker-selected-bg, var(--color-primary))}.ds-date-picker__month-option--selected:hover:not(:disabled),.ds-date-picker__year-option--selected:hover:not(:disabled){background:var(--datepicker-selected-hover-bg, color-mix(in oklab, var(--color-primary) 85%, var(--background-main)));border-color:var(--datepicker-selected-hover-bg, color-mix(in oklab, var(--color-primary) 85%, var(--background-main)))}.ds-date-picker__month-option:disabled,.ds-date-picker__year-option:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__actions{display:flex;justify-content:center;gap:var(--space-2);padding:var(--space-2);border-top:1px solid var(--datepicker-border, var(--border-default));background:var(--datepicker-footer-bg, var(--surface-raised))}.ds-date-picker__action{padding:var(--space-1) var(--space-3);background:transparent;border:1px solid var(--border-default);border-radius:var(--radius-1);color:var(--datepicker-action-color, var(--text-default));font-size:.875em;cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,border-color var(--duration-fast, .15s) ease}.ds-date-picker__action:hover:not(:disabled){background:var(--datepicker-action-hover-bg, var(--surface-hover));border-color:var(--border-strong)}.ds-date-picker__action:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-date-picker__action:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__presets{display:flex;flex-wrap:wrap;gap:var(--space-1);padding:var(--space-2);border-top:1px solid var(--datepicker-border, var(--border-default));background:var(--datepicker-presets-bg, var(--surface-raised))}.ds-date-picker__preset{padding:var(--space-1) var(--space-2);background:var(--datepicker-preset-bg, transparent);border:1px solid var(--datepicker-preset-border, var(--border-default));border-radius:var(--radius-1);color:var(--datepicker-preset-color, var(--text-muted));font-size:.75em;font-weight:500;cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,border-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease}.ds-date-picker__preset:hover:not(:disabled){background:var(--datepicker-preset-hover-bg, var(--surface-hover));border-color:var(--color-primary);color:var(--text-default)}.ds-date-picker__preset:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-date-picker__preset:disabled{cursor:not-allowed;opacity:.5}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7076
7190
  }
7077
7191
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsDatePicker, decorators: [{
7078
7192
  type: Component,
@@ -7176,13 +7290,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
7176
7290
  [class.ds-date-picker__day--range-start]="day.isRangeStart"
7177
7291
  [class.ds-date-picker__day--range-end]="day.isRangeEnd"
7178
7292
  [class.ds-date-picker__day--in-range]="day.isInRange"
7293
+ [class.ds-date-picker__day--in-preview]="day.isInPreviewRange"
7179
7294
  [class.ds-date-picker__day--disabled]="day.isDisabled"
7180
7295
  [disabled]="disabled() || day.isDisabled"
7181
7296
  role="gridcell"
7182
7297
  [attr.aria-selected]="day.isSelected"
7183
7298
  [attr.aria-label]="day.ariaLabel"
7184
7299
  (click)="selectDate(day.date)"
7185
- (keydown)="onDayKeydown($event, day.date)">
7300
+ (keydown)="onDayKeydown($event, day.date)"
7301
+ (mouseenter)="onDayMouseEnter(day.date)"
7302
+ (mouseleave)="onDayMouseLeave()">
7186
7303
  {{ day.dayNumber }}
7187
7304
  </button>
7188
7305
  }
@@ -7191,6 +7308,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
7191
7308
  </div>
7192
7309
  </div>
7193
7310
 
7311
+ <!-- Presets (mode range uniquement) -->
7312
+ @if (showPresets() && mode() === 'range') {
7313
+ <div class="ds-date-picker__presets">
7314
+ @for (preset of effectivePresets(); track preset.label) {
7315
+ <button
7316
+ type="button"
7317
+ class="ds-date-picker__preset"
7318
+ [disabled]="disabled()"
7319
+ (click)="selectPreset(preset)">
7320
+ {{ preset.label }}
7321
+ </button>
7322
+ }
7323
+ </div>
7324
+ }
7325
+
7194
7326
  <!-- Actions -->
7195
7327
  @if (showTodayButton() || showClearButton()) {
7196
7328
  <div class="ds-date-picker__actions">
@@ -7222,8 +7354,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
7222
7354
  useExisting: forwardRef(() => DsDatePicker),
7223
7355
  multi: true,
7224
7356
  },
7225
- ], styles: [".ds-date-picker{display:inline-flex;flex-direction:column;background:var(--datepicker-bg, var(--background-main, #fff));border:1px solid var(--datepicker-border, var(--border-default, #d1d5db));border-radius:var(--datepicker-radius, var(--radius-2, 6px));box-shadow:var(--datepicker-shadow, var(--shadow-md, 0 4px 6px -1px rgba(0, 0, 0, .1)));overflow:hidden;-webkit-user-select:none;user-select:none}.ds-date-picker--sm{width:260px;font-size:var(--font-size-2, .875rem)}.ds-date-picker--sm .ds-date-picker__header{padding:var(--space-2, .5rem)}.ds-date-picker--sm .ds-date-picker__nav{width:24px;height:24px}.ds-date-picker--sm .ds-date-picker__day{width:28px;height:28px}.ds-date-picker--sm .ds-date-picker__weekday{width:28px;height:24px}.ds-date-picker--md{width:300px;font-size:var(--font-size-3, 1rem)}.ds-date-picker--md .ds-date-picker__header{padding:var(--space-3, .75rem)}.ds-date-picker--md .ds-date-picker__nav{width:32px;height:32px}.ds-date-picker--md .ds-date-picker__day{width:36px;height:36px}.ds-date-picker--md .ds-date-picker__weekday{width:36px;height:28px}.ds-date-picker--lg{width:360px;font-size:var(--font-size-4, 1.125rem)}.ds-date-picker--lg .ds-date-picker__header{padding:var(--space-4, 1rem)}.ds-date-picker--lg .ds-date-picker__nav{width:40px;height:40px}.ds-date-picker--lg .ds-date-picker__day{width:44px;height:44px}.ds-date-picker--lg .ds-date-picker__weekday{width:44px;height:32px}.ds-date-picker--disabled{opacity:.6;pointer-events:none}.ds-date-picker__header{display:flex;align-items:center;justify-content:space-between;background:var(--datepicker-header-bg, var(--background-subtle, #f9fafb));border-bottom:1px solid var(--datepicker-border, var(--border-default, #d1d5db))}.ds-date-picker__title{display:flex;align-items:center;gap:var(--space-1, .25rem)}.ds-date-picker__month-btn,.ds-date-picker__year-btn{padding:var(--space-1, .25rem) var(--space-2, .5rem);background:transparent;border:none;border-radius:var(--radius-1, 4px);color:var(--text-default, #1f2937);font-weight:600;cursor:pointer;transition:background-color .15s ease}.ds-date-picker__month-btn:hover:not(:disabled),.ds-date-picker__year-btn:hover:not(:disabled){background:var(--background-muted, #e5e7eb)}.ds-date-picker__month-btn:focus-visible,.ds-date-picker__year-btn:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:1px}.ds-date-picker__month-btn:disabled,.ds-date-picker__year-btn:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__nav{display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-1, 4px);color:var(--text-muted, #6b7280);cursor:pointer;transition:background-color .15s ease,color .15s ease}.ds-date-picker__nav:hover:not(:disabled){background:var(--background-muted, #e5e7eb);color:var(--text-default, #1f2937)}.ds-date-picker__nav:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:1px}.ds-date-picker__nav:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__calendar{padding:var(--space-2, .5rem)}.ds-date-picker__weekdays{display:flex;margin-bottom:var(--space-1, .25rem)}.ds-date-picker__weekday{display:flex;align-items:center;justify-content:center;color:var(--text-muted, #6b7280);font-size:.75em;font-weight:500;text-transform:uppercase}.ds-date-picker__days{display:flex;flex-direction:column;gap:var(--space-1, .25rem)}.ds-date-picker__week{display:flex}.ds-date-picker__day{display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-1, 4px);color:var(--text-default, #1f2937);font-weight:400;cursor:pointer;transition:background-color .15s ease,color .15s ease}.ds-date-picker__day:hover:not(:disabled):not(.ds-date-picker__day--selected){background:var(--background-subtle, #f3f4f6)}.ds-date-picker__day:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:-2px;z-index:1}.ds-date-picker__day--other-month{color:var(--text-muted, #9ca3af)}.ds-date-picker__day--today{font-weight:600;border:1px solid var(--color-primary, #3b82f6)}.ds-date-picker__day--selected{background:var(--color-primary, #3b82f6);color:var(--color-primary-text, #fff);font-weight:600}.ds-date-picker__day--selected:hover:not(:disabled){background:var(--color-primary-hover, #2563eb)}.ds-date-picker__day--range-start{background:var(--color-primary, #3b82f6);color:var(--color-primary-text, #fff);border-radius:var(--radius-1, 4px) 0 0 var(--radius-1, 4px)}.ds-date-picker__day--range-end{background:var(--color-primary, #3b82f6);color:var(--color-primary-text, #fff);border-radius:0 var(--radius-1, 4px) var(--radius-1, 4px) 0}.ds-date-picker__day--in-range{background:var(--color-primary-subtle, rgba(59, 130, 246, .15));border-radius:0}.ds-date-picker__day--disabled{opacity:.4;cursor:not-allowed}.ds-date-picker__month-picker,.ds-date-picker__year-picker{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-2, .5rem);padding:var(--space-3, .75rem);max-height:240px;overflow-y:auto}.ds-date-picker__month-option,.ds-date-picker__year-option{padding:var(--space-2, .5rem);background:transparent;border:1px solid transparent;border-radius:var(--radius-1, 4px);color:var(--text-default, #1f2937);cursor:pointer;transition:background-color .15s ease,border-color .15s ease}.ds-date-picker__month-option:hover:not(:disabled),.ds-date-picker__year-option:hover:not(:disabled){background:var(--background-subtle, #f3f4f6);border-color:var(--border-default, #d1d5db)}.ds-date-picker__month-option:focus-visible,.ds-date-picker__year-option:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:1px}.ds-date-picker__month-option--selected,.ds-date-picker__year-option--selected{background:var(--color-primary, #3b82f6);color:var(--color-primary-text, #fff);border-color:var(--color-primary, #3b82f6)}.ds-date-picker__month-option--selected:hover:not(:disabled),.ds-date-picker__year-option--selected:hover:not(:disabled){background:var(--color-primary-hover, #2563eb);border-color:var(--color-primary-hover, #2563eb)}.ds-date-picker__month-option:disabled,.ds-date-picker__year-option:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__actions{display:flex;justify-content:center;gap:var(--space-2, .5rem);padding:var(--space-2, .5rem);border-top:1px solid var(--datepicker-border, var(--border-default, #d1d5db));background:var(--datepicker-footer-bg, var(--background-subtle, #f9fafb))}.ds-date-picker__action{padding:var(--space-1, .25rem) var(--space-3, .75rem);background:transparent;border:1px solid var(--border-default, #d1d5db);border-radius:var(--radius-1, 4px);color:var(--text-default, #1f2937);font-size:.875em;cursor:pointer;transition:background-color .15s ease,border-color .15s ease}.ds-date-picker__action:hover:not(:disabled){background:var(--background-muted, #e5e7eb);border-color:var(--border-hover, #9ca3af)}.ds-date-picker__action:focus-visible{outline:2px solid var(--color-primary, #3b82f6);outline-offset:1px}.ds-date-picker__action:disabled{cursor:not-allowed;opacity:.5}\n"] }]
7226
- }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], showTodayButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTodayButton", required: false }] }], showClearButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClearButton", required: false }] }], todayLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "todayLabel", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], prevMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "prevMonthLabel", required: false }] }], nextMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthLabel", required: false }] }], dateChange: [{ type: i0.Output, args: ["dateChange"] }], rangeChange: [{ type: i0.Output, args: ["rangeChange"] }] } });
7357
+ ], styles: [".ds-date-picker{display:inline-flex;flex-direction:column;background:var(--datepicker-bg, var(--background-main));border:1px solid var(--datepicker-border, var(--border-default));border-radius:var(--datepicker-radius, var(--radius-2));box-shadow:var(--datepicker-shadow, var(--shadow-2));overflow:hidden;-webkit-user-select:none;user-select:none}.ds-date-picker--sm{width:var(--datepicker-width-sm, 260px);font-size:var(--datepicker-font-size-sm, var(--font-size-2))}.ds-date-picker--sm .ds-date-picker__header{padding:var(--datepicker-header-padding-sm, var(--space-2))}.ds-date-picker--sm .ds-date-picker__nav{width:var(--datepicker-nav-size-sm, 24px);height:var(--datepicker-nav-size-sm, 24px)}.ds-date-picker--sm .ds-date-picker__day{width:var(--datepicker-day-size-sm, 28px);height:var(--datepicker-day-size-sm, 28px)}.ds-date-picker--sm .ds-date-picker__weekday{width:var(--datepicker-day-size-sm, 28px);height:var(--datepicker-weekday-height-sm, 24px)}.ds-date-picker--md{width:var(--datepicker-width-md, 300px);font-size:var(--datepicker-font-size-md, var(--font-size-3))}.ds-date-picker--md .ds-date-picker__header{padding:var(--datepicker-header-padding-md, var(--space-3))}.ds-date-picker--md .ds-date-picker__nav{width:var(--datepicker-nav-size-md, 32px);height:var(--datepicker-nav-size-md, 32px)}.ds-date-picker--md .ds-date-picker__day{width:var(--datepicker-day-size-md, 36px);height:var(--datepicker-day-size-md, 36px)}.ds-date-picker--md .ds-date-picker__weekday{width:var(--datepicker-day-size-md, 36px);height:var(--datepicker-weekday-height-md, 28px)}.ds-date-picker--lg{width:var(--datepicker-width-lg, 360px);font-size:var(--datepicker-font-size-lg, var(--font-size-4))}.ds-date-picker--lg .ds-date-picker__header{padding:var(--datepicker-header-padding-lg, var(--space-4))}.ds-date-picker--lg .ds-date-picker__nav{width:var(--datepicker-nav-size-lg, 40px);height:var(--datepicker-nav-size-lg, 40px)}.ds-date-picker--lg .ds-date-picker__day{width:var(--datepicker-day-size-lg, 44px);height:var(--datepicker-day-size-lg, 44px)}.ds-date-picker--lg .ds-date-picker__weekday{width:var(--datepicker-day-size-lg, 44px);height:var(--datepicker-weekday-height-lg, 32px)}.ds-date-picker--disabled{opacity:.6;pointer-events:none}.ds-date-picker__header{display:flex;align-items:center;justify-content:space-between;background:var(--datepicker-header-bg, var(--surface-raised));border-bottom:1px solid var(--datepicker-border, var(--border-default))}.ds-date-picker__title{display:flex;align-items:center;gap:var(--space-1)}.ds-date-picker__month-btn,.ds-date-picker__year-btn{padding:var(--space-1) var(--space-2);background:transparent;border:none;border-radius:var(--radius-1);color:var(--datepicker-title-color, var(--text-default));font-weight:600;cursor:pointer;transition:background-color var(--duration-fast, .15s) ease}.ds-date-picker__month-btn:hover:not(:disabled),.ds-date-picker__year-btn:hover:not(:disabled){background:var(--datepicker-btn-hover-bg, var(--surface-hover))}.ds-date-picker__month-btn:focus-visible,.ds-date-picker__year-btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-date-picker__month-btn:disabled,.ds-date-picker__year-btn:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__nav{display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-1);color:var(--datepicker-nav-color, var(--text-muted));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease}.ds-date-picker__nav:hover:not(:disabled){background:var(--datepicker-btn-hover-bg, var(--surface-hover));color:var(--text-default)}.ds-date-picker__nav:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-date-picker__nav:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__calendar{padding:var(--datepicker-calendar-padding, var(--space-2))}.ds-date-picker__weekdays{display:flex;margin-bottom:var(--datepicker-calendar-gap, var(--space-1))}.ds-date-picker__weekday{display:flex;align-items:center;justify-content:center;color:var(--datepicker-weekday-color, var(--text-muted));font-size:.75em;font-weight:500;text-transform:uppercase}.ds-date-picker__days{display:flex;flex-direction:column;gap:var(--datepicker-calendar-gap, var(--space-1))}.ds-date-picker__week{display:flex}.ds-date-picker__day{display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-1);color:var(--datepicker-day-color, var(--text-default));font-weight:400;cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease}.ds-date-picker__day:hover:not(:disabled):not(.ds-date-picker__day--selected){background:var(--datepicker-day-hover-bg, var(--surface-hover))}.ds-date-picker__day:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px;z-index:1}.ds-date-picker__day--other-month{color:var(--datepicker-day-other-color, var(--text-muted))}.ds-date-picker__day--today{font-weight:600;border:1px solid var(--datepicker-today-border, var(--color-primary))}.ds-date-picker__day--selected{background:var(--datepicker-selected-bg, var(--color-primary));color:var(--datepicker-selected-text, var(--gray-50));font-weight:600}.ds-date-picker__day--selected:hover:not(:disabled){background:var(--datepicker-selected-hover-bg, color-mix(in oklab, var(--color-primary) 85%, var(--background-main)))}.ds-date-picker__day--range-start{background:var(--datepicker-selected-bg, var(--color-primary));color:var(--datepicker-selected-text, var(--gray-50));border-radius:var(--radius-1) 0 0 var(--radius-1)}.ds-date-picker__day--range-end{background:var(--datepicker-selected-bg, var(--color-primary));color:var(--datepicker-selected-text, var(--gray-50));border-radius:0 var(--radius-1) var(--radius-1) 0}.ds-date-picker__day--in-range{background:var(--datepicker-range-bg, color-mix(in oklab, var(--color-primary) 15%, transparent));border-radius:0}.ds-date-picker__day--in-preview{background:var(--datepicker-preview-bg, color-mix(in oklab, var(--color-primary) 10%, transparent));border-radius:0}.ds-date-picker__day--disabled{opacity:.4;cursor:not-allowed}.ds-date-picker__month-picker,.ds-date-picker__year-picker{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-2);padding:var(--space-3);max-height:240px;overflow-y:auto}.ds-date-picker__month-option,.ds-date-picker__year-option{padding:var(--space-2);background:transparent;border:1px solid transparent;border-radius:var(--radius-1);color:var(--datepicker-option-color, var(--text-default));cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,border-color var(--duration-fast, .15s) ease}.ds-date-picker__month-option:hover:not(:disabled),.ds-date-picker__year-option:hover:not(:disabled){background:var(--datepicker-option-hover-bg, var(--surface-hover));border-color:var(--border-default)}.ds-date-picker__month-option:focus-visible,.ds-date-picker__year-option:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-date-picker__month-option--selected,.ds-date-picker__year-option--selected{background:var(--datepicker-selected-bg, var(--color-primary));color:var(--datepicker-selected-text, var(--gray-50));border-color:var(--datepicker-selected-bg, var(--color-primary))}.ds-date-picker__month-option--selected:hover:not(:disabled),.ds-date-picker__year-option--selected:hover:not(:disabled){background:var(--datepicker-selected-hover-bg, color-mix(in oklab, var(--color-primary) 85%, var(--background-main)));border-color:var(--datepicker-selected-hover-bg, color-mix(in oklab, var(--color-primary) 85%, var(--background-main)))}.ds-date-picker__month-option:disabled,.ds-date-picker__year-option:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__actions{display:flex;justify-content:center;gap:var(--space-2);padding:var(--space-2);border-top:1px solid var(--datepicker-border, var(--border-default));background:var(--datepicker-footer-bg, var(--surface-raised))}.ds-date-picker__action{padding:var(--space-1) var(--space-3);background:transparent;border:1px solid var(--border-default);border-radius:var(--radius-1);color:var(--datepicker-action-color, var(--text-default));font-size:.875em;cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,border-color var(--duration-fast, .15s) ease}.ds-date-picker__action:hover:not(:disabled){background:var(--datepicker-action-hover-bg, var(--surface-hover));border-color:var(--border-strong)}.ds-date-picker__action:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-date-picker__action:disabled{cursor:not-allowed;opacity:.5}.ds-date-picker__presets{display:flex;flex-wrap:wrap;gap:var(--space-1);padding:var(--space-2);border-top:1px solid var(--datepicker-border, var(--border-default));background:var(--datepicker-presets-bg, var(--surface-raised))}.ds-date-picker__preset{padding:var(--space-1) var(--space-2);background:var(--datepicker-preset-bg, transparent);border:1px solid var(--datepicker-preset-border, var(--border-default));border-radius:var(--radius-1);color:var(--datepicker-preset-color, var(--text-muted));font-size:.75em;font-weight:500;cursor:pointer;transition:background-color var(--duration-fast, .15s) ease,border-color var(--duration-fast, .15s) ease,color var(--duration-fast, .15s) ease}.ds-date-picker__preset:hover:not(:disabled){background:var(--datepicker-preset-hover-bg, var(--surface-hover));border-color:var(--color-primary);color:var(--text-default)}.ds-date-picker__preset:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.ds-date-picker__preset:disabled{cursor:not-allowed;opacity:.5}\n"] }]
7358
+ }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], showTodayButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTodayButton", required: false }] }], showClearButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClearButton", required: false }] }], todayLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "todayLabel", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], prevMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "prevMonthLabel", required: false }] }], nextMonthLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextMonthLabel", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }], showPresets: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPresets", required: false }] }], showRangePreview: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRangePreview", required: false }] }], dateChange: [{ type: i0.Output, args: ["dateChange"] }], rangeChange: [{ type: i0.Output, args: ["rangeChange"] }] } });
7227
7359
 
7228
7360
  class DsAvatar {
7229
7361
  /** URL de l'image avatar */
@@ -7304,11 +7436,11 @@ class DsAvatar {
7304
7436
  this.imageError.set(false);
7305
7437
  }
7306
7438
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsAvatar, deps: [], target: i0.ɵɵFactoryTarget.Component });
7307
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsAvatar, isStandalone: true, selector: "ds-avatar", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, initials: { classPropertyName: "initials", publicName: "initials", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, autoColor: { classPropertyName: "autoColor", publicName: "autoColor", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n [ngClass]=\"containerClasses()\"\n [style.background-color]=\"generatedBgColor()\"\n [attr.role]=\"showImage() ? null : 'img'\"\n [attr.aria-label]=\"showImage() ? null : ariaLabel()\"\n>\n @if (showImage()) {\n <img\n [src]=\"src()\"\n [alt]=\"ariaLabel()\"\n class=\"ds-avatar__image\"\n (error)=\"onImageError()\"\n (load)=\"onImageLoad()\"\n />\n } @else {\n <span class=\"ds-avatar__initials\" aria-hidden=\"true\">\n {{ displayInitials() }}\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:inline-block}.ds-avatar{display:flex;align-items:center;justify-content:center;overflow:hidden;background-color:var(--avatar-bg);color:var(--avatar-text);font-family:var(--font-family-base);font-weight:var(--font-weight-medium);-webkit-user-select:none;user-select:none}.ds-avatar--sm{width:var(--avatar-size-sm);height:var(--avatar-size-sm);font-size:var(--avatar-font-size-sm)}.ds-avatar--md{width:var(--avatar-size-md);height:var(--avatar-size-md);font-size:var(--avatar-font-size-md)}.ds-avatar--lg{width:var(--avatar-size-lg);height:var(--avatar-size-lg);font-size:var(--avatar-font-size-lg)}.ds-avatar--xl{width:var(--avatar-size-xl);height:var(--avatar-size-xl);font-size:var(--avatar-font-size-xl)}.ds-avatar--circle{border-radius:var(--avatar-radius-circle)}.ds-avatar--rounded{border-radius:var(--avatar-radius-rounded)}.ds-avatar--square{border-radius:var(--avatar-radius-square)}.ds-avatar--initials{background-color:var(--avatar-placeholder-bg);color:var(--avatar-placeholder-text)}.ds-avatar--has-image{background-color:transparent}.ds-avatar__image{width:100%;height:100%;object-fit:cover}.ds-avatar__initials{line-height:1;text-transform:uppercase;letter-spacing:var(--letter-spacing-tight)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
7439
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsAvatar, isStandalone: true, selector: "ds-avatar", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, initials: { classPropertyName: "initials", publicName: "initials", isSignal: true, isRequired: false, transformFunction: null }, shape: { classPropertyName: "shape", publicName: "shape", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, autoColor: { classPropertyName: "autoColor", publicName: "autoColor", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n [ngClass]=\"containerClasses()\"\n [style.background-color]=\"generatedBgColor()\"\n [attr.role]=\"showImage() ? null : 'img'\"\n [attr.aria-label]=\"showImage() ? null : ariaLabel()\"\n>\n @if (showImage()) {\n <img\n [src]=\"src()\"\n [alt]=\"ariaLabel()\"\n class=\"ds-avatar__image\"\n (error)=\"onImageError()\"\n (load)=\"onImageLoad()\"\n />\n } @else {\n <span class=\"ds-avatar__initials\" aria-hidden=\"true\">\n {{ displayInitials() }}\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:inline-block}.ds-avatar{display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;background-color:var(--avatar-bg);color:var(--avatar-text);font-family:var(--font-family-base);font-weight:var(--font-weight-medium);-webkit-user-select:none;user-select:none;flex-shrink:0}.ds-avatar--sm{width:var(--avatar-size-sm);height:var(--avatar-size-sm);font-size:var(--avatar-font-size-sm)}.ds-avatar--md{width:var(--avatar-size-md);height:var(--avatar-size-md);font-size:var(--avatar-font-size-md)}.ds-avatar--lg{width:var(--avatar-size-lg);height:var(--avatar-size-lg);font-size:var(--avatar-font-size-lg)}.ds-avatar--xl{width:var(--avatar-size-xl);height:var(--avatar-size-xl);font-size:var(--avatar-font-size-xl)}.ds-avatar--circle{border-radius:var(--avatar-radius-circle)}.ds-avatar--rounded{border-radius:var(--avatar-radius-rounded)}.ds-avatar--square{border-radius:var(--avatar-radius-square)}.ds-avatar--initials{background-color:var(--avatar-placeholder-bg);color:var(--avatar-placeholder-text)}.ds-avatar--has-image{background-color:transparent}.ds-avatar__image{width:100%;height:100%;object-fit:cover;border-radius:inherit;display:block}.ds-avatar__initials{line-height:1;text-transform:uppercase;letter-spacing:var(--letter-spacing-tight)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
7308
7440
  }
7309
7441
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsAvatar, decorators: [{
7310
7442
  type: Component,
7311
- args: [{ selector: 'ds-avatar', standalone: true, imports: [CommonModule], template: "<div\n [ngClass]=\"containerClasses()\"\n [style.background-color]=\"generatedBgColor()\"\n [attr.role]=\"showImage() ? null : 'img'\"\n [attr.aria-label]=\"showImage() ? null : ariaLabel()\"\n>\n @if (showImage()) {\n <img\n [src]=\"src()\"\n [alt]=\"ariaLabel()\"\n class=\"ds-avatar__image\"\n (error)=\"onImageError()\"\n (load)=\"onImageLoad()\"\n />\n } @else {\n <span class=\"ds-avatar__initials\" aria-hidden=\"true\">\n {{ displayInitials() }}\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:inline-block}.ds-avatar{display:flex;align-items:center;justify-content:center;overflow:hidden;background-color:var(--avatar-bg);color:var(--avatar-text);font-family:var(--font-family-base);font-weight:var(--font-weight-medium);-webkit-user-select:none;user-select:none}.ds-avatar--sm{width:var(--avatar-size-sm);height:var(--avatar-size-sm);font-size:var(--avatar-font-size-sm)}.ds-avatar--md{width:var(--avatar-size-md);height:var(--avatar-size-md);font-size:var(--avatar-font-size-md)}.ds-avatar--lg{width:var(--avatar-size-lg);height:var(--avatar-size-lg);font-size:var(--avatar-font-size-lg)}.ds-avatar--xl{width:var(--avatar-size-xl);height:var(--avatar-size-xl);font-size:var(--avatar-font-size-xl)}.ds-avatar--circle{border-radius:var(--avatar-radius-circle)}.ds-avatar--rounded{border-radius:var(--avatar-radius-rounded)}.ds-avatar--square{border-radius:var(--avatar-radius-square)}.ds-avatar--initials{background-color:var(--avatar-placeholder-bg);color:var(--avatar-placeholder-text)}.ds-avatar--has-image{background-color:transparent}.ds-avatar__image{width:100%;height:100%;object-fit:cover}.ds-avatar__initials{line-height:1;text-transform:uppercase;letter-spacing:var(--letter-spacing-tight)}\n"] }]
7443
+ args: [{ selector: 'ds-avatar', standalone: true, imports: [CommonModule], template: "<div\n [ngClass]=\"containerClasses()\"\n [style.background-color]=\"generatedBgColor()\"\n [attr.role]=\"showImage() ? null : 'img'\"\n [attr.aria-label]=\"showImage() ? null : ariaLabel()\"\n>\n @if (showImage()) {\n <img\n [src]=\"src()\"\n [alt]=\"ariaLabel()\"\n class=\"ds-avatar__image\"\n (error)=\"onImageError()\"\n (load)=\"onImageLoad()\"\n />\n } @else {\n <span class=\"ds-avatar__initials\" aria-hidden=\"true\">\n {{ displayInitials() }}\n </span>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:inline-block}.ds-avatar{display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;background-color:var(--avatar-bg);color:var(--avatar-text);font-family:var(--font-family-base);font-weight:var(--font-weight-medium);-webkit-user-select:none;user-select:none;flex-shrink:0}.ds-avatar--sm{width:var(--avatar-size-sm);height:var(--avatar-size-sm);font-size:var(--avatar-font-size-sm)}.ds-avatar--md{width:var(--avatar-size-md);height:var(--avatar-size-md);font-size:var(--avatar-font-size-md)}.ds-avatar--lg{width:var(--avatar-size-lg);height:var(--avatar-size-lg);font-size:var(--avatar-font-size-lg)}.ds-avatar--xl{width:var(--avatar-size-xl);height:var(--avatar-size-xl);font-size:var(--avatar-font-size-xl)}.ds-avatar--circle{border-radius:var(--avatar-radius-circle)}.ds-avatar--rounded{border-radius:var(--avatar-radius-rounded)}.ds-avatar--square{border-radius:var(--avatar-radius-square)}.ds-avatar--initials{background-color:var(--avatar-placeholder-bg);color:var(--avatar-placeholder-text)}.ds-avatar--has-image{background-color:transparent}.ds-avatar__image{width:100%;height:100%;object-fit:cover;border-radius:inherit;display:block}.ds-avatar__initials{line-height:1;text-transform:uppercase;letter-spacing:var(--letter-spacing-tight)}\n"] }]
7312
7444
  }], propDecorators: { src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], alt: [{ type: i0.Input, args: [{ isSignal: true, alias: "alt", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], initials: [{ type: i0.Input, args: [{ isSignal: true, alias: "initials", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], autoColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoColor", required: false }] }] } });
7313
7445
 
7314
7446
  class DsMenu {
@@ -7522,7 +7654,7 @@ class DsMenu {
7522
7654
  }
7523
7655
  }
7524
7656
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
7525
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsMenu, isStandalone: true, selector: "ds-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, closeOnSelect: { classPropertyName: "closeOnSelect", publicName: "closeOnSelect", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelected: "itemSelected", opened: "opened", closed: "closed" }, viewQueries: [{ propertyName: "triggerElement", first: true, predicate: ["menuTrigger"], descendants: true, read: ElementRef }, { propertyName: "menuItemsRef", predicate: ["menuItemRef"], descendants: true }], ngImport: i0, template: "<div\n #menuTrigger\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"onTriggerClick($event)\"\n (contextmenu)=\"onTriggerContextMenu($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"isOpen()\"\n class=\"ds-menu__trigger\"\n>\n <ng-content select=\"[dsMenuTrigger]\"></ng-content>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'ds-menu-backdrop'\"\n (backdropClick)=\"onBackdropClick()\"\n (detach)=\"close(false)\"\n>\n <div\n [ngClass]=\"menuClasses()\"\n role=\"menu\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n (keydown)=\"onMenuKeydown($event)\"\n >\n @for (item of items(); track item.id; let index = $index) {\n @if (item.dividerBefore) {\n <div class=\"ds-menu__divider\" role=\"separator\"></div>\n }\n <button\n #menuItemRef\n type=\"button\"\n class=\"ds-menu__item\"\n [class.ds-menu__item--disabled]=\"item.disabled\"\n [class.ds-menu__item--active]=\"activeIndex() === index\"\n [attr.id]=\"'menu-item-' + item.id\"\n [attr.aria-disabled]=\"item.disabled || null\"\n [disabled]=\"item.disabled\"\n role=\"menuitem\"\n (click)=\"selectItem(item)\"\n (mouseenter)=\"onItemMouseEnter(index)\"\n >\n @if (item.icon) {\n <fa-icon [icon]=\"item.icon\" class=\"ds-menu__item-icon\"></fa-icon>\n }\n <span class=\"ds-menu__item-label\">{{ item.label }}</span>\n </button>\n }\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{display:inline-block}.ds-menu__trigger{display:inline-block;cursor:pointer}.ds-menu__panel{background:var(--menu-bg);border:1px solid var(--menu-border);border-radius:var(--menu-radius);box-shadow:var(--menu-shadow);padding:var(--menu-padding);min-width:var(--menu-min-width);max-width:var(--menu-max-width)}.ds-menu__panel--sm{--menu-item-height: var(--menu-item-height-sm);--menu-font-size: var(--menu-font-size-sm)}.ds-menu__panel--md{--menu-item-height: var(--menu-item-height-md);--menu-font-size: var(--menu-font-size-md)}.ds-menu__panel--lg{--menu-item-height: var(--menu-item-height-lg);--menu-font-size: var(--menu-font-size-lg)}.ds-menu__item{display:flex;align-items:center;width:100%;min-height:var(--menu-item-height);padding:var(--menu-item-padding-y) var(--menu-item-padding-x);gap:var(--menu-item-gap);border:none;border-radius:var(--menu-item-radius);background:transparent;color:var(--menu-item-text);font-size:var(--menu-font-size);font-family:var(--font-family-base);cursor:pointer;text-align:left;transition:background-color var(--duration-fast) var(--easing-default),color var(--duration-fast) var(--easing-default)}.ds-menu__item:hover:not(.ds-menu__item--disabled),.ds-menu__item--active:not(.ds-menu__item--disabled){background:var(--menu-item-hover-bg);color:var(--menu-item-hover-text)}.ds-menu__item:focus-visible{outline:2px solid var(--focus-color);outline-offset:-2px}.ds-menu__item--disabled{color:var(--menu-item-disabled-text);cursor:not-allowed}.ds-menu__item--disabled .ds-menu__item-icon{color:var(--menu-item-disabled-icon)}.ds-menu__item-icon{flex-shrink:0;color:var(--menu-item-icon);font-size:1em}.ds-menu__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-menu__divider{height:1px;margin:var(--menu-divider-margin) 0;background:var(--menu-divider)}::ng-deep .ds-menu-backdrop{background:var(--menu-backdrop)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { 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"] }] });
7657
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsMenu, isStandalone: true, selector: "ds-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, closeOnSelect: { classPropertyName: "closeOnSelect", publicName: "closeOnSelect", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelected: "itemSelected", opened: "opened", closed: "closed" }, viewQueries: [{ propertyName: "triggerElement", first: true, predicate: ["menuTrigger"], descendants: true, read: ElementRef }, { propertyName: "menuItemsRef", predicate: ["menuItemRef"], descendants: true }], ngImport: i0, template: "<div\n #menuTrigger\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n (click)=\"onTriggerClick($event)\"\n (contextmenu)=\"onTriggerContextMenu($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"isOpen()\"\n class=\"ds-menu__trigger\"\n>\n <ng-content select=\"[dsMenuTrigger]\"></ng-content>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayBackdropClass]=\"'ds-menu-backdrop'\"\n (backdropClick)=\"onBackdropClick()\"\n (detach)=\"close(false)\"\n>\n <div\n [ngClass]=\"menuClasses()\"\n role=\"menu\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n (keydown)=\"onMenuKeydown($event)\"\n >\n @for (item of items(); track item.id; let index = $index) {\n @if (item.dividerBefore) {\n <div class=\"ds-menu__divider\" role=\"separator\"></div>\n }\n <button\n #menuItemRef\n type=\"button\"\n class=\"ds-menu__item\"\n [class.ds-menu__item--disabled]=\"item.disabled\"\n [class.ds-menu__item--active]=\"activeIndex() === index\"\n [attr.id]=\"'menu-item-' + item.id\"\n [attr.aria-disabled]=\"item.disabled || null\"\n [disabled]=\"item.disabled\"\n role=\"menuitem\"\n (click)=\"selectItem(item)\"\n (mouseenter)=\"onItemMouseEnter(index)\"\n >\n @if (item.icon) {\n <fa-icon [icon]=\"item.icon\" class=\"ds-menu__item-icon\"></fa-icon>\n }\n <span class=\"ds-menu__item-label\">{{ item.label }}</span>\n </button>\n }\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{display:inline-block}.ds-menu__trigger{display:inline-block;cursor:pointer}.ds-menu__panel{background:var(--menu-bg);border:1px solid var(--menu-border);border-radius:var(--menu-radius);box-shadow:var(--menu-shadow);padding:var(--menu-padding);min-width:var(--menu-min-width);max-width:var(--menu-max-width)}.ds-menu__panel--sm{--menu-item-height: var(--menu-item-height-sm);--menu-font-size: var(--menu-font-size-sm)}.ds-menu__panel--md{--menu-item-height: var(--menu-item-height-md);--menu-font-size: var(--menu-font-size-md)}.ds-menu__panel--lg{--menu-item-height: var(--menu-item-height-lg);--menu-font-size: var(--menu-font-size-lg)}.ds-menu__item{display:flex;align-items:center;width:100%;min-height:var(--menu-item-height);padding:var(--menu-item-padding-y) var(--menu-item-padding-x);gap:var(--menu-item-gap);border:none;border-radius:var(--menu-item-radius);background:transparent;color:var(--menu-item-text);font-size:var(--menu-font-size);font-family:var(--font-family-base);cursor:pointer;text-align:left;transition:background-color var(--duration-fast) var(--easing-default),color var(--duration-fast) var(--easing-default)}.ds-menu__item:hover:not(.ds-menu__item--disabled),.ds-menu__item--active:not(.ds-menu__item--disabled){background:var(--menu-item-hover-bg);color:var(--menu-item-hover-text)}.ds-menu__item:focus-visible{outline:2px solid var(--focus-color);outline-offset:-2px}.ds-menu__item--disabled{color:var(--menu-item-disabled-text);cursor:not-allowed}.ds-menu__item--disabled .ds-menu__item-icon{color:var(--menu-item-disabled-icon)}.ds-menu__item-icon{flex-shrink:0;color:var(--menu-item-icon);font-size:1em}.ds-menu__item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-menu__divider{height:1px;margin:var(--menu-divider-margin) 0;background:var(--menu-divider)}::ng-deep .ds-menu-backdrop{background:var(--menu-backdrop)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: 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"] }] });
7526
7658
  }
7527
7659
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsMenu, decorators: [{
7528
7660
  type: Component,
@@ -7535,6 +7667,895 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
7535
7667
  args: ['menuItemRef']
7536
7668
  }] } });
7537
7669
 
7670
+ /**
7671
+ * Design System Chip component
7672
+ *
7673
+ * @example
7674
+ * ```html
7675
+ * <ds-chip label="Tag" />
7676
+ * <ds-chip label="Removable" [removable]="true" (removed)="onRemove()" />
7677
+ * <ds-chip label="Clickable" [clickable]="true" (clicked)="onClick()" />
7678
+ * <ds-chip label="With icon" icon="fas-star" />
7679
+ * ```
7680
+ */
7681
+ class DsChip {
7682
+ // Inputs
7683
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
7684
+ variant = input('filled', ...(ngDevMode ? [{ debugName: "variant" }] : []));
7685
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
7686
+ color = input('default', ...(ngDevMode ? [{ debugName: "color" }] : []));
7687
+ removable = input(false, ...(ngDevMode ? [{ debugName: "removable" }] : []));
7688
+ clickable = input(false, ...(ngDevMode ? [{ debugName: "clickable" }] : []));
7689
+ selected = input(false, ...(ngDevMode ? [{ debugName: "selected" }] : []));
7690
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
7691
+ icon = input('', ...(ngDevMode ? [{ debugName: "icon" }] : []));
7692
+ avatar = input('', ...(ngDevMode ? [{ debugName: "avatar" }] : []));
7693
+ // Outputs
7694
+ removed = output();
7695
+ clicked = output();
7696
+ selectedChange = output();
7697
+ // Internal state
7698
+ isSelected = signal(false, ...(ngDevMode ? [{ debugName: "isSelected" }] : []));
7699
+ // Icons
7700
+ closeIcon = faXmark;
7701
+ // Computed classes
7702
+ chipClasses = computed(() => {
7703
+ const classes = ['ds-chip'];
7704
+ classes.push(`ds-chip--${this.variant()}`);
7705
+ classes.push(`ds-chip--${this.size()}`);
7706
+ classes.push(`ds-chip--${this.color()}`);
7707
+ if (this.clickable() && !this.disabled()) {
7708
+ classes.push('ds-chip--clickable');
7709
+ }
7710
+ if (this.selected()) {
7711
+ classes.push('ds-chip--selected');
7712
+ }
7713
+ if (this.disabled()) {
7714
+ classes.push('ds-chip--disabled');
7715
+ }
7716
+ return classes.join(' ');
7717
+ }, ...(ngDevMode ? [{ debugName: "chipClasses" }] : []));
7718
+ // Computed role
7719
+ role = computed(() => {
7720
+ return this.clickable() ? 'button' : null;
7721
+ }, ...(ngDevMode ? [{ debugName: "role" }] : []));
7722
+ // Computed tabindex
7723
+ tabindex = computed(() => {
7724
+ if (this.disabled())
7725
+ return -1;
7726
+ if (this.clickable() || this.removable())
7727
+ return 0;
7728
+ return null;
7729
+ }, ...(ngDevMode ? [{ debugName: "tabindex" }] : []));
7730
+ // Computed aria-selected
7731
+ ariaSelected = computed(() => {
7732
+ return this.clickable() ? this.selected() : null;
7733
+ }, ...(ngDevMode ? [{ debugName: "ariaSelected" }] : []));
7734
+ // Computed aria-disabled
7735
+ ariaDisabled = computed(() => {
7736
+ return this.disabled() ? true : null;
7737
+ }, ...(ngDevMode ? [{ debugName: "ariaDisabled" }] : []));
7738
+ /**
7739
+ * Handle chip click
7740
+ */
7741
+ handleClick(event) {
7742
+ if (this.disabled()) {
7743
+ event.stopPropagation();
7744
+ event.preventDefault();
7745
+ return;
7746
+ }
7747
+ if (this.clickable()) {
7748
+ this.isSelected.set(!this.selected());
7749
+ this.clicked.emit();
7750
+ this.selectedChange.emit(!this.selected());
7751
+ }
7752
+ }
7753
+ /**
7754
+ * Handle remove button click
7755
+ */
7756
+ handleRemove(event) {
7757
+ event.stopPropagation();
7758
+ event.preventDefault();
7759
+ if (this.disabled()) {
7760
+ return;
7761
+ }
7762
+ this.removed.emit();
7763
+ }
7764
+ /**
7765
+ * Handle keyboard events
7766
+ */
7767
+ handleKeyDown(event) {
7768
+ if (this.disabled()) {
7769
+ return;
7770
+ }
7771
+ // Handle Enter or Space for clickable chips
7772
+ if (this.clickable() && (event.key === 'Enter' || event.key === ' ')) {
7773
+ event.preventDefault();
7774
+ this.handleClick(event);
7775
+ }
7776
+ // Handle Delete or Backspace for removable chips
7777
+ if (this.removable() &&
7778
+ (event.key === 'Delete' || event.key === 'Backspace')) {
7779
+ event.preventDefault();
7780
+ this.handleRemove(event);
7781
+ }
7782
+ }
7783
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsChip, deps: [], target: i0.ɵɵFactoryTarget.Component });
7784
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsChip, isStandalone: true, selector: "ds-chip", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, removable: { classPropertyName: "removable", publicName: "removable", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, selected: { classPropertyName: "selected", publicName: "selected", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, avatar: { classPropertyName: "avatar", publicName: "avatar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { removed: "removed", clicked: "clicked", selectedChange: "selectedChange" }, ngImport: i0, template: "<div\n [class]=\"chipClasses()\"\n [attr.role]=\"role()\"\n [attr.tabindex]=\"tabindex()\"\n [attr.aria-selected]=\"ariaSelected()\"\n [attr.aria-disabled]=\"ariaDisabled()\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n>\n <!-- Avatar -->\n @if (avatar()) {\n <img\n class=\"ds-chip__avatar\"\n [src]=\"avatar()\"\n [alt]=\"label()\"\n />\n }\n\n <!-- Icon -->\n @if (icon() && !avatar()) {\n <fa-icon\n class=\"ds-chip__icon\"\n [icon]=\"['fas', icon()]\"\n [fixedWidth]=\"true\"\n />\n }\n\n <!-- Label -->\n <span class=\"ds-chip__label\">{{ label() }}</span>\n\n <!-- Remove button -->\n @if (removable() && !disabled()) {\n <button\n type=\"button\"\n class=\"ds-chip__remove\"\n [attr.aria-label]=\"'Remove ' + label()\"\n (click)=\"handleRemove($event)\"\n >\n <fa-icon\n [icon]=\"closeIcon\"\n [fixedWidth]=\"true\"\n />\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ds-chip{display:inline-flex;align-items:center;gap:var(--chip-gap, var(--space-2));padding:var(--chip-padding-y, var(--space-1)) var(--chip-padding-x, var(--space-3));border-radius:var(--chip-border-radius, var(--radius-pill));font-family:var(--font-family-base);font-size:var(--chip-font-size, var(--font-size-sm));font-weight:var(--chip-font-weight, 500);line-height:var(--chip-line-height, 1.5);transition:all var(--transition-fast);-webkit-user-select:none;user-select:none;outline:none;background-color:var(--chip-bg, var(--gray-200));color:var(--chip-text, var(--gray-800));border:1px solid var(--chip-border, transparent)}.ds-chip__avatar{width:var(--chip-avatar-size, 1.25rem);height:var(--chip-avatar-size, 1.25rem);border-radius:50%;object-fit:cover;flex-shrink:0}.ds-chip__icon{flex-shrink:0;font-size:var(--chip-icon-size, .875rem)}.ds-chip__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-chip__remove{display:flex;align-items:center;justify-content:center;padding:0;margin:0;background:none;border:none;cursor:pointer;color:inherit;opacity:.6;transition:opacity var(--transition-fast);flex-shrink:0}.ds-chip__remove:hover{opacity:1}.ds-chip__remove:focus{outline:none;opacity:1}.ds-chip__remove fa-icon{font-size:var(--chip-remove-icon-size, .75rem)}.ds-chip--outlined{background-color:transparent;border-color:var(--chip-border, var(--gray-300))}.ds-chip--sm{padding:var(--chip-padding-y-sm, var(--space-0-5)) var(--chip-padding-x-sm, var(--space-2));font-size:var(--chip-font-size-sm, var(--font-size-xs));gap:var(--chip-gap-sm, var(--space-1))}.ds-chip--sm .ds-chip__avatar{width:var(--chip-avatar-size-sm, 1rem);height:var(--chip-avatar-size-sm, 1rem)}.ds-chip--sm .ds-chip__icon{font-size:var(--chip-icon-size-sm, .75rem)}.ds-chip--sm .ds-chip__remove fa-icon{font-size:var(--chip-remove-icon-size-sm, .625rem)}.ds-chip--lg{padding:var(--chip-padding-y-lg, var(--space-2)) var(--chip-padding-x-lg, var(--space-4));font-size:var(--chip-font-size-lg, var(--font-size-base));gap:var(--chip-gap-lg, var(--space-2))}.ds-chip--lg .ds-chip__avatar{width:var(--chip-avatar-size-lg, 1.5rem);height:var(--chip-avatar-size-lg, 1.5rem)}.ds-chip--lg .ds-chip__icon{font-size:var(--chip-icon-size-lg, 1rem)}.ds-chip--lg .ds-chip__remove fa-icon{font-size:var(--chip-remove-icon-size-lg, .875rem)}.ds-chip--primary{background-color:var(--chip-primary-bg, var(--color-primary));color:var(--chip-primary-text, var(--white));border-color:var(--chip-primary-border, transparent)}.ds-chip--primary.ds-chip--outlined{background-color:transparent;color:var(--chip-primary-bg, var(--color-primary));border-color:var(--chip-primary-bg, var(--color-primary))}.ds-chip--success{background-color:var(--chip-success-bg, var(--success-bg));color:var(--chip-success-text, var(--success));border-color:var(--chip-success-border, var(--success-border))}.ds-chip--success.ds-chip--outlined{background-color:transparent;color:var(--chip-success-text, var(--success));border-color:var(--chip-success-text, var(--success))}.ds-chip--warning{background-color:var(--chip-warning-bg, var(--warning-bg));color:var(--chip-warning-text, var(--warning));border-color:var(--chip-warning-border, var(--warning-border))}.ds-chip--warning.ds-chip--outlined{background-color:transparent;color:var(--chip-warning-text, var(--warning));border-color:var(--chip-warning-text, var(--warning))}.ds-chip--error{background-color:var(--chip-error-bg, var(--error-bg));color:var(--chip-error-text, var(--error));border-color:var(--chip-error-border, var(--error-border))}.ds-chip--error.ds-chip--outlined{background-color:transparent;color:var(--chip-error-text, var(--error));border-color:var(--chip-error-text, var(--error))}.ds-chip--clickable{cursor:pointer}.ds-chip--clickable:hover:not(.ds-chip--disabled){background-color:var(--chip-hover-bg, var(--gray-300))}.ds-chip--clickable:focus-visible{box-shadow:0 0 0 3px var(--chip-focus-ring, var(--focus-ring))}.ds-chip--clickable.ds-chip--outlined:hover:not(.ds-chip--disabled){background-color:var(--chip-hover-bg, var(--gray-50))}.ds-chip--clickable.ds-chip--primary:hover:not(.ds-chip--disabled){background-color:var(--chip-primary-hover-bg, var(--primary-600))}.ds-chip--clickable.ds-chip--primary.ds-chip--outlined:hover:not(.ds-chip--disabled){background-color:var(--chip-primary-hover-bg-outlined, var(--primary-50))}.ds-chip--clickable.ds-chip--success:hover:not(.ds-chip--disabled){background-color:var(--chip-success-hover-bg, var(--success-100))}.ds-chip--clickable.ds-chip--success.ds-chip--outlined:hover:not(.ds-chip--disabled){background-color:var(--chip-success-hover-bg-outlined, var(--success-50))}.ds-chip--clickable.ds-chip--warning:hover:not(.ds-chip--disabled){background-color:var(--chip-warning-hover-bg, var(--warning-100))}.ds-chip--clickable.ds-chip--warning.ds-chip--outlined:hover:not(.ds-chip--disabled){background-color:var(--chip-warning-hover-bg-outlined, var(--warning-50))}.ds-chip--clickable.ds-chip--error:hover:not(.ds-chip--disabled){background-color:var(--chip-error-hover-bg, var(--error-100))}.ds-chip--clickable.ds-chip--error.ds-chip--outlined:hover:not(.ds-chip--disabled){background-color:var(--chip-error-hover-bg-outlined, var(--error-50))}.ds-chip--selected{box-shadow:0 0 0 2px var(--chip-selected-ring, var(--color-primary))}.ds-chip--disabled{opacity:var(--chip-disabled-opacity, .5);cursor:not-allowed;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i1$1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7785
+ }
7786
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsChip, decorators: [{
7787
+ type: Component,
7788
+ args: [{ selector: 'ds-chip', standalone: true, imports: [CommonModule, FontAwesomeModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [class]=\"chipClasses()\"\n [attr.role]=\"role()\"\n [attr.tabindex]=\"tabindex()\"\n [attr.aria-selected]=\"ariaSelected()\"\n [attr.aria-disabled]=\"ariaDisabled()\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n>\n <!-- Avatar -->\n @if (avatar()) {\n <img\n class=\"ds-chip__avatar\"\n [src]=\"avatar()\"\n [alt]=\"label()\"\n />\n }\n\n <!-- Icon -->\n @if (icon() && !avatar()) {\n <fa-icon\n class=\"ds-chip__icon\"\n [icon]=\"['fas', icon()]\"\n [fixedWidth]=\"true\"\n />\n }\n\n <!-- Label -->\n <span class=\"ds-chip__label\">{{ label() }}</span>\n\n <!-- Remove button -->\n @if (removable() && !disabled()) {\n <button\n type=\"button\"\n class=\"ds-chip__remove\"\n [attr.aria-label]=\"'Remove ' + label()\"\n (click)=\"handleRemove($event)\"\n >\n <fa-icon\n [icon]=\"closeIcon\"\n [fixedWidth]=\"true\"\n />\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.ds-chip{display:inline-flex;align-items:center;gap:var(--chip-gap, var(--space-2));padding:var(--chip-padding-y, var(--space-1)) var(--chip-padding-x, var(--space-3));border-radius:var(--chip-border-radius, var(--radius-pill));font-family:var(--font-family-base);font-size:var(--chip-font-size, var(--font-size-sm));font-weight:var(--chip-font-weight, 500);line-height:var(--chip-line-height, 1.5);transition:all var(--transition-fast);-webkit-user-select:none;user-select:none;outline:none;background-color:var(--chip-bg, var(--gray-200));color:var(--chip-text, var(--gray-800));border:1px solid var(--chip-border, transparent)}.ds-chip__avatar{width:var(--chip-avatar-size, 1.25rem);height:var(--chip-avatar-size, 1.25rem);border-radius:50%;object-fit:cover;flex-shrink:0}.ds-chip__icon{flex-shrink:0;font-size:var(--chip-icon-size, .875rem)}.ds-chip__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ds-chip__remove{display:flex;align-items:center;justify-content:center;padding:0;margin:0;background:none;border:none;cursor:pointer;color:inherit;opacity:.6;transition:opacity var(--transition-fast);flex-shrink:0}.ds-chip__remove:hover{opacity:1}.ds-chip__remove:focus{outline:none;opacity:1}.ds-chip__remove fa-icon{font-size:var(--chip-remove-icon-size, .75rem)}.ds-chip--outlined{background-color:transparent;border-color:var(--chip-border, var(--gray-300))}.ds-chip--sm{padding:var(--chip-padding-y-sm, var(--space-0-5)) var(--chip-padding-x-sm, var(--space-2));font-size:var(--chip-font-size-sm, var(--font-size-xs));gap:var(--chip-gap-sm, var(--space-1))}.ds-chip--sm .ds-chip__avatar{width:var(--chip-avatar-size-sm, 1rem);height:var(--chip-avatar-size-sm, 1rem)}.ds-chip--sm .ds-chip__icon{font-size:var(--chip-icon-size-sm, .75rem)}.ds-chip--sm .ds-chip__remove fa-icon{font-size:var(--chip-remove-icon-size-sm, .625rem)}.ds-chip--lg{padding:var(--chip-padding-y-lg, var(--space-2)) var(--chip-padding-x-lg, var(--space-4));font-size:var(--chip-font-size-lg, var(--font-size-base));gap:var(--chip-gap-lg, var(--space-2))}.ds-chip--lg .ds-chip__avatar{width:var(--chip-avatar-size-lg, 1.5rem);height:var(--chip-avatar-size-lg, 1.5rem)}.ds-chip--lg .ds-chip__icon{font-size:var(--chip-icon-size-lg, 1rem)}.ds-chip--lg .ds-chip__remove fa-icon{font-size:var(--chip-remove-icon-size-lg, .875rem)}.ds-chip--primary{background-color:var(--chip-primary-bg, var(--color-primary));color:var(--chip-primary-text, var(--white));border-color:var(--chip-primary-border, transparent)}.ds-chip--primary.ds-chip--outlined{background-color:transparent;color:var(--chip-primary-bg, var(--color-primary));border-color:var(--chip-primary-bg, var(--color-primary))}.ds-chip--success{background-color:var(--chip-success-bg, var(--success-bg));color:var(--chip-success-text, var(--success));border-color:var(--chip-success-border, var(--success-border))}.ds-chip--success.ds-chip--outlined{background-color:transparent;color:var(--chip-success-text, var(--success));border-color:var(--chip-success-text, var(--success))}.ds-chip--warning{background-color:var(--chip-warning-bg, var(--warning-bg));color:var(--chip-warning-text, var(--warning));border-color:var(--chip-warning-border, var(--warning-border))}.ds-chip--warning.ds-chip--outlined{background-color:transparent;color:var(--chip-warning-text, var(--warning));border-color:var(--chip-warning-text, var(--warning))}.ds-chip--error{background-color:var(--chip-error-bg, var(--error-bg));color:var(--chip-error-text, var(--error));border-color:var(--chip-error-border, var(--error-border))}.ds-chip--error.ds-chip--outlined{background-color:transparent;color:var(--chip-error-text, var(--error));border-color:var(--chip-error-text, var(--error))}.ds-chip--clickable{cursor:pointer}.ds-chip--clickable:hover:not(.ds-chip--disabled){background-color:var(--chip-hover-bg, var(--gray-300))}.ds-chip--clickable:focus-visible{box-shadow:0 0 0 3px var(--chip-focus-ring, var(--focus-ring))}.ds-chip--clickable.ds-chip--outlined:hover:not(.ds-chip--disabled){background-color:var(--chip-hover-bg, var(--gray-50))}.ds-chip--clickable.ds-chip--primary:hover:not(.ds-chip--disabled){background-color:var(--chip-primary-hover-bg, var(--primary-600))}.ds-chip--clickable.ds-chip--primary.ds-chip--outlined:hover:not(.ds-chip--disabled){background-color:var(--chip-primary-hover-bg-outlined, var(--primary-50))}.ds-chip--clickable.ds-chip--success:hover:not(.ds-chip--disabled){background-color:var(--chip-success-hover-bg, var(--success-100))}.ds-chip--clickable.ds-chip--success.ds-chip--outlined:hover:not(.ds-chip--disabled){background-color:var(--chip-success-hover-bg-outlined, var(--success-50))}.ds-chip--clickable.ds-chip--warning:hover:not(.ds-chip--disabled){background-color:var(--chip-warning-hover-bg, var(--warning-100))}.ds-chip--clickable.ds-chip--warning.ds-chip--outlined:hover:not(.ds-chip--disabled){background-color:var(--chip-warning-hover-bg-outlined, var(--warning-50))}.ds-chip--clickable.ds-chip--error:hover:not(.ds-chip--disabled){background-color:var(--chip-error-hover-bg, var(--error-100))}.ds-chip--clickable.ds-chip--error.ds-chip--outlined:hover:not(.ds-chip--disabled){background-color:var(--chip-error-hover-bg-outlined, var(--error-50))}.ds-chip--selected{box-shadow:0 0 0 2px var(--chip-selected-ring, var(--color-primary))}.ds-chip--disabled{opacity:var(--chip-disabled-opacity, .5);cursor:not-allowed;pointer-events:none}\n"] }]
7789
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], removable: [{ type: i0.Input, args: [{ isSignal: true, alias: "removable", required: false }] }], clickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clickable", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], avatar: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatar", required: false }] }], removed: [{ type: i0.Output, args: ["removed"] }], clicked: [{ type: i0.Output, args: ["clicked"] }], selectedChange: [{ type: i0.Output, args: ["selectedChange"] }] } });
7790
+
7791
+ class DsSlider {
7792
+ // Config
7793
+ min = input(0, ...(ngDevMode ? [{ debugName: "min" }] : []));
7794
+ max = input(100, ...(ngDevMode ? [{ debugName: "max" }] : []));
7795
+ step = input(1, ...(ngDevMode ? [{ debugName: "step" }] : []));
7796
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
7797
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
7798
+ range = input(false, ...(ngDevMode ? [{ debugName: "range" }] : []));
7799
+ orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
7800
+ // Display
7801
+ showLabels = input(false, ...(ngDevMode ? [{ debugName: "showLabels" }] : []));
7802
+ showTicks = input(false, ...(ngDevMode ? [{ debugName: "showTicks" }] : []));
7803
+ tickInterval = input(undefined, ...(ngDevMode ? [{ debugName: "tickInterval" }] : []));
7804
+ formatLabel = input(undefined, ...(ngDevMode ? [{ debugName: "formatLabel" }] : []));
7805
+ // Events
7806
+ valueChange = output();
7807
+ // ViewChild
7808
+ trackElement;
7809
+ thumb1Element;
7810
+ thumb2Element;
7811
+ // Internal state
7812
+ disabledState = signal(false, ...(ngDevMode ? [{ debugName: "disabledState" }] : []));
7813
+ internalValue = signal(0, ...(ngDevMode ? [{ debugName: "internalValue" }] : []));
7814
+ dragging = signal(null, ...(ngDevMode ? [{ debugName: "dragging" }] : [])); // null, 0 (first thumb), 1 (second thumb)
7815
+ focusedThumb = signal(0, ...(ngDevMode ? [{ debugName: "focusedThumb" }] : [])); // 0 or 1
7816
+ constructor() {
7817
+ // Effect pour synchroniser la valeur initiale
7818
+ effect(() => {
7819
+ const currentValue = this.internalValue();
7820
+ const isRange = this.range();
7821
+ const minVal = this.min();
7822
+ // Initialisation par défaut
7823
+ if (typeof currentValue === 'number' && isRange) {
7824
+ this.internalValue.set([minVal, currentValue]);
7825
+ }
7826
+ else if (Array.isArray(currentValue) && !isRange) {
7827
+ this.internalValue.set(currentValue[0]);
7828
+ }
7829
+ });
7830
+ }
7831
+ isDisabled = computed(() => this.disabled() || this.disabledState(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
7832
+ isRange = computed(() => this.range(), ...(ngDevMode ? [{ debugName: "isRange" }] : []));
7833
+ isVertical = computed(() => this.orientation() === 'vertical', ...(ngDevMode ? [{ debugName: "isVertical" }] : []));
7834
+ containerClasses = computed(() => {
7835
+ const classes = ['ds-slider'];
7836
+ classes.push(`ds-slider--${this.size()}`);
7837
+ if (this.isDisabled())
7838
+ classes.push('ds-slider--disabled');
7839
+ if (this.isVertical())
7840
+ classes.push('ds-slider--vertical');
7841
+ return classes.join(' ');
7842
+ }, ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
7843
+ value1 = computed(() => {
7844
+ const val = this.internalValue();
7845
+ return Array.isArray(val) ? val[0] : val;
7846
+ }, ...(ngDevMode ? [{ debugName: "value1" }] : []));
7847
+ value2 = computed(() => {
7848
+ const val = this.internalValue();
7849
+ return Array.isArray(val) ? val[1] : this.max();
7850
+ }, ...(ngDevMode ? [{ debugName: "value2" }] : []));
7851
+ percentage1 = computed(() => {
7852
+ return this.valueToPercentage(this.value1());
7853
+ }, ...(ngDevMode ? [{ debugName: "percentage1" }] : []));
7854
+ percentage2 = computed(() => {
7855
+ return this.valueToPercentage(this.value2());
7856
+ }, ...(ngDevMode ? [{ debugName: "percentage2" }] : []));
7857
+ thumb1Style = computed(() => {
7858
+ if (this.isVertical()) {
7859
+ return { bottom: `${this.percentage1()}%` };
7860
+ }
7861
+ return { left: `${this.percentage1()}%` };
7862
+ }, ...(ngDevMode ? [{ debugName: "thumb1Style" }] : []));
7863
+ thumb2Style = computed(() => {
7864
+ if (!this.isRange())
7865
+ return {};
7866
+ if (this.isVertical()) {
7867
+ return { bottom: `${this.percentage2()}%` };
7868
+ }
7869
+ return { left: `${this.percentage2()}%` };
7870
+ }, ...(ngDevMode ? [{ debugName: "thumb2Style" }] : []));
7871
+ fillStyle = computed(() => {
7872
+ const p1 = this.percentage1();
7873
+ const p2 = this.percentage2();
7874
+ if (this.isVertical()) {
7875
+ if (this.isRange()) {
7876
+ return {
7877
+ bottom: `${p1}%`,
7878
+ height: `${p2 - p1}%`,
7879
+ };
7880
+ }
7881
+ return {
7882
+ bottom: '0%',
7883
+ height: `${p1}%`,
7884
+ };
7885
+ }
7886
+ if (this.isRange()) {
7887
+ return {
7888
+ left: `${p1}%`,
7889
+ width: `${p2 - p1}%`,
7890
+ };
7891
+ }
7892
+ return {
7893
+ left: '0%',
7894
+ width: `${p1}%`,
7895
+ };
7896
+ }, ...(ngDevMode ? [{ debugName: "fillStyle" }] : []));
7897
+ ticks = computed(() => {
7898
+ if (!this.showTicks())
7899
+ return [];
7900
+ const interval = this.tickInterval() ?? this.step();
7901
+ const minVal = this.min();
7902
+ const maxVal = this.max();
7903
+ const ticks = [];
7904
+ for (let val = minVal; val <= maxVal; val += interval) {
7905
+ ticks.push(val);
7906
+ }
7907
+ return ticks;
7908
+ }, ...(ngDevMode ? [{ debugName: "ticks" }] : []));
7909
+ label1 = computed(() => {
7910
+ const formatter = this.formatLabel();
7911
+ const val = this.value1();
7912
+ return formatter ? formatter(val) : val.toString();
7913
+ }, ...(ngDevMode ? [{ debugName: "label1" }] : []));
7914
+ label2 = computed(() => {
7915
+ if (!this.isRange())
7916
+ return '';
7917
+ const formatter = this.formatLabel();
7918
+ const val = this.value2();
7919
+ return formatter ? formatter(val) : val.toString();
7920
+ }, ...(ngDevMode ? [{ debugName: "label2" }] : []));
7921
+ // ControlValueAccessor
7922
+ onChange = () => { };
7923
+ onTouched = () => { };
7924
+ writeValue(value) {
7925
+ if (value === null) {
7926
+ this.internalValue.set(this.range() ? [this.min(), this.max()] : this.min());
7927
+ return;
7928
+ }
7929
+ this.internalValue.set(value);
7930
+ }
7931
+ registerOnChange(fn) {
7932
+ this.onChange = fn;
7933
+ }
7934
+ registerOnTouched(fn) {
7935
+ this.onTouched = fn;
7936
+ }
7937
+ setDisabledState(isDisabled) {
7938
+ this.disabledState.set(isDisabled);
7939
+ }
7940
+ // Helpers
7941
+ valueToPercentage(value) {
7942
+ const minVal = this.min();
7943
+ const maxVal = this.max();
7944
+ return ((value - minVal) / (maxVal - minVal)) * 100;
7945
+ }
7946
+ percentageToValue(percentage) {
7947
+ const minVal = this.min();
7948
+ const maxVal = this.max();
7949
+ const stepVal = this.step();
7950
+ const rawValue = minVal + (percentage / 100) * (maxVal - minVal);
7951
+ const steppedValue = Math.round(rawValue / stepVal) * stepVal;
7952
+ return Math.max(minVal, Math.min(maxVal, steppedValue));
7953
+ }
7954
+ clampValue(value) {
7955
+ return Math.max(this.min(), Math.min(this.max(), value));
7956
+ }
7957
+ emitValue() {
7958
+ const val = this.internalValue();
7959
+ this.onChange(val);
7960
+ this.valueChange.emit(val);
7961
+ }
7962
+ // Event handlers - Keyboard
7963
+ onKeyDown(event, thumbIndex) {
7964
+ if (this.isDisabled())
7965
+ return;
7966
+ const stepVal = this.step();
7967
+ const minVal = this.min();
7968
+ const maxVal = this.max();
7969
+ let handled = true;
7970
+ let newValue;
7971
+ const currentValue = thumbIndex === 0 ? this.value1() : this.value2();
7972
+ switch (event.key) {
7973
+ case 'ArrowRight':
7974
+ case 'ArrowUp':
7975
+ newValue = currentValue + stepVal;
7976
+ break;
7977
+ case 'ArrowLeft':
7978
+ case 'ArrowDown':
7979
+ newValue = currentValue - stepVal;
7980
+ break;
7981
+ case 'Home':
7982
+ newValue = minVal;
7983
+ break;
7984
+ case 'End':
7985
+ newValue = maxVal;
7986
+ break;
7987
+ case 'PageUp':
7988
+ newValue = currentValue + stepVal * 10;
7989
+ break;
7990
+ case 'PageDown':
7991
+ newValue = currentValue - stepVal * 10;
7992
+ break;
7993
+ default:
7994
+ handled = false;
7995
+ }
7996
+ if (!handled || newValue === undefined)
7997
+ return;
7998
+ event.preventDefault();
7999
+ newValue = this.clampValue(newValue);
8000
+ if (this.isRange()) {
8001
+ const val = this.internalValue();
8002
+ if (thumbIndex === 0) {
8003
+ // Thumb 1: ne peut pas dépasser thumb 2
8004
+ newValue = Math.min(newValue, val[1]);
8005
+ this.internalValue.set([newValue, val[1]]);
8006
+ }
8007
+ else {
8008
+ // Thumb 2: ne peut pas être inférieur à thumb 1
8009
+ newValue = Math.max(newValue, val[0]);
8010
+ this.internalValue.set([val[0], newValue]);
8011
+ }
8012
+ }
8013
+ else {
8014
+ this.internalValue.set(newValue);
8015
+ }
8016
+ this.emitValue();
8017
+ }
8018
+ // Event handlers - Mouse/Touch
8019
+ onTrackClick(event) {
8020
+ if (this.isDisabled() || !this.trackElement)
8021
+ return;
8022
+ const rect = this.trackElement.nativeElement.getBoundingClientRect();
8023
+ let percentage;
8024
+ if (this.isVertical()) {
8025
+ percentage = ((rect.bottom - event.clientY) / rect.height) * 100;
8026
+ }
8027
+ else {
8028
+ percentage = ((event.clientX - rect.left) / rect.width) * 100;
8029
+ }
8030
+ const newValue = this.percentageToValue(percentage);
8031
+ if (this.isRange()) {
8032
+ const val = this.internalValue();
8033
+ // Détermine quel thumb est le plus proche
8034
+ const dist1 = Math.abs(newValue - val[0]);
8035
+ const dist2 = Math.abs(newValue - val[1]);
8036
+ if (dist1 < dist2) {
8037
+ this.internalValue.set([newValue, val[1]]);
8038
+ this.focusedThumb.set(0);
8039
+ }
8040
+ else {
8041
+ this.internalValue.set([val[0], newValue]);
8042
+ this.focusedThumb.set(1);
8043
+ }
8044
+ }
8045
+ else {
8046
+ this.internalValue.set(newValue);
8047
+ }
8048
+ this.emitValue();
8049
+ this.onTouched();
8050
+ }
8051
+ onThumbMouseDown(event, thumbIndex) {
8052
+ if (this.isDisabled())
8053
+ return;
8054
+ event.preventDefault();
8055
+ this.dragging.set(thumbIndex);
8056
+ this.focusedThumb.set(thumbIndex);
8057
+ const moveHandler = (e) => this.onMouseMove(e);
8058
+ const upHandler = () => {
8059
+ this.dragging.set(null);
8060
+ this.onTouched();
8061
+ document.removeEventListener('mousemove', moveHandler);
8062
+ document.removeEventListener('mouseup', upHandler);
8063
+ };
8064
+ document.addEventListener('mousemove', moveHandler);
8065
+ document.addEventListener('mouseup', upHandler);
8066
+ }
8067
+ onMouseMove(event) {
8068
+ const thumbIndex = this.dragging();
8069
+ if (thumbIndex === null || !this.trackElement)
8070
+ return;
8071
+ const rect = this.trackElement.nativeElement.getBoundingClientRect();
8072
+ let percentage;
8073
+ if (this.isVertical()) {
8074
+ percentage = ((rect.bottom - event.clientY) / rect.height) * 100;
8075
+ }
8076
+ else {
8077
+ percentage = ((event.clientX - rect.left) / rect.width) * 100;
8078
+ }
8079
+ const newValue = this.percentageToValue(percentage);
8080
+ if (this.isRange()) {
8081
+ const val = this.internalValue();
8082
+ if (thumbIndex === 0) {
8083
+ const clamped = Math.min(newValue, val[1]);
8084
+ this.internalValue.set([clamped, val[1]]);
8085
+ }
8086
+ else {
8087
+ const clamped = Math.max(newValue, val[0]);
8088
+ this.internalValue.set([val[0], clamped]);
8089
+ }
8090
+ }
8091
+ else {
8092
+ this.internalValue.set(newValue);
8093
+ }
8094
+ this.emitValue();
8095
+ }
8096
+ onThumbFocus(thumbIndex) {
8097
+ this.focusedThumb.set(thumbIndex);
8098
+ }
8099
+ onThumbBlur() {
8100
+ this.onTouched();
8101
+ }
8102
+ getTickPosition(value) {
8103
+ return this.valueToPercentage(value);
8104
+ }
8105
+ getTickLabel(value) {
8106
+ const formatter = this.formatLabel();
8107
+ return formatter ? formatter(value) : value.toString();
8108
+ }
8109
+ // ARIA helpers
8110
+ getAriaValueText(thumbIndex) {
8111
+ const val = thumbIndex === 0 ? this.value1() : this.value2();
8112
+ const formatter = this.formatLabel();
8113
+ return formatter ? formatter(val) : val.toString();
8114
+ }
8115
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsSlider, deps: [], target: i0.ɵɵFactoryTarget.Component });
8116
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsSlider, isStandalone: true, selector: "ds-slider", inputs: { min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, showLabels: { classPropertyName: "showLabels", publicName: "showLabels", isSignal: true, isRequired: false, transformFunction: null }, showTicks: { classPropertyName: "showTicks", publicName: "showTicks", isSignal: true, isRequired: false, transformFunction: null }, tickInterval: { classPropertyName: "tickInterval", publicName: "tickInterval", isSignal: true, isRequired: false, transformFunction: null }, formatLabel: { classPropertyName: "formatLabel", publicName: "formatLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, providers: [
8117
+ {
8118
+ provide: NG_VALUE_ACCESSOR,
8119
+ useExisting: forwardRef(() => DsSlider),
8120
+ multi: true,
8121
+ },
8122
+ ], viewQueries: [{ propertyName: "trackElement", first: true, predicate: ["track"], descendants: true }, { propertyName: "thumb1Element", first: true, predicate: ["thumb1"], descendants: true }, { propertyName: "thumb2Element", first: true, predicate: ["thumb2"], descendants: true }], ngImport: i0, template: "<div [class]=\"containerClasses()\">\n <!-- Min label -->\n @if (showLabels()) {\n <span class=\"ds-slider__label ds-slider__label--min\">\n {{ getTickLabel(min()) }}\n </span>\n }\n\n <!-- Track container -->\n <div class=\"ds-slider__track-container\">\n <!-- Track background -->\n <div\n #track\n class=\"ds-slider__track\"\n (click)=\"onTrackClick($event)\"\n role=\"presentation\">\n <!-- Fill -->\n <div\n class=\"ds-slider__fill\"\n [ngStyle]=\"fillStyle()\">\n </div>\n\n <!-- Ticks -->\n @if (showTicks()) {\n <div class=\"ds-slider__ticks\">\n @for (tick of ticks(); track tick) {\n <div\n class=\"ds-slider__tick\"\n [ngStyle]=\"isVertical() ? { bottom: getTickPosition(tick) + '%' } : { left: getTickPosition(tick) + '%' }\">\n </div>\n }\n </div>\n }\n\n <!-- Thumb 1 (always present) -->\n <div\n #thumb1\n class=\"ds-slider__thumb\"\n [class.ds-slider__thumb--active]=\"focusedThumb() === 0 || dragging() === 0\"\n [ngStyle]=\"thumb1Style()\"\n [attr.role]=\"'slider'\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"isRange() ? value2() : max()\"\n [attr.aria-valuenow]=\"value1()\"\n [attr.aria-valuetext]=\"getAriaValueText(0)\"\n [attr.aria-orientation]=\"orientation()\"\n [attr.aria-disabled]=\"isDisabled()\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n (keydown)=\"onKeyDown($event, 0)\"\n (mousedown)=\"onThumbMouseDown($event, 0)\"\n (focus)=\"onThumbFocus(0)\"\n (blur)=\"onThumbBlur()\">\n @if (showLabels()) {\n <span class=\"ds-slider__thumb-label\">{{ label1() }}</span>\n }\n </div>\n\n <!-- Thumb 2 (only for range mode) -->\n @if (isRange()) {\n <div\n #thumb2\n class=\"ds-slider__thumb\"\n [class.ds-slider__thumb--active]=\"focusedThumb() === 1 || dragging() === 1\"\n [ngStyle]=\"thumb2Style()\"\n [attr.role]=\"'slider'\"\n [attr.aria-valuemin]=\"value1()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value2()\"\n [attr.aria-valuetext]=\"getAriaValueText(1)\"\n [attr.aria-orientation]=\"orientation()\"\n [attr.aria-disabled]=\"isDisabled()\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n (keydown)=\"onKeyDown($event, 1)\"\n (mousedown)=\"onThumbMouseDown($event, 1)\"\n (focus)=\"onThumbFocus(1)\"\n (blur)=\"onThumbBlur()\">\n @if (showLabels()) {\n <span class=\"ds-slider__thumb-label\">{{ label2() }}</span>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Max label -->\n @if (showLabels()) {\n <span class=\"ds-slider__label ds-slider__label--max\">\n {{ getTickLabel(max()) }}\n </span>\n }\n</div>\n", styles: [".ds-slider{display:flex;align-items:center;gap:var(--slider-label-gap, var(--space-3, .75rem));-webkit-user-select:none;user-select:none}.ds-slider__label{flex-shrink:0;font-size:var(--slider-label-font-size, var(--font-size-2, .875rem));color:var(--slider-label-color, var(--gray-700, #374151));font-weight:500}.ds-slider__label--min{order:1}.ds-slider__label--max{order:3}.ds-slider__track-container{flex:1;order:2;position:relative;display:flex;align-items:center}.ds-slider__track{position:relative;width:100%;height:var(--slider-track-height-md, 6px);background-color:var(--slider-track-bg, var(--gray-200, #e5e7eb));border-radius:var(--slider-track-radius, var(--radius-full, 9999px));cursor:pointer}.ds-slider__fill{position:absolute;background-color:var(--slider-fill-bg, var(--color-primary, #3b82f6));border-radius:var(--slider-track-radius, var(--radius-full, 9999px));height:100%;transition:all .15s ease;pointer-events:none}.ds-slider__ticks{position:absolute;width:100%;height:100%;pointer-events:none}.ds-slider__tick{position:absolute;width:var(--slider-tick-size, 2px);height:var(--slider-tick-size, 2px);background-color:var(--slider-tick-color, var(--gray-400, #9ca3af));border-radius:50%;transform:translate(-50%,-50%);top:50%}.ds-slider__thumb{position:absolute;width:var(--slider-thumb-size-md, 20px);height:var(--slider-thumb-size-md, 20px);background-color:var(--slider-thumb-bg, var(--white, #ffffff));border:var(--slider-thumb-border-width, 2px) solid var(--slider-thumb-border-color, var(--color-primary, #3b82f6));border-radius:50%;box-shadow:var(--slider-thumb-shadow, 0 1px 3px rgba(0, 0, 0, .1));cursor:grab;transform:translate(-50%,-50%);top:50%;transition:transform .15s ease,box-shadow .15s ease;outline:none}.ds-slider__thumb:hover:not([aria-disabled=true]){transform:translate(-50%,-50%) scale(1.1);box-shadow:var(--slider-thumb-shadow-hover, 0 2px 8px rgba(0, 0, 0, .15))}.ds-slider__thumb:focus-visible{box-shadow:var(--slider-thumb-shadow-focus, 0 0 0 3px rgba(59, 130, 246, .3))}.ds-slider__thumb--active{cursor:grabbing;transform:translate(-50%,-50%) scale(1.15);box-shadow:var(--slider-thumb-shadow-active, 0 0 0 4px rgba(59, 130, 246, .2))}.ds-slider__thumb[aria-disabled=true]{cursor:not-allowed;opacity:.5}.ds-slider__thumb-label{position:absolute;top:-32px;left:50%;transform:translate(-50%);background-color:var(--slider-thumb-label-bg, var(--gray-900, #111827));color:var(--slider-thumb-label-color, var(--white, #ffffff));font-size:var(--font-size-1, .75rem);padding:var(--space-1, .25rem) var(--space-2, .5rem);border-radius:var(--radius-1, .25rem);white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .15s ease}.ds-slider__thumb:hover .ds-slider__thumb-label,.ds-slider__thumb:focus .ds-slider__thumb-label,.ds-slider__thumb--active .ds-slider__thumb-label{opacity:1}.ds-slider--sm .ds-slider__track{height:var(--slider-track-height-sm, 4px)}.ds-slider--sm .ds-slider__thumb{width:var(--slider-thumb-size-sm, 16px);height:var(--slider-thumb-size-sm, 16px)}.ds-slider--sm .ds-slider__label{font-size:var(--font-size-1, .75rem)}.ds-slider--lg .ds-slider__track{height:var(--slider-track-height-lg, 8px)}.ds-slider--lg .ds-slider__thumb{width:var(--slider-thumb-size-lg, 24px);height:var(--slider-thumb-size-lg, 24px)}.ds-slider--lg .ds-slider__label{font-size:var(--font-size-3, 1rem)}.ds-slider--disabled{opacity:.6;pointer-events:none}.ds-slider--disabled .ds-slider__track{cursor:not-allowed}.ds-slider--vertical{flex-direction:column;height:200px;width:auto}.ds-slider--vertical .ds-slider__label--min{order:3}.ds-slider--vertical .ds-slider__label--max{order:1}.ds-slider--vertical .ds-slider__track-container{flex:1;width:auto;height:100%;display:flex;justify-content:center}.ds-slider--vertical .ds-slider__track{width:var(--slider-track-height-md, 6px);height:100%}.ds-slider--vertical .ds-slider__fill{width:100%;height:auto}.ds-slider--vertical .ds-slider__thumb{left:50%;top:auto;transform:translate(-50%,50%)}.ds-slider--vertical .ds-slider__thumb:hover:not([aria-disabled=true]){transform:translate(-50%,50%) scale(1.1)}.ds-slider--vertical .ds-slider__thumb--active{transform:translate(-50%,50%) scale(1.15)}.ds-slider--vertical .ds-slider__thumb-label{top:50%;left:32px;transform:translateY(-50%)}.ds-slider--vertical .ds-slider__tick{left:50%;top:auto;transform:translate(-50%,50%)}.ds-slider--vertical.ds-slider--sm .ds-slider__track{width:var(--slider-track-height-sm, 4px)}.ds-slider--vertical.ds-slider--lg .ds-slider__track{width:var(--slider-track-height-lg, 8px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
8123
+ }
8124
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsSlider, decorators: [{
8125
+ type: Component,
8126
+ args: [{ selector: 'ds-slider', imports: [CommonModule], providers: [
8127
+ {
8128
+ provide: NG_VALUE_ACCESSOR,
8129
+ useExisting: forwardRef(() => DsSlider),
8130
+ multi: true,
8131
+ },
8132
+ ], template: "<div [class]=\"containerClasses()\">\n <!-- Min label -->\n @if (showLabels()) {\n <span class=\"ds-slider__label ds-slider__label--min\">\n {{ getTickLabel(min()) }}\n </span>\n }\n\n <!-- Track container -->\n <div class=\"ds-slider__track-container\">\n <!-- Track background -->\n <div\n #track\n class=\"ds-slider__track\"\n (click)=\"onTrackClick($event)\"\n role=\"presentation\">\n <!-- Fill -->\n <div\n class=\"ds-slider__fill\"\n [ngStyle]=\"fillStyle()\">\n </div>\n\n <!-- Ticks -->\n @if (showTicks()) {\n <div class=\"ds-slider__ticks\">\n @for (tick of ticks(); track tick) {\n <div\n class=\"ds-slider__tick\"\n [ngStyle]=\"isVertical() ? { bottom: getTickPosition(tick) + '%' } : { left: getTickPosition(tick) + '%' }\">\n </div>\n }\n </div>\n }\n\n <!-- Thumb 1 (always present) -->\n <div\n #thumb1\n class=\"ds-slider__thumb\"\n [class.ds-slider__thumb--active]=\"focusedThumb() === 0 || dragging() === 0\"\n [ngStyle]=\"thumb1Style()\"\n [attr.role]=\"'slider'\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"isRange() ? value2() : max()\"\n [attr.aria-valuenow]=\"value1()\"\n [attr.aria-valuetext]=\"getAriaValueText(0)\"\n [attr.aria-orientation]=\"orientation()\"\n [attr.aria-disabled]=\"isDisabled()\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n (keydown)=\"onKeyDown($event, 0)\"\n (mousedown)=\"onThumbMouseDown($event, 0)\"\n (focus)=\"onThumbFocus(0)\"\n (blur)=\"onThumbBlur()\">\n @if (showLabels()) {\n <span class=\"ds-slider__thumb-label\">{{ label1() }}</span>\n }\n </div>\n\n <!-- Thumb 2 (only for range mode) -->\n @if (isRange()) {\n <div\n #thumb2\n class=\"ds-slider__thumb\"\n [class.ds-slider__thumb--active]=\"focusedThumb() === 1 || dragging() === 1\"\n [ngStyle]=\"thumb2Style()\"\n [attr.role]=\"'slider'\"\n [attr.aria-valuemin]=\"value1()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"value2()\"\n [attr.aria-valuetext]=\"getAriaValueText(1)\"\n [attr.aria-orientation]=\"orientation()\"\n [attr.aria-disabled]=\"isDisabled()\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n (keydown)=\"onKeyDown($event, 1)\"\n (mousedown)=\"onThumbMouseDown($event, 1)\"\n (focus)=\"onThumbFocus(1)\"\n (blur)=\"onThumbBlur()\">\n @if (showLabels()) {\n <span class=\"ds-slider__thumb-label\">{{ label2() }}</span>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Max label -->\n @if (showLabels()) {\n <span class=\"ds-slider__label ds-slider__label--max\">\n {{ getTickLabel(max()) }}\n </span>\n }\n</div>\n", styles: [".ds-slider{display:flex;align-items:center;gap:var(--slider-label-gap, var(--space-3, .75rem));-webkit-user-select:none;user-select:none}.ds-slider__label{flex-shrink:0;font-size:var(--slider-label-font-size, var(--font-size-2, .875rem));color:var(--slider-label-color, var(--gray-700, #374151));font-weight:500}.ds-slider__label--min{order:1}.ds-slider__label--max{order:3}.ds-slider__track-container{flex:1;order:2;position:relative;display:flex;align-items:center}.ds-slider__track{position:relative;width:100%;height:var(--slider-track-height-md, 6px);background-color:var(--slider-track-bg, var(--gray-200, #e5e7eb));border-radius:var(--slider-track-radius, var(--radius-full, 9999px));cursor:pointer}.ds-slider__fill{position:absolute;background-color:var(--slider-fill-bg, var(--color-primary, #3b82f6));border-radius:var(--slider-track-radius, var(--radius-full, 9999px));height:100%;transition:all .15s ease;pointer-events:none}.ds-slider__ticks{position:absolute;width:100%;height:100%;pointer-events:none}.ds-slider__tick{position:absolute;width:var(--slider-tick-size, 2px);height:var(--slider-tick-size, 2px);background-color:var(--slider-tick-color, var(--gray-400, #9ca3af));border-radius:50%;transform:translate(-50%,-50%);top:50%}.ds-slider__thumb{position:absolute;width:var(--slider-thumb-size-md, 20px);height:var(--slider-thumb-size-md, 20px);background-color:var(--slider-thumb-bg, var(--white, #ffffff));border:var(--slider-thumb-border-width, 2px) solid var(--slider-thumb-border-color, var(--color-primary, #3b82f6));border-radius:50%;box-shadow:var(--slider-thumb-shadow, 0 1px 3px rgba(0, 0, 0, .1));cursor:grab;transform:translate(-50%,-50%);top:50%;transition:transform .15s ease,box-shadow .15s ease;outline:none}.ds-slider__thumb:hover:not([aria-disabled=true]){transform:translate(-50%,-50%) scale(1.1);box-shadow:var(--slider-thumb-shadow-hover, 0 2px 8px rgba(0, 0, 0, .15))}.ds-slider__thumb:focus-visible{box-shadow:var(--slider-thumb-shadow-focus, 0 0 0 3px rgba(59, 130, 246, .3))}.ds-slider__thumb--active{cursor:grabbing;transform:translate(-50%,-50%) scale(1.15);box-shadow:var(--slider-thumb-shadow-active, 0 0 0 4px rgba(59, 130, 246, .2))}.ds-slider__thumb[aria-disabled=true]{cursor:not-allowed;opacity:.5}.ds-slider__thumb-label{position:absolute;top:-32px;left:50%;transform:translate(-50%);background-color:var(--slider-thumb-label-bg, var(--gray-900, #111827));color:var(--slider-thumb-label-color, var(--white, #ffffff));font-size:var(--font-size-1, .75rem);padding:var(--space-1, .25rem) var(--space-2, .5rem);border-radius:var(--radius-1, .25rem);white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .15s ease}.ds-slider__thumb:hover .ds-slider__thumb-label,.ds-slider__thumb:focus .ds-slider__thumb-label,.ds-slider__thumb--active .ds-slider__thumb-label{opacity:1}.ds-slider--sm .ds-slider__track{height:var(--slider-track-height-sm, 4px)}.ds-slider--sm .ds-slider__thumb{width:var(--slider-thumb-size-sm, 16px);height:var(--slider-thumb-size-sm, 16px)}.ds-slider--sm .ds-slider__label{font-size:var(--font-size-1, .75rem)}.ds-slider--lg .ds-slider__track{height:var(--slider-track-height-lg, 8px)}.ds-slider--lg .ds-slider__thumb{width:var(--slider-thumb-size-lg, 24px);height:var(--slider-thumb-size-lg, 24px)}.ds-slider--lg .ds-slider__label{font-size:var(--font-size-3, 1rem)}.ds-slider--disabled{opacity:.6;pointer-events:none}.ds-slider--disabled .ds-slider__track{cursor:not-allowed}.ds-slider--vertical{flex-direction:column;height:200px;width:auto}.ds-slider--vertical .ds-slider__label--min{order:3}.ds-slider--vertical .ds-slider__label--max{order:1}.ds-slider--vertical .ds-slider__track-container{flex:1;width:auto;height:100%;display:flex;justify-content:center}.ds-slider--vertical .ds-slider__track{width:var(--slider-track-height-md, 6px);height:100%}.ds-slider--vertical .ds-slider__fill{width:100%;height:auto}.ds-slider--vertical .ds-slider__thumb{left:50%;top:auto;transform:translate(-50%,50%)}.ds-slider--vertical .ds-slider__thumb:hover:not([aria-disabled=true]){transform:translate(-50%,50%) scale(1.1)}.ds-slider--vertical .ds-slider__thumb--active{transform:translate(-50%,50%) scale(1.15)}.ds-slider--vertical .ds-slider__thumb-label{top:50%;left:32px;transform:translateY(-50%)}.ds-slider--vertical .ds-slider__tick{left:50%;top:auto;transform:translate(-50%,50%)}.ds-slider--vertical.ds-slider--sm .ds-slider__track{width:var(--slider-track-height-sm, 4px)}.ds-slider--vertical.ds-slider--lg .ds-slider__track{width:var(--slider-track-height-lg, 8px)}\n"] }]
8133
+ }], ctorParameters: () => [], propDecorators: { min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], range: [{ type: i0.Input, args: [{ isSignal: true, alias: "range", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], showLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabels", required: false }] }], showTicks: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTicks", required: false }] }], tickInterval: [{ type: i0.Input, args: [{ isSignal: true, alias: "tickInterval", required: false }] }], formatLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "formatLabel", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], trackElement: [{
8134
+ type: ViewChild,
8135
+ args: ['track', { static: false }]
8136
+ }], thumb1Element: [{
8137
+ type: ViewChild,
8138
+ args: ['thumb1', { static: false }]
8139
+ }], thumb2Element: [{
8140
+ type: ViewChild,
8141
+ args: ['thumb2', { static: false }]
8142
+ }] } });
8143
+
8144
+ /**
8145
+ * # DsFileUpload
8146
+ *
8147
+ * Composant de téléchargement de fichiers avec support drag & drop,
8148
+ * validation, preview et barre de progression.
8149
+ *
8150
+ * ## Usage
8151
+ *
8152
+ * ```html
8153
+ * <!-- Upload simple -->
8154
+ * <ds-file-upload
8155
+ * [accept]="'image/*'"
8156
+ * [maxFileSize]="5242880"
8157
+ * (filesChange)="onFilesChange($event)">
8158
+ * </ds-file-upload>
8159
+ *
8160
+ * <!-- Upload multiple avec preview -->
8161
+ * <ds-file-upload
8162
+ * [multiple]="true"
8163
+ * [showPreview]="true"
8164
+ * [maxFiles]="5"
8165
+ * size="lg">
8166
+ * </ds-file-upload>
8167
+ * ```
8168
+ *
8169
+ * ## Accessibilité
8170
+ *
8171
+ * - Input natif avec label accessible
8172
+ * - Drag & drop avec feedback ARIA
8173
+ * - Messages d'erreur associés via aria-describedby
8174
+ *
8175
+ * @component
8176
+ */
8177
+ class DsFileUpload {
8178
+ /**
8179
+ * Types de fichiers acceptés (ex: 'image/*,.pdf').
8180
+ * @default '*'
8181
+ */
8182
+ accept = input('*', ...(ngDevMode ? [{ debugName: "accept" }] : []));
8183
+ /**
8184
+ * Taille maximale d'un fichier en bytes.
8185
+ * @default 10485760 (10 MB)
8186
+ */
8187
+ maxFileSize = input(10485760, ...(ngDevMode ? [{ debugName: "maxFileSize" }] : []));
8188
+ /**
8189
+ * Nombre maximum de fichiers.
8190
+ * @default 1
8191
+ */
8192
+ maxFiles = input(1, ...(ngDevMode ? [{ debugName: "maxFiles" }] : []));
8193
+ /**
8194
+ * Permet la sélection multiple de fichiers.
8195
+ * @default false
8196
+ */
8197
+ multiple = input(false, ...(ngDevMode ? [{ debugName: "multiple" }] : []));
8198
+ /**
8199
+ * Désactive le composant.
8200
+ * @default false
8201
+ */
8202
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
8203
+ /**
8204
+ * Taille du composant.
8205
+ * @default 'md'
8206
+ */
8207
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
8208
+ /**
8209
+ * Affiche une preview pour les images.
8210
+ * @default true
8211
+ */
8212
+ showPreview = input(true, ...(ngDevMode ? [{ debugName: "showPreview" }] : []));
8213
+ /**
8214
+ * Label personnalisé pour le bouton.
8215
+ */
8216
+ label = input('Choisir un fichier', ...(ngDevMode ? [{ debugName: "label" }] : []));
8217
+ /**
8218
+ * Texte d'aide pour le drag & drop.
8219
+ */
8220
+ dragHelpText = input('ou glisser-déposer ici', ...(ngDevMode ? [{ debugName: "dragHelpText" }] : []));
8221
+ /**
8222
+ * Événement émis lors du changement de fichiers.
8223
+ */
8224
+ filesChange = output();
8225
+ /**
8226
+ * Événement émis lors de la suppression d'un fichier.
8227
+ */
8228
+ fileRemoved = output();
8229
+ /**
8230
+ * Événement émis lors de la progression de l'upload.
8231
+ */
8232
+ uploadProgress = output();
8233
+ // Icons (readonly for template access)
8234
+ faCloudArrowUp = faCloudArrowUp;
8235
+ faXmark = faXmark;
8236
+ faFile = faFile;
8237
+ faFileImage = faFileImage;
8238
+ faFilePdf = faFilePdf;
8239
+ faFileWord = faFileWord;
8240
+ faFileExcel = faFileExcel;
8241
+ // ViewChild pour l'input file
8242
+ fileInput = viewChild('fileInput', ...(ngDevMode ? [{ debugName: "fileInput" }] : []));
8243
+ // État interne
8244
+ files = signal([], ...(ngDevMode ? [{ debugName: "files" }] : []));
8245
+ isDragging = signal(false, ...(ngDevMode ? [{ debugName: "isDragging" }] : []));
8246
+ errorMessage = signal('', ...(ngDevMode ? [{ debugName: "errorMessage" }] : []));
8247
+ // ControlValueAccessor
8248
+ onChange = () => { };
8249
+ onTouched = () => { };
8250
+ /**
8251
+ * Classes CSS calculées pour le conteneur (public pour tests).
8252
+ */
8253
+ containerClasses = computed(() => {
8254
+ return [
8255
+ 'ds-file-upload',
8256
+ `ds-file-upload--${this.size()}`,
8257
+ this.isDragging() ? 'ds-file-upload--dragging' : '',
8258
+ this.disabled() ? 'ds-file-upload--disabled' : '',
8259
+ this.errorMessage() ? 'ds-file-upload--error' : '',
8260
+ ].filter(Boolean);
8261
+ }, ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
8262
+ /**
8263
+ * Nombre de fichiers actuellement sélectionnés (public pour tests).
8264
+ */
8265
+ fileCount = computed(() => this.files().length, ...(ngDevMode ? [{ debugName: "fileCount" }] : []));
8266
+ /**
8267
+ * Vérifie si la limite de fichiers est atteinte (public pour tests).
8268
+ */
8269
+ isMaxFilesReached = computed(() => this.fileCount() >= this.maxFiles(), ...(ngDevMode ? [{ debugName: "isMaxFilesReached" }] : []));
8270
+ /**
8271
+ * Ouvre le sélecteur de fichiers.
8272
+ */
8273
+ openFileSelector() {
8274
+ if (this.disabled() || this.isMaxFilesReached()) {
8275
+ return;
8276
+ }
8277
+ this.fileInput()?.nativeElement.click();
8278
+ }
8279
+ /**
8280
+ * Gère la sélection de fichiers via l'input.
8281
+ */
8282
+ onFileSelect(event) {
8283
+ const input = event.target;
8284
+ if (!input.files?.length) {
8285
+ return;
8286
+ }
8287
+ this.handleFiles(Array.from(input.files));
8288
+ input.value = ''; // Reset pour permettre la réutilisation
8289
+ }
8290
+ /**
8291
+ * Gère le début du drag.
8292
+ */
8293
+ onDragEnter(event) {
8294
+ event.preventDefault();
8295
+ event.stopPropagation();
8296
+ if (!this.disabled() && !this.isMaxFilesReached()) {
8297
+ this.isDragging.set(true);
8298
+ }
8299
+ }
8300
+ /**
8301
+ * Gère le survol pendant le drag.
8302
+ */
8303
+ onDragOver(event) {
8304
+ event.preventDefault();
8305
+ event.stopPropagation();
8306
+ }
8307
+ /**
8308
+ * Gère la sortie du drag.
8309
+ */
8310
+ onDragLeave(event) {
8311
+ event.preventDefault();
8312
+ event.stopPropagation();
8313
+ const target = event.currentTarget;
8314
+ const related = event.relatedTarget;
8315
+ if (!target.contains(related)) {
8316
+ this.isDragging.set(false);
8317
+ }
8318
+ }
8319
+ /**
8320
+ * Gère le drop des fichiers.
8321
+ */
8322
+ onDrop(event) {
8323
+ event.preventDefault();
8324
+ event.stopPropagation();
8325
+ this.isDragging.set(false);
8326
+ if (this.disabled() || this.isMaxFilesReached()) {
8327
+ return;
8328
+ }
8329
+ const files = event.dataTransfer?.files;
8330
+ if (files?.length) {
8331
+ this.handleFiles(Array.from(files));
8332
+ }
8333
+ }
8334
+ /**
8335
+ * Traite les fichiers sélectionnés ou déposés.
8336
+ */
8337
+ handleFiles(newFiles) {
8338
+ this.errorMessage.set('');
8339
+ // En mode single, on remplace toujours le fichier existant
8340
+ if (!this.multiple()) {
8341
+ // Mode single : remplacer le fichier existant
8342
+ const filesToAdd = [newFiles[0]];
8343
+ // Valider et ajouter le fichier
8344
+ const validFiles = [];
8345
+ for (const file of filesToAdd) {
8346
+ const validation = this.validateFile(file);
8347
+ if (validation.valid) {
8348
+ const uploadFile = {
8349
+ file,
8350
+ progress: 0,
8351
+ };
8352
+ // Générer preview pour les images
8353
+ if (this.showPreview() && file.type.startsWith('image/')) {
8354
+ this.generatePreview(file, uploadFile);
8355
+ }
8356
+ validFiles.push(uploadFile);
8357
+ }
8358
+ else {
8359
+ this.errorMessage.set(validation.error || 'Fichier invalide');
8360
+ }
8361
+ }
8362
+ if (validFiles.length > 0) {
8363
+ this.files.set(validFiles);
8364
+ this.notifyChange();
8365
+ this.simulateUpload(validFiles);
8366
+ }
8367
+ return;
8368
+ }
8369
+ // Mode multiple : vérifier la limite de fichiers
8370
+ const currentCount = this.fileCount();
8371
+ const maxFiles = this.maxFiles();
8372
+ const availableSlots = maxFiles - currentCount;
8373
+ if (availableSlots <= 0) {
8374
+ this.errorMessage.set(`Limite de ${maxFiles} fichier(s) atteinte`);
8375
+ return;
8376
+ }
8377
+ // Limiter le nombre de nouveaux fichiers
8378
+ const filesToAdd = newFiles.slice(0, availableSlots);
8379
+ // Valider et ajouter les fichiers
8380
+ const validFiles = [];
8381
+ for (const file of filesToAdd) {
8382
+ const validation = this.validateFile(file);
8383
+ if (validation.valid) {
8384
+ const uploadFile = {
8385
+ file,
8386
+ progress: 0,
8387
+ };
8388
+ // Générer preview pour les images
8389
+ if (this.showPreview() && file.type.startsWith('image/')) {
8390
+ this.generatePreview(file, uploadFile);
8391
+ }
8392
+ validFiles.push(uploadFile);
8393
+ }
8394
+ else {
8395
+ this.errorMessage.set(validation.error || 'Fichier invalide');
8396
+ }
8397
+ }
8398
+ if (validFiles.length > 0) {
8399
+ // Mode multiple : ajouter aux fichiers existants
8400
+ this.files.update((current) => [...current, ...validFiles]);
8401
+ this.notifyChange();
8402
+ this.simulateUpload(validFiles);
8403
+ }
8404
+ }
8405
+ /**
8406
+ * Valide un fichier (taille, type).
8407
+ */
8408
+ validateFile(file) {
8409
+ // Vérifier la taille
8410
+ if (file.size > this.maxFileSize()) {
8411
+ const maxMB = (this.maxFileSize() / 1048576).toFixed(1);
8412
+ return {
8413
+ valid: false,
8414
+ error: `Fichier trop volumineux (max ${maxMB} MB)`,
8415
+ };
8416
+ }
8417
+ // Vérifier le type (si spécifié)
8418
+ const accept = this.accept();
8419
+ if (accept !== '*') {
8420
+ const acceptedTypes = accept.split(',').map((t) => t.trim());
8421
+ const isAccepted = acceptedTypes.some((type) => {
8422
+ if (type.startsWith('.')) {
8423
+ return file.name.toLowerCase().endsWith(type.toLowerCase());
8424
+ }
8425
+ if (type.endsWith('/*')) {
8426
+ const category = type.split('/')[0];
8427
+ return file.type.startsWith(category + '/');
8428
+ }
8429
+ return file.type === type;
8430
+ });
8431
+ if (!isAccepted) {
8432
+ return {
8433
+ valid: false,
8434
+ error: `Type de fichier non accepté`,
8435
+ };
8436
+ }
8437
+ }
8438
+ return { valid: true };
8439
+ }
8440
+ /**
8441
+ * Génère une preview pour les images.
8442
+ */
8443
+ generatePreview(file, uploadFile) {
8444
+ const reader = new FileReader();
8445
+ reader.onload = (e) => {
8446
+ uploadFile.preview = e.target?.result;
8447
+ this.files.update((files) => [...files]); // Trigger change detection
8448
+ };
8449
+ reader.readAsDataURL(file);
8450
+ }
8451
+ /**
8452
+ * Simule l'upload avec progression (pour démonstration).
8453
+ * Dans une vraie application, remplacer par un vrai upload HTTP.
8454
+ */
8455
+ simulateUpload(uploadFiles) {
8456
+ uploadFiles.forEach((uploadFile) => {
8457
+ const interval = setInterval(() => {
8458
+ uploadFile.progress += 10;
8459
+ if (uploadFile.progress >= 100) {
8460
+ clearInterval(interval);
8461
+ }
8462
+ this.uploadProgress.emit({
8463
+ file: uploadFile.file,
8464
+ progress: uploadFile.progress,
8465
+ });
8466
+ this.files.update((files) => [...files]); // Trigger change detection
8467
+ }, 100);
8468
+ });
8469
+ }
8470
+ /**
8471
+ * Retire un fichier de la liste.
8472
+ */
8473
+ removeFile(uploadFile) {
8474
+ this.files.update((files) => files.filter((f) => f.file !== uploadFile.file));
8475
+ this.fileRemoved.emit(uploadFile.file);
8476
+ this.notifyChange();
8477
+ this.errorMessage.set('');
8478
+ }
8479
+ /**
8480
+ * Notifie le changement de valeur.
8481
+ */
8482
+ notifyChange() {
8483
+ const fileList = this.files().map((uf) => uf.file);
8484
+ this.filesChange.emit(fileList);
8485
+ this.onChange(fileList.length > 0 ? fileList : null);
8486
+ }
8487
+ /**
8488
+ * Retourne l'icône appropriée pour le type de fichier (public pour tests).
8489
+ */
8490
+ getFileIcon(file) {
8491
+ if (file.type.startsWith('image/')) {
8492
+ return this.faFileImage;
8493
+ }
8494
+ if (file.type === 'application/pdf') {
8495
+ return this.faFilePdf;
8496
+ }
8497
+ if (file.type ===
8498
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ||
8499
+ file.type === 'application/msword') {
8500
+ return this.faFileWord;
8501
+ }
8502
+ if (file.type ===
8503
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
8504
+ file.type === 'application/vnd.ms-excel') {
8505
+ return this.faFileExcel;
8506
+ }
8507
+ return this.faFile;
8508
+ }
8509
+ /**
8510
+ * Formate la taille du fichier en MB ou KB (public pour tests).
8511
+ */
8512
+ formatFileSize(bytes) {
8513
+ if (bytes >= 1048576) {
8514
+ return `${(bytes / 1048576).toFixed(1)} MB`;
8515
+ }
8516
+ return `${(bytes / 1024).toFixed(0)} KB`;
8517
+ }
8518
+ // ControlValueAccessor implementation
8519
+ writeValue(value) {
8520
+ if (!value) {
8521
+ this.files.set([]);
8522
+ return;
8523
+ }
8524
+ const uploadFiles = value.map((file) => ({
8525
+ file,
8526
+ progress: 100,
8527
+ }));
8528
+ this.files.set(uploadFiles);
8529
+ }
8530
+ registerOnChange(fn) {
8531
+ this.onChange = fn;
8532
+ }
8533
+ registerOnTouched(fn) {
8534
+ this.onTouched = fn;
8535
+ }
8536
+ setDisabledState(isDisabled) {
8537
+ // Le disabled est géré via input signal
8538
+ }
8539
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsFileUpload, deps: [], target: i0.ɵɵFactoryTarget.Component });
8540
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: DsFileUpload, isStandalone: true, selector: "ds-file-upload", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, showPreview: { classPropertyName: "showPreview", publicName: "showPreview", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, dragHelpText: { classPropertyName: "dragHelpText", publicName: "dragHelpText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesChange: "filesChange", fileRemoved: "fileRemoved", uploadProgress: "uploadProgress" }, providers: [
8541
+ {
8542
+ provide: NG_VALUE_ACCESSOR,
8543
+ useExisting: forwardRef(() => DsFileUpload),
8544
+ multi: true,
8545
+ },
8546
+ ], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n [ngClass]=\"containerClasses()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <!-- Zone de drop -->\n <div\n class=\"ds-file-upload__dropzone\"\n [class.ds-file-upload__dropzone--active]=\"isDragging()\"\n (click)=\"openFileSelector()\"\n [attr.tabindex]=\"disabled() ? null : 0\"\n [attr.aria-label]=\"label()\"\n role=\"button\"\n >\n <input\n #fileInput\n type=\"file\"\n class=\"ds-file-upload__input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled() || isMaxFilesReached()\"\n (change)=\"onFileSelect($event)\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n />\n\n <!-- Ic\u00F4ne et texte -->\n <div class=\"ds-file-upload__icon\">\n <fa-icon [icon]=\"faCloudArrowUp\" size=\"2x\"></fa-icon>\n </div>\n <div class=\"ds-file-upload__text\">\n <span class=\"ds-file-upload__label\">{{ label() }}</span>\n @if (!disabled() && !isMaxFilesReached()) {\n <span class=\"ds-file-upload__help\">{{ dragHelpText() }}</span>\n }\n @if (isMaxFilesReached()) {\n <span class=\"ds-file-upload__limit\">Limite atteinte ({{ maxFiles() }} fichier{{ maxFiles() > 1 ? 's' : '' }})</span>\n }\n </div>\n\n <!-- Message d'erreur global -->\n @if (errorMessage()) {\n <div class=\"ds-file-upload__error\" role=\"alert\">\n {{ errorMessage() }}\n </div>\n }\n\n <!-- Indications -->\n @if (!errorMessage() && accept() !== '*') {\n <div class=\"ds-file-upload__hint\">\n Types accept\u00E9s : {{ accept() }}\n </div>\n }\n @if (!errorMessage() && maxFileSize()) {\n <div class=\"ds-file-upload__hint\">\n Taille max : {{ formatFileSize(maxFileSize()) }}\n </div>\n }\n </div>\n\n <!-- Liste des fichiers -->\n @if (fileCount() > 0) {\n <div class=\"ds-file-upload__files\">\n @for (uploadFile of files(); track uploadFile.file.name) {\n <div class=\"ds-file-upload__file\">\n <!-- Preview image -->\n @if (showPreview() && uploadFile.preview) {\n <div class=\"ds-file-upload__preview\">\n <img [src]=\"uploadFile.preview\" [alt]=\"uploadFile.file.name\" />\n </div>\n } @else {\n <div class=\"ds-file-upload__file-icon\">\n <fa-icon [icon]=\"getFileIcon(uploadFile.file)\"></fa-icon>\n </div>\n }\n\n <!-- Infos fichier -->\n <div class=\"ds-file-upload__file-info\">\n <div class=\"ds-file-upload__file-name\" [title]=\"uploadFile.file.name\">\n {{ uploadFile.file.name }}\n </div>\n <div class=\"ds-file-upload__file-size\">\n {{ formatFileSize(uploadFile.file.size) }}\n </div>\n\n <!-- Barre de progression -->\n @if (uploadFile.progress < 100) {\n <ds-progress-bar\n [value]=\"uploadFile.progress\"\n size=\"sm\"\n variant=\"default\"\n [showLabel]=\"true\"\n ></ds-progress-bar>\n }\n\n <!-- Message d'erreur fichier -->\n @if (uploadFile.error) {\n <div class=\"ds-file-upload__file-error\" role=\"alert\">\n {{ uploadFile.error }}\n </div>\n }\n </div>\n\n <!-- Bouton supprimer -->\n <button\n type=\"button\"\n class=\"ds-file-upload__remove\"\n (click)=\"removeFile(uploadFile)\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'Supprimer ' + uploadFile.file.name\"\n >\n <fa-icon [icon]=\"faXmark\"></fa-icon>\n </button>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".ds-file-upload{display:block;font-family:var(--font-family-base)}.ds-file-upload__dropzone{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-8);border:2px dashed var(--file-upload-border, var(--gray-300));border-radius:var(--file-upload-radius, var(--radius-2));background:var(--file-upload-bg, var(--white));cursor:pointer;transition:all .2s ease;position:relative;min-height:200px}.ds-file-upload__dropzone:hover:not(.ds-file-upload--disabled .ds-file-upload__dropzone){border-color:var(--file-upload-border-hover, var(--color-primary));background:var(--file-upload-bg-hover, var(--gray-50))}.ds-file-upload__dropzone:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ds-file-upload__dropzone--active{border-color:var(--file-upload-border-active, var(--color-primary));background:var(--file-upload-bg-active, var(--blue-50))}.ds-file-upload__input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ds-file-upload__icon{color:var(--file-upload-icon-color, var(--gray-400));margin-bottom:var(--space-3);transition:color .2s ease}.ds-file-upload__dropzone:hover .ds-file-upload__icon{color:var(--file-upload-icon-color-hover, var(--color-primary))}.ds-file-upload__dropzone--active .ds-file-upload__icon{color:var(--file-upload-icon-color-active, var(--color-primary));transform:scale(1.1)}.ds-file-upload__text{text-align:center;color:var(--file-upload-text-color, var(--gray-700))}.ds-file-upload__label{display:block;font-size:var(--font-size-base, var(--font-size-3));font-weight:500;margin-bottom:var(--space-1);color:var(--file-upload-label-color, var(--gray-900))}.ds-file-upload__help{display:block;font-size:var(--font-size-sm, var(--font-size-2));color:var(--file-upload-help-color, var(--gray-500))}.ds-file-upload__limit{display:block;font-size:var(--font-size-sm, var(--font-size-2));color:var(--warning);font-weight:500}.ds-file-upload__error{margin-top:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--error-bg, var(--red-50));color:var(--error);border-radius:var(--radius-1);font-size:var(--font-size-sm, var(--font-size-2));text-align:center}.ds-file-upload__hint{margin-top:var(--space-1);font-size:var(--font-size-xs, var(--font-size-1));color:var(--file-upload-hint-color, var(--gray-500));text-align:center}.ds-file-upload__files{margin-top:var(--space-4);display:flex;flex-direction:column;gap:var(--space-3)}.ds-file-upload__file{display:flex;align-items:flex-start;gap:var(--space-3);padding:var(--space-3);border:1px solid var(--file-upload-file-border, var(--gray-200));border-radius:var(--radius-2);background:var(--file-upload-file-bg, var(--white));transition:all .2s ease}.ds-file-upload__file:hover{background:var(--file-upload-file-bg-hover, var(--gray-50))}.ds-file-upload__preview{flex-shrink:0;width:60px;height:60px;border-radius:var(--radius-1);overflow:hidden;border:1px solid var(--gray-200)}.ds-file-upload__preview img{width:100%;height:100%;object-fit:cover}.ds-file-upload__file-icon{flex-shrink:0;width:60px;height:60px;display:flex;align-items:center;justify-content:center;background:var(--gray-50);border-radius:var(--radius-1);color:var(--gray-400);font-size:var(--font-size-5)}.ds-file-upload__file-info{flex:1;min-width:0}.ds-file-upload__file-name{font-size:var(--font-size-sm, var(--font-size-2));font-weight:500;color:var(--gray-900);margin-bottom:var(--space-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ds-file-upload__file-size{font-size:var(--font-size-xs, var(--font-size-1));color:var(--gray-500);margin-bottom:var(--space-2)}.ds-file-upload__file-error{margin-top:var(--space-2);padding:var(--space-1) var(--space-2);background:var(--error-bg, var(--red-50));color:var(--error);border-radius:var(--radius-1);font-size:var(--font-size-xs, var(--font-size-1))}.ds-file-upload__remove{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;color:var(--gray-400);border-radius:var(--radius-1);cursor:pointer;transition:all .2s ease}.ds-file-upload__remove:hover:not(:disabled){background:var(--gray-100);color:var(--error)}.ds-file-upload__remove:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ds-file-upload__remove:disabled{opacity:.5;cursor:not-allowed}.ds-file-upload--sm .ds-file-upload__dropzone{min-height:150px;padding:var(--space-6)}.ds-file-upload--sm .ds-file-upload__label{font-size:var(--font-size-sm, var(--font-size-2))}.ds-file-upload--sm .ds-file-upload__preview,.ds-file-upload--sm .ds-file-upload__file-icon{width:48px;height:48px}.ds-file-upload--lg .ds-file-upload__dropzone{min-height:250px;padding:var(--space-10)}.ds-file-upload--lg .ds-file-upload__label{font-size:var(--font-size-lg, var(--font-size-4))}.ds-file-upload--lg .ds-file-upload__preview,.ds-file-upload--lg .ds-file-upload__file-icon{width:80px;height:80px}.ds-file-upload--disabled{opacity:.6;cursor:not-allowed}.ds-file-upload--disabled .ds-file-upload__dropzone{cursor:not-allowed;pointer-events:none}.ds-file-upload--error .ds-file-upload__dropzone{border-color:var(--error)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "component", type: DsProgressBar, selector: "ds-progress-bar", inputs: ["value", "variant", "size", "mode", "showLabel", "ariaLabel"] }] });
8547
+ }
8548
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: DsFileUpload, decorators: [{
8549
+ type: Component,
8550
+ args: [{ selector: 'ds-file-upload', imports: [CommonModule, FaIconComponent, DsProgressBar], providers: [
8551
+ {
8552
+ provide: NG_VALUE_ACCESSOR,
8553
+ useExisting: forwardRef(() => DsFileUpload),
8554
+ multi: true,
8555
+ },
8556
+ ], template: "<div\n [ngClass]=\"containerClasses()\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n <!-- Zone de drop -->\n <div\n class=\"ds-file-upload__dropzone\"\n [class.ds-file-upload__dropzone--active]=\"isDragging()\"\n (click)=\"openFileSelector()\"\n [attr.tabindex]=\"disabled() ? null : 0\"\n [attr.aria-label]=\"label()\"\n role=\"button\"\n >\n <input\n #fileInput\n type=\"file\"\n class=\"ds-file-upload__input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled() || isMaxFilesReached()\"\n (change)=\"onFileSelect($event)\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n />\n\n <!-- Ic\u00F4ne et texte -->\n <div class=\"ds-file-upload__icon\">\n <fa-icon [icon]=\"faCloudArrowUp\" size=\"2x\"></fa-icon>\n </div>\n <div class=\"ds-file-upload__text\">\n <span class=\"ds-file-upload__label\">{{ label() }}</span>\n @if (!disabled() && !isMaxFilesReached()) {\n <span class=\"ds-file-upload__help\">{{ dragHelpText() }}</span>\n }\n @if (isMaxFilesReached()) {\n <span class=\"ds-file-upload__limit\">Limite atteinte ({{ maxFiles() }} fichier{{ maxFiles() > 1 ? 's' : '' }})</span>\n }\n </div>\n\n <!-- Message d'erreur global -->\n @if (errorMessage()) {\n <div class=\"ds-file-upload__error\" role=\"alert\">\n {{ errorMessage() }}\n </div>\n }\n\n <!-- Indications -->\n @if (!errorMessage() && accept() !== '*') {\n <div class=\"ds-file-upload__hint\">\n Types accept\u00E9s : {{ accept() }}\n </div>\n }\n @if (!errorMessage() && maxFileSize()) {\n <div class=\"ds-file-upload__hint\">\n Taille max : {{ formatFileSize(maxFileSize()) }}\n </div>\n }\n </div>\n\n <!-- Liste des fichiers -->\n @if (fileCount() > 0) {\n <div class=\"ds-file-upload__files\">\n @for (uploadFile of files(); track uploadFile.file.name) {\n <div class=\"ds-file-upload__file\">\n <!-- Preview image -->\n @if (showPreview() && uploadFile.preview) {\n <div class=\"ds-file-upload__preview\">\n <img [src]=\"uploadFile.preview\" [alt]=\"uploadFile.file.name\" />\n </div>\n } @else {\n <div class=\"ds-file-upload__file-icon\">\n <fa-icon [icon]=\"getFileIcon(uploadFile.file)\"></fa-icon>\n </div>\n }\n\n <!-- Infos fichier -->\n <div class=\"ds-file-upload__file-info\">\n <div class=\"ds-file-upload__file-name\" [title]=\"uploadFile.file.name\">\n {{ uploadFile.file.name }}\n </div>\n <div class=\"ds-file-upload__file-size\">\n {{ formatFileSize(uploadFile.file.size) }}\n </div>\n\n <!-- Barre de progression -->\n @if (uploadFile.progress < 100) {\n <ds-progress-bar\n [value]=\"uploadFile.progress\"\n size=\"sm\"\n variant=\"default\"\n [showLabel]=\"true\"\n ></ds-progress-bar>\n }\n\n <!-- Message d'erreur fichier -->\n @if (uploadFile.error) {\n <div class=\"ds-file-upload__file-error\" role=\"alert\">\n {{ uploadFile.error }}\n </div>\n }\n </div>\n\n <!-- Bouton supprimer -->\n <button\n type=\"button\"\n class=\"ds-file-upload__remove\"\n (click)=\"removeFile(uploadFile)\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'Supprimer ' + uploadFile.file.name\"\n >\n <fa-icon [icon]=\"faXmark\"></fa-icon>\n </button>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".ds-file-upload{display:block;font-family:var(--font-family-base)}.ds-file-upload__dropzone{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-8);border:2px dashed var(--file-upload-border, var(--gray-300));border-radius:var(--file-upload-radius, var(--radius-2));background:var(--file-upload-bg, var(--white));cursor:pointer;transition:all .2s ease;position:relative;min-height:200px}.ds-file-upload__dropzone:hover:not(.ds-file-upload--disabled .ds-file-upload__dropzone){border-color:var(--file-upload-border-hover, var(--color-primary));background:var(--file-upload-bg-hover, var(--gray-50))}.ds-file-upload__dropzone:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ds-file-upload__dropzone--active{border-color:var(--file-upload-border-active, var(--color-primary));background:var(--file-upload-bg-active, var(--blue-50))}.ds-file-upload__input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ds-file-upload__icon{color:var(--file-upload-icon-color, var(--gray-400));margin-bottom:var(--space-3);transition:color .2s ease}.ds-file-upload__dropzone:hover .ds-file-upload__icon{color:var(--file-upload-icon-color-hover, var(--color-primary))}.ds-file-upload__dropzone--active .ds-file-upload__icon{color:var(--file-upload-icon-color-active, var(--color-primary));transform:scale(1.1)}.ds-file-upload__text{text-align:center;color:var(--file-upload-text-color, var(--gray-700))}.ds-file-upload__label{display:block;font-size:var(--font-size-base, var(--font-size-3));font-weight:500;margin-bottom:var(--space-1);color:var(--file-upload-label-color, var(--gray-900))}.ds-file-upload__help{display:block;font-size:var(--font-size-sm, var(--font-size-2));color:var(--file-upload-help-color, var(--gray-500))}.ds-file-upload__limit{display:block;font-size:var(--font-size-sm, var(--font-size-2));color:var(--warning);font-weight:500}.ds-file-upload__error{margin-top:var(--space-2);padding:var(--space-2) var(--space-3);background:var(--error-bg, var(--red-50));color:var(--error);border-radius:var(--radius-1);font-size:var(--font-size-sm, var(--font-size-2));text-align:center}.ds-file-upload__hint{margin-top:var(--space-1);font-size:var(--font-size-xs, var(--font-size-1));color:var(--file-upload-hint-color, var(--gray-500));text-align:center}.ds-file-upload__files{margin-top:var(--space-4);display:flex;flex-direction:column;gap:var(--space-3)}.ds-file-upload__file{display:flex;align-items:flex-start;gap:var(--space-3);padding:var(--space-3);border:1px solid var(--file-upload-file-border, var(--gray-200));border-radius:var(--radius-2);background:var(--file-upload-file-bg, var(--white));transition:all .2s ease}.ds-file-upload__file:hover{background:var(--file-upload-file-bg-hover, var(--gray-50))}.ds-file-upload__preview{flex-shrink:0;width:60px;height:60px;border-radius:var(--radius-1);overflow:hidden;border:1px solid var(--gray-200)}.ds-file-upload__preview img{width:100%;height:100%;object-fit:cover}.ds-file-upload__file-icon{flex-shrink:0;width:60px;height:60px;display:flex;align-items:center;justify-content:center;background:var(--gray-50);border-radius:var(--radius-1);color:var(--gray-400);font-size:var(--font-size-5)}.ds-file-upload__file-info{flex:1;min-width:0}.ds-file-upload__file-name{font-size:var(--font-size-sm, var(--font-size-2));font-weight:500;color:var(--gray-900);margin-bottom:var(--space-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ds-file-upload__file-size{font-size:var(--font-size-xs, var(--font-size-1));color:var(--gray-500);margin-bottom:var(--space-2)}.ds-file-upload__file-error{margin-top:var(--space-2);padding:var(--space-1) var(--space-2);background:var(--error-bg, var(--red-50));color:var(--error);border-radius:var(--radius-1);font-size:var(--font-size-xs, var(--font-size-1))}.ds-file-upload__remove{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;color:var(--gray-400);border-radius:var(--radius-1);cursor:pointer;transition:all .2s ease}.ds-file-upload__remove:hover:not(:disabled){background:var(--gray-100);color:var(--error)}.ds-file-upload__remove:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ds-file-upload__remove:disabled{opacity:.5;cursor:not-allowed}.ds-file-upload--sm .ds-file-upload__dropzone{min-height:150px;padding:var(--space-6)}.ds-file-upload--sm .ds-file-upload__label{font-size:var(--font-size-sm, var(--font-size-2))}.ds-file-upload--sm .ds-file-upload__preview,.ds-file-upload--sm .ds-file-upload__file-icon{width:48px;height:48px}.ds-file-upload--lg .ds-file-upload__dropzone{min-height:250px;padding:var(--space-10)}.ds-file-upload--lg .ds-file-upload__label{font-size:var(--font-size-lg, var(--font-size-4))}.ds-file-upload--lg .ds-file-upload__preview,.ds-file-upload--lg .ds-file-upload__file-icon{width:80px;height:80px}.ds-file-upload--disabled{opacity:.6;cursor:not-allowed}.ds-file-upload--disabled .ds-file-upload__dropzone{cursor:not-allowed;pointer-events:none}.ds-file-upload--error .ds-file-upload__dropzone{border-color:var(--error)}\n"] }]
8557
+ }], propDecorators: { accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], maxFileSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSize", required: false }] }], maxFiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFiles", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], showPreview: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPreview", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], dragHelpText: [{ type: i0.Input, args: [{ isSignal: true, alias: "dragHelpText", required: false }] }], filesChange: [{ type: i0.Output, args: ["filesChange"] }], fileRemoved: [{ type: i0.Output, args: ["fileRemoved"] }], uploadProgress: [{ type: i0.Output, args: ["uploadProgress"] }], fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }] } });
8558
+
7538
8559
  /*
7539
8560
  * Components barrel export
7540
8561
  */
@@ -7738,7 +8759,7 @@ class IconRegistryService {
7738
8759
  getIconGroups() {
7739
8760
  return Array.from(this.iconGroups.keys());
7740
8761
  }
7741
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: IconRegistryService, deps: [{ token: i2.FaIconLibrary }], target: i0.ɵɵFactoryTarget.Injectable });
8762
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: IconRegistryService, deps: [{ token: i1$1.FaIconLibrary }], target: i0.ɵɵFactoryTarget.Injectable });
7742
8763
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: IconRegistryService, providedIn: 'root' });
7743
8764
  }
7744
8765
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: IconRegistryService, decorators: [{
@@ -7746,7 +8767,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
7746
8767
  args: [{
7747
8768
  providedIn: 'root',
7748
8769
  }]
7749
- }], ctorParameters: () => [{ type: i2.FaIconLibrary }] });
8770
+ }], ctorParameters: () => [{ type: i1$1.FaIconLibrary }] });
7750
8771
 
7751
8772
  /**
7752
8773
  * Labels par défaut en français.
@@ -8106,5 +9127,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
8106
9127
  * Generated bundle index. Do not edit.
8107
9128
  */
8108
9129
 
8109
- export { AUTOCOMPLETE_POSITIONS, BUTTON_APPEARANCE_OPTIONS, BUTTON_SIZE_OPTIONS, BUTTON_VARIANT_OPTIONS, DROPDOWN_POSITIONS, DsAccordion, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCard, DsCheckbox, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDropdown, DsI18nService, DsInputField, DsInputTextarea, DsMenu, DsModalComponent, DsPagination, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsSearchInput, DsSelect, DsSkeleton, DsStepper, DsTable, DsTabs, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, TOOLTIP_POSITIONS, buildButtonArgTypes, buildButtonArgs, createSizeRender, createVariantRender };
9130
+ export { AUTOCOMPLETE_POSITIONS, BUTTON_APPEARANCE_OPTIONS, BUTTON_SIZE_OPTIONS, BUTTON_VARIANT_OPTIONS, DROPDOWN_POSITIONS, DsAccordion, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCard, DsCheckbox, DsChip, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDropdown, DsFileUpload, DsI18nService, DsInputField, DsInputTextarea, DsMenu, DsModalComponent, DsPagination, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsSearchInput, DsSelect, DsSkeleton, DsSlider, DsStepper, DsTable, DsTabs, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, TOOLTIP_POSITIONS, buildButtonArgTypes, buildButtonArgs, createSizeRender, createVariantRender };
8110
9131
  //# sourceMappingURL=kksdev-ds-angular.mjs.map