@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.
- package/fesm2022/ktortu-aaa-button.mjs +10 -2
- package/fesm2022/ktortu-aaa-button.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-card.mjs +14 -5
- package/fesm2022/ktortu-aaa-card.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-cdk.mjs +49 -2
- package/fesm2022/ktortu-aaa-cdk.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-dialog.mjs +19 -31
- package/fesm2022/ktortu-aaa-dialog.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-disclosure.mjs +201 -0
- package/fesm2022/ktortu-aaa-disclosure.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-forms.mjs +210 -93
- package/fesm2022/ktortu-aaa-forms.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-progress-bar.mjs +91 -0
- package/fesm2022/ktortu-aaa-progress-bar.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-snackbar.mjs +16 -3
- package/fesm2022/ktortu-aaa-snackbar.mjs.map +1 -1
- package/fesm2022/ktortu-aaa-tooltip.mjs +20 -30
- package/fesm2022/ktortu-aaa-tooltip.mjs.map +1 -1
- package/fesm2022/ktortu-aaa.mjs +1 -0
- package/fesm2022/ktortu-aaa.mjs.map +1 -1
- package/forms/field/field.css +16 -0
- package/forms/styles/field-box.css +11 -5
- package/package.json +9 -1
- package/progress-bar/progress-bar.css +127 -0
- package/styles/disclosure.css +6 -0
- package/styles/progress-bar.css +5 -0
- package/styles/styles.css +2 -0
- package/themes/theme-cyberpunk.css +11 -0
- package/tooltip/tooltip.css +1 -1
- package/types/ktortu-aaa-button.d.ts +2 -0
- package/types/ktortu-aaa-card.d.ts +3 -0
- package/types/ktortu-aaa-cdk.d.ts +27 -1
- package/types/ktortu-aaa-dialog.d.ts +7 -14
- package/types/ktortu-aaa-disclosure.d.ts +112 -0
- package/types/ktortu-aaa-forms.d.ts +66 -14
- package/types/ktortu-aaa-progress-bar.d.ts +27 -0
- package/types/ktortu-aaa-snackbar.d.ts +11 -68
- package/types/ktortu-aaa-tooltip.d.ts +0 -1
- 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.
|
|
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';
|
package/styles/styles.css
CHANGED
|
@@ -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] {
|
package/tooltip/tooltip.css
CHANGED
|
@@ -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; /*
|
|
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
|
-
|
|
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
|
|
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,
|
|
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 };
|