@lmvz-ds/components 0.25.0 → 0.27.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 (158) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/cjs/{reactive-controller-host-DrtMkMd7.js → aria-validation-controller-BMV2tv9-.js} +0 -41
  3. package/cjs/{ds.constants-DSnxZ3ia.js → ds.constants-8fh6ItAF.js} +1 -1
  4. package/cjs/index.cjs.js +196 -2
  5. package/cjs/list-keyboard-controller-CzZdPBeH.js +173 -0
  6. package/cjs/lmvz-button-group.cjs.entry.js +183 -0
  7. package/cjs/lmvz-button_2.cjs.entry.js +199 -0
  8. package/cjs/lmvz-card.cjs.entry.js +1 -1
  9. package/cjs/lmvz-checkbox.cjs.entry.js +8 -4
  10. package/cjs/lmvz-chip.cjs.entry.js +5 -4
  11. package/cjs/lmvz-components.cjs.js +1 -1
  12. package/cjs/lmvz-header_2.cjs.entry.js +7 -51
  13. package/cjs/lmvz-input.cjs.entry.js +3 -2
  14. package/cjs/lmvz-menuitem.cjs.entry.js +4 -3
  15. package/cjs/lmvz-modal.cjs.entry.js +4 -3
  16. package/cjs/lmvz-radio.cjs.entry.js +4 -3
  17. package/cjs/lmvz-select.cjs.entry.js +3 -2
  18. package/cjs/lmvz-snackbar.cjs.entry.js +83 -0
  19. package/cjs/lmvz-tab.cjs.entry.js +31 -0
  20. package/cjs/lmvz-tabs.cjs.entry.js +256 -0
  21. package/cjs/lmvz-toggle.cjs.entry.js +5 -4
  22. package/cjs/loader.cjs.js +1 -1
  23. package/cjs/reactive-controller-host-B_lZtcA6.js +43 -0
  24. package/collection/api/ds.constants.js +4 -1
  25. package/collection/collection-manifest.json +3 -0
  26. package/collection/components/lmvz-button/lmvz-button.css +6 -6
  27. package/collection/components/lmvz-button-group/lmvz-button-group.css +2 -2
  28. package/collection/components/lmvz-card/lmvz-card.css +9 -9
  29. package/collection/components/lmvz-checkbox/lmvz-checkbox.css +14 -12
  30. package/collection/components/lmvz-checkbox/lmvz-checkbox.js +4 -1
  31. package/collection/components/lmvz-chip/lmvz-chip.css +2 -2
  32. package/collection/components/lmvz-header/lmvz-header.js +3 -3
  33. package/collection/components/lmvz-icon/lmvz-icon.js +1 -1
  34. package/collection/components/lmvz-menuitem/lmvz-menuitem.css +1 -1
  35. package/collection/components/lmvz-modal/lmvz-modal.css +4 -16
  36. package/collection/components/lmvz-radio/lmvz-radio.css +4 -4
  37. package/collection/components/lmvz-snackbar/lmvz-snackbar.css +101 -0
  38. package/collection/components/lmvz-snackbar/lmvz-snackbar.js +266 -0
  39. package/collection/components/lmvz-snackbar/public.js +1 -0
  40. package/collection/components/lmvz-snackbar/snackbar-controller.js +194 -0
  41. package/collection/components/lmvz-tab/lmvz-tab.css +148 -0
  42. package/collection/components/lmvz-tab/lmvz-tab.js +125 -0
  43. package/collection/components/lmvz-tabs/lmvz-tabs.css +58 -0
  44. package/collection/components/lmvz-tabs/lmvz-tabs.js +399 -0
  45. package/collection/components/lmvz-toggle/lmvz-toggle.css +2 -2
  46. package/collection/components/lmvz-toggle/lmvz-toggle.js +1 -1
  47. package/collection/index.js +1 -0
  48. package/collection/integration/header-integration/header-integration.js +1 -1
  49. package/collection/utils/aria/list-keyboard-controller.js +151 -28
  50. package/components/index.d.ts +6 -0
  51. package/components/index.d.ts.bak +6 -0
  52. package/components/index.js +1 -1
  53. package/components/lmvz-action.js +1 -1
  54. package/components/lmvz-button-group.js +1 -1
  55. package/components/lmvz-button.js +1 -1
  56. package/components/lmvz-card.js +1 -1
  57. package/components/lmvz-checkbox.js +1 -1
  58. package/components/lmvz-chip.js +1 -1
  59. package/components/lmvz-header.js +1 -1
  60. package/components/lmvz-icon.js +1 -1
  61. package/components/lmvz-input.js +1 -1
  62. package/components/lmvz-menuitem.js +1 -1
  63. package/components/lmvz-modal.js +1 -1
  64. package/components/lmvz-radio.js +1 -1
  65. package/components/lmvz-select.js +1 -1
  66. package/components/lmvz-snackbar.d.ts +11 -0
  67. package/components/lmvz-snackbar.d.ts.bak +11 -0
  68. package/components/lmvz-snackbar.js +1 -0
  69. package/components/lmvz-tab.d.ts +11 -0
  70. package/components/lmvz-tab.d.ts.bak +11 -0
  71. package/components/lmvz-tab.js +1 -0
  72. package/components/lmvz-tabs.d.ts +11 -0
  73. package/components/lmvz-tabs.d.ts.bak +11 -0
  74. package/components/lmvz-tabs.js +1 -0
  75. package/components/lmvz-toggle.js +1 -1
  76. package/components/p-0P2Wb3pE.js +1 -0
  77. package/components/p-2VdcUIrr.js +1 -0
  78. package/components/p-BJEQw1Sz.js +1 -0
  79. package/components/{p-Bb-kEOmU.js → p-Cs7RCOHZ.js} +1 -1
  80. package/components/p-CtaMrBNE.js +1 -0
  81. package/components/p-DjvbwRyl.js +1 -0
  82. package/components/{p-DYr7Jc0V.js → p-c7OzBK8f.js} +1 -1
  83. package/esm/{reactive-controller-host-ZrGf1F2-.js → aria-validation-controller-D-KO0Asb.js} +1 -41
  84. package/esm/{ds.constants-Bmi89ll1.js → ds.constants-BOOwq5dE.js} +1 -1
  85. package/esm/index.js +198 -1
  86. package/esm/list-keyboard-controller-Coi8XfUH.js +171 -0
  87. package/esm/lmvz-button-group.entry.js +181 -0
  88. package/esm/lmvz-button_2.entry.js +196 -0
  89. package/esm/lmvz-card.entry.js +1 -1
  90. package/esm/lmvz-checkbox.entry.js +7 -3
  91. package/esm/lmvz-chip.entry.js +4 -3
  92. package/esm/lmvz-components.js +1 -1
  93. package/esm/lmvz-header_2.entry.js +6 -50
  94. package/esm/lmvz-input.entry.js +2 -1
  95. package/esm/lmvz-menuitem.entry.js +3 -2
  96. package/esm/lmvz-modal.entry.js +3 -2
  97. package/esm/lmvz-radio.entry.js +3 -2
  98. package/esm/lmvz-select.entry.js +2 -1
  99. package/esm/lmvz-snackbar.entry.js +81 -0
  100. package/esm/lmvz-tab.entry.js +29 -0
  101. package/esm/lmvz-tabs.entry.js +254 -0
  102. package/esm/lmvz-toggle.entry.js +4 -3
  103. package/esm/loader.js +1 -1
  104. package/esm/reactive-controller-host-FBuCCcFC.js +41 -0
  105. package/hydrate/index.js +565 -40
  106. package/hydrate/index.mjs +565 -40
  107. package/lmvz-components/index.esm.js +1 -1
  108. package/lmvz-components/lmvz-components.esm.js +1 -1
  109. package/lmvz-components/p-0a37e0f2.entry.js +1 -0
  110. package/lmvz-components/p-25f045b2.entry.js +1 -0
  111. package/lmvz-components/p-43b463bf.entry.js +1 -0
  112. package/lmvz-components/p-4bd71a3c.entry.js +1 -0
  113. package/lmvz-components/p-6484fbc6.entry.js +1 -0
  114. package/lmvz-components/p-6988c3ea.entry.js +1 -0
  115. package/lmvz-components/p-6de9981f.entry.js +1 -0
  116. package/lmvz-components/p-758dbb82.entry.js +1 -0
  117. package/lmvz-components/p-7b15cdce.entry.js +1 -0
  118. package/lmvz-components/p-8874ff19.entry.js +1 -0
  119. package/lmvz-components/p-BOOwq5dE.js +1 -0
  120. package/lmvz-components/p-CtaMrBNE.js +1 -0
  121. package/lmvz-components/p-FBuCCcFC.js +1 -0
  122. package/lmvz-components/p-a5c921dc.entry.js +1 -0
  123. package/lmvz-components/p-bb46a884.entry.js +1 -0
  124. package/lmvz-components/p-bd23eab3.entry.js +1 -0
  125. package/lmvz-components/p-c6228cee.entry.js +1 -0
  126. package/lmvz-components/p-da16ff58.entry.js +1 -0
  127. package/lmvz-components/p-hRb38wX6.js +1 -0
  128. package/manifest.json +858 -186
  129. package/package.json +13 -1
  130. package/types/api/ds.constants.d.ts +9 -1
  131. package/types/components/lmvz-checkbox/lmvz-checkbox.d.ts +1 -0
  132. package/types/components/lmvz-header/lmvz-header.d.ts +2 -2
  133. package/types/components/lmvz-snackbar/lmvz-snackbar.d.ts +21 -0
  134. package/types/components/lmvz-snackbar/public.d.ts +2 -0
  135. package/types/components/lmvz-snackbar/snackbar-controller.d.ts +32 -0
  136. package/types/components/lmvz-tab/lmvz-tab.d.ts +11 -0
  137. package/types/components/lmvz-tabs/lmvz-tabs.d.ts +43 -0
  138. package/types/components.d.ts +212 -1
  139. package/types/index.d.ts +1 -0
  140. package/types/utils/aria/list-keyboard-controller.d.ts +28 -5
  141. package/cjs/lmvz-button_3.cjs.entry.js +0 -375
  142. package/components/p-CCcoDnH-.js +0 -1
  143. package/components/p-CNmHnJ1D.js +0 -1
  144. package/components/p-vUYpZZoR.js +0 -1
  145. package/esm/lmvz-button_3.entry.js +0 -371
  146. package/lmvz-components/p-01aeca60.entry.js +0 -1
  147. package/lmvz-components/p-0dced359.entry.js +0 -1
  148. package/lmvz-components/p-2044a9ac.entry.js +0 -1
  149. package/lmvz-components/p-3c2adbb4.entry.js +0 -1
  150. package/lmvz-components/p-3df070b0.entry.js +0 -1
  151. package/lmvz-components/p-758078db.entry.js +0 -1
  152. package/lmvz-components/p-90f5a19d.entry.js +0 -1
  153. package/lmvz-components/p-Bmi89ll1.js +0 -1
  154. package/lmvz-components/p-CwX1wKkM.js +0 -1
  155. package/lmvz-components/p-acfeae08.entry.js +0 -1
  156. package/lmvz-components/p-c01a6c70.entry.js +0 -1
  157. package/lmvz-components/p-e1eaa7a2.entry.js +0 -1
  158. package/lmvz-components/p-e23d0054.entry.js +0 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lmvz-ds/components",
