@tekus/design-system 5.37.0 → 5.38.1

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 (60) hide show
  1. package/assets/tokens/tk-foundations.json +4 -0
  2. package/fesm2022/tekus-design-system-components-autocomplete.mjs +7 -17
  3. package/fesm2022/tekus-design-system-components-autocomplete.mjs.map +1 -1
  4. package/fesm2022/tekus-design-system-components-avatar.mjs +120 -0
  5. package/fesm2022/tekus-design-system-components-avatar.mjs.map +1 -0
  6. package/fesm2022/tekus-design-system-components-button.mjs +2 -2
  7. package/fesm2022/tekus-design-system-components-button.mjs.map +1 -1
  8. package/fesm2022/tekus-design-system-components-card.mjs +1 -1
  9. package/fesm2022/tekus-design-system-components-card.mjs.map +1 -1
  10. package/fesm2022/tekus-design-system-components-checkbox.mjs +9 -3
  11. package/fesm2022/tekus-design-system-components-checkbox.mjs.map +1 -1
  12. package/fesm2022/tekus-design-system-components-date-picker.mjs +16 -3
  13. package/fesm2022/tekus-design-system-components-date-picker.mjs.map +1 -1
  14. package/fesm2022/tekus-design-system-components-input-number.mjs +37 -3
  15. package/fesm2022/tekus-design-system-components-input-number.mjs.map +1 -1
  16. package/fesm2022/tekus-design-system-components-input-text.mjs +2 -2
  17. package/fesm2022/tekus-design-system-components-input-text.mjs.map +1 -1
  18. package/fesm2022/tekus-design-system-components-menu.mjs +2 -2
  19. package/fesm2022/tekus-design-system-components-menu.mjs.map +1 -1
  20. package/fesm2022/tekus-design-system-components-multiselect.mjs +2 -2
  21. package/fesm2022/tekus-design-system-components-multiselect.mjs.map +1 -1
  22. package/fesm2022/tekus-design-system-components-panel-menu.mjs +2 -2
  23. package/fesm2022/tekus-design-system-components-panel-menu.mjs.map +1 -1
  24. package/fesm2022/tekus-design-system-components-radio-button.mjs +9 -3
  25. package/fesm2022/tekus-design-system-components-radio-button.mjs.map +1 -1
  26. package/fesm2022/tekus-design-system-components-select.mjs +37 -32
  27. package/fesm2022/tekus-design-system-components-select.mjs.map +1 -1
  28. package/fesm2022/tekus-design-system-components-sidebar-layout.mjs +2 -2
  29. package/fesm2022/tekus-design-system-components-sidebar-layout.mjs.map +1 -1
  30. package/fesm2022/tekus-design-system-components-table.mjs +1 -1
  31. package/fesm2022/tekus-design-system-components-table.mjs.map +1 -1
  32. package/fesm2022/tekus-design-system-components-tabs.mjs +2 -2
  33. package/fesm2022/tekus-design-system-components-tabs.mjs.map +1 -1
  34. package/fesm2022/tekus-design-system-components-textarea.mjs +2 -2
  35. package/fesm2022/tekus-design-system-components-textarea.mjs.map +1 -1
  36. package/fesm2022/tekus-design-system-components-time-picker.mjs +13 -3
  37. package/fesm2022/tekus-design-system-components-time-picker.mjs.map +1 -1
  38. package/fesm2022/tekus-design-system-components-toggle.mjs +4 -3
  39. package/fesm2022/tekus-design-system-components-toggle.mjs.map +1 -1
  40. package/fesm2022/tekus-design-system-components-toolbar.mjs +2 -2
  41. package/fesm2022/tekus-design-system-components-toolbar.mjs.map +1 -1
  42. package/fesm2022/tekus-design-system-components-topbar.mjs +2 -2
  43. package/fesm2022/tekus-design-system-components-topbar.mjs.map +1 -1
  44. package/fesm2022/tekus-design-system-core-types.mjs +4 -3
  45. package/fesm2022/tekus-design-system-core-types.mjs.map +1 -1
  46. package/fesm2022/tekus-design-system-core.mjs +4 -3
  47. package/fesm2022/tekus-design-system-core.mjs.map +1 -1
  48. package/package.json +5 -1
  49. package/scss/_config.scss +242 -0
  50. package/scss/tk-bundle.scss +105 -0
  51. package/styles/variables.css +1 -0
  52. package/types/tekus-design-system-components-autocomplete.d.ts +3 -12
  53. package/types/tekus-design-system-components-avatar.d.ts +104 -0
  54. package/types/tekus-design-system-components-checkbox.d.ts +7 -1
  55. package/types/tekus-design-system-components-date-picker.d.ts +11 -1
  56. package/types/tekus-design-system-components-input-number.d.ts +35 -1
  57. package/types/tekus-design-system-components-radio-button.d.ts +7 -1
  58. package/types/tekus-design-system-components-select.d.ts +2 -6
  59. package/types/tekus-design-system-components-time-picker.d.ts +8 -1
  60. package/types/tekus-design-system-components-toggle.d.ts +2 -1
