yukit-web 0.0.28 → 0.1.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.
@@ -1,95 +1,133 @@
1
1
  [data-yuw-color='primary'] {
2
- --yuw-accent: var(--accent-primary);
3
- --yuw-accent-foreground: var(--neutrals-white);
4
- --secondary: var(--sidebar-accent);
5
- --secondary-foreground: var(--sidebar-accent-foreground);
6
- --yuw-callout-bg: var(--accent-primary-lighter-2);
7
- }
8
-
9
- [data-yuw-color='primary'] button.bg-primary:not(:disabled) {
10
- background: var(--gradient-primary-button);
11
- border: none;
2
+ --yuw-accent: var(--primary-fill-cta);
3
+ --yuw-accent-foreground: var(--primary-on-fill);
4
+ --secondary: var(--primary-subtle-hover);
5
+ --secondary-foreground: var(--primary-text);
6
+ --yuw-callout-bg: var(--primary-subtle);
12
7
  }
13
8
 
14
9
  [data-yuw-color='primary'] button.bg-primary:not(:disabled):hover {
15
- background: var(--gradient-primary-button-hover);
10
+ background: var(--primary-fill-hover);
16
11
  }
17
12
 
18
13
  [data-yuw-color='secondary'] {
14
+ --yuw-accent: var(--secondary-fill);
15
+ --yuw-accent-foreground: var(--secondary-on-fill);
16
+ --secondary: var(--secondary-subtle-hover);
17
+ --secondary-foreground: var(--secondary-text);
18
+ --yuw-callout-bg: var(--secondary-subtle);
19
+ }
20
+
21
+ [data-yuw-color='secondary'] button.bg-primary:not(:disabled):hover {
22
+ background: var(--secondary-fill-hover);
23
+ }
24
+
25
+ [data-yuw-color='neutral'] {
19
26
  --yuw-accent: var(--neutrals-element-high);
20
27
  --yuw-accent-foreground: var(--background);
21
- --secondary: var(--neutrals-element-low);
22
- --secondary-foreground: var(--neutrals-overlay-accent);
28
+ --secondary: var(--neutrals-fill);
29
+ --secondary-foreground: var(--neutrals-element-high);
23
30
  --yuw-callout-bg: var(--neutrals-overlay);
24
31
  }
25
32
 
