@ktortu/aaa 0.9.1 → 0.9.2

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/fesm2022/ktortu-aaa-button.mjs +10 -2
  2. package/fesm2022/ktortu-aaa-button.mjs.map +1 -1
  3. package/fesm2022/ktortu-aaa-card.mjs +14 -5
  4. package/fesm2022/ktortu-aaa-card.mjs.map +1 -1
  5. package/fesm2022/ktortu-aaa-cdk.mjs +49 -2
  6. package/fesm2022/ktortu-aaa-cdk.mjs.map +1 -1
  7. package/fesm2022/ktortu-aaa-dialog.mjs +19 -31
  8. package/fesm2022/ktortu-aaa-dialog.mjs.map +1 -1
  9. package/fesm2022/ktortu-aaa-disclosure.mjs +201 -0
  10. package/fesm2022/ktortu-aaa-disclosure.mjs.map +1 -0
  11. package/fesm2022/ktortu-aaa-forms.mjs +210 -93
  12. package/fesm2022/ktortu-aaa-forms.mjs.map +1 -1
  13. package/fesm2022/ktortu-aaa-progress-bar.mjs +91 -0
  14. package/fesm2022/ktortu-aaa-progress-bar.mjs.map +1 -0
  15. package/fesm2022/ktortu-aaa-snackbar.mjs +16 -3
  16. package/fesm2022/ktortu-aaa-snackbar.mjs.map +1 -1
  17. package/fesm2022/ktortu-aaa-tooltip.mjs +20 -30
  18. package/fesm2022/ktortu-aaa-tooltip.mjs.map +1 -1
  19. package/fesm2022/ktortu-aaa.mjs +1 -0
  20. package/fesm2022/ktortu-aaa.mjs.map +1 -1
  21. package/forms/field/field.css +16 -0
  22. package/forms/styles/field-box.css +11 -5
  23. package/package.json +9 -1
  24. package/progress-bar/progress-bar.css +127 -0
  25. package/styles/disclosure.css +6 -0
  26. package/styles/progress-bar.css +5 -0
  27. package/styles/styles.css +2 -0
  28. package/themes/theme-cyberpunk.css +11 -0
  29. package/tooltip/tooltip.css +1 -1
  30. package/types/ktortu-aaa-button.d.ts +2 -0
  31. package/types/ktortu-aaa-card.d.ts +3 -0
  32. package/types/ktortu-aaa-cdk.d.ts +27 -1
  33. package/types/ktortu-aaa-dialog.d.ts +7 -14
  34. package/types/ktortu-aaa-disclosure.d.ts +112 -0
  35. package/types/ktortu-aaa-forms.d.ts +66 -14
  36. package/types/ktortu-aaa-progress-bar.d.ts +27 -0
  37. package/types/ktortu-aaa-snackbar.d.ts +11 -68
  38. package/types/ktortu-aaa-tooltip.d.ts +0 -1
  39. package/types/ktortu-aaa.d.ts +1 -0
@@ -3,6 +3,7 @@
3
3
  Temporal (Date/Time/DateTime/YearMonth/Instant), qui réutilise la même `.kt-field-box`.
4
4
  Globale + classes namespacées : partagée entre plusieurs composants, donc non scopable. */
5
5
  kt-text-field,
6
+ kt-password-field,
6
7
  kt-text-area,
7
8
  kt-number-field,
8
9
  kt-date-field,
@@ -131,12 +132,14 @@
131
132
 
132
133
  /* Le bouton « effacer » est une icône INTERNE de la lib : toujours Material Symbols,
133
134
  indépendante de --kt-icon-font (sinon un override consommateur casserait la croix). */
