@lmvz-ds/components 0.24.0 → 0.26.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 (140) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/cjs/{ds.constants-DSnxZ3ia.js → ds.constants-8fh6ItAF.js} +1 -1
  3. package/cjs/{index-lW-SEvL7.js → index-BCFBLj0e.js} +1 -1
  4. package/cjs/index.cjs.js +196 -2
  5. package/cjs/lmvz-action.cjs.entry.js +1 -1
  6. package/cjs/lmvz-button-group.cjs.entry.js +183 -0
  7. package/cjs/lmvz-button_2.cjs.entry.js +198 -0
  8. package/cjs/lmvz-card.cjs.entry.js +2 -2
  9. package/cjs/lmvz-checkbox.cjs.entry.js +5 -5
  10. package/cjs/lmvz-chip.cjs.entry.js +4 -4
  11. package/cjs/lmvz-components.cjs.js +3 -3
  12. package/cjs/lmvz-header_2.cjs.entry.js +2 -2
  13. package/cjs/lmvz-input.cjs.entry.js +3 -3
  14. package/cjs/lmvz-menuitem.cjs.entry.js +3 -3
  15. package/cjs/lmvz-modal.cjs.entry.js +5 -5
  16. package/cjs/lmvz-radio.cjs.entry.js +334 -0
  17. package/cjs/lmvz-select.cjs.entry.js +4 -4
  18. package/cjs/lmvz-snackbar.cjs.entry.js +83 -0
  19. package/cjs/lmvz-toggle.cjs.entry.js +7 -5
  20. package/cjs/loader.cjs.js +2 -2
  21. package/cjs/{reactive-controller-host-BOFg4vL-.js → reactive-controller-host-DrtMkMd7.js} +1 -1
  22. package/collection/api/ds.constants.js +4 -1
  23. package/collection/collection-manifest.json +3 -1
  24. package/collection/components/lmvz-button/lmvz-button.css +8 -8
  25. package/collection/components/lmvz-button-group/lmvz-button-group.css +1 -1
  26. package/collection/components/lmvz-card/lmvz-card.css +11 -11
  27. package/collection/components/lmvz-checkbox/lmvz-checkbox.css +8 -11
  28. package/collection/components/lmvz-checkbox/lmvz-checkbox.js +2 -2
  29. package/collection/components/lmvz-chip/lmvz-chip.css +3 -3
  30. package/collection/components/lmvz-icon/lmvz-icon.js +1 -1
  31. package/collection/components/lmvz-input/lmvz-input.css +5 -9
  32. package/collection/components/lmvz-menuitem/lmvz-menuitem.css +3 -3
  33. package/collection/components/lmvz-modal/lmvz-modal.css +21 -15
  34. package/collection/components/lmvz-modal/lmvz-modal.js +2 -2
  35. package/collection/components/lmvz-radio/lmvz-radio.css +182 -0
  36. package/collection/components/lmvz-radio/lmvz-radio.js +487 -0
  37. package/collection/components/lmvz-select/lmvz-select.css +3 -3
  38. package/collection/components/lmvz-select/lmvz-select.js +1 -1
  39. package/collection/components/lmvz-snackbar/lmvz-snackbar.css +101 -0
  40. package/collection/components/lmvz-snackbar/lmvz-snackbar.js +266 -0
  41. package/collection/components/lmvz-snackbar/public.js +1 -0
  42. package/collection/components/lmvz-snackbar/snackbar-controller.js +194 -0
  43. package/collection/components/lmvz-toggle/lmvz-toggle.css +4 -9
  44. package/collection/components/lmvz-toggle/lmvz-toggle.js +3 -3
  45. package/collection/index.js +1 -0
  46. package/collection/integration/header-integration/header-integration.js +1 -1
  47. package/collection/styles/fragments/_focus-within.css +13 -0
  48. package/collection/utils/radio/radio-group-controller.js +160 -0
  49. package/components/index.d.ts +4 -0
  50. package/components/index.d.ts.bak +4 -0
  51. package/components/index.js +1 -1
  52. package/components/lmvz-action.js +1 -1
  53. package/components/lmvz-button-group.js +1 -1
  54. package/components/lmvz-button.js +1 -1
  55. package/components/lmvz-card.js +1 -1
  56. package/components/lmvz-checkbox.js +1 -1
  57. package/components/lmvz-chip.js +1 -1
  58. package/components/lmvz-header.js +1 -1
  59. package/components/lmvz-icon.js +1 -1
  60. package/components/lmvz-input.js +1 -1
  61. package/components/lmvz-menuitem.js +1 -1
  62. package/components/lmvz-modal.js +1 -1
  63. package/components/lmvz-radio.d.ts +11 -0
  64. package/components/lmvz-radio.d.ts.bak +11 -0
  65. package/components/lmvz-radio.js +1 -0
  66. package/components/lmvz-select.js +1 -1
  67. package/components/lmvz-snackbar.d.ts +11 -0
  68. package/components/lmvz-snackbar.d.ts.bak +11 -0
  69. package/components/lmvz-snackbar.js +1 -0
  70. package/components/lmvz-toggle.js +1 -1
  71. package/components/{p-slgmfnHm.js → p-BOzeYzKk.js} +1 -1
  72. package/components/{p-Cg2XX_J-.js → p-DYa3zcGE.js} +1 -1
  73. package/components/{p-DOTK1OW3.js → p-JAKQdFhF.js} +1 -1
  74. package/components/{p-CcnyKhAw.js → p-WLZ7VWNX.js} +1 -1
  75. package/components/{p-CK8cAKcB.js → p-c7OzBK8f.js} +1 -1
  76. package/components/{p-DSvYtVoD.js → p-lsUdmjdw.js} +1 -1
  77. package/esm/{ds.constants-Bmi89ll1.js → ds.constants-BOOwq5dE.js} +1 -1
  78. package/esm/{index-Aa_425iY.js → index-CKYszC64.js} +1 -1
  79. package/esm/index.js +198 -1
  80. package/esm/lmvz-action.entry.js +1 -1
  81. package/esm/lmvz-button-group.entry.js +181 -0
  82. package/esm/lmvz-button_2.entry.js +195 -0
  83. package/esm/lmvz-card.entry.js +2 -2
  84. package/esm/lmvz-checkbox.entry.js +5 -5
  85. package/esm/lmvz-chip.entry.js +4 -4
  86. package/esm/lmvz-components.js +4 -4
  87. package/esm/lmvz-header_2.entry.js +2 -2
  88. package/esm/lmvz-input.entry.js +3 -3
  89. package/esm/lmvz-menuitem.entry.js +3 -3
  90. package/esm/lmvz-modal.entry.js +5 -5
  91. package/esm/lmvz-radio.entry.js +332 -0
  92. package/esm/lmvz-select.entry.js +4 -4
  93. package/esm/lmvz-snackbar.entry.js +81 -0
  94. package/esm/lmvz-toggle.entry.js +7 -5
  95. package/esm/loader.js +3 -3
  96. package/esm/{reactive-controller-host-CroMsXdS.js → reactive-controller-host-ZrGf1F2-.js} +1 -1
  97. package/hydrate/index.js +467 -19
  98. package/hydrate/index.mjs +467 -19
  99. package/lmvz-components/index.esm.js +1 -1
  100. package/lmvz-components/lmvz-components.esm.js +1 -1
  101. package/lmvz-components/{p-d1dacf7e.entry.js → p-01aeca60.entry.js} +1 -1
  102. package/lmvz-components/p-0a37e0f2.entry.js +1 -0
  103. package/lmvz-components/p-14c3d837.entry.js +1 -0
  104. package/lmvz-components/{p-4263c9b2.entry.js → p-24e63b0a.entry.js} +1 -1
  105. package/lmvz-components/p-25f045b2.entry.js +1 -0
  106. package/lmvz-components/{p-f6d1d9df.entry.js → p-3da301a6.entry.js} +1 -1
  107. package/lmvz-components/p-40228d48.entry.js +1 -0
  108. package/lmvz-components/p-4da9073a.entry.js +1 -0
  109. package/lmvz-components/p-6de9981f.entry.js +1 -0
  110. package/lmvz-components/{p-6f8cbc4f.entry.js → p-758078db.entry.js} +1 -1
  111. package/lmvz-components/{p-88adb9fa.entry.js → p-8dae99f1.entry.js} +1 -1
  112. package/lmvz-components/p-BOOwq5dE.js +1 -0
  113. package/lmvz-components/{p-BRl6zKXT.js → p-CwX1wKkM.js} +1 -1
  114. package/lmvz-components/{p-a7c3074a.entry.js → p-e1eaa7a2.entry.js} +1 -1
  115. package/lmvz-components/p-f5cece32.entry.js +1 -0
  116. package/lmvz-components/p-fe607f10.entry.js +1 -0
  117. package/manifest.json +892 -205
  118. package/package.json +9 -1
  119. package/types/api/ds.constants.d.ts +9 -1
  120. package/types/components/lmvz-radio/lmvz-radio.d.ts +42 -0
  121. package/types/components/lmvz-snackbar/lmvz-snackbar.d.ts +21 -0
  122. package/types/components/lmvz-snackbar/public.d.ts +2 -0
  123. package/types/components/lmvz-snackbar/snackbar-controller.d.ts +32 -0
  124. package/types/components.d.ts +237 -1
  125. package/types/index.d.ts +1 -0
  126. package/types/stencil-public-runtime.d.ts +1 -0
  127. package/types/utils/radio/radio-group-controller.d.ts +26 -0
  128. package/assets/icons/checkmark.svg +0 -4
  129. package/assets/icons/close-sm.svg +0 -3
  130. package/cjs/lmvz-button_3.cjs.entry.js +0 -375
  131. package/collection/assets/icons/checkmark.svg +0 -4
  132. package/collection/assets/icons/close-sm.svg +0 -3
  133. package/esm/lmvz-button_3.entry.js +0 -371
  134. package/lmvz-components/p-2824a56b.entry.js +0 -1
  135. package/lmvz-components/p-3846ba08.entry.js +0 -1
  136. package/lmvz-components/p-4f5c3c4a.entry.js +0 -1
  137. package/lmvz-components/p-Bmi89ll1.js +0 -1
  138. package/lmvz-components/p-b3b04d46.entry.js +0 -1
  139. package/lmvz-components/p-fefefc54.entry.js +0 -1
  140. /package/lmvz-components/{p-Aa_425iY.js → p-CKYszC64.js} +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lmvz-ds/components",