26
- [data-yuw-color='secondary'] button.bg-primary:not(:disabled) {
27
- background: var(--neutrals-element-high-gradient);
28
- border: none;
29
- }
30
-
31
- [data-yuw-color='secondary'] button.bg-primary:not(:disabled):hover {
32
- background: var(--neutrals-element-high-gradient-hover);
33
+ [data-yuw-color='neutral'] button.bg-primary:not(:disabled):hover {
34
+ background: var(--gray-11);
33
35
  }
34
36
 
35
37
  [data-yuw-color='destructive'] {
36
- --yuw-accent: var(--feedback-error);
37
- --yuw-accent-foreground: var(--neutrals-white);
38
- --secondary: var(--feedback-error-light);
39
- --secondary-foreground: var(--neutrals-surface);
40
- --yuw-callout-bg: var(--feedback-error-lighter-2);
38
+ --yuw-accent: var(--error-fill);
39
+ --yuw-accent-foreground: var(--error-on-fill);
40
+ --secondary: var(--error-subtle-hover);
41
+ --secondary-foreground: var(--error-text);
42
+ --yuw-callout-bg: var(--error-subtle);
41
43
  }
42
44
 
43
45
  [data-yuw-color='destructive'] button.bg-primary:not(:disabled):hover {
44
- background: var(--feedback-error-dark);
46
+ background: var(--error-fill-hover);
45
47
  }
46
48
 
47
49
  [data-yuw-color='success'] {
48
- --yuw-accent: var(--feedback-success);
49
- --yuw-accent-foreground: var(--neutrals-white);
50
- --secondary: var(--feedback-success-light);
51
- --secondary-foreground: var(--neutrals-surface);
52
- --yuw-callout-bg: var(--feedback-success-lighter-2);
50
+ --yuw-accent: var(--success-fill);
51
+ --yuw-accent-foreground: var(--success-on-fill);
52
+ --secondary: var(--success-subtle-hover);
53
+ --secondary-foreground: var(--success-text);
54
+ --yuw-callout-bg: var(--success-subtle);
53
55
  }
54
56
 
55
57
  [data-yuw-color='success'] button.bg-primary:not(:disabled):hover {
56
- background: var(--feedback-success-dark);
58
+ background: var(--success-fill-hover);
57
59
  }
58
60
 
59
61
  [data-yuw-color='warning'] {
60
- --yuw-accent: var(--feedback-warning);
61
- --yuw-accent-foreground: var(--neutrals-white);
62
- --secondary: var(--feedback-warning-light);
63
- --secondary-foreground: var(--neutrals-surface);
64
- --yuw-callout-bg: var(--feedback-warning-lighter-2);
62
+ --yuw-accent: var(--warning-fill);
63
+ --yuw-accent-foreground: var(--warning-on-fill);
64
+ --secondary: var(--warning-subtle-hover);
65
+ --secondary-foreground: var(--warning-text);
66
+ --yuw-callout-bg: var(--warning-subtle);
65
67
  }
66
68
 
67
69
  [data-yuw-color='warning'] button.bg-primary:not(:disabled):hover {
68
- background: var(--feedback-warning-dark);
70
+ background: var(--warning-fill-hover);
69
71
  }
70
72
 
71
73
  [data-yuw-color='info'] {
72
- --yuw-accent: var(--feedback-info);
73
- --yuw-accent-foreground: var(--neutrals-white);
74
- --secondary: var(--feedback-info-light);
75
- --secondary-foreground: var(--neutrals-surface);
76
- --yuw-callout-bg: var(--feedback-info-lighter-2);
74
+ --yuw-accent: var(--info-fill);
75
+ --yuw-accent-foreground: var(--info-on-fill);
76
+ --secondary: var(--info-subtle-hover);
77
+ --secondary-foreground: var(--info-text);
78
+ --yuw-callout-bg: var(--info-subtle);
77
79
  }
78
80
 
79
81
  [data-yuw-color='info'] button.bg-primary:not(:disabled):hover {
80
- background: var(--feedback-info-dark);
82
+ background: var(--info-fill-hover);
81
83
  }
82
84
 
83
85
  [data-yuw-color='violet'] {
84
- --yuw-accent: var(--feedback-additional);
85
- --yuw-accent-foreground: var(--neutrals-white);
86
- --secondary: var(--feedback-additional-light);
87
- --secondary-foreground: var(--neutrals-surface);
88
- --yuw-callout-bg: var(--feedback-additional-lighter-2);
86
+ --yuw-accent: var(--violet-fill);
87
+ --yuw-accent-foreground: var(--violet-on-fill);
88
+ --secondary: var(--violet-subtle-hover);
89
+ --secondary-foreground: var(--violet-text);
90
+ --yuw-callout-bg: var(--violet-subtle);
89
91
  }
90
92
 
91
93
  [data-yuw-color='violet'] button.bg-primary:not(:disabled):hover {
92
- background: var(--feedback-additional-dark);
94
+ background: var(--violet-fill-hover);
95
+ }
96
+
97
+ [data-yuw-color='orange'] {
98
+ --yuw-accent: var(--orange-fill);
99
+ --yuw-accent-foreground: var(--orange-on-fill);
100
+ --secondary: var(--orange-subtle-hover);
101
+ --secondary-foreground: var(--orange-text);
102
+ --yuw-callout-bg: var(--orange-subtle);
103
+ }
104
+
105
+ [data-yuw-color='orange'] button.bg-primary:not(:disabled):hover {
106
+ background: var(--orange-fill-hover);
107
+ }
108
+
109
+ [data-yuw-color='pink'] {
110
+ --yuw-accent: var(--pink-fill);
111
+ --yuw-accent-foreground: var(--pink-on-fill);
112
+ --secondary: var(--pink-subtle-hover);
113
+ --secondary-foreground: var(--pink-text);
114
+ --yuw-callout-bg: var(--pink-subtle);
115
+ }
116
+
117
+ [data-yuw-color='pink'] button.bg-primary:not(:disabled):hover {
118
+ background: var(--pink-fill-hover);
119
+ }
120
+
121
+ [data-yuw-color='teal'] {
122
+ --yuw-accent: var(--teal-fill);
123
+ --yuw-accent-foreground: var(--teal-on-fill);
124
+ --secondary: var(--teal-subtle-hover);
125
+ --secondary-foreground: var(--teal-text);
126
+ --yuw-callout-bg: var(--teal-subtle);
127
+ }
128
+
129
+ [data-yuw-color='teal'] button.bg-primary:not(:disabled):hover {
130
+ background: var(--teal-fill-hover);
93
131
  }
94
132
 
95
133
  [data-yuw-color='muted'] {
@@ -122,7 +160,7 @@
122
160
  --muted: color-mix(in oklab, var(--yuw-accent) 5%, transparent);
123
161
  }
124
162
 
125
- [data-yuw-color='secondary'] {
163
+ [data-yuw-color='neutral'] {
126
164
  --border: var(--neutrals-outline-accent);
127
165
  }
128
166
 
@@ -130,53 +168,8 @@
130
168
  --ring: var(--yuw-accent);
131
169
  }
132
170
 
133
- .dark [data-yuw-color='primary'] {
134
- --yuw-accent: var(--accent-primary-dark);
135
- --secondary: var(--sidebar-accent);
136
- --secondary-foreground: var(--sidebar-accent-foreground);
137
- --yuw-callout-bg: var(--accent-primary-lighter-2);
138
- }
139
-
140
- .dark [data-yuw-color='secondary'] {
141
- --secondary: var(--neutrals-element-low);
142
- --secondary-foreground: var(--neutrals-overlay-accent);
171
+ .dark [data-yuw-color='neutral'] {
143
172
  --input: color-mix(in oklab, var(--yuw-accent) 40%, transparent);
144
- --yuw-callout-bg: var(--neutrals-overlay);
145
- }
146
-
147
- .dark [data-yuw-color='destructive'] {
148
- --yuw-accent: var(--feedback-error-dark);
149
- --secondary: var(--feedback-error-lighter-2);
150
- --secondary-foreground: var(--neutrals-white);
151
- --yuw-callout-bg: var(--feedback-error-lighter-2);
152
- }
153
-
154
- .dark [data-yuw-color='success'] {
155
- --yuw-accent: var(--feedback-success-dark);
156
- --secondary: var(--feedback-success-lighter-2);
157
- --secondary-foreground: var(--neutrals-white);
158
- --yuw-callout-bg: var(--feedback-success-lighter-2);
159
- }
160
-
161
- .dark [data-yuw-color='warning'] {
162
- --yuw-accent: var(--feedback-warning-dark);
163
- --secondary: var(--feedback-warning-lighter-2);
164
- --secondary-foreground: var(--neutrals-white);
165
- --yuw-callout-bg: var(--feedback-warning-lighter-2);
166
- }
167
-
168
- .dark [data-yuw-color='info'] {
169
- --yuw-accent: var(--feedback-info-dark);
170
- --secondary: var(--feedback-info-lighter-2);
171
- --secondary-foreground: var(--neutrals-white);
172
- --yuw-callout-bg: var(--feedback-info-lighter-2);
173
- }
174
-
175
- .dark [data-yuw-color='violet'] {
176
- --yuw-accent-foreground: var(--neutrals-white);
177
- --secondary: var(--feedback-additional-dark);
178
- --secondary-foreground: var(--neutrals-white);
179
- --yuw-callout-bg: var(--feedback-additional-lighter-2);
180
173
  }
181
174
 
182
175
  .dark [data-yuw-color] button.bg-background:not(:disabled):hover {
@@ -1,7 +1,15 @@
1
+ @font-face {
2
+ font-family: GeistFont;
3
+ src: url('font/Geist-Variable.woff2') format('woff2');
4
+ font-weight: 100 900;
5
+ font-style: normal;
6
+ }
7
+
1
8
  :root {
2
- --font-sans: 'Open Sauce One', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue',
3
- Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
4
- --font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
9
+ --font-sans:
10
+ 'GeistFont', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
11
+ sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji';
12
+ --font-mono: 'GeistFont', ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
5
13
 
6
14
  /* Type scale — web (default) */
7
15
  --text-display-large-weight: 700; /* Bold */
@@ -262,6 +262,8 @@ type YuwComboboxValue = string | string[] | undefined;
262
262
  * - `clearAriaLabel`: When set, the clear button is shown on the single-selection control and
263
263
  * this is its accessible name; when absent, there is no clear button. One input, one source of
264
264
  * truth. User-facing text — the consuming app is responsible for providing it translated.
265
+ * - `keepValueOnEscape`: Stops Escape from clearing the selection when the list is closed, so a
266
+ * filter picker keeps its choices and Escape only dismisses.
265
267
  * - `inputId`: HTML `id` for the focusable control (the search input, or the trigger button when
266
268
  * `readonlyTrigger` is set), enabling external `<label for="...">` association.
267
269
  * - `readonlyTrigger`: Renders control as a button showing selected label, placing search input inside popover.
@@ -279,6 +281,7 @@ type YuwComboboxValue = string | string[] | undefined;
279
281
  * ```
280
282
  */
281
283
  declare class YuwComboboxComponent<TData = unknown> extends YuwValueAccessorBase<YuwComboboxValue> {
284
+ private readonly _element;
282
285
  private readonly _multipleBox;
283
286
  private readonly _panel;
284
287
  private readonly _singleBox;
@@ -287,6 +290,7 @@ declare class YuwComboboxComponent<TData = unknown> extends YuwValueAccessorBase
287
290
  readonly emptyText: _angular_core.InputSignal<string | undefined>;
288
291
  readonly inputId: _angular_core.InputSignal<string | undefined>;
289
292
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
293
+ readonly keepValueOnEscape: _angular_core.InputSignalWithTransform<boolean, unknown>;
290
294
  readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
291
295
  readonly options: _angular_core.InputSignal<YuwComboboxOptionDto<TData>[]>;
292
296
  readonly placeholder: _angular_core.InputSignal<string | undefined>;
@@ -312,6 +316,7 @@ declare class YuwComboboxComponent<TData = unknown> extends YuwValueAccessorBase
312
316
  protected readonly _selectedValues: _angular_core.Signal<Set<string>>;
313
317
  protected readonly _singleValue: _angular_core.Signal<string | undefined>;
314
318
  protected readonly _triggerClass: _angular_core.Signal<string>;
319
+ constructor();
315
320
  /**
316
321
  * Focuses the field and opens its option list. For a combobox living inside a popover or sheet:
317
322
  * the container calls it when it opens, so the user sees the options without a second click.
@@ -320,8 +325,16 @@ declare class YuwComboboxComponent<TData = unknown> extends YuwValueAccessorBase
320
325
  protected _emptyValue(): YuwComboboxValue;
321
326
  protected _onFocusOut(event: FocusEvent): void;
322
327
  protected onValueChange(next: YuwComboboxValue | null): void;
328
+ /**
329
+ * The brain clears the whole selection when Escape is pressed with the list closed. While
330
+ * `keepValueOnEscape` is on, that reset is skipped for the duration of the Escape keydown only,
331
+ * so the clear button and programmatic resets still work and the event keeps propagating (an
332
+ * enclosing popover can still close on it). Nothing is registered while the input is off, and
333
+ * the returned function undoes it all.
334
+ */
335
+ private _guardEscape;
323
336
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<YuwComboboxComponent<any>, never>;
324
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<YuwComboboxComponent<any>, "yuw-combobox", never, { "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "readonlyTrigger": { "alias": "readonlyTrigger"; "required": false; "isSignal": true; }; "search": { "alias": "search"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "triggerAriaLabel": { "alias": "triggerAriaLabel"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "search": "searchChange"; "value": "valueChange"; }, ["itemTemplate"], never, true, never>;
337
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<YuwComboboxComponent<any>, "yuw-combobox", never, { "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "keepValueOnEscape": { "alias": "keepValueOnEscape"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "readonlyTrigger": { "alias": "readonlyTrigger"; "required": false; "isSignal": true; }; "search": { "alias": "search"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "triggerAriaLabel": { "alias": "triggerAriaLabel"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "search": "searchChange"; "value": "valueChange"; }, ["itemTemplate"], never, true, never>;
325
338
  }
326
339
 
327
340
  interface YuwPageSort {
@@ -368,7 +381,7 @@ interface YuwPagedList<Filters> {
368
381
  */
369
382
  declare function createPagedList<Filters>(options: YuwPagedListOptions<Filters>): YuwPagedList<Filters>;
370
383
 
371
- type YuwColorDto = 'primary' | 'secondary' | 'destructive' | 'success' | 'warning' | 'info' | 'muted' | 'violet';
384
+ type YuwColorDto = 'primary' | 'secondary' | 'neutral' | 'destructive' | 'success' | 'warning' | 'info' | 'muted' | 'violet' | 'orange' | 'pink' | 'teal';
372
385
 
373
386
  /**
374
387
  * A single action button, rendered as a `<button>` or, when `href` is set, an `<a>`.
@@ -379,7 +392,7 @@ type YuwColorDto = 'primary' | 'secondary' | 'destructive' | 'success' | 'warnin
379
392
  * Inputs:
380
393
  * - `variant`: Button style variant (`'default'`, `'secondary'`, `'outline'`, `'destructive'`, `'ghost'`, `'link'`). Default is `'default'`.
381
394
  * - `size`: Button size (`'default'`, `'sm'`, `'lg'`, `'icon'`, etc.). Default is `'default'`.
382
- * - `color`: Brand color theme (any `YuwColorDto` value). Default is `'secondary'`.
395
+ * - `color`: Brand color theme (any `YuwColorDto` value). Default is `'neutral'`.
383
396
  * - `disabled`: Disables button interactions.
384
397
  * - `type`: HTML button type (`'button'`, `'submit'`, `'reset'`). Default is `'button'`.
385
398
  * - `href`: Renders button as an anchor tag navigating to specified URL.
@@ -419,7 +432,7 @@ declare class YuwButtonComponent {
419
432
  readonly size: _angular_core.InputSignal<"default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined>;
420
433
  readonly target: _angular_core.InputSignal<string | undefined>;
421
434
  readonly transparent: _angular_core.InputSignalWithTransform<boolean, unknown>;
422
- readonly type: _angular_core.InputSignal<"button" | "submit" | "reset">;
435
+ readonly type: _angular_core.InputSignal<"button" | "reset" | "submit">;
423
436
  readonly userClass: _angular_core.InputSignal<string>;
424
437
  readonly variant: _angular_core.InputSignal<"link" | "default" | "secondary" | "destructive" | "outline" | "ghost" | null | undefined>;
425
438
  readonly yuwDropdownMenuTrigger: _angular_core.InputSignal<TemplateRef<unknown> | undefined>;
@@ -551,7 +564,7 @@ declare class YuwButtonGroupComponent {
551
564
  color: YuwColorDto;
552
565
  transparent: boolean;
553
566
  disabled: boolean;
554
- type: "button" | "submit" | "reset";
567
+ type: "button" | "reset" | "submit";
555
568
  class: string;
556
569
  id: string;
557
570
  label?: string;
@@ -1259,7 +1272,7 @@ declare class YuwLabel extends HlmLabel {
1259
1272
 
1260
1273
  /**
1261
1274
  * Checkbox control supporting two-way boolean binding, form integration (`ngModel`, `formControlName`),
1262
- * indeterminate state, and secondary styling variant.
1275
+ * indeterminate state, and primary styling variant.
1263
1276
  *
1264
1277
  * Projected content becomes the checkbox's clickable label: the control is wrapped in a `<label>`,
1265
1278
  * so clicking the text toggles it and the text is announced as the accessible name. Without
@@ -1276,7 +1289,7 @@ declare class YuwLabel extends HlmLabel {
1276
1289
  * - `ariaLabel`: Accessible name for screen readers when there's no visible label.
1277
1290
  * - `ariaLabelledby`: ID of an external element that labels the checkbox.
1278
1291
  * - `ariaDescribedby`: ID of an external element that describes the checkbox (hints, errors).
1279
- * - `secondary`: Enables secondary color variant styling.
1292
+ * - `primary`: Primary colour checked state. Defaults to `false` (secondary colour); set `primary` to opt in.
1280
1293
  *
1281
1294
  * Usage:
1282
1295
  * ```html
@@ -1293,15 +1306,15 @@ declare class YuwCheckboxComponent extends YuwValueAccessorBase<boolean> {
1293
1306
  readonly inputId: _angular_core.InputSignal<string | undefined>;
1294
1307
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
1295
1308
  readonly name: _angular_core.InputSignal<string | undefined>;
1309
+ readonly primary: _angular_core.InputSignalWithTransform<boolean, unknown>;
1296
1310
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
1297
- readonly secondary: _angular_core.InputSignalWithTransform<boolean, unknown>;
1298
1311
  readonly value: _angular_core.ModelSignal<boolean>;
1299
1312
  protected readonly _focusSelectors: string[];
1300
1313
  protected readonly _class: _angular_core.Signal<string>;
1301
1314
  protected _emptyValue(): boolean;
1302
1315
  protected onCheckedChange(checked: boolean): void;
1303
1316
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<YuwCheckboxComponent, never>;
1304
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<YuwCheckboxComponent, "yuw-checkbox", never, { "ariaDescribedby": { "alias": "ariaDescribedby"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "secondary": { "alias": "secondary"; "required": false; "isSignal": true; }; "value": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "indeterminate": "indeterminateChange"; "value": "checkedChange"; }, never, ["*"], true, never>;
1317
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<YuwCheckboxComponent, "yuw-checkbox", never, { "ariaDescribedby": { "alias": "ariaDescribedby"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "primary": { "alias": "primary"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "value": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "indeterminate": "indeterminateChange"; "value": "checkedChange"; }, never, ["*"], true, never>;
1305
1318
  }
1306
1319
 
1307
1320
  type YuwSwitchSizeDto = 'default' | 'xs' | 'sm' | 'lg';
@@ -1317,6 +1330,7 @@ type YuwSwitchSizeDto = 'default' | 'xs' | 'sm' | 'lg';
1317
1330
  * - `checked` (alias for `value`): Two-way boolean on/off state. Bind as `[(checked)]`.
1318
1331
  * - `size`: Track size (`'default'`, `'xs'`, `'sm'`, `'lg'`). Named to match the rest of the
1319
1332
  * library; the pixel values keep a switch's own proportions rather than the field heights.
1333
+ * - `primary`: Primary colour checked state. Defaults to `false` (secondary colour); set `primary` to opt in.
1320
1334
  * - `disabled`: Disables switch interaction.
1321
1335
  * - `inputId`: HTML `id` for the underlying control, enabling external `<label for="...">` association.
1322
1336
  * - `ariaLabel`: Accessible name for switches with no visible adjacent label.
@@ -1332,6 +1346,7 @@ declare class YuwSwitchComponent extends YuwValueAccessorBase<boolean> {
1332
1346
  readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
1333
1347
  readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
1334
1348
  readonly inputId: _angular_core.InputSignal<string | undefined>;
1349
+ readonly primary: _angular_core.InputSignalWithTransform<boolean, unknown>;
1335
1350
  readonly size: _angular_core.InputSignal<YuwSwitchSizeDto>;
1336
1351
  readonly value: _angular_core.ModelSignal<boolean>;
1337
1352
  protected readonly _focusSelectors: string[];
@@ -1340,7 +1355,7 @@ declare class YuwSwitchComponent extends YuwValueAccessorBase<boolean> {
1340
1355
  protected _emptyValue(): boolean;
1341
1356
  protected onCheckedChange(checked: boolean): void;
1342
1357
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<YuwSwitchComponent, never>;
1343
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<YuwSwitchComponent, "yuw-switch", never, { "ariaDescribedby": { "alias": "ariaDescribedby"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "value": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "value": "checkedChange"; }, never, ["*"], true, never>;
1358
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<YuwSwitchComponent, "yuw-switch", never, { "ariaDescribedby": { "alias": "ariaDescribedby"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "inputId": { "alias": "inputId"; "required": false; "isSignal": true; }; "primary": { "alias": "primary"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "value": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "value": "checkedChange"; }, never, ["*"], true, never>;
1344
1359
  }
1345
1360
 
1346
1361
  /**
@@ -1365,6 +1380,7 @@ interface YuwRadioOptionDto {
1365
1380
  * Inputs / Models:
1366
1381
  * - `value`: Two-way selected option value (`string | undefined`). `undefined` means nothing is selected.
1367
1382
  * - `options`: Required array of radio options (`YuwRadioOptionDto[]`).
1383
+ * - `primary`: Primary colour selected dot. Defaults to `false` (secondary colour); set `primary` to opt in.
1368
1384
  * - `disabled`: Disables all radio options.
1369
1385
  * - `required`: Marks the group as required.
1370
1386
  * - `name`: Shared HTML `name` attribute for all radios, making them mutually exclusive in native
@@ -1386,6 +1402,7 @@ declare class YuwRadioGroupComponent extends YuwValueAccessorBase<string | undef
1386
1402
  readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
1387
1403
  readonly name: _angular_core.InputSignal<string | undefined>;
1388
1404
  readonly options: _angular_core.InputSignal<readonly YuwRadioOptionDto[]>;
1405
+ readonly primary: _angular_core.InputSignalWithTransform<boolean, unknown>;
1389
1406
  readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
1390
1407
  readonly userClass: _angular_core.InputSignal<string>;
1391
1408
  readonly value: _angular_core.ModelSignal<string | undefined>;
@@ -1396,7 +1413,7 @@ declare class YuwRadioGroupComponent extends YuwValueAccessorBase<string | undef
1396
1413
  protected _emptyValue(): string | undefined;
1397
1414
  protected onValueChange(next: string): void;
1398
1415
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<YuwRadioGroupComponent, never>;
1399
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<YuwRadioGroupComponent, "yuw-radio-group", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
1416
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<YuwRadioGroupComponent, "yuw-radio-group", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "primary": { "alias": "primary"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
1400
1417
  }
1401
1418
 
1402
1419
  /**
@@ -2501,7 +2518,7 @@ type YuwPopoverAlignDto = 'start' | 'center' | 'end';
2501
2518
  * over the library defaults via `twMerge`.
2502
2519
  * - `triggerVariant`: Button style variant for the trigger button.
2503
2520
  * - `triggerColor`: Brand color theme for the trigger button (any `YuwColorDto` value). Default is
2504
- * `'secondary'`.
2521
+ * `'neutral'`.
2505
2522
  * - `triggerSize`: Button size for the trigger button.
2506
2523
  * - `triggerTransparent`: Strips the trigger's background and border in every state (rest, hover,
2507
2524
  * open), for triggers whose projected content is the whole control — an avatar, a name, a chevron.