@ktortu/aaa 0.9.3 → 0.9.4

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.
@@ -0,0 +1,18 @@
1
+ /* Design tokens du disclosure (famille ktDisclosure) — contrat public de theming.
2
+
3
+ Même architecture que --card-* / --snackbar-* : tout DÉRIVE du socle --kt-*.
4
+ Chargé APRÈS foundation.css (qui pose les --kt-*). */
5
+ @layer kt-aaa.tokens {
6
+ :root {
7
+ /* Durée de l'animation d'ouverture/fermeture (grid-template-rows). Neutralisée sous
8
+ prefers-reduced-motion. */
9
+ --disclosure-anim-duration: 0.2s;
10
+
11
+ /* Cible tactile minimale du déclencheur (WCAG 2.5.5, AAA). */
12
+ --disclosure-toggle-min-size: 44px;
13
+
14
+ /* Chevron (input `chevron` de [ktDisclosureToggle], affiché par défaut). */
15
+ --disclosure-chevron-size: 1em;
16
+ --disclosure-chevron-gap: 0.5rem;
17
+ }
18
+ }
@@ -0,0 +1,84 @@
1
+ @layer kt-aaa.components {
2
+ /* Styles de la famille Disclosure ([ktDisclosure] + [ktDisclosureToggle] + kt-disclosure-content).
3
+ Global : enregistré comme card.css / button.css (les directives se posent sur des éléments
4
+ arbitraires, hors de toute vue de composant). Tokens (--disclosure-*) dans disclosure-tokens.css.
5
+
6
+ Animation = grid-template-rows 0fr ↔ 1fr : anime la hauteur AUTO réelle, sans magic number ni
7
+ mesure JS (cf. ADR-0004). Le panneau passe `inert` quand il est fermé (géré côté composant).
8
+ NB perf : animer grid-template-rows est layout-bound (reflow du sous-arbre par frame, non
9
+ composité). OK pour un geste ponctuel ; éviter sur des panneaux très lourds en contexte mobile. */
10
+
11
+ /* ============ PANNEAU (kt-disclosure-content) ============ */
12
+ kt-disclosure-content {
13
+ display: grid;
14
+ /* Replié par défaut : la rangée fait 0fr (clippée par le wrapper interne). */
15
+ grid-template-rows: 0fr;
16
+ }
17
+ kt-disclosure-content[data-expanded='true'] {
18
+ grid-template-rows: 1fr;
19
+ }
20
+
21
+ /* Wrapper interne fourni par le template : c'est lui qui clippe le contenu. `min-block-size: 0`
22
+ est indispensable pour qu'une rangée de grille 0fr puisse réellement se réduire sous la taille
23
+ min-content du contenu. Mettez vos paddings ICI (sur le contenu projeté), pas en marge directe
24
+ du panneau, pour éviter une fuite de marge pendant l'animation. */
25
+ .kt-disclosure-content__inner {
26
+ overflow: hidden;
27
+ min-block-size: 0;
28
+ }
29
+
30
+ /* ============ DÉCLENCHEUR ([ktDisclosureToggle]) ============
31
+ Le bouton appartient au consommateur (peut être un ktButton). On reste discret (curseur). Le
32
+ focus visible est assuré par le bouton lui-même (UA ou ktButton). On garantit en revanche la
33
+ cible tactile AAA (WCAG 2.5.5) même sur un <button> nu — surchargeable par token ; un ktButton
34
+ dépasse déjà ce minimum. L'inline-size reste piloté par le contenu (un bouton icône-seule doit
35
+ fournir sa largeur ET un nom accessible). */
36
+ [ktDisclosureToggle] {
37
+ cursor: pointer;
38
+ min-block-size: var(--disclosure-toggle-min-size, 44px);
39
+ }
40
+
41
+ /* ============ CHEVRON (input `chevron` de [ktDisclosureToggle], affiché par défaut) ============ */
42
+ [ktDisclosureToggle].kt-disclosure-toggle--chevron {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ gap: var(--disclosure-chevron-gap, 0.5rem);
46
+ }
47
+ /* Icône chevron MASQUÉE, centrée dans son carré : reste optiquement centrée en replié comme en
48
+ déplié (simple rotation 180°, centre inchangé). Un carré bordé tourné de 45°/225° décalerait le
49
+ tracé verticalement entre les deux états. Teintée via currentColor. Décoratif : le pseudo-élément
50
+ est hors de l'arbre d'accessibilité (l'état réel est porté par aria-expanded). */
51
+ [ktDisclosureToggle].kt-disclosure-toggle--chevron::after {
52
+ content: '';
53
+ inline-size: var(--disclosure-chevron-size, 1em);
54
+ block-size: var(--disclosure-chevron-size, 1em);
55
+ background-color: currentColor;
56
+ -webkit-mask: center / contain no-repeat
57
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
58
+ mask: center / contain no-repeat
59
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
60
+ }
61
+ [ktDisclosureToggle][aria-expanded='true'].kt-disclosure-toggle--chevron::after {
62
+ /* Pointe vers le haut une fois déplié (rotation 180°, centre inchangé). */
63
+ rotate: 180deg;
64
+ }
65
+
66
+ /* ============ Mouvement réduit (WCAG 2.3.3) ============ */
67
+ @media (prefers-reduced-motion: no-preference) {
68
+ kt-disclosure-content {
69
+ transition: grid-template-rows var(--disclosure-anim-duration, 0.2s) ease;
70
+ }
71
+ [ktDisclosureToggle].kt-disclosure-toggle--chevron::after {
72
+ transition: rotate var(--disclosure-anim-duration, 0.2s) ease;
73
+ }
74
+ }
75
+
76
+ /* ============ Contraste élevé Windows / forced-colors ============
77
+ Un élément masqué teinté via background-color peut s'effacer en forced-colors : on force une
78
+ couleur système pour que le chevron (seul indice visuel d'état avec aria-expanded) reste visible. */
79
+ @media (forced-colors: active) {
80
+ [ktDisclosureToggle].kt-disclosure-toggle--chevron::after {
81
+ background-color: CanvasText;
82
+ }
83
+ }
84
+ }
@@ -2,6 +2,7 @@ export * from '@ktortu/aaa/button';
2
2
  export * from '@ktortu/aaa/card';