3
3
  "private": false,
4
- "version": "0.24.0",
4
+ "version": "0.26.0",
5
5
  "type": "module",
6
6
  "description": "The components of the design system",
7
7
  "author": "Patrick Nemenz <patrick.nemenz@adesso.at>",
@@ -72,6 +72,10 @@
72
72
  "types": "./components/lmvz-select.d.ts",
73
73
  "import": "./components/lmvz-select.js"
74
74
  },
75
+ "./lmvz-snackbar": {
76
+ "types": "./components/lmvz-snackbar.d.ts",
77
+ "import": "./components/lmvz-snackbar.js"
78
+ },
75
79
  "./lmvz-checkbox": {
76
80
  "import": "./components/lmvz-checkbox.js",
77
81
  "types": "./components/lmvz-checkbox.d.ts"
@@ -83,6 +87,10 @@
83
87
  "./lmvz-button-group": {
84
88
  "import": "./components/lmvz-button-group.js",
85
89
  "types": "./components/lmvz-button-group.d.ts"
90
+ },
91
+ "./lmvz-radio": {
92
+ "import": "./components/lmvz-radio.js",
93
+ "types": "./components/lmvz-radio.d.ts"
86
94
  }
87
95
  },
88
96
  "main": "./index.cjs.js",
@@ -4,7 +4,7 @@ export declare const sizes: readonly ["xs", "sm", "md", "lg"];
4
4
  export declare const textSizes: readonly ["xs", "sm", "md", "lg", "xl"];
