@ktortu/aaa 0.9.4 → 0.9.6

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.
Files changed (39) hide show
  1. package/README.md +25 -1
  2. package/button/button-tokens.css +3 -1
  3. package/button/button.css +3 -3
  4. package/card/card-tokens.css +2 -1
  5. package/cdk/styles/foundation.css +19 -10
  6. package/dialog/dialog.css +58 -4
  7. package/fesm2022/ktortu-aaa-dialog.mjs +28 -14
  8. package/fesm2022/ktortu-aaa-dialog.mjs.map +1 -1
  9. package/fesm2022/ktortu-aaa-forms.mjs +402 -36
  10. package/fesm2022/ktortu-aaa-forms.mjs.map +1 -1
  11. package/fesm2022/ktortu-aaa-layout.mjs +286 -0
  12. package/fesm2022/ktortu-aaa-layout.mjs.map +1 -0
  13. package/fesm2022/ktortu-aaa.mjs +1 -0
  14. package/fesm2022/ktortu-aaa.mjs.map +1 -1
  15. package/forms/chips/chip-listbox.css +56 -0
  16. package/forms/chips/chip.css +47 -0
  17. package/forms/chips/tokens.css +5 -0
  18. package/forms/field/field.css +3 -1
  19. package/forms/styles/select-panel.css +3 -3
  20. package/package.json +5 -1
  21. package/styles/layout.css +140 -0
  22. package/styles/styles.css +1 -0
  23. package/themes/theme-ant.css +21 -16
  24. package/themes/theme-architecte.css +28 -28
  25. package/themes/theme-aurora.css +23 -23
  26. package/themes/theme-bootstrap.css +19 -19
  27. package/themes/theme-carbon.css +18 -18
  28. package/themes/theme-catppuccin.css +27 -27
  29. package/themes/theme-cyberpunk.css +28 -28
  30. package/themes/theme-fluent.css +32 -19
  31. package/themes/theme-material-you.css +78 -27
  32. package/themes/theme-material.css +28 -19
  33. package/themes/theme-primer.css +24 -18
  34. package/themes/theme-vegetal.css +21 -21
  35. package/tooltip/tooltip.css +1 -0
  36. package/types/ktortu-aaa-dialog.d.ts +23 -1
  37. package/types/ktortu-aaa-forms.d.ts +118 -6
  38. package/types/ktortu-aaa-layout.d.ts +117 -0
  39. package/types/ktortu-aaa.d.ts +1 -0
@@ -66,6 +66,10 @@ interface KtFieldConfig {
66
66
  appearance: KtFieldAppearance;
67
67
  /** Politique du label flottant en `outline` (`auto` | `always`). Défaut : `'auto'`. */
68
68
  floatLabel: KtFloatLabel;
69
+ /** Masquer visuellement le label (tout en le gardant dans le DOM pour l'accessibilité). Défaut : `false`. */
70
+ hideLabel: boolean;
71
+ /** Masquer visuellement le bloc d'erreur (tout en le gardant dans le DOM pour l'accessibilité). Défaut : `false`. */
72
+ hideErrors: boolean;
69
73
  }
70
74
  declare const KT_FIELD_CONFIG: InjectionToken<Partial<KtFieldConfig>>;
71
75
  /**
@@ -153,6 +157,10 @@ declare class KtField implements KtFieldParent {
153
157
  readonly hideHintWhenInvalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
154
158
  /** Afficher toutes les erreurs au lieu de la première seule. @default KT_FIELD_CONFIG.showAllErrors ?? false */
155
159
  readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
160
+ /** Masquer visuellement le label. @default KT_FIELD_CONFIG.hideLabel ?? false */
161
+ readonly hideLabel: _angular_core.InputSignalWithTransform<boolean, unknown>;
162
+ /** Masquer visuellement le bloc d'erreur. @default KT_FIELD_CONFIG.hideErrors ?? false */
163
+ readonly hideErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
156
164
  /** Apparence du chrome : `fill` (label au-dessus) ou `outline` (bordure + label flottant, façon
157
165
  Material). Non fournie ⇒ valeur du `KT_FIELD_CONFIG`, sinon `'fill'`. @default undefined */
158
166
  readonly appearance: _angular_core.InputSignal<KtFieldAppearance | undefined>;