3
3
  "private": false,
4
- "version": "0.25.0",
4
+ "version": "0.27.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,18 @@
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
+ },
79
+ "./lmvz-tab": {
80
+ "types": "./components/lmvz-tab.d.ts",
81
+ "import": "./components/lmvz-tab.js"
82
+ },
83
+ "./lmvz-tabs": {
84
+ "types": "./components/lmvz-tabs.d.ts",
85
+ "import": "./components/lmvz-tabs.js"
86
+ },
75
87
  "./lmvz-checkbox": {
76
88
  "import": "./components/lmvz-checkbox.js",
77
89
  "types": "./components/lmvz-checkbox.d.ts"
@@ -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
+ }
@@ -35,5 +35,6 @@ export declare class LmvzCheckbox extends ReactiveControllerHost implements Aria
35
35
  formResetCallback(): void;
36
36
  formStateRestoreCallback(state: string | File | FormData): void;
37
37
  private handleChange;
38
+ private retargetInnerClicks;
38
39
  render(): any;
39
40
  }
@@ -1,7 +1,7 @@
1
1
  import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
2
- import { type ListKeyboardNavigationHost } from '../../utils/aria/list-keyboard-controller';
2
+ import { type DirectionalFocusHost } from '../../utils/aria/list-keyboard-controller';
3
3
  import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