5
5
  export declare const inputTypes: readonly ["text", "email", "password", "tel", "url", "search", "number"];
6
6
  export declare const iconSizes: readonly ["xs", "sm", "md", "lg", "inherit"];
7
- export declare const iconWeights: readonly ["thin", "medium", "bold", "filled"];
7
+ export declare const iconWeights: readonly ["thin", "medium", "bold"];
8
8
  export declare const chipTypes: readonly ["active", "warning", "success", "error", "neutral"];
9
9
  export declare const chipSizes: readonly ["default", "small"];
10
10
  export declare namespace LmvzDS {
@@ -32,3 +32,11 @@ export declare namespace Input {
32
32
  type Inputmode = 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';
33
33
  type Autocapitalize = 'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters';
34
34
  }
35
+ export declare const snackbarStatuses: readonly ["success", "warning", "error"];
36
+ export declare const snackbarPriorities: readonly ["low", "normal", "high"];
37
+ export declare const snackbarDismissReasons: readonly ["timeout", "manual", "action", "overridden", "swallowed"];
38
+ export declare namespace Snackbar {
39
+ type Status = (typeof snackbarStatuses)[number];
40
+ type Priority = (typeof snackbarPriorities)[number];
41
+ type DismissReason = (typeof snackbarDismissReasons)[number];
42
+ }
@@ -0,0 +1,42 @@
1
+ import { type EventEmitter } from '../../stencil-public-runtime';
2
+ import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
3
+ import { type RadioHost } from '../../utils/radio/radio-group-controller';
4
+ import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
5
+ export declare class LmvzRadio extends ReactiveControllerHost implements AriaValidationHost, RadioHost {
6
+ readonly el: HTMLElement;
7
+ get validationEl(): HTMLElement;
8
+ internals: ElementInternals;
9
+ private nativeInput;
10
+ private radioId;
11
+ private initialChecked;
12
+ private radioGroupController;
13
+ private get helperId();
14
+ label: string;
15
+ checked: boolean;
16
+ value: string;
17
+ name?: string;
18
+ disabled: boolean;
19
+ required: boolean;
20
+ error: boolean;
21
+ helperText?: string;
22
+ form?: string;
23
+ autofocus: boolean;
24
+ private _handlingNativeChange;
25
+ private _handlingFormReset;
26
+ protected handleCheckedChange(newVal: boolean, oldVal: boolean): void;
27
+ protected handleValueChange(newVal: string): void;
28
+ protected handleLabelChange(newVal: string): void;
29
+ lmvzChange: EventEmitter<boolean>;
30
+ lmvzActivation: EventEmitter<void>;
31
+ focusInput(): Promise<void>;
32
+ checkValidity(): Promise<boolean>;
33
+ reportValidity(): Promise<boolean>;
34
+ constructor();
35
+ componentWillLoad(): void;
36
+ formAssociatedCallback(): void;
37
+ formResetCallback(): void;
38
+ formStateRestoreCallback(state: string | File | FormData): void;
39
+ private handleChange;
40
+ handleKeydown(event: KeyboardEvent): void;
41
+ render(): any;
42
+ }
@@ -0,0 +1,21 @@
1
+ import { type EventEmitter } from '../../stencil-public-runtime';
2
+ import type { Snackbar } from '../../api';
3
+ export declare class LmvzSnackbar {
4
+ el: HTMLElement;
5
+ animationClass: string;
6
+ status: Snackbar.Status;
7
+ protected onStatusChange(): void;
8
+ message: string;
9
+ duration?: number;
10
+ priority?: Snackbar.Priority;
11
+ actionLabel?: string;
12
+ lmvzClose: EventEmitter<{
13
+ reason: Snackbar.DismissReason;
14
+ }>;
15
+ connectedCallback(): void;
16
+ show(): Promise<void>;
17
+ hide(): Promise<void>;
18
+ private applyAriaLiveAttributes;
19
+ private readonly handleActionClick;
20
+ render(): any;
21
+ }
@@ -0,0 +1,2 @@
1
+ export { SnackbarController } from './snackbar-controller';
2
+ export type { SnackbarDismissReason, SnackbarHandle, SnackbarOptions, SnackbarPriority, SnackbarStatus } from './snackbar-controller';
@@ -0,0 +1,32 @@
1
+ import type { Snackbar } from '../../api';
2
+ export type SnackbarStatus = Snackbar.Status;
3
+ export type SnackbarPriority = Snackbar.Priority;
4
+ export type SnackbarDismissReason = Snackbar.DismissReason;
5
+ export type SnackbarOptions = {
6
+ message: string;
7
+ status?: SnackbarStatus;
8
+ duration?: number;
9
+ priority?: SnackbarPriority;
10
+ actionLabel?: string;
11
+ onAction?: () => void;
12
+ };
13
+ export type SnackbarHandle = {
14
+ readonly id: string;
15
+ dismiss: () => void;
16
+ readonly closed: Promise<{
17
+ reason: SnackbarDismissReason;
18
+ }>;
19
+ };
20
+ export declare class SnackbarController {
21
+ private hostEl?;
22
+ private active?;
23
+ private getHost;
24
+ private clearTimer;
25
+ private scheduleTimer;
26
+ private dismissActive;
27
+ private pauseTimer;
28
+ private resumeTimer;
29
+ private applyToHost;
30
+ open(options: SnackbarOptions): SnackbarHandle;
31
+ dismiss(id?: string): void;
32
+ }
@@ -402,6 +402,87 @@ export declare namespace Components {
402
402
  */
403
403
  "open": boolean;
404
404
  }
405
+ /**
406
+ * Radio button component with form association, ARIA validation, accessible label support,
407
+ * and ARIA APG-compliant Arrow-key keyboard navigation.
408
+ * **Consumer responsibility — `role="radiogroup"`:**
409
+ * Wrap a group of `lmvz-radio` elements in a container element with `role="radiogroup"` and
410
+ * an accessible label via `aria-label` or `aria-labelledby`. `lmvz-radio` must not carry
411
+ * `role="radiogroup"` itself because a radio cannot also be a radiogroup.
412
+ * **Arrow-key navigation and roving tabindex:**
413
+ * When multiple `lmvz-radio` elements share the same `name` attribute, this component
414
+ * automatically handles Arrow Down / Arrow Right (next), Arrow Up / Arrow Left (previous),
415
+ * Home (first), and End (last) navigation with wrapping. Disabled radios are skipped.
416
+ * The checked radio has `tabindex="0"`. When no radio is checked, the first enabled radio
417
+ * in DOM order receives `tabindex="0"`, ensuring the group is always reachable by Tab.
418
+ * @example ```html
419
+ * <div role="radiogroup" aria-label="Choose an option">
420
+ * <lmvz-radio label="Option A" name="choice" checked></lmvz-radio>
421
+ * <lmvz-radio label="Option B" name="choice"></lmvz-radio>
422
+ * </div>
423
+ * ```
424
+ */
425
+ export interface LmvzRadio {
426
+ /**
427
+ * Whether the radio should autofocus.
428
+ * @default false
429
+ */
430
+ "autofocus": boolean;
431
+ /**
432
+ * Returns whether the radio satisfies its validation constraints.
433
+ */
434
+ "checkValidity": () => Promise<boolean>;
435
+ /**
436
+ * Whether the radio is checked. Setting this prop programmatically (e.g. `element.checked = true`) fires `lmvzChange` with the new value, unless the change occurs during native form lifecycle callbacks (`formResetCallback` or `formStateRestoreCallback`), in which case emission is suppressed to match native `<input type="radio">` behavior. Internal form state is always updated regardless of emission suppression.
437
+ * @default false
438
+ */
439
+ "checked": boolean;
440
+ /**
441
+ * Whether the radio is disabled.
442
+ * @default false
443
+ */
444
+ "disabled": boolean;
445
+ /**
446
+ * Whether the radio is in an error state.
447
+ * @default false
448
+ */
449
+ "error": boolean;
450
+ /**
451
+ * Sets focus on the native radio input.
452
+ */
453
+ "focusInput": () => Promise<void>;
454
+ /**
455
+ * Form id to associate with (for out-of-form usage). Reflected to the host attribute so both HTML attribute and programmatic assignment work.
456
+ */
457
+ "form"?: string;
458
+ /**
459
+ * Helper / description text displayed below the label.
460
+ */
461
+ "helperText"?: string;
462
+ /**
463
+ * Label text for the radio. Required for accessibility.
464
+ */
465
+ "label": string;
466
+ /**
467
+ * Name attribute for form submission via ElementInternals. When multiple `lmvz-radio` elements share the same `name` and form scope, the `name` is forwarded directly to the native `<input type="radio">`, enabling browser-native mutual exclusion: selecting one radio automatically deselects all others with the same name in that form. If a radio is outside any form, its scope defaults to the document level — same-name radios outside forms form a document-scoped group. Radios with the same `name` in different forms are independent groups. The `RadioGroupController` automatically manages roving tabindex (only the checked radio has `tabindex="0"`) and keyboard navigation (Arrow keys, Home, End) within the form-scoped group.
468
+ * @remarks A value of `""` (empty string) is forwarded to the native `<input>`, but `RadioGroupController` treats it as unnamed — no group coordination occurs between radios with `name=""`.
469
+ */
470
+ "name"?: string;
471
+ /**
472
+ * Reports validation errors to the user.
473
+ */
474
+ "reportValidity": () => Promise<boolean>;
475
+ /**
476
+ * Whether the radio is required.
477
+ * @default false
478
+ */
479
+ "required": boolean;
480
+ /**
481
+ * Form submission value when checked.
482
+ * @default 'on'
483
+ */
484
+ "value": string;
485
+ }
405
486
  /**
406
487
  * Select component with floating label and pill-shaped trigger.
407
488
  * Wraps a native `<select>` element for full keyboard and form support.
@@ -445,6 +526,24 @@ export declare namespace Components {
445
526
  */
446
527
  "value"?: string;
447
528
  }