@@ -180,7 +188,7 @@ declare class KtField implements KtFieldParent {
180
188
  readonly describedBy: _angular_core.Signal<string | null>;
181
189
  protected onHelpClick(event: MouseEvent): void;
182
190
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtField, never>;
183
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtField, "kt-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "fieldId": { "alias": "fieldId"; "required": false; "isSignal": true; }; "hideHintWhenInvalid": { "alias": "hideHintWhenInvalid"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; }, { "helpClick": "helpClick"; }, ["control"], ["[ktFieldHelp]", "*"], true, never>;
191
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtField, "kt-field", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "fieldId": { "alias": "fieldId"; "required": false; "isSignal": true; }; "hideHintWhenInvalid": { "alias": "hideHintWhenInvalid"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; "hideErrors": { "alias": "hideErrors"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; }, { "helpClick": "helpClick"; }, ["control"], ["[ktFieldHelp]", "*"], true, never>;
184
192
  }
185
193
 
186
194
  /** Marque le contrôle (natif ou custom) d'un champ pour que `Field` y câble l'a11y
@@ -328,6 +336,10 @@ declare abstract class KtBaseInputField<T> {
328
336
  /** Politique du label flottant en outline (`auto` | `always`) ; non fournie ⇒ `KT_FIELD_CONFIG.floatLabel`
329
337
  ?? `'auto'`. En `always`, le label reste en haut même vide et le placeholder s'affiche. @default undefined */
330
338
  readonly floatLabel: _angular_core.InputSignal<KtFloatLabel | undefined>;
339
+ /** Masquer visuellement le label. @default KT_FIELD_CONFIG.hideLabel ?? false */
340
+ readonly hideLabel: _angular_core.InputSignalWithTransform<boolean, unknown>;
341
+ /** Masquer visuellement le bloc d'erreur. @default KT_FIELD_CONFIG.hideErrors ?? false */
342
+ readonly hideErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
331
343
  protected readonly inputRef: _angular_core.Signal<ElementRef<HTMLInputElement | HTMLTextAreaElement> | undefined>;
332
344
  private readonly matcher;
333
345
  protected readonly showInvalid: _angular_core.Signal<boolean>;
@@ -362,7 +374,7 @@ declare abstract class KtBaseInputField<T> {
362
374
  /** La valeur est-elle vide (affichage du bouton d'effacement) ? */
363
375
  protected abstract isEmpty(value: T): boolean;
364
376
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtBaseInputField<any>, never>;
365
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseInputField<any>, never, never, { "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "helpClick": "helpClick"; }, never, never, true, never>;
377
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseInputField<any>, never, never, { "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "suffix": { "alias": "suffix"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; "hideErrors": { "alias": "hideErrors"; "required": false; "isSignal": true; }; }, { "touched": "touchedChange"; "helpClick": "helpClick"; }, never, never, true, never>;
366
378
  }
367
379
 
368
380
  /** Suggestion d'un champ de saisie (rendu `<datalist>`) : soit la valeur seule, soit un couple
@@ -982,6 +994,10 @@ declare abstract class KtBaseSelect<T, V = T> {
982
994
  /** Politique du label flottant en outline (`auto` | `always`) ; non fournie ⇒ `KT_FIELD_CONFIG.floatLabel`
983
995
  ?? `'auto'`. @default undefined */
984
996
  readonly floatLabel: _angular_core.InputSignal<KtFloatLabel | undefined>;
997
+ /** Masquer visuellement le label. @default KT_FIELD_CONFIG.hideLabel ?? false */
998
+ readonly hideLabel: _angular_core.InputSignalWithTransform<boolean, unknown>;
999
+ /** Masquer visuellement le bloc d'erreur. @default KT_FIELD_CONFIG.hideErrors ?? false */
1000
+ readonly hideErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
985
1001
  /** Affiche un champ de recherche en tête du popup (desktop) / de la sheet (téléphone).
986
1002
  Pour les listes longues ; le texte tapé ne sert qu'à filtrer (réinitialisé à la fermeture). @default false */
987
1003
  readonly filterable: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -1086,7 +1102,7 @@ declare abstract class KtBaseSelect<T, V = T> {
1086
1102
  protected onDragStart(event: PointerEvent): void;
1087
1103
  private animateAndCloseSelect;
1088
1104
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtBaseSelect<any, any>, never>;
1089
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseSelect<any, any>, never, never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "optionDisabled": { "alias": "optionDisabled"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "filterable": { "alias": "filterable"; "required": false; "isSignal": true; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; "isSignal": true; }; "filterLabel": { "alias": "filterLabel"; "required": false; "isSignal": true; }; "filterFn": { "alias": "filterFn"; "required": false; "isSignal": true; }; "maxVisibleOptions": { "alias": "maxVisibleOptions"; "required": false; "isSignal": true; }; "truncatedResultsText": { "alias": "truncatedResultsText"; "required": false; "isSignal": true; }; "truncatedResultsAnnouncement": { "alias": "truncatedResultsAnnouncement"; "required": false; "isSignal": true; }; }, { "helpClick": "helpClick"; "touched": "touchedChange"; }, never, never, true, never>;
1105
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtBaseSelect<any, any>, never, never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "optionLabel": { "alias": "optionLabel"; "required": false; "isSignal": true; }; "optionValue": { "alias": "optionValue"; "required": false; "isSignal": true; }; "optionDisabled": { "alias": "optionDisabled"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "helpText": { "alias": "helpText"; "required": false; "isSignal": true; }; "helpLabel": { "alias": "helpLabel"; "required": false; "isSignal": true; }; "customDescribedBy": { "alias": "customDescribedBy"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "floatLabel": { "alias": "floatLabel"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; "hideErrors": { "alias": "hideErrors"; "required": false; "isSignal": true; }; "filterable": { "alias": "filterable"; "required": false; "isSignal": true; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; "isSignal": true; }; "filterLabel": { "alias": "filterLabel"; "required": false; "isSignal": true; }; "filterFn": { "alias": "filterFn"; "required": false; "isSignal": true; }; "maxVisibleOptions": { "alias": "maxVisibleOptions"; "required": false; "isSignal": true; }; "truncatedResultsText": { "alias": "truncatedResultsText"; "required": false; "isSignal": true; }; "truncatedResultsAnnouncement": { "alias": "truncatedResultsAnnouncement"; "required": false; "isSignal": true; }; }, { "helpClick": "helpClick"; "touched": "touchedChange"; }, never, never, true, never>;
1090
1106
  }
1091
1107
 
1092
1108
  /** Contexte typé reçu par le template d'une option (`ktSelectOption`). */
@@ -1451,7 +1467,92 @@ declare abstract class ChipTransitionScope {
1451
1467
  }
1452
1468
 
1453
1469
  /**
1454
- * Pilule individuelle (tag). Utilisable seule (tag statique) ou dans `kt-chip-list`.
1470
+ * Groupe de puces sélectionnables (Chip Listbox) conforme à l'ARIA Listbox / WCAG AAA.
1471
+ * Orchestrateur : s'intègre aux formulaires réactifs ou de modèle via `FormValueControl`.
1472
+ * Permet la sélection simple ou multiple, avec gestion du roving tabindex et des touches fléchées
1473
+ * de façon autonome et robuste.
1474
+ *
1475
+ * @example
1476
+ * ```html
1477
+ * <kt-chip-listbox label="Filtres" [(value)]="selectedTags" multiple>
1478
+ * <kt-chip [value]="'angular'">Angular</kt-chip>
1479
+ * <kt-chip [value]="'react'">React</kt-chip>
1480
+ * </kt-chip-listbox>
1481
+ * ```
1482
+ */
1483
+ declare class KtChipListbox<V> implements FormValueControl<V | V[] | null> {
1484
+ private readonly config;
1485
+ private readonly doc;
1486
+ /** Valeur sélectionnée (two-way) : tableau de valeurs (si multiple) ou valeur unique (si simple). */
1487
+ readonly value: _angular_core.ModelSignal<V | V[] | null>;
1488
+ /** État « touché » (two-way), piloté par `[formField]`. @default false */
1489
+ readonly touched: _angular_core.ModelSignal<boolean>;
1490
+ /** Désactive le groupe de puces. @default false */
1491
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1492
+ /** Mode lecture seule (bloque la sélection). @default false */
1493
+ readonly readonly: _angular_core.InputSignalWithTransform<boolean, unknown>;
1494
+ /** Marque le groupe comme invalide. @default false */
1495
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
1496
+ /** Affiche l'astérisque requis et aria-required sur le groupe. @default false */
1497
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
1498
+ /** État « modifié » (dirty). @default false */
1499
+ readonly dirty: _angular_core.InputSignalWithTransform<boolean, unknown>;
1500
+ /** Validation asynchrone en cours. @default false */
1501
+ readonly pending: _angular_core.InputSignalWithTransform<boolean, unknown>;
1502
+ /** Erreurs de validation à afficher. @default [] */
1503
+ readonly errors: _angular_core.InputSignal<readonly WithOptionalFieldTree<ValidationError>[]>;
1504
+ /** Autorise la sélection de plusieurs puces. @default false */
1505
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
1506
+ /** Identifiant du composant (sélecteurs de test stables). @default auto-généré */
1507
+ readonly id: _angular_core.InputSignal<string | undefined>;
1508
+ /** Libellé (légende) du groupe de puces. @default undefined */
1509
+ readonly label: _angular_core.InputSignal<string | undefined>;
1510
+ /** Texte d'aide affiché sous le groupe. @default undefined */
1511
+ readonly hint: _angular_core.InputSignal<string | undefined>;
1512
+ /** Nom accessible (aria-label) quand label est absent. @default undefined */
1513
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
1514
+ /** Masquer visuellement le label. @default KT_FIELD_CONFIG.hideLabel ?? false */
1515
+ readonly hideLabel: _angular_core.InputSignalWithTransform<boolean, unknown>;
1516
+ /** Masquer visuellement le bloc d'erreur. @default KT_FIELD_CONFIG.hideErrors ?? false */
1517
+ readonly hideErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
1518
+ /** Stratégie d'affichage des erreurs. @default undefined */
1519
+ readonly errorMatcher: _angular_core.InputSignal<KtFieldErrorMatcher | undefined>;
1520
+ /** Afficher toutes les erreurs. @default false */
1521
+ readonly showAllErrors: _angular_core.InputSignalWithTransform<boolean, unknown>;
1522
+ /** Fonction de comparaison de valeurs pour déterminer la sélection. */
1523
+ readonly compareWith: _angular_core.InputSignal<((a: V, b: V) => boolean) | undefined>;
1524
+ private readonly el;
1525
+ private readonly errorResolver;
1526
+ private readonly idGen;
1527
+ private readonly uid;
1528
+ protected readonly baseId: _angular_core.Signal<string>;
1529
+ protected readonly labelId: _angular_core.Signal<string>;
1530
+ protected readonly hintId: _angular_core.Signal<string>;
1531
+ protected readonly errorId: _angular_core.Signal<string>;
1532
+ protected readonly activeIndex: _angular_core.WritableSignal<number>;
1533
+ private readonly matcher;
1534
+ protected readonly showInvalid: _angular_core.Signal<boolean>;
1535
+ protected readonly resolvedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
1536
+ protected readonly displayedErrors: _angular_core.Signal<_ktortu_aaa_forms.KtFieldError[]>;
1537
+ protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
1538
+ protected readonly describedBy: _angular_core.Signal<string | null>;
1539
+ private readonly comparator;
1540
+ constructor();
1541
+ private query;
1542
+ /** Détermine si une valeur d'option est sélectionnée. */
1543
+ isSelected(optionValue: V): boolean;
1544
+ /** Bascule la sélection d'une valeur d'option. */
1545
+ toggle(optionValue: V): void;
1546
+ protected onKeydown(event: KeyboardEvent): void;
1547
+ protected onFocusin(event: FocusEvent): void;
1548
+ /** Focus la première option active. */
1549
+ focus(options?: FocusOptions): void;
1550
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtChipListbox<any>, never>;
1551
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtChipListbox<any>, "kt-chip-listbox", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "pending": { "alias": "pending"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "hideLabel": { "alias": "hideLabel"; "required": false; "isSignal": true; }; "hideErrors": { "alias": "hideErrors"; "required": false; "isSignal": true; }; "errorMatcher": { "alias": "errorMatcher"; "required": false; "isSignal": true; }; "showAllErrors": { "alias": "showAllErrors"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, ["*"], true, never>;
1552
+ }
1553
+
1554
+ /**
1555
+ * Pilule individuelle (tag). Utilisable seule (tag statique), dans `kt-chip-list` ou dans `kt-chip-listbox`.
1455
1556
  * Le label vient de la projection de contenu ; `removable` ajoute un bouton « retirer »
1456
1557
  * (24px visibles, cible 44px via ::after — technique des boutons icon-only).
1457
1558
  *
@@ -1463,6 +1564,7 @@ declare abstract class ChipTransitionScope {
1463
1564
  */
1464
1565
  declare class KtChip {
1465
1566
  protected readonly scope: ChipTransitionScope | null;
1567
+ protected readonly listbox: KtChipListbox<unknown> | null;
1466
1568
  private readonly idGen;
1467
1569
  /** Nom de View Transition propre au chip (détail interne, posé en host binding). */
1468
1570
  protected readonly viewTransitionName: string;
@@ -1472,9 +1574,19 @@ declare class KtChip {
1472
1574
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1473
1575
  /** Libellé accessible du bouton « retirer » (inclure le nom de l'item : « Remove X »). @default 'Remove' */
1474
1576
  readonly removeLabel: _angular_core.InputSignal<string>;
1577
+ /** État sélectionné unitaire (quand utilisé hors boîte de liste). @default false */
1578
+ readonly checked: _angular_core.InputSignalWithTransform<boolean, unknown>;
1579
+ /** Valeur portée par la puce (utilisée au sein d'un groupe de sélection). */
1580
+ readonly value: _angular_core.InputSignal<unknown>;
1475
1581
  /** Émis au clic sur le bouton « retirer » (le parent décide de retirer le chip). */
1476
1582
  readonly remove: _angular_core.OutputEmitterRef<void>;
1583
+ private readonly initialRole;
1584
+ /** Rôle d'accessibilité calculé (préserve les rôles statiques comme listitem). */
1585
+ protected readonly role: _angular_core.Signal<string | null>;
1586
+ /** Signal consolidé de l'état de sélection (dérivé du parent listbox ou de l'input checked). */
1587
+ readonly selected: _angular_core.Signal<boolean>;
1477
1588
  private readonly removeBtn;
1589
+ constructor();
1478
1590
  /**
1479
1591
  * Focus programmatique du bouton « retirer ». Helper de coordination interne (focus management
1480
1592
  * d'`kt-chip-list`), non destiné aux consommateurs.
@@ -1482,7 +1594,7 @@ declare class KtChip {
1482
1594
  */
1483
1595
  focusRemove(): void;
1484
1596
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtChip, never>;
1485
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtChip, "kt-chip", never, { "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; }, { "remove": "remove"; }, never, ["*"], true, never>;
1597
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtChip, "kt-chip", never, { "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "remove": "remove"; }, never, ["*"], true, never>;
1486
1598
  }
1487
1599
 
1488
1600
  /** Contexte typé reçu par le template d'un chip custom (`ktChipItem`). */
@@ -1966,5 +2078,5 @@ declare class KtFixedClock extends KtClock {
1966
2078
  today(): Temporal$1.PlainDate;
1967
2079
  }
1968
2080
 
1969
- export { DEFAULT_KT_SELECT_CONFIG, KT_CHIPS_CONFIG, KT_DEFAULT_FIELD_ERROR_MESSAGES, KT_FIELD, KT_FIELD_CONFIG, KT_SELECT_CONFIG, KtBaseInputField, KtBaseSelect, KtBaseTemporalField, KtBaseTimeTemporalField, KtCheckbox, KtCheckboxGroup, KtChip, KtChipItemDef, KtChipList, KtClock, KtDateField, KtDateTimeField, KtField, KtFieldControl, KtFieldErrorResolver, KtFixedClock, KtInstantField, KtMultiSelect, KtMultiSelectChipDef, KtMultiSelectOptionDef, KtMultiSelectTriggerDef, KtNumberField, KtPasswordField, KtRadio, KtRadioGroup, KtSelect, KtSelectConfig, KtSelectOptionDef, KtSelectTriggerDef, KtSwitch, KtTemporalDatePipe, KtTextArea, KtTextField, KtTimeField, KtYearMonthField, Temporal, defaultKtFieldErrorMatcher, ktErrorParam, normalizeKtSuggestions, provideKtField };
2081
+ export { DEFAULT_KT_SELECT_CONFIG, KT_CHIPS_CONFIG, KT_DEFAULT_FIELD_ERROR_MESSAGES, KT_FIELD, KT_FIELD_CONFIG, KT_SELECT_CONFIG, KtBaseInputField, KtBaseSelect, KtBaseTemporalField, KtBaseTimeTemporalField, KtCheckbox, KtCheckboxGroup, KtChip, KtChipItemDef, KtChipList, KtChipListbox, KtClock, KtDateField, KtDateTimeField, KtField, KtFieldControl, KtFieldErrorResolver, KtFixedClock, KtInstantField, KtMultiSelect, KtMultiSelectChipDef, KtMultiSelectOptionDef, KtMultiSelectTriggerDef, KtNumberField, KtPasswordField, KtRadio, KtRadioGroup, KtSelect, KtSelectConfig, KtSelectOptionDef, KtSelectTriggerDef, KtSwitch, KtTemporalDatePipe, KtTextArea, KtTextField, KtTimeField, KtYearMonthField, Temporal, defaultKtFieldErrorMatcher, ktErrorParam, normalizeKtSuggestions, provideKtField };
1970
2082
  export type { CalendarDate, KtChipItemContext, KtChipsConfig, KtDatalistOption, KtErrorMessageFactory, KtFieldAppearance, KtFieldConfig, KtFieldError, KtFieldErrorMatcher, KtFieldErrorMessages, KtFieldErrorState, KtFieldParent, KtFloatLabel, KtKeyish, KtMultiSelectChipContext, KtMultiSelectOptionContext, KtMultiSelectSelectionChange, KtMultiSelectTriggerContext, KtPasswordAutocomplete, KtResolvableError, KtSelectConfigOptions, KtSelectOptionContext, KtSelectSelectionChange, KtSelectTriggerContext, KtSuggestion, KtTextFieldType, KtTimePrecision, LocalDateTime, Timestamp, WallTime, ZonedTimestamp };
@@ -0,0 +1,117 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken } from '@angular/core';
3
+ import * as i1 from '@angular/cdk/a11y';
4
+
5
+ /** Mode d'état de la navigation latérale. */
6
+ type KtSidenavState = 'expanded' | 'rail' | 'hidden';
7
+ declare const KT_LAYOUT_DEFAULT_STATE: InjectionToken<KtSidenavState>;
8
+ /**
9
+ * Service global de gestion de la mise en page (Layout).
10
+ * Gère l'état d'ouverture/fermeture de la barre latérale sur mobile et bureau,
11
+ * ainsi que le comportement spécifique de "rail" sur bureau.
12
+ *
13
+ * NOTE: Ce service n'est pas "providedIn: 'root'". Le développeur doit le fournir
14
+ * (via le tableau providers d'un composant parent ou de l'application) pour
15
+ * maîtriser le scope (ex: avoir plusieurs layouts indépendants).
16
+ */
17
+ declare class KtLayoutService {
18
+ private readonly viewport;
19
+ private readonly defaultState;
20
+ /**
21
+ * Comportement actif lors de la fermeture sur ordinateur (écran non mobile).
22
+ * Renseigné généralement par le composant racine `KtLayoutComponent`.
23
+ */
24
+ readonly desktopCloseBehavior: _angular_core.WritableSignal<"rail" | "hidden">;
25
+ private readonly _isDesktopOpen;
26
+ private readonly _isMobileOpen;
27
+ readonly isMobile: _angular_core.Signal<boolean>;
28
+ readonly isRail: _angular_core.Signal<boolean>;
29
+ readonly isExpanded: _angular_core.Signal<boolean>;
30
+ readonly isHidden: _angular_core.Signal<boolean>;
31
+ readonly isMobileOpen: _angular_core.Signal<boolean>;
32
+ toggle(): void;
33
+ open(): void;
34
+ close(): void;
35
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtLayoutService, never>;
36
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<KtLayoutService>;
37
+ }
38
+
39
+ /**
40
+ * Composant racine de l'application qui gère la structure de base (Sidebar, Toolbar, Contenu).
41
+ * Configure dynamiquement le comportement du layout.
42
+ */
43
+ declare class KtLayoutComponent {
44
+ /**
45
+ * Définit le comportement de la navigation latérale lors de sa fermeture sur bureau (écran large).
46
+ * - `'hidden'` (défaut) : le menu est complètement masqué et retiré du flux visuel/a11y.
47
+ * - `'rail'` : le menu est réduit à une fine barre verticale (mini-sidebar), permettant
48
+ * d'afficher uniquement les icônes. Idéal si les liens possèdent des icônes explicites.
49
+ */
50
+ readonly desktopCloseBehavior: _angular_core.InputSignal<"rail" | "hidden">;
51
+ protected readonly layout: KtLayoutService;
52
+ constructor();
53
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtLayoutComponent, never>;
54
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtLayoutComponent, "kt-layout", never, { "desktopCloseBehavior": { "alias": "desktopCloseBehavior"; "required": false; "isSignal": true; }; }, {}, never, ["kt-sidenav", "kt-toolbar", "*"], true, never>;
55
+ }
56
+
57
+ /**
58
+ * Composant représentant le panneau latéral de navigation.
59
+ * Se comporte comme un tiroir (drawer) superposé sur mobile, et comme un
60
+ * menu latéral persistant (réductible ou masquable) sur ordinateur.
61
+ */
62
+ declare class KtSidenavComponent {
63
+ protected readonly layout: KtLayoutService;
64
+ protected readonly isHidden: _angular_core.Signal<boolean>;
65
+ private readonly trapFocus;
66
+ constructor();
67
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtSidenavComponent, never>;
68
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtSidenavComponent, "kt-sidenav", never, {}, {}, never, ["*"], true, [{ directive: typeof i1.CdkTrapFocus; inputs: {}; outputs: {}; }]>;
69
+ }
70
+
71
+ /**
72
+ * Barre d'outils supérieure (Toolbar / Top app bar).
73
+ * Se place généralement dans un `kt-layout`.
74
+ */
75
+ declare class KtToolbarComponent {
76
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtToolbarComponent, never>;
77
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtToolbarComponent, "kt-toolbar", never, {}, {}, never, ["*"], true, never>;
78
+ }
79
+
80
+ declare class KtNavItemComponent {
81
+ label: _angular_core.InputSignal<string>;
82
+ protected readonly layout: KtLayoutService;
83
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtNavItemComponent, never>;
84
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtNavItemComponent, "kt-nav-item", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; }, {}, never, ["[kt-icon]", "*"], true, never>;
85
+ }
86
+
87
+ /**
88
+ * Directive applicable sur n'importe quel élément (souvent un bouton) pour basculer
89
+ * l'état d'ouverture du panneau latéral (Sidenav).
90
+ *
91
+ * Expose l'état du layout pour des utilisations dynamiques dans le template
92
+ * (ex: changer l'icône selon l'état).
93
+ *
94
+ * @example
95
+ * ```html
96
+ * <button ktSidenavToggle #btn="ktSidenavToggle" [icon]="btn.isRail() ? 'right' : 'left'">
97
+ * ```
98
+ */
99
+ declare class KtSidenavToggleDirective {
100
+ private readonly layout;
101
+ /** Indique si le menu est actuellement réduit en mode rail. */
102
+ readonly isRail: _angular_core.Signal<boolean>;
103
+ /** Indique si le menu est actuellement complètement étendu sur bureau. */
104
+ readonly isExpanded: _angular_core.Signal<boolean>;
105
+ /** Indique si le menu est totalement masqué. */
106
+ readonly isHidden: _angular_core.Signal<boolean>;
107
+ /** Indique si le tiroir est actuellement ouvert par-dessus le contenu (mobile). */
108
+ readonly isMobileOpen: _angular_core.Signal<boolean>;
109
+ /** Indique si l'écran actuel est de taille compacte (mobile). */
110
+ readonly isMobile: _angular_core.Signal<boolean>;
111
+ onClick(): void;
112
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtSidenavToggleDirective, never>;
113
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtSidenavToggleDirective, "[ktSidenavToggle]", ["ktSidenavToggle"], {}, {}, never, never, true, never>;
114
+ }
115
+
116
+ export { KT_LAYOUT_DEFAULT_STATE, KtLayoutComponent, KtLayoutService, KtNavItemComponent, KtSidenavComponent, KtSidenavToggleDirective, KtToolbarComponent };
117
+ export type { KtSidenavState };
@@ -10,3 +10,4 @@ export * from '@ktortu/aaa/snackbar';
10
10
  export * from '@ktortu/aaa/tabs';
11
11
  export * from '@ktortu/aaa/tooltip';
12
12
  export * from '@ktortu/aaa/progress-bar';
13
+ export * from '@ktortu/aaa/layout';