3
3
  export * from '@ktortu/aaa/cdk';
4
4
  export * from '@ktortu/aaa/dialog';
5
+ export * from '@ktortu/aaa/disclosure';
5
6
  export * from '@ktortu/aaa/forms';
6
7
  export * from '@ktortu/aaa/i18n';
7
8
  export * from '@ktortu/aaa/menu';
@@ -1 +1 @@
1
- {"version":3,"file":"ktortu-aaa.mjs","sources":["../../../../projects/ktortu/aaa/src/public-api.ts","../../../../projects/ktortu/aaa/src/ktortu-aaa.ts"],"sourcesContent":["/*\n * Public API Surface of @ktortu/aaa\n */\nexport * from '@ktortu/aaa/button';\nexport * from '@ktortu/aaa/card';\nexport * from '@ktortu/aaa/cdk';\nexport * from '@ktortu/aaa/dialog';\nexport * from '@ktortu/aaa/forms';\nexport * from '@ktortu/aaa/i18n';\nexport * from '@ktortu/aaa/menu';\nexport * from '@ktortu/aaa/snackbar';\nexport * from '@ktortu/aaa/tabs';\nexport * from '@ktortu/aaa/tooltip';\nexport * from '@ktortu/aaa/progress-bar';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;AAEG;;ACFH;;AAEG"}
1
+ {"version":3,"file":"ktortu-aaa.mjs","sources":["../../../../projects/ktortu/aaa/src/public-api.ts","../../../../projects/ktortu/aaa/src/ktortu-aaa.ts"],"sourcesContent":["/*\n * Public API Surface of @ktortu/aaa\n */\nexport * from '@ktortu/aaa/button';\nexport * from '@ktortu/aaa/card';\nexport * from '@ktortu/aaa/cdk';\nexport * from '@ktortu/aaa/dialog';\nexport * from '@ktortu/aaa/disclosure';\nexport * from '@ktortu/aaa/forms';\nexport * from '@ktortu/aaa/i18n';\nexport * from '@ktortu/aaa/menu';\nexport * from '@ktortu/aaa/snackbar';\nexport * from '@ktortu/aaa/tabs';\nexport * from '@ktortu/aaa/tooltip';\nexport * from '@ktortu/aaa/progress-bar';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;AAAA;;AAEG;;ACFH;;AAEG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ktortu/aaa",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "description": "Bibliothèque de composants Angular headless + thémés par tokens CSS.",
5
5
  "keywords": [
6
6
  "angular",
@@ -2,6 +2,7 @@ export * from '@ktortu/aaa/button';
2
2
  export * from '@ktortu/aaa/card';
3
3
  export * from '@ktortu/aaa/cdk';
4
4
  export * from '@ktortu/aaa/dialog';
5
+ export * from '@ktortu/aaa/disclosure';
5
6
  export * from '@ktortu/aaa/forms';
6
7
  export * from '@ktortu/aaa/i18n';
7
8
  export * from '@ktortu/aaa/menu';