529
+ export interface LmvzSnackbar {
530
+ "actionLabel"?: string;
531
+ "duration"?: number;
532
+ "hide": () => Promise<void>;
533
+ /**
534
+ * @default ''
535
+ */
536
+ "message": string;
537
+ /**
538
+ * @default 'normal'
539
+ */
540
+ "priority"?: Snackbar.Priority;
541
+ "show": () => Promise<void>;
542
+ /**
543
+ * @default 'success'
544
+ */
545
+ "status": Snackbar.Status;
546
+ }
448
547
  /**
449
548
  * Toggle (switch) component. Wraps a native `<input type="checkbox" role="switch">` for full keyboard and form support.
450
549
  * @example ```html
@@ -516,7 +615,7 @@ export declare namespace Icon {
516
615
 
517
616
  declare const iconSizes: readonly ["xs", "sm", "md", "lg", "inherit"];
518
617
 
519
- declare const iconWeights: readonly ["thin", "medium", "bold", "filled"];
618
+ declare const iconWeights: readonly ["thin", "medium", "bold"];
520
619
 
521
620
  export declare namespace Input {
522
621
  export type Type = (typeof inputTypes)[number];
@@ -906,6 +1005,83 @@ export declare namespace JSX {
906
1005
  */
907
1006
  "open"?: boolean;