134
- .kt-field-box__clear .kt-field-box__icon {
135
+ .kt-field-box__clear .kt-field-box__icon,
136
+ .kt-field-box__toggle .kt-field-box__icon {
135
137
  font-family: 'Material Symbols Outlined';
136
138
  font-weight: normal;
137
139
  }
138
140
 
139
- .kt-field-box__clear {
141
+ .kt-field-box__clear,
142
+ .kt-field-box__toggle {
140
143
  display: inline-flex;
141
144
  align-items: center;
142
145
  justify-content: center;
@@ -151,7 +154,8 @@
151
154
  }
152
155
 
153
156
  /* Cible tactile AAA 44x44px étendue via un pseudo-élément transparent */
154
- .kt-field-box__clear::after {
157
+ .kt-field-box__clear::after,
158
+ .kt-field-box__toggle::after {
155
159
  content: '';
156
160
  position: absolute;
157
161
  top: 50%;
@@ -161,11 +165,13 @@
161
165
  height: 44px;
162
166
  }
163
167
 
164
- .kt-field-box__clear:hover {
168
+ .kt-field-box__clear:hover,
169
+ .kt-field-box__toggle:hover {
165
170
  color: var(--field-color, inherit);
166
171
  }
167
172
 
168
- .kt-field-box__clear:focus-visible {
173
+ .kt-field-box__clear:focus-visible,
174
+ .kt-field-box__toggle:focus-visible {
169
175
  outline: 2px solid var(--field-border-color-focus, #0b57d0);
170
176
  outline-offset: 1px;
171
177
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ktortu/aaa",
3
- "version": "0.9.1",
3
+ "version": "0.9.2",
4
4
  "description": "Bibliothèque de composants Angular headless + thémés par tokens CSS.",
5
5
  "keywords": [
6
6
  "angular",
@@ -73,6 +73,10 @@
73
73
  "types": "./types/ktortu-aaa-dialog.d.ts",
74
74
  "default": "./fesm2022/ktortu-aaa-dialog.mjs"
75
75
  },
76
+ "./disclosure": {
77
+ "types": "./types/ktortu-aaa-disclosure.d.ts",
78
+ "default": "./fesm2022/ktortu-aaa-disclosure.mjs"
79
+ },
76
80
  "./forms": {
77
81
  "types": "./types/ktortu-aaa-forms.d.ts",
78
82
  "default": "./fesm2022/ktortu-aaa-forms.mjs"
@@ -85,6 +89,10 @@
85
89
  "types": "./types/ktortu-aaa-menu.d.ts",
86
90
  "default": "./fesm2022/ktortu-aaa-menu.mjs"
87
91
  },
92
+ "./progress-bar": {
93
+ "types": "./types/ktortu-aaa-progress-bar.d.ts",
94
+ "default": "./fesm2022/ktortu-aaa-progress-bar.mjs"
95
+ },
88
96
  "./snackbar": {
89
97
  "types": "./types/ktortu-aaa-snackbar.d.ts",
90
98
  "default": "./fesm2022/ktortu-aaa-snackbar.mjs"
@@ -0,0 +1,127 @@
1
+ :host {
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 100%;
5
+ gap: var(--kt-progress-bar-gap, 8px);
6
+ }
7
+
8
+ .kt-progress-bar-label {
9
+ font-family: var(--kt-font-family, sans-serif);
10
+ font-size: var(--kt-font-size-sm, 0.875rem);
11
+ color: var(--kt-text-color-secondary, var(--kt-neutral-dark, #555));
12
+ text-align: var(--kt-progress-bar-label-align, start);
13
+ }
14
+
15
+ /* Si le label est vide (pas d'input et ng-content vide), on le masque pour éviter le gap */
16
+ .kt-progress-bar-label:empty {
17
+ display: none;
18
+ }
19
+
20
+ .kt-progress-bar-track {
21
+ width: 100%;
22
+ height: var(--kt-progress-bar-height, 4px);
23
+ overflow: hidden;
24
+ background-color: var(--kt-progress-bar-track-color, var(--kt-neutral-light, #e0e0e0));
25
+ border-radius: var(--kt-progress-bar-border-radius, 2px);
26
+ position: relative;
27
+ }
28
+
29
+ .kt-progress-bar-indicator {
30
+ position: absolute;
31
+ top: 0;
32
+ bottom: 0;
33
+ left: 0;
34
+ right: 0;
35
+ background-color: var(--kt-progress-bar-indicator-color, var(--kt-primary, #0056b3));
36
+ transform-origin: top left;
37
+ transition: transform 250ms ease;
38
+ will-change: transform;
39
+ }
40
+
41
+ /* Mode indéterminé : triple animation parallèle dissociée */
42
+ :host([data-mode='indeterminate']) .kt-progress-bar-indicator {
43
+ animation:
44
+ kt-progress-bar-indeterminate-translate 2.2s infinite cubic-bezier(0.4, 0, 0.2, 1),
45
+ kt-progress-bar-indeterminate-scale 2.2s infinite ease-in-out,
46
+ kt-progress-bar-indeterminate-fade 2.2s infinite linear;
47
+ transform-origin: left;
48
+ }
49
+
50
+ /* Masquage visuel accessible (sr-only) */
51
+ .kt-sr-only {
52
+ position: absolute;
53
+ width: 1px;
54
+ height: 1px;
55
+ padding: 0;
56
+ margin: -1px;
57
+ overflow: hidden;
58
+ clip: rect(0, 0, 0, 0);
59
+ white-space: nowrap;
60
+ border: 0;
61
+ }
62
+
63
+ @keyframes kt-progress-bar-indeterminate-translate {
64
+ 0% {
65
+ translate: -100% 0;
66
+ }
67
+ 100% {
68
+ translate: 100% 0;
69
+ }
70
+ }
71
+
72
+ @keyframes kt-progress-bar-indeterminate-scale {
73
+ 0% {
74
+ scale: 0.15 1;
75
+ }
76
+ 35% {
77
+ scale: 0.7 1;
78
+ }
79
+ 70% {
80
+ scale: 0.4 1;
81
+ }
82
+ 100% {
83
+ scale: 0.15 1;
84
+ }
85
+ }
86
+
87
+ @keyframes kt-progress-bar-indeterminate-fade {
88
+ 0% {
89
+ opacity: 0;
90
+ }
91
+ 15% {
92
+ opacity: 1;
93
+ }
94
+ 85% {
95
+ opacity: 1;
96
+ }
97
+ 100% {
98
+ opacity: 0;
99
+ }
100
+ }
101
+
102
+ /* Support pour prefers-reduced-motion ou bypass réduit manuel */
103
+ @media (prefers-reduced-motion: reduce) {
104
+ :host([data-mode='indeterminate']) .kt-progress-bar-indicator {
105
+ animation: kt-progress-bar-pulsate 2s infinite ease-in-out;
106
+ transform: none;
107
+ transform-origin: center;
108
+ }
109
+ }
110
+
111
+ .kt-progress-bar-indicator.kt-reduced-motion {
112
+ animation: kt-progress-bar-pulsate 2s infinite ease-in-out !important;
113
+ transform: none !important;
114
+ transform-origin: center !important;
115
+ }
116
+
117
+ @keyframes kt-progress-bar-pulsate {
118
+ 0% {
119
+ opacity: 0.3;
120
+ }
121
+ 50% {
122
+ opacity: 0.8;
123
+ }
124
+ 100% {
125
+ opacity: 0.3;
126
+ }
127
+ }
@@ -0,0 +1,6 @@
1
+ @layer kt-aaa.tokens, kt-aaa.base, kt-aaa.components;
2
+
3
+ /* Disclosure (ktDisclosure + déclencheur + panneau) : tokens + apparence. Nécessite le socle.
4
+ @import '@ktortu/aaa/disclosure.css'; */
5
+ @import '../disclosure/disclosure-tokens.css';
6
+ @import '../disclosure/disclosure.css';
@@ -0,0 +1,5 @@
1
+ @layer kt-aaa.tokens, kt-aaa.base, kt-aaa.components;
2
+
3
+ /* Barre de progression (kt-progress-bar) : apparence. Nécessite le socle (@ktortu/aaa/foundation.css).
4
+ @import '@ktortu/aaa/progress-bar.css'; */
5
+ @import '../progress-bar/progress-bar.css';
package/styles/styles.css CHANGED
@@ -23,3 +23,5 @@
23
23
  @import './dialog.css';
24
24
  @import './menu.css';
25
25
  @import './snackbar.css';
26
+ @import './disclosure.css';
27
+ @import './progress-bar.css';
@@ -138,6 +138,10 @@
138
138
  --tab-radius: 6px 6px 0 0;
139
139
  --tab-border: none;
140
140
  --tab-margin: 0 4px 0 0;
141
+
142
+ /* ============ Progress Bar ============ */
143
+ --kt-progress-bar-track-color: #10182a;
144
+ --kt-progress-bar-indicator-color: transparent;
141
145
  }
142
146
 
143
147
  /* Fills DUOTONE cyan→magenta (ex-Synthwave) : niveau élément pour substituer var(--btn-fill) ;
@@ -158,6 +162,13 @@
158
162
  --btn-shadow-focus: 0 0 16px color-mix(in srgb, var(--btn-fg) 75%, transparent);
159
163
  }
160
164
 
165
+ [data-theme='cyberpunk'] .kt-progress-bar-indicator {
166
+ background-image: linear-gradient(90deg, #28d6ef, #ff3d8b);
167
+ box-shadow:
168
+ 0 0 8px rgb(40 214 239 / 60%),
169
+ 0 0 12px rgb(255 61 139 / 40%);
170
+ }
171
+
161
172
  /* LASER en bord HAUT des cartes : ligne néon qui balaie (signature « partout »). Le pseudo
162
173
  est libre (le lien étiré utilise ::after du lien, pas de la carte). z-index au-dessus du média. */
163
174
  [data-theme='cyberpunk'] [ktCard] {
@@ -28,7 +28,7 @@
28
28
  white-space: pre-line; /* Interprète les \n et les sauts de ligne dans les chaînes de texte */
29
29
  box-shadow: 0 4px 12px color-mix(in srgb, #000 25%, transparent);
30
30
  pointer-events: auto; /* requis pour le « hoverable » (WCAG 1.4.13) */
31
- user-select: text; /* Corrigé : Permet la sélection et traduction du texte */
31
+ user-select: text; /* Autorise la sélection et la traduction du texte du tooltip. */
32
32
  cursor: default;
33
33
  }
34
34
 
@@ -44,7 +44,9 @@ declare class KtButton implements AfterViewInit {
44
44
  private readonly config;
45
45
  private readonly host;
46
46
  private readonly platformId;
47
+ private isDestroyed;
47
48
  private readonly viewInitialized;
49
+ private readonly auditEnabled;
48
50
  protected readonly isLink: boolean;
49
51
  private readonly nativeAriaLabel;
50
52
  /** Emphase visuelle du bouton (apparence, ≠ `type`). @default 'filled' (ou KT_BUTTON_CONFIG.mode) */
@@ -80,6 +80,7 @@ declare class KtCardActions {
80
80
  */
81
81
  declare class KtCardLink {
82
82
  private readonly host;
83
+ private readonly auditEnabled;
83
84
  /**
84
85
  * Carte ancêtre, injectée optionnellement via `inject(Card, { optional: true })` (DI par
85
86
  * hiérarchie d'éléments) : `null` si [ktCardLink] est utilisé hors d'une [ktCard]. Sert à relayer
@@ -137,6 +138,7 @@ declare class KtCard {
137
138
  private readonly config;
138
139
  private readonly host;
139
140
  private readonly platformId;
141
+ private readonly auditEnabled;
140
142
  /** Référence réactive sur le lien primaire de la carte */
141
143
  readonly cardLink: i0.Signal<KtCardLink | undefined>;
142
144
  /** Apparence de la surface : `elevated` | `outlined` | `filled`. @default 'elevated' (ou `KT_CARD_CONFIG.variant`) */
@@ -148,6 +150,7 @@ declare class KtCard {
148
150
  readonly interactive: i0.InputSignalWithTransform<boolean, unknown>;
149
151
  /** Rend la surface inerte (état `data-disabled`). @default false */
150
152
  readonly disabled: i0.InputSignalWithTransform<boolean, unknown>;
153
+ private isDestroyed;
151
154
  constructor();
152
155
  static ɵfac: i0.ɵɵFactoryDeclaration<KtCard, never>;
153
156
  static ɵdir: i0.ɵɵDirectiveDeclaration<KtCard, "[ktCard]", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, ["cardLink"], never, true, never>;
@@ -42,6 +42,26 @@ interface KtSheetDragOptions {
42
42
  */
43
43
  declare function createKtSheetDrag(opts: KtSheetDragOptions): KtSheetDrag;
44
44
 
45
+ /**
46
+ * Verrou de défilement du `<body>` à COMPTEUR DE RÉFÉRENCES, partagé (`providedIn: 'root'`).
47
+ *
48
+ * Plusieurs surfaces modales simultanées (sheets, popups) peuvent verrouiller le scroll du fond :
49
+ * `overflow: hidden` n'est posé qu'au premier `lock()` et restauré (à sa valeur d'origine) qu'au
50
+ * dernier `unlock()`. Sans ce compteur, deux consommateurs par-instance se désynchronisent — la
51
+ * fermeture du premier restaure le scroll alors que le second est encore ouvert.
52
+ */
53
+ declare class KtBodyScrollLock {
54
+ private readonly doc;
55
+ private count;
56
+ private previousOverflow;
57
+ /** Pose un verrou (premier appelant : mémorise puis force `overflow: hidden`). */
58
+ lock(): void;
59
+ /** Relâche un verrou ; restaure l'`overflow` d'origine quand le dernier consommateur relâche. */
60
+ unlock(): void;
61
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtBodyScrollLock, never>;
62
+ static ɵprov: i0.ɵɵInjectableDeclaration<KtBodyScrollLock>;
63
+ }
64
+
45
65
  /**
46
66
  * Valeur d'un palier de breakpoint, CONFIGURABLE PAR APPLICATION :
47
67
  * - un **nombre** = largeur (px) à partir de laquelle le palier commence ; la lib en dérive une
@@ -144,5 +164,11 @@ declare class KtIdGenerator {
144
164
  static ɵprov: i0.ɵɵInjectableDeclaration<KtIdGenerator>;
145
165
  }
146
166
 
147
- export { KT_BREAKPOINTS, KT_DEFAULT_BREAKPOINTS, KtIdGenerator, KtViewport, createKtSheetDrag, provideKtBreakpoints, resolveKtBreakpointMedia };
167
+ /**
168
+ * InjectionToken permettant d'activer ou désactiver les audits d'accessibilité à l'exécution
169
+ * (gardes-fous console.warn en mode dev). Activé par défaut si `isDevMode()` est vrai.
170
+ */
171
+ declare const KT_AUDIT_ENABLED: InjectionToken<boolean>;
172
+
173
+ export { KT_AUDIT_ENABLED, KT_BREAKPOINTS, KT_DEFAULT_BREAKPOINTS, KtBodyScrollLock, KtIdGenerator, KtViewport, createKtSheetDrag, provideKtBreakpoints, resolveKtBreakpointMedia };
148
174
  export type { KtBreakpointMedia, KtBreakpointValue, KtBreakpoints, KtSheetDrag, KtSheetDragOptions };
@@ -249,16 +249,6 @@ type KtDialogPresentation = 'centered' | 'fullscreen' | 'sheet' | 'centered-full
249
249
  */
250
250
  declare function resolveKtDialogPanelClass(presentation?: KtDialogPresentation, compact?: boolean): string[];
251
251
 
252
- /**
253
- * ⚠️ API BAS-NIVEAU — n'utilisez PAS ceci par défaut. Pour implémenter un dialog, passez par
254
- * {@link defineKtDialog} et son `injectData()` (qui lie le type des données à l'ouvreur).
255
- *
256
- * Sucre typé pour récupérer les données injectées dans un composant de dialogue (`DIALOG_DATA`).
257
- * Le type `T` est affirmé ICI indépendamment de l'ouvreur : rien ne garantit qu'il corresponde au
258
- * type passé à `injectKtDialogOpener` → risque de divergence silencieuse. À réserver à un cas où
259
- * `defineKtDialog` ne convient pas.
260
- */
261
- declare function injectKtDialogData<T>(): T;
262
252
  /** Config d'ouverture sans le champ `data` (fourni séparément, typé), enrichie de `presentation`. */
263
253
  type KtDialogOpenerConfig<D, R, C> = Omit<DialogConfig<D, DialogRef<R, C>>, 'data'> & {
264
254
  /** Présentation du dialog (cf. `KtDialogPresentation`) — choisie par le dev. Résolue à CHAQUE
@@ -359,15 +349,18 @@ interface KtDialogContract<D, R> {
359
349
  */
360
350
  declare function defineKtDialog<D = void, R = unknown>(): KtDialogContract<D, R>;
361
351
 
362
- declare class KtDialogContainer extends CdkDialogContainer implements OnInit {
352
+ declare class KtDialogContainer extends CdkDialogContainer {
363
353
  private readonly dialogRef;
364
354
  private readonly elementRef;
365
355
  private readonly host;
366
356
  private readonly platformId;
367
- private readonly destroyRef;
368
357
  protected readonly isClosing: i0.WritableSignal<boolean>;
358
+ /** Premier id de la file `aria-labelledby` exposée par `CdkDialogContainer`. Le membre
359
+ `_ariaLabelledByQueue` est interne au CDK (préfixe `_`) : on l'encapsule ICI, gardé, pour que
360
+ le binding de template ne lise jamais l'interne directement. Si une montée du CDK retire ou
361
+ renomme ce membre, on dégrade proprement vers `null` au lieu de casser le rendu du conteneur. */
362
+ protected get ariaLabelledBy(): string | null;
369
363
  constructor();
370
- ngOnInit(): void;
371
364
  protected isSheet(): boolean;
372
365
  private animateAndClose;
373
366
  static ɵfac: i0.ɵɵFactoryDeclaration<KtDialogContainer, never>;
@@ -380,5 +373,5 @@ declare class KtDialogContainer extends CdkDialogContainer implements OnInit {
380
373
  */
381
374
  declare const KtDialogImports: readonly [typeof KtDialogHeader, typeof KtDialogTitle, typeof KtDialogDescription, typeof KtDialogContent, typeof KtDialogActions, typeof KtDialogClose, typeof KtDialogFocusInitial, typeof KtDialogSheetHandle];
382
375
 
383
- export { KT_DIALOG_AAA_DEFAULTS, KtDialogActions, KtDialogClose, KtDialogContainer, KtDialogContent, KtDialogDescription, KtDialogFocusInitial, KtDialogHeader, KtDialogImports, KtDialogSheetHandle, KtDialogTitle, defineKtDialog, injectKtDialogData, injectKtDialogOpener, provideKtDialogDefaults, resolveKtDialogPanelClass };
376
+ export { KT_DIALOG_AAA_DEFAULTS, KtDialogActions, KtDialogClose, KtDialogContainer, KtDialogContent, KtDialogDescription, KtDialogFocusInitial, KtDialogHeader, KtDialogImports, KtDialogSheetHandle, KtDialogTitle, defineKtDialog, injectKtDialogOpener, provideKtDialogDefaults, resolveKtDialogPanelClass };
384
377
  export type { KtDialogContract, KtDialogOpenerConfig, KtDialogPresentation };
@@ -0,0 +1,112 @@
1
+ import * as i0 from '@angular/core';
2
+
3
+ /**
4
+ * Déclencheur d'un [ktDisclosure] : posé sur un **vrai `<button>`** (clavier Entrée/Espace
5
+ * gratuit). Câble `(click)` → `toggle()` et reflète l'état via `aria-expanded` / `aria-controls`
6
+ * (cf. ADR-0004). `type="button"` est posé **s'il est absent** (ne pas soumettre un formulaire,
7
+ * sans écraser un `type` explicite du consommateur).
8
+ *
9
+ * Le contenu du bouton appartient au consommateur (texte, icône, libellé piloté par `expanded()`). Un
10
+ * **chevron** décoratif (qui pivote selon l'état) est affiché par défaut ; le désactiver avec
11
+ * `[chevron]="false"`. La directive applique elle-même la classe de style — rien à écrire.
12
+ *
13
+ * @example
14
+ * ```html
15
+ * <button ktDisclosureToggle>Détails</button> <!-- avec chevron -->
16
+ * <button ktDisclosureToggle [chevron]="false">Détails</button> <!-- sans chevron -->
17
+ * ```
18
+ */
19
+ declare class KtDisclosureToggle {
20
+ readonly disclosure: KtDisclosure;
21
+ private readonly host;
22
+ private readonly auditEnabled;
23
+ private isDestroyed;
24
+ /** Affiche le chevron décoratif (qui pivote selon l'état). @default true */
25
+ readonly chevron: i0.InputSignalWithTransform<boolean, unknown>;
26
+ constructor();
27
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtDisclosureToggle, never>;
28
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtDisclosureToggle, "button[ktDisclosureToggle]", never, { "chevron": { "alias": "chevron"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
29
+ }
30
+
31
+ /**
32
+ * Panneau repliable d'un [ktDisclosure]. **Composant** (et non directive) car l'animation grid
33
+ * `0fr ↔ 1fr` exige un **unique enfant `overflow:hidden`** autour du contenu projeté — ce wrapper
34
+ * (`.kt-disclosure-content__inner`) est fourni par le template, le consommateur reste libre d'y
35
+ * mettre autant de blocs qu'il veut.
36
+ *
37
+ * Porte l'`id` (cible de `aria-controls`) et passe **`inert`** quand c'est fermé : le contenu
38
+ * masqué sort de l'ordre de tabulation et de l'arbre d'accessibilité (jamais de focus dans
39
+ * l'invisible). Pas de `role=region` (anti-pollution du rotor de régions). Cf. ADR-0004.
40
+ *
41
+ * @example
42
+ * ```html
43
+ * <kt-disclosure-content>
44
+ * <p>Premier bloc</p>
45
+ * <p>Second bloc…</p>
46
+ * </kt-disclosure-content>
47
+ * ```
48
+ */
49
+ declare class KtDisclosureContent {
50
+ readonly disclosure: KtDisclosure;
51
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtDisclosureContent, never>;
52
+ static ɵcmp: i0.ɵɵComponentDeclaration<KtDisclosureContent, "kt-disclosure-content", never, {}, {}, never, ["*"], true, never>;
53
+ }
54
+
55
+ /**
56
+ * Disclosure : replie/déplie un **bloc d'interface** (volet d'options, module de dashboard,
57
+ * section d'une fiche produit). Directive HÔTE d'une famille à trois marqueurs — elle possède
58
+ * l'état, génère l'`id` du panneau et expose des méthodes impératives ; le câblage ARIA et
59
+ * l'animation vivent sur `[ktDisclosureToggle]` / `<kt-disclosure-content>`.
60
+ *
61
+ * Pour une **section de contenu** de page (façon Wikipédia / FAQ), préférer `<details>` natif
62
+ * (sémantique, find-in-page, SEO, zéro JS) — cf. ADR-0004.
63
+ *
64
+ * L'état est exposé via `exportAs: 'ktDisclosure'` : lisez `expanded()` pour piloter le template
65
+ * (ex. libellé « Voir plus / Voir moins ») sans input de libellé (i18n côté consommateur,
66
+ * cf. ADR-0003).
67
+ *
68
+ * Contrat : **un** `[ktDisclosureToggle]` et **un** `<kt-disclosure-content>` par hôte (id de
69
+ * panneau unique / `aria-controls` non ambigu) ; un avertissement dev le signale sinon.
70
+ *
71
+ * @example
72
+ * ```html
73
+ * <div ktDisclosure #d="ktDisclosure">
74
+ * <button ktDisclosureToggle>{{ d.expanded() ? 'Voir moins' : 'Voir plus' }}</button>
75
+ * <kt-disclosure-content><p>Mon contenu</p></kt-disclosure-content>
76
+ * </div>
77
+ * ```
78
+ */
79
+ declare class KtDisclosure {
80
+ private readonly idGen;
81
+ private readonly host;
82
+ private isDestroyed;
83
+ /** Identifiant stable du panneau contrôlé : cible de l'`aria-controls` du déclencheur. */
84
+ readonly contentId: string;
85
+ /**
86
+ * État ouvert/fermé. **Toujours utilisé en binding** (`[(expanded)]` / `[expanded]`), jamais en
87
+ * attribut nu : un `model()` n'accepte pas de `booleanAttribute`, donc `<div ktDisclosure expanded>`
88
+ * pousserait la chaîne `''` au lieu de `true`. En binding, la valeur est garantie booléenne.
89
+ * @default false
90
+ */
91
+ readonly expanded: i0.ModelSignal<boolean>;
92
+ private readonly auditEnabled;
93
+ readonly toggles: i0.Signal<readonly KtDisclosureToggle[]>;
94
+ readonly contents: i0.Signal<readonly KtDisclosureContent[]>;
95
+ constructor();
96
+ /** Bascule l'état. */
97
+ toggle(): void;
98
+ /** Ouvre le panneau. */
99
+ expand(): void;
100
+ /** Ferme le panneau. */
101
+ collapse(): void;
102
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtDisclosure, never>;
103
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtDisclosure, "[ktDisclosure]", ["ktDisclosure"], { "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; }, ["toggles", "contents"], never, true, never>;
104
+ }
105
+
106
+ /**
107
+ * Import ergonomique de toute la famille disclosure en une fois :
108
+ * `imports: [KtDisclosureImports]` au lieu d'énumérer chaque marqueur.
109
+ */
110
+ declare const KtDisclosureImports: readonly [typeof KtDisclosure, typeof KtDisclosureToggle, typeof KtDisclosureContent];
111
+
112
+ export { KtDisclosure, KtDisclosureContent, KtDisclosureImports, KtDisclosureToggle };