4
- export declare class LmvzHeader extends ReactiveControllerHost implements AriaValidationHost, ListKeyboardNavigationHost {
4
+ export declare class LmvzHeader extends ReactiveControllerHost implements AriaValidationHost, DirectionalFocusHost {
5
5
  readonly el: HTMLElement;
6
6
  get validationEl(): HTMLElement;
7
7
  private primarySlot?;
@@ -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
+ }
@@ -0,0 +1,11 @@
1
+ export declare class LmvzTab {
2
+ readonly el: HTMLElement;
3
+ private mediaSlotEl?;
4
+ value: string;
5
+ disabled: boolean;
6
+ selected: boolean;
7
+ vertical: boolean;
8
+ private readonly handleMediaSlotChange;
9
+ componentDidLoad(): void;
10
+ render(): any;
11
+ }
@@ -0,0 +1,43 @@
1
+ import { type EventEmitter } from '../../stencil-public-runtime';
2
+ import { type DirectionalFocusHost } from '../../utils/aria/list-keyboard-controller';
3
+ import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
4
+ export declare class LmvzTabs extends ReactiveControllerHost implements DirectionalFocusHost {
5
+ readonly el: HTMLElement;
6
+ private readonly instanceId;
7
+ private tabSlotEl?;
8
+ private panelSlotEl?;
9
+ private focusController;
10
+ value: string;
11
+ orientation: 'horizontal' | 'vertical';
12
+ lmvzChange: EventEmitter<{
13
+ value: string;
14
+ }>;
15
+ private resolvedValue?;
16
+ constructor();
17
+ componentWillLoad(): void;
18
+ componentDidLoad(): void;
19
+ disconnectedCallback(): void;
20
+ handleValueChange(newValue: string): void;
21
+ handleOrientationChange(): void;
22
+ activateTab(value: string): Promise<void>;
23
+ getTabElements(): Promise<HTMLElement[]>;
24
+ setTabPanelIds(pairs: Array<[string, string]>): Promise<void>;
25
+ private get slottedTabs();
26
+ private get slottedPanels();
27
+ private readonly handleTabSlotChange;
28
+ private readonly handlePanelSlotChange;
29
+ private readonly handleTabReady;
30
+ private updateIconTabsAttr;
31
+ private syncFocusTargets;
32
+ private syncOrientation;
33
+ private syncTabOrientation;
34
+ private wireAriaIds;
35
+ private applySelection;
36
+ private isTabDisabled;
37
+ private findTabByValue;
38
+ private findNearestEnabled;
39
+ private selectTab;
40
+ private readonly handleTabClick;
41
+ private readonly handleKeydown;
42
+ render(): any;
43
+ }
@@ -526,6 +526,95 @@ export declare namespace Components {
526
526
  */
527
527
  "value"?: string;
528
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
+ }
547
+ /**
548
+ * The tab trigger primitive. Must be used as a direct child of `lmvz-tabs`.
549
+ * Selection state, ARIA semantics (tablist/tab/tabpanel), keyboard management,
550
+ * and roving tabindex are all owned by the parent `lmvz-tabs` component.
551
+ */
552
+ export interface LmvzTab {
553
+ /**
554
+ * Whether the tab is disabled. Disabled tabs are not activatable and are skipped by arrow-key navigation in `lmvz-tabs`.
555
+ * @default false
556
+ */
557
+ "disabled": boolean;
558
+ /**
559
+ * Whether this tab is currently selected. Set by the parent `lmvz-tabs` component — do not set manually.
560
+ * @default false
561
+ */
562
+ "selected": boolean;
563
+ /**
564
+ * Unique value that identifies this tab within its `lmvz-tabs` parent. The parent uses this to track the selected tab.
565
+ */
566
+ "value": string;
567
+ /**
568
+ * Vertical orientation context. Set by the parent `lmvz-tabs` when `orientation="vertical"` — do not set manually. When true the selection indicator moves to the inline-start edge.
569
+ * @default false
570
+ */
571
+ "vertical": boolean;
572
+ }
573
+ /**
574
+ * The semantics and state owner for the WAI-ARIA tabs pattern.
575
+ * `lmvz-tabs` owns:
576
+ * - `tablist` / `tab` / `tabpanel` ARIA semantics
577
+ * - Selected-value state and manual activation (`Enter`, `Space`, click)
578
+ * - Roving `tabindex` via `DirectionalFocusController`
579
+ * - Horizontal scroll overflow (horizontal mode only)
580
+ * - Disabled-tab skipping and nearest-enabled fallback
581
+ * - Child registration and panel linkage via `aria-controls` / `aria-labelledby`
582
+ * Panels are consumer-authored light-DOM elements. Associate each panel with
583
+ * its tab by adding an `id` attribute — either matching `lmvz-tab[panel]` or
584
+ * derived positionally when no explicit id is provided.
585
+ * @event lmvzChange - Fired when a tab is activated. Detail: `{ value: string }`.
586
+ * @example ```html
587
+ * <lmvz-tabs value="home">
588
+ * <lmvz-tab value="home">Home</lmvz-tab>
589
+ * <lmvz-tab value="settings" disabled>Settings</lmvz-tab>
590
+ * <div slot="panels" id="panel-home" role="tabpanel">Home content</div>
591
+ * <div slot="panels" id="panel-settings" role="tabpanel">Settings content</div>
592
+ * </lmvz-tabs>
593
+ * ```
594
+ */
595
+ export interface LmvzTabs {
596
+ /**
597
+ * Programmatically activate a tab by value. Disabled tabs are ignored; emits `lmvzChange` on change.
598
+ */
599
+ "activateTab": (value: string) => Promise<void>;
600
+ /**
601
+ * Returns all slotted `lmvz-tab` elements. Exposed for external orchestration.
602
+ */
603
+ "getTabElements": () => Promise<HTMLElement[]>;
604
+ /**
605
+ * Layout and keyboard-navigation orientation.
606
+ * @default 'horizontal'
607
+ */
608
+ "orientation": 'horizontal' | 'vertical';
609
+ /**
610
+ * Wires `aria-controls` on each tab and `aria-labelledby` on each panel using the provided ordered array of `[tabId, panelId]` pairs. Callers only need this for explicit control; `lmvz-tabs` wires positional pairs automatically on `slotchange`.
611
+ */
612
+ "setTabPanelIds": (pairs: Array<[string, string]>) => Promise<void>;
613
+ /**
614
+ * The `value` of the currently selected tab.
615
+ */
616
+ "value": string;
617
+ }
529
618
  /**
530
619
  * Toggle (switch) component. Wraps a native `<input type="checkbox" role="switch">` for full keyboard and form support.
531
620
  * @example ```html
@@ -597,7 +686,7 @@ export declare namespace Icon {
597
686
 
598
687
  declare const iconSizes: readonly ["xs", "sm", "md", "lg", "inherit"];
599
688
 
600
- declare const iconWeights: readonly ["thin", "medium", "bold", "filled"];
689
+ declare const iconWeights: readonly ["thin", "medium", "bold"];
601
690
 
602
691
  export declare namespace Input {
603
692
  export type Type = (typeof inputTypes)[number];
@@ -1111,6 +1200,86 @@ export declare namespace JSX {
1111
1200
  */
1112
1201
  "value"?: string;
1113
1202
  }