908
1007
  }
1008
+ /**
1009
+ * Radio button component with form association, ARIA validation, accessible label support,
1010
+ * and ARIA APG-compliant Arrow-key keyboard navigation.
1011
+ * **Consumer responsibility — `role="radiogroup"`:**
1012
+ * Wrap a group of `lmvz-radio` elements in a container element with `role="radiogroup"` and
1013
+ * an accessible label via `aria-label` or `aria-labelledby`. `lmvz-radio` must not carry
1014
+ * `role="radiogroup"` itself because a radio cannot also be a radiogroup.
1015
+ * **Arrow-key navigation and roving tabindex:**
1016
+ * When multiple `lmvz-radio` elements share the same `name` attribute, this component
1017
+ * automatically handles Arrow Down / Arrow Right (next), Arrow Up / Arrow Left (previous),
1018
+ * Home (first), and End (last) navigation with wrapping. Disabled radios are skipped.
1019
+ * The checked radio has `tabindex="0"`. When no radio is checked, the first enabled radio
1020
+ * in DOM order receives `tabindex="0"`, ensuring the group is always reachable by Tab.
1021
+ * @example ```html
1022
+ * <div role="radiogroup" aria-label="Choose an option">
1023
+ * <lmvz-radio label="Option A" name="choice" checked></lmvz-radio>
1024
+ * <lmvz-radio label="Option B" name="choice"></lmvz-radio>
1025
+ * </div>
1026
+ * ```
1027
+ */
1028
+ export interface LmvzRadio {
1029
+ /**
1030
+ * Whether the radio should autofocus.
1031
+ * @default false
1032
+ */
1033
+ "autofocus"?: boolean;
1034
+ /**
1035
+ * Whether the radio is checked. Setting this prop programmatically (e.g. `element.checked = true`) fires `lmvzChange` with the new value, unless the change occurs during native form lifecycle callbacks (`formResetCallback` or `formStateRestoreCallback`), in which case emission is suppressed to match native `<input type="radio">` behavior. Internal form state is always updated regardless of emission suppression.
1036
+ * @default false
1037
+ */
1038
+ "checked"?: boolean;
1039
+ /**
1040
+ * Whether the radio is disabled.
1041
+ * @default false
1042
+ */
1043
+ "disabled"?: boolean;
1044
+ /**
1045
+ * Whether the radio is in an error state.
1046
+ * @default false
1047
+ */
1048
+ "error"?: boolean;
1049
+ /**
1050
+ * Form id to associate with (for out-of-form usage). Reflected to the host attribute so both HTML attribute and programmatic assignment work.
1051
+ */
1052
+ "form"?: string;
1053
+ /**
1054
+ * Helper / description text displayed below the label.
1055
+ */
1056
+ "helperText"?: string;
1057
+ /**
1058
+ * Label text for the radio. Required for accessibility.
1059
+ */
1060
+ "label": string;
1061
+ /**
1062
+ * Name attribute for form submission via ElementInternals. When multiple `lmvz-radio` elements share the same `name` and form scope, the `name` is forwarded directly to the native `<input type="radio">`, enabling browser-native mutual exclusion: selecting one radio automatically deselects all others with the same name in that form. If a radio is outside any form, its scope defaults to the document level — same-name radios outside forms form a document-scoped group. Radios with the same `name` in different forms are independent groups. The `RadioGroupController` automatically manages roving tabindex (only the checked radio has `tabindex="0"`) and keyboard navigation (Arrow keys, Home, End) within the form-scoped group.
1063
+ * @remarks A value of `""` (empty string) is forwarded to the native `<input>`, but `RadioGroupController` treats it as unnamed — no group coordination occurs between radios with `name=""`.
1064
+ */
1065
+ "name"?: string;
1066
+ /**
1067
+ * Fired on every explicit user activation of this radio — via click or Space key on the native input. Fires even when the radio is already checked (re-activation). Use this event to react to user intent; use `lmvzChange` to react to state transitions.
1068
+ */
1069
+ "onLmvzActivation"?: (event: LmvzRadioCustomEvent<void>) => void;
1070
+ /**
1071
+ * Emitted whenever the radio checked state changes. Event detail contains the new checked boolean value. Emission contract: - Fires `true` on user selection (native `change` event). - Fires on programmatic external prop transitions: `true → false` (emits `false`) and `false → true` (emits `true`), e.g. `element.checked = false` or `element.checked = true`. - Does NOT fire during browser-driven form lifecycle callbacks: `formResetCallback` and `formStateRestoreCallback` (autofill / session restore). This matches native `<input type="radio">` behaviour, which does not fire `change` on form reset. Note that internal form state (`ElementInternals.setFormValue`) is always updated regardless of suppression — only the event channel is silenced. - Does NOT re-fire from the `@Watch('checked')` watcher during the same tick as the native `change` handler, preventing a double-emission when the user clicks the radio.
1072
+ */
1073
+ "onLmvzChange"?: (event: LmvzRadioCustomEvent<boolean>) => void;
1074
+ /**
1075
+ * Whether the radio is required.
1076
+ * @default false
1077
+ */
1078
+ "required"?: boolean;
1079
+ /**
1080
+ * Form submission value when checked.
1081
+ * @default 'on'
1082
+ */
1083
+ "value"?: string;
1084
+ }
909
1085
  /**
910
1086
  * Select component with floating label and pill-shaped trigger.
911
1087
  * Wraps a native `<select>` element for full keyboard and form support.
@@ -953,6 +1129,23 @@ export declare namespace JSX {
953
1129
  */