@@ -0,0 +1,242 @@
1
+ // Internal configuration module — not for direct consumer import.
2
+ // All default color values match tk-foundations.json exactly.
3
+
4
+ @use 'sass:color';
5
+ @use 'sass:math';
6
+
7
+ // ── Configurable API ──────────────────────────────────────────────────────────
8
+ $config-brand: 'default' !default; // 'default' | 'brand-a' | 'brand-b'
9
+ $config-scale: null !default; // html font-size multiplier — overrides the brand's suggested scale
10
+ $config-primary: null !default; // hex color — auto-generates 11-step primary palette
11
+ $config-secondary: null !default; // hex color — auto-generates 11-step secondary palette
12
+ $config-accent: null !default; // hex color — auto-generates 11-step accent palette
13
+ $config-border-radius: null !default; // 'rounded' | 'pill' | 'square' — overrides the brand's default radius style
14
+
15
+ // ── Palette generation ────────────────────────────────────────────────────────
16
+ // Places $base at step 500; steps 50-400 mix toward white, steps 600-950 toward black.
17
+ // Components are rounded so Sass emits clean hex values instead of rgb() decimals.
18
+ @function _tk-palette-step($base, $step) {
19
+ $mixed: $base;
20
+ @if $step == 50 { $mixed: color.mix(white, $base, 91%); }
21
+ @else if $step == 100 { $mixed: color.mix(white, $base, 83%); }
22
+ @else if $step == 200 { $mixed: color.mix(white, $base, 67%); }
23
+ @else if $step == 300 { $mixed: color.mix(white, $base, 48%); }
24
+ @else if $step == 400 { $mixed: color.mix(white, $base, 28%); }
25
+ @else if $step == 600 { $mixed: color.mix($base, black, 85%); }
26
+ @else if $step == 700 { $mixed: color.mix($base, black, 70%); }
27
+ @else if $step == 800 { $mixed: color.mix($base, black, 52%); }
28
+ @else if $step == 900 { $mixed: color.mix($base, black, 35%); }
29
+ @else if $step == 950 { $mixed: color.mix($base, black, 20%); }
30
+ // Round components and return as a legacy sRGB color so Sass serializes to hex
31
+ @return color.change($mixed,
32
+ $red: math.round(color.channel($mixed, "red", $space: rgb)),
33
+ $green: math.round(color.channel($mixed, "green", $space: rgb)),
34
+ $blue: math.round(color.channel($mixed, "blue", $space: rgb))
35
+ );
36
+ }
37
+
38
+ // ── Default brand palettes ────────────────────────────────────────────────────
39
+ // Primary and accent are null for the default brand — variables.css already
40
+ // defines these values, so there's no need to duplicate them here.
41
+ // They are populated only when a brand preset or $config-primary/$config-accent is set.
42
+ $brand-primary-50: null;
43
+ $brand-primary-100: null;
44
+ $brand-primary-200: null;
45
+ $brand-primary-300: null;
46
+ $brand-primary-400: null;
47
+ $brand-primary-500: null;
48
+ $brand-primary-600: null;
49
+ $brand-primary-700: null;
50
+ $brand-primary-800: null;
51
+ $brand-primary-900: null;
52
+ $brand-primary-950: null;
53
+
54
+ $brand-accent-50: null;
55
+ $brand-accent-100: null;
56
+ $brand-accent-200: null;
57
+ $brand-accent-300: null;
58
+ $brand-accent-400: null;
59
+ $brand-accent-500: null;
60
+ $brand-accent-600: null;
61
+ $brand-accent-700: null;
62
+ $brand-accent-800: null;
63
+ $brand-accent-900: null;
64
+ $brand-accent-950: null;
65
+
66
+ // Secondary palette — defaults to the surface palette tokens from variables.css.
67
+ // Using var() cross-references so secondary tracks surface automatically.
68
+ // Override with $config-secondary: #hex to generate a fully custom palette.
69
+ $brand-secondary-50: var(--tk-color-base-surface-50);
70
+ $brand-secondary-100: var(--tk-color-base-surface-100);
71
+ $brand-secondary-200: var(--tk-color-base-surface-200);
72
+ $brand-secondary-300: var(--tk-color-base-surface-300);
73
+ $brand-secondary-400: var(--tk-color-base-surface-400);
74
+ $brand-secondary-500: var(--tk-color-base-surface-500);
75
+ $brand-secondary-600: var(--tk-color-base-surface-600);
76
+ $brand-secondary-700: var(--tk-color-base-surface-700);
77
+ $brand-secondary-800: var(--tk-color-base-surface-800);
78
+ $brand-secondary-900: var(--tk-color-base-surface-900);
79
+ $brand-secondary-950: var(--tk-color-base-surface-950);
80
+
81
+ // Typography
82
+ $brand-font-family: 'Poppins', sans-serif;
83
+
84
+ // Border radius style suggested by the brand — overridden by an explicit
85
+ // $config-border-radius. 'default' (rounded) | 'sharp' | 'soft' | 'pill'
86
+ $brand-radius-style: 'default';
87
+
88
+ // Rem scale suggested by the brand — overridden by an explicit $config-scale,
89
+ // same precedence as $brand-radius-style above.
90
+ $brand-scale: 1;
91
+
92
+ // ── Brand overrides ───────────────────────────────────────────────────────────
93
+ // Each brand declares all 11 primary + 11 accent shades so no shade leaks
94
+ // in from the default brand.
95
+
96
+ @if $config-brand == 'brand-a' {
97
+ // Primary: warm red
98
+ $brand-primary-50: #ffe8ec;
99
+ $brand-primary-100: #ffc1cc;
100
+ $brand-primary-200: #ff96a8;
101
+ $brand-primary-300: #ff6b83;
102
+ $brand-primary-400: #f5395c;
103
+ $brand-primary-500: #e40040;
104
+ $brand-primary-600: #c90039;
105
+ $brand-primary-700: #ad0031;
106
+ $brand-primary-800: #8a0027;
107
+ $brand-primary-900: #66001d;
108
+ $brand-primary-950: #3d0011;
109
+
110
+ // Accent: same hue (monochromatic brand)
111
+ $brand-accent-50: #ffe8ec;
112
+ $brand-accent-100: #ffc1cc;
113
+ $brand-accent-200: #ff96a8;
114
+ $brand-accent-300: #ff6b83;
115
+ $brand-accent-400: #f5395c;
116
+ $brand-accent-500: #e40040;
117
+ $brand-accent-600: #c90039;
118
+ $brand-accent-700: #ad0031;
119
+ $brand-accent-800: #8a0027;
120
+ $brand-accent-900: #66001d;
121
+ $brand-accent-950: #3d0011;
122
+
123
+ $brand-font-family: 'Inter', sans-serif;
124
+ $brand-radius-style: 'pill';
125
+ }
126
+
127
+ @else if $config-brand == 'brand-b' {
128
+ // Primary: corporate blue
129
+ $brand-primary-50: #e0f1fb;
130
+ $brand-primary-100: #b3d9f5;
131
+ $brand-primary-200: #80bfed;
132
+ $brand-primary-300: #4da5e5;
133
+ $brand-primary-400: #2691db;
134
+ $brand-primary-500: #007bc4;
135
+ $brand-primary-600: #006cb0;
136
+ $brand-primary-700: #005a96;
137
+ $brand-primary-800: #00477a;
138
+ $brand-primary-900: #003460;
139
+ $brand-primary-950: #001e3a;
140
+
141
+ // Accent: complementary teal
142
+ $brand-accent-50: #e0f7f4;
143
+ $brand-accent-100: #b3ece4;
144
+ $brand-accent-200: #80ded2;
145
+ $brand-accent-300: #4dd0bf;
146
+ $brand-accent-400: #26c5b0;
147
+ $brand-accent-500: #00b8a0;
148
+ $brand-accent-600: #00a390;
149
+ $brand-accent-700: #008a7a;
150
+ $brand-accent-800: #006e61;
151
+ $brand-accent-900: #005249;
152
+ $brand-accent-950: #003330;
153
+
154
+ $brand-font-family: 'Poppins', sans-serif;
155
+ $brand-radius-style: 'soft';
156
+ $brand-scale: 0.95;
157
+ }
158
+
159
+ // ── Resolved scale ────────────────────────────────────────────────────────────
160
+ // An explicit $config-scale always wins over the brand's suggested scale;
161
+ // $brand-scale applies only when the consumer left it unset.
162
+ $scale: if($config-scale, $config-scale, $brand-scale);
163
+
164
+ // ── Border radius (scale handled separately by html font-size) ────────────────
165
+ // $config-border-radius, when set, overrides the brand's suggested style —
166
+ // same precedence as $config-primary/$config-secondary/$config-accent.
167
+ $radius-style: if($config-border-radius, $config-border-radius, $brand-radius-style);
168
+
169
+ $radius-xs: var(--tk-borderRadius-xs);
170
+ $radius-s: var(--tk-borderRadius-s);
171
+ $radius-m: var(--tk-borderRadius-m);
172
+ // The `l` slot is the "fully rounded" step: it is consumed only by pill-shaped
173
+ // surfaces (tag, multiselect chip, autocomplete chip), which were `full` before
174
+ // this theming layer existed. Basing it on --tk-borderRadius-l would silently
175
+ // shrink them from 62.4375rem to 1.5rem under the default/soft styles.
176
+ $radius-l: var(--tk-borderRadius-full);
177
+ // The `xl` slot is the *actual* adaptive counterpart of --tk-borderRadius-l
178
+ // (1.5rem), consumed by large decorative surfaces such as the avatar in its
179
+ // `l`/`xl` sizes. It exists as a separate slot because the `l` name above was
180
+ // already taken by the fully-rounded/pill step.
181
+ $radius-xl: var(--tk-borderRadius-l);
182
+
183
+ @if $radius-style == 'sharp' or $radius-style == 'square' {
184
+ $radius-xs: var(--tk-borderRadius-null);
185
+ $radius-s: var(--tk-borderRadius-null);
186
+ $radius-m: var(--tk-borderRadius-null);
187
+ $radius-l: var(--tk-borderRadius-null);
188
+ $radius-xl: var(--tk-borderRadius-null);
189
+ } @else if $radius-style == 'pill' {
190
+ $radius-xs: var(--tk-borderRadius-full);
191
+ $radius-s: var(--tk-borderRadius-full);
192
+ $radius-m: var(--tk-borderRadius-full);
193
+ $radius-l: var(--tk-borderRadius-full);
194
+ $radius-xl: var(--tk-borderRadius-full);
195
+ } @else if $radius-style == 'soft' {
196
+ $radius-m: 0.75rem;
197
+ }
198
+ // 'default' / 'rounded' → no override; keep the base values above as-is.
199
+
200
+ // ── Custom palette overrides (applied after brand presets) ────────────────────
201
+ // Custom colors override brand preset colors. Custom override at step 500 = the exact input hex.
202
+ @if $config-primary {
203
+ $brand-primary-50: _tk-palette-step($config-primary, 50);
204
+ $brand-primary-100: _tk-palette-step($config-primary, 100);
205
+ $brand-primary-200: _tk-palette-step($config-primary, 200);
206
+ $brand-primary-300: _tk-palette-step($config-primary, 300);
207
+ $brand-primary-400: _tk-palette-step($config-primary, 400);
208
+ $brand-primary-500: _tk-palette-step($config-primary, 500);
209
+ $brand-primary-600: _tk-palette-step($config-primary, 600);
210
+ $brand-primary-700: _tk-palette-step($config-primary, 700);
211
+ $brand-primary-800: _tk-palette-step($config-primary, 800);
212
+ $brand-primary-900: _tk-palette-step($config-primary, 900);
213
+ $brand-primary-950: _tk-palette-step($config-primary, 950);
214
+ }
215
+
216
+ @if $config-secondary {
217
+ $brand-secondary-50: _tk-palette-step($config-secondary, 50);
218
+ $brand-secondary-100: _tk-palette-step($config-secondary, 100);
219
+ $brand-secondary-200: _tk-palette-step($config-secondary, 200);
220
+ $brand-secondary-300: _tk-palette-step($config-secondary, 300);
221
+ $brand-secondary-400: _tk-palette-step($config-secondary, 400);
222
+ $brand-secondary-500: _tk-palette-step($config-secondary, 500);
223
+ $brand-secondary-600: _tk-palette-step($config-secondary, 600);
224
+ $brand-secondary-700: _tk-palette-step($config-secondary, 700);
225
+ $brand-secondary-800: _tk-palette-step($config-secondary, 800);
226
+ $brand-secondary-900: _tk-palette-step($config-secondary, 900);
227
+ $brand-secondary-950: _tk-palette-step($config-secondary, 950);
228
+ }
229
+
230
+ @if $config-accent {
231
+ $brand-accent-50: _tk-palette-step($config-accent, 50);
232
+ $brand-accent-100: _tk-palette-step($config-accent, 100);
233
+ $brand-accent-200: _tk-palette-step($config-accent, 200);
234
+ $brand-accent-300: _tk-palette-step($config-accent, 300);
235
+ $brand-accent-400: _tk-palette-step($config-accent, 400);
236
+ $brand-accent-500: _tk-palette-step($config-accent, 500);
237
+ $brand-accent-600: _tk-palette-step($config-accent, 600);
238
+ $brand-accent-700: _tk-palette-step($config-accent, 700);
239
+ $brand-accent-800: _tk-palette-step($config-accent, 800);
240
+ $brand-accent-900: _tk-palette-step($config-accent, 900);
241
+ $brand-accent-950: _tk-palette-step($config-accent, 950);
242
+ }
@@ -0,0 +1,105 @@
1
+ // Public entry point for the configurable token bundle.
2
+ //
3
+ // Consumer usage (in end-project global stylesheet):
4
+ // @use '@tekus/design-system/scss/tk-bundle' with (
5
+ // $config-brand: 'brand-a', // preset brand (optional)
6
+ // $config-scale: 1.1, // rem scale multiplier (optional)
7
+ // $config-primary: #e40040, // custom primary hex → auto-generates 11-step palette
8
+ // $config-secondary: #007bc4, // custom secondary hex → emits --tk-color-base-secondary-*
9
+ // $config-accent: #00b8a0, // custom accent hex → overrides brand accent palette
10
+ // $config-border-radius: 'pill', // 'rounded' | 'pill' | 'square' (optional)
11
+ // );
12
+ //
13
+ // Scale is applied as an html font-size multiplier so ALL rem-based tokens
14
+ // (spacing, typography, radius, component sizes) scale uniformly without
15
+ // enumerating individual tokens.
16
+ //
17
+ // Brand sets preset primary/accent palettes, font-family, and border-radius style.
18
+ // Custom color params override those presets (or generate new palettes for secondary).
19
+ // Omitted params fall back to brand preset values.
20
+ //
21
+ // Border radius has 3 styles: 'rounded' (default — current token values, unchanged),
22
+ // 'pill' (fully rounded m/l radii, e.g. buttons/chips), and 'square' (no radius at all).
23
+ // When set, it overrides whatever radius style the selected brand suggests.
24
+
25
+ $config-brand: 'default' !default;
26
+ $config-scale: null !default;
27
+ $config-primary: null !default;
28
+ $config-secondary: null !default;
29
+ $config-accent: null !default;
30
+ $config-border-radius: null !default;
31
+
32
+ @use 'config' as cfg with (
33
+ $config-brand: $config-brand,
34
+ $config-scale: $config-scale,
35
+ $config-primary: $config-primary,
36
+ $config-secondary: $config-secondary,
37
+ $config-accent: $config-accent,
38
+ $config-border-radius: $config-border-radius
39
+ );
40
+
41
+ html {
42
+ font-size: calc(100% * #{cfg.$scale});
43
+ }
44
+
45
+ :root {
46
+ // ── Primary palette (only when brand or $config-primary is active) ─────────
47
+ // Default brand skips this block — variables.css defines primary values and
48
+ // re-emitting them as var() self-references would create an invalid CSS cycle.
49
+ @if cfg.$brand-primary-50 {
50
+ --tk-color-base-primary-50: #{cfg.$brand-primary-50};
51
+ --tk-color-base-primary-100: #{cfg.$brand-primary-100};
52
+ --tk-color-base-primary-200: #{cfg.$brand-primary-200};
53
+ --tk-color-base-primary-300: #{cfg.$brand-primary-300};
54
+ --tk-color-base-primary-400: #{cfg.$brand-primary-400};
55
+ --tk-color-base-primary-500: #{cfg.$brand-primary-500};
56
+ --tk-color-base-primary-600: #{cfg.$brand-primary-600};
57
+ --tk-color-base-primary-700: #{cfg.$brand-primary-700};
58
+ --tk-color-base-primary-800: #{cfg.$brand-primary-800};
59
+ --tk-color-base-primary-900: #{cfg.$brand-primary-900};
60
+ --tk-color-base-primary-950: #{cfg.$brand-primary-950};
61
+ }
62
+
63
+ // ── Accent palette (only when brand or $config-accent is active) ───────────
64
+ @if cfg.$brand-accent-50 {
65
+ --tk-color-base-accent-50: #{cfg.$brand-accent-50};
66
+ --tk-color-base-accent-100: #{cfg.$brand-accent-100};
67
+ --tk-color-base-accent-200: #{cfg.$brand-accent-200};
68
+ --tk-color-base-accent-300: #{cfg.$brand-accent-300};
69
+ --tk-color-base-accent-400: #{cfg.$brand-accent-400};
70
+ --tk-color-base-accent-500: #{cfg.$brand-accent-500};
71
+ --tk-color-base-accent-600: #{cfg.$brand-accent-600};
72
+ --tk-color-base-accent-700: #{cfg.$brand-accent-700};
73
+ --tk-color-base-accent-800: #{cfg.$brand-accent-800};
74
+ --tk-color-base-accent-900: #{cfg.$brand-accent-900};
75
+ --tk-color-base-accent-950: #{cfg.$brand-accent-950};
76
+ }
77
+
78
+ // ── Secondary palette (always emitted; defaults to surface palette) ─────────
79
+ --tk-color-base-secondary-50: #{cfg.$brand-secondary-50};
80
+ --tk-color-base-secondary-100: #{cfg.$brand-secondary-100};
81
+ --tk-color-base-secondary-200: #{cfg.$brand-secondary-200};
82
+ --tk-color-base-secondary-300: #{cfg.$brand-secondary-300};
83
+ --tk-color-base-secondary-400: #{cfg.$brand-secondary-400};
84
+ --tk-color-base-secondary-500: #{cfg.$brand-secondary-500};
85
+ --tk-color-base-secondary-600: #{cfg.$brand-secondary-600};
86
+ --tk-color-base-secondary-700: #{cfg.$brand-secondary-700};
87
+ --tk-color-base-secondary-800: #{cfg.$brand-secondary-800};
88
+ --tk-color-base-secondary-900: #{cfg.$brand-secondary-900};
89
+ --tk-color-base-secondary-950: #{cfg.$brand-secondary-950};
90
+
91
+ // ── Typography ─────────────────────────────────────────────────────────────
92
+ --tk-font-family: #{cfg.$brand-font-family};
93
+
94
+ // ── Brand-adaptive border radius ───────────────────────────────────────────
95
+ // Use these tokens where you want brand-style adaptation (buttons, inputs, cards).
96
+ // Keep --tk-borderRadius-xs/s/m/l for strict, non-adaptive values.
97
+ // Note: the `theme-l` step is the pill/fully-rounded slot — it resolves to
98
+ // --tk-borderRadius-full under every style except 'square'/'sharp'. It is NOT
99
+ // the adaptive counterpart of --tk-borderRadius-l; that one is `theme-xl`.
100
+ --tk-borderRadius-theme-xs: #{cfg.$radius-xs};
101
+ --tk-borderRadius-theme-s: #{cfg.$radius-s};
102
+ --tk-borderRadius-theme-m: #{cfg.$radius-m};
103
+ --tk-borderRadius-theme-l: #{cfg.$radius-l};
104
+ --tk-borderRadius-theme-xl: #{cfg.$radius-xl};
105
+ }
@@ -177,6 +177,7 @@
177
177
  --tk-size-base-100: 1rem;
178
178
  --tk-size-base-150: 1.5rem;
179
179
  --tk-size-base-200: 2rem;
180
+ --tk-size-base-250: 2.5rem;
180
181
  --tk-size-base-500: 5rem;
181
182
  --tk-size-base-1000: 10rem;
182
183
  --tk-size-base-2000: 20rem;
@@ -68,16 +68,6 @@ declare class AutocompleteComponent<T = unknown> implements ControlValueAccessor
68
68
  * Allows usage with the syntax: `[(model)]="myValue"`.
69
69
  */
70
70
  model: _angular_core.ModelSignal<AutocompleteValue<T> | undefined>;
71
- /**
72
- * @event modelChange
73
- * @description
74
- * Emits whenever the value changes.
75
- * Payload: the selected item(s) of type `AutocompleteValue<T>`.
76
- *
77
- * @example
78
- * <tk-autocomplete (modelChange)="onChange($event)"></tk-autocomplete>
79
- */
80
- modelChange: _angular_core.OutputEmitterRef<AutocompleteValue<T>>;
81
71
  private onChangeFn;
82
72
  private onTouchedFn;
83
73
  private readonly init;
@@ -121,7 +111,8 @@ declare class AutocompleteComponent<T = unknown> implements ControlValueAccessor
121
111
  * @method handleChange
122
112
  * @description
123
113
  * Handles value changes from the autocomplete component.
124
- * Updates Angular Forms, Signals, and emits the modelChange event.
114
+ * Updates Angular Forms and Signals. `model.set()` emits the model's
115
+ * auto-generated `modelChange` output — no separate emit needed.
125
116
  *
126
117
  * @param {AutocompleteValue<T>} value - The new selected value(s).
127
118
  */
@@ -150,7 +141,7 @@ declare class AutocompleteComponent<T = unknown> implements ControlValueAccessor
150
141
  */
151
142
  get effectiveControl(): FormControl | undefined;
152
143
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AutocompleteComponent<any>, never>;
153
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AutocompleteComponent<any>, "tk-autocomplete", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; "modelChange": "modelChange"; }, never, never, true, never>;
144
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AutocompleteComponent<any>, "tk-autocomplete", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "model": { "alias": "model"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; }, never, never, true, never>;
154
145
  }
