@ktortu/aaa 0.9.1 → 0.9.3

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 (40) hide show
  1. package/dialog/dialog.css +6 -0
  2. package/fesm2022/ktortu-aaa-button.mjs +10 -2
  3. package/fesm2022/ktortu-aaa-button.mjs.map +1 -1
  4. package/fesm2022/ktortu-aaa-card.mjs +112 -99
  5. package/fesm2022/ktortu-aaa-card.mjs.map +1 -1
  6. package/fesm2022/ktortu-aaa-cdk.mjs +49 -2
  7. package/fesm2022/ktortu-aaa-cdk.mjs.map +1 -1
  8. package/fesm2022/ktortu-aaa-dialog.mjs +240 -32
  9. package/fesm2022/ktortu-aaa-dialog.mjs.map +1 -1
  10. package/fesm2022/ktortu-aaa-disclosure.mjs +203 -0
  11. package/fesm2022/ktortu-aaa-disclosure.mjs.map +1 -0
  12. package/fesm2022/ktortu-aaa-forms.mjs +217 -103
  13. package/fesm2022/ktortu-aaa-forms.mjs.map +1 -1
  14. package/fesm2022/ktortu-aaa-progress-bar.mjs +91 -0
  15. package/fesm2022/ktortu-aaa-progress-bar.mjs.map +1 -0
  16. package/fesm2022/ktortu-aaa-snackbar.mjs +16 -3
  17. package/fesm2022/ktortu-aaa-snackbar.mjs.map +1 -1
  18. package/fesm2022/ktortu-aaa-tooltip.mjs +20 -30
  19. package/fesm2022/ktortu-aaa-tooltip.mjs.map +1 -1
  20. package/fesm2022/ktortu-aaa.mjs +1 -0
  21. package/fesm2022/ktortu-aaa.mjs.map +1 -1
  22. package/forms/field/field.css +16 -0
  23. package/forms/styles/field-box.css +11 -5
  24. package/package.json +9 -1
  25. package/progress-bar/progress-bar.css +127 -0
  26. package/styles/disclosure.css +6 -0
  27. package/styles/progress-bar.css +5 -0
  28. package/styles/styles.css +2 -0
  29. package/themes/theme-cyberpunk.css +11 -0
  30. package/tooltip/tooltip.css +1 -1
  31. package/types/ktortu-aaa-button.d.ts +2 -0
  32. package/types/ktortu-aaa-card.d.ts +69 -65
  33. package/types/ktortu-aaa-cdk.d.ts +27 -1
  34. package/types/ktortu-aaa-dialog.d.ts +134 -15
  35. package/types/ktortu-aaa-disclosure.d.ts +121 -0
  36. package/types/ktortu-aaa-forms.d.ts +69 -16
  37. package/types/ktortu-aaa-progress-bar.d.ts +27 -0
  38. package/types/ktortu-aaa-snackbar.d.ts +11 -68
  39. package/types/ktortu-aaa-tooltip.d.ts +0 -1
  40. package/types/ktortu-aaa.d.ts +1 -0
