@kksdev/ds-angular 1.6.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -3,12 +3,12 @@ import { AfterViewInit, OnDestroy, ElementRef, QueryList, AfterContentInit, Even
3
3
  import { IconDefinition } from '@fortawesome/fontawesome-svg-core';
4
4
  import { IconDefinition as IconDefinition$1 } from '@fortawesome/free-solid-svg-icons';
5
5
  import { ControlValueAccessor } from '@angular/forms';
6
- import * as _angular_cdk_overlay from '@angular/cdk/overlay';
7
- import { Overlay, ConnectedPosition } from '@angular/cdk/overlay';
8
6
  import { IconDefinition as IconDefinition$2, FaIconLibrary } from '@fortawesome/angular-fontawesome';
7
+ import * as _angular_cdk_overlay from '@angular/cdk/overlay';
8
+ import { ConnectedPosition, Overlay } from '@angular/cdk/overlay';
9
9
  import * as _fortawesome_fontawesome_common_types from '@fortawesome/fontawesome-common-types';
10
10
  import * as _kksdev_ds_angular from '@kksdev/ds-angular';
11
- import { ArgTypes, Args } from '@storybook/angular';
11
+ import { CdkDragDrop } from '@angular/cdk/drag-drop';
12
12
 
13
13
  type BadgeType = 'status' | 'count' | 'label';
14
14
  type BadgeVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'error' | 'info' | 'neutral' | 'default' | 'accent';
@@ -2487,6 +2487,8 @@ interface DropdownItemDTO {
2487
2487
  endIcon: string;
2488
2488
  }
2489
2489
 
2490
+ /** Direction d'ouverture du dropdown */
2491
+ type DropdownPosition = 'bottom' | 'top' | 'right';
2490
2492
  declare class DsDropdown implements ControlValueAccessor, AfterViewInit, OnDestroy {
2491
2493
  /** Identifiant du menu déroulant pour l'accessibilité. */
2492
2494
  readonly id: _angular_core.InputSignal<string>;
@@ -2520,6 +2522,8 @@ declare class DsDropdown implements ControlValueAccessor, AfterViewInit, OnDestr
2520
2522
  readonly closeOnSelect: _angular_core.InputSignal<boolean>;
2521
2523
  /** Classes CSS supplémentaires appliquées au panneau. */
2522
2524
  readonly overlayPanelClass: _angular_core.InputSignal<string | string[] | undefined>;
2525
+ /** Direction d'ouverture du menu (bottom, top, right). */
2526
+ readonly position: _angular_core.InputSignal<DropdownPosition>;
2523
2527
  /** Émis lorsqu'un élément est sélectionné. */
2524
2528
  readonly selectedItemChanged: _angular_core.OutputEmitterRef<string>;
2525
2529
  /** Émis lors de l'ouverture du menu. */
@@ -2536,7 +2540,8 @@ declare class DsDropdown implements ControlValueAccessor, AfterViewInit, OnDestr
2536
2540
  private onTouched;
2537
2541
  private menuItemsChanges?;
2538
2542
  constructor();
2539
- readonly overlayPositions: _angular_cdk_overlay.ConnectedPosition[];
2543
+ /** Positions de l'overlay selon la prop position */
2544
+ readonly overlayPositions: _angular_core.Signal<ConnectedPosition[]>;
2540
2545
  readonly isMenuOpen: _angular_core.Signal<boolean>;
2541
2546
  readonly buttonType: _angular_core.Signal<ButtonType>;
2542
2547
  readonly isDisabled: _angular_core.Signal<boolean>;
@@ -2570,7 +2575,7 @@ declare class DsDropdown implements ControlValueAccessor, AfterViewInit, OnDestr
2570
2575
  private focusTriggerButton;
2571
2576
  private getMenuItemElement;
2572
2577
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsDropdown, never>;
2573
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsDropdown, "ds-dropdown", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "submit": { "alias": "submit"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "block": { "alias": "block"; "required": false; "isSignal": true; }; "dropdownStartIcon": { "alias": "dropdownStartIcon"; "required": false; "isSignal": true; }; "dropdownEndIcon": { "alias": "dropdownEndIcon"; "required": false; "isSignal": true; }; "dropdownItems": { "alias": "dropdownItems"; "required": false; "isSignal": true; }; "selectedItem": { "alias": "selectedItem"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "overlayPanelClass": { "alias": "overlayPanelClass"; "required": false; "isSignal": true; }; }, { "selectedItemChanged": "selectedItemChanged"; "opened": "opened"; "closed": "closed"; }, never, ["*"], true, never>;
2578
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsDropdown, "ds-dropdown", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "submit": { "alias": "submit"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "block": { "alias": "block"; "required": false; "isSignal": true; }; "dropdownStartIcon": { "alias": "dropdownStartIcon"; "required": false; "isSignal": true; }; "dropdownEndIcon": { "alias": "dropdownEndIcon"; "required": false; "isSignal": true; }; "dropdownItems": { "alias": "dropdownItems"; "required": false; "isSignal": true; }; "selectedItem": { "alias": "selectedItem"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "overlayPanelClass": { "alias": "overlayPanelClass"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; }, { "selectedItemChanged": "selectedItemChanged"; "opened": "opened"; "closed": "closed"; }, never, ["*"], true, never>;
2574
2579
  }
2575
2580
 
2576
2581
  declare class DsInputField implements ControlValueAccessor {
@@ -2627,41 +2632,138 @@ declare class DsInputField implements ControlValueAccessor {
2627
2632
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsInputField, "ds-input-field", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "iconStart": { "alias": "iconStart"; "required": false; "isSignal": true; }; "iconEnd": { "alias": "iconEnd"; "required": false; "isSignal": true; }; "externalValue": { "alias": "externalValue"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "helper": { "alias": "helper"; "required": false; "isSignal": true; }; "maxlength": { "alias": "maxlength"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "togglePassword": { "alias": "togglePassword"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2628
2633
  }
2629
2634
 
2635
+ /**
2636
+ * Composant textarea multiligne pour le Design System.
2637
+ *
2638
+ * Wrapper autour de `PrimitiveTextarea` avec support complet des formulaires Angular
2639
+ * via `ControlValueAccessor`. Inclut label, helper text, validation, compteur de caractères,
2640
+ * auto-resize et bouton d'effacement.
2641
+ *
2642
+ * @example
2643
+ * ```html
2644
+ * <!-- Usage simple -->
2645
+ * <ds-input-textarea
2646
+ * label="Description"
2647
+ * placeholder="Entrez votre description..."
2648
+ * [rows]="4">
2649
+ * </ds-input-textarea>
2650
+ *
2651
+ * <!-- Avec formulaire réactif -->
2652
+ * <ds-input-textarea
2653
+ * formControlName="description"
2654
+ * label="Description"
2655
+ * [maxlength]="500"
2656
+ * [clearable]="true">
2657
+ * </ds-input-textarea>
2658
+ * ```
2659
+ *
2660
+ * @usageNotes
2661
+ * ### Accessibilité
2662
+ * - Le label est associé au textarea via `for`/`id`
2663
+ * - Les messages d'aide/erreur sont liés via `aria-describedby`
2664
+ * - Les erreurs sont annoncées via `role="alert"`
2665
+ * - Navigation clavier standard
2666
+ *
2667
+ * ### Auto-resize
2668
+ * Utiliser `resizeAuto` pour activer le redimensionnement automatique.
2669
+ * La valeur définit la hauteur maximale en pixels.
2670
+ *
2671
+ * @selector ds-input-textarea
2672
+ * @standalone true
2673
+ */
2630
2674
  declare class DsInputTextarea implements ControlValueAccessor, AfterViewInit, OnDestroy {
2675
+ /** Identifiant unique du textarea. Auto-généré si non fourni. */
2631
2676
  id: _angular_core.InputSignal<string>;
2677
+ /** Nom du champ pour les formulaires HTML natifs. */
2632
2678
  name: _angular_core.InputSignal<string | undefined>;
2679
+ /** Label visible affiché au-dessus du textarea. */
2633
2680
  label: _angular_core.InputSignal<string | undefined>;
2681
+ /** Label accessible pour les lecteurs d'écran (si pas de label visible). */
2634
2682
  ariaLabel: _angular_core.InputSignal<string | undefined>;
2683
+ /** Texte indicatif affiché quand le champ est vide. */
2635
2684
  placeholder: _angular_core.InputSignal<string>;
2685
+ /** Désactive le champ (non modifiable, exclu de la navigation clavier). */
2636
2686
  disabled: _angular_core.InputSignal<boolean>;
2687
+ /** Champ en lecture seule (visible et sélectionnable, non modifiable). */
2637
2688
  readonly: _angular_core.InputSignal<boolean>;
2689
+ /** Marque le champ comme obligatoire (affiche * après le label). */
2638
2690
  required: _angular_core.InputSignal<boolean>;
2691
+ /**
2692
+ * État visuel de validation.
2693
+ * @default 'default'
2694
+ */
2639
2695
  state: _angular_core.InputSignal<TextareaState>;
2696
+ /**
2697
+ * Taille du composant.
2698
+ * @default 'md'
2699
+ */
2640
2700
  size: _angular_core.InputSignal<TextareaSize>;
2701
+ /**
2702
+ * Variante visuelle (outline ou filled).
2703
+ * @default 'default'
2704
+ */
2641
2705
  variant: _angular_core.InputSignal<TextareaAppearance>;
2706
+ /** Nombre de lignes visibles. */
2642
2707
  rows: _angular_core.InputSignal<number | undefined>;
2708
+ /** Nombre de colonnes (largeur en caractères). */
2643
2709
  cols: _angular_core.InputSignal<number | undefined>;
2710
+ /**
2711
+ * Mode de redimensionnement manuel.
2712
+ * Ignoré si `resizeAuto` est défini.
2713
+ * @default 'vertical'
2714
+ */
2644
2715
  resize: _angular_core.InputSignal<TextareaResize>;
2716
+ /**
2717
+ * Active le redimensionnement automatique.
2718
+ * La valeur définit la hauteur maximale en pixels.
2719
+ * Désactive le resize manuel.
2720
+ */
2645
2721
  resizeAuto: _angular_core.InputSignal<number | undefined>;
2722
+ /** Limite de caractères avec compteur affiché. */
2646
2723
  maxlength: _angular_core.InputSignal<number | undefined>;
2724
+ /** Texte d'aide affiché sous le champ. */
2647
2725
  helper: _angular_core.InputSignal<string | undefined>;
2726
+ /** Message d'erreur (remplace helper, force l'état 'error'). */
2648
2727
  error: _angular_core.InputSignal<string | undefined>;
2728
+ /** Icône FontAwesome à gauche du textarea. */
2649
2729
  iconStart: _angular_core.InputSignal<IconDefinition$1 | null>;
2730
+ /** Icône FontAwesome à droite du textarea. */
2650
2731
  iconEnd: _angular_core.InputSignal<IconDefinition$1 | null>;
2732
+ /** Affiche un bouton X pour effacer le contenu. */
2651
2733
  clearable: _angular_core.InputSignal<boolean>;
2734
+ /**
2735
+ * Valeur externe pour initialisation sans formulaire.
2736
+ * Utile pour les stories Storybook.
2737
+ */
2652
2738
  externalValue: _angular_core.InputSignal<string | null | undefined>;
2739
+ /** État disabled géré par ControlValueAccessor. */
2653
2740
  private readonly disabledState;
2741
+ /** Indique si une valeur externe a été fournie. */
2654
2742
  private readonly hasExternalValue;
2743
+ /** Valeur interne du textarea. */
2655
2744
  readonly internalValue: _angular_core.WritableSignal<string>;
2745
+ /**
2746
+ * Émis à chaque changement de valeur.
2747
+ * Payload : nouvelle valeur (string).
2748
+ */
2656
2749
  readonly valueChange: _angular_core.OutputEmitterRef<string>;
2750
+ /** ID de l'élément erreur pour aria-describedby. */
2657
2751
  readonly arErrorId: _angular_core.Signal<string | undefined>;
2752
+ /** ID de l'élément helper pour aria-describedby. */
2658
2753
  readonly arHelperId: _angular_core.Signal<string | undefined>;
2754
+ /** ID de l'élément compteur pour aria-describedby. */
2659
2755
  readonly arCounterId: _angular_core.Signal<string | undefined>;
2756
+ /** Attribut aria-describedby combinant erreur, helper et compteur. */
2660
2757
  readonly ariaDescribedBy: _angular_core.Signal<string | undefined>;
2758
+ /** True si le champ est désactivé (input ou CVA). */
2661
2759
  readonly isDisabled: _angular_core.Signal<boolean>;
2760
+ /** État visuel effectif (error forcé si message d'erreur). */
2662
2761
  readonly inputState: _angular_core.Signal<TextareaState>;
2762
+ /** True si le bouton clear doit être affiché. */
2663
2763
  readonly showClearButton: _angular_core.Signal<boolean>;
2764
+ /** Mode de resize effectif (none si resizeAuto activé). */
2664
2765
  readonly textareaResize: _angular_core.Signal<TextareaResize>;
2766
+ /** Nombre de caractères saisis. */
2665
2767
  readonly characterCount: _angular_core.Signal<number>;
2666
2768
  protected readonly faClose: IconDefinition$1;
2667
2769
  textareaHost?: ElementRef<HTMLElement>;
@@ -2729,23 +2831,129 @@ declare class DsModalComponent implements AfterContentInit, AfterViewInit, OnDes
2729
2831
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsModalComponent, "ds-modal", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; "showIcon": { "alias": "showIcon"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; }, ["projectedIcon"], ["[icon]", "*", "[footer]"], true, never>;
2730
2832
  }
2731
2833
 
2834
+ /**
2835
+ * Composant popover du Design System.
2836
+ *
2837
+ * Affiche un contenu contextuel dans une fenêtre flottante avec header/footer optionnels.
2838
+ * Utilisé conjointement avec la directive `dsPopover` pour le positionnement.
2839
+ *
2840
+ * @example
2841
+ * ```html
2842
+ * <ng-template #popoverContent>
2843
+ * <ds-popover header="Mon titre" [closeable]="true" (close)="onClose()">
2844
+ * <p>Contenu du popover</p>
2845
+ * </ds-popover>
2846
+ * </ng-template>
2847
+ *
2848
+ * <button [dsPopover]="popoverContent">Ouvrir</button>
2849
+ * ```
2850
+ *
2851
+ * @usageNotes
2852
+ * ### Accessibilité
2853
+ * - `role="dialog"` avec `aria-modal="true"` pour les lecteurs d'écran
2854
+ * - `aria-labelledby` pointe vers le header quand présent
2855
+ * - Bouton de fermeture avec label descriptif
2856
+ * - Fermeture via Escape gérée par la directive
2857
+ */
2732
2858
  declare class DsPopoverComponent {
2859
+ /**
2860
+ * Titre affiché dans le header du popover.
2861
+ * Quand présent, active `aria-labelledby` pour l'accessibilité.
2862
+ */
2733
2863
  header: _angular_core.InputSignal<string | undefined>;
2864
+ /**
2865
+ * Texte affiché dans le footer du popover.
2866
+ */
2734
2867
  footer: _angular_core.InputSignal<string | undefined>;
2868
+ /**
2869
+ * Affiche ou masque le bouton de fermeture dans le header.
2870
+ * @default true
2871
+ */
2735
2872
  closeable: _angular_core.InputSignal<boolean>;
2873
+ /**
2874
+ * Label ARIA du popover (utilisé quand pas de header).
2875
+ * @default 'Popover'
2876
+ */
2736
2877
  ariaLabel: _angular_core.InputSignal<string>;
2878
+ /**
2879
+ * ID unique pour le popover (génération automatique si non fourni).
2880
+ */
2881
+ id: _angular_core.InputSignal<string>;
2882
+ /**
2883
+ * Émis quand l'utilisateur clique sur le bouton de fermeture.
2884
+ */
2737
2885
  close: _angular_core.OutputEmitterRef<void>;
2886
+ /**
2887
+ * ID du header pour aria-labelledby.
2888
+ */
2889
+ protected readonly headerId: _angular_core.Signal<string>;
2890
+ /**
2891
+ * Label du bouton de fermeture (dynamique selon le header).
2892
+ */
2893
+ protected readonly closeButtonLabel: _angular_core.Signal<string>;
2738
2894
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsPopoverComponent, never>;
2739
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsPopoverComponent, "ds-popover", never, { "header": { "alias": "header"; "required": false; "isSignal": true; }; "footer": { "alias": "footer"; "required": false; "isSignal": true; }; "closeable": { "alias": "closeable"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, ["*"], true, never>;
2895
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsPopoverComponent, "ds-popover", never, { "header": { "alias": "header"; "required": false; "isSignal": true; }; "footer": { "alias": "footer"; "required": false; "isSignal": true; }; "closeable": { "alias": "closeable"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, { "close": "close"; }, never, ["*"], true, never>;
2740
2896
  }
2741
2897
 
2898
+ /**
2899
+ * Type de déclenchement du popover.
2900
+ * - `click` : ouverture au clic, fermeture au second clic ou clic extérieur
2901
+ * - `hover` : ouverture au survol, fermeture au mouseleave (avec délai de 150ms)
2902
+ */
2742
2903
  type PopoverTrigger = 'click' | 'hover';
2904
+ /**
2905
+ * Directive pour afficher un popover flottant positionné automatiquement.
2906
+ *
2907
+ * Utilise Angular CDK Overlay pour le positionnement intelligent
2908
+ * et la gestion du backdrop/scroll.
2909
+ *
2910
+ * @example
2911
+ * ```html
2912
+ * <ng-template #popoverContent>
2913
+ * <ds-popover header="Informations">
2914
+ * <p>Contenu du popover</p>
2915
+ * </ds-popover>
2916
+ * </ng-template>
2917
+ *
2918
+ * <button [dsPopover]="popoverContent">Ouvrir</button>
2919
+ * ```
2920
+ *
2921
+ * @example
2922
+ * ```html
2923
+ * <!-- Trigger hover -->
2924
+ * <button [dsPopover]="content" dsPopoverTrigger="hover">Survoler</button>
2925
+ *
2926
+ * <!-- Sans fermeture au clic extérieur -->
2927
+ * <button [dsPopover]="content" [dsPopoverCloseOnBackdrop]="false">Persistant</button>
2928
+ * ```
2929
+ *
2930
+ * @usageNotes
2931
+ * ### Accessibilité
2932
+ * - Fermeture via touche Escape
2933
+ * - Focus trap recommandé pour les popovers avec contenu interactif
2934
+ * - Utiliser `<ds-popover>` avec header pour un aria-labelledby automatique
2935
+ */
2743
2936
  declare class DsPopover implements OnDestroy {
2744
2937
  private elementRef;
2745
2938
  private overlay;
2746
2939
  private viewContainerRef;
2940
+ /**
2941
+ * Template contenant le contenu du popover.
2942
+ * Généralement un `<ng-template>` contenant un `<ds-popover>`.
2943
+ */
2747
2944
  dsPopover: _angular_core.InputSignal<TemplateRef<unknown>>;
2945
+ /**
2946
+ * Mode de déclenchement du popover.
2947
+ * - `click` (défaut) : clic pour ouvrir/fermer
2948
+ * - `hover` : survol pour ouvrir, mouseleave pour fermer
2949
+ * @default 'click'
2950
+ */
2748
2951
  dsPopoverTrigger: _angular_core.InputSignal<PopoverTrigger>;
2952
+ /**
2953
+ * Fermer le popover lors d'un clic sur le backdrop (zone extérieure).
2954
+ * Quand `false`, seul Escape ou un nouveau clic sur le trigger ferme le popover.
2955
+ * @default true
2956
+ */
2749
2957
  dsPopoverCloseOnBackdrop: _angular_core.InputSignal<boolean>;
2750
2958
  private overlayRef;
2751
2959
  private isOpen;
@@ -5045,6 +5253,108 @@ declare class DsDrawer implements AfterViewInit, OnDestroy {
5045
5253
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsDrawer, "ds-drawer", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "maskClosable": { "alias": "maskClosable"; "required": false; "isSignal": true; }; }, { "visibleChange": "visibleChange"; "closed": "closed"; }, never, ["[drawer-header]", "*", "[drawer-footer]"], true, never>;
5046
5254
  }
5047
5255
 
5256
+ interface TimeColumn {
5257
+ value: number;
5258
+ label: string;
5259
+ disabled: boolean;
5260
+ }
5261
+ declare class DsTimePickerPanelComponent implements AfterViewInit {
5262
+ hoursColumn?: ElementRef<HTMLDivElement>;
5263
+ minutesColumn?: ElementRef<HTMLDivElement>;
5264
+ secondsColumn?: ElementRef<HTMLDivElement>;
5265
+ panelId: string;
5266
+ readonly activeColumn: _angular_core.WritableSignal<"period" | "hours" | "minutes" | "seconds">;
5267
+ readonly value: _angular_core.InputSignal<string>;
5268
+ readonly format: _angular_core.InputSignal<"12h" | "24h">;
5269
+ readonly showSeconds: _angular_core.InputSignal<boolean>;
5270
+ readonly minuteStep: _angular_core.InputSignal<number>;
5271
+ readonly hourStep: _angular_core.InputSignal<number>;
5272
+ set minTime(value: string | null);
5273
+ get minTime(): string | null;
5274
+ set maxTime(value: string | null);
5275
+ get maxTime(): string | null;
5276
+ private readonly _minTime;
5277
+ private readonly _maxTime;
5278
+ private readonly parsedMinTime;
5279
+ private readonly parsedMaxTime;
5280
+ readonly timeSelected: _angular_core.OutputEmitterRef<string>;
5281
+ readonly cancelled: _angular_core.OutputEmitterRef<void>;
5282
+ readonly selectedHours: _angular_core.WritableSignal<number>;
5283
+ readonly selectedMinutes: _angular_core.WritableSignal<number>;
5284
+ readonly selectedSeconds: _angular_core.WritableSignal<number>;
5285
+ readonly selectedPeriod: _angular_core.WritableSignal<"AM" | "PM">;
5286
+ readonly hoursOptions: _angular_core.Signal<TimeColumn[]>;
5287
+ readonly minutesOptions: _angular_core.Signal<TimeColumn[]>;
5288
+ readonly secondsOptions: _angular_core.Signal<TimeColumn[]>;
5289
+ private initialized;
5290
+ constructor();
5291
+ ngAfterViewInit(): void;
5292
+ selectHours(hours: number): void;
5293
+ selectMinutes(minutes: number): void;
5294
+ selectSeconds(seconds: number): void;
5295
+ selectPeriod(period: 'AM' | 'PM'): void;
5296
+ /** Confirme la sélection et émet la valeur */
5297
+ confirm(): void;
5298
+ /** Annule la sélection */
5299
+ cancel(): void;
5300
+ onScroll(column: 'hours' | 'minutes' | 'seconds', event: Event): void;
5301
+ /**
5302
+ * Set the active column for keyboard navigation
5303
+ */
5304
+ setActiveColumn(column: 'hours' | 'minutes' | 'seconds' | 'period'): void;
5305
+ /**
5306
+ * Get the ID of the currently active option in a column
5307
+ */
5308
+ getActiveOptionId(column: 'hours' | 'minutes' | 'seconds' | 'period'): string;
5309
+ /**
5310
+ * Navigate options with arrow keys
5311
+ */
5312
+ navigateOption(column: 'hours' | 'minutes' | 'seconds' | 'period', direction: 1 | -1): void;
5313
+ /**
5314
+ * Handle global panel keyboard events
5315
+ */
5316
+ onPanelKeydown(event: KeyboardEvent): void;
5317
+ /**
5318
+ * Focus the hours column (called from parent on panel open)
5319
+ */
5320
+ focusFirstColumn(): void;
5321
+ /**
5322
+ * Find the next enabled option index in a direction
5323
+ */
5324
+ private findNextEnabledIndex;
5325
+ /**
5326
+ * Scroll an option into view in its column
5327
+ */
5328
+ private scrollOptionIntoView;
5329
+ private parseAndSetValue;
5330
+ private emitCurrentTime;
5331
+ /**
5332
+ * Parse a time constraint string (HH:mm or HH:mm:ss) into components
5333
+ */
5334
+ private parseTimeConstraint;
5335
+ /**
5336
+ * Convert 12h hour to 24h for comparison
5337
+ */
5338
+ private to24Hour;
5339
+ /**
5340
+ * Check if an hour is disabled based on minTime/maxTime constraints
5341
+ */
5342
+ private isHourDisabled;
5343
+ /**
5344
+ * Check if a minute is disabled based on minTime/maxTime and selected hour
5345
+ */
5346
+ private isMinuteDisabled;
5347
+ /**
5348
+ * Convert a 12h hour value to 24h based on current period selection
5349
+ * Used for constraint comparison when in 12h format
5350
+ */
5351
+ private convert12hTo24h;
5352
+ private scrollToSelected;
5353
+ private scrollColumnToValue;
5354
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsTimePickerPanelComponent, never>;
5355
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsTimePickerPanelComponent, "ds-time-picker-panel", never, { "panelId": { "alias": "panelId"; "required": false; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "hourStep": { "alias": "hourStep"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; }; "maxTime": { "alias": "maxTime"; "required": false; }; }, { "timeSelected": "timeSelected"; "cancelled": "cancelled"; }, never, never, true, never>;
5356
+ }
5357
+
5048
5358
  type TimePickerSize = 'sm' | 'md' | 'lg';
5049
5359
  type TimeFormat = '12h' | '24h';
5050
5360
  interface TimeValue {
@@ -5069,7 +5379,8 @@ interface TimeValue {
5069
5379
  * ```
5070
5380
  */
5071
5381
  declare class DsTimePicker implements ControlValueAccessor {
5072
- private overlay;
5382
+ inputElementRef?: ElementRef<HTMLElement>;
5383
+ panelComponent?: DsTimePickerPanelComponent;
5073
5384
  readonly value: _angular_core.InputSignal<string>;
5074
5385
  readonly format: _angular_core.InputSignal<TimeFormat>;
5075
5386
  readonly showSeconds: _angular_core.InputSignal<boolean>;
@@ -5083,18 +5394,18 @@ declare class DsTimePicker implements ControlValueAccessor {
5083
5394
  readonly maxTime: _angular_core.InputSignal<string | null>;
5084
5395
  readonly timeChange: _angular_core.OutputEmitterRef<string>;
5085
5396
  readonly clockIcon: _fortawesome_fontawesome_common_types.IconDefinition;
5086
- readonly upIcon: _fortawesome_fontawesome_common_types.IconDefinition;
5087
- readonly downIcon: _fortawesome_fontawesome_common_types.IconDefinition;
5397
+ readonly overlayPositions: ConnectedPosition[];
5398
+ readonly panelId: string;
5088
5399
  readonly isOpen: _angular_core.WritableSignal<boolean>;
5089
5400
  readonly internalValue: _angular_core.WritableSignal<string>;
5090
5401
  readonly isFocused: _angular_core.WritableSignal<boolean>;
5091
- private overlayRef;
5092
5402
  readonly containerClasses: _angular_core.Signal<string>;
5093
5403
  readonly displayValue: _angular_core.Signal<string>;
5094
5404
  readonly isDisabled: _angular_core.Signal<boolean>;
5095
5405
  private onChange;
5096
5406
  private onTouched;
5097
- constructor(overlay: Overlay);
5407
+ private hasExternalValue;
5408
+ constructor();
5098
5409
  writeValue(value: string): void;
5099
5410
  registerOnChange(fn: (value: string) => void): void;
5100
5411
  registerOnTouched(fn: () => void): void;
@@ -5105,9 +5416,10 @@ declare class DsTimePicker implements ControlValueAccessor {
5105
5416
  onFocus(): void;
5106
5417
  onBlur(): void;
5107
5418
  onTimeSelected(timeString: string): void;
5419
+ onBackdropClick(): void;
5420
+ onCancelled(): void;
5421
+ onOverlayKeydown(event: KeyboardEvent): void;
5108
5422
  private updateValue;
5109
- private createOverlay;
5110
- private destroyOverlay;
5111
5423
  private parseTime;
5112
5424
  private formatTimeForDisplay;
5113
5425
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsTimePicker, never>;
@@ -5429,8 +5741,8 @@ declare class DsTimeline {
5429
5741
  /**
5430
5742
  * Icônes par défaut.
5431
5743
  */
5432
- protected readonly defaultIcon: IconDefinition$1;
5433
- protected readonly pendingIcon: IconDefinition$1;
5744
+ readonly defaultIcon: IconDefinition$1;
5745
+ readonly pendingIcon: IconDefinition$1;
5434
5746
  /**
5435
5747
  * Items triés (reverse si demandé).
5436
5748
  */
@@ -6075,6 +6387,7 @@ declare class DsColorPicker implements ControlValueAccessor {
6075
6387
  readonly internalValue: _angular_core.WritableSignal<string>;
6076
6388
  readonly isFocused: _angular_core.WritableSignal<boolean>;
6077
6389
  readonly recentColors: _angular_core.WritableSignal<string[]>;
6390
+ readonly uniqueId: string;
6078
6391
  private overlayRef;
6079
6392
  readonly containerClasses: _angular_core.Signal<string>;
6080
6393
  readonly displayValue: _angular_core.Signal<string>;
@@ -6092,6 +6405,14 @@ declare class DsColorPicker implements ControlValueAccessor {
6092
6405
  close(): void;
6093
6406
  onFocus(): void;
6094
6407
  onBlur(): void;
6408
+ /**
6409
+ * Handle keyboard events on the trigger container
6410
+ */
6411
+ onTriggerKeyDown(event: KeyboardEvent): void;
6412
+ /**
6413
+ * Handle keyboard events on the input field
6414
+ */
6415
+ onInputKeyDown(event: KeyboardEvent): void;
6095
6416
  clear(): void;
6096
6417
  onColorSelected(color: string): void;
6097
6418
  private updateValue;
@@ -6111,171 +6432,1367 @@ declare class DsColorPicker implements ControlValueAccessor {
6111
6432
  }
6112
6433
 
6113
6434
  /**
6114
- * Positions standard pour dropdowns (menus déroulants, select, etc.)
6115
- *
6116
- * Stratégie :
6117
- * 1. Position préférée : centré en dessous (offsetY: 6px pour espacement)
6118
- * 2. Fallback : centré au-dessus si pas d'espace en bas
6119
- * 3. Fallback : aligné à gauche en dessous
6120
- * 4. Fallback : aligné à droite en dessous
6435
+ * Mode d'affichage de la sidebar.
6436
+ * - `full` : largeur complète avec labels
6437
+ * - `collapsed` : icônes seulement avec tooltips
6438
+ * - `overlay` : panneau glissant avec backdrop (mobile)
6121
6439
  */
6122
- declare const DROPDOWN_POSITIONS: ConnectedPosition[];
6440
+ type SidebarMode = 'full' | 'collapsed' | 'overlay';
6123
6441
  /**
6124
- * Positions standard pour tooltips (infobulles)
6125
- *
6126
- * Stratégie :
6127
- * 1. Position préférée : centré au-dessus (offsetY: -8px pour espacement)
6128
- * 2. Fallback : centré en dessous si pas d'espace au-dessus
6129
- * 3. Fallback : à droite (aligné verticalement au centre)
6130
- * 4. Fallback : à gauche (aligné verticalement au centre)
6442
+ * Taille de la sidebar (largeur).
6443
+ * - `sm` : 200px
6444
+ * - `md` : 240px
6445
+ * - `lg` : 280px
6131
6446
  */
6132
- declare const TOOLTIP_POSITIONS: ConnectedPosition[];
6447
+ type SidebarSize = 'sm' | 'md' | 'lg';
6133
6448
  /**
6134
- * Positions standard pour popovers (menus contextuels, actions panels)
6135
- *
6136
- * Stratégie :
6137
- * 1. Position préférée : aligné à droite, en dessous (offsetY: 4px)
6138
- * 2. Fallback : aligné à gauche, en dessous
6139
- * 3. Fallback : aligné à droite, au-dessus
6140
- * 4. Fallback : aligné à gauche, au-dessus
6141
- * 5. Fallback : à droite (aligné en haut)
6142
- * 6. Fallback : à gauche (aligné en haut)
6449
+ * Position de la sidebar.
6143
6450
  */
6144
- declare const POPOVER_POSITIONS: ConnectedPosition[];
6451
+ type SidebarPosition = 'left' | 'right';
6145
6452
  /**
6146
- * Positions pour autocomplete (panel de suggestions sous un input)
6147
- *
6148
- * Stratégie :
6149
- * 1. Position préférée : aligné à gauche, pleine largeur, en dessous
6150
- * 2. Fallback : aligné à gauche, pleine largeur, au-dessus
6453
+ * Trigger pour ouvrir le popover en mode collapsed.
6454
+ * - `hover` : Ouvre au survol de la souris
6455
+ * - `click` : Ouvre au clic
6151
6456
  */
6152
- declare const AUTOCOMPLETE_POSITIONS: ConnectedPosition[];
6153
-
6154
- declare const BUTTON_VARIANT_OPTIONS: readonly ["primary", "secondary", "ghost", "success", "warning", "error", "info"];
6155
- declare const BUTTON_APPEARANCE_OPTIONS: readonly ["solid", "outline"];
6156
- declare const BUTTON_SIZE_OPTIONS: readonly ["sm", "md", "lg"];
6157
- interface ArgTypeOptions {
6158
- includeLoading?: boolean;
6159
- includeBlock?: boolean;
6160
- variantDescription?: string;
6161
- appearanceDescription?: string;
6162
- sizeDescription?: string;
6163
- disabledDescription?: string;
6164
- loadingDescription?: string;
6165
- blockDescription?: string;
6166
- }
6167
- declare const buildButtonArgTypes: ({ includeLoading, includeBlock, variantDescription, appearanceDescription, sizeDescription, disabledDescription, loadingDescription, blockDescription, }?: ArgTypeOptions) => ArgTypes<Args>;
6168
- interface ArgOptions {
6169
- includeLoading?: boolean;
6170
- includeBlock?: boolean;
6171
- }
6172
- declare const buildButtonArgs: ({ includeLoading, includeBlock }?: ArgOptions) => {
6173
- block?: boolean | undefined;
6174
- loading?: boolean | undefined;
6175
- variant: ButtonVariant;
6176
- appearance: ButtonAppearance;
6177
- size: ButtonSize;
6178
- disabled: boolean;
6179
- };
6180
- interface ButtonBindings {
6181
- variant: string;
6182
- appearance?: string;
6183
- size: string;
6184
- disabled?: string;
6185
- loading?: string;
6186
- block?: string;
6187
- }
6188
- declare const createVariantRender: (tagName: string, bindings: ButtonBindings, extraAttributes?: string) => (args: Args) => {
6189
- props: {
6190
- variants: readonly ["primary", "secondary", "ghost", "success", "warning", "error", "info"];
6191
- };
6192
- template: string;
6193
- };
6194
- declare const createSizeRender: (tagName: string, bindings: ButtonBindings, extraAttributes?: string) => (args: Args) => {
6195
- props: {
6196
- sizes: readonly ["sm", "md", "lg"];
6457
+ type SidebarCollapsedTrigger = 'hover' | 'click';
6458
+ /**
6459
+ * Variante de couleur pour les badges.
6460
+ */
6461
+ type SidebarBadgeVariant = 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info';
6462
+ /**
6463
+ * Item de navigation dans la sidebar.
6464
+ */
6465
+ interface SidebarItem {
6466
+ /** Identifiant unique de l'item */
6467
+ id: string | number;
6468
+ /** Label affiché */
6469
+ label: string;
6470
+ /** Icône FontAwesome */
6471
+ icon?: IconDefinition;
6472
+ /** Route Angular (routerLink) */
6473
+ routerLink?: string | string[];
6474
+ /** Options pour routerLinkActive */
6475
+ routerLinkActiveOptions?: {
6476
+ exact: boolean;
6197
6477
  };
6198
- template: string;
6199
- };
6478
+ /** Lien href classique */
6479
+ href?: string;
6480
+ /** Ouvre dans un nouvel onglet (pour href) */
6481
+ external?: boolean;
6482
+ /** Items enfants (sous-menu) */
6483
+ children?: SidebarItem[];
6484
+ /** Item désactivé */
6485
+ disabled?: boolean;
6486
+ /** État initial d'expansion (pour items avec children) */
6487
+ expanded?: boolean;
6488
+ /** Badge/compteur affiché */
6489
+ badge?: string | number;
6490
+ /** Variante de couleur du badge */
6491
+ badgeVariant?: SidebarBadgeVariant;
6492
+ /** Affiche un séparateur après cet item */
6493
+ dividerAfter?: boolean;
6494
+ /** Données personnalisées attachées à l'item */
6495
+ data?: unknown;
6496
+ }
6497
+ /**
6498
+ * Événement émis lors du clic sur un item.
6499
+ */
6500
+ interface SidebarItemClickEvent {
6501
+ /** Item cliqué */
6502
+ item: SidebarItem;
6503
+ /** Événement souris original */
6504
+ event: MouseEvent;
6505
+ }
6506
+ /**
6507
+ * Événement émis lors de l'expansion/collapse d'un item.
6508
+ */
6509
+ interface SidebarItemExpandEvent {
6510
+ /** Item concerné */
6511
+ item: SidebarItem;
6512
+ /** Nouvel état d'expansion */
6513
+ expanded: boolean;
6514
+ }
6515
+ /**
6516
+ * Item aplati pour la navigation clavier.
6517
+ */
6518
+ interface FlattenedSidebarItem {
6519
+ /** Item original */
6520
+ item: SidebarItem;
6521
+ /** Niveau d'imbrication (0 = racine) */
6522
+ level: number;
6523
+ /** Index dans la liste aplatie */
6524
+ flatIndex: number;
6525
+ /** ID du parent (null si racine) */
6526
+ parentId: string | number | null;
6527
+ }
6200
6528
 
6201
6529
  /**
6202
- * Service centralisé pour l'enregistrement des icônes FontAwesome.
6203
- *
6204
- * @description
6205
- * Permet d'enregistrer des icônes de manière lazy et centralisée, évitant
6206
- * d'importer toutes les icônes FontAwesome dans chaque composant. Les composants
6207
- * peuvent utiliser les icônes enregistrées via leur nom plutôt que via l'objet complet.
6208
- *
6209
- * @example
6210
- * ```typescript
6211
- * // Dans app.config.ts ou main.ts
6212
- * import { IconRegistryService } from 'ds-angular';
6213
- * import { faCheck, faTimes, faExclamation } from '@fortawesome/free-solid-svg-icons';
6214
- *
6215
- * const iconRegistry = inject(IconRegistryService);
6216
- * iconRegistry.registerIcons([faCheck, faTimes, faExclamation]);
6217
- * ```
6218
- *
6219
- * @example
6220
- * ```typescript
6221
- * // Enregistrement par groupe thématique
6222
- * import { faCheck, faTimes } from '@fortawesome/free-solid-svg-icons';
6530
+ * Composant récursif pour afficher un item de sidebar.
6531
+ * Gère l'affichage, l'expansion des enfants et la navigation.
6223
6532
  *
6224
- * iconRegistry.registerIconGroup('validation', [faCheck, faTimes]);
6225
- * ```
6533
+ * @internal Utilisé par DsSidebar
6226
6534
  */
6227
- declare class IconRegistryService {
6228
- private library;
6229
- private registeredIcons;
6230
- private iconGroups;
6231
- constructor(library: FaIconLibrary);
6535
+ declare class DsSidebarItemComponent {
6536
+ readonly item: _angular_core.InputSignal<SidebarItem>;
6537
+ readonly level: _angular_core.InputSignal<number>;
6538
+ readonly mode: _angular_core.InputSignal<SidebarMode>;
6539
+ readonly showTooltip: _angular_core.InputSignal<boolean>;
6540
+ readonly expandedItemIds: _angular_core.InputSignal<Set<string | number>>;
6541
+ readonly activeItemId: _angular_core.InputSignal<string | number | null>;
6542
+ readonly sidebarPosition: _angular_core.InputSignal<SidebarPosition>;
6543
+ readonly collapsedTrigger: _angular_core.InputSignal<SidebarCollapsedTrigger>;
6544
+ readonly itemClick: _angular_core.OutputEmitterRef<SidebarItemClickEvent>;
6545
+ readonly itemToggle: _angular_core.OutputEmitterRef<SidebarItem>;
6546
+ readonly itemKeydown: _angular_core.OutputEmitterRef<KeyboardEvent>;
6547
+ readonly chevronRightIcon: _fortawesome_fontawesome_common_types.IconDefinition;
6548
+ readonly chevronDownIcon: _fortawesome_fontawesome_common_types.IconDefinition;
6549
+ readonly externalLinkIcon: _fortawesome_fontawesome_common_types.IconDefinition;
6550
+ private readonly elementRef;
6551
+ private readonly router;
6552
+ private readonly popoverOpen;
6553
+ readonly isPopoverOpen: _angular_core.Signal<boolean>;
6554
+ private readonly activeChildIndex;
6555
+ isHoveringPopover: boolean;
6556
+ private hideTimeout;
6557
+ readonly hasChildren: _angular_core.Signal<boolean>;
6558
+ readonly isExpanded: _angular_core.Signal<boolean>;
6559
+ readonly isActive: _angular_core.Signal<boolean>;
6560
+ readonly indentPadding: _angular_core.Signal<number>;
6561
+ /** Positions du popover selon la position de la sidebar */
6562
+ readonly popoverPositions: _angular_core.Signal<ConnectedPosition[]>;
6232
6563
  /**
6233
- * Enregistre une ou plusieurs icônes FontAwesome dans la bibliothèque globale.
6234
- *
6235
- * @param icons - Tableau d'icônes FontAwesome à enregistrer
6236
- * @returns Le service lui-même pour chaînage
6237
- *
6238
- * @example
6239
- * ```typescript
6240
- * iconRegistry.registerIcons([faUser, faEnvelope, faPhone]);
6241
- * ```
6564
+ * Gère le clic sur l'item.
6242
6565
  */
6243
- registerIcons(icons: IconDefinition[]): this;
6566
+ handleClick(event: MouseEvent): void;
6244
6567
  /**
6245
- * Enregistre un groupe d'icônes sous un nom thématique.
6246
- *
6247
- * @param groupName - Nom du groupe (ex: 'forms', 'navigation')
6248
- * @param icons - Tableau d'icônes du groupe
6249
- * @returns Le service lui-même pour chaînage
6250
- *
6251
- * @example
6252
- * ```typescript
6253
- * iconRegistry.registerIconGroup('forms', [
6254
- * faCheck, faTimes, faExclamation, faInfo
6255
- * ]);
6256
- * ```
6568
+ * Gère le clic sur le bouton toggle (chevron).
6257
6569
  */
6258
- registerIconGroup(groupName: string, icons: IconDefinition[]): this;
6570
+ handleToggleClick(event: MouseEvent): void;
6259
6571
  /**
6260
- * Vérifie si une icône est déjà enregistrée.
6261
- *
6262
- * @param iconName - Nom de l'icône (format: 'prefix-iconName')
6263
- * @returns true si l'icône est enregistrée
6264
- *
6265
- * @example
6266
- * ```typescript
6267
- * if (!iconRegistry.isIconRegistered('fas-check')) {
6268
- * iconRegistry.registerIcons([faCheck]);
6269
- * }
6270
- * ```
6572
+ * Gère le clic sur un lien (routerLink ou href).
6271
6573
  */
6272
- isIconRegistered(iconName: string): boolean;
6574
+ handleLinkClick(event: MouseEvent): void;
6273
6575
  /**
6274
- * Récupère tous les noms d'icônes enregistrées.
6275
- *
6276
- * @returns Tableau des noms d'icônes enregistrées
6576
+ * Gère les événements clavier.
6277
6577
  */
6278
- getRegisteredIcons(): string[];
6578
+ handleKeydown(event: KeyboardEvent): void;
6579
+ /**
6580
+ * Donne le focus à cet élément.
6581
+ */
6582
+ focus(): void;
6583
+ /**
6584
+ * Ouvre le popover (mode collapsed + hasChildren).
6585
+ */
6586
+ openPopover(): void;
6587
+ /**
6588
+ * Ferme le popover.
6589
+ */
6590
+ closePopover(): void;
6591
+ /**
6592
+ * Ferme le popover avec un délai.
6593
+ */
6594
+ closePopoverWithDelay(): void;
6595
+ /**
6596
+ * Annule le timeout de fermeture.
6597
+ */
6598
+ private clearHideTimeout;
6599
+ /**
6600
+ * Gestion du mouseenter sur l'item (ouvre le popover en mode collapsed + trigger hover).
6601
+ */
6602
+ handleMouseEnter(): void;
6603
+ /**
6604
+ * Gestion du mouseleave sur l'item.
6605
+ */
6606
+ handleMouseLeave(): void;
6607
+ /**
6608
+ * Toggle le popover (pour le mode click).
6609
+ */
6610
+ togglePopover(): void;
6611
+ /**
6612
+ * Gestion du mouseenter sur le popover.
6613
+ */
6614
+ handlePopoverMouseEnter(): void;
6615
+ /**
6616
+ * Gestion du mouseleave sur le popover.
6617
+ */
6618
+ handlePopoverMouseLeave(): void;
6619
+ /**
6620
+ * Navigation clavier dans le popover.
6621
+ */
6622
+ handlePopoverKeydown(event: KeyboardEvent): void;
6623
+ /**
6624
+ * Déplace l'index actif dans le popover.
6625
+ */
6626
+ private moveChildIndex;
6627
+ /**
6628
+ * Sélectionne l'enfant actif dans le popover.
6629
+ */
6630
+ private selectActiveChild;
6631
+ /**
6632
+ * Gère le clic sur un enfant dans le popover.
6633
+ */
6634
+ handleChildClick(child: SidebarItem, event: MouseEvent): void;
6635
+ /**
6636
+ * Met à jour l'index actif au hover.
6637
+ */
6638
+ setActiveChildIndex(index: number): void;
6639
+ /**
6640
+ * Retourne l'index actif du popover.
6641
+ */
6642
+ getActiveChildIndex(): number;
6643
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsSidebarItemComponent, never>;
6644
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsSidebarItemComponent, "ds-sidebar-item", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "level": { "alias": "level"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "showTooltip": { "alias": "showTooltip"; "required": false; "isSignal": true; }; "expandedItemIds": { "alias": "expandedItemIds"; "required": false; "isSignal": true; }; "activeItemId": { "alias": "activeItemId"; "required": false; "isSignal": true; }; "sidebarPosition": { "alias": "sidebarPosition"; "required": false; "isSignal": true; }; "collapsedTrigger": { "alias": "collapsedTrigger"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; "itemToggle": "itemToggle"; "itemKeydown": "itemKeydown"; }, never, never, true, never>;
6645
+ }
6646
+
6647
+ /**
6648
+ * # DsSidebar
6649
+ *
6650
+ * Composant de navigation verticale avec support multi-niveaux,
6651
+ * modes responsive et intégration Router Angular.
6652
+ *
6653
+ * ## Modes
6654
+ * - `full` : Largeur complète avec labels visibles
6655
+ * - `collapsed` : Icônes uniquement avec tooltips
6656
+ * - `overlay` : Panneau glissant avec backdrop (mobile)
6657
+ *
6658
+ * ## Usage
6659
+ *
6660
+ * ```html
6661
+ * <ds-sidebar
6662
+ * [items]="menuItems"
6663
+ * [mode]="sidebarMode"
6664
+ * [size]="'md'"
6665
+ * [collapsible]="true"
6666
+ * (itemClick)="onItemClick($event)"
6667
+ * (modeChange)="onModeChange($event)">
6668
+ *
6669
+ * <ng-container sidebar-header>
6670
+ * <img src="logo.svg" alt="Logo" />
6671
+ * </ng-container>
6672
+ *
6673
+ * <ng-container sidebar-footer>
6674
+ * <button>Déconnexion</button>
6675
+ * </ng-container>
6676
+ * </ds-sidebar>
6677
+ * ```
6678
+ *
6679
+ * ## Accessibilité
6680
+ * - Navigation clavier complète (Arrow, Home, End, Enter, Escape)
6681
+ * - Focus trap en mode overlay
6682
+ * - Attributs ARIA complets
6683
+ *
6684
+ * @component
6685
+ */
6686
+ declare class DsSidebar implements OnInit, AfterViewInit, OnDestroy {
6687
+ /** Liste des items de navigation */
6688
+ readonly items: _angular_core.InputSignal<SidebarItem[]>;
6689
+ /** Mode d'affichage */
6690
+ readonly mode: _angular_core.InputSignal<SidebarMode>;
6691
+ /** Taille (largeur) */
6692
+ readonly size: _angular_core.InputSignal<SidebarSize>;
6693
+ /** Position */
6694
+ readonly position: _angular_core.InputSignal<SidebarPosition>;
6695
+ /** Permet le toggle entre full et collapsed */
6696
+ readonly collapsible: _angular_core.InputSignal<boolean>;
6697
+ /** Label ARIA pour l'accessibilité */
6698
+ readonly ariaLabel: _angular_core.InputSignal<string>;
6699
+ /** Breakpoint pour le mode responsive (px) */
6700
+ readonly responsiveBreakpoint: _angular_core.InputSignal<number>;
6701
+ /** Active le switch automatique vers overlay sur mobile */
6702
+ readonly autoCollapseOnMobile: _angular_core.InputSignal<boolean>;
6703
+ /** Affiche les tooltips en mode collapsed (désactivable) */
6704
+ readonly showTooltips: _angular_core.InputSignal<boolean>;
6705
+ /** Trigger pour ouvrir le popover des sous-menus en mode collapsed */
6706
+ readonly collapsedTrigger: _angular_core.InputSignal<SidebarCollapsedTrigger>;
6707
+ /** ID de l'item actif (contrôlé depuis l'extérieur) */
6708
+ readonly initialActiveItemId: _angular_core.InputSignal<string | number | null>;
6709
+ /** Émis lors du clic sur un item */
6710
+ readonly itemClick: _angular_core.OutputEmitterRef<SidebarItemClickEvent>;
6711
+ /** Émis lors de l'expansion/collapse d'un item */
6712
+ readonly itemExpand: _angular_core.OutputEmitterRef<SidebarItemExpandEvent>;
6713
+ /** Émis lors du changement de mode */
6714
+ readonly modeChange: _angular_core.OutputEmitterRef<SidebarMode>;
6715
+ /** Émis à l'ouverture de l'overlay */
6716
+ readonly overlayOpened: _angular_core.OutputEmitterRef<void>;
6717
+ /** Émis à la fermeture de l'overlay */
6718
+ readonly overlayClosed: _angular_core.OutputEmitterRef<void>;
6719
+ sidebarContainer?: ElementRef<HTMLElement>;
6720
+ itemComponents?: QueryList<DsSidebarItemComponent>;
6721
+ /** Mode interne (peut différer du mode input en responsive) */
6722
+ protected readonly internalMode: _angular_core.WritableSignal<SidebarMode>;
6723
+ /** IDs des items expandés */
6724
+ readonly expandedItemIds: _angular_core.WritableSignal<Set<string | number>>;
6725
+ /** ID de l'item actif */
6726
+ readonly activeItemId: _angular_core.WritableSignal<string | number | null>;
6727
+ /** Index de l'item focusé (pour navigation clavier) */
6728
+ private readonly focusedIndex;
6729
+ /** État d'ouverture de l'overlay */
6730
+ readonly isOverlayOpen: _angular_core.WritableSignal<boolean>;
6731
+ /** Indique si la vue est prête */
6732
+ private viewReady;
6733
+ /** Indique si l'état expanded a été initialisé */
6734
+ private expandedStateInitialized;
6735
+ readonly menuIcon: _fortawesome_fontawesome_common_types.IconDefinition;
6736
+ readonly collapseIcon: _fortawesome_fontawesome_common_types.IconDefinition;
6737
+ readonly expandIcon: _fortawesome_fontawesome_common_types.IconDefinition;
6738
+ private focusTrap;
6739
+ private mediaQueryListener;
6740
+ private readonly documentRef;
6741
+ private readonly focusTrapFactory;
6742
+ /** Classes CSS du conteneur */
6743
+ readonly containerClasses: _angular_core.Signal<string>;
6744
+ /** Liste aplatie des items pour navigation clavier */
6745
+ readonly flattenedItems: _angular_core.Signal<FlattenedSidebarItem[]>;
6746
+ /** Nombre total d'items visibles */
6747
+ readonly visibleItemCount: _angular_core.Signal<number>;
6748
+ constructor();
6749
+ ngOnInit(): void;
6750
+ ngAfterViewInit(): void;
6751
+ ngOnDestroy(): void;
6752
+ /**
6753
+ * Bascule entre les modes full et collapsed.
6754
+ */
6755
+ toggleMode(): void;
6756
+ /**
6757
+ * Ouvre l'overlay (mode overlay uniquement).
6758
+ */
6759
+ openOverlay(): void;
6760
+ /**
6761
+ * Ferme l'overlay.
6762
+ */
6763
+ closeOverlay(): void;
6764
+ /**
6765
+ * Définit l'item actif par son ID.
6766
+ */
6767
+ setActiveItem(itemId: string | number): void;
6768
+ /**
6769
+ * Expand ou collapse un item.
6770
+ */
6771
+ toggleExpand(item: SidebarItem): void;
6772
+ /**
6773
+ * Expand tous les items avec enfants.
6774
+ */
6775
+ expandAll(): void;
6776
+ /**
6777
+ * Collapse tous les items.
6778
+ */
6779
+ collapseAll(): void;
6780
+ /**
6781
+ * Gère le clic sur un item.
6782
+ */
6783
+ handleItemClick(event: SidebarItemClickEvent): void;
6784
+ /**
6785
+ * Gère le toggle d'un item (expand/collapse).
6786
+ */
6787
+ handleItemToggle(item: SidebarItem): void;
6788
+ /**
6789
+ * Gère le clic sur le backdrop.
6790
+ */
6791
+ handleBackdropClick(): void;
6792
+ /**
6793
+ * Gère la navigation clavier globale.
6794
+ */
6795
+ handleKeyDown(event: KeyboardEvent): void;
6796
+ /**
6797
+ * Gère les événements clavier d'un item enfant.
6798
+ */
6799
+ handleItemKeydown(event: KeyboardEvent): void;
6800
+ /**
6801
+ * Initialise l'état expanded depuis les items.
6802
+ */
6803
+ private initializeExpandedState;
6804
+ /**
6805
+ * Expand les parents d'un item.
6806
+ */
6807
+ private expandParentsOfItem;
6808
+ /**
6809
+ * Déplace le focus vers l'item suivant/précédent.
6810
+ */
6811
+ private moveFocus;
6812
+ /**
6813
+ * Expand l'item focusé s'il a des enfants.
6814
+ */
6815
+ private expandFocusedItem;
6816
+ /**
6817
+ * Collapse l'item focusé ou remonte au parent.
6818
+ */
6819
+ private collapseOrMoveFocus;
6820
+ /**
6821
+ * Active (clic) l'item focusé.
6822
+ */
6823
+ private activateFocusedItem;
6824
+ /**
6825
+ * Focus l'item à l'index courant.
6826
+ */
6827
+ private focusCurrentItem;
6828
+ /**
6829
+ * Focus le premier item.
6830
+ */
6831
+ private focusFirstItem;
6832
+ /**
6833
+ * Configure le listener responsive.
6834
+ */
6835
+ private setupResponsiveListener;
6836
+ /**
6837
+ * Attache le focus trap.
6838
+ */
6839
+ private attachFocusTrap;
6840
+ /**
6841
+ * Détache le focus trap.
6842
+ */
6843
+ private detachFocusTrap;
6844
+ /**
6845
+ * Nettoie les listeners.
6846
+ */
6847
+ private cleanupListeners;
6848
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsSidebar, never>;
6849
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsSidebar, "ds-sidebar", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "responsiveBreakpoint": { "alias": "responsiveBreakpoint"; "required": false; "isSignal": true; }; "autoCollapseOnMobile": { "alias": "autoCollapseOnMobile"; "required": false; "isSignal": true; }; "showTooltips": { "alias": "showTooltips"; "required": false; "isSignal": true; }; "collapsedTrigger": { "alias": "collapsedTrigger"; "required": false; "isSignal": true; }; "initialActiveItemId": { "alias": "initialActiveItemId"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; "itemExpand": "itemExpand"; "modeChange": "modeChange"; "overlayOpened": "overlayOpened"; "overlayClosed": "overlayClosed"; }, never, ["[sidebar-header]", "[sidebar-footer]"], true, never>;
6850
+ }
6851
+
6852
+ declare class DsSidebarFooterItemComponent {
6853
+ readonly icon: _angular_core.InputSignal<IconDefinition$2>;
6854
+ readonly label: _angular_core.InputSignal<string>;
6855
+ readonly mode: _angular_core.InputSignal<SidebarMode>;
6856
+ readonly variant: _angular_core.InputSignal<"default" | "danger">;
6857
+ readonly clicked: _angular_core.OutputEmitterRef<void>;
6858
+ readonly isCollapsed: _angular_core.Signal<boolean>;
6859
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsSidebarFooterItemComponent, never>;
6860
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsSidebarFooterItemComponent, "ds-sidebar-footer-item", never, { "icon": { "alias": "icon"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "clicked": "clicked"; }, never, never, true, never>;
6861
+ }
6862
+
6863
+ /**
6864
+ * Taille du composant NavList
6865
+ */
6866
+ type NavListSize = 'sm' | 'md' | 'lg';
6867
+ /**
6868
+ * Variante de couleur pour les badges
6869
+ */
6870
+ type NavListBadgeVariant = 'default' | 'primary' | 'success' | 'warning' | 'error' | 'info';
6871
+ /**
6872
+ * Item de navigation dans la liste.
6873
+ * Supporte icône FontAwesome OU emoji, badge compteur, et indicateur coloré.
6874
+ */
6875
+ interface NavListItem {
6876
+ /** Identifiant unique de l'item */
6877
+ id: string | number;
6878
+ /** Label affiché */
6879
+ label: string;
6880
+ /** Icône FontAwesome (mutually exclusive avec emoji) */
6881
+ icon?: IconDefinition;
6882
+ /** Emoji affiché à la place de l'icône */
6883
+ emoji?: string;
6884
+ /** Badge compteur ou texte */
6885
+ badge?: number | string;
6886
+ /** Variante de couleur du badge */
6887
+ badgeVariant?: NavListBadgeVariant;
6888
+ /** Couleur de l'indicateur dot (ex: "#3b82f6") */
6889
+ dotColor?: string;
6890
+ /** Item désactivé */
6891
+ disabled?: boolean;
6892
+ /** Données personnalisées attachées à l'item */
6893
+ data?: unknown;
6894
+ }
6895
+ /**
6896
+ * Groupe d'items avec titre optionnel.
6897
+ * Permet d'organiser les items en sections (Sources, Filtres, etc.)
6898
+ */
6899
+ interface NavListGroup {
6900
+ /** Identifiant unique du groupe */
6901
+ id: string;
6902
+ /** Titre de la section (affiché comme divider) */
6903
+ title?: string;
6904
+ /** Items du groupe */
6905
+ items: NavListItem[];
6906
+ /** Groupe repliable */
6907
+ collapsible?: boolean;
6908
+ /** État initial replié (si collapsible) */
6909
+ collapsed?: boolean;
6910
+ }
6911
+ /**
6912
+ * Événement émis lors du clic sur un item.
6913
+ */
6914
+ interface NavListItemClickEvent {
6915
+ /** Item cliqué */
6916
+ item: NavListItem;
6917
+ /** Groupe contenant l'item */
6918
+ group: NavListGroup;
6919
+ /** Événement souris original */
6920
+ event: MouseEvent;
6921
+ }
6922
+ /**
6923
+ * Événement émis lors du toggle d'un groupe (collapse/expand).
6924
+ */
6925
+ interface NavListGroupToggleEvent {
6926
+ /** Groupe concerné */
6927
+ group: NavListGroup;
6928
+ /** Nouvel état (true = collapsed) */
6929
+ collapsed: boolean;
6930
+ }
6931
+
6932
+ /**
6933
+ * # DsNavList
6934
+ *
6935
+ * Composant de liste de navigation/filtrage avec support de groupes,
6936
+ * icônes/emojis, badges et indicateurs colorés.
6937
+ *
6938
+ * ## Fonctionnalités
6939
+ * - Groupes avec titres (dividers)
6940
+ * - Items avec icône FontAwesome OU emoji
6941
+ * - Badge compteur avec variantes de couleur
6942
+ * - Indicateur dot coloré
6943
+ * - Groupes repliables
6944
+ * - Navigation clavier
6945
+ *
6946
+ * ## Usage
6947
+ *
6948
+ * ```html
6949
+ * <ds-nav-list
6950
+ * [groups]="navGroups"
6951
+ * [activeItemId]="activeFilter"
6952
+ * [size]="'md'"
6953
+ * (itemClick)="onItemClick($event)">
6954
+ * </ds-nav-list>
6955
+ * ```
6956
+ *
6957
+ * ## Accessibilité
6958
+ * - Rôle navigation avec aria-label
6959
+ * - Navigation clavier (Arrow, Enter, Space)
6960
+ * - États aria-current pour item actif
6961
+ *
6962
+ * @component
6963
+ */
6964
+ declare class DsNavList {
6965
+ /** Liste des groupes d'items */
6966
+ readonly groups: _angular_core.InputSignal<NavListGroup[]>;
6967
+ /** ID de l'item actif */
6968
+ readonly activeItemId: _angular_core.InputSignal<string | number | null>;
6969
+ /** Taille du composant */
6970
+ readonly size: _angular_core.InputSignal<NavListSize>;
6971
+ /** Label ARIA pour l'accessibilité */
6972
+ readonly ariaLabel: _angular_core.InputSignal<string>;
6973
+ /** Émis lors du clic sur un item */
6974
+ readonly itemClick: _angular_core.OutputEmitterRef<NavListItemClickEvent>;
6975
+ /** Émis lors du toggle d'un groupe */
6976
+ readonly groupToggle: _angular_core.OutputEmitterRef<NavListGroupToggleEvent>;
6977
+ protected readonly faChevronDown: _fortawesome_fontawesome_common_types.IconDefinition;
6978
+ protected readonly faChevronRight: _fortawesome_fontawesome_common_types.IconDefinition;
6979
+ /** IDs des groupes collapsed */
6980
+ private readonly collapsedGroupIds;
6981
+ /** Classes CSS du conteneur */
6982
+ readonly containerClasses: _angular_core.Signal<string>;
6983
+ constructor();
6984
+ /**
6985
+ * Vérifie si un item est actif
6986
+ */
6987
+ isActive(item: NavListItem): boolean;
6988
+ /**
6989
+ * Vérifie si un groupe est collapsed
6990
+ */
6991
+ isGroupCollapsed(group: NavListGroup): boolean;
6992
+ /**
6993
+ * Toggle l'état collapsed d'un groupe
6994
+ */
6995
+ toggleGroup(group: NavListGroup, event: MouseEvent): void;
6996
+ /**
6997
+ * Gère le clic sur un item
6998
+ */
6999
+ handleItemClick(item: NavListItem, group: NavListGroup, event: MouseEvent): void;
7000
+ /**
7001
+ * Gère la navigation clavier sur un item
7002
+ */
7003
+ handleItemKeydown(item: NavListItem, group: NavListGroup, event: KeyboardEvent): void;
7004
+ /**
7005
+ * Retourne les classes CSS pour un item
7006
+ */
7007
+ getItemClasses(item: NavListItem): string;
7008
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsNavList, never>;
7009
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsNavList, "ds-nav-list", never, { "groups": { "alias": "groups"; "required": true; "isSignal": true; }; "activeItemId": { "alias": "activeItemId"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; "groupToggle": "groupToggle"; }, never, never, true, never>;
7010
+ }
7011
+
7012
+ /**
7013
+ * Taille du composant CheckboxList
7014
+ */
7015
+ type CheckboxListSize = 'sm' | 'md' | 'lg';
7016
+ /**
7017
+ * Item de la liste de checkboxes.
7018
+ * Supporte icône FontAwesome OU emoji.
7019
+ */
7020
+ interface CheckboxListItem {
7021
+ /** Identifiant unique de l'item */
7022
+ id: string | number;
7023
+ /** Label affiché */
7024
+ label: string;
7025
+ /** Icône FontAwesome (mutually exclusive avec emoji) */
7026
+ icon?: IconDefinition;
7027
+ /** Emoji affiché à la place de l'icône */
7028
+ emoji?: string;
7029
+ /** État coché de l'item */
7030
+ checked: boolean;
7031
+ /** Item désactivé */
7032
+ disabled?: boolean;
7033
+ /** Texte d'aide affiché sous l'item */
7034
+ helper?: string;
7035
+ /** Données personnalisées attachées à l'item */
7036
+ data?: unknown;
7037
+ }
7038
+ /**
7039
+ * Événement émis lors du changement d'état d'un item.
7040
+ */
7041
+ interface CheckboxListItemChangeEvent {
7042
+ /** Item modifié */
7043
+ item: CheckboxListItem;
7044
+ /** Nouvel état coché */
7045
+ checked: boolean;
7046
+ /** Index de l'item dans la liste */
7047
+ index: number;
7048
+ }
7049
+ /**
7050
+ * Événement émis lors du changement global (tous les items).
7051
+ */
7052
+ interface CheckboxListChangeEvent {
7053
+ /** Liste complète des items avec leur état */
7054
+ items: CheckboxListItem[];
7055
+ /** IDs des items cochés */
7056
+ checkedIds: (string | number)[];
7057
+ }
7058
+
7059
+ /**
7060
+ * # DsCheckboxList
7061
+ *
7062
+ * Composant de liste de checkboxes avec support d'icônes/emojis.
7063
+ * Idéal pour les listes de préférences, filtres, ou sélections multiples.
7064
+ *
7065
+ * ## Fonctionnalités
7066
+ * - Items avec icône FontAwesome OU emoji
7067
+ * - Sélection/désélection individuelle
7068
+ * - Sélection globale (tout cocher/décocher)
7069
+ * - Helper text par item
7070
+ * - Navigation clavier
7071
+ * - Two-way binding sur items
7072
+ *
7073
+ * ## Usage
7074
+ *
7075
+ * ```html
7076
+ * <ds-checkbox-list
7077
+ * [(items)]="preferences"
7078
+ * [size]="'md'"
7079
+ * [showSelectAll]="true"
7080
+ * (itemChange)="onItemChange($event)"
7081
+ * (change)="onListChange($event)">
7082
+ * </ds-checkbox-list>
7083
+ * ```
7084
+ *
7085
+ * ## Accessibilité
7086
+ * - Rôle group avec aria-label
7087
+ * - Navigation clavier (Tab, Space)
7088
+ * - États aria-checked
7089
+ *
7090
+ * @component
7091
+ */
7092
+ declare class DsCheckboxList {
7093
+ /** Liste des items (two-way binding) */
7094
+ readonly items: _angular_core.ModelSignal<CheckboxListItem[]>;
7095
+ /** Taille du composant */
7096
+ readonly size: _angular_core.InputSignal<CheckboxListSize>;
7097
+ /** Afficher le checkbox "Tout sélectionner" */
7098
+ readonly showSelectAll: _angular_core.InputSignal<boolean>;
7099
+ /** Label du checkbox "Tout sélectionner" */
7100
+ readonly selectAllLabel: _angular_core.InputSignal<string>;
7101
+ /** Label ARIA pour l'accessibilité */
7102
+ readonly ariaLabel: _angular_core.InputSignal<string>;
7103
+ /** Désactiver toute la liste */
7104
+ readonly disabled: _angular_core.InputSignal<boolean>;
7105
+ /** Émis lors du changement d'un item */
7106
+ readonly itemChange: _angular_core.OutputEmitterRef<CheckboxListItemChangeEvent>;
7107
+ /** Émis lors de tout changement (liste complète) */
7108
+ readonly change: _angular_core.OutputEmitterRef<CheckboxListChangeEvent>;
7109
+ /** ID unique pour le composant */
7110
+ protected readonly componentId: string;
7111
+ /** Classes CSS du conteneur */
7112
+ readonly containerClasses: _angular_core.Signal<string>;
7113
+ /** Tous les items sont cochés */
7114
+ readonly allChecked: _angular_core.Signal<boolean>;
7115
+ /** Certains items sont cochés (état indéterminé) */
7116
+ readonly someChecked: _angular_core.Signal<boolean>;
7117
+ /** IDs des items cochés */
7118
+ readonly checkedIds: _angular_core.Signal<(string | number)[]>;
7119
+ /**
7120
+ * Génère un ID unique pour un item
7121
+ */
7122
+ getItemId(item: CheckboxListItem, index: number): string;
7123
+ /**
7124
+ * Gère le changement d'état d'un item
7125
+ */
7126
+ onItemCheckedChange(item: CheckboxListItem, checked: boolean, index: number): void;
7127
+ /**
7128
+ * Gère le clic sur "Tout sélectionner"
7129
+ */
7130
+ onSelectAllChange(checked: boolean): void;
7131
+ /**
7132
+ * Émet l'événement change avec l'état complet
7133
+ */
7134
+ private emitChangeEvent;
7135
+ /**
7136
+ * Retourne les classes CSS pour un item
7137
+ */
7138
+ getItemClasses(item: CheckboxListItem): string;
7139
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsCheckboxList, never>;
7140
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsCheckboxList, "ds-checkbox-list", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "showSelectAll": { "alias": "showSelectAll"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "items": "itemsChange"; "itemChange": "itemChange"; "change": "change"; }, never, never, true, never>;
7141
+ }
7142
+
7143
+ /**
7144
+ * Tailles disponibles pour DsListItem
7145
+ */
7146
+ type ListItemSize = 'sm' | 'md' | 'lg';
7147
+ /**
7148
+ * Types d'indicateur visuel (barre/dot à gauche)
7149
+ * - none: pas d'indicateur
7150
+ * - priority: barre verticale colorée (style TickTick)
7151
+ * - dot: point coloré
7152
+ * - status: point coloré (alias de dot)
7153
+ */
7154
+ type ListItemIndicator = 'none' | 'priority' | 'dot' | 'status';
7155
+ /**
7156
+ * Couleurs prédéfinies pour l'indicateur
7157
+ */
7158
+ type ListItemIndicatorColor = 'high' | 'medium' | 'low' | 'success' | 'warning' | 'error' | 'info';
7159
+ /**
7160
+ * Événement émis lors du clic sur l'item
7161
+ */
7162
+ interface ListItemClickEvent {
7163
+ event: MouseEvent | KeyboardEvent;
7164
+ }
7165
+ /**
7166
+ * Événement émis lors du changement de la checkbox
7167
+ */
7168
+ interface ListItemCheckEvent {
7169
+ checked: boolean;
7170
+ }
7171
+
7172
+ /**
7173
+ * # DsListItem
7174
+ *
7175
+ * Composant de ligne d'élément de liste interactif, style TickTick/Todoist.
7176
+ * Supporte checkbox intégrée, indicateur de priorité, et slots pour métadonnées.
7177
+ *
7178
+ * ## Usage
7179
+ *
7180
+ * ```html
7181
+ * <!-- Basique -->
7182
+ * <ds-list-item title="Ma tâche" />
7183
+ *
7184
+ * <!-- Avec checkbox et priorité -->
7185
+ * <ds-list-item
7186
+ * title="Tâche importante"
7187
+ * [checkable]="true"
7188
+ * [checked]="task.completed"
7189
+ * indicator="priority"
7190
+ * indicatorColor="high"
7191
+ * (checkedChange)="onComplete($event)"
7192
+ * />
7193
+ *
7194
+ * <!-- Avec métadonnées -->
7195
+ * <ds-list-item title="Réunion" [checkable]="true">
7196
+ * <ds-chip inline size="sm">Travail</ds-chip>
7197
+ * <span meta>09:00</span>
7198
+ * <span meta>30min</span>
7199
+ * </ds-list-item>
7200
+ * ```
7201
+ *
7202
+ * ## Accessibilité
7203
+ *
7204
+ * - Role `button` quand clickable, `listitem` sinon
7205
+ * - Navigation clavier (Enter, Space)
7206
+ * - aria-disabled, aria-selected appropriés
7207
+ */
7208
+ declare class DsListItem {
7209
+ /**
7210
+ * Titre principal de l'élément (requis)
7211
+ */
7212
+ readonly title: _angular_core.InputSignal<string>;
7213
+ /**
7214
+ * Sous-titre optionnel
7215
+ */
7216
+ readonly subtitle: _angular_core.InputSignal<string | undefined>;
7217
+ /**
7218
+ * Type d'indicateur à afficher à gauche
7219
+ * @default 'none'
7220
+ */
7221
+ readonly indicator: _angular_core.InputSignal<ListItemIndicator>;
7222
+ /**
7223
+ * Couleur de l'indicateur (prédéfinie ou custom CSS)
7224
+ * @default 'medium'
7225
+ */
7226
+ readonly indicatorColor: _angular_core.InputSignal<string>;
7227
+ /**
7228
+ * Affiche une checkbox
7229
+ * @default false
7230
+ */
7231
+ readonly checkable: _angular_core.InputSignal<boolean>;
7232
+ /**
7233
+ * État coché de la checkbox
7234
+ * @default false
7235
+ */
7236
+ readonly checked: _angular_core.InputSignal<boolean>;
7237
+ /**
7238
+ * État indéterminé de la checkbox
7239
+ * @default false
7240
+ */
7241
+ readonly indeterminate: _angular_core.InputSignal<boolean>;
7242
+ /**
7243
+ * Applique le style complété (texte barré, opacité réduite)
7244
+ * @default false
7245
+ */
7246
+ readonly completed: _angular_core.InputSignal<boolean>;
7247
+ /**
7248
+ * Désactive l'interaction
7249
+ * @default false
7250
+ */
7251
+ readonly disabled: _angular_core.InputSignal<boolean>;
7252
+ /**
7253
+ * Applique le style de sélection
7254
+ * @default false
7255
+ */
7256
+ readonly selected: _angular_core.InputSignal<boolean>;
7257
+ /**
7258
+ * Rend l'élément cliquable avec effet hover
7259
+ * @default true
7260
+ */
7261
+ readonly clickable: _angular_core.InputSignal<boolean>;
7262
+ /**
7263
+ * Taille de l'élément
7264
+ * @default 'md'
7265
+ */
7266
+ readonly size: _angular_core.InputSignal<ListItemSize>;
7267
+ /**
7268
+ * Émis lors du changement de la checkbox
7269
+ */
7270
+ readonly checkedChange: _angular_core.OutputEmitterRef<ListItemCheckEvent>;
7271
+ /**
7272
+ * Émis lors du clic sur l'élément
7273
+ */
7274
+ readonly clicked: _angular_core.OutputEmitterRef<ListItemClickEvent>;
7275
+ /**
7276
+ * Classes CSS calculées
7277
+ */
7278
+ readonly itemClasses: _angular_core.Signal<string>;
7279
+ /**
7280
+ * Role ARIA
7281
+ */
7282
+ readonly role: _angular_core.Signal<"button" | "listitem">;
7283
+ /**
7284
+ * Tabindex
7285
+ */
7286
+ readonly tabindex: _angular_core.Signal<0 | -1>;
7287
+ /**
7288
+ * Afficher l'indicateur ?
7289
+ */
7290
+ readonly showIndicator: _angular_core.Signal<boolean>;
7291
+ /**
7292
+ * Est-ce un indicateur de type barre ?
7293
+ */
7294
+ readonly isBarIndicator: _angular_core.Signal<boolean>;
7295
+ /**
7296
+ * Est-ce un indicateur de type dot ?
7297
+ */
7298
+ readonly isDotIndicator: _angular_core.Signal<boolean>;
7299
+ /**
7300
+ * Résout la couleur de l'indicateur (prédéfinie ou custom)
7301
+ */
7302
+ resolveIndicatorColor(): string;
7303
+ /**
7304
+ * Gère le clic sur l'élément
7305
+ */
7306
+ handleClick(event: MouseEvent | KeyboardEvent): void;
7307
+ /**
7308
+ * Gère le changement de la checkbox
7309
+ */
7310
+ handleCheckedChange(checked: boolean): void;
7311
+ /**
7312
+ * Gère les événements clavier
7313
+ */
7314
+ handleKeyDown(event: KeyboardEvent): void;
7315
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsListItem, never>;
7316
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsListItem, "ds-list-item", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "indicator": { "alias": "indicator"; "required": false; "isSignal": true; }; "indicatorColor": { "alias": "indicatorColor"; "required": false; "isSignal": true; }; "checkable": { "alias": "checkable"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "completed": { "alias": "completed"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "checkedChange": "checkedChange"; "clicked": "clicked"; }, never, ["[inline]", "[meta]", "[actions]"], true, never>;
7317
+ }
7318
+
7319
+ /**
7320
+ * Variantes visuelles disponibles pour DsList
7321
+ * - default: liste simple sans séparateurs
7322
+ * - divided: liste avec séparateurs entre les items
7323
+ * - card: liste dans un conteneur card avec bordure
7324
+ */
7325
+ type ListVariant = 'default' | 'divided' | 'card';
7326
+ /**
7327
+ * Tailles disponibles pour DsList
7328
+ */
7329
+ type ListSize = 'sm' | 'md' | 'lg';
7330
+ /**
7331
+ * Événement émis lors d'un drag & drop
7332
+ */
7333
+ interface ListDragEvent<T = unknown> {
7334
+ /** L'élément déplacé */
7335
+ item: T;
7336
+ /** Index avant le déplacement */
7337
+ previousIndex: number;
7338
+ /** Index après le déplacement */
7339
+ currentIndex: number;
7340
+ }
7341
+ /**
7342
+ * Événement émis lors d'un changement de sélection
7343
+ */
7344
+ interface ListSelectionChangeEvent<T = unknown> {
7345
+ /** Éléments sélectionnés */
7346
+ selected: T[];
7347
+ }
7348
+ /**
7349
+ * Configuration de l'état vide
7350
+ */
7351
+ interface ListEmptyConfig {
7352
+ /** Titre affiché */
7353
+ title: string;
7354
+ /** Description optionnelle */
7355
+ description?: string;
7356
+ /** Icône optionnelle */
7357
+ icon?: IconDefinition;
7358
+ }
7359
+
7360
+ /**
7361
+ * # DsList
7362
+ *
7363
+ * Composant conteneur pour afficher une liste d'éléments avec support pour :
7364
+ * - État de chargement (skeletons)
7365
+ * - État vide
7366
+ * - Drag & Drop (via CDK)
7367
+ * - Virtualisation (via CDK)
7368
+ * - Sélection multiple
7369
+ *
7370
+ * ## Usage
7371
+ *
7372
+ * ```html
7373
+ * <!-- Basique -->
7374
+ * <ds-list>
7375
+ * <ds-list-item title="Item 1" />
7376
+ * <ds-list-item title="Item 2" />
7377
+ * </ds-list>
7378
+ *
7379
+ * <!-- Avec loading et empty -->
7380
+ * <ds-list
7381
+ * [loading]="isLoading()"
7382
+ * [empty]="items().length === 0"
7383
+ * emptyTitle="Aucun élément"
7384
+ * >
7385
+ * @for (item of items(); track item.id) {
7386
+ * <ds-list-item [title]="item.title" />
7387
+ * }
7388
+ * </ds-list>
7389
+ *
7390
+ * <!-- Avec Drag & Drop -->
7391
+ * <ds-list [draggable]="true" [dragData]="items()" (dropped)="onReorder($event)">
7392
+ * @for (item of items(); track item.id) {
7393
+ * <ds-list-item [title]="item.title" cdkDrag />
7394
+ * }
7395
+ * </ds-list>
7396
+ * ```
7397
+ */
7398
+ declare class DsList<T = unknown> {
7399
+ /**
7400
+ * Variante visuelle de la liste
7401
+ * @default 'default'
7402
+ */
7403
+ readonly variant: _angular_core.InputSignal<ListVariant>;
7404
+ /**
7405
+ * Taille de la liste (affecte les skeletons)
7406
+ * @default 'md'
7407
+ */
7408
+ readonly size: _angular_core.InputSignal<ListSize>;
7409
+ /**
7410
+ * Affiche les skeletons de chargement
7411
+ * @default false
7412
+ */
7413
+ readonly loading: _angular_core.InputSignal<boolean>;
7414
+ /**
7415
+ * Nombre de skeletons à afficher
7416
+ * @default 3
7417
+ */
7418
+ readonly loadingCount: _angular_core.InputSignal<number>;
7419
+ /**
7420
+ * Affiche l'état vide
7421
+ * @default false
7422
+ */
7423
+ readonly empty: _angular_core.InputSignal<boolean>;
7424
+ /**
7425
+ * Titre de l'état vide
7426
+ * @default 'Aucun élément'
7427
+ */
7428
+ readonly emptyTitle: _angular_core.InputSignal<string>;
7429
+ /**
7430
+ * Description de l'état vide
7431
+ */
7432
+ readonly emptyDescription: _angular_core.InputSignal<string | undefined>;
7433
+ /**
7434
+ * Active le mode Drag & Drop
7435
+ * @default false
7436
+ */
7437
+ readonly draggable: _angular_core.InputSignal<boolean>;
7438
+ /**
7439
+ * Désactive le Drag & Drop (tout en gardant le mode actif)
7440
+ * @default false
7441
+ */
7442
+ readonly dragDisabled: _angular_core.InputSignal<boolean>;
7443
+ /**
7444
+ * Données pour le Drag & Drop
7445
+ */
7446
+ readonly dragData: _angular_core.InputSignal<T[]>;
7447
+ /**
7448
+ * Émis lors d'un drop
7449
+ */
7450
+ readonly dropped: _angular_core.OutputEmitterRef<ListDragEvent<T>>;
7451
+ /**
7452
+ * Active le mode virtualisé pour les longues listes
7453
+ * @default false
7454
+ */
7455
+ readonly virtual: _angular_core.InputSignal<boolean>;
7456
+ /**
7457
+ * Hauteur d'un item en pixels (pour la virtualisation)
7458
+ * @default 40
7459
+ */
7460
+ readonly itemSize: _angular_core.InputSignal<number>;
7461
+ /**
7462
+ * Hauteur du viewport en pixels (pour la virtualisation)
7463
+ * @default 400
7464
+ */
7465
+ readonly viewportHeight: _angular_core.InputSignal<number>;
7466
+ /**
7467
+ * Active la sélection multiple
7468
+ * @default false
7469
+ */
7470
+ readonly selectable: _angular_core.InputSignal<boolean>;
7471
+ /**
7472
+ * Items sélectionnés
7473
+ */
7474
+ readonly selectedItems: _angular_core.InputSignal<T[]>;
7475
+ /**
7476
+ * Émis lors d'un changement de sélection
7477
+ */
7478
+ readonly selectionChange: _angular_core.OutputEmitterRef<ListSelectionChangeEvent<T>>;
7479
+ /**
7480
+ * Classes CSS calculées
7481
+ */
7482
+ readonly listClasses: _angular_core.Signal<string>;
7483
+ /**
7484
+ * Tableau pour générer les skeletons
7485
+ */
7486
+ readonly skeletonArray: _angular_core.Signal<number[]>;
7487
+ /**
7488
+ * Taille du skeleton basée sur la taille de la liste
7489
+ */
7490
+ readonly skeletonSize: _angular_core.Signal<"sm" | "md" | "lg">;
7491
+ /**
7492
+ * Style du viewport pour la virtualisation
7493
+ */
7494
+ readonly viewportStyle: _angular_core.Signal<{
7495
+ height: string;
7496
+ }>;
7497
+ /**
7498
+ * Gère l'événement drop du CDK
7499
+ */
7500
+ onDrop(event: CdkDragDrop<T[]>): void;
7501
+ /**
7502
+ * Toggle la sélection d'un item
7503
+ */
7504
+ toggleSelection(item: T): void;
7505
+ /**
7506
+ * Vérifie si un item est sélectionné
7507
+ */
7508
+ isSelected(item: T): boolean;
7509
+ /**
7510
+ * Sélectionne tous les items
7511
+ */
7512
+ selectAll(): void;
7513
+ /**
7514
+ * Désélectionne tous les items
7515
+ */
7516
+ clearSelection(): void;
7517
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsList<any>, never>;
7518
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsList<any>, "ds-list", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingCount": { "alias": "loadingCount"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; "emptyTitle": { "alias": "emptyTitle"; "required": false; "isSignal": true; }; "emptyDescription": { "alias": "emptyDescription"; "required": false; "isSignal": true; }; "draggable": { "alias": "draggable"; "required": false; "isSignal": true; }; "dragDisabled": { "alias": "dragDisabled"; "required": false; "isSignal": true; }; "dragData": { "alias": "dragData"; "required": false; "isSignal": true; }; "virtual": { "alias": "virtual"; "required": false; "isSignal": true; }; "itemSize": { "alias": "itemSize"; "required": false; "isSignal": true; }; "viewportHeight": { "alias": "viewportHeight"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "selectedItems": { "alias": "selectedItems"; "required": false; "isSignal": true; }; }, { "dropped": "dropped"; "selectionChange": "selectionChange"; }, never, ["*", "*", "*"], true, never>;
7519
+ }
7520
+
7521
+ /**
7522
+ * Variantes disponibles pour DsListGroup
7523
+ * - default: header simple sans interaction
7524
+ * - collapsible: header cliquable pour expand/collapse
7525
+ */
7526
+ type ListGroupVariant = 'default' | 'collapsible';
7527
+ /**
7528
+ * Événement émis lors du toggle expand/collapse
7529
+ */
7530
+ interface ListGroupToggleEvent {
7531
+ /** Nouvel état expanded */
7532
+ expanded: boolean;
7533
+ }
7534
+
7535
+ /**
7536
+ * # DsListGroup
7537
+ *
7538
+ * Composant de regroupement d'éléments de liste avec header et contenu collapsible.
7539
+ * Idéal pour organiser les tâches par date, catégorie ou statut.
7540
+ *
7541
+ * ## Usage
7542
+ *
7543
+ * ```html
7544
+ * <!-- Groupe simple -->
7545
+ * <ds-list-group title="Aujourd'hui">
7546
+ * <ds-list-item title="Tâche 1" />
7547
+ * <ds-list-item title="Tâche 2" />
7548
+ * </ds-list-group>
7549
+ *
7550
+ * <!-- Groupe collapsible avec compteur -->
7551
+ * <ds-list-group
7552
+ * title="Cette semaine"
7553
+ * [count]="5"
7554
+ * variant="collapsible"
7555
+ * [expanded]="true"
7556
+ * >
7557
+ * <ds-list-item title="Tâche 1" />
7558
+ * </ds-list-group>
7559
+ *
7560
+ * <!-- Groupes dans une liste -->
7561
+ * <ds-list>
7562
+ * <ds-list-group title="Haute priorité" [count]="3" variant="collapsible">
7563
+ * ...
7564
+ * </ds-list-group>
7565
+ * <ds-list-group title="Normale" [count]="5" variant="collapsible">
7566
+ * ...
7567
+ * </ds-list-group>
7568
+ * </ds-list>
7569
+ * ```
7570
+ */
7571
+ declare class DsListGroup {
7572
+ /**
7573
+ * Titre du groupe (requis)
7574
+ */
7575
+ readonly title: _angular_core.InputSignal<string>;
7576
+ /**
7577
+ * Sous-titre optionnel
7578
+ */
7579
+ readonly subtitle: _angular_core.InputSignal<string | undefined>;
7580
+ /**
7581
+ * Nombre d'éléments (affiché comme badge)
7582
+ */
7583
+ readonly count: _angular_core.InputSignal<number | undefined>;
7584
+ /**
7585
+ * Variante du groupe
7586
+ * @default 'default'
7587
+ */
7588
+ readonly variant: _angular_core.InputSignal<ListGroupVariant>;
7589
+ /**
7590
+ * État expanded (pour variante collapsible)
7591
+ * @default true
7592
+ */
7593
+ readonly expanded: _angular_core.InputSignal<boolean>;
7594
+ /**
7595
+ * Émis lors du toggle expand/collapse
7596
+ */
7597
+ readonly expandedChange: _angular_core.OutputEmitterRef<ListGroupToggleEvent>;
7598
+ /**
7599
+ * Header sticky au scroll
7600
+ * @default false
7601
+ */
7602
+ readonly sticky: _angular_core.InputSignal<boolean>;
7603
+ /**
7604
+ * Icône personnalisée pour le header
7605
+ */
7606
+ readonly icon: _angular_core.InputSignal<IconDefinition | undefined>;
7607
+ private readonly internalExpanded;
7608
+ readonly faChevronRight: IconDefinition;
7609
+ readonly faChevronDown: IconDefinition;
7610
+ /**
7611
+ * État expanded effectif (interne ou input)
7612
+ */
7613
+ readonly isExpanded: _angular_core.Signal<boolean>;
7614
+ /**
7615
+ * Est-ce un groupe collapsible ?
7616
+ */
7617
+ readonly isCollapsible: _angular_core.Signal<boolean>;
7618
+ /**
7619
+ * Classes CSS du conteneur
7620
+ */
7621
+ readonly groupClasses: _angular_core.Signal<string>;
7622
+ /**
7623
+ * Icône du chevron
7624
+ */
7625
+ readonly chevronIcon: _angular_core.Signal<IconDefinition>;
7626
+ /**
7627
+ * Afficher le compteur ?
7628
+ */
7629
+ readonly showCount: _angular_core.Signal<boolean>;
7630
+ /**
7631
+ * Toggle expand/collapse
7632
+ */
7633
+ toggle(): void;
7634
+ /**
7635
+ * Gère les événements clavier sur le header
7636
+ */
7637
+ handleKeyDown(event: KeyboardEvent): void;
7638
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DsListGroup, never>;
7639
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DsListGroup, "ds-list-group", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, { "expandedChange": "expandedChange"; }, never, ["*"], true, never>;
7640
+ }
7641
+
7642
+ /**
7643
+ * Positions standard pour dropdowns (menus déroulants, select, etc.)
7644
+ *
7645
+ * Stratégie :
7646
+ * 1. Position préférée : centré en dessous (offsetY: 6px pour espacement)
7647
+ * 2. Fallback : centré au-dessus si pas d'espace en bas
7648
+ * 3. Fallback : aligné à gauche en dessous
7649
+ * 4. Fallback : aligné à droite en dessous
7650
+ */
7651
+ declare const DROPDOWN_POSITIONS: ConnectedPosition[];
7652
+ /**
7653
+ * Positions pour dropdowns s'ouvrant vers le haut (utile dans les footers)
7654
+ *
7655
+ * Stratégie :
7656
+ * 1. Position préférée : centré au-dessus
7657
+ * 2. Fallback : centré en dessous si pas d'espace au-dessus
7658
+ * 3. Fallback : aligné à gauche au-dessus
7659
+ * 4. Fallback : aligné à droite au-dessus
7660
+ */
7661
+ declare const DROPDOWN_POSITIONS_TOP: ConnectedPosition[];
7662
+ /**
7663
+ * Positions pour dropdowns s'ouvrant vers la droite (utile dans les sidebars)
7664
+ *
7665
+ * Stratégie :
7666
+ * 1. Position préférée : à droite, aligné en haut
7667
+ * 2. Fallback : à droite, aligné au centre
7668
+ * 3. Fallback : à gauche si pas d'espace à droite
7669
+ */
7670
+ declare const DROPDOWN_POSITIONS_RIGHT: ConnectedPosition[];
7671
+ /**
7672
+ * Positions standard pour tooltips (infobulles)
7673
+ *
7674
+ * Stratégie :
7675
+ * 1. Position préférée : centré au-dessus (offsetY: -8px pour espacement)
7676
+ * 2. Fallback : centré en dessous si pas d'espace au-dessus
7677
+ * 3. Fallback : à droite (aligné verticalement au centre)
7678
+ * 4. Fallback : à gauche (aligné verticalement au centre)
7679
+ */
7680
+ declare const TOOLTIP_POSITIONS: ConnectedPosition[];
7681
+ /**
7682
+ * Positions standard pour popovers (menus contextuels, actions panels)
7683
+ *
7684
+ * Stratégie :
7685
+ * 1. Position préférée : aligné à droite, en dessous (offsetY: 4px)
7686
+ * 2. Fallback : aligné à gauche, en dessous
7687
+ * 3. Fallback : aligné à droite, au-dessus
7688
+ * 4. Fallback : aligné à gauche, au-dessus
7689
+ * 5. Fallback : à droite (aligné en haut)
7690
+ * 6. Fallback : à gauche (aligné en haut)
7691
+ */
7692
+ declare const POPOVER_POSITIONS: ConnectedPosition[];
7693
+ /**
7694
+ * Positions pour autocomplete (panel de suggestions sous un input)
7695
+ *
7696
+ * Stratégie :
7697
+ * 1. Position préférée : aligné à gauche, pleine largeur, en dessous
7698
+ * 2. Fallback : aligné à gauche, pleine largeur, au-dessus
7699
+ */
7700
+ declare const AUTOCOMPLETE_POSITIONS: ConnectedPosition[];
7701
+ /**
7702
+ * Positions pour popover sidebar (sidebar à gauche → popover à droite)
7703
+ *
7704
+ * Utilise DROPDOWN_POSITIONS_RIGHT existant.
7705
+ * Alias exporté pour clarté sémantique.
7706
+ */
7707
+ declare const SIDEBAR_POPOVER_POSITIONS_RIGHT: ConnectedPosition[];
7708
+ /**
7709
+ * Positions pour popover sidebar (sidebar à droite → popover à gauche)
7710
+ *
7711
+ * Stratégie :
7712
+ * 1. Position préférée : à gauche, aligné en haut
7713
+ * 2. Fallback : à gauche, aligné au centre
7714
+ * 3. Fallback : à droite si pas d'espace à gauche
7715
+ */
7716
+ declare const SIDEBAR_POPOVER_POSITIONS_LEFT: ConnectedPosition[];
7717
+
7718
+ /**
7719
+ * Service centralisé pour l'enregistrement des icônes FontAwesome.
7720
+ *
7721
+ * @description
7722
+ * Permet d'enregistrer des icônes de manière lazy et centralisée, évitant
7723
+ * d'importer toutes les icônes FontAwesome dans chaque composant. Les composants
7724
+ * peuvent utiliser les icônes enregistrées via leur nom plutôt que via l'objet complet.
7725
+ *
7726
+ * @example
7727
+ * ```typescript
7728
+ * // Dans app.config.ts ou main.ts
7729
+ * import { IconRegistryService } from 'ds-angular';
7730
+ * import { faCheck, faTimes, faExclamation } from '@fortawesome/free-solid-svg-icons';
7731
+ *
7732
+ * const iconRegistry = inject(IconRegistryService);
7733
+ * iconRegistry.registerIcons([faCheck, faTimes, faExclamation]);
7734
+ * ```
7735
+ *
7736
+ * @example
7737
+ * ```typescript
7738
+ * // Enregistrement par groupe thématique
7739
+ * import { faCheck, faTimes } from '@fortawesome/free-solid-svg-icons';
7740
+ *
7741
+ * iconRegistry.registerIconGroup('validation', [faCheck, faTimes]);
7742
+ * ```
7743
+ */
7744
+ declare class IconRegistryService {
7745
+ private library;
7746
+ private registeredIcons;
7747
+ private iconGroups;
7748
+ constructor(library: FaIconLibrary);
7749
+ /**
7750
+ * Enregistre une ou plusieurs icônes FontAwesome dans la bibliothèque globale.
7751
+ *
7752
+ * @param icons - Tableau d'icônes FontAwesome à enregistrer
7753
+ * @returns Le service lui-même pour chaînage
7754
+ *
7755
+ * @example
7756
+ * ```typescript
7757
+ * iconRegistry.registerIcons([faUser, faEnvelope, faPhone]);
7758
+ * ```
7759
+ */
7760
+ registerIcons(icons: IconDefinition[]): this;
7761
+ /**
7762
+ * Enregistre un groupe d'icônes sous un nom thématique.
7763
+ *
7764
+ * @param groupName - Nom du groupe (ex: 'forms', 'navigation')
7765
+ * @param icons - Tableau d'icônes du groupe
7766
+ * @returns Le service lui-même pour chaînage
7767
+ *
7768
+ * @example
7769
+ * ```typescript
7770
+ * iconRegistry.registerIconGroup('forms', [
7771
+ * faCheck, faTimes, faExclamation, faInfo
7772
+ * ]);
7773
+ * ```
7774
+ */
7775
+ registerIconGroup(groupName: string, icons: IconDefinition[]): this;
7776
+ /**
7777
+ * Vérifie si une icône est déjà enregistrée.
7778
+ *
7779
+ * @param iconName - Nom de l'icône (format: 'prefix-iconName')
7780
+ * @returns true si l'icône est enregistrée
7781
+ *
7782
+ * @example
7783
+ * ```typescript
7784
+ * if (!iconRegistry.isIconRegistered('fas-check')) {
7785
+ * iconRegistry.registerIcons([faCheck]);
7786
+ * }
7787
+ * ```
7788
+ */
7789
+ isIconRegistered(iconName: string): boolean;
7790
+ /**
7791
+ * Récupère tous les noms d'icônes enregistrées.
7792
+ *
7793
+ * @returns Tableau des noms d'icônes enregistrées
7794
+ */
7795
+ getRegisteredIcons(): string[];
6279
7796
  /**
6280
7797
  * Récupère les icônes d'un groupe thématique.
6281
7798
  *
@@ -6478,5 +7995,20 @@ declare class DsI18nService {
6478
7995
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<DsI18nService>;
6479
7996
  }
6480
7997
 
6481
- export { AUTOCOMPLETE_POSITIONS, BUTTON_APPEARANCE_OPTIONS, BUTTON_SIZE_OPTIONS, BUTTON_VARIANT_OPTIONS, DROPDOWN_POSITIONS, DsAccordion, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCalendar, DsCard, DsCarousel, DsCheckbox, DsChip, DsColorPicker, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDrawer, DsDropdown, DsEmpty, DsFileUpload, DsI18nService, DsInputField, DsInputNumber, DsInputTextarea, DsMenu, DsModalComponent, DsNotificationContainerComponent, DsNotificationItemComponent, DsNotificationService, DsPagination, DsPasswordStrength, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsRating, DsSearchInput, DsSegmentedControl, DsSelect, DsSkeleton, DsSlider, DsStepper, DsTable, DsTabs, DsTimePicker, DsTimeline, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, DsTransfer, DsTree, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, TOOLTIP_POSITIONS, buildButtonArgTypes, buildButtonArgs, createSizeRender, createVariantRender };
6482
- export type { AccordionChangeEvent, AccordionItem, AccordionSize, AccordionVariant, AlertSize, AlertType, AvatarShape, AvatarSize, BadgeAppearance, BadgeShape, BadgeSize, BadgeType, BadgeVariant, BreadcrumbItem, ButtonAppearance, ButtonSize, ButtonType, ButtonVariant, CalendarEvent, CalendarMode, CalendarSize, CardSize, CardVariant, CarouselDotsPosition, CarouselEffect, CarouselSlide, CheckboxSize, CheckboxState, ChipColor, ChipSize, ChipVariant, ColorFormat, ColorPickerSize, ContainerGutter, ContainerMaxWidth, DatePickerMode, DatePickerSize, DateRange, DividerLabelPosition, DividerOrientation, DividerSize, DividerVariant, DrawerPosition, DrawerSize, DropdownItem, DropdownItemDTO, DsComboboxOption, DsComboboxSize, DsSelectOption, DsSelectSize, DsTableColumn, DsTableSize, DsTableVariant, EmptySize, FileUploadSize, HSLColor, I18nLabels, InputAppearance, InputNumberControlsPosition, InputNumberSize, InputSize, InputState, InputType, MenuItem, MenuSize, MenuTrigger, NotificationAction, NotificationConfig, NotificationItem, NotificationPlacement, PageChangeEvent, PageSizeOption, PaginationSize, PasswordCriterion, PasswordStrength, PasswordStrengthSize, PopoverTrigger, ProgressBarMode, ProgressBarSize, ProgressBarVariant, RGBColor, RadioGroupLayout, RadioOption, RadioSize, RatingSize, SearchInputSize, SegmentOption, SegmentedControlColor, SegmentedControlOrientation, SegmentedControlSize, SkeletonSize, SkeletonVariant, SliderOrientation, SliderSize, SliderValue, SortDirection, SortEvent, Step, StepChangeEvent, StepState, StepperOrientation, StepperSize, SupportedLocale, TabItem, TableState, TextareaAppearance, TextareaResize, TextareaSize, TextareaState, TimeFormat, TimePickerSize, TimeValue, TimelineColor, TimelineItem, TimelineItemClickEvent, TimelineMode, TimelineSize, ToastInstance, ToastOptions, ToastPosition, ToastType, ToggleSize, TransferChangeEvent, TransferDirection, TransferItem, TransferSize, TreeNode, TreeNodeCheckEvent, TreeNodeExpandEvent, TreeNodeSelectEvent, TreeSize, UploadFile };
7998
+ /**
7999
+ * Génère un identifiant unique compatible avec tous les environnements.
8000
+ * Utilise crypto.randomUUID() si disponible, sinon génère un UUID v4 manuellement.
8001
+ *
8002
+ * @returns Un identifiant UUID v4 unique
8003
+ */
8004
+ declare function generateId(): string;
8005
+ /**
8006
+ * Génère un identifiant court (sans tirets) pour les cas où un UUID complet n'est pas nécessaire.
8007
+ *
8008
+ * @param prefix Préfixe optionnel à ajouter à l'identifiant
8009
+ * @returns Un identifiant court unique
8010
+ */
8011
+ declare function generateShortId(prefix?: string): string;
8012
+
8013
+ export { AUTOCOMPLETE_POSITIONS, DROPDOWN_POSITIONS, DROPDOWN_POSITIONS_RIGHT, DROPDOWN_POSITIONS_TOP, DsAccordion, DsAlert, DsAvatar, DsBadge, DsBreadcrumb, DsButton, DsCalendar, DsCard, DsCarousel, DsCheckbox, DsCheckboxList, DsChip, DsColorPicker, DsCombobox, DsContainer, DsDatePicker, DsDivider, DsDrawer, DsDropdown, DsEmpty, DsFileUpload, DsI18nService, DsInputField, DsInputNumber, DsInputTextarea, DsList, DsListGroup, DsListItem, DsMenu, DsModalComponent, DsNavList, DsNotificationContainerComponent, DsNotificationItemComponent, DsNotificationService, DsPagination, DsPasswordStrength, DsPopover, DsPopoverComponent, DsProgressBar, DsRadioGroup, DsRating, DsSearchInput, DsSegmentedControl, DsSelect, DsSidebar, DsSidebarFooterItemComponent, DsSidebarItemComponent, DsSkeleton, DsSlider, DsStepper, DsTable, DsTabs, DsTimePicker, DsTimeline, DsToastComponent, DsToastContainerComponent, DsToastService, DsToggle, DsTooltip, DsTooltipComponent, DsTransfer, DsTree, IconRegistryService, POPOVER_POSITIONS, PrimitiveBadge, PrimitiveButton, PrimitiveCheckbox, PrimitiveInput, PrimitiveRadio, PrimitiveTextarea, PrimitiveToggle, SIDEBAR_POPOVER_POSITIONS_LEFT, SIDEBAR_POPOVER_POSITIONS_RIGHT, TOOLTIP_POSITIONS, generateId, generateShortId };
8014
+ export type { AccordionChangeEvent, AccordionItem, AccordionSize, AccordionVariant, AlertSize, AlertType, AvatarShape, AvatarSize, BadgeAppearance, BadgeShape, BadgeSize, BadgeType, BadgeVariant, BreadcrumbItem, ButtonAppearance, ButtonSize, ButtonType, ButtonVariant, CalendarEvent, CalendarMode, CalendarSize, CardSize, CardVariant, CarouselDotsPosition, CarouselEffect, CarouselSlide, CheckboxListChangeEvent, CheckboxListItem, CheckboxListItemChangeEvent, CheckboxListSize, CheckboxSize, CheckboxState, ChipColor, ChipSize, ChipVariant, ColorFormat, ColorPickerSize, ContainerGutter, ContainerMaxWidth, DatePickerMode, DatePickerSize, DateRange, DividerLabelPosition, DividerOrientation, DividerSize, DividerVariant, DrawerPosition, DrawerSize, DropdownItem, DropdownItemDTO, DropdownPosition, DsComboboxOption, DsComboboxSize, DsSelectOption, DsSelectSize, DsTableColumn, DsTableSize, DsTableVariant, EmptySize, FileUploadSize, FlattenedSidebarItem, HSLColor, I18nLabels, InputAppearance, InputNumberControlsPosition, InputNumberSize, InputSize, InputState, InputType, ListDragEvent, ListEmptyConfig, ListGroupToggleEvent, ListGroupVariant, ListItemCheckEvent, ListItemClickEvent, ListItemIndicator, ListItemIndicatorColor, ListItemSize, ListSelectionChangeEvent, ListSize, ListVariant, MenuItem, MenuSize, MenuTrigger, NavListBadgeVariant, NavListGroup, NavListGroupToggleEvent, NavListItem, NavListItemClickEvent, NavListSize, NotificationAction, NotificationConfig, NotificationItem, NotificationPlacement, PageChangeEvent, PageSizeOption, PaginationSize, PasswordCriterion, PasswordStrength, PasswordStrengthSize, PopoverTrigger, ProgressBarMode, ProgressBarSize, ProgressBarVariant, RGBColor, RadioGroupLayout, RadioOption, RadioSize, RatingSize, SearchInputSize, SegmentOption, SegmentedControlColor, SegmentedControlOrientation, SegmentedControlSize, SidebarBadgeVariant, SidebarCollapsedTrigger, SidebarItem, SidebarItemClickEvent, SidebarItemExpandEvent, SidebarMode, SidebarPosition, SidebarSize, SkeletonSize, SkeletonVariant, SliderOrientation, SliderSize, SliderValue, SortDirection, SortEvent, Step, StepChangeEvent, StepState, StepperOrientation, StepperSize, SupportedLocale, TabItem, TableState, TextareaAppearance, TextareaResize, TextareaSize, TextareaState, TimeFormat, TimePickerSize, TimeValue, TimelineColor, TimelineItem, TimelineItemClickEvent, TimelineMode, TimelineSize, ToastInstance, ToastOptions, ToastPosition, ToastType, ToggleSize, TransferChangeEvent, TransferDirection, TransferItem, TransferSize, TreeNode, TreeNodeCheckEvent, TreeNodeExpandEvent, TreeNodeSelectEvent, TreeSize, UploadFile };