1203
+ export interface LmvzSnackbar {
1204
+ "actionLabel"?: string;
1205
+ "duration"?: number;
1206
+ /**
1207
+ * @default ''
1208
+ */
1209
+ "message"?: string;
1210
+ "onLmvzClose"?: (event: LmvzSnackbarCustomEvent<{ reason: Snackbar.DismissReason }>) => void;
1211
+ /**
1212
+ * @default 'normal'
1213
+ */
1214
+ "priority"?: Snackbar.Priority;
1215
+ /**
1216
+ * @default 'success'
1217
+ */
1218
+ "status"?: Snackbar.Status;
1219
+ }
1220
+ /**
1221
+ * The tab trigger primitive. Must be used as a direct child of `lmvz-tabs`.
1222
+ * Selection state, ARIA semantics (tablist/tab/tabpanel), keyboard management,
1223
+ * and roving tabindex are all owned by the parent `lmvz-tabs` component.
1224
+ */
1225
+ export interface LmvzTab {
1226
+ /**
1227
+ * Whether the tab is disabled. Disabled tabs are not activatable and are skipped by arrow-key navigation in `lmvz-tabs`.
1228
+ * @default false
1229
+ */
1230
+ "disabled"?: boolean;
1231
+ /**
1232
+ * Whether this tab is currently selected. Set by the parent `lmvz-tabs` component — do not set manually.
1233
+ * @default false
1234
+ */
1235
+ "selected"?: boolean;
1236
+ /**
1237
+ * Unique value that identifies this tab within its `lmvz-tabs` parent. The parent uses this to track the selected tab.
1238
+ */
1239
+ "value": string;
1240
+ /**
1241
+ * Vertical orientation context. Set by the parent `lmvz-tabs` when `orientation="vertical"` — do not set manually. When true the selection indicator moves to the inline-start edge.
1242
+ * @default false
1243
+ */
1244
+ "vertical"?: boolean;
1245
+ }
1246
+ /**
1247
+ * The semantics and state owner for the WAI-ARIA tabs pattern.
1248
+ * `lmvz-tabs` owns:
1249
+ * - `tablist` / `tab` / `tabpanel` ARIA semantics
1250
+ * - Selected-value state and manual activation (`Enter`, `Space`, click)
1251
+ * - Roving `tabindex` via `DirectionalFocusController`
1252
+ * - Horizontal scroll overflow (horizontal mode only)
1253
+ * - Disabled-tab skipping and nearest-enabled fallback
1254
+ * - Child registration and panel linkage via `aria-controls` / `aria-labelledby`
1255
+ * Panels are consumer-authored light-DOM elements. Associate each panel with
1256
+ * its tab by adding an `id` attribute — either matching `lmvz-tab[panel]` or
1257
+ * derived positionally when no explicit id is provided.
1258
+ * @event lmvzChange - Fired when a tab is activated. Detail: `{ value: string }`.
1259
+ * @example ```html
1260
+ * <lmvz-tabs value="home">
1261
+ * <lmvz-tab value="home">Home</lmvz-tab>
1262
+ * <lmvz-tab value="settings" disabled>Settings</lmvz-tab>
1263
+ * <div slot="panels" id="panel-home" role="tabpanel">Home content</div>
1264
+ * <div slot="panels" id="panel-settings" role="tabpanel">Settings content</div>
1265
+ * </lmvz-tabs>
1266
+ * ```
1267
+ */
1268
+ export interface LmvzTabs {
1269
+ /**
1270
+ * Emitted when a tab is activated. Detail: `{ value: string }`.
1271
+ */
1272
+ "onLmvzChange"?: (event: LmvzTabsCustomEvent<{ value: string }>) => void;
1273
+ /**
1274
+ * Layout and keyboard-navigation orientation.
1275
+ * @default 'horizontal'
1276
+ */
1277
+ "orientation"?: 'horizontal' | 'vertical';
1278
+ /**
1279
+ * The `value` of the currently selected tab.
1280
+ */
1281
+ "value": string;
1282
+ }
1114
1283
  /**
1115
1284
  * Toggle (switch) component. Wraps a native `<input type="checkbox" role="switch">` for full keyboard and form support.
1116
1285
  * @example ```html
@@ -1258,6 +1427,23 @@ export declare namespace JSX {
1258
1427
  "required": boolean;
1259
1428
  "name": string;
1260
1429
  }
1430
+ export interface LmvzSnackbarAttributes {
1431
+ "status": Snackbar.Status;
1432
+ "message": string;
1433
+ "duration": number;
1434
+ "priority": Snackbar.Priority;
1435
+ "actionLabel": string;
1436
+ }
1437
+ export interface LmvzTabAttributes {
1438
+ "value": string;
1439
+ "disabled": boolean;
1440
+ "selected": boolean;
1441
+ "vertical": boolean;
1442
+ }
1443
+ export interface LmvzTabsAttributes {
1444
+ "value": string;
1445
+ "orientation": 'horizontal' | 'vertical';
1446
+ }
1261
1447
  export interface LmvzToggleAttributes {
1262
1448
  "label": string;
1263
1449
  "checked": boolean;
@@ -1282,6 +1468,9 @@ export declare namespace JSX {
1282
1468
  "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] };
1283
1469
  "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"]>;
1284
1470
  "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"]>;
1471
+ "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] };
1472
+ "lmvz-tab": Omit<LmvzTab, keyof LmvzTabAttributes> & { [K in keyof LmvzTab & keyof LmvzTabAttributes]?: LmvzTab[K] } & { [K in keyof LmvzTab & keyof LmvzTabAttributes as `attr:${K}`]?: LmvzTabAttributes[K] } & { [K in keyof LmvzTab & keyof LmvzTabAttributes as `prop:${K}`]?: LmvzTab[K] } & OneOf<"value", LmvzTab["value"], LmvzTabAttributes["value"]>;
1473
+ "lmvz-tabs": Omit<LmvzTabs, keyof LmvzTabsAttributes> & { [K in keyof LmvzTabs & keyof LmvzTabsAttributes]?: LmvzTabs[K] } & { [K in keyof LmvzTabs & keyof LmvzTabsAttributes as `attr:${K}`]?: LmvzTabsAttributes[K] } & { [K in keyof LmvzTabs & keyof LmvzTabsAttributes as `prop:${K}`]?: LmvzTabs[K] } & OneOf<"value", LmvzTabs["value"], LmvzTabsAttributes["value"]>;
1285
1474
  "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"]>;
1286
1475
  }
1287
1476
  }
@@ -1336,6 +1525,16 @@ export declare interface LmvzSelectCustomEvent<T> extends CustomEvent<T> {
1336
1525
  target: HTMLLmvzSelectElement;
1337
1526
  }
1338
1527
 
1528
+ export declare interface LmvzSnackbarCustomEvent<T> extends CustomEvent<T> {
1529
+ detail: T;
1530
+ target: HTMLLmvzSnackbarElement;
1531
+ }
1532
+
1533
+ export declare interface LmvzTabsCustomEvent<T> extends CustomEvent<T> {
1534
+ detail: T;
1535
+ target: HTMLLmvzTabsElement;
1536
+ }
1537
+
1339
1538
  export declare interface LmvzToggleCustomEvent<T> extends CustomEvent<T> {
1340
1539
  detail: T;
1341
1540
  target: HTMLLmvzToggleElement;
@@ -1345,6 +1544,18 @@ declare const scaleValues: readonly ["small", "default", "large"];
1345
1544
 
1346
1545
  declare const sizes: readonly ["xs", "sm", "md", "lg"];
1347
1546
 
1547
+ export declare namespace Snackbar {
1548
+ export type Status = (typeof snackbarStatuses)[number];
1549
+ export type Priority = (typeof snackbarPriorities)[number];
1550
+ export type DismissReason = (typeof snackbarDismissReasons)[number];
1551
+ }
1552
+
1553
+ declare const snackbarDismissReasons: readonly ["timeout", "manual", "action", "overridden", "swallowed"];
1554
+
1555
+ declare const snackbarPriorities: readonly ["low", "normal", "high"];
1556
+
1557
+ declare const snackbarStatuses: readonly ["success", "warning", "error"];
1558
+
1348
1559
  export declare type SVGString = string & Brand.Brand<'SVG'>;
1349
1560
 
1350
1561
  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';
@@ -1,13 +1,36 @@
1
1
  import type { ReactiveController } from '../reactive-controller-host';
2
- export type ListKeyboardNavigationHost = {
2
+ export type DirectionalFocusHost = {
3
3
  el: HTMLElement;
4
4
  };
5
- export declare class ListKeyboardNavigationController implements ReactiveController {
5
+ export type DirectionalFocusOrientation = 'horizontal' | 'vertical' | 'both';
6
+ export type DirectionalFocusControllerConfig = {
7
+ orientation?: DirectionalFocusOrientation;
8
+ enableHomeAndEnd?: boolean;
9
+ manageTabIndex?: boolean;
10
+ onFocusTargetChange?: (element: HTMLElement) => void;
11
+ isFocusableElement?: (element: HTMLElement) => boolean;
12
+ };
13
+ export declare class DirectionalFocusController implements ReactiveController {
6
14
  private readonly host;
7
15
  private elements;
8
- constructor(host: ListKeyboardNavigationHost);
9
- hostDidRender(): void;
16
+ private currentElement?;
17
+ private readonly config;
18
+ constructor(host: DirectionalFocusHost, config?: DirectionalFocusControllerConfig);
19
+ hostConnected(): void;
20
+ hostDisconnected(): void;
10
21
  updateElements(elements: Element[]): void;
22
+ setCurrentElement(element: Element | undefined | null): void;
11
23
  private handleKeydown;
12
- private getNextFocusableElement;
24
+ private getFocusIntent;
25
+ private getManagedActiveElement;
26
+ private getTargetElement;
27
+ private findFocusableFromIndex;
28
+ private syncManagedFocusTarget;
29
+ private selectManagedElement;
30
+ private updateTabIndexes;
31
+ private applyFocusTarget;
32
+ private canMoveFocusTo;
13
33
  }
34
+ export type ListKeyboardNavigationHost = DirectionalFocusHost;
35
+ export type ListKeyboardNavigationControllerConfig = DirectionalFocusControllerConfig;
36
+ export { DirectionalFocusController as ListKeyboardNavigationController };