@@ -0,0 +1,121 @@
1
+ import * as i0 from '@angular/core';
2
+ import { AfterViewInit, AfterContentInit, InjectionToken } from '@angular/core';
3
+ import * as _ktortu_aaa_disclosure from '@ktortu/aaa/disclosure';
4
+
5
+ /**
6
+ * Déclencheur d'un [ktDisclosure] : posé sur un **vrai `<button>`** (clavier Entrée/Espace
7
+ * gratuit). Câble `(click)` → `toggle()` et reflète l'état via `aria-expanded` / `aria-controls`
8
+ * (cf. ADR-0004). `type="button"` est posé **s'il est absent** (ne pas soumettre un formulaire,
9
+ * sans écraser un `type` explicite du consommateur).
10
+ *
11
+ * Le contenu du bouton appartient au consommateur (texte, icône, libellé piloté par `expanded()`). Un
12
+ * **chevron** décoratif (qui pivote selon l'état) est affiché par défaut ; le désactiver avec
13
+ * `[chevron]="false"`. La directive applique elle-même la classe de style — rien à écrire.
14
+ *
15
+ * @example
16
+ * ```html
17
+ * <button ktDisclosureToggle>Détails</button> <!-- avec chevron -->
18
+ * <button ktDisclosureToggle [chevron]="false">Détails</button> <!-- sans chevron -->
19
+ * ```
20
+ */
21
+ declare class KtDisclosureToggle implements AfterViewInit {
22
+ readonly disclosure: _ktortu_aaa_disclosure.KtDisclosureInterface;
23
+ private readonly host;
24
+ private readonly auditEnabled;
25
+ /** Affiche le chevron décoratif (qui pivote selon l'état). @default true */
26
+ readonly chevron: i0.InputSignalWithTransform<boolean, unknown>;
27
+ constructor();
28
+ ngAfterViewInit(): void;
29
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtDisclosureToggle, never>;
30
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtDisclosureToggle, "button[ktDisclosureToggle]", never, { "chevron": { "alias": "chevron"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
31
+ }
32
+
33
+ /**
34
+ * Panneau repliable d'un [ktDisclosure]. **Composant** (et non directive) car l'animation grid
35
+ * `0fr ↔ 1fr` exige un **unique enfant `overflow:hidden`** autour du contenu projeté — ce wrapper
36
+ * (`.kt-disclosure-content__inner`) est fourni by le template, le consommateur reste libre d'y
37
+ * mettre autant de blocs qu'il veut.
38
+ *
39
+ * Porte l'`id` (cible de `aria-controls`) et passe **`inert`** quand c'est fermé : le contenu
40
+ * masqué sort de l'ordre de tabulation et de l'arbre d'accessibilité (jamais de focus dans
41
+ * l'invisible). Pas de `role=region` (anti-pollution du rotor de régions). Cf. ADR-0004.
42
+ *
43
+ * @example
44
+ * ```html
45
+ * <kt-disclosure-content>
46
+ * <p>Premier bloc</p>
47
+ * <p>Second bloc…</p>
48
+ * </kt-disclosure-content>
49
+ * ```
50
+ */
51
+ declare class KtDisclosureContent {
52
+ readonly disclosure: _ktortu_aaa_disclosure.KtDisclosureInterface;
53
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtDisclosureContent, never>;
54
+ static ɵcmp: i0.ɵɵComponentDeclaration<KtDisclosureContent, "kt-disclosure-content", never, {}, {}, never, ["*"], true, never>;
55
+ }
56
+
57
+ /**
58
+ * Disclosure : replie/déplie un **bloc d'interface** (volet d'options, module de dashboard,
59
+ * section d'une fiche produit). Directive HÔTE d'une famille à trois marqueurs — elle possède
60
+ * l'état, génère l'`id` du panneau et expose des méthodes impératives ; le câblage ARIA et
61
+ * l'animation vivent sur `[ktDisclosureToggle]` / `<kt-disclosure-content>`.
62
+ *
63
+ * Pour une **section de contenu** de page (façon Wikipédia / FAQ), préférer `<details>` natif
64
+ * (sémantique, find-in-page, SEO, zéro JS) — cf. ADR-0004.
65
+ *
66
+ * L'état est exposé via `exportAs: 'ktDisclosure'` : lisez `expanded()` pour piloter le template
67
+ * (ex. libellé « Voir plus / Voir moins ») sans input de libellé (i18n côté consommateur,
68
+ * cf. ADR-0003).
69
+ *
70
+ * Contrat : **un** `[ktDisclosureToggle]` et **un** `<kt-disclosure-content>` par hôte (id de
71
+ * panneau unique / `aria-controls` non ambigu) ; un avertissement dev le signale sinon.
72
+ *
73
+ * @example
74
+ * ```html
75
+ * <div ktDisclosure #d="ktDisclosure">
76
+ * <button ktDisclosureToggle>{{ d.expanded() ? 'Voir moins' : 'Voir plus' }}</button>
77
+ * <kt-disclosure-content><p>Mon contenu</p></kt-disclosure-content>
78
+ * </div>
79
+ * ```
80
+ */
81
+ declare class KtDisclosure implements AfterContentInit {
82
+ private readonly idGen;
83
+ private readonly host;
84
+ /** Identifiant stable du panneau contrôlé : cible de l'`aria-controls` du déclencheur. */
85
+ readonly contentId: string;
86
+ /**
87
+ * État ouvert/fermé. **Toujours utilisé en binding** (`[(expanded)]` / `[expanded]`), jamais en
88
+ * attribut nu : un `model()` n'accepte pas de `booleanAttribute`, donc `<div ktDisclosure expanded>`
89
+ * pousserait la chaîne `''` au lieu de `true`. En binding, la valeur est garantie booléenne.
90
+ * @default false
91
+ */
92
+ readonly expanded: i0.ModelSignal<boolean>;
93
+ private readonly auditEnabled;
94
+ readonly toggles: i0.Signal<readonly KtDisclosureToggle[]>;
95
+ readonly contents: i0.Signal<readonly KtDisclosureContent[]>;
96
+ ngAfterContentInit(): void;
97
+ /** Bascule l'état. */
98
+ toggle(): void;
99
+ /** Ouvre le panneau. */
100
+ expand(): void;
101
+ /** Ferme le panneau. */
102
+ collapse(): void;
103
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtDisclosure, never>;
104
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtDisclosure, "[ktDisclosure]", ["ktDisclosure"], { "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; }, ["toggles", "contents"], never, true, never>;
105
+ }
106
+
107
+ interface KtDisclosureInterface {
108
+ readonly contentId: string;
109
+ readonly expanded: () => boolean;
110
+ toggle(): void;
111
+ }
112
+ declare const KT_DISCLOSURE: InjectionToken<KtDisclosureInterface>;
113
+
114
+ /**
115
+ * Import ergonomique de toute la famille disclosure en une fois :
116
+ * `imports: [KtDisclosureImports]` au lieu d'énumérer chaque marqueur.
117
+ */
118
+ declare const KtDisclosureImports: readonly [typeof KtDisclosure, typeof KtDisclosureToggle, typeof KtDisclosureContent];
119
+
120
+ export { KT_DISCLOSURE, KtDisclosure, KtDisclosureContent, KtDisclosureImports, KtDisclosureToggle };
121
+ export type { KtDisclosureInterface };
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, Signal, Provider, TemplateRef, ModelSignal, ElementRef, PipeTransform } from '@angular/core';
2
+ import { InjectionToken, Signal, Provider, TemplateRef, ModelSignal, ElementRef, AfterViewInit, PipeTransform } from '@angular/core';
3
3
  import * as _angular_forms_signals from '@angular/forms/signals';
4
4
  import { ValidationError, WithOptionalFieldTree, FormValueControl } from '@angular/forms/signals';
5
5
  import * as _ktortu_aaa_forms from '@ktortu/aaa/forms';
@@ -164,22 +164,23 @@ declare class KtField implements KtFieldParent {
164
164
  /** Politique effective : input ?? KT_FIELD_CONFIG.floatLabel ?? 'auto'. */
165
165
  protected readonly resolvedFloatLabel: _angular_core.Signal<KtFloatLabel>;
166
166
  private readonly control;
167
- private readonly templateTooltip;
168
- private readonly projectedTooltip;
169
- private readonly activeTooltip;
170
167
  private readonly idGen;
171
168
  private readonly uid;
172
169
  readonly baseId: _angular_core.Signal<string>;
173
170
  protected readonly labelId: _angular_core.Signal<string>;
174
171
  protected readonly hintId: _angular_core.Signal<string>;
175
172
  protected readonly errorId: _angular_core.Signal<string>;
173
+ protected readonly helpId: _angular_core.Signal<string>;
174
+ protected readonly helpTemplate: _angular_core.Signal<TemplateRef<unknown> | null>;
175
+ protected readonly helpString: _angular_core.Signal<string | null>;
176
+ protected readonly hasHelp: _angular_core.Signal<boolean>;
176
177
  protected readonly hasError: _angular_core.Signal<boolean>;
177
178
  protected readonly showHint: _angular_core.Signal<boolean>;
178
179
  protected readonly displayedErrors: _angular_core.Signal<readonly KtFieldError[]>;
179
180
  readonly describedBy: _angular_core.Signal<string | null>;
180
181
  protected onHelpClick(event: MouseEvent): void;
181
182
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtField, never>;
182
- 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", "projectedTooltip"], ["[ktFieldHelp]", "*"], true, 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>;
183
184
  }
184
185
 
185
186
  /** Marque le contrôle (natif ou custom) d'un champ pour que `Field` y câble l'a11y
@@ -439,16 +440,11 @@ declare class KtTextArea extends KtBaseInputField<string> implements FormValueCo
439
440
  readonly minLength: _angular_core.InputSignal<number | undefined>;
440
441
  /** Plafond de caractères ; poussé par le form (validateur maxLength) ou par le consommateur. @default undefined */
441
442
  readonly maxLength: _angular_core.InputSignal<number | undefined>;
442
- /** Motifs de validation (contrat Signal Forms). L'attribut natif `pattern` ne prend qu'une regex →
443
- seule la première est posée. @default [] */
444
- readonly pattern: _angular_core.InputSignal<readonly RegExp[]>;
445
- /** Source de la première regex pour l'attribut `pattern` natif (`null` si aucune). */
446
- protected readonly patternAttr: _angular_core.Signal<string>;
447
443
  protected parse(raw: string): string;
448
444
  protected emptyValue(): string;
449
445
  protected isEmpty(value: string): boolean;
450
446
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtTextArea, never>;
451
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtTextArea, "kt-text-area", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
447
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtTextArea, "kt-text-area", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
452
448
  }
453
449
 
454
450
  /** Types texte dont la valeur reste une string (number/date = composants séparés). */
@@ -492,6 +488,48 @@ declare class KtTextField extends KtBaseInputField<string> implements FormValueC
492
488
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtTextField, "kt-text-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; "suggestions": { "alias": "suggestions"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
493
489
  }
