@lmvz-ds/components 0.26.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 (116) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/cjs/{reactive-controller-host-DrtMkMd7.js → aria-validation-controller-BMV2tv9-.js} +0 -41
  3. package/cjs/list-keyboard-controller-CzZdPBeH.js +173 -0
  4. package/cjs/lmvz-button_2.cjs.entry.js +4 -3
  5. package/cjs/lmvz-checkbox.cjs.entry.js +8 -4
  6. package/cjs/lmvz-chip.cjs.entry.js +3 -2
  7. package/cjs/lmvz-components.cjs.js +1 -1
  8. package/cjs/lmvz-header_2.cjs.entry.js +7 -51
  9. package/cjs/lmvz-input.cjs.entry.js +3 -2
  10. package/cjs/lmvz-menuitem.cjs.entry.js +3 -2
  11. package/cjs/lmvz-modal.cjs.entry.js +3 -2
  12. package/cjs/lmvz-radio.cjs.entry.js +3 -2
  13. package/cjs/lmvz-select.cjs.entry.js +3 -2
  14. package/cjs/lmvz-tab.cjs.entry.js +31 -0
  15. package/cjs/lmvz-tabs.cjs.entry.js +256 -0
  16. package/cjs/lmvz-toggle.cjs.entry.js +4 -3
  17. package/cjs/loader.cjs.js +1 -1
  18. package/cjs/reactive-controller-host-B_lZtcA6.js +43 -0
  19. package/collection/collection-manifest.json +2 -0
  20. package/collection/components/lmvz-checkbox/lmvz-checkbox.css +10 -8
  21. package/collection/components/lmvz-checkbox/lmvz-checkbox.js +4 -1
  22. package/collection/components/lmvz-header/lmvz-header.js +3 -3
  23. package/collection/components/lmvz-tab/lmvz-tab.css +148 -0
  24. package/collection/components/lmvz-tab/lmvz-tab.js +125 -0
  25. package/collection/components/lmvz-tabs/lmvz-tabs.css +58 -0
  26. package/collection/components/lmvz-tabs/lmvz-tabs.js +399 -0
  27. package/collection/components/lmvz-toggle/lmvz-toggle.js +1 -1
  28. package/collection/integration/header-integration/header-integration.js +1 -1
  29. package/collection/utils/aria/list-keyboard-controller.js +151 -28
  30. package/components/index.d.ts +4 -0
  31. package/components/index.d.ts.bak +4 -0
  32. package/components/index.js +1 -1
  33. package/components/lmvz-button-group.js +1 -1
  34. package/components/lmvz-button.js +1 -1
  35. package/components/lmvz-checkbox.js +1 -1
  36. package/components/lmvz-chip.js +1 -1
  37. package/components/lmvz-header.js +1 -1
  38. package/components/lmvz-icon.js +1 -1
  39. package/components/lmvz-input.js +1 -1
  40. package/components/lmvz-menuitem.js +1 -1
  41. package/components/lmvz-modal.js +1 -1
  42. package/components/lmvz-radio.js +1 -1
  43. package/components/lmvz-select.js +1 -1
  44. package/components/lmvz-snackbar.js +1 -1
  45. package/components/lmvz-tab.d.ts +11 -0
  46. package/components/lmvz-tab.d.ts.bak +11 -0
  47. package/components/lmvz-tab.js +1 -0
  48. package/components/lmvz-tabs.d.ts +11 -0
  49. package/components/lmvz-tabs.d.ts.bak +11 -0
  50. package/components/lmvz-tabs.js +1 -0
  51. package/components/lmvz-toggle.js +1 -1
  52. package/components/p-0P2Wb3pE.js +1 -0
  53. package/components/p-2VdcUIrr.js +1 -0
  54. package/components/p-BJEQw1Sz.js +1 -0
  55. package/components/p-Cs7RCOHZ.js +1 -0
  56. package/components/p-CtaMrBNE.js +1 -0
  57. package/components/{p-JAKQdFhF.js → p-DOTK1OW3.js} +1 -1
  58. package/components/p-DjvbwRyl.js +1 -0
  59. package/esm/{reactive-controller-host-ZrGf1F2-.js → aria-validation-controller-D-KO0Asb.js} +1 -41
  60. package/esm/list-keyboard-controller-Coi8XfUH.js +171 -0
  61. package/esm/lmvz-button_2.entry.js +2 -1
  62. package/esm/lmvz-checkbox.entry.js +7 -3
  63. package/esm/lmvz-chip.entry.js +2 -1
  64. package/esm/lmvz-components.js +1 -1
  65. package/esm/lmvz-header_2.entry.js +6 -50
  66. package/esm/lmvz-input.entry.js +2 -1
  67. package/esm/lmvz-menuitem.entry.js +2 -1
  68. package/esm/lmvz-modal.entry.js +2 -1
  69. package/esm/lmvz-radio.entry.js +2 -1
  70. package/esm/lmvz-select.entry.js +2 -1
  71. package/esm/lmvz-tab.entry.js +29 -0
  72. package/esm/lmvz-tabs.entry.js +254 -0
  73. package/esm/lmvz-toggle.entry.js +3 -2
  74. package/esm/loader.js +1 -1
  75. package/esm/reactive-controller-host-FBuCCcFC.js +41 -0
  76. package/hydrate/index.js +461 -32
  77. package/hydrate/index.mjs +461 -32
  78. package/lmvz-components/lmvz-components.esm.js +1 -1
  79. package/lmvz-components/p-43b463bf.entry.js +1 -0
  80. package/lmvz-components/p-4bd71a3c.entry.js +1 -0
  81. package/lmvz-components/p-6484fbc6.entry.js +1 -0
  82. package/lmvz-components/p-6988c3ea.entry.js +1 -0
  83. package/lmvz-components/p-758dbb82.entry.js +1 -0
  84. package/lmvz-components/p-7b15cdce.entry.js +1 -0
  85. package/lmvz-components/p-8874ff19.entry.js +1 -0
  86. package/lmvz-components/p-CtaMrBNE.js +1 -0
  87. package/lmvz-components/p-FBuCCcFC.js +1 -0
  88. package/lmvz-components/p-a5c921dc.entry.js +1 -0
  89. package/lmvz-components/p-bb46a884.entry.js +1 -0
  90. package/lmvz-components/p-bd23eab3.entry.js +1 -0
  91. package/lmvz-components/p-c6228cee.entry.js +1 -0
  92. package/lmvz-components/p-da16ff58.entry.js +1 -0
  93. package/lmvz-components/p-hRb38wX6.js +1 -0
  94. package/manifest.json +394 -1
  95. package/package.json +9 -1
  96. package/types/components/lmvz-checkbox/lmvz-checkbox.d.ts +1 -0
  97. package/types/components/lmvz-header/lmvz-header.d.ts +2 -2
  98. package/types/components/lmvz-tab/lmvz-tab.d.ts +11 -0
  99. package/types/components/lmvz-tabs/lmvz-tabs.d.ts +43 -0
  100. package/types/components.d.ts +151 -0
  101. package/types/utils/aria/list-keyboard-controller.d.ts +28 -5
  102. package/components/p-BOzeYzKk.js +0 -1
  103. package/components/p-DYa3zcGE.js +0 -1
  104. package/components/p-WLZ7VWNX.js +0 -1
  105. package/components/p-lsUdmjdw.js +0 -1
  106. package/lmvz-components/p-01aeca60.entry.js +0 -1
  107. package/lmvz-components/p-14c3d837.entry.js +0 -1
  108. package/lmvz-components/p-24e63b0a.entry.js +0 -1
  109. package/lmvz-components/p-3da301a6.entry.js +0 -1
  110. package/lmvz-components/p-40228d48.entry.js +0 -1
  111. package/lmvz-components/p-4da9073a.entry.js +0 -1
  112. package/lmvz-components/p-758078db.entry.js +0 -1
  113. package/lmvz-components/p-8dae99f1.entry.js +0 -1
  114. package/lmvz-components/p-CwX1wKkM.js +0 -1
  115. package/lmvz-components/p-e1eaa7a2.entry.js +0 -1
  116. package/lmvz-components/p-f5cece32.entry.js +0 -1
