@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.
Files changed (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +151 -0
  3. package/button/button-tokens.css +152 -0
  4. package/button/button.css +319 -0
  5. package/card/card-tokens.css +49 -0
  6. package/card/card.css +200 -0
  7. package/cdk/styles/foundation.css +83 -0
  8. package/cdk/styles/tabs.css +276 -0
  9. package/dialog/dialog.css +350 -0
  10. package/fesm2022/ktortu-aaa-button.mjs +128 -0
  11. package/fesm2022/ktortu-aaa-button.mjs.map +1 -0
  12. package/fesm2022/ktortu-aaa-card.mjs +209 -0
  13. package/fesm2022/ktortu-aaa-card.mjs.map +1 -0
  14. package/fesm2022/ktortu-aaa-cdk.mjs +183 -0
  15. package/fesm2022/ktortu-aaa-cdk.mjs.map +1 -0
  16. package/fesm2022/ktortu-aaa-dialog.mjs +512 -0
  17. package/fesm2022/ktortu-aaa-dialog.mjs.map +1 -0
  18. package/fesm2022/ktortu-aaa-forms.mjs +3215 -0
  19. package/fesm2022/ktortu-aaa-forms.mjs.map +1 -0
  20. package/fesm2022/ktortu-aaa-menu.mjs +315 -0
  21. package/fesm2022/ktortu-aaa-menu.mjs.map +1 -0
  22. package/fesm2022/ktortu-aaa-tabs.mjs +79 -0
  23. package/fesm2022/ktortu-aaa-tabs.mjs.map +1 -0
  24. package/fesm2022/ktortu-aaa-tooltip.mjs +356 -0
  25. package/fesm2022/ktortu-aaa-tooltip.mjs.map +1 -0
  26. package/fesm2022/ktortu-aaa.mjs +17 -0
  27. package/fesm2022/ktortu-aaa.mjs.map +1 -0
  28. package/forms/checkbox/checkbox-group.css +55 -0
  29. package/forms/checkbox/checkbox.css +216 -0
  30. package/forms/chips/chip-list.css +70 -0
  31. package/forms/chips/chip.css +92 -0
  32. package/forms/chips/tokens.css +102 -0
  33. package/forms/field/field.css +87 -0
  34. package/forms/multi-select/multi-select.css +136 -0
  35. package/forms/radio/radio-group.css +55 -0
  36. package/forms/radio/radio.css +165 -0
  37. package/forms/styles/field-box.css +171 -0
  38. package/forms/styles/select-panel.css +464 -0
  39. package/forms/styles/tokens.css +67 -0
  40. package/forms/switch/switch.css +188 -0
  41. package/menu/menu-tokens.css +58 -0
  42. package/menu/menu.css +224 -0
  43. package/package.json +96 -0
  44. package/styles/button.css +6 -0
  45. package/styles/card.css +6 -0
  46. package/styles/dialog.css +6 -0
  47. package/styles/forms.css +13 -0
  48. package/styles/foundation.css +7 -0
  49. package/styles/menu.css +6 -0
  50. package/styles/styles.css +24 -0
  51. package/styles/tabs.css +5 -0
  52. package/styles/tooltip.css +5 -0
  53. package/themes/theme-ant.css +44 -0
  54. package/themes/theme-architecte.css +83 -0
  55. package/themes/theme-aurora.css +97 -0
  56. package/themes/theme-bootstrap.css +46 -0
  57. package/themes/theme-carbon.css +49 -0
  58. package/themes/theme-catppuccin.css +66 -0
  59. package/themes/theme-cyberpunk.css +211 -0
  60. package/themes/theme-fluent.css +45 -0
  61. package/themes/theme-material-you.css +74 -0
  62. package/themes/theme-material.css +48 -0
  63. package/themes/theme-primer.css +46 -0
  64. package/themes/theme-vegetal.css +78 -0
  65. package/tooltip/tooltip.css +129 -0
  66. package/types/ktortu-aaa-button.d.ts +70 -0
  67. package/types/ktortu-aaa-card.d.ts +143 -0
  68. package/types/ktortu-aaa-cdk.d.ts +110 -0
  69. package/types/ktortu-aaa-dialog.d.ts +286 -0
  70. package/types/ktortu-aaa-forms.d.ts +1574 -0
  71. package/types/ktortu-aaa-menu.d.ts +171 -0
  72. package/types/ktortu-aaa-tabs.d.ts +27 -0
  73. package/types/ktortu-aaa-tooltip.d.ts +90 -0
  74. package/types/ktortu-aaa.d.ts +8 -0
@@ -0,0 +1,171 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken } from '@angular/core';
3
+
4
+ /**
5
+ * `[ktMenu]` — marqueur de THÈME posé sur l'hôte `[ngMenu]` d'`@angular/aria`. Style UNIQUEMENT la
6
+ * SURFACE du menu (fond, bord, ombre, rayon, padding, positionnement en dropdown ancré). N'ajoute
7
+ * AUCUN rôle ni comportement : la sémantique (`role="menu"`), le clavier, le focus roving, le
8
+ * retour de focus au trigger, les sous-menus et le typeahead viennent intégralement d'aria
9
+ * (`[ngMenu]`). Même philosophie que `[ktCard]` : la lib thématise, aria gère l'accessibilité.
10
+ *
11
+ * La directive n'a pas de logique propre : tout vit dans `menu.css` via le sélecteur `[ktMenu]`,
12
+ * piloté par l'attribut `data-visible` qu'aria pose sur l'hôte (ouvert/fermé). Le positionnement
13
+ * (CSS Anchor Positioning) est câblé par `[ktMenuTrigger]` (menu racine) et par `[ktMenuItem]`
14
+ * (sous-menus) qui posent les `anchor-name` / `position-anchor`.
15
+ *
16
+ * @example
17
+ * ```html
18
+ * <button ngMenuTrigger ktMenuTrigger [menu]="m">Options</button>
19
+ * <div ngMenu ktMenu #m="ngMenu" (itemSelected)="onSelect($event)" aria-label="Options">
20
+ * <button ngMenuItem ktMenuItem value="new">Nouveau</button>
21
+ * </div>
22
+ * ```
23
+ */
24
+ declare class KtMenu {
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtMenu, never>;
26
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtMenu, "[ktMenu]", never, {}, {}, never, never, true, never>;
27
+ }
28
+ /**
29
+ * `[ktMenuItem]` — marqueur de thème posé sur l'hôte `[ngMenuItem]`. Style la RANGÉE (hauteur de
30
+ * cible tactile ≥44px, focus, survol, désactivé, item de sous-menu avec chevron). Comme `[ktMenu]`,
31
+ * sans logique de sélection : l'état stylé est lu sur les attributs ARIA déjà posés par aria
32
+ * (`:focus-visible` pour l'item actif via focus roving, `[aria-disabled]`, `[aria-expanded]`,
33
+ * `[aria-haspopup]`, `[aria-checked]`).
34
+ *
35
+ * SEULE responsabilité technique : si l'item porte un sous-menu (`[submenu]` côté aria), on câble
36
+ * l'ancrage CSS du sous-menu sur cet item (anchor-name sur l'item, position-anchor sur la surface
37
+ * du sous-menu, marqueur `data-kt-submenu` pour l'ouvrir en latéral plutôt qu'en dropdown).
38
+ *
39
+ * EXIGENCE DE STRUCTURE (sous-menus) : le `[ngMenu]` d'un sous-menu DOIT être un DESCENDANT DOM du
40
+ * menu parent (et non un frère). aria décide de maintenir un menu ouvert via `element.contains()`
41
+ * sur la cible du focus/survol ; un sous-menu placé hors du sous-arbre du parent ferait croire à
42
+ * aria que le focus a quitté le menu et provoquerait sa fermeture dès qu'on survole le sous-menu.
43
+ * Le sous-menu reste rendu en place (top-layer non requis : `position: fixed` + ancrage CSS).
44
+ *
45
+ * @example
46
+ * ```html
47
+ * <button ngMenuItem ktMenuItem value="open">Ouvrir</button>
48
+ * ```
49
+ */
50
+ declare class KtMenuItem {
51
+ private readonly host;
52
+ private readonly ariaItem;
53
+ private readonly platformId;
54
+ protected anchorName: string | undefined;
55
+ private readonly idGen;
56
+ constructor();
57
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtMenuItem, never>;
58
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtMenuItem, "[ktMenuItem]", never, {}, {}, never, never, true, never>;
59
+ }
60
+ /**
61
+ * `[ktMenuSeparator]` — filet de séparation entre groupes d'items. Pose `role="separator"`
62
+ * (sémantique standard d'un séparateur de menu) ; la ligne elle-même vit dans `menu.css`.
63
+ *
64
+ * @example
65
+ * ```html
66
+ * <hr ktMenuSeparator />
67
+ * ```
68
+ */
69
+ declare class KtMenuSeparator {
70
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtMenuSeparator, never>;
71
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtMenuSeparator, "[ktMenuSeparator]", never, {}, {}, never, never, true, never>;
72
+ }
73
+
74
+ /**
75
+ * `[ktMenuTrigger]` — sucre de POSITIONNEMENT pour le menu racine. À poser SUR le même élément
76
+ * qu'`[ngMenuTrigger]` (le bouton qui ouvre le menu). Il ne réimplémente RIEN du comportement :
77
+ * l'ouverture/fermeture, `aria-expanded`, Échap, le clic-dehors et le retour de focus sont gérés
78
+ * par aria (`[ngMenuTrigger]`). Sa seule tâche : poser un `anchor-name` sur le trigger et le
79
+ * `position-anchor` correspondant sur la surface du menu, pour que `menu.css` l'ancre en dropdown
80
+ * (CSS Anchor Positioning), comme le popup du Select — sans CDK Overlay (styles scopés conservés,
81
+ * et pas de coordination fragile avec le focus qu'aria pose à l'ouverture).
82
+ *
83
+ * Requiert `[ngMenuTrigger]` sur le même hôte (injecté en `self`).
84
+ *
85
+ * @example
86
+ * ```html
87
+ * <button ngMenuTrigger ktMenuTrigger [menu]="m">Fichier</button>
88
+ * ```
89
+ */
90
+ declare class KtMenuTrigger {
91
+ private readonly host;
92
+ private readonly ariaTrigger;
93
+ private readonly platformId;
94
+ private readonly idGen;
95
+ protected readonly anchorName: string;
96
+ constructor();
97
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtMenuTrigger, never>;
98
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtMenuTrigger, "[ktMenuTrigger]", never, {}, {}, never, never, true, never>;
99
+ }
100
+
101
+ /**
102
+ * `[ktMenuItemCheckbox]` — case à cocher de menu (bascule indépendante). À poser sur un
103
+ * `[ngMenuItem] role="menuitemcheckbox"`. Bind `aria-checked` et bascule `checked` à l'activation.
104
+ *
105
+ * @example
106
+ * ```html
107
+ * <button ngMenuItem ktMenuItem ktMenuItemCheckbox role="menuitemcheckbox" [(checked)]="wrap">
108
+ * Retour à la ligne
109
+ * </button>
110
+ * ```
111
+ */
112
+ declare class KtMenuItemCheckbox {
113
+ private readonly ariaItem;
114
+ /** État coché, bidirectionnel : `[(checked)]`. */
115
+ readonly checked: i0.ModelSignal<boolean>;
116
+ protected activate(event: Event): void;
117
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtMenuItemCheckbox, never>;
118
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtMenuItemCheckbox, "[ktMenuItemCheckbox]", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, never, true, never>;
119
+ }
120
+ /** Source de la valeur sélectionnée d'un groupe radio, exposée aux `[ktMenuItemRadio]` enfants. */
121
+ declare const KT_MENU_RADIO_GROUP: InjectionToken<KtMenuRadioGroup<unknown>>;
122
+ /**
123
+ * `[ktMenuRadioGroup]` — coordinateur d'un groupe d'items radio mutuellement exclusifs. À poser sur
124
+ * un conteneur englobant les `[ktMenuItemRadio]` (typiquement un `role="group"`). Détient la valeur
125
+ * sélectionnée ; chaque radio s'y compare pour son `aria-checked` et la met à jour à l'activation.
126
+ *
127
+ * @example
128
+ * ```html
129
+ * <div role="group" ktMenuRadioGroup [(value)]="sortBy" aria-label="Trier par">
130
+ * <button ngMenuItem ktMenuItem ktMenuItemRadio role="menuitemradio" [value]="'name'">Nom</button>
131
+ * <button ngMenuItem ktMenuItem ktMenuItemRadio role="menuitemradio" [value]="'date'">Date</button>
132
+ * </div>
133
+ * ```
134
+ */
135
+ declare class KtMenuRadioGroup<V> {
136
+ /** Valeur sélectionnée du groupe, bidirectionnelle : `[(value)]`. */
137
+ readonly value: i0.ModelSignal<V | null>;
138
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtMenuRadioGroup<any>, never>;
139
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtMenuRadioGroup<any>, "[ktMenuRadioGroup]", ["ktMenuRadioGroup"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
140
+ }
141
+ /**
142
+ * `[ktMenuItemRadio]` — bouton radio de menu. À poser sur un `[ngMenuItem] role="menuitemradio"`
143
+ * dans un `[ktMenuRadioGroup]`. `aria-checked` reflète l'égalité avec la valeur du groupe ;
144
+ * l'activation sélectionne cette valeur.
145
+ *
146
+ * @example
147
+ * ```html
148
+ * <button ngMenuItem ktMenuItem ktMenuItemRadio role="menuitemradio" [value]="'name'">Trier par nom</button>
149
+ * ```
150
+ */
151
+ declare class KtMenuItemRadio<V> {
152
+ private readonly ariaItem;
153
+ private readonly group;
154
+ /** Valeur portée par ce radio (comparée à celle du groupe). */
155
+ readonly value: i0.InputSignal<V>;
156
+ protected readonly checked: i0.Signal<boolean>;
157
+ constructor();
158
+ protected activate(event: Event): void;
159
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtMenuItemRadio<any>, never>;
160
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtMenuItemRadio<any>, "[ktMenuItemRadio]", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
161
+ }
162
+
163
+ /**
164
+ * Import ergonomique de toute la famille menu (couche de THÈME ktortu) en une fois :
165
+ * `imports: [KT_MENU]` au lieu d'énumérer chaque directive. À composer avec les directives
166
+ * d'`@angular/aria/menu` (`Menu`, `MenuItem`, `MenuTrigger`, `MenuContent`), qui apportent le
167
+ * comportement accessible.
168
+ */
169
+ declare const KT_MENU: readonly [typeof KtMenu, typeof KtMenuItem, typeof KtMenuSeparator, typeof KtMenuTrigger, typeof KtMenuItemCheckbox, typeof KtMenuItemRadio, typeof KtMenuRadioGroup];
170
+
171
+ export { KT_MENU, KT_MENU_RADIO_GROUP, KtMenu, KtMenuItem, KtMenuItemCheckbox, KtMenuItemRadio, KtMenuRadioGroup, KtMenuSeparator, KtMenuTrigger };
@@ -0,0 +1,27 @@
1
+ import * as i0 from '@angular/core';
2
+
3
+ /**
4
+ * Amène l'onglet sélectionné dans la zone visible quand la liste d'onglets déborde et défile
5
+ * (cf. tabs.css). Le focus clavier d'`@angular/aria` scrolle déjà l'onglet focalisé ; cette
6
+ * directive couvre ce que le CSS seul ne peut pas faire de façon fiable : l'onglet actif
7
+ * **hors-champ au montage** et lors d'un **changement de sélection programmatique**.
8
+ *
9
+ * Opt-in, à poser sur `[ngTabList]` :
10
+ *
11
+ * @example
12
+ * ```html
13
+ * <ul ngTabList ktTabScroll [(selectedTab)]="tab"> … </ul>
14
+ * ```
15
+ *
16
+ * Intégrée réactivement avec `@angular/aria/tabs` via son `ModelSignal` `selectedTab`.
17
+ */
18
+ declare class KtTabScroll {
19
+ private readonly list;
20
+ private readonly tabList;
21
+ constructor();
22
+ private scrollSelectedIntoView;
23
+ static ɵfac: i0.ɵɵFactoryDeclaration<KtTabScroll, never>;
24
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KtTabScroll, "[ngTabList][ktTabScroll]", never, {}, {}, never, never, true, never>;
25
+ }
26
+
27
+ export { KtTabScroll };
@@ -0,0 +1,90 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, OnDestroy, TemplateRef, Provider } from '@angular/core';
3
+
4
+ type KtTooltipPosition = 'top' | 'bottom' | 'left' | 'right';
5
+ interface KtTooltipConfig {
6
+ showDelay: number;
7
+ hideDelay: number;
8
+ position: KtTooltipPosition;
9
+ }
10
+ declare const KT_TOOLTIP_CONFIG: InjectionToken<Partial<KtTooltipConfig>>;
11
+ /**
12
+ * Fournit des défauts d'infobulle (délais, position) pour un sous-arbre ou l'application entière.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * providers: [provideKtTooltip({ showDelay: 300, position: 'bottom' })]
17
+ * ```
18
+ */
19
+ declare function provideKtTooltip(config: Partial<KtTooltipConfig>): Provider;
20
+ /**
21
+ * Infobulle accessible posée sur n'importe quel élément focusable/survolable.
22
+ * Apparaît au survol et au focus, reste « hoverable » (WCAG 1.4.13) et se ferme
23
+ * par Échap. Le contenu peut être un texte simple ou un `TemplateRef` **non interactif**
24
+ * (un `role="tooltip"` ne doit pas contenir de lien/bouton/champ).
25
+ *
26
+ * @example
27
+ * ```html
28
+ * <button ktTooltip="Enregistrer le brouillon">Enregistrer</button>
29
+ * <span ktTooltip="Aide" tooltipPosition="right" [showDelay]="300">?</span>
30
+ * ```
31
+ */
32
+ declare class KtTooltip implements OnDestroy {
33
+ private readonly config;
34
+ private readonly doc;
35
+ private readonly host;
36
+ private readonly renderer;
37
+ private readonly vcr;
38
+ private readonly ngZone;
39
+ private readonly platformId;
40
+ /** Contenu de l'infobulle : texte simple (injecté en `textContent`) ou `TemplateRef` non interactif. */
41
+ readonly ktTooltip: _angular_core.InputSignal<string | TemplateRef<unknown>>;
42
+ /** Position de l'infobulle autour de la cible. @default 'top' (ou KT_TOOLTIP_CONFIG.position) */
43
+ readonly tooltipPosition: _angular_core.InputSignal<KtTooltipPosition>;
44
+ /** Désactive l'affichage de l'infobulle. @default false */
45
+ readonly tooltipDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
46
+ /** Délai (ms) avant apparition au survol/focus. @default 150 (ou KT_TOOLTIP_CONFIG.showDelay) */
47
+ readonly showDelay: _angular_core.InputSignal<number>;
48
+ /** Délai (ms) avant masquage ; laisse le temps d'amener le pointeur sur l'infobulle (WCAG « hoverable »). @default 100 (ou KT_TOOLTIP_CONFIG.hideDelay) */
49
+ readonly hideDelay: _angular_core.InputSignal<number>;
50
+ private readonly idGen;
51
+ private readonly uid;
52
+ private readonly tooltipId;
53
+ readonly idForA11y: string;
54
+ private readonly anchorName;
55
+ /** Vrai quand l'infobulle est susceptible de s'afficher (contenu non vide et non désactivée).
56
+ Public : lu par `KtField` pour câbler `aria-describedby` du contrôle sur l'infobulle d'aide. */
57
+ readonly isActive: _angular_core.Signal<boolean>;
58
+ protected describedById: _angular_core.Signal<string | null>;
59
+ private tip;
60
+ private view;
61
+ private listeners;
62
+ private showTimer;
63
+ private hideTimer;
64
+ private readonly isShown;
65
+ private _supportsAnchor;
66
+ private get supportsAnchor();
67
+ private fallbackListeners;
68
+ private activeTemplate;
69
+ private escListener;
70
+ constructor();
71
+ ngOnDestroy(): void;
72
+ protected show(): void;
73
+ protected hide(): void;
74
+ protected onEscape(event: Event): void;
75
+ private dismiss;
76
+ private ensureTip;
77
+ private registerEscapeListener;
78
+ private syncContent;
79
+ private clearContent;
80
+ private warnIfInteractive;
81
+ private destroyTip;
82
+ private positionFallback;
83
+ private registerFallbackListeners;
84
+ private clearFallbackListeners;
85
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KtTooltip, never>;
86
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<KtTooltip, "[ktTooltip]", never, { "ktTooltip": { "alias": "ktTooltip"; "required": true; "isSignal": true; }; "tooltipPosition": { "alias": "tooltipPosition"; "required": false; "isSignal": true; }; "tooltipDisabled": { "alias": "tooltipDisabled"; "required": false; "isSignal": true; }; "showDelay": { "alias": "showDelay"; "required": false; "isSignal": true; }; "hideDelay": { "alias": "hideDelay"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
87
+ }
88
+
89
+ export { KT_TOOLTIP_CONFIG, KtTooltip, provideKtTooltip };
90
+ export type { KtTooltipConfig, KtTooltipPosition };
@@ -0,0 +1,8 @@
1
+ export * from '@ktortu/aaa/button';
2
+ export * from '@ktortu/aaa/card';
3
+ export * from '@ktortu/aaa/cdk';
4
+ export * from '@ktortu/aaa/dialog';
5
+ export * from '@ktortu/aaa/forms';
6
+ export * from '@ktortu/aaa/menu';
7
+ export * from '@ktortu/aaa/tabs';
8
+ export * from '@ktortu/aaa/tooltip';