954
1130
  "value"?: string;
955
1131
  }
1132
+ export interface LmvzSnackbar {
1133
+ "actionLabel"?: string;
1134
+ "duration"?: number;
1135
+ /**
1136
+ * @default ''
1137
+ */
1138
+ "message"?: string;
1139
+ "onLmvzClose"?: (event: LmvzSnackbarCustomEvent<{ reason: Snackbar.DismissReason }>) => void;
1140
+ /**
1141
+ * @default 'normal'
1142
+ */
1143
+ "priority"?: Snackbar.Priority;
1144
+ /**
1145
+ * @default 'success'
1146
+ */
1147
+ "status"?: Snackbar.Status;
1148
+ }
956
1149
  /**
957
1150
  * Toggle (switch) component. Wraps a native `<input type="checkbox" role="switch">` for full keyboard and form support.
958
1151
  * @example ```html
@@ -1080,6 +1273,18 @@ export declare namespace JSX {
1080
1273
  "open": boolean;
1081
1274
  "closeLabel": string;
1082
1275
  }
1276
+ export interface LmvzRadioAttributes {
1277
+ "label": string;
1278
+ "checked": boolean;
1279
+ "value": string;
1280
+ "name": string;
1281
+ "disabled": boolean;
1282
+ "required": boolean;
1283
+ "error": boolean;
1284
+ "helperText": string;
1285
+ "form": string;
1286
+ "autofocus": boolean;
1287
+ }
1083
1288
  export interface LmvzSelectAttributes {
1084
1289
  "value": string;
1085
1290
  "label": string;
@@ -1088,6 +1293,13 @@ export declare namespace JSX {
1088
1293
  "required": boolean;
1089
1294
  "name": string;
1090
1295
  }
1296
+ export interface LmvzSnackbarAttributes {
1297
+ "status": Snackbar.Status;
1298
+ "message": string;
1299
+ "duration": number;
1300
+ "priority": Snackbar.Priority;
1301
+ "actionLabel": string;
1302
+ }
1091
1303
  export interface LmvzToggleAttributes {
1092
1304
  "label": string;
1093
1305
  "checked": boolean;
@@ -1110,7 +1322,9 @@ export declare namespace JSX {
1110
1322
  "lmvz-input": Omit<LmvzInput, keyof LmvzInputAttributes> & { [K in keyof LmvzInput & keyof LmvzInputAttributes]?: LmvzInput[K] } & { [K in keyof LmvzInput & keyof LmvzInputAttributes as `attr:${K}`]?: LmvzInputAttributes[K] } & { [K in keyof LmvzInput & keyof LmvzInputAttributes as `prop:${K}`]?: LmvzInput[K] } & OneOf<"label", LmvzInput["label"], LmvzInputAttributes["label"]>;
1111
1323
  "lmvz-menuitem": Omit<LmvzMenuitem, keyof LmvzMenuitemAttributes> & { [K in keyof LmvzMenuitem & keyof LmvzMenuitemAttributes]?: LmvzMenuitem[K] } & { [K in keyof LmvzMenuitem & keyof LmvzMenuitemAttributes as `attr:${K}`]?: LmvzMenuitemAttributes[K] } & { [K in keyof LmvzMenuitem & keyof LmvzMenuitemAttributes as `prop:${K}`]?: LmvzMenuitem[K] };
1112
1324
  "lmvz-modal": Omit<LmvzModal, keyof LmvzModalAttributes> & { [K in keyof LmvzModal & keyof LmvzModalAttributes]?: LmvzModal[K] } & { [K in keyof LmvzModal & keyof LmvzModalAttributes as `attr:${K}`]?: LmvzModalAttributes[K] } & { [K in keyof LmvzModal & keyof LmvzModalAttributes as `prop:${K}`]?: LmvzModal[K] };
1325
+ "lmvz-radio": Omit<LmvzRadio, keyof LmvzRadioAttributes> & { [K in keyof LmvzRadio & keyof LmvzRadioAttributes]?: LmvzRadio[K] } & { [K in keyof LmvzRadio & keyof LmvzRadioAttributes as `attr:${K}`]?: LmvzRadioAttributes[K] } & { [K in keyof LmvzRadio & keyof LmvzRadioAttributes as `prop:${K}`]?: LmvzRadio[K] } & OneOf<"label", LmvzRadio["label"], LmvzRadioAttributes["label"]>;
1113
1326
  "lmvz-select": Omit<LmvzSelect, keyof LmvzSelectAttributes> & { [K in keyof LmvzSelect & keyof LmvzSelectAttributes]?: LmvzSelect[K] } & { [K in keyof LmvzSelect & keyof LmvzSelectAttributes as `attr:${K}`]?: LmvzSelectAttributes[K] } & { [K in keyof LmvzSelect & keyof LmvzSelectAttributes as `prop:${K}`]?: LmvzSelect[K] } & OneOf<"label", LmvzSelect["label"], LmvzSelectAttributes["label"]>;
1327
+ "lmvz-snackbar": Omit<LmvzSnackbar, keyof LmvzSnackbarAttributes> & { [K in keyof LmvzSnackbar & keyof LmvzSnackbarAttributes]?: LmvzSnackbar[K] } & { [K in keyof LmvzSnackbar & keyof LmvzSnackbarAttributes as `attr:${K}`]?: LmvzSnackbarAttributes[K] } & { [K in keyof LmvzSnackbar & keyof LmvzSnackbarAttributes as `prop:${K}`]?: LmvzSnackbar[K] };
1114
1328
  "lmvz-toggle": Omit<LmvzToggle, keyof LmvzToggleAttributes> & { [K in keyof LmvzToggle & keyof LmvzToggleAttributes]?: LmvzToggle[K] } & { [K in keyof LmvzToggle & keyof LmvzToggleAttributes as `attr:${K}`]?: LmvzToggleAttributes[K] } & { [K in keyof LmvzToggle & keyof LmvzToggleAttributes as `prop:${K}`]?: LmvzToggle[K] } & OneOf<"label", LmvzToggle["label"], LmvzToggleAttributes["label"]>;
1115
1329
  }
1116
1330
  }
@@ -1155,11 +1369,21 @@ export declare interface LmvzModalCustomEvent<T> extends CustomEvent<T> {
1155
1369
  target: HTMLLmvzModalElement;
1156
1370
  }
1157
1371
 
1372
+ export declare interface LmvzRadioCustomEvent<T> extends CustomEvent<T> {
1373
+ detail: T;
1374
+ target: HTMLLmvzRadioElement;
1375
+ }
1376
+
1158
1377
  export declare interface LmvzSelectCustomEvent<T> extends CustomEvent<T> {
1159
1378
  detail: T;
1160
1379
  target: HTMLLmvzSelectElement;
1161
1380
  }
1162
1381
 
1382
+ export declare interface LmvzSnackbarCustomEvent<T> extends CustomEvent<T> {
1383
+ detail: T;
1384
+ target: HTMLLmvzSnackbarElement;
1385
+ }
1386
+
1163
1387
  export declare interface LmvzToggleCustomEvent<T> extends CustomEvent<T> {
1164
1388
  detail: T;
1165
1389
  target: HTMLLmvzToggleElement;
@@ -1169,6 +1393,18 @@ declare const scaleValues: readonly ["small", "default", "large"];
1169
1393
 
1170
1394
  declare const sizes: readonly ["xs", "sm", "md", "lg"];
1171
1395
 
1396
+ export declare namespace Snackbar {
1397
+ export type Status = (typeof snackbarStatuses)[number];
1398
+ export type Priority = (typeof snackbarPriorities)[number];
1399
+ export type DismissReason = (typeof snackbarDismissReasons)[number];
1400
+ }
1401
+
1402
+ declare const snackbarDismissReasons: readonly ["timeout", "manual", "action", "overridden", "swallowed"];
1403
+
1404
+ declare const snackbarPriorities: readonly ["low", "normal", "high"];
1405
+
1406
+ declare const snackbarStatuses: readonly ["success", "warning", "error"];
1407
+
1172
1408
  export declare type SVGString = string & Brand.Brand<'SVG'>;
1173
1409
 
1174
1410
  declare const variants: readonly ["primary", "secondary", "tertiary"];
package/types/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export type * from './components.d.ts';
3
3
  export { chipSizes, chipTypes, iconSizes, iconWeights, inputTypes, textSizes } from './api/ds.constants';
4
4
  export type { LmvzDS, Typography } from './api';
5
5
  export * from './utils/public';
6
+ export * from './components/lmvz-snackbar/public';
@@ -1070,6 +1070,7 @@ export declare namespace JSXBase {
1070
1070
  importance?: 'low' | 'auto' | 'high';
1071
1071
  height?: number | string;
1072
1072
  loading?: 'lazy' | 'auto' | 'eager';
1073
+ referrerPolicy?: ReferrerPolicy;
1073
1074
  sizes?: string;
1074
1075
  src?: string;
1075
1076
  srcSet?: string;
@@ -0,0 +1,26 @@
1
+ import type { ReactiveController } from '../reactive-controller-host';
2
+ export interface RadioHost {
3
+ el: HTMLElement;
4
+ name?: string;
5
+ checked: boolean;
6
+ disabled: boolean;
7
+ focusInput(): Promise<void>;
8
+ }
9
+ export declare class RadioGroupController implements ReactiveController {
10
+ private readonly host;
11
+ private static registry;
12
+ private group;
13
+ private _groupKey;
14
+ private _scope;
15
+ constructor(host: RadioHost);
16
+ hostConnected(): void;
17
+ hostDidRender(): void;
18
+ hostDisconnected(): void;
19
+ get sortedEnabled(): RadioHost[];
20
+ select(selectedHost: RadioHost): void;
21
+ setFocused(host: RadioHost): void;
22
+ clearFocused(): void;
23
+ updateTabindex(): void;
24
+ private static acquireGroup;
25
+ private static releaseGroup;
26
+ }
@@ -1,4 +0,0 @@
1
- <svg width="12" height="12" viewBox="0 0 24 24" fill="none"
2
- xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
3
- <path d="M3.75 12.5625L8.83079 17.625L20.4375 6.375" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
4
- </svg>
@@ -1,3 +0,0 @@
1
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M6 6L12 12M12 12L18 18M12 12L6 18M12 12L18 6" stroke="black" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
3
- </svg>