package/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-06-09T08:16:24",
2
+ "timestamp": "2026-06-11T12:19:37",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.5",
@@ -6773,6 +6773,399 @@
6773
6773
  ]
6774
6774
  }
6775
6775
  },
6776
+ {
6777
+ "filePath": "src/components/lmvz-tab/lmvz-tab.tsx",
6778
+ "encapsulation": "shadow",
6779
+ "tag": "lmvz-tab",
6780
+ "readme": "# lmvz-tab\n\nThe `lmvz-tab` is the individual tab trigger primitive. It must be used as a direct child of `lmvz-tabs`, which owns selection state, ARIA semantics (`tablist`/`tab`/`tabpanel`), keyboard management, and roving `tabindex`.\n\n## Usage\n\n```html\n<lmvz-tabs value=\"home\">\n <lmvz-tab value=\"home\">Home</lmvz-tab>\n <lmvz-tab value=\"profile\">Profile</lmvz-tab>\n <lmvz-tab value=\"settings\" disabled>Settings</lmvz-tab>\n</lmvz-tabs>\n```\n\n### With media slot (icon above label)\n\n```html\n<lmvz-tab value=\"home\">\n <lmvz-icon slot=\"media\" name=\"home\" aria-hidden=\"true\"></lmvz-icon>\n Home\n</lmvz-tab>\n```\n\n> **Icon-only tabs**: When no visible label is provided, supply an `aria-label` on the `lmvz-tab` element itself to maintain accessibility.\n\n## Visual states\n\n| State | Description |\n| -------- | --------------------------------------------------------------------------- |\n| Default | Neutral interactive surface; hidden selection indicator. |\n| Selected | Active-tinted container; active-colored text; full-width 4 px gradient bar at bottom (horizontal) or inline-start (vertical). |\n| Disabled | Reduced opacity; non-interactive. Set by consumer via `disabled` attribute. |\n| Focus | DS-style outline ring, distinct from the selection indicator. |\n\n## Orientation\n\nThe `vertical` attribute is set automatically by `lmvz-tabs` when `orientation=\"vertical\"`. When vertical, the selection indicator bar moves from the bottom edge to the inline-start edge of the button.\n",
6781
+ "docs": "The tab trigger primitive. Must be used as a direct child of `lmvz-tabs`.\n\nSelection state, ARIA semantics (tablist/tab/tabpanel), keyboard management,\nand roving tabindex are all owned by the parent `lmvz-tabs` component.",
6782
+ "docsTags": [
6783
+ {
6784
+ "name": "slot",
6785
+ "text": "default - Label text or arbitrary inline content for the tab."
6786
+ },
6787
+ {
6788
+ "name": "slot",
6789
+ "text": "media - Optional icon or image placed above the label in the tab stack."
6790
+ },
6791
+ {
6792
+ "name": "part",
6793
+ "text": "button - The inner `<button role=\"tab\">` element."
6794
+ },
6795
+ {
6796
+ "name": "part",
6797
+ "text": "indicator - The selection indicator bar."
6798
+ }
6799
+ ],
6800
+ "usage": {},
6801
+ "props": [
6802
+ {
6803
+ "name": "disabled",
6804
+ "type": "boolean",
6805
+ "complexType": {
6806
+ "original": "boolean",
6807
+ "resolved": "boolean",
6808
+ "references": {}
6809
+ },
6810
+ "mutable": false,
6811
+ "attr": "disabled",
6812
+ "reflectToAttr": true,
6813
+ "docs": "Whether the tab is disabled.\nDisabled tabs are not activatable and are skipped by arrow-key navigation in `lmvz-tabs`.",
6814
+ "docsTags": [
6815
+ {
6816
+ "name": "default",
6817
+ "text": "false"
6818
+ }
6819
+ ],
6820
+ "default": "false",
6821
+ "values": [
6822
+ {
6823
+ "type": "boolean"
6824
+ }
6825
+ ],
6826
+ "optional": false,
6827
+ "required": false,
6828
+ "getter": false,
6829
+ "setter": false
6830
+ },
6831
+ {
6832
+ "name": "selected",
6833
+ "type": "boolean",
6834
+ "complexType": {
6835
+ "original": "boolean",
6836
+ "resolved": "boolean",
6837
+ "references": {}
6838
+ },
6839
+ "mutable": false,
6840
+ "attr": "selected",
6841
+ "reflectToAttr": true,
6842
+ "docs": "Whether this tab is currently selected.\nSet by the parent `lmvz-tabs` component — do not set manually.",
6843
+ "docsTags": [
6844
+ {
6845
+ "name": "default",
6846
+ "text": "false"
6847
+ }
6848
+ ],
6849
+ "default": "false",
6850
+ "values": [
6851
+ {
6852
+ "type": "boolean"
6853
+ }
6854
+ ],
6855
+ "optional": false,
6856
+ "required": false,
6857
+ "getter": false,
6858
+ "setter": false
6859
+ },
6860
+ {
6861
+ "name": "value",
6862
+ "type": "string",
6863
+ "complexType": {
6864
+ "original": "string",
6865
+ "resolved": "string",
6866
+ "references": {}
6867
+ },
6868
+ "mutable": false,
6869
+ "attr": "value",
6870
+ "reflectToAttr": true,
6871
+ "docs": "Unique value that identifies this tab within its `lmvz-tabs` parent.\nThe parent uses this to track the selected tab.",
6872
+ "docsTags": [],
6873
+ "values": [
6874
+ {
6875
+ "type": "string"
6876
+ }
6877
+ ],
6878
+ "optional": false,
6879
+ "required": true,
6880
+ "getter": false,
6881
+ "setter": false
6882
+ },
6883
+ {
6884
+ "name": "vertical",
6885
+ "type": "boolean",
6886
+ "complexType": {
6887
+ "original": "boolean",
6888
+ "resolved": "boolean",
6889
+ "references": {}
6890
+ },
6891
+ "mutable": false,
6892
+ "attr": "vertical",
6893
+ "reflectToAttr": true,
6894
+ "docs": "Vertical orientation context.\nSet by the parent `lmvz-tabs` when `orientation=\"vertical\"` — do not set manually.\nWhen true the selection indicator moves to the inline-start edge.",
6895
+ "docsTags": [
6896
+ {
6897
+ "name": "default",
6898
+ "text": "false"
6899
+ }
6900
+ ],
6901
+ "default": "false",
6902
+ "values": [
6903
+ {
6904
+ "type": "boolean"
6905
+ }
6906
+ ],
6907
+ "optional": false,
6908
+ "required": false,
6909
+ "getter": false,
6910
+ "setter": false
6911
+ }
6912
+ ],
6913
+ "methods": [],
6914
+ "events": [],
6915
+ "listeners": [],
6916
+ "styles": [],
6917
+ "slots": [
6918
+ {
6919
+ "name": "default",
6920
+ "docs": "Label text or arbitrary inline content for the tab."
6921
+ },
6922
+ {
6923
+ "name": "media",
6924
+ "docs": "Optional icon or image placed above the label in the tab stack."
6925
+ }
6926
+ ],
6927
+ "parts": [
6928
+ {
6929
+ "name": "button",
6930
+ "docs": "The inner `<button role=\"tab\">` element."
6931
+ },
6932
+ {
6933
+ "name": "indicator",
6934
+ "docs": "The selection indicator bar."
6935
+ }
6936
+ ],
6937
+ "states": [],
6938
+ "dependents": [],
6939
+ "dependencies": [],
6940
+ "dependencyGraph": {}
6941
+ },
6942
+ {
6943
+ "filePath": "src/components/lmvz-tabs/lmvz-tabs.tsx",
6944
+ "encapsulation": "shadow",
6945
+ "tag": "lmvz-tabs",
6946
+ "readme": "# lmvz-tabs\n\n`lmvz-tabs` is the WAI-ARIA Tabs pattern owner. It renders a `tablist` containing `lmvz-tab` trigger children and links them to consumer-authored panel elements via `aria-controls` / `aria-labelledby`. Selection state, keyboard management (roving `tabindex`, directional focus, manual activation), disabled-tab skipping, and overflow behaviour are all owned here.\n\n## Usage\n\n```html\n<lmvz-tabs value=\"home\" id=\"my-tabs\">\n <lmvz-tab value=\"home\">Home</lmvz-tab>\n <lmvz-tab value=\"profile\">Profile</lmvz-tab>\n <lmvz-tab value=\"settings\" disabled>Settings</lmvz-tab>\n\n <div slot=\"panels\" role=\"tabpanel\" id=\"panel-home\">Home content</div>\n <div slot=\"panels\" role=\"tabpanel\" id=\"panel-profile\" hidden>Profile content</div>\n <div slot=\"panels\" role=\"tabpanel\" id=\"panel-settings\" hidden>Settings content</div>\n</lmvz-tabs>\n```\n\n### Panels — slotted content model\n\nPanels are **consumer-authored** light-DOM elements placed in the `panels` slot. The component does **not** own or render a `lmvz-tab-panel` primitive — consumers supply any element they like (a `<div>`, a custom element, a route outlet, …).\n\n`lmvz-tabs` automatically pairs each panel with the corresponding tab by position:\n- It sets `aria-controls=\"<panelId>\"` on each `lmvz-tab` button.\n- It sets `aria-labelledby=\"<tabId>\"` on each panel element.\n\nIf you need an explicit mapping instead of positional pairing, call the `setTabPanelIds` method with an ordered array of `[tabId, panelId]` tuples.\n\nPanel **visibility** (the `hidden` attribute) is the consumer's responsibility. Listen to the `lmvzChange` event and toggle the relevant panel.\n\n### Reacting to tab changes\n\n```ts\nconst tabs = document.querySelector('lmvz-tabs');\n\ntabs.addEventListener('lmvzChange', (event) => {\n const { value } = event.detail; // the newly-activated tab value\n // show/hide panels as appropriate\n});\n```\n\n### Vertical orientation\n\n```html\n<lmvz-tabs value=\"home\" orientation=\"vertical\">\n <lmvz-tab value=\"home\">Home</lmvz-tab>\n <lmvz-tab value=\"profile\">Profile</lmvz-tab>\n <div slot=\"panels\" role=\"tabpanel\">Home content</div>\n <div slot=\"panels\" role=\"tabpanel\" hidden>Profile content</div>\n</lmvz-tabs>\n```\n\nWhen `orientation=\"vertical\"` the tab list stacks vertically, arrow navigation switches to up/down, and the selection indicator moves to the inline-start edge of each tab trigger.\n\n## Keyboard interaction\n\n| Key | Behaviour |\n| --------------------- | -------------------------------------------------------- |\n| `←` / `→` (horizontal) | Move focus to previous / next enabled tab. |\n| `↑` / `↓` (vertical) | Move focus to previous / next enabled tab. |\n| `Home` | Move focus to the first enabled tab. |\n| `End` | Move focus to the last enabled tab. |\n| `Enter` / `Space` | Activate the currently focused tab (manual activation). |\n| `Tab` | Leave the tab list; focus moves to the active panel. |\n\nDisabled tabs are skipped during arrow-key navigation and cannot be activated.\n\n## Disabled-tab fallback\n\nWhen the selected tab becomes disabled at runtime, `lmvz-tabs` automatically activates the nearest enabled tab (preferring the next sibling, then the previous). If no enabled tab exists the selection value is left unchanged.\n",
6947
+ "docs": "The semantics and state owner for the WAI-ARIA tabs pattern.\n\n`lmvz-tabs` owns:\n- `tablist` / `tab` / `tabpanel` ARIA semantics\n- Selected-value state and manual activation (`Enter`, `Space`, click)\n- Roving `tabindex` via `DirectionalFocusController`\n- Horizontal scroll overflow (horizontal mode only)\n- Disabled-tab skipping and nearest-enabled fallback\n- Child registration and panel linkage via `aria-controls` / `aria-labelledby`\n\nPanels are consumer-authored light-DOM elements. Associate each panel with\nits tab by adding an `id` attribute — either matching `lmvz-tab[panel]` or\nderived positionally when no explicit id is provided.",
6948
+ "docsTags": [
6949
+ {
6950
+ "name": "slot",
6951
+ "text": "default - `lmvz-tab` trigger elements."
6952
+ },
6953
+ {
6954
+ "name": "slot",
6955
+ "text": "panels - Arbitrary panel elements."
6956
+ },
6957
+ {
6958
+ "name": "part",
6959
+ "text": "panels-container - The container wrapping the slotted panels."
6960
+ },
6961
+ {
6962
+ "name": "event",
6963
+ "text": "lmvzChange - Fired when a tab is activated. Detail: `{ value: string }`."
6964
+ },
6965
+ {
6966
+ "name": "example",
6967
+ "text": "```html\n<lmvz-tabs value=\"home\">\n <lmvz-tab value=\"home\">Home</lmvz-tab>\n <lmvz-tab value=\"settings\" disabled>Settings</lmvz-tab>\n\n <div slot=\"panels\" id=\"panel-home\" role=\"tabpanel\">Home content</div>\n <div slot=\"panels\" id=\"panel-settings\" role=\"tabpanel\">Settings content</div>\n</lmvz-tabs>\n```"
6968
+ }
6969
+ ],
6970
+ "usage": {},
6971
+ "props": [
6972
+ {
6973
+ "name": "orientation",
6974
+ "type": "\"horizontal\" | \"vertical\"",
6975
+ "complexType": {
6976
+ "original": "'horizontal' | 'vertical'",
6977
+ "resolved": "\"horizontal\" | \"vertical\"",
6978
+ "references": {}
6979
+ },
6980
+ "mutable": true,
6981
+ "attr": "orientation",
6982
+ "reflectToAttr": true,
6983
+ "docs": "Layout and keyboard-navigation orientation.",
6984
+ "docsTags": [
6985
+ {
6986
+ "name": "default",
6987
+ "text": "'horizontal'"
6988
+ }
6989
+ ],
6990
+ "default": "'horizontal'",
6991
+ "values": [
6992
+ {
6993
+ "value": "horizontal",
6994
+ "type": "string"
6995
+ },
6996
+ {
6997
+ "value": "vertical",
6998
+ "type": "string"
6999
+ }
7000
+ ],
7001
+ "optional": false,
7002
+ "required": false,
7003
+ "getter": false,
7004
+ "setter": false
7005
+ },
7006
+ {
7007
+ "name": "value",
7008
+ "type": "string",
7009
+ "complexType": {
7010
+ "original": "string",
7011
+ "resolved": "string",
7012
+ "references": {}
7013
+ },
7014
+ "mutable": true,
7015
+ "attr": "value",
7016
+ "reflectToAttr": true,
7017
+ "docs": "The `value` of the currently selected tab.",
7018
+ "docsTags": [],
7019
+ "values": [
7020
+ {
7021
+ "type": "string"
7022
+ }
7023
+ ],
7024
+ "optional": false,
7025
+ "required": true,
7026
+ "getter": false,
7027
+ "setter": false
7028
+ }
7029
+ ],
7030
+ "methods": [
7031
+ {
7032
+ "name": "activateTab",
7033
+ "returns": {
7034
+ "type": "Promise<void>",
7035
+ "docs": ""
7036
+ },
7037
+ "complexType": {
7038
+ "signature": "(value: string) => Promise<void>",
7039
+ "parameters": [
7040
+ {
7041
+ "name": "value",
7042
+ "type": "string",
7043
+ "docs": ""
7044
+ }
7045
+ ],
7046
+ "references": {
7047
+ "Promise": {
7048
+ "location": "global",
7049
+ "id": "global::Promise"
7050
+ }
7051
+ },
7052
+ "return": "Promise<void>"
7053
+ },
7054
+ "signature": "activateTab(value: string) => Promise<void>",
7055
+ "parameters": [
7056
+ {
7057
+ "name": "value",
7058
+ "type": "string",
7059
+ "docs": ""
7060
+ }
7061
+ ],
7062
+ "docs": "Programmatically activate a tab by value.\nDisabled tabs are ignored; emits `lmvzChange` on change.",
7063
+ "docsTags": []
7064
+ },
7065
+ {
7066
+ "name": "getTabElements",
7067
+ "returns": {
7068
+ "type": "Promise<HTMLElement[]>",
7069
+ "docs": ""
7070
+ },
7071
+ "complexType": {
7072
+ "signature": "() => Promise<HTMLElement[]>",
7073
+ "parameters": [],
7074
+ "references": {
7075
+ "Promise": {
7076
+ "location": "global",
7077
+ "id": "global::Promise"
7078
+ },
7079
+ "HTMLElement": {
7080
+ "location": "global",
7081
+ "id": "global::HTMLElement"
7082
+ }
7083
+ },
7084
+ "return": "Promise<HTMLElement[]>"
7085
+ },
7086
+ "signature": "getTabElements() => Promise<HTMLElement[]>",
7087
+ "parameters": [],
7088
+ "docs": "Returns all slotted `lmvz-tab` elements.\nExposed for external orchestration.",
7089
+ "docsTags": []
7090
+ },
7091
+ {
7092
+ "name": "setTabPanelIds",
7093
+ "returns": {
7094
+ "type": "Promise<void>",
7095
+ "docs": ""
7096
+ },
7097
+ "complexType": {
7098
+ "signature": "(pairs: Array<[string, string]>) => Promise<void>",
7099
+ "parameters": [
7100
+ {
7101
+ "name": "pairs",
7102
+ "type": "[string, string][]",
7103
+ "docs": ""
7104
+ }
7105
+ ],
7106
+ "references": {
7107
+ "Promise": {
7108
+ "location": "global",
7109
+ "id": "global::Promise"
7110
+ },
7111
+ "Array": {
7112
+ "location": "global",
7113
+ "id": "global::Array"
7114
+ }
7115
+ },
7116
+ "return": "Promise<void>"
7117
+ },
7118
+ "signature": "setTabPanelIds(pairs: Array<[string, string]>) => Promise<void>",
7119
+ "parameters": [
7120
+ {
7121
+ "name": "pairs",
7122
+ "type": "[string, string][]",
7123
+ "docs": ""
7124
+ }
7125
+ ],
7126
+ "docs": "Wires `aria-controls` on each tab and `aria-labelledby` on each panel\nusing the provided ordered array of `[tabId, panelId]` pairs.\nCallers only need this for explicit control; `lmvz-tabs` wires positional\npairs automatically on `slotchange`.",
7127
+ "docsTags": []
7128
+ }
7129
+ ],
7130
+ "events": [
7131
+ {
7132
+ "event": "lmvzChange",
7133
+ "detail": "{ value: string; }",
7134
+ "bubbles": true,
7135
+ "complexType": {
7136
+ "original": "{ value: string }",
7137
+ "resolved": "{ value: string; }",
7138
+ "references": {}
7139
+ },
7140
+ "cancelable": true,
7141
+ "composed": true,
7142
+ "docs": "Emitted when a tab is activated.\nDetail: `{ value: string }`.",
7143
+ "docsTags": []
7144
+ }
7145
+ ],
7146
+ "listeners": [],
7147
+ "styles": [],
7148
+ "slots": [
7149
+ {
7150
+ "name": "default",
7151
+ "docs": "`lmvz-tab` trigger elements."
7152
+ },
7153
+ {
7154
+ "name": "panels",
7155
+ "docs": "Arbitrary panel elements."
7156
+ }
7157
+ ],
7158
+ "parts": [
7159
+ {
7160
+ "name": "panels-container",
7161
+ "docs": "The container wrapping the slotted panels."
7162
+ }
7163
+ ],
7164
+ "states": [],
7165
+ "dependents": [],
7166
+ "dependencies": [],
7167
+ "dependencyGraph": {}
7168
+ },
6776
7169
  {
6777
7170
  "filePath": "src/components/lmvz-toggle/lmvz-toggle.tsx",
6778
7171
  "encapsulation": "scoped",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lmvz-ds/components",
3
3
  "private": false,
4
- "version": "0.26.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>",
@@ -76,6 +76,14 @@
76
76
  "types": "./components/lmvz-snackbar.d.ts",
77
77
  "import": "./components/lmvz-snackbar.js"
78
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
+ },
79
87
  "./lmvz-checkbox": {
80
88
  "import": "./components/lmvz-checkbox.js",
81
89
  "types": "./components/lmvz-checkbox.d.ts"
@@ -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,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
+ }