@ktortu/aaa 0.1.0-beta.0
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/LICENSE +21 -0
- package/README.md +151 -0
- package/button/button-tokens.css +152 -0
- package/button/button.css +319 -0
- package/card/card-tokens.css +49 -0
- package/card/card.css +200 -0
- package/cdk/styles/foundation.css +83 -0
- package/cdk/styles/tabs.css +276 -0
- package/dialog/dialog.css +350 -0
- package/fesm2022/ktortu-aaa-button.mjs +128 -0
- package/fesm2022/ktortu-aaa-button.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-card.mjs +209 -0
- package/fesm2022/ktortu-aaa-card.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-cdk.mjs +183 -0
- package/fesm2022/ktortu-aaa-cdk.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-dialog.mjs +512 -0
- package/fesm2022/ktortu-aaa-dialog.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-forms.mjs +3215 -0
- package/fesm2022/ktortu-aaa-forms.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-menu.mjs +315 -0
- package/fesm2022/ktortu-aaa-menu.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-tabs.mjs +79 -0
- package/fesm2022/ktortu-aaa-tabs.mjs.map +1 -0
- package/fesm2022/ktortu-aaa-tooltip.mjs +356 -0
- package/fesm2022/ktortu-aaa-tooltip.mjs.map +1 -0
- package/fesm2022/ktortu-aaa.mjs +17 -0
- package/fesm2022/ktortu-aaa.mjs.map +1 -0
- package/forms/checkbox/checkbox-group.css +55 -0
- package/forms/checkbox/checkbox.css +216 -0
- package/forms/chips/chip-list.css +70 -0
- package/forms/chips/chip.css +92 -0
- package/forms/chips/tokens.css +102 -0
- package/forms/field/field.css +87 -0
- package/forms/multi-select/multi-select.css +136 -0
- package/forms/radio/radio-group.css +55 -0
- package/forms/radio/radio.css +165 -0
- package/forms/styles/field-box.css +171 -0
- package/forms/styles/select-panel.css +464 -0
- package/forms/styles/tokens.css +67 -0
- package/forms/switch/switch.css +188 -0
- package/menu/menu-tokens.css +58 -0
- package/menu/menu.css +224 -0
- package/package.json +96 -0
- package/styles/button.css +6 -0
- package/styles/card.css +6 -0
- package/styles/dialog.css +6 -0
- package/styles/forms.css +13 -0
- package/styles/foundation.css +7 -0
- package/styles/menu.css +6 -0
- package/styles/styles.css +24 -0
- package/styles/tabs.css +5 -0
- package/styles/tooltip.css +5 -0
- package/themes/theme-ant.css +44 -0
- package/themes/theme-architecte.css +83 -0
- package/themes/theme-aurora.css +97 -0
- package/themes/theme-bootstrap.css +46 -0
- package/themes/theme-carbon.css +49 -0
- package/themes/theme-catppuccin.css +66 -0
- package/themes/theme-cyberpunk.css +211 -0
- package/themes/theme-fluent.css +45 -0
- package/themes/theme-material-you.css +74 -0
- package/themes/theme-material.css +48 -0
- package/themes/theme-primer.css +46 -0
- package/themes/theme-vegetal.css +78 -0
- package/tooltip/tooltip.css +129 -0
- package/types/ktortu-aaa-button.d.ts +70 -0
- package/types/ktortu-aaa-card.d.ts +143 -0
- package/types/ktortu-aaa-cdk.d.ts +110 -0
- package/types/ktortu-aaa-dialog.d.ts +286 -0
- package/types/ktortu-aaa-forms.d.ts +1574 -0
- package/types/ktortu-aaa-menu.d.ts +171 -0
- package/types/ktortu-aaa-tabs.d.ts +27 -0
- package/types/ktortu-aaa-tooltip.d.ts +90 -0
- package/types/ktortu-aaa.d.ts +8 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
@layer kt-aaa.components {
|
|
2
|
+
:host {
|
|
3
|
+
display: block;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.kt-radio-group-field {
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
gap: var(--field-gap, 0.375rem);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/* Légende du groupe (référencée par aria-labelledby — PAS un <label for>, c'est un groupe). */
|
|
13
|
+
.kt-radio-group__legend {
|
|
14
|
+
font-size: var(--field-label-font-size, 0.875rem);
|
|
15
|
+
font-weight: var(--field-label-weight, 500);
|
|
16
|
+
color: var(--field-label-color, inherit);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.kt-radio-group__required {
|
|
20
|
+
margin-inline-start: 0.125rem;
|
|
21
|
+
color: var(--field-required-color, var(--kt-danger, #8c1d18));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Disposition des options : pilotable par token (colonne par défaut, ligne possible). */
|
|
25
|
+
.kt-radio-group__options {
|
|
26
|
+
display: flex;
|
|
27
|
+
flex-direction: var(--radio-group-direction, column);
|
|
28
|
+
flex-wrap: wrap;
|
|
29
|
+
gap: var(--radio-group-gap, 0.25rem);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.kt-radio-group__hint {
|
|
33
|
+
margin: 0;
|
|
34
|
+
font-size: var(--field-hint-font-size, 0.8125rem);
|
|
35
|
+
color: var(--field-hint-color, #474747);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.kt-radio-group__error {
|
|
39
|
+
margin: 0;
|
|
40
|
+
display: flex;
|
|
41
|
+
flex-direction: column;
|
|
42
|
+
font-size: var(--field-hint-font-size, 0.8125rem);
|
|
43
|
+
color: var(--field-error-color, #8c1d18);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.kt-radio-group__error-message {
|
|
47
|
+
animation: var(--field-error-animation, none);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@media (prefers-reduced-motion: reduce) {
|
|
51
|
+
.kt-radio-group__error-message {
|
|
52
|
+
animation: none;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
@layer kt-aaa.components {
|
|
2
|
+
:host {
|
|
3
|
+
display: block;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/* Surface cliquable : remplit tout le host (toute la « carte » est cliquable) avec une cible
|
|
7
|
+
tactile confortable (AAA 2.5.5). Le rembourrage est piloté par token (`--radio-padding`) pour
|
|
8
|
+
qu'un consommateur bâtisse une carte sélectionnable sans franchir l'encapsulation ; le rayon
|
|
9
|
+
est hérité du host pour que survol/sélection épousent les coins arrondis du consommateur. */
|
|
10
|
+
.kt-radio {
|
|
11
|
+
display: flex;
|
|
12
|
+
align-items: center;
|
|
13
|
+
gap: var(--field-control-gap, 0.5rem);
|
|
14
|
+
inline-size: 100%;
|
|
15
|
+
box-sizing: border-box;
|
|
16
|
+
min-block-size: var(--radio-target-size, 44px);
|
|
17
|
+
padding: var(--radio-padding, 0);
|
|
18
|
+
border-radius: inherit;
|
|
19
|
+
cursor: pointer;
|
|
20
|
+
user-select: none;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Le bouton radio : input natif redessiné, taille pilotée par UN token via `font-size`. */
|
|
24
|
+
.kt-radio__input {
|
|
25
|
+
appearance: none;
|
|
26
|
+
-webkit-appearance: none;
|
|
27
|
+
margin: 0;
|
|
28
|
+
flex: none;
|
|
29
|
+
box-sizing: border-box;
|
|
30
|
+
display: grid;
|
|
31
|
+
place-content: center;
|
|
32
|
+
font-size: var(--radio-size, 1.25rem);
|
|
33
|
+
inline-size: 1em;
|
|
34
|
+
block-size: 1em;
|
|
35
|
+
border: var(--radio-border-width, 2px) solid
|
|
36
|
+
var(--radio-border-color, var(--field-border-color, var(--kt-outline, #c4c7c5)));
|
|
37
|
+
border-radius: 50%;
|
|
38
|
+
background-color: var(--radio-bg, var(--field-bg, var(--kt-surface, #ffffff)));
|
|
39
|
+
cursor: pointer;
|
|
40
|
+
/* Élévation/glow de repos : retombe sur le token de thème des champs (--field-shadow). */
|
|
41
|
+
box-shadow: var(--radio-shadow, var(--field-shadow, none));
|
|
42
|
+
transition: var(
|
|
43
|
+
--radio-transition,
|
|
44
|
+
background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1),
|
|
45
|
+
border-color 0.15s cubic-bezier(0.4, 0, 0.2, 1),
|
|
46
|
+
box-shadow 0.2s ease
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Le point central : pseudo-élément mis à l'échelle 0 → 1. */
|
|
51
|
+
.kt-radio__input::before {
|
|
52
|
+
content: '';
|
|
53
|
+
inline-size: 0.5em;
|
|
54
|
+
block-size: 0.5em;
|
|
55
|
+
border-radius: 50%;
|
|
56
|
+
transform: scale(0);
|
|
57
|
+
transform-origin: center;
|
|
58
|
+
box-shadow: inset 1em 1em var(--radio-dot-color, #ffffff);
|
|
59
|
+
/* Désélection : repli doux vers scale(0). */
|
|
60
|
+
transition: var(--radio-dot-transition, transform 0.12s ease-in);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* Sélection : « pop » avec rebond via @keyframes — fiable car déclenché à l'ENTRÉE dans l'état
|
|
64
|
+
`:checked` (cf. checkbox : une transition ne démarrait pas dans le flux Angular). */
|
|
65
|
+
.kt-radio__input:checked::before {
|
|
66
|
+
transform: scale(1);
|
|
67
|
+
animation: var(--radio-dot-animation, kt-radio-pop 0.22s cubic-bezier(0.34, 1.56, 0.64, 1));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@keyframes kt-radio-pop {
|
|
71
|
+
from {
|
|
72
|
+
transform: scale(0);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* Sélectionné : remplissage plein + HALO coloré dérivé du primaire du thème (glow visible,
|
|
77
|
+
en fondu via la transition). Surchargeable/désactivable par --radio-shadow-checked. */
|
|
78
|
+
.kt-radio__input:checked {
|
|
79
|
+
background-color: var(--radio-bg-checked, var(--kt-primary, #0842a0));
|
|
80
|
+
border-color: var(--radio-border-color-checked, var(--radio-bg-checked, var(--kt-primary, #0842a0)));
|
|
81
|
+
box-shadow: var(
|
|
82
|
+
--radio-shadow-checked,
|
|
83
|
+
0 0 8px color-mix(in srgb, var(--radio-bg-checked, var(--kt-primary, #0842a0)) 50%, transparent)
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* HOVER : bordure + glow de survol du thème (--field-shadow-hover). */
|
|
88
|
+
.kt-radio__input:hover:not(:disabled) {
|
|
89
|
+
border-color: var(--radio-border-color-hover, var(--field-border-color-hover, var(--kt-outline-strong, #5f6368)));
|
|
90
|
+
box-shadow: var(--radio-shadow-hover, var(--field-shadow-hover, var(--radio-shadow, var(--field-shadow, none))));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.kt-radio__input:checked:hover:not(:disabled) {
|
|
94
|
+
background-color: var(--radio-bg-checked-hover, color-mix(in srgb, var(--kt-primary, #0842a0) 90%, black));
|
|
95
|
+
border-color: var(--radio-bg-checked-hover, color-mix(in srgb, var(--kt-primary, #0842a0) 90%, black));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* FOCUS : anneau via `outline` (comme les champs → pas de conflit avec le glow box-shadow), +
|
|
99
|
+
glow de focus du thème (--field-shadow-focus). L'outline reste visible quel que soit le survol. */
|
|
100
|
+
.kt-radio__input:focus-visible {
|
|
101
|
+
outline: var(--kt-focus-ring-width, 2px) solid var(--kt-focus-ring-color, #0842a0);
|
|
102
|
+
outline-offset: var(--radio-focus-ring-offset, 2px);
|
|
103
|
+
box-shadow: var(--radio-shadow-focus, var(--field-shadow-focus, var(--field-shadow, none)));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* DÉSACTIVÉ */
|
|
107
|
+
.kt-radio__input:disabled {
|
|
108
|
+
cursor: not-allowed;
|
|
109
|
+
opacity: 0.5;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.kt-radio:has(.kt-radio__input:disabled) {
|
|
113
|
+
cursor: not-allowed;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* Libellé */
|
|
117
|
+
.kt-radio__label {
|
|
118
|
+
font-size: var(--field-label-font-size, 0.875rem);
|
|
119
|
+
font-weight: var(--field-label-weight, 500);
|
|
120
|
+
color: var(--field-label-color, inherit);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.kt-radio:has(.kt-radio__input:disabled) .kt-radio__label {
|
|
124
|
+
color: var(--field-hint-color, #5f6368);
|
|
125
|
+
opacity: 0.6;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Hint par option */
|
|
129
|
+
.kt-radio__hint {
|
|
130
|
+
margin: 0;
|
|
131
|
+
margin-inline-start: calc(var(--radio-size, 1.25rem) + var(--field-control-gap, 0.5rem));
|
|
132
|
+
font-size: var(--field-hint-font-size, 0.8125rem);
|
|
133
|
+
color: var(--field-hint-color, #474747);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/* Mode contraste élevé : restaure le rendu système après `appearance:none`. */
|
|
137
|
+
@media (forced-colors: active) {
|
|
138
|
+
.kt-radio__input {
|
|
139
|
+
border-color: CanvasText;
|
|
140
|
+
background-color: Canvas;
|
|
141
|
+
}
|
|
142
|
+
.kt-radio__input:checked {
|
|
143
|
+
border-color: Highlight;
|
|
144
|
+
background-color: Canvas;
|
|
145
|
+
}
|
|
146
|
+
.kt-radio__input::before {
|
|
147
|
+
box-shadow: inset 1em 1em Highlight;
|
|
148
|
+
}
|
|
149
|
+
.kt-radio__input:disabled {
|
|
150
|
+
border-color: GrayText;
|
|
151
|
+
}
|
|
152
|
+
.kt-radio__input:focus-visible {
|
|
153
|
+
outline: 2px solid CanvasText;
|
|
154
|
+
outline-offset: 2px;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@media (prefers-reduced-motion: reduce) {
|
|
159
|
+
.kt-radio__input,
|
|
160
|
+
.kt-radio__input::before {
|
|
161
|
+
transition: none;
|
|
162
|
+
animation: none;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
@layer kt-aaa.components {
|
|
2
|
+
/* Boîte de contrôle partagée par les champs simples (TextField, NumberField).
|
|
3
|
+
Globale + classes namespacées : partagée entre plusieurs composants, donc non scopable. */
|
|
4
|
+
kt-text-field,
|
|
5
|
+
kt-number-field {
|
|
6
|
+
display: block;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.kt-field-box {
|
|
10
|
+
display: flex;
|
|
11
|
+
align-items: center;
|
|
12
|
+
gap: var(--field-control-gap, 0.5rem);
|
|
13
|
+
/* border-box : min-height inclut padding + bordure → 44px réels, alignés sur le bouton
|
|
14
|
+
(qui est déjà en border-box). Sans ça, content-box ajoute padding+bordure → ~62px. */
|
|
15
|
+
box-sizing: border-box;
|
|
16
|
+
min-height: var(--field-min-height, 44px); /* hauteur unifiée avec le bouton md */
|
|
17
|
+
padding: var(--field-padding-y, 0.5rem) var(--field-padding-x, 0.75rem);
|
|
18
|
+
background: var(--field-bg, #fff);
|
|
19
|
+
/* Longhands (PAS le shorthand) : width et style acceptent 1 à 4 valeurs (haut droite bas
|
|
20
|
+
gauche) => bordures par côté (ex. underline `0 0 2px 0`) et styles mixtes (`solid dashed`).
|
|
21
|
+
--field-border-color reste UNE seule couleur (réutilisée ailleurs, ex. poignée de sheet). */
|
|
22
|
+
border-width: var(--field-border-width, 1px);
|
|
23
|
+
border-style: var(--field-border-style, solid);
|
|
24
|
+
border-color: var(--field-border-color, #c4c7c5);
|
|
25
|
+
border-radius: var(--field-radius, 8px);
|
|
26
|
+
color: var(--field-color, inherit);
|
|
27
|
+
/* Ombres par état : tokens de bascule NON déclarés à :root (cf. tokens.css) => `none` par
|
|
28
|
+
défaut. hover/focus retombent en cascade sur l'ombre de repos si non définis. */
|
|
29
|
+
box-shadow: var(--field-shadow, none);
|
|
30
|
+
/* Translucidité (verre) : bascule => aucun effet par défaut. Un thème pose un --field-bg
|
|
31
|
+
semi-transparent + blur/saturate ici (cf. theme-liquid-glass). À neutraliser sous
|
|
32
|
+
prefers-reduced-transparency côté thème. */
|
|
33
|
+
backdrop-filter: var(--field-backdrop-filter, none);
|
|
34
|
+
/* Mouvement : bascule => inerte par défaut. Pas de token transform sur la boîte : le trigger
|
|
35
|
+
du select sert d'ancre (anchor positioning), un transform fausserait le rattachement. */
|
|
36
|
+
transition: var(--field-transition, none);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.kt-field-box:hover {
|
|
40
|
+
border-color: var(--field-border-color-hover, #5f6368);
|
|
41
|
+
box-shadow: var(--field-shadow-hover, var(--field-shadow, none));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Focus visible au niveau de la boîte (l'input lui-même n'a pas de bordure). */
|
|
45
|
+
.kt-field-box:focus-within {
|
|
46
|
+
border-color: var(--field-border-color-focus, #0b57d0);
|
|
47
|
+
outline: var(--field-focus-ring-width, 2px) var(--field-focus-ring-style, solid)
|
|
48
|
+
var(--field-focus-ring, color-mix(in srgb, var(--field-border-color-focus, #0b57d0) 35%, transparent));
|
|
49
|
+
outline-offset: var(--field-focus-ring-offset, 1px);
|
|
50
|
+
box-shadow: var(--field-shadow-focus, var(--field-shadow, none));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.kt-field-box[data-invalid] {
|
|
54
|
+
border-color: var(--field-error-color, #b3261e);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.kt-field-box[data-invalid]:focus-within {
|
|
58
|
+
outline-color: color-mix(in srgb, var(--field-error-color, #b3261e) 35%, transparent);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.kt-field-box[data-disabled] {
|
|
62
|
+
background: var(--field-disabled-bg, #f1f3f4);
|
|
63
|
+
cursor: not-allowed;
|
|
64
|
+
box-shadow: none; /* un champ inerte ne « rayonne » pas, quel que soit le thème */
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.kt-field-box__input {
|
|
68
|
+
flex: 1;
|
|
69
|
+
min-width: 0;
|
|
70
|
+
border: none;
|
|
71
|
+
outline: none;
|
|
72
|
+
background: transparent;
|
|
73
|
+
color: inherit;
|
|
74
|
+
font: inherit;
|
|
75
|
+
caret-color: var(--field-caret-color, auto); /* bascule (thème terminal, etc.) */
|
|
76
|
+
padding-inline-end: 0.5rem;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.kt-field-box__input:disabled {
|
|
80
|
+
cursor: not-allowed;
|
|
81
|
+
color: color-mix(in srgb, currentColor 50%, transparent);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* Datalist : masque la flèche déroulante native (Chromium) sur les champs texte/number. Le
|
|
85
|
+
pseudo-élément étant partagé avec l'icône de picker des champs date/heure (qui peuvent eux
|
|
86
|
+
aussi porter un `list`), on restreint aux types concernés pour ne pas masquer leur picker. */
|
|
87
|
+
.kt-field-box__input[list]:is(
|
|
88
|
+
[type='text'],
|
|
89
|
+
[type='email'],
|
|
90
|
+
[type='password'],
|
|
91
|
+
[type='search'],
|
|
92
|
+
[type='tel'],
|
|
93
|
+
[type='url'],
|
|
94
|
+
[type='number']
|
|
95
|
+
)::-webkit-calendar-picker-indicator {
|
|
96
|
+
display: none !important;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.kt-field-box__affix {
|
|
100
|
+
flex: none;
|
|
101
|
+
color: var(--field-hint-color, #5f6368);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* Icône via ligature de police d'icône (même mécanisme que Button). Police configurable :
|
|
105
|
+
--field-icon-font (par champ) > --kt-icon-font (global) > Material Symbols. Pour un set
|
|
106
|
+
NON-ligature (ex. Font Awesome), passer par `prefix`/`suffix` (TemplateRef). */
|
|
107
|
+
.kt-field-box__icon {
|
|
108
|
+
flex: none;
|
|
109
|
+
font-family: var(--field-icon-font, var(--kt-icon-font, 'Material Symbols Outlined'));
|
|
110
|
+
font-weight: var(--field-icon-font-weight, var(--kt-icon-font-weight, normal));
|
|
111
|
+
font-style: normal;
|
|
112
|
+
font-size: 1.25em;
|
|
113
|
+
line-height: 1;
|
|
114
|
+
font-feature-settings: 'liga';
|
|
115
|
+
color: var(--field-icon-color, #5f6368);
|
|
116
|
+
-webkit-font-smoothing: antialiased;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/* Le bouton « effacer » est une icône INTERNE de la lib : toujours Material Symbols,
|
|
120
|
+
indépendante de --kt-icon-font (sinon un override consommateur casserait la croix). */
|
|
121
|
+
.kt-field-box__clear .kt-field-box__icon {
|
|
122
|
+
font-family: 'Material Symbols Outlined';
|
|
123
|
+
font-weight: normal;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.kt-field-box__clear {
|
|
127
|
+
display: inline-flex;
|
|
128
|
+
align-items: center;
|
|
129
|
+
justify-content: center;
|
|
130
|
+
flex: none;
|
|
131
|
+
padding: 0;
|
|
132
|
+
border: none;
|
|
133
|
+
border-radius: 50%;
|
|
134
|
+
background: transparent;
|
|
135
|
+
color: var(--field-icon-color, #5f6368);
|
|
136
|
+
cursor: pointer;
|
|
137
|
+
position: relative; /* requis pour le positionnement de ::after */
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* Cible tactile AAA 44x44px étendue via un pseudo-élément transparent */
|
|
141
|
+
.kt-field-box__clear::after {
|
|
142
|
+
content: '';
|
|
143
|
+
position: absolute;
|
|
144
|
+
top: 50%;
|
|
145
|
+
left: 50%;
|
|
146
|
+
transform: translate(-50%, -50%);
|
|
147
|
+
width: 44px;
|
|
148
|
+
height: 44px;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.kt-field-box__clear:hover {
|
|
152
|
+
color: var(--field-color, inherit);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.kt-field-box__clear:focus-visible {
|
|
156
|
+
outline: 2px solid var(--field-border-color-focus, #0b57d0);
|
|
157
|
+
outline-offset: 1px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* Multi-ligne (textarea) : affixes et clear s'alignent en haut, pas au centre. */
|
|
161
|
+
.kt-field-box[data-multiline] {
|
|
162
|
+
align-items: flex-start;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
textarea.kt-field-box__input {
|
|
166
|
+
/* Autosize natif (navigateurs récents) ; `rows` = hauteur initiale ;
|
|
167
|
+
repli sur navigateurs sans field-sizing : redimensionnement manuel vertical. */
|
|
168
|
+
field-sizing: content;
|
|
169
|
+
resize: vertical;
|
|
170
|
+
}
|
|
171
|
+
}
|