494
490
 
491
+ type KtPasswordAutocomplete = 'current-password' | 'new-password' | 'off';
492
+ /**
493
+ * Champ mot de passe (valeur `string`) intégré aux Signal Forms via `FormValueControl`.
494
+ * Inclut un bouton pour masquer/afficher la saisie en clair de manière accessible.
495
+ *
496
+ * @example
497
+ * ```html
498
+ * <kt-password-field label="Mot de passe" [(value)]="password" required />
499
+ * ```
500
+ */
501
+ declare class KtPasswordField extends KtBaseInputField<string> implements FormValueControl<string> {
502
+ /** Valeur saisie (two-way). @default '' */
503
+ readonly value: _angular_core.ModelSignal<string>;
504
+ /** Plancher de caractères (attribut `minlength` natif ; poussé par le validateur minLength). @default undefined */
505
+ readonly minLength: _angular_core.InputSignal<number | undefined>;
506
+ /** Plafond de caractères (attribut `maxlength` natif ; poussé par le validateur maxLength). @default undefined */
507
+ readonly maxLength: _angular_core.InputSignal<number | undefined>;
508
+ /** Motifs de validation. @default [] */
509
+ readonly pattern: _angular_core.InputSignal<readonly RegExp[]>;
510
+ /** Source de la première regex pour l'attribut `pattern` natif (`null` si aucune). */
511
+ protected readonly patternAttr: _angular_core.Signal<string>;
512
+ /** Indice d'autoremplissage effectif (par défaut 'current-password'). */
513
+ protected readonly resolvedAutocomplete: _angular_core.Signal<AutoFill>;
514
+ /** État de visibilité du mot de passe en clair. @default false */
515
+ protected readonly isPasswordVisible: _angular_core.WritableSignal<boolean>;
516
+ /** Type natif de l'input selon l'état de visibilité. */
517
+ protected readonly inputType: _angular_core.Signal<"text" | "password">;
518
+ private readonly idGen;
519
+ private readonly uid;
520
+ protected readonly inputId: _angular_core.Signal<string>;
521
+ protected parse(raw: string): string;
522
+ protected emptyValue(): string;
523
+ protected isEmpty(value: string): boolean;
524
+ /**
525
+ * Bascule l'état de visibilité du mot de passe.
526
+ * Utilise preventDefault() pour empêcher l'input de perdre le focus.
527
+ */
528
+ protected toggleVisibility(event: MouseEvent): void;
529
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtPasswordField, never>;
530
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtPasswordField, "kt-password-field", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "pattern": { "alias": "pattern"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["[ktFieldHelp]"], true, never>;
531
+ }
532
+
495
533
  /**
496
534
  * Bouton bascule (Switch / Slide-Toggle) accessible conforme aux normes WAI-ARIA.
497
535
  * Permet d'activer ou désactiver une option avec effet immédiat.
@@ -665,7 +703,7 @@ declare class KtCheckboxGroup<V> implements FormValueControl<V[]> {
665
703
  * </kt-checkbox-group>
666
704
  * ```
667
705
  */
668
- declare class KtCheckbox<V = unknown> implements FormValueControl<boolean> {
706
+ declare class KtCheckbox<V = unknown> implements FormValueControl<boolean>, AfterViewInit {
669
707
  private readonly config;
670
708
  /** Groupe parent optionnel : présent ⇒ la case appartient à un `kt-checkbox-group`. */
671
709
  protected readonly group: KtCheckboxGroup<V> | null;
@@ -708,6 +746,8 @@ declare class KtCheckbox<V = unknown> implements FormValueControl<boolean> {
708
746
  private readonly inputEl;
709
747
  private readonly el;
710
748
  private readonly errorResolver;
749
+ private readonly auditEnabled;
750
+ private isDestroyed;
711
751
  private readonly idGen;
712
752
  private readonly uid;
713
753
  protected readonly baseId: _angular_core.Signal<string>;
@@ -726,6 +766,7 @@ declare class KtCheckbox<V = unknown> implements FormValueControl<boolean> {
726
766
  protected readonly resolvedAriaLabel: _angular_core.Signal<string | null>;
727
767
  protected readonly describedBy: _angular_core.Signal<string | null>;
728
768
  constructor();
769
+ ngAfterViewInit(): void;
729
770
  /** Focus la case native (utilisé par Signal Forms `focusBoundControl`). */
730
771
  focus(options?: FocusOptions): void;
731
772
  protected onChange(event: Event): void;
@@ -878,11 +919,15 @@ declare abstract class KtBaseSelect<T, V = T> {
878
919
  private readonly errorResolver;
879
920
  protected readonly config: Partial<_ktortu_aaa_forms.KtSelectConfigOptions> | null;
880
921
  protected readonly host: ElementRef<HTMLElement>;
881
- private readonly ngZone;
882
922
  protected readonly doc: Document;
883
923
  private readonly platformId;
884
924
  private readonly destroyRef;
925
+ private readonly bodyScrollLock;
885
926
  private wasExpanded;
927
+ private scrollLocked;
928
+ /** Pose/relâche le verrou de scroll du fond de façon idempotente (n'agit qu'à la transition),
929
+ via le compteur partagé `KtBodyScrollLock` — deux sheets ouvertes ne se désynchronisent pas. */
930
+ private setBodyScrollLock;
886
931
  /** Liste des options affichées (source de vérité du contrôle). */
887
932
  readonly options: _angular_core.InputSignal<readonly T[]>;
888
933
  /** Libellé affiché d'une option : clé OU fonction. Défaut : `label`/`name`, sinon `String(option)`. */
@@ -1489,7 +1534,6 @@ declare class KtChipList<T> implements ChipTransitionScope {
1489
1534
  private readonly doc;
1490
1535
  private readonly platformId;
1491
1536
  private readonly cdr;
1492
- private readonly ngZone;
1493
1537
  /** Vrai pendant la View Transition de CETTE liste : les chips (standards via Chip,
1494
1538
  custom via tokens.css) ne portent leur `view-transition-name` que dans cette fenêtre. */
1495
1539
  readonly transitioning: _angular_core.WritableSignal<boolean>;
@@ -1529,6 +1573,13 @@ declare class KtChipList<T> implements ChipTransitionScope {
1529
1573
  }>;
1530
1574
  protected readonly itemDef: _angular_core.Signal<KtChipItemDef<any> | undefined>;
1531
1575
  private readonly chips;
1576
+ private static readonly CHIP_FOCUSABLES;
1577
+ private static readonly ROVING_FOCUSABLES;
1578
+ private query;
1579
+ /** Index de l'unique focusable portant `tabindex="0"` : point d'entrée clavier UNIQUE dans la
1580
+ liste (pattern composite WAI-ARIA). Les flèches/Home/End le déplacent ; un focus direct
1581
+ (souris) le resynchronise via `onFocusin`. */
1582
+ protected readonly activeIndex: _angular_core.WritableSignal<number>;
1532
1583
  protected readonly resolvedListLabel: _angular_core.Signal<string>;
1533
1584
  private readonly resolvedRemoveItemLabel;
1534
1585
  private readonly resolvedItemRemovedText;
@@ -1569,6 +1620,8 @@ declare class KtChipList<T> implements ChipTransitionScope {
1569
1620
  /** Déplie/replie ; au dépliage, focus sur le premier chip nouvellement révélé. */
1570
1621
  protected toggleExpanded(): void;
1571
1622
  protected onKeydown(event: KeyboardEvent): void;
1623
+ /** Resynchronise le point de tabulation unique sur l'élément réellement focusé (souris/voix). */
1624
+ protected onFocusin(event: FocusEvent): void;
1572
1625
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtChipList<any>, never>;
1573
1626
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtChipList<any>, "kt-chip-list", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "itemLabel": { "alias": "itemLabel"; "required": false; "isSignal": true; }; "itemKey": { "alias": "itemKey"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "maxVisible": { "alias": "maxVisible"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "removeItemLabel": { "alias": "removeItemLabel"; "required": false; "isSignal": true; }; "itemRemovedText": { "alias": "itemRemovedText"; "required": false; "isSignal": true; }; "moreLabel": { "alias": "moreLabel"; "required": false; "isSignal": true; }; "lessLabel": { "alias": "lessLabel"; "required": false; "isSignal": true; }; "chipTemplate": { "alias": "chipTemplate"; "required": false; "isSignal": true; }; "emptyFocusTarget": { "alias": "emptyFocusTarget"; "required": false; "isSignal": true; }; }, { "removed": "removed"; }, ["itemDef"], never, true, never>;
1574
1627
  }
@@ -1913,5 +1966,5 @@ declare class KtFixedClock extends KtClock {
1913
1966
  today(): Temporal$1.PlainDate;
1914
1967
  }
1915
1968
 
1916
- 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, KtRadio, KtRadioGroup, KtSelect, KtSelectConfig, KtSelectOptionDef, KtSelectTriggerDef, KtSwitch, KtTemporalDatePipe, KtTextArea, KtTextField, KtTimeField, KtYearMonthField, Temporal, defaultKtFieldErrorMatcher, ktErrorParam, normalizeKtSuggestions, provideKtField };
1917
- export type { CalendarDate, KtChipItemContext, KtChipsConfig, KtDatalistOption, KtErrorMessageFactory, KtFieldAppearance, KtFieldConfig, KtFieldError, KtFieldErrorMatcher, KtFieldErrorMessages, KtFieldErrorState, KtFieldParent, KtFloatLabel, KtKeyish, KtMultiSelectChipContext, KtMultiSelectOptionContext, KtMultiSelectSelectionChange, KtMultiSelectTriggerContext, KtResolvableError, KtSelectConfigOptions, KtSelectOptionContext, KtSelectSelectionChange, KtSelectTriggerContext, KtSuggestion, KtTextFieldType, KtTimePrecision, LocalDateTime, Timestamp, WallTime, ZonedTimestamp };
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 };
1970
+ 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,27 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { AfterViewInit } from '@angular/core';
3
+
4
+ declare class KtProgressBar implements AfterViewInit {
5
+ private readonly idGen;
6
+ private readonly elementRef;
7
+ protected readonly labelId: string;
8
+ private readonly hasProjectedContent;
9
+ /** Mode de fonctionnement de la barre de progression. @default 'indeterminate' */
10
+ readonly mode: _angular_core.InputSignal<"determinate" | "indeterminate">;
11
+ /** Valeur de la progression (entre 0 et 100). Ignorée en mode 'indeterminate'. @default 0 */
12
+ readonly value: _angular_core.InputSignalWithTransform<number, unknown>;
13
+ /** Label textuel optionnel passé par attribut. */
14
+ readonly label: _angular_core.InputSignal<string | undefined>;
15
+ /** Détermine si le label textuel doit être visible à l'écran. @default true */
16
+ readonly labelVisible: _angular_core.InputSignalWithTransform<boolean, unknown>;
17
+ /** Permet de figer l'animation indéterminée (utile pour les tests). @default false */
18
+ readonly reducedMotion: _angular_core.InputSignalWithTransform<boolean, unknown>;
19
+ /** Indique si le composant dispose d'un label défini (soit via input, soit par projection). */
20
+ protected readonly hasLabel: _angular_core.Signal<boolean>;
21
+ protected readonly transformStyle: _angular_core.Signal<string | null>;
22
+ ngAfterViewInit(): void;
23
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtProgressBar, never>;
24
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KtProgressBar, "kt-progress-bar", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "labelVisible": { "alias": "labelVisible"; "required": false; "isSignal": true; }; "reducedMotion": { "alias": "reducedMotion"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
25
+ }
26
+
27
+ export { KtProgressBar };
@@ -151,7 +151,12 @@ declare class KtSnackbarRef {
151
151
  * - **Échap** ferme la snackbar affichée (la plus récente).
152
152
  *
153
153
  * Requiert côté hôte les styles `@angular/cdk/overlay-prebuilt.css` **et**
154
- * `@angular/cdk/a11y-prebuilt.css` (ce dernier masque l'élément du LiveAnnouncer).
154
+ * `@angular/cdk/a11y-prebuilt.css` (ce dernier masque l'élément du LiveAnnouncer), en plus de
155
+ * `@ktortu/aaa/snackbar.css`.
156
+ *
157
+ * > [!IMPORTANT]
158
+ * > **Prérequis d'intégration obligatoire :**
159
+ * > Ce service ne fonctionnera pas correctement sans l'importation de ces deux fichiers CSS de l'overlay CDK et d'accessibilité dans votre feuille de styles globale ou votre build.
155
160
  *
156
161
  * @example
157
162
  * ```ts
@@ -180,6 +185,9 @@ declare class KtSnackbar implements OnDestroy {
180
185
  * Un `message` identique à une snackbar déjà affichée ou en attente est **fusionné** : on renvoie
181
186
  * alors la référence existante sans rien ré-empiler.
182
187
  *
188
+ * > [!IMPORTANT]
189
+ * > Assurez-vous d'avoir importé `@angular/cdk/overlay-prebuilt.css` et `@angular/cdk/a11y-prebuilt.css` dans votre application hôte.
190
+ *
183
191
  * @param message Texte affiché et annoncé au lecteur d'écran.
184
192
  * @param options Surcharges ponctuelles (durée, régime, position, politesse, variante, fermeture).
185
193
  * @returns La référence de la snackbar (existante en cas de fusion).
@@ -206,70 +214,5 @@ declare class KtSnackbar implements OnDestroy {
206
214
  static ɵprov: i0.ɵɵInjectableDeclaration<KtSnackbar>;
207
215
  }
208
216
 
209
- /**
210
- * Données résolues passées au conteneur visuel à l'ouverture (injectées via {@link KT_SNACKBAR_CONTEXT}).
211
- * Produites par `KtSnackbar` après résolution `option ?? config ?? défaut`.
212
- */
213
- interface KtSnackbarContext {
214
- /** Message affiché et annoncé. */
215
- readonly message: string;
216
- /** Variante sémantique (apparence : accent + icône). */
217
- readonly variant: KtSnackbarVariant;
218
- /** Affiche le bouton de fermeture. */
219
- readonly closable: boolean;
220
- /** Nom accessible du bouton de fermeture. */
221
- readonly closeLabel: string;
222
- /** Régime temporel (la minuterie n'existe qu'en `'auto'`). */
223
- readonly timing: KtSnackbarTiming;
224
- /** Durée (ms) avant disparition automatique en régime `'auto'`. */
225
- readonly duration: number;
226
- }
227
- declare const KT_SNACKBAR_CONTEXT: InjectionToken<KtSnackbarContext>;
228
- /**
229
- * Conteneur visuel d'une snackbar. **Volontairement pas une live region** (aucun `role`/`aria-live`
230
- * sur l'hôte) : l'annonce passe par un canal UNIQUE, le `LiveAnnouncer` du service. On évite ainsi
231
- * la double-annonce et l'écrasement de politesse observés sur d'autres libs.
232
- *
233
- * En régime `'auto'`, la minuterie de disparition se met **en pause au survol et au focus** clavier
234
- * (WCAG 1.4.13 / 2.2.1) et reprend quand ni le pointeur ni le focus ne sont sur la snackbar.
235
- * L'icône de variante est **décorative** (`aria-hidden`) : la forme distincte sert d'indice non
236
- * coloré (WCAG 1.4.1), le sens reste porté par le texte.
237
- *
238
- * @internal Monté par `KtSnackbar` via un `ComponentPortal`.
239
- */
240
- declare class KtSnackbarContainer {
241
- protected readonly context: KtSnackbarContext;
242
- private readonly ref;
243
- private readonly platformId;
244
- private readonly host;
245
- /** Vrai pendant l'animation de sortie (déclenche la classe `kt-snackbar--leaving`). */
246
- protected readonly leaving: i0.WritableSignal<boolean>;
247
- private timer;
248
- private remaining;
249
- private deadline;
250
- private hovered;
251
- private focused;
252
- constructor();
253
- protected close(): void;
254
- /**
255
- * Joue l'animation de sortie puis invoque `done` (démontage de l'overlay côté service). Appelé par
256
- * le service à la fermeture. Sans animation (durée nulle, `prefers-reduced-motion`, ou SSR), `done`
257
- * est invoqué immédiatement. Filet de sécurité par `setTimeout` si `transitionend` ne se déclenche pas.
258
- */
259
- playExit(done: () => void): void;
260
- protected onPointerEnter(): void;
261
- protected onPointerLeave(): void;
262
- protected onFocusEnter(): void;
263
- protected onFocusLeave(): void;
264
- private maybeResume;
265
- private startTimer;
266
- private pauseTimer;
267
- private clearTimer;
268
- /** Durée (ms) de la transition de sortie, lue sur l'hôte (0 si aucune — ex. reduced-motion). */
269
- private exitDurationMs;
270
- static ɵfac: i0.ɵɵFactoryDeclaration<KtSnackbarContainer, never>;
271
- static ɵcmp: i0.ɵɵComponentDeclaration<KtSnackbarContainer, "kt-snackbar-container", never, {}, {}, never, never, true, never>;
272
- }
273
-
274
- export { KT_SNACKBAR_CONFIG, KT_SNACKBAR_CONTEXT, KT_SNACKBAR_DEFAULTS, KtSnackbar, KtSnackbarContainer, KtSnackbarRef, provideKtSnackbar };
275
- export type { KtSnackbarConfig, KtSnackbarContext, KtSnackbarDismissReason, KtSnackbarOptions, KtSnackbarPoliteness, KtSnackbarPosition, KtSnackbarTiming, KtSnackbarVariant };
217
+ export { KT_SNACKBAR_CONFIG, KT_SNACKBAR_DEFAULTS, KtSnackbar, KtSnackbarRef, provideKtSnackbar };
218
+ export type { KtSnackbarConfig, KtSnackbarDismissReason, KtSnackbarOptions, KtSnackbarPoliteness, KtSnackbarPosition, KtSnackbarTiming, KtSnackbarVariant };
@@ -39,7 +39,6 @@ declare class KtTooltip implements OnDestroy {
39
39
  private readonly host;
40
40
  private readonly renderer;
41
41
  private readonly vcr;
42
- private readonly ngZone;
43
42
  private readonly platformId;
44
43
  /** Contenu de l'infobulle : texte simple (injecté en `textContent`) ou `TemplateRef` non interactif. */
45
44
  readonly ktTooltip: _angular_core.InputSignal<string | TemplateRef<unknown>>;
@@ -8,3 +8,4 @@ export * from '@ktortu/aaa/menu';
8
8
  export * from '@ktortu/aaa/snackbar';
9
9
  export * from '@ktortu/aaa/tabs';
10
10
  export * from '@ktortu/aaa/tooltip';
11
+ export * from '@ktortu/aaa/progress-bar';