155
146
 
156
147
  export { AutocompleteComponent };
@@ -0,0 +1,104 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ type AvatarVariant = 'text' | 'icon' | 'image';
4
+ type AvatarSeverity = 'secondary' | 'primary' | 'contrast';
5
+ type AvatarSize = 's' | 'm' | 'l' | 'xl';
6
+ /**
7
+ * Maximum number of characters rendered by the `'text'` variant. This variant is
8
+ * designed for initials (e.g. `'AB'`); longer strings break the layout at every
9
+ * size, so `value` is always truncated to this length rather than allowed to overflow.
10
+ */
11
+ declare const AVATAR_TEXT_MAX_LENGTH = 2;
12
+ /**
13
+ * @component AvatarComponent
14
+ * @description
15
+ * A component used to represent a user, entity, or placeholder with initials, an icon, or an image.
16
+ *
17
+ * This component supports:
18
+ * - `variant`: What the avatar displays. Options: `'text' | 'icon' | 'image'`.
19
+ * - `severity`: The color scheme of the avatar. Options: `'secondary' | 'primary' | 'contrast'`. Ignored when `variant` is `'image'`.
20
+ * - `size`: The size of the avatar. Options: `'s' | 'm' | 'l' | 'xl'`.
21
+ * - `value`: The initials to display for the `'text'` variant. Limited to 2 characters — longer values are truncated.
22
+ * - `icon`: The icon name to display for the `'icon'` variant, rendered via `tk-icon`.
23
+ * - `image` / `alt`: The image source and accessible text for the `'image'` variant.
24
+ * - `ariaLabel`: The accessible name for the `'text'` and `'icon'` variants.
25
+ *
26
+ * @usage
27
+ * ### Basic Usage
28
+ * ```html
29
+ * <tk-avatar variant="text" value="AB" severity="primary" size="m" ariaLabel="Ana Bermúdez"></tk-avatar>
30
+ * <tk-avatar variant="icon" icon="user" severity="secondary" size="m" ariaLabel="Usuario sin foto"></tk-avatar>
31
+ * <tk-avatar variant="image" image="/assets/avatar.png" alt="Ana Bermúdez" size="m"></tk-avatar>
32
+ * ```
33
+ */
34
+ declare class AvatarComponent {
35
+ /**
36
+ * What the avatar displays.
37
+ * @default 'text'
38
+ */
39
+ variant: _angular_core.InputSignal<AvatarVariant>;
40
+ /**
41
+ * The color scheme of the avatar. Ignored when `variant` is `'image'`.
42
+ * @default 'secondary'
43
+ */
44
+ severity: _angular_core.InputSignal<AvatarSeverity>;
45
+ /**
46
+ * The size of the avatar.
47
+ * @default 'm'
48
+ */
49
+ size: _angular_core.InputSignal<AvatarSize>;
50
+ /**
51
+ * The initials to display. Only used when `variant` is `'text'`.
52
+ *
53
+ * Limited to {@link AVATAR_TEXT_MAX_LENGTH} characters — this variant is meant
54
+ * for initials (e.g. `'AB'`), not arbitrary text. Longer values are silently
55
+ * truncated (see `displayValue`) since they overflow the avatar at every size.
56
+ */
57
+ value: _angular_core.InputSignal<string>;
58
+ /** The icon name to display, forwarded to `tk-icon`. Only used when `variant` is `'icon'`. */
59
+ icon: _angular_core.InputSignal<string>;
60
+ /** The image source. Only used when `variant` is `'image'`. */
61
+ image: _angular_core.InputSignal<string>;
62
+ /** The accessible alt text for the image. Only used when `variant` is `'image'`. */
63
+ alt: _angular_core.InputSignal<string>;
64
+ /**
65
+ * The accessible name announced by screen readers, for the `'text'` and
66
+ * `'icon'` variants. Should be the entity the avatar stands for (e.g. the
67
+ * user's full name), not a description of the graphic.
68
+ *
69
+ * Always worth setting: neither variant carries a meaningful name on its own —
70
+ * `'text'` would otherwise announce bare initials and `'icon'` the raw icon
71
+ * name. The `'image'` variant ignores this input and uses `alt` instead,
72
+ * since its `<img>` already provides the accessible name.
73
+ */
74
+ ariaLabel: _angular_core.InputSignal<string>;
75
+ /**
76
+ * The `value` truncated to {@link AVATAR_TEXT_MAX_LENGTH} characters. This is
77
+ * what actually gets rendered for the `'text'` variant.
78
+ */
79
+ displayValue: _angular_core.Signal<string>;
80
+ /**
81
+ * Whether the avatar exposes itself as a labelled image to assistive tech.
82
+ * True for every variant except `'image'`, which is excluded because its
83
+ * `<img [alt]>` already carries the accessible name — adding `role="img"`
84
+ * plus a label on the wrapper too would announce the avatar twice.
85
+ */
86
+ isLabelled: _angular_core.Signal<boolean>;
87
+ /**
88
+ * The accessible name actually rendered for the `'text'` and `'icon'`
89
+ * variants. Falls back to the displayed initials or the icon name when
90
+ * `ariaLabel` is not provided, so the avatar is never fully silent.
91
+ */
92
+ accessibleLabel: _angular_core.Signal<string>;
93
+ /**
94
+ * Computed host class (BEM block + modifiers) combining `variant` and `size`
95
+ * always, plus `severity` unless `variant` is `'image'` (severity doesn't
96
+ * apply to images).
97
+ */
98
+ hostClass: _angular_core.Signal<string>;
99
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AvatarComponent, never>;
100
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AvatarComponent, "tk-avatar", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "severity": { "alias": "severity"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "image": { "alias": "image"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
101
+ }
102
+
103
+ export { AVATAR_TEXT_MAX_LENGTH, AvatarComponent };
104
+ export type { AvatarSeverity, AvatarSize, AvatarVariant };
@@ -58,6 +58,12 @@ declare class CheckboxComponent implements ControlValueAccessor, OnInit {
58
58
  * Message to display when the control is invalid and touched.
59
59
  */
60
60
  errorMessage: _angular_core.InputSignal<string>;
61
+ /**
62
+ * @property {InputSignal<string>} hint
63
+ * @description
64
+ * Hint text to display below the checkbox when there is no error.
65
+ */
66
+ hint: _angular_core.InputSignal<string>;
61
67
  /**
62
68
  * @property {ModelSignal<boolean>} indeterminate
63
69
  * @description
@@ -101,7 +107,7 @@ declare class CheckboxComponent implements ControlValueAccessor, OnInit {
101
107
  */
102
108
  onBlur(): void;
103
109
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CheckboxComponent, never>;
104
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxComponent, "tk-checkbox", never, { "model": { "alias": "model"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "binary": { "alias": "binary"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; "indeterminate": "indeterminateChange"; "disabled": "disabledChange"; }, never, never, true, never>;
110
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxComponent, "tk-checkbox", never, { "model": { "alias": "model"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "binary": { "alias": "binary"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; "indeterminate": "indeterminateChange"; "disabled": "disabledChange"; }, never, never, true, never>;
105
111
  }
106
112
 
107
113
  export { CheckboxComponent };
@@ -213,6 +213,16 @@ declare class DatePickerComponent implements OnInit, ControlValueAccessor, Valid
213
213
  * <tk-date-picker [minDate]="minDate" errorMessage="Date is required" />
214
214
  */
215
215
  errorMessage: _angular_core.InputSignal<string | null>;
216
+ /**
217
+ * @description
218
+ * Hint text rendered beneath the field when there is no error to show.
219
+ *
220
+ * @default null
221
+ *
222
+ * @example
223
+ * <tk-date-picker hint="Format: dd/mm/yyyy" />
224
+ */
225
+ hint: _angular_core.InputSignal<string | null>;
216
226
  /**
217
227
  * @description
218
228
  * Optional external `FormControl` to bind when not using the standard
@@ -312,7 +322,7 @@ declare class DatePickerComponent implements OnInit, ControlValueAccessor, Valid
312
322
  */
313
323
  private applyTimeCascading;
314
324
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DatePickerComponent, never>;
315
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatePickerComponent, "tk-date-picker", never, { "required": { "alias": "required"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "showIcon": { "alias": "showIcon"; "required": false; "isSignal": true; }; "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "stepHour": { "alias": "stepHour"; "required": false; "isSignal": true; }; "stepMinute": { "alias": "stepMinute"; "required": false; "isSignal": true; }; "stepSecond": { "alias": "stepSecond"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "showTime": { "alias": "showTime"; "required": false; "isSignal": true; }; "hourFormat": { "alias": "hourFormat"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "baseZIndex": { "alias": "baseZIndex"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "labelText": { "alias": "labelText"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "modelValue": { "alias": "modelValue"; "required": false; "isSignal": true; }; }, { "modelValue": "modelValueChange"; "handleSelect": "handleSelect"; "handleClear": "handleClear"; }, never, never, true, never>;
325
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DatePickerComponent, "tk-date-picker", never, { "required": { "alias": "required"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "showClear": { "alias": "showClear"; "required": false; "isSignal": true; }; "showIcon": { "alias": "showIcon"; "required": false; "isSignal": true; }; "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "stepHour": { "alias": "stepHour"; "required": false; "isSignal": true; }; "stepMinute": { "alias": "stepMinute"; "required": false; "isSignal": true; }; "stepSecond": { "alias": "stepSecond"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "showTime": { "alias": "showTime"; "required": false; "isSignal": true; }; "hourFormat": { "alias": "hourFormat"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "baseZIndex": { "alias": "baseZIndex"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "labelText": { "alias": "labelText"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "modelValue": { "alias": "modelValue"; "required": false; "isSignal": true; }; }, { "modelValue": "modelValueChange"; "handleSelect": "handleSelect"; "handleClear": "handleClear"; }, never, never, true, never>;
316
326
  }
317
327
 
318
328
  export { DatePickerComponent };
@@ -38,6 +38,12 @@ declare class InputNumberComponent implements ControlValueAccessor, OnInit {
38
38
  * Message to display when the control is invalid and touched.
39
39
  */
40
40
  errorMessage: _angular_core.InputSignal<string>;
41
+ /**
42
+ * @property {InputSignal<string>} hint
43
+ * @description
44
+ * Hint text to display below the input.
45
+ */
46
+ hint: _angular_core.InputSignal<string>;
41
47
  /**
42
48
  * @property {InputSignal<boolean>} showButtons
43
49
  * @description
@@ -45,6 +51,34 @@ declare class InputNumberComponent implements ControlValueAccessor, OnInit {
45
51
  * @default false
46
52
  */
47
53
  showButtons: _angular_core.InputSignal<boolean>;
54
+ /**
55
+ * @property {InputSignal<boolean>} useGrouping
56
+ * @description
57
+ * Whether to display thousands separators.
58
+ * @default false
59
+ */
60
+ useGrouping: _angular_core.InputSignal<boolean>;
61
+ /**
62
+ * @property {InputSignal<number | null>} minFractionDigits
63
+ * @description
64
+ * Minimum number of decimal digits allowed.
65
+ */
66
+ minFractionDigits: _angular_core.InputSignal<number | null>;
67
+ /**
68
+ * @property {InputSignal<number | null>} maxFractionDigits
69
+ * @description
70
+ * Maximum number of decimal digits allowed. Left unset (`null`) by
71
+ * default — integer entry only, matching prior behavior — and safe for
72
+ * already-bound decimal values (Intl.NumberFormat applies its own default
73
+ * of up to 3 decimal places for display when this isn't set, so no
74
+ * rounding happens). PrimeNG's InputNumber only lets the user *type* a new
75
+ * decimal separator when this is explicitly set to a value greater than 0
76
+ * — set it (e.g. `[maxFractionDigits]="2"`) to accept typed decimal
77
+ * input. Set to 0 only if you deliberately want to force integer-only
78
+ * display too — it rounds any already-bound decimal value.
79
+ * @default null
80
+ */
81
+ maxFractionDigits: _angular_core.InputSignal<number | null>;
48
82
  /**
49
83
  * @property {boolean} disabled
50
84
  * @description
@@ -98,7 +132,7 @@ declare class InputNumberComponent implements ControlValueAccessor, OnInit {
98
132
  */
99
133
  onBlur(): void;
100
134
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputNumberComponent, never>;
101
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputNumberComponent, "tk-input-number", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "showButtons": { "alias": "showButtons"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
135
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputNumberComponent, "tk-input-number", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "showButtons": { "alias": "showButtons"; "required": false; "isSignal": true; }; "useGrouping": { "alias": "useGrouping"; "required": false; "isSignal": true; }; "minFractionDigits": { "alias": "minFractionDigits"; "required": false; "isSignal": true; }; "maxFractionDigits": { "alias": "maxFractionDigits"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
102
136
  }
103
137
 
104
138
  export { InputNumberComponent };
@@ -53,6 +53,12 @@ declare class RadioButtonComponent implements ControlValueAccessor, OnInit {
53
53
  * Message to display when the control is invalid and touched.
54
54
  */
55
55
  errorMessage: _angular_core.InputSignal<string>;
56
+ /**
57
+ * @property {InputSignal<string>} hint
58
+ * @description
59
+ * Hint text to display below the radio button when there is no error.
60
+ */
61
+ hint: _angular_core.InputSignal<string>;
56
62
  /**
57
63
  * @property {ModelSignal<boolean>} disabled
58
64
  * @description
@@ -94,7 +100,7 @@ declare class RadioButtonComponent implements ControlValueAccessor, OnInit {
94
100
  */
95
101
  onBlur(): void;
96
102
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadioButtonComponent, never>;
97
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioButtonComponent, "tk-radio-button", never, { "model": { "alias": "model"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; "disabled": "disabledChange"; }, never, never, true, never>;
103
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioButtonComponent, "tk-radio-button", never, { "model": { "alias": "model"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "model": "modelChange"; "disabled": "disabledChange"; }, never, never, true, never>;
98
104
  }
99
105
 
100
106
  export { RadioButtonComponent };