@lmvz-ds/components 0.30.0 → 0.32.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 (208) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/cjs/{ds.constants-D3srqM9m.js → ds.constants-CKeXfK-s.js} +10 -0
  3. package/cjs/{component-C7cavwmZ.js → element.util-Cq4y-_iX.js} +42 -31
  4. package/cjs/index.cjs.js +7 -1
  5. package/cjs/{list-keyboard-controller-CzZdPBeH.js → list-keyboard-controller-StN6Yn8W.js} +13 -8
  6. package/cjs/lmvz-action-list.cjs.entry.js +79 -0
  7. package/cjs/lmvz-button-group.cjs.entry.js +43 -47
  8. package/cjs/lmvz-button_2.cjs.entry.js +10 -8
  9. package/cjs/lmvz-card.cjs.entry.js +2 -2
  10. package/cjs/lmvz-checkbox.cjs.entry.js +1 -1
  11. package/cjs/lmvz-chip.cjs.entry.js +2 -2
  12. package/cjs/lmvz-components.cjs.js +1 -1
  13. package/cjs/lmvz-header_2.cjs.entry.js +3 -3
  14. package/cjs/lmvz-input.cjs.entry.js +5 -5
  15. package/cjs/lmvz-link.cjs.entry.js +2 -2
  16. package/cjs/lmvz-menuitem.cjs.entry.js +1 -1
  17. package/cjs/lmvz-message.cjs.entry.js +1 -1
  18. package/cjs/lmvz-modal.cjs.entry.js +5 -5
  19. package/cjs/lmvz-radio.cjs.entry.js +1 -1
  20. package/cjs/lmvz-select.cjs.entry.js +1 -1
  21. package/cjs/lmvz-snackbar.cjs.entry.js +1 -1
  22. package/cjs/lmvz-spinner.cjs.entry.js +1 -1
  23. package/cjs/lmvz-tab.cjs.entry.js +2 -2
  24. package/cjs/lmvz-tabs.cjs.entry.js +4 -4
  25. package/cjs/lmvz-toggle.cjs.entry.js +3 -3
  26. package/cjs/loader.cjs.js +1 -1
  27. package/cjs/stencil.util-DzvzXSwk.js +25 -0
  28. package/collection/collection-manifest.json +1 -0
  29. package/collection/components/lmvz-action-list/lmvz-action-list.css +93 -0
  30. package/collection/components/lmvz-action-list/lmvz-action-list.js +104 -0
  31. package/collection/components/lmvz-button/lmvz-button.css +65 -45
  32. package/collection/components/lmvz-button/lmvz-button.js +28 -7
  33. package/collection/components/lmvz-button-group/lmvz-button-group.css +33 -2
  34. package/collection/components/lmvz-button-group/lmvz-button-group.js +54 -38
  35. package/collection/components/lmvz-card/lmvz-card.css +58 -45
  36. package/collection/components/lmvz-card/lmvz-card.js +2 -2
  37. package/collection/components/lmvz-checkbox/lmvz-checkbox.js +2 -2
  38. package/collection/components/lmvz-chip/lmvz-chip.js +7 -7
  39. package/collection/components/lmvz-header/lmvz-header.js +2 -2
  40. package/collection/components/lmvz-icon/lmvz-icon.js +2 -2
  41. package/collection/components/lmvz-input/lmvz-input.js +5 -5
  42. package/collection/components/lmvz-link/lmvz-link.js +3 -3
  43. package/collection/components/lmvz-menuitem/lmvz-menuitem.js +2 -2
  44. package/collection/components/lmvz-message/lmvz-message.js +1 -1
  45. package/collection/components/lmvz-modal/lmvz-modal.css +7 -0
  46. package/collection/components/lmvz-modal/lmvz-modal.js +3 -3
  47. package/collection/components/lmvz-radio/lmvz-radio.js +2 -2
  48. package/collection/components/lmvz-select/lmvz-select.js +2 -2
  49. package/collection/components/lmvz-snackbar/lmvz-snackbar.js +1 -1
  50. package/collection/components/lmvz-spinner/lmvz-spinner.js +1 -1
  51. package/collection/components/lmvz-tab/lmvz-tab.css +7 -0
  52. package/collection/components/lmvz-tab/lmvz-tab.js +1 -1
  53. package/collection/components/lmvz-tabs/lmvz-tabs.css +7 -0
  54. package/collection/components/lmvz-tabs/lmvz-tabs.js +2 -2
  55. package/collection/components/lmvz-toggle/lmvz-toggle.js +3 -3
  56. package/collection/index.js +1 -1
  57. package/collection/integration/header-integration/header-integration.js +1 -1
  58. package/collection/utils/aria/aria.constants.js +53 -0
  59. package/collection/utils/aria/list-keyboard-controller.js +12 -7
  60. package/collection/utils/async/async.util.js +62 -0
  61. package/collection/utils/data/event.utilt.js +19 -0
  62. package/collection/utils/data/number.util.js +6 -0
  63. package/collection/utils/data/object.util.js +20 -0
  64. package/collection/utils/data/time.util.js +3 -0
  65. package/collection/utils/element/element.util.js +117 -0
  66. package/collection/utils/{assets.js → stencil/assets.js} +1 -1
  67. package/collection/utils/stencil/stencil.util.js +12 -0
  68. package/components/index.d.ts +2 -0
  69. package/components/index.d.ts.bak +2 -0
  70. package/components/index.js +1 -1
  71. package/components/lmvz-action-list.d.ts +11 -0
  72. package/components/lmvz-action-list.d.ts.bak +11 -0
  73. package/components/lmvz-action-list.js +1 -0
  74. package/components/lmvz-button-group.js +1 -1
  75. package/components/lmvz-button.js +1 -1
  76. package/components/lmvz-card.js +1 -1
  77. package/components/lmvz-checkbox.js +1 -1
  78. package/components/lmvz-chip.js +1 -1
  79. package/components/lmvz-header.js +1 -1
  80. package/components/lmvz-icon.js +1 -1
  81. package/components/lmvz-input.js +1 -1
  82. package/components/lmvz-link.js +1 -1
  83. package/components/lmvz-menuitem.js +1 -1
  84. package/components/lmvz-message.js +1 -1
  85. package/components/lmvz-modal.js +1 -1
  86. package/components/lmvz-radio.js +1 -1
  87. package/components/lmvz-select.js +1 -1
  88. package/components/lmvz-snackbar.js +1 -1
  89. package/components/lmvz-spinner.js +1 -1
  90. package/components/lmvz-tab.js +1 -1
  91. package/components/lmvz-tabs.js +1 -1
  92. package/components/lmvz-toggle.js +1 -1
  93. package/components/p-B0H9qIwE.js +1 -0
  94. package/components/p-B4m1n4et.js +1 -0
  95. package/components/p-CJRqhXjK.js +1 -0
  96. package/components/p-CxfT9IA1.js +1 -0
  97. package/components/{p-CXakymyP.js → p-DJ90327O.js} +1 -1
  98. package/components/p-DeO5Vbxh.js +1 -0
  99. package/components/p-DuEtnKRj.js +1 -0
  100. package/esm/{ds.constants-BLS5MjIu.js → ds.constants-DuEtnKRj.js} +5 -1
  101. package/esm/{component-DOTK1OW3.js → element.util-CxfT9IA1.js} +37 -31
  102. package/esm/index.js +1 -1
  103. package/esm/{list-keyboard-controller-Coi8XfUH.js → list-keyboard-controller-BKa9Kd2t.js} +12 -7
  104. package/esm/lmvz-action-list.entry.js +77 -0
  105. package/esm/lmvz-button-group.entry.js +35 -39
  106. package/esm/lmvz-button_2.entry.js +9 -7
  107. package/esm/lmvz-card.entry.js +2 -2
  108. package/esm/lmvz-checkbox.entry.js +1 -1
  109. package/esm/lmvz-chip.entry.js +2 -2
  110. package/esm/lmvz-components.js +1 -1
  111. package/esm/lmvz-header_2.entry.js +3 -3
  112. package/esm/lmvz-input.entry.js +4 -4
  113. package/esm/lmvz-link.entry.js +2 -2
  114. package/esm/lmvz-menuitem.entry.js +1 -1
  115. package/esm/lmvz-message.entry.js +1 -1
  116. package/esm/lmvz-modal.entry.js +3 -3
  117. package/esm/lmvz-radio.entry.js +1 -1
  118. package/esm/lmvz-select.entry.js +1 -1
  119. package/esm/lmvz-snackbar.entry.js +1 -1
  120. package/esm/lmvz-spinner.entry.js +1 -1
  121. package/esm/lmvz-tab.entry.js +2 -2
  122. package/esm/lmvz-tabs.entry.js +4 -4
  123. package/esm/lmvz-toggle.entry.js +2 -2
  124. package/esm/loader.js +1 -1
  125. package/esm/stencil.util-CJRqhXjK.js +23 -0
  126. package/hydrate/index.js +501 -388
  127. package/hydrate/index.mjs +501 -388
  128. package/lmvz-components/index.esm.js +1 -1
  129. package/lmvz-components/lmvz-components.esm.js +1 -1
  130. package/lmvz-components/{p-f3c44dd4.entry.js → p-1ce90ea7.entry.js} +1 -1
  131. package/lmvz-components/{p-b08db5ad.entry.js → p-24125bcf.entry.js} +1 -1
  132. package/lmvz-components/p-25a78ead.entry.js +1 -0
  133. package/lmvz-components/p-4072b2fb.entry.js +1 -0
  134. package/lmvz-components/p-48109e1d.entry.js +1 -0
  135. package/lmvz-components/{p-3b3e532f.entry.js → p-582f44ff.entry.js} +1 -1
  136. package/lmvz-components/p-592d509b.entry.js +1 -0
  137. package/lmvz-components/{p-d7e99f03.entry.js → p-6f61c24d.entry.js} +1 -1
  138. package/lmvz-components/{p-58498d43.entry.js → p-703b10b5.entry.js} +1 -1
  139. package/lmvz-components/p-74c7521c.entry.js +1 -0
  140. package/lmvz-components/{p-b5254532.entry.js → p-80a26307.entry.js} +1 -1
  141. package/lmvz-components/{p-c60ab9c9.entry.js → p-8e1f66dd.entry.js} +1 -1
  142. package/lmvz-components/p-947e1fe6.entry.js +1 -0
  143. package/lmvz-components/p-B4m1n4et.js +1 -0
  144. package/lmvz-components/p-CJRqhXjK.js +1 -0
  145. package/lmvz-components/p-CxfT9IA1.js +1 -0
  146. package/lmvz-components/p-DuEtnKRj.js +1 -0
  147. package/lmvz-components/{p-230962c8.entry.js → p-b79af711.entry.js} +1 -1
  148. package/lmvz-components/p-c00f0d96.entry.js +1 -0
  149. package/lmvz-components/{p-5c951888.entry.js → p-c0d05a97.entry.js} +1 -1
  150. package/lmvz-components/{p-c0b1d0af.entry.js → p-c3e8092e.entry.js} +1 -1
  151. package/lmvz-components/{p-2ca85b7c.entry.js → p-ed3c2b13.entry.js} +1 -1
  152. package/lmvz-components/{p-35da6bfb.entry.js → p-fa2cd315.entry.js} +1 -1
  153. package/manifest.json +130 -18
  154. package/package.json +5 -1
  155. package/types/api/ds.constants.d.ts +0 -40
  156. package/types/api/ds.types.d.ts +68 -1
  157. package/types/components/lmvz-action-list/lmvz-action-list.d.ts +15 -0
  158. package/types/components/lmvz-button/lmvz-button.d.ts +6 -3
  159. package/types/components/lmvz-button-group/lmvz-button-group.d.ts +2 -0
  160. package/types/components/lmvz-checkbox/lmvz-checkbox.d.ts +1 -1
  161. package/types/components/lmvz-chip/lmvz-chip.d.ts +2 -2
  162. package/types/components/lmvz-header/lmvz-header.d.ts +1 -1
  163. package/types/components/lmvz-icon/lmvz-icon.d.ts +1 -1
  164. package/types/components/lmvz-input/lmvz-input.d.ts +1 -1
  165. package/types/components/lmvz-link/lmvz-link.d.ts +1 -1
  166. package/types/components/lmvz-menuitem/lmvz-menuitem.d.ts +1 -1
  167. package/types/components/lmvz-modal/lmvz-modal.d.ts +1 -1
  168. package/types/components/lmvz-radio/lmvz-radio.d.ts +1 -1
  169. package/types/components/lmvz-select/lmvz-select.d.ts +1 -1
  170. package/types/components/lmvz-tabs/lmvz-tabs.d.ts +1 -1
  171. package/types/components/lmvz-toggle/lmvz-toggle.d.ts +1 -1
  172. package/types/components.d.ts +83 -2
  173. package/types/index.d.ts +1 -1
  174. package/types/utils/aria/aria-validation-controller.d.ts +3 -3
  175. package/types/utils/aria/aria.constants.d.ts +1 -0
  176. package/types/utils/aria/element-activation-controller.d.ts +1 -1
  177. package/types/utils/aria/list-keyboard-controller.d.ts +4 -1
  178. package/types/utils/async/async.util.d.ts +8 -0
  179. package/types/utils/data/event.utilt.d.ts +4 -0
  180. package/types/utils/data/number.util.d.ts +2 -0
  181. package/types/utils/data/object.util.d.ts +5 -0
  182. package/types/utils/data/time.util.d.ts +1 -0
  183. package/types/utils/element/element.util.d.ts +21 -0
  184. package/types/utils/radio/radio-group-controller.d.ts +1 -1
  185. package/types/utils/{reactive-controller-host.d.ts → stencil/reactive-controller-host.d.ts} +1 -1
  186. package/types/utils/stencil/stencil.util.d.ts +6 -0
  187. package/collection/utils/component.js +0 -270
  188. package/collection/utils/http.js +0 -21
  189. package/collection/utils/http.unit.js +0 -47
  190. package/components/p-BLS5MjIu.js +0 -1
  191. package/components/p-C0f2nNPZ.js +0 -1
  192. package/components/p-CtaMrBNE.js +0 -1
  193. package/components/p-DGlgVBPj.js +0 -1
  194. package/components/p-DOTK1OW3.js +0 -1
  195. package/lmvz-components/p-0d435e7b.entry.js +0 -1
  196. package/lmvz-components/p-44fea470.entry.js +0 -1
  197. package/lmvz-components/p-4dc44520.entry.js +0 -1
  198. package/lmvz-components/p-BLS5MjIu.js +0 -1
  199. package/lmvz-components/p-CtaMrBNE.js +0 -1
  200. package/lmvz-components/p-DOTK1OW3.js +0 -1
  201. package/lmvz-components/p-a4077c9f.entry.js +0 -1
  202. package/lmvz-components/p-dce6e41d.entry.js +0 -1
  203. package/lmvz-components/p-e3ce44a3.entry.js +0 -1
  204. package/types/utils/component.d.ts +0 -33
  205. package/types/utils/http.d.ts +0 -26
  206. package/types/utils/http.unit.d.ts +0 -1
  207. /package/collection/utils/{reactive-controller-host.js → stencil/reactive-controller-host.js} +0 -0
  208. /package/types/utils/{assets.d.ts → stencil/assets.d.ts} +0 -0
@@ -1 +1 @@
1
- import{g as e,r as l,c as t,h as a,H as s}from"./p-BPeerEwm.js";import{A as r}from"./p-CPOia2kT.js";import{R as c}from"./p-FBuCCcFC.js";import"./p-CdDO7mQa.js";let o=0;const i=class extends c{get el(){return e(this)}get validationEl(){return this.el}selectId="lmvz-select-"+o++;nativeSelectEl;constructor(e){super(),l(this,e),this.lmvzChange=t(this,"lmvzChange",7),this.addController(new r(this))}lmvzChange;value;label;helperText;disabled=!1;required=!1;name;size="default";highlighted=!1;selectedLabel="";get hasValue(){return Boolean(this.value)}componentDidLoad(){this.syncSelectedLabel(),super.componentDidLoad()}handleValueChange(e){this.nativeSelectEl&&this.nativeSelectEl.value!==(e??"")&&(this.nativeSelectEl.value=e??""),this.syncSelectedLabel()}syncSelectedLabel(){if(!this.nativeSelectEl)return;const e=this.nativeSelectEl.selectedIndex;this.selectedLabel=e>=0?this.nativeSelectEl.options[e]?.text??"":""}handleChange=e=>{const l=e.target;this.value=l.value,this.syncSelectedLabel(),this.lmvzChange.emit(l.value)};render(){const e=this.hasValue,l=e;return a(s,{key:"292678c0d3c000624ca6b0cb76c05a0c27ad3494","data-highlighted":String(this.highlighted)},a("div",{key:"83d269c626a21af74dca8d89d5b0a1a95494a70d",class:e?"select-wrapper has-value":"select-wrapper"},a("label",{key:"e5d3b30349ab8438bc02d18c93760d52b979d24e",htmlFor:this.selectId,class:l?"floating-label":"assistive-label"},this.label,this.required&&l&&a("span",{key:"2f26cf5991b76a5d740f0e61c2ecf9d9a44436b8","aria-hidden":"true"}," *")),a("div",{key:"30087b0b2d3f4768b02470209c6d14a46c362334","aria-hidden":"true"},a("span",{key:"67888d3a89f8cbdf332696d827e72a2cce519438"},e?this.selectedLabel:this.label,this.required&&!e&&a("span",{key:"e1b28fe2c2865ed1fba181e60a8682095c5123fc","aria-hidden":"true"}," *")),a("span",{key:"7479df9bf0e995b92ba9f11f1271f71892c52ac8"},a("svg",{key:"5a76ba91f6b2d29dafd56b6c4abe1b5f93ece926",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true"},a("path",{key:"06c62b38ef2cc0ae3119d2dba0f2015e26e84393",d:"M20.3334 8.66663L12.0001 17L3.66675 8.66663",stroke:"currentColor","stroke-width":"1.75","stroke-linecap":"round","stroke-linejoin":"round"})))),a("select",{key:"f1fb834cc74ae70e21ea3fd0ec4f653689cfbfa1",id:this.selectId,ref:e=>this.nativeSelectEl=e,name:this.name,disabled:this.disabled,required:this.required,"aria-label":this.label,onChange:this.handleChange},!e&&a("option",{key:"b6240b308c06b01a3a00104941a77090d243548b",value:"",disabled:!0,selected:!0,hidden:!0}),a("slot",{key:"b1128685fc5365be2561bbeef627f2d409f631c9"}))),this.helperText&&a("div",{key:"b856e0b6f8e6f1c62de5d0ef59ad7d623c28b5ae",role:"status"},this.helperText))}static get watchers(){return{value:[{handleValueChange:0}]}}};i.style="@layer lmvz-ds.reset, lmvz-ds.theme, lmvz-ds.components, lmvz-ds.overrides; @layer lmvz-ds.theme { @font-face { font-family: Router; src: local('RouterBook-Regular'), local('Router-Book'), url('/assets/fonts/Router-Book.woff') format('woff'); font-weight: 400; } @font-face { font-family: Router; src: local('RouterMedium-Regular'), local('Router-Medium'), url('/assets/fonts/Router-Medium.woff') format('woff'); font-weight: 500; } @font-face { font-family: Router; src: local('RouterBold-Regular'), local('Router-Bold'), url('/assets/fonts/Router-Bold.woff') format('woff'); font-weight: 700; } } .sc-lmvz-select-h { display: block; font-family: var(--lmvz-global-font-family-default, Router); --lmvz-internal-select-floating-label-top-offset: 0.375rem; padding-top: var(--lmvz-internal-select-floating-label-top-offset); --lmvz-select-radius: var(--lmvz-component-input-radius-default, 999px); --lmvz-select-bg: var(--lmvz-semantic-color-surface-input-primary, #ffffff); --lmvz-select-border-color: var(--lmvz-semantic-color-border-default, #e0e0e0); --lmvz-select-border-color-hover: var(--lmvz-semantic-color-border-hover, #c7c7c7); --lmvz-select-border-width: var(--lmvz-semantic-border-width-default, 1px); --lmvz-select-text-color: var(--lmvz-semantic-color-on-surface-input-primary, #000000); --lmvz-select-label-color: var(--lmvz-semantic-color-on-surface-input-primary, #000000); --lmvz-select-padding-x: var(--lmvz-component-input-padding-md, clamp(0.88rem, 0.84rem + 0.13vw, 1rem)); --lmvz-select-gap: var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)); --lmvz-select-height: var(--lmvz-component-input-size-md, clamp(2.5rem, 2.44rem + 0.26vw, 2.75rem)); --lmvz-select-label-font-size: var(--lmvz-component-body-xs-font-size, clamp(0.63rem, 0.61rem + 0.06vw, 0.69rem)); --lmvz-select-label-top-offset: calc(var(--lmvz-internal-select-floating-label-top-offset) * -1); --lmvz-select-label-minimized-padding-x: 4px; --lmvz-select-disabled-opacity: var(--lmvz-component-input-disabled-opacity, 40%); --lmvz-select-helper-color: var(--lmvz-semantic-color-on-surface-input-secondary, #545454); --lmvz-select-focus-color: var(--lmvz-semantic-color-status-on-active, #0e7ab4); --lmvz-select-error-color: var(--lmvz-semantic-color-status-on-danger, #e52a31); } .select-wrapper.sc-lmvz-select { position: relative; height: var(--lmvz-select-height); } label.sc-lmvz-select { position: absolute; top: 50%; left: var(--lmvz-select-padding-x); font-size: var(--lmvz-select-label-font-size); color: var(--lmvz-select-label-color); line-height: normal; white-space: nowrap; pointer-events: none; z-index: 2; transform: translateY(-50%); transform-origin: left top; transition: top 0.2s ease-out, transform 0.2s ease-out, opacity 0.2s ease-out, padding 0.2s ease-out; } label.assistive-label.sc-lmvz-select { opacity: 0; padding: 0; } label.floating-label.sc-lmvz-select { top: var(--lmvz-select-label-top-offset); transform: translateY(0) scale(0.85); left: calc(var(--lmvz-select-padding-x) - 2px); background-color: var(--lmvz-select-bg); padding: 0 var(--lmvz-select-label-minimized-padding-x); opacity: 1; font-weight: 500; } label.sc-lmvz-select > span[aria-hidden='true'].sc-lmvz-select, div[aria-hidden='true'].sc-lmvz-select > span.sc-lmvz-select:first-child > span[aria-hidden='true'].sc-lmvz-select { color: var(--lmvz-select-error-color); margin-left: 2px; display: inline-block; line-height: 0; vertical-align: middle; } div[aria-hidden].sc-lmvz-select { display: flex; align-items: center; gap: var(--lmvz-select-gap); height: 100%; padding: 0 var(--lmvz-select-padding-x); border-radius: var(--lmvz-select-radius); background-color: var(--lmvz-select-bg); border: var(--lmvz-select-border-width) solid var(--lmvz-select-border-color); box-sizing: border-box; cursor: pointer; position: relative; z-index: 1; transition: border-color 0.15s ease; } .sc-lmvz-select-h:not([disabled] .select-wrapper.sc-lmvz-select:hover div[aria-hidden].sc-lmvz-select, [highlighted]).sc-lmvz-select-h .select-wrapper.sc-lmvz-select:hover div[aria-hidden].sc-lmvz-select { border-color: var(--lmvz-select-border-color-hover); } [highlighted].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select { background-color: var(--lmvz-semantic-color-status-active-alternate, #0f8acc); border-color: var(--lmvz-semantic-color-border-active, #0f8acc); color: var(--lmvz-semantic-color-status-on-active-alternate, #ffffff); } [highlighted].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { color: var(--lmvz-semantic-color-status-on-active-alternate, #ffffff); } [highlighted].sc-lmvz-select-h label.floating-label.sc-lmvz-select { background-color: var(--lmvz-semantic-color-status-active-alternate, #0f8acc); color: var(--lmvz-semantic-color-status-on-active-alternate, #ffffff); } .select-wrapper.sc-lmvz-select:focus-within div[aria-hidden].sc-lmvz-select { outline: var(--lmvz-ds-outline, 1px solid #0e7ab4); outline-offset: var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem)); } div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { flex: 1 0 0; font: var(--lmvz-typography-body-md-strong, 500 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5 Router); color: var(--lmvz-select-text-color); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .sc-lmvz-select-h:not([highlighted]) .select-wrapper.has-value.sc-lmvz-select div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { color: var(--lmvz-semantic-color-int-on-secondary-active, #000000); } div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:last-child { flex-shrink: 0; display: flex; align-items: center; justify-content: center; } div[aria-hidden].sc-lmvz-select svg.sc-lmvz-select { width: var(--lmvz-component-icon-size-2xs, clamp(0.63rem, 0.59rem + 0.13vw, 0.75rem)); height: var(--lmvz-component-icon-size-2xs, clamp(0.63rem, 0.59rem + 0.13vw, 0.75rem)); flex-shrink: 0; } select.sc-lmvz-select { appearance: none; position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; z-index: 2; border: none; background: transparent; margin: 0; padding: 0; } [disabled].sc-lmvz-select-h .select-wrapper.sc-lmvz-select { opacity: var(--lmvz-select-disabled-opacity); pointer-events: none; cursor: not-allowed; } [role='status'].sc-lmvz-select { margin-top: 4px; padding-left: var(--lmvz-select-padding-x); font-size: var(--lmvz-select-label-font-size); color: var(--lmvz-select-helper-color); line-height: normal; } [size='small'].sc-lmvz-select-h { --lmvz-select-height: var(--lmvz-component-input-size-sm, clamp(2rem, 1.94rem + 0.26vw, 2.25rem)); --lmvz-select-padding-x: var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem)); --lmvz-select-gap: var(--lmvz-component-input-gap-sm, clamp(0.38rem, 0.31rem + 0.26vw, 0.63rem)); --lmvz-select-label-font-size: var(--lmvz-component-body-2xs-font-size, clamp(0.5rem, 0.47rem + 0.13vw, 0.63rem)); } [size='small'].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { font-size: var(--lmvz-component-body-sm-font-size, clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem)); } [size='small'].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select svg.sc-lmvz-select { width: var(--lmvz-component-icon-size-4xs, clamp(0.5rem, 0.47rem + 0.13vw, 0.63rem)); height: var(--lmvz-component-icon-size-4xs, clamp(0.5rem, 0.47rem + 0.13vw, 0.63rem)); } [size='large'].sc-lmvz-select-h { --lmvz-select-height: var(--lmvz-component-input-size-lg, clamp(2.75rem, 2.69rem + 0.26vw, 3rem)); --lmvz-select-padding-x: var(--lmvz-component-input-padding-lg, clamp(1rem, 0.94rem + 0.26vw, 1.25rem)); --lmvz-select-gap: var(--lmvz-component-input-gap-lg, clamp(0.75rem, 0.69rem + 0.26vw, 1rem)); --lmvz-select-label-font-size: var(--lmvz-component-body-sm-font-size, clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem)); } [size='large'].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { font-size: var(--lmvz-component-body-lg-font-size, clamp(1rem, 0.97rem + 0.13vw, 1.13rem)); } [size='large'].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select svg.sc-lmvz-select { width: var(--lmvz-component-icon-size-xs, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem)); height: var(--lmvz-component-icon-size-xs, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem)); }";export{i as lmvz_select}
1
+ import{g as e,r as l,c as t,h as a,H as s}from"./p-BPeerEwm.js";import{A as r}from"./p-CPOia2kT.js";import{R as c}from"./p-FBuCCcFC.js";import"./p-CdDO7mQa.js";let o=0;const i=class extends c{get el(){return e(this)}get validationEl(){return this.el}selectId="lmvz-select-"+o++;nativeSelectEl;constructor(e){super(),l(this,e),this.lmvzChange=t(this,"lmvzChange",7),this.addController(new r(this))}lmvzChange;value;label;helperText;disabled=!1;required=!1;name;size="default";highlighted=!1;selectedLabel="";get hasValue(){return Boolean(this.value)}componentDidLoad(){this.syncSelectedLabel(),super.componentDidLoad()}handleValueChange(e){this.nativeSelectEl&&this.nativeSelectEl.value!==(e??"")&&(this.nativeSelectEl.value=e??""),this.syncSelectedLabel()}syncSelectedLabel(){if(!this.nativeSelectEl)return;const e=this.nativeSelectEl.selectedIndex;this.selectedLabel=e>=0?this.nativeSelectEl.options[e]?.text??"":""}handleChange=e=>{const l=e.target;this.value=l.value,this.syncSelectedLabel(),this.lmvzChange.emit(l.value)};render(){const e=this.hasValue,l=e;return a(s,{key:"c753006bdabf1723fa9ff61eb35f58d5bef3157b","data-highlighted":String(this.highlighted)},a("div",{key:"6b06056fd48ef4f837cbe17383756e3726c68f90",class:e?"select-wrapper has-value":"select-wrapper"},a("label",{key:"819901582fc449566a112cd4544fa0af903a7011",htmlFor:this.selectId,class:l?"floating-label":"assistive-label"},this.label,this.required&&l&&a("span",{key:"14ad70c1cf1a96c7398698fa86baeadd5fe4257b","aria-hidden":"true"}," *")),a("div",{key:"589c6946bee6e320a36dfa0ed765ff9e02af4c2f","aria-hidden":"true"},a("span",{key:"04444223ed66a5ddff3eb7bd581cf5a7e615cf6b"},e?this.selectedLabel:this.label,this.required&&!e&&a("span",{key:"9631d4a655514957a4564be939d8bd16c3a036f0","aria-hidden":"true"}," *")),a("span",{key:"3950abf6ee9528adb5895fe6bc88be67b39d458e"},a("svg",{key:"98a0a380e9ca5044ca1fefb03b74bfc178974a60",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true"},a("path",{key:"19fe8b40e315fabee982ba37fe2d397493429519",d:"M20.3334 8.66663L12.0001 17L3.66675 8.66663",stroke:"currentColor","stroke-width":"1.75","stroke-linecap":"round","stroke-linejoin":"round"})))),a("select",{key:"7480ff36ef3acfe10fb0122bfdf7feb5af406c67",id:this.selectId,ref:e=>this.nativeSelectEl=e,name:this.name,disabled:this.disabled,required:this.required,"aria-label":this.label,onChange:this.handleChange},!e&&a("option",{key:"5d00f696c2c4d7c35c180018a4c487cbb0229d37",value:"",disabled:!0,selected:!0,hidden:!0}),a("slot",{key:"218fe11d224d7ca72c8555301d41d8878b6b34b4"}))),this.helperText&&a("div",{key:"edbb738590305f6724a590a3532fd9284a187866",role:"status"},this.helperText))}static get watchers(){return{value:[{handleValueChange:0}]}}};i.style="@layer lmvz-ds.reset, lmvz-ds.theme, lmvz-ds.components, lmvz-ds.overrides; @layer lmvz-ds.theme { @font-face { font-family: Router; src: local('RouterBook-Regular'), local('Router-Book'), url('/assets/fonts/Router-Book.woff') format('woff'); font-weight: 400; } @font-face { font-family: Router; src: local('RouterMedium-Regular'), local('Router-Medium'), url('/assets/fonts/Router-Medium.woff') format('woff'); font-weight: 500; } @font-face { font-family: Router; src: local('RouterBold-Regular'), local('Router-Bold'), url('/assets/fonts/Router-Bold.woff') format('woff'); font-weight: 700; } } .sc-lmvz-select-h { display: block; font-family: var(--lmvz-global-font-family-default, Router); --lmvz-internal-select-floating-label-top-offset: 0.375rem; padding-top: var(--lmvz-internal-select-floating-label-top-offset); --lmvz-select-radius: var(--lmvz-component-input-radius-default, 999px); --lmvz-select-bg: var(--lmvz-semantic-color-surface-input-primary, #ffffff); --lmvz-select-border-color: var(--lmvz-semantic-color-border-default, #e0e0e0); --lmvz-select-border-color-hover: var(--lmvz-semantic-color-border-hover, #c7c7c7); --lmvz-select-border-width: var(--lmvz-semantic-border-width-default, 1px); --lmvz-select-text-color: var(--lmvz-semantic-color-on-surface-input-primary, #000000); --lmvz-select-label-color: var(--lmvz-semantic-color-on-surface-input-primary, #000000); --lmvz-select-padding-x: var(--lmvz-component-input-padding-md, clamp(0.88rem, 0.84rem + 0.13vw, 1rem)); --lmvz-select-gap: var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)); --lmvz-select-height: var(--lmvz-component-input-size-md, clamp(2.5rem, 2.44rem + 0.26vw, 2.75rem)); --lmvz-select-label-font-size: var(--lmvz-component-body-xs-font-size, clamp(0.63rem, 0.61rem + 0.06vw, 0.69rem)); --lmvz-select-label-top-offset: calc(var(--lmvz-internal-select-floating-label-top-offset) * -1); --lmvz-select-label-minimized-padding-x: 4px; --lmvz-select-disabled-opacity: var(--lmvz-component-input-disabled-opacity, 40%); --lmvz-select-helper-color: var(--lmvz-semantic-color-on-surface-input-secondary, #545454); --lmvz-select-focus-color: var(--lmvz-semantic-color-status-on-active, #0e7ab4); --lmvz-select-error-color: var(--lmvz-semantic-color-status-on-danger, #e52a31); } .select-wrapper.sc-lmvz-select { position: relative; height: var(--lmvz-select-height); } label.sc-lmvz-select { position: absolute; top: 50%; left: var(--lmvz-select-padding-x); font-size: var(--lmvz-select-label-font-size); color: var(--lmvz-select-label-color); line-height: normal; white-space: nowrap; pointer-events: none; z-index: 2; transform: translateY(-50%); transform-origin: left top; transition: top 0.2s ease-out, transform 0.2s ease-out, opacity 0.2s ease-out, padding 0.2s ease-out; } label.assistive-label.sc-lmvz-select { opacity: 0; padding: 0; } label.floating-label.sc-lmvz-select { top: var(--lmvz-select-label-top-offset); transform: translateY(0) scale(0.85); left: calc(var(--lmvz-select-padding-x) - 2px); background-color: var(--lmvz-select-bg); padding: 0 var(--lmvz-select-label-minimized-padding-x); opacity: 1; font-weight: 500; } label.sc-lmvz-select > span[aria-hidden='true'].sc-lmvz-select, div[aria-hidden='true'].sc-lmvz-select > span.sc-lmvz-select:first-child > span[aria-hidden='true'].sc-lmvz-select { color: var(--lmvz-select-error-color); margin-left: 2px; display: inline-block; line-height: 0; vertical-align: middle; } div[aria-hidden].sc-lmvz-select { display: flex; align-items: center; gap: var(--lmvz-select-gap); height: 100%; padding: 0 var(--lmvz-select-padding-x); border-radius: var(--lmvz-select-radius); background-color: var(--lmvz-select-bg); border: var(--lmvz-select-border-width) solid var(--lmvz-select-border-color); box-sizing: border-box; cursor: pointer; position: relative; z-index: 1; transition: border-color 0.15s ease; } .sc-lmvz-select-h:not([disabled] .select-wrapper.sc-lmvz-select:hover div[aria-hidden].sc-lmvz-select, [highlighted]).sc-lmvz-select-h .select-wrapper.sc-lmvz-select:hover div[aria-hidden].sc-lmvz-select { border-color: var(--lmvz-select-border-color-hover); } [highlighted].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select { background-color: var(--lmvz-semantic-color-status-active-alternate, #0f8acc); border-color: var(--lmvz-semantic-color-border-active, #0f8acc); color: var(--lmvz-semantic-color-status-on-active-alternate, #ffffff); } [highlighted].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { color: var(--lmvz-semantic-color-status-on-active-alternate, #ffffff); } [highlighted].sc-lmvz-select-h label.floating-label.sc-lmvz-select { background-color: var(--lmvz-semantic-color-status-active-alternate, #0f8acc); color: var(--lmvz-semantic-color-status-on-active-alternate, #ffffff); } .select-wrapper.sc-lmvz-select:focus-within div[aria-hidden].sc-lmvz-select { outline: var(--lmvz-ds-outline, 1px solid #0e7ab4); outline-offset: var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem)); } div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { flex: 1 0 0; font: var(--lmvz-typography-body-md-strong, 500 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5 Router); color: var(--lmvz-select-text-color); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .sc-lmvz-select-h:not([highlighted]) .select-wrapper.has-value.sc-lmvz-select div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { color: var(--lmvz-semantic-color-int-on-secondary-active, #000000); } div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:last-child { flex-shrink: 0; display: flex; align-items: center; justify-content: center; } div[aria-hidden].sc-lmvz-select svg.sc-lmvz-select { width: var(--lmvz-component-icon-size-2xs, clamp(0.63rem, 0.59rem + 0.13vw, 0.75rem)); height: var(--lmvz-component-icon-size-2xs, clamp(0.63rem, 0.59rem + 0.13vw, 0.75rem)); flex-shrink: 0; } select.sc-lmvz-select { appearance: none; position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; z-index: 2; border: none; background: transparent; margin: 0; padding: 0; } [disabled].sc-lmvz-select-h .select-wrapper.sc-lmvz-select { opacity: var(--lmvz-select-disabled-opacity); pointer-events: none; cursor: not-allowed; } [role='status'].sc-lmvz-select { margin-top: 4px; padding-left: var(--lmvz-select-padding-x); font-size: var(--lmvz-select-label-font-size); color: var(--lmvz-select-helper-color); line-height: normal; } [size='small'].sc-lmvz-select-h { --lmvz-select-height: var(--lmvz-component-input-size-sm, clamp(2rem, 1.94rem + 0.26vw, 2.25rem)); --lmvz-select-padding-x: var(--lmvz-component-input-padding-sm, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem)); --lmvz-select-gap: var(--lmvz-component-input-gap-sm, clamp(0.38rem, 0.31rem + 0.26vw, 0.63rem)); --lmvz-select-label-font-size: var(--lmvz-component-body-2xs-font-size, clamp(0.5rem, 0.47rem + 0.13vw, 0.63rem)); } [size='small'].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { font-size: var(--lmvz-component-body-sm-font-size, clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem)); } [size='small'].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select svg.sc-lmvz-select { width: var(--lmvz-component-icon-size-4xs, clamp(0.5rem, 0.47rem + 0.13vw, 0.63rem)); height: var(--lmvz-component-icon-size-4xs, clamp(0.5rem, 0.47rem + 0.13vw, 0.63rem)); } [size='large'].sc-lmvz-select-h { --lmvz-select-height: var(--lmvz-component-input-size-lg, clamp(2.75rem, 2.69rem + 0.26vw, 3rem)); --lmvz-select-padding-x: var(--lmvz-component-input-padding-lg, clamp(1rem, 0.94rem + 0.26vw, 1.25rem)); --lmvz-select-gap: var(--lmvz-component-input-gap-lg, clamp(0.75rem, 0.69rem + 0.26vw, 1rem)); --lmvz-select-label-font-size: var(--lmvz-component-body-sm-font-size, clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem)); } [size='large'].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select > span.sc-lmvz-select:first-child { font-size: var(--lmvz-component-body-lg-font-size, clamp(1rem, 0.97rem + 0.13vw, 1.13rem)); } [size='large'].sc-lmvz-select-h div[aria-hidden].sc-lmvz-select svg.sc-lmvz-select { width: var(--lmvz-component-icon-size-xs, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem)); height: var(--lmvz-component-icon-size-xs, clamp(0.75rem, 0.72rem + 0.13vw, 0.88rem)); }";export{i as lmvz_select}
@@ -1 +1 @@
1
- import{g as r,r as e,c as o,h as t,H as i}from"./p-BPeerEwm.js";import{A as a}from"./p-CPOia2kT.js";import{R as s}from"./p-FBuCCcFC.js";import"./p-CdDO7mQa.js";function l(r){return r.el.shadowRoot?.querySelector("input")??r.el.querySelector("input")??null}class c{hosts=[];_focusedHost=null;_focusinHandler=r=>{this.hosts.some((e=>e.el.contains(r.target)))||this.clearFocused()};register(r){if(!this.hosts.includes(r)){const e=0===this.hosts.length;this.hosts.push(r),this.sortHosts(),e&&document.addEventListener("focusin",this._focusinHandler,!0)}}unregister(r){r===this._focusedHost&&(this._focusedHost=null),this.hosts=this.hosts.filter((e=>e!==r)),0===this.hosts.length&&document.removeEventListener("focusin",this._focusinHandler,!0)}get sortedEnabled(){return this.hosts.filter((r=>!r.disabled))}setFocused(r){this._focusedHost=r,this.updateTabindex(),r.focusInput()}clearFocused(){this._focusedHost=null,this.updateTabindex()}select(r){this._focusedHost=null;for(const e of this.hosts)e.checked=e===r;this.updateTabindex()}updateTabindex(){const r=this.sortedEnabled,e=this.hosts.find((r=>r.checked));let o;o=this._focusedHost&&r.includes(this._focusedHost)?this._focusedHost:e??r[0]??null;for(const r of this.hosts){const e=l(r);e&&(e.tabIndex=r===o?0:-1)}}sortHosts(){this.hosts.sort(((r,e)=>r.el.compareDocumentPosition(e.el)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1))}}class n{host;static registry=new Map;group=null;_groupKey=null;_scope=null;constructor(r){this.host=r}hostConnected(){const{group:r,key:e,scope:o}=n.acquireGroup(this.host);this._groupKey=e,this._scope=o,this.group=r,this.group.register(this.host),this.group.updateTabindex()}hostDidRender(){this.group?.updateTabindex()}hostDisconnected(){this.group&&(this.group.unregister(this.host),this.group.updateTabindex(),n.releaseGroup(this._groupKey,this._scope),this._groupKey=null,this._scope=null,this.group=null)}get sortedEnabled(){return this.group?.sortedEnabled??[]}select(r){this.group?.select(r)}setFocused(r){this.group?.setFocused(r)}clearFocused(){this.group?.clearFocused()}updateTabindex(){this.group?.updateTabindex()}static acquireGroup(r){const e=r.name;if(!e)return{group:new c,key:null,scope:null};const o=r.el.closest("form")??document,t=function(r,e){return e instanceof HTMLFormElement?(e.dataset.lmvzRadioGroupId||(e.dataset.lmvzRadioGroupId=String(Math.random())),`${r}::form::${e.dataset.lmvzRadioGroupId}`):`${r}::document`}(e,o);let i=n.registry.get(t);return i||(i={group:new c,refCount:0},n.registry.set(t,i)),i.refCount++,{group:i.group,key:t,scope:o}}static releaseGroup(r,e){if(!r)return;const o=n.registry.get(r);o&&(o.refCount--,o.refCount<=0&&(n.registry.delete(r),e instanceof HTMLFormElement&&e.removeAttribute("data-lmvz-radio-group-id")))}}let d=0;const h=class extends s{get el(){return r(this)}get validationEl(){return this.el}internals;nativeInput;radioId="lmvz-radio-"+d++;initialChecked=!1;radioGroupController;get helperId(){return this.helperText?`${this.radioId}-helper`:void 0}label;checked=!1;value="on";name;disabled=!1;required=!1;error=!1;helperText;form;autofocus=!1;_handlingNativeChange=!1;_handlingFormReset=!1;handleCheckedChange(r,e){this.internals.setFormValue?.(r?this.value:null),r||!e||this._handlingNativeChange||this._handlingFormReset||this.lmvzChange.emit(!1),!r||e||this._handlingNativeChange||this._handlingFormReset||this.lmvzChange.emit(!0)}handleValueChange(r){this.checked&&this.internals.setFormValue?.(r)}handleLabelChange(r){r||console.warn("[lmvz-radio] label prop is required and must not be empty")}lmvzChange;lmvzActivation;async focusInput(){this.nativeInput?.focus()}async checkValidity(){return this.internals?.checkValidity()??!0}async reportValidity(){return this.internals?.reportValidity()??!0}constructor(r){super(),e(this,r),this.lmvzChange=o(this,"lmvzChange",7),this.lmvzActivation=o(this,"lmvzActivation",7),r.$hostElement$["s-ei"]?this.internals=r.$hostElement$["s-ei"]:(this.internals=r.$hostElement$.attachInternals(),r.$hostElement$["s-ei"]=this.internals),this.addController(new a(this,{reValidateOnPropChanges:!0})),this.radioGroupController=new n(this),this.addController(this.radioGroupController)}componentWillLoad(){this.initialChecked=this.checked,this.internals.setFormValue?.(this.checked?this.value:null),super.componentWillLoad()}formAssociatedCallback(){this.internals.setFormValue?.(this.checked?this.value:null)}formResetCallback(){this._handlingFormReset=!0;try{this.checked=this.initialChecked}finally{this._handlingFormReset=!1}}formStateRestoreCallback(r){if("string"==typeof r){this._handlingFormReset=!0;try{this.checked=r===this.value}finally{this._handlingFormReset=!1}}}handleChange=r=>{this._handlingNativeChange=!0;try{this.checked=r.target.checked,this.lmvzChange.emit(this.checked),this.radioGroupController.select(this),this.lmvzActivation.emit()}finally{this._handlingNativeChange=!1}};handleKeydown(r){const{key:e}=r;if(!["ArrowDown","ArrowRight","ArrowUp","ArrowLeft","Home","End"].includes(e))return;r.preventDefault();const o=this.radioGroupController.sortedEnabled;if(0===o.length)return;const t=o.indexOf(this);if(-1===t)return;let i;i="ArrowDown"===e||"ArrowRight"===e?(t+1)%o.length:"ArrowUp"===e||"ArrowLeft"===e?(t-1+o.length)%o.length:"Home"===e?0:o.length-1;const a=o[i];a&&this.radioGroupController.setFocused(a)}render(){return t(i,{key:"084706ba35f3ecc647653896cf50e1dfdb0eabe4"},t("input",{key:"c68a13d6f424c251b93ff3bb5648d64ef4645a5a",type:"radio",id:this.radioId,name:this.name??void 0,value:this.value,checked:this.checked,disabled:this.disabled,required:this.required,autoFocus:this.autofocus,"aria-invalid":this.error?"true":void 0,"aria-describedby":this.helperId,ref:r=>this.nativeInput=r,onChange:this.handleChange}),t("span",{key:"07500032fe1cdebe544d3ed6890d66fe84c43e07",class:"circle","aria-hidden":"true"},this.checked&&t("span",{key:"0b6f8c99270cbadea320cae867bfef9fd4a70312",class:"dot"})),t("span",{key:"60c9720a1e029e99d2304a5579a20942f03778aa",class:"content"},t("label",{key:"13eb208e8bd0f4c5a56955cd4f4e9813cc715425",htmlFor:this.radioId},this.label),t("span",{key:"771e582752972a8e58a0e85408cfefeef57e257b","aria-live":"polite",class:"helper-text",id:this.helperId},this.helperText)))}static get formAssociated(){return!0}static get watchers(){return{checked:[{handleCheckedChange:0}],value:[{handleValueChange:0}],label:[{handleLabelChange:0}]}}};h.style="@layer lmvz-ds.reset, lmvz-ds.theme, lmvz-ds.components, lmvz-ds.overrides; @layer lmvz-ds.theme { @font-face { font-family: Router; src: local('RouterBook-Regular'), local('Router-Book'), url('/assets/fonts/Router-Book.woff') format('woff'); font-weight: 400; } @font-face { font-family: Router; src: local('RouterMedium-Regular'), local('Router-Medium'), url('/assets/fonts/Router-Medium.woff') format('woff'); font-weight: 500; } @font-face { font-family: Router; src: local('RouterBold-Regular'), local('Router-Bold'), url('/assets/fonts/Router-Bold.woff') format('woff'); font-weight: 700; } } .sc-lmvz-radio-h { display: inline-block; --radio-circle-size: var(--lmvz-global-s18, 18px); --radio-dot-size: 0.5rem; --radio-bg: var(--lmvz-semantic-color-surface-input-primary, #ffffff); --radio-border-color: var(--lmvz-semantic-color-border-default, #e0e0e0); --radio-border-color-hover: var(--lmvz-semantic-color-border-hover, #c7c7c7); --radio-border-color-checked: var(--lmvz-semantic-color-border-active, #0f8acc); --radio-border-color-error: var(--lmvz-semantic-color-status-on-danger, #e52a31); --radio-dot-color: var(--lmvz-semantic-color-border-active, #0f8acc); --radio-wrapper-bg-hover: var(--lmvz-semantic-color-int-tertiary-hover, #f0f0f0); --radio-wrapper-bg-active: var(--lmvz-semantic-color-int-tertiary-active, #e0e0e0); --radio-label-color: var(--lmvz-semantic-color-on-surface-primary, #000000); --radio-label-color-checked: var(--lmvz-semantic-color-status-on-active, #0e7ab4); --radio-helper-color: var(--lmvz-semantic-color-on-surface-secondary, #7a7a7a); --radio-easing: var(--lmvz-global-easing-default, ease); --radio-duration: 0.2s; display: flex; align-items: center; gap: var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)); padding-block: var(--lmvz-dimension-2-8, clamp(0.13rem, 0.03rem + 0.39vw, 0.5rem)); padding-inline: var(--lmvz-dimension-8-12, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)); border-radius: var(--lmvz-semantic-border-radius-round, 999px); overflow: clip; cursor: pointer; background-color: transparent; position: relative; transition: background-color var(--radio-duration) var(--radio-easing); } input.sc-lmvz-radio { position: absolute; inset-block-start: var(--lmvz-dimension-2-8, clamp(0.13rem, 0.03rem + 0.39vw, 0.5rem)); inset-inline-start: var(--lmvz-dimension-4-10, clamp(0.25rem, 0.16rem + 0.39vw, 0.63rem)); opacity: 0; width: var(--radio-circle-size); height: var(--radio-circle-size); margin: 0; cursor: pointer; z-index: 1; } .circle.sc-lmvz-radio { width: var(--radio-circle-size); height: var(--radio-circle-size); border-radius: 50%; border: var(--lmvz-semantic-border-width-default, 1px) solid var(--radio-border-color); background-color: var(--radio-bg); pointer-events: none; flex-shrink: 0; display: flex; align-items: center; justify-content: center; box-sizing: border-box; transition: border-color var(--radio-duration) var(--radio-easing); } .dot.sc-lmvz-radio { width: var(--radio-dot-size); height: var(--radio-dot-size); border-radius: 50%; background-color: var(--radio-dot-color); } .content.sc-lmvz-radio { display: flex; flex-direction: column; overflow-wrap: break-word; min-width: 0; } label.sc-lmvz-radio { font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5 Router); color: var(--radio-label-color); cursor: pointer; transition: color var(--radio-duration) var(--radio-easing); } .helper-text.sc-lmvz-radio { display: block; font: var(--lmvz-typography-body-sm, 400 clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem) / 1.5 Router); color: var(--radio-helper-color); margin-block-start: 2px; } .helper-text.sc-lmvz-radio:empty { display: none; } @media (hover: hover) { .sc-lmvz-radio-h:hover .circle.sc-lmvz-radio { border-color: var(--radio-border-color-hover); } .sc-lmvz-radio-h:hover { background-color: var(--radio-wrapper-bg-hover); } } .sc-lmvz-radio-h:active { background-color: var(--radio-wrapper-bg-active); } [checked].sc-lmvz-radio-h .circle.sc-lmvz-radio { border-color: var(--radio-border-color-checked); } [checked].sc-lmvz-radio-h label.sc-lmvz-radio { color: var(--radio-label-color-checked); } [error].sc-lmvz-radio-h .circle.sc-lmvz-radio { border-color: var(--radio-border-color-error); } [error].sc-lmvz-radio-h .helper-text.sc-lmvz-radio { color: var(--lmvz-semantic-color-status-on-danger, #e52a31); } [disabled].sc-lmvz-radio-h { opacity: var(--lmvz-component-input-disabled-opacity, 40%); pointer-events: none; cursor: not-allowed; } @media (forced-colors: active) { .circle.sc-lmvz-radio { forced-color-adjust: auto; border-color: ButtonText; background-color: Field; } [checked].sc-lmvz-radio-h .circle.sc-lmvz-radio { border-color: Highlight; } .dot.sc-lmvz-radio { background-color: ButtonText; } [checked].sc-lmvz-radio-h .dot.sc-lmvz-radio { background-color: HighlightText; } }.sc-lmvz-radio-h:focus-within{outline:var(--lmvz-ds-outline, 1px solid #0e7ab4);outline-offset:var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem))}@media (forced-colors: active){.sc-lmvz-radio-h:focus-within{outline-color:Highlight;box-shadow:none}}";export{h as lmvz_radio}
1
+ import{g as r,r as e,c as o,h as t,H as i}from"./p-BPeerEwm.js";import{A as a}from"./p-CPOia2kT.js";import{R as s}from"./p-FBuCCcFC.js";import"./p-CdDO7mQa.js";function l(r){return r.el.shadowRoot?.querySelector("input")??r.el.querySelector("input")??null}class c{hosts=[];_focusedHost=null;_focusinHandler=r=>{this.hosts.some((e=>e.el.contains(r.target)))||this.clearFocused()};register(r){if(!this.hosts.includes(r)){const e=0===this.hosts.length;this.hosts.push(r),this.sortHosts(),e&&document.addEventListener("focusin",this._focusinHandler,!0)}}unregister(r){r===this._focusedHost&&(this._focusedHost=null),this.hosts=this.hosts.filter((e=>e!==r)),0===this.hosts.length&&document.removeEventListener("focusin",this._focusinHandler,!0)}get sortedEnabled(){return this.hosts.filter((r=>!r.disabled))}setFocused(r){this._focusedHost=r,this.updateTabindex(),r.focusInput()}clearFocused(){this._focusedHost=null,this.updateTabindex()}select(r){this._focusedHost=null;for(const e of this.hosts)e.checked=e===r;this.updateTabindex()}updateTabindex(){const r=this.sortedEnabled,e=this.hosts.find((r=>r.checked));let o;o=this._focusedHost&&r.includes(this._focusedHost)?this._focusedHost:e??r[0]??null;for(const r of this.hosts){const e=l(r);e&&(e.tabIndex=r===o?0:-1)}}sortHosts(){this.hosts.sort(((r,e)=>r.el.compareDocumentPosition(e.el)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1))}}class n{host;static registry=new Map;group=null;_groupKey=null;_scope=null;constructor(r){this.host=r}hostConnected(){const{group:r,key:e,scope:o}=n.acquireGroup(this.host);this._groupKey=e,this._scope=o,this.group=r,this.group.register(this.host),this.group.updateTabindex()}hostDidRender(){this.group?.updateTabindex()}hostDisconnected(){this.group&&(this.group.unregister(this.host),this.group.updateTabindex(),n.releaseGroup(this._groupKey,this._scope),this._groupKey=null,this._scope=null,this.group=null)}get sortedEnabled(){return this.group?.sortedEnabled??[]}select(r){this.group?.select(r)}setFocused(r){this.group?.setFocused(r)}clearFocused(){this.group?.clearFocused()}updateTabindex(){this.group?.updateTabindex()}static acquireGroup(r){const e=r.name;if(!e)return{group:new c,key:null,scope:null};const o=r.el.closest("form")??document,t=function(r,e){return e instanceof HTMLFormElement?(e.dataset.lmvzRadioGroupId||(e.dataset.lmvzRadioGroupId=String(Math.random())),`${r}::form::${e.dataset.lmvzRadioGroupId}`):`${r}::document`}(e,o);let i=n.registry.get(t);return i||(i={group:new c,refCount:0},n.registry.set(t,i)),i.refCount++,{group:i.group,key:t,scope:o}}static releaseGroup(r,e){if(!r)return;const o=n.registry.get(r);o&&(o.refCount--,o.refCount<=0&&(n.registry.delete(r),e instanceof HTMLFormElement&&e.removeAttribute("data-lmvz-radio-group-id")))}}let d=0;const h=class extends s{get el(){return r(this)}get validationEl(){return this.el}internals;nativeInput;radioId="lmvz-radio-"+d++;initialChecked=!1;radioGroupController;get helperId(){return this.helperText?`${this.radioId}-helper`:void 0}label;checked=!1;value="on";name;disabled=!1;required=!1;error=!1;helperText;form;autofocus=!1;_handlingNativeChange=!1;_handlingFormReset=!1;handleCheckedChange(r,e){this.internals.setFormValue?.(r?this.value:null),r||!e||this._handlingNativeChange||this._handlingFormReset||this.lmvzChange.emit(!1),!r||e||this._handlingNativeChange||this._handlingFormReset||this.lmvzChange.emit(!0)}handleValueChange(r){this.checked&&this.internals.setFormValue?.(r)}handleLabelChange(r){r||console.warn("[lmvz-radio] label prop is required and must not be empty")}lmvzChange;lmvzActivation;async focusInput(){this.nativeInput?.focus()}async checkValidity(){return this.internals?.checkValidity()??!0}async reportValidity(){return this.internals?.reportValidity()??!0}constructor(r){super(),e(this,r),this.lmvzChange=o(this,"lmvzChange",7),this.lmvzActivation=o(this,"lmvzActivation",7),r.$hostElement$["s-ei"]?this.internals=r.$hostElement$["s-ei"]:(this.internals=r.$hostElement$.attachInternals(),r.$hostElement$["s-ei"]=this.internals),this.addController(new a(this,{reValidateOnPropChanges:!0})),this.radioGroupController=new n(this),this.addController(this.radioGroupController)}componentWillLoad(){this.initialChecked=this.checked,this.internals.setFormValue?.(this.checked?this.value:null),super.componentWillLoad()}formAssociatedCallback(){this.internals.setFormValue?.(this.checked?this.value:null)}formResetCallback(){this._handlingFormReset=!0;try{this.checked=this.initialChecked}finally{this._handlingFormReset=!1}}formStateRestoreCallback(r){if("string"==typeof r){this._handlingFormReset=!0;try{this.checked=r===this.value}finally{this._handlingFormReset=!1}}}handleChange=r=>{this._handlingNativeChange=!0;try{this.checked=r.target.checked,this.lmvzChange.emit(this.checked),this.radioGroupController.select(this),this.lmvzActivation.emit()}finally{this._handlingNativeChange=!1}};handleKeydown(r){const{key:e}=r;if(!["ArrowDown","ArrowRight","ArrowUp","ArrowLeft","Home","End"].includes(e))return;r.preventDefault();const o=this.radioGroupController.sortedEnabled;if(0===o.length)return;const t=o.indexOf(this);if(-1===t)return;let i;i="ArrowDown"===e||"ArrowRight"===e?(t+1)%o.length:"ArrowUp"===e||"ArrowLeft"===e?(t-1+o.length)%o.length:"Home"===e?0:o.length-1;const a=o[i];a&&this.radioGroupController.setFocused(a)}render(){return t(i,{key:"9b8fbfe18376f9411f792630065dfd219f9ddb32"},t("input",{key:"24a0675eff854bbd751c07905db4be11e5353d11",type:"radio",id:this.radioId,name:this.name??void 0,value:this.value,checked:this.checked,disabled:this.disabled,required:this.required,autoFocus:this.autofocus,"aria-invalid":this.error?"true":void 0,"aria-describedby":this.helperId,ref:r=>this.nativeInput=r,onChange:this.handleChange}),t("span",{key:"f888c1f76f6f929609584d378dbe0974fd980f68",class:"circle","aria-hidden":"true"},this.checked&&t("span",{key:"57fbb1e7abdca10861cf8709d4300459e1f62e5c",class:"dot"})),t("span",{key:"1c845611162be86500e8475ac37412e2d3f2fd99",class:"content"},t("label",{key:"1399f4d34ff0e6d369cefc9f5d08208a4dee593f",htmlFor:this.radioId},this.label),t("span",{key:"1345435ff2f4773260ea3f73e943f043c2b88bdb","aria-live":"polite",class:"helper-text",id:this.helperId},this.helperText)))}static get formAssociated(){return!0}static get watchers(){return{checked:[{handleCheckedChange:0}],value:[{handleValueChange:0}],label:[{handleLabelChange:0}]}}};h.style="@layer lmvz-ds.reset, lmvz-ds.theme, lmvz-ds.components, lmvz-ds.overrides; @layer lmvz-ds.theme { @font-face { font-family: Router; src: local('RouterBook-Regular'), local('Router-Book'), url('/assets/fonts/Router-Book.woff') format('woff'); font-weight: 400; } @font-face { font-family: Router; src: local('RouterMedium-Regular'), local('Router-Medium'), url('/assets/fonts/Router-Medium.woff') format('woff'); font-weight: 500; } @font-face { font-family: Router; src: local('RouterBold-Regular'), local('Router-Bold'), url('/assets/fonts/Router-Bold.woff') format('woff'); font-weight: 700; } } .sc-lmvz-radio-h { display: inline-block; --radio-circle-size: var(--lmvz-global-s18, 18px); --radio-dot-size: 0.5rem; --radio-bg: var(--lmvz-semantic-color-surface-input-primary, #ffffff); --radio-border-color: var(--lmvz-semantic-color-border-default, #e0e0e0); --radio-border-color-hover: var(--lmvz-semantic-color-border-hover, #c7c7c7); --radio-border-color-checked: var(--lmvz-semantic-color-border-active, #0f8acc); --radio-border-color-error: var(--lmvz-semantic-color-status-on-danger, #e52a31); --radio-dot-color: var(--lmvz-semantic-color-border-active, #0f8acc); --radio-wrapper-bg-hover: var(--lmvz-semantic-color-int-tertiary-hover, #f0f0f0); --radio-wrapper-bg-active: var(--lmvz-semantic-color-int-tertiary-active, #e0e0e0); --radio-label-color: var(--lmvz-semantic-color-on-surface-primary, #000000); --radio-label-color-checked: var(--lmvz-semantic-color-status-on-active, #0e7ab4); --radio-helper-color: var(--lmvz-semantic-color-on-surface-secondary, #7a7a7a); --radio-easing: var(--lmvz-global-easing-default, ease); --radio-duration: 0.2s; display: flex; align-items: center; gap: var(--lmvz-component-input-gap-md, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)); padding-block: var(--lmvz-dimension-2-8, clamp(0.13rem, 0.03rem + 0.39vw, 0.5rem)); padding-inline: var(--lmvz-dimension-8-12, clamp(0.5rem, 0.44rem + 0.26vw, 0.75rem)); border-radius: var(--lmvz-semantic-border-radius-round, 999px); overflow: clip; cursor: pointer; background-color: transparent; position: relative; transition: background-color var(--radio-duration) var(--radio-easing); } input.sc-lmvz-radio { position: absolute; inset-block-start: var(--lmvz-dimension-2-8, clamp(0.13rem, 0.03rem + 0.39vw, 0.5rem)); inset-inline-start: var(--lmvz-dimension-4-10, clamp(0.25rem, 0.16rem + 0.39vw, 0.63rem)); opacity: 0; width: var(--radio-circle-size); height: var(--radio-circle-size); margin: 0; cursor: pointer; z-index: 1; } .circle.sc-lmvz-radio { width: var(--radio-circle-size); height: var(--radio-circle-size); border-radius: 50%; border: var(--lmvz-semantic-border-width-default, 1px) solid var(--radio-border-color); background-color: var(--radio-bg); pointer-events: none; flex-shrink: 0; display: flex; align-items: center; justify-content: center; box-sizing: border-box; transition: border-color var(--radio-duration) var(--radio-easing); } .dot.sc-lmvz-radio { width: var(--radio-dot-size); height: var(--radio-dot-size); border-radius: 50%; background-color: var(--radio-dot-color); } .content.sc-lmvz-radio { display: flex; flex-direction: column; overflow-wrap: break-word; min-width: 0; } label.sc-lmvz-radio { font: var(--lmvz-typography-body-md, 400 clamp(0.88rem, 0.84rem + 0.13vw, 1rem) / 1.5 Router); color: var(--radio-label-color); cursor: pointer; transition: color var(--radio-duration) var(--radio-easing); } .helper-text.sc-lmvz-radio { display: block; font: var(--lmvz-typography-body-sm, 400 clamp(0.69rem, 0.67rem + 0.06vw, 0.75rem) / 1.5 Router); color: var(--radio-helper-color); margin-block-start: 2px; } .helper-text.sc-lmvz-radio:empty { display: none; } @media (hover: hover) { .sc-lmvz-radio-h:hover .circle.sc-lmvz-radio { border-color: var(--radio-border-color-hover); } .sc-lmvz-radio-h:hover { background-color: var(--radio-wrapper-bg-hover); } } .sc-lmvz-radio-h:active { background-color: var(--radio-wrapper-bg-active); } [checked].sc-lmvz-radio-h .circle.sc-lmvz-radio { border-color: var(--radio-border-color-checked); } [checked].sc-lmvz-radio-h label.sc-lmvz-radio { color: var(--radio-label-color-checked); } [error].sc-lmvz-radio-h .circle.sc-lmvz-radio { border-color: var(--radio-border-color-error); } [error].sc-lmvz-radio-h .helper-text.sc-lmvz-radio { color: var(--lmvz-semantic-color-status-on-danger, #e52a31); } [disabled].sc-lmvz-radio-h { opacity: var(--lmvz-component-input-disabled-opacity, 40%); pointer-events: none; cursor: not-allowed; } @media (forced-colors: active) { .circle.sc-lmvz-radio { forced-color-adjust: auto; border-color: ButtonText; background-color: Field; } [checked].sc-lmvz-radio-h .circle.sc-lmvz-radio { border-color: Highlight; } .dot.sc-lmvz-radio { background-color: ButtonText; } [checked].sc-lmvz-radio-h .dot.sc-lmvz-radio { background-color: HighlightText; } }.sc-lmvz-radio-h:focus-within{outline:var(--lmvz-ds-outline, 1px solid #0e7ab4);outline-offset:var(--lmvz-ds-outline-offset, clamp(0.25rem, 0.19rem + 0.26vw, 0.5rem))}@media (forced-colors: active){.sc-lmvz-radio-h:focus-within{outline-color:Highlight;box-shadow:none}}";export{h as lmvz_radio}
package/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-06-15T18:20:41",
2
+ "timestamp": "2026-06-23T09:00:42",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.5",
@@ -93,6 +93,67 @@
93
93
  "dependencies": [],
94
94
  "dependencyGraph": {}
95
95
  },
96
+ {
97
+ "filePath": "src/components/lmvz-action-list/lmvz-action-list.tsx",
98
+ "encapsulation": "scoped",
99
+ "tag": "lmvz-action-list",
100
+ "readme": "# lmvz-action-list\n\nA menu of actions. Renders an internal `<ul role=\"menu\">` and projects consumer-supplied interactive elements as menuitems.\n\n## Usage\n\nSlot `<lmvz-button>` or native `<button>` elements **directly** — no `<li>` wrapper. Dividers are slotted `<hr>`. Groups are `<div role=\"group\" aria-label=\"…\">` containing interactive children.\n\n```html\n<lmvz-action-list label=\"File actions\">\n <lmvz-button>Open</lmvz-button>\n <lmvz-button>Save</lmvz-button>\n <hr />\n <lmvz-button class=\"lmvz-action-list-item--danger\">Delete</lmvz-button>\n</lmvz-action-list>\n```\n\n## API\n\n### Props\n\n| Prop | Type | Default | Description |\n|---|---|---|---|\n| `label` | `string \\| undefined` | `undefined` | Accessible name for the menu. Reflected as `aria-label` on the internal `<ul role=\"menu\">`. Optional — consumers may provide context via surrounding markup. |\n\n### Slots\n\n| Slot | Description |\n|---|---|\n| *(default)* | Accepts `<lmvz-button>` or native `<button>` (menuitems), `<hr>` (separators), and `<div role=\"group\" aria-label=\"…\">` (groups containing menuitems). **No `<li>` wrapper.** |\n\n### CSS Classes\n\n| Class | Applied to | Description |\n|---|---|---|\n| `lmvz-action-list-item--danger` | Slotted `<lmvz-button>` or `<button>` | Applies danger/destructive styling (status-danger tokens). Stable public contract. |\n\n### Events\n\nNone. Activation is handled by the consumer's `<lmvz-button>` or `<button>`.\n\n### Groups\n\nWrap related menuitems in a `<div role=\"group\" aria-label=\"Group name\">`. A dev-time warning is emitted when a group has no accessible name.\n\n```html\n<lmvz-action-list>\n <div role=\"group\" aria-label=\"Edit\">\n <lmvz-button>Cut</lmvz-button>\n <lmvz-button>Copy</lmvz-button>\n </div>\n <hr />\n <lmvz-button>Paste</lmvz-button>\n</lmvz-action-list>\n```\n\n### Keyboard navigation\n\nArrow keys (↑/↓) and Home/End move focus between menuitems using roving tabindex.\n\n**Known limitation:** Tab-exit, Escape-to-close, and typeahead navigation are not implemented in this standalone action list. These belong to a future popup/menu-button owner.\n\n### Deferred / Out of scope\n\n- Disabled item state\n- Leading or trailing icon slot per item\n",
101
+ "docs": "A keyboard-navigable action list component implementing the WAI-ARIA `menu` pattern.\n\nRenders a styled `<ul role=\"menu\">` that accepts `<lmvz-button>`, native `<button>`,\n`<hr>` dividers, and `<div role=\"group\">` groups via the default slot.\nArrow keys move focus across interactive items; Home/End jump to first/last.\n\n**Disabled items:** Items with the native `disabled` attribute (or `disabled` prop on\n`<lmvz-button>`) are silently skipped during arrow-key navigation. This matches the\nbehaviour of native `<select>` and keeps the interaction model simple.\nTrade-off: screen reader users navigating by arrow key cannot discover disabled items\nor read their labels. If surfacing disabled items to all users is required, use\n`aria-disabled=\"true\"` on the item instead and handle activation prevention in the\nclick/activation handler — the controller's `isFocusableElement` callback can then be\nused to override the skip logic.",
102
+ "docsTags": [
103
+ {
104
+ "name": "slot",
105
+ "text": "default - `<lmvz-button>`, native `<button>`, `<hr>` dividers, or\n`<div role=\"group\" aria-label=\"…\">` groups containing buttons."
106
+ },
107
+ {
108
+ "name": "example",
109
+ "text": "```html\n<lmvz-action-list label=\"Actions\">\n <lmvz-button>Edit</lmvz-button>\n <hr />\n <lmvz-button class=\"lmvz-action-list-item--danger\">Delete</lmvz-button>\n</lmvz-action-list>\n```"
110
+ }
111
+ ],
112
+ "usage": {},
113
+ "props": [
114
+ {
115
+ "name": "label",
116
+ "type": "string | undefined",
117
+ "complexType": {
118
+ "original": "string",
119
+ "resolved": "string | undefined",
120
+ "references": {}
121
+ },
122
+ "mutable": false,
123
+ "attr": "label",
124
+ "reflectToAttr": false,
125
+ "docs": "Accessible label for the menu, reflected as `aria-label` on the host Element.\nWhen absent, `aria-label` is not rendered on the host.",
126
+ "docsTags": [],
127
+ "values": [
128
+ {
129
+ "type": "string"
130
+ },
131
+ {
132
+ "type": "undefined"
133
+ }
134
+ ],
135
+ "optional": true,
136
+ "required": false,
137
+ "getter": false,
138
+ "setter": false
139
+ }
140
+ ],
141
+ "methods": [],
142
+ "events": [],
143
+ "listeners": [],
144
+ "styles": [],
145
+ "slots": [
146
+ {
147
+ "name": "default",
148
+ "docs": "`<lmvz-button>`, native `<button>`, `<hr>` dividers, or\n`<div role=\"group\" aria-label=\"…\">` groups containing buttons."
149
+ }
150
+ ],
151
+ "parts": [],
152
+ "states": [],
153
+ "dependents": [],
154
+ "dependencies": [],
155
+ "dependencyGraph": {}
156
+ },
96
157
  {
97
158
  "filePath": "src/components/lmvz-button/lmvz-button.tsx",
98
159
  "encapsulation": "shadow",
@@ -107,6 +168,32 @@
107
168
  ],
108
169
  "usage": {},
109
170
  "props": [
171
+ {
172
+ "name": "buttonRole",
173
+ "type": "string | undefined",
174
+ "complexType": {
175
+ "original": "string",
176
+ "resolved": "string | undefined",
177
+ "references": {}
178
+ },
179
+ "mutable": false,
180
+ "attr": "button-role",
181
+ "reflectToAttr": false,
182
+ "docs": "ARIA role applied to the inner `<button>` element.\nWhen set, the host element receives `role=\"presentation\"` so that AT\nsees only one interactive element with the correct role.\nUse `\"menuitem\"` when the button is a child of a `role=\"menu\"` container.",
183
+ "docsTags": [],
184
+ "values": [
185
+ {
186
+ "type": "string"
187
+ },
188
+ {
189
+ "type": "undefined"
190
+ }
191
+ ],
192
+ "optional": true,
193
+ "required": false,
194
+ "getter": false,
195
+ "setter": false
196
+ },
110
197
  {
111
198
  "name": "disabled",
112
199
  "type": "boolean",
@@ -291,10 +378,6 @@
291
378
  "reflectToAttr": true,
292
379
  "docs": "",
293
380
  "docsTags": [
294
- {
295
- "name": "readonly",
296
- "text": ""
297
- },
298
381
  {
299
382
  "name": "default",
300
383
  "text": "0"
@@ -308,7 +391,7 @@
308
391
  ],
309
392
  "optional": false,
310
393
  "required": false,
311
- "getter": true,
394
+ "getter": false,
312
395
  "setter": false
313
396
  },
314
397
  {
@@ -473,8 +556,8 @@
473
556
  "filePath": "src/components/lmvz-button-group/lmvz-button-group.tsx",
474
557
  "encapsulation": "shadow",
475
558
  "tag": "lmvz-button-group",
476
- "readme": "# lmvz-button-group\n\nInternal component used by `lmvz-modal` to manage its actions slot. Auto-assigns `variant` attributes to slotted buttons by order (last → primary, second-to-last → secondary, earlier → tertiary) when no explicit variant is set. Exposes `primaryEnabledAction` (first non-disabled button with variant primary, falls back to first enabled) and `hasActions` (true if any visible, non-disabled button is present).\n",
477
- "docs": "Internal component used by `lmvz-modal` to manage its actions slot. Auto-assigns `variant` attributes to slotted buttons by order (last → primary, second-to-last → secondary, earlier → tertiary) when no explicit variant is set. Exposes `primaryEnabledAction` (first non-disabled button with variant primary, falls back to first enabled) and `hasActions` (true if any visible, non-disabled button is present).",
559
+ "readme": "# lmvz-button-group\n\nInternal component used by `lmvz-modal` to manage its actions slot. Auto-assigns `variant` attributes to slotted buttons by order (first → primary, second → secondary, later → tertiary) when no explicit variant is set. Exposes `primaryEnabledAction` (first non-disabled button with variant primary, falls back to first enabled) and `hasActions` (true if any visible, non-disabled button is present).\n\n## Props\n\n### `stacked`\n\nType: `boolean` | Default: `false`\n\nRenders buttons in a vertical stack (full-width column) instead of horizontal row. When `stacked` is true, buttons stretch to full width and are arranged vertically with the primary button on top.\n\n## Authoring Conventions\n\n**Primary button placement:** The primary button must always be the first child in the DOM, regardless of horizontal or stacked layout. This ensures consistent focus order and authoring predictability. In the default horizontal layout, the primary action renders visually on the right because the component uses `row-reverse` flex direction internally.\n\n**Stacked layout limits:** Design guidelines recommend a maximum of 2 buttons in stacked groups. Stacked groups with more than 2 buttons may exceed typical mobile viewport heights.\n\n**Icon restrictions in stacked mode:** Do not use buttons with leading icons in stacked button groups. Leading icons are sized for horizontal layouts and create misaligned spacing in vertical stacks. Use plain labels or trailing icons if necessary.\n",
560
+ "docs": "Internal component used by `lmvz-modal` to manage its actions slot. Auto-assigns `variant` attributes to slotted buttons by order (first → primary, second → secondary, later → tertiary) when no explicit variant is set. Exposes `primaryEnabledAction` (first non-disabled button with variant primary, falls back to first enabled) and `hasActions` (true if any visible, non-disabled button is present).",
478
561
  "docsTags": [],
479
562
  "usage": {},
480
563
  "props": [
@@ -540,6 +623,35 @@
540
623
  "required": false,
541
624
  "getter": true,
542
625
  "setter": false
626
+ },
627
+ {
628
+ "name": "stacked",
629
+ "type": "boolean",
630
+ "complexType": {
631
+ "original": "boolean",
632
+ "resolved": "boolean",
633
+ "references": {}
634
+ },
635
+ "mutable": false,
636
+ "attr": "stacked",
637
+ "reflectToAttr": true,
638
+ "docs": "",
639
+ "docsTags": [
640
+ {
641
+ "name": "default",
642
+ "text": "false"
643
+ }
644
+ ],
645
+ "default": "false",
646
+ "values": [
647
+ {
648
+ "type": "boolean"
649
+ }
650
+ ],
651
+ "optional": false,
652
+ "required": false,
653
+ "getter": false,
654
+ "setter": false
543
655
  }
544
656
  ],
545
657
  "methods": [],
@@ -1144,8 +1256,8 @@
1144
1256
  "references": {
1145
1257
  "Chip": {
1146
1258
  "location": "import",
1147
- "path": "../../api/ds.constants.js",
1148
- "id": "src/api/ds.constants.ts::Chip",
1259
+ "path": "../../api/ds.types.js",
1260
+ "id": "src/api/ds.types.d.ts::Chip",
1149
1261
  "referenceLocation": "Chip"
1150
1262
  }
1151
1263
  }
@@ -1185,8 +1297,8 @@
1185
1297
  "references": {
1186
1298
  "Chip": {
1187
1299
  "location": "import",
1188
- "path": "../../api/ds.constants.js",
1189
- "id": "src/api/ds.constants.ts::Chip",
1300
+ "path": "../../api/ds.types.js",
1301
+ "id": "src/api/ds.types.d.ts::Chip",
1190
1302
  "referenceLocation": "Chip"
1191
1303
  }
1192
1304
  }
@@ -5833,8 +5945,8 @@
5833
5945
  "references": {
5834
5946
  "Link": {
5835
5947
  "location": "import",
5836
- "path": "../../api/ds.constants.js",
5837
- "id": "src/api/ds.constants.ts::Link",
5948
+ "path": "../../api/ds.types.js",
5949
+ "id": "src/api/ds.types.d.ts::Link",
5838
5950
  "referenceLocation": "Link"
5839
5951
  }
5840
5952
  }
@@ -8193,10 +8305,10 @@
8193
8305
  "docstring": "",
8194
8306
  "path": "src/api/index.d.ts"
8195
8307
  },
8196
- "src/api/ds.constants.ts::Chip": {
8308
+ "src/api/ds.types.d.ts::Chip": {
8197
8309
  "declaration": "any",
8198
8310
  "docstring": "",
8199
- "path": "src/api/ds.constants.ts"
8311
+ "path": "src/api/ds.types.d.ts"
8200
8312
  },
8201
8313
  "../../lib/ts/dist/validation/SVGString.d.ts::SVGString": {
8202
8314
  "declaration": "export type SVGString = string & Brand.Brand<'SVG'>;",
@@ -8213,10 +8325,10 @@
8213
8325
  "docstring": "",
8214
8326
  "path": "src/api/index.d.ts"
8215
8327
  },
8216
- "src/api/ds.constants.ts::Link": {
8328
+ "src/api/ds.types.d.ts::Link": {
8217
8329
  "declaration": "any",
8218
8330
  "docstring": "",
8219
- "path": "src/api/ds.constants.ts"
8331
+ "path": "src/api/ds.types.d.ts"
8220
8332
  },
8221
8333
  "src/api/index.d.ts::Message": {
8222
8334
  "declaration": "any",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lmvz-ds/components",
3
3
  "private": false,
4
- "version": "0.30.0",
4
+ "version": "0.32.0",
5
5
  "type": "module",
6
6
  "description": "The components of the design system",
7
7
  "author": "Patrick Nemenz <patrick.nemenz@adesso.at>",
@@ -111,6 +111,10 @@
111
111
  "./lmvz-spinner": {
112
112
  "import": "./components/lmvz-spinner.js",
113
113
  "types": "./components/lmvz-spinner.d.ts"
114
+ },
115
+ "./lmvz-action-list": {
116
+ "import": "./components/lmvz-action-list.js",
117
+ "types": "./components/lmvz-action-list.d.ts"
114
118
  }
115
119
  },
116
120
  "main": "./index.cjs.js",
@@ -10,47 +10,7 @@ export declare const iconWeights: readonly ["thin", "medium", "bold"];
10
10
  export declare const chipTypes: readonly ["active", "warning", "success", "error", "neutral"];
11
11
  export declare const chipSizes: readonly ["default", "small"];
12
12
  export declare const linkTypes: readonly ["internal", "external"];
13
- export declare namespace LmvzDS {
14
- type Variant = (typeof variants)[number];
15
- type Size = (typeof sizes)[number];
16
- }
17
- export declare namespace Typography {
18
- type Size = (typeof textSizes)[number];
19
- }
20
- export declare namespace Button {
21
- type Scale = (typeof scaleValues)[number];
22
- type Variant = LmvzDS.Variant;
23
- }
24
- export declare namespace Chip {
25
- type Type = (typeof chipTypes)[number];
26
- type Size = (typeof chipSizes)[number];
27
- }
28
- export declare namespace Link {
29
- type Type = (typeof linkTypes)[number];
30
- }
31
- export declare namespace Icon {
32
- type Size = (typeof iconSizes)[number];
33
- type IconWeight = (typeof iconWeights)[number];
34
- }
35
- export declare namespace Input {
36
- type Type = (typeof inputTypes)[number];
37
- type Size = (typeof inputSizes)[number];
38
- type Autocomplete = HTMLInputElement['autocomplete'];
39
- type Inputmode = 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';
40
- type Autocapitalize = 'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters';
41
- }
42
- export declare namespace Select {
43
- type Size = (typeof selectSizes)[number];
44
- }
45
13
  export declare const messageTypes: readonly ["neutral", "warning"];
46
- export declare namespace Message {
47
- type Type = (typeof messageTypes)[number];
48
- }
49
14
  export declare const snackbarStatuses: readonly ["success", "warning", "error"];
50
15
  export declare const snackbarPriorities: readonly ["low", "normal", "high"];
51
16
  export declare const snackbarDismissReasons: readonly ["timeout", "manual", "action", "overridden", "swallowed"];
52
- export declare namespace Snackbar {
53
- type Status = (typeof snackbarStatuses)[number];
54
- type Priority = (typeof snackbarPriorities)[number];
55
- type DismissReason = (typeof snackbarDismissReasons)[number];
56
- }
@@ -1,4 +1,71 @@
1
- export type * from './ds.constants';
1
+ import type {
2
+ chipSizes,
3
+ chipTypes,
4
+ iconSizes,
5
+ iconWeights,
6
+ inputSizes,
7
+ inputTypes,
8
+ linkTypes,
9
+ messageTypes,
10
+ scaleValues,
11
+ selectSizes,
12
+ sizes,
13
+ snackbarDismissReasons,
14
+ snackbarPriorities,
15
+ snackbarStatuses,
16
+ textSizes,
17
+ variants,
18
+ } from './ds.constants';
19
+
20
+ export namespace LmvzDS {
21
+ export type Variant = (typeof variants)[number];
22
+ export type Size = (typeof sizes)[number];
23
+ }
24
+ export namespace Typography {
25
+ export type Size = (typeof textSizes)[number];
26
+ }
27
+ export namespace Button {
28
+ export type Scale = (typeof scaleValues)[number];
29
+ export type Variant = LmvzDS.Variant;
30
+ }
31
+ export namespace Chip {
32
+ export type Type = (typeof chipTypes)[number];
33
+ export type Size = (typeof chipSizes)[number];
34
+ }
35
+ export namespace Link {
36
+ export type Type = (typeof linkTypes)[number];
37
+ }
38
+ export namespace Icon {
39
+ export type Size = (typeof iconSizes)[number];
40
+ export type IconWeight = (typeof iconWeights)[number];
41
+ }
42
+ export namespace Input {
43
+ export type Type = (typeof inputTypes)[number];
44
+ export type Size = (typeof inputSizes)[number];
45
+
46
+ export type Autocomplete = HTMLInputElement['autocomplete'];
47
+ /**
48
+ * Inputmode attribute for mobile keyboards
49
+ */
50
+ export type Inputmode = 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url';
51
+ /**
52
+ * Autocapitalize attribute for mobile keyboards
53
+ */
54
+ export type Autocapitalize = 'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters';
55
+ }
56
+ export namespace Select {
57
+ export type Size = (typeof selectSizes)[number];
58
+ }
59
+
60
+ export namespace Message {
61
+ export type Type = (typeof messageTypes)[number];
62
+ }
63
+
64
+ export namespace Snackbar {
65
+ export type Status = (typeof snackbarStatuses)[number];
66
+ export type Priority = (typeof snackbarPriorities)[number];
67
+ export type DismissReason = (typeof snackbarDismissReasons)[number];
68
+ }
2
69
 
3
70
  export type Attributes = { [key: string]: unknown };
4
71
  export type FormRef = string | HTMLFormElement | undefined;
@@ -0,0 +1,15 @@
1
+ import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
2
+ import { type DirectionalFocusHost } from '../../utils/aria/list-keyboard-controller';
3
+ import { ReactiveControllerHost } from '../../utils/stencil/reactive-controller-host';
4
+ export declare class LmvzActionList extends ReactiveControllerHost implements DirectionalFocusHost, AriaValidationHost {
5
+ readonly el: HTMLElement;
6
+ private slotEl?;
7
+ get validationEl(): HTMLElement;
8
+ get validationSlot(): HTMLSlotElement | undefined;
9
+ private readonly focusController;
10
+ readonly label?: string;
11
+ constructor();
12
+ componentDidLoad(): void;
13
+ private readonly handleSlotChange;
14
+ render(): any;
15
+ }
@@ -2,15 +2,17 @@ import { type EventEmitter } from '../../stencil-public-runtime';
2
2
  import type { Button, FormRef } from '../../api';
3
3
  import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
4
4
  import { type ElementActivationHost } from '../../utils/aria/element-activation-controller';
5
- import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
6
- export declare class LmvzButton extends ReactiveControllerHost implements AriaValidationHost, ElementActivationHost {
5
+ import type { DirectionalFocusReceiver } from '../../utils/aria/list-keyboard-controller';
6
+ import { ReactiveControllerHost } from '../../utils/stencil/reactive-controller-host';
7
+ export declare class LmvzButton extends ReactiveControllerHost implements AriaValidationHost, ElementActivationHost, DirectionalFocusReceiver {
7
8
  el: HTMLLmvzButtonElement;
8
9
  validationEl: HTMLButtonElement | undefined;
9
10
  private inheritedAttributes;
10
11
  private formEl;
11
12
  private formButtonEl;
12
13
  lmvzActivation: EventEmitter<void>;
13
- get ti(): number;
14
+ ti: number;
15
+ resolveFocusableElement(): HTMLElement | undefined;
14
16
  scale: Button.Scale;
15
17
  variant?: Button.Variant;
16
18
  disabled: boolean;
@@ -19,6 +21,7 @@ export declare class LmvzButton extends ReactiveControllerHost implements AriaVa
19
21
  formMethod?: 'dialog' | 'get' | 'post';
20
22
  name?: string;
21
23
  value?: string;
24
+ buttonRole?: string;
22
25
  constructor();
23
26
  connectedCallback(): void;
24
27
  disconnectedCallback(): void;
@@ -1,7 +1,9 @@
1
1
  export declare class LmvzButtonGroup {
2
+ el: HTMLElement;
2
3
  private actionsSlot?;
3
4
  private validationMessageCache;
4
5
  private actionsStateObserver?;
6
+ stacked: boolean;
5
7
  get primaryEnabledAction(): HTMLButtonElement | undefined;
6
8
  get hasActions(): boolean;
7
9
  componentDidLoad(): void;
@@ -1,6 +1,6 @@
1
1
  import { type EventEmitter } from '../../stencil-public-runtime';
2
2
  import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
3
- import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
3
+ import { ReactiveControllerHost } from '../../utils/stencil/reactive-controller-host';
4
4
  export declare class LmvzCheckbox extends ReactiveControllerHost implements AriaValidationHost {
5
5
  readonly el: HTMLElement;
6
6
  get validationEl(): HTMLElement;
@@ -1,6 +1,6 @@
1
- import { type Chip } from '../../api/ds.constants.js';
1
+ import type { Chip } from '../../api/ds.types.js';
2
2
  import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
3
- import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
3
+ import { ReactiveControllerHost } from '../../utils/stencil/reactive-controller-host.js';
4
4
  export declare class LmvzChip extends ReactiveControllerHost implements AriaValidationHost {
5
5
  private readonly ariaValidationController;
6
6
  private beforeSlot?;
@@ -1,6 +1,6 @@
1
1
  import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
2
2
  import { type DirectionalFocusHost } from '../../utils/aria/list-keyboard-controller';
3
- import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
3
+ import { ReactiveControllerHost } from '../../utils/stencil/reactive-controller-host';
4
4
  export declare class LmvzHeader extends ReactiveControllerHost implements AriaValidationHost, DirectionalFocusHost {
5
5
  readonly el: HTMLElement;
6
6
  get validationEl(): HTMLElement;
@@ -1,7 +1,7 @@
1
1
  import type { SVGString } from '@lmvz-ds/lib-ts/validation/SVGString.d.ts';
2
2
  import type { Icon } from '../../api';
3
3
  import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
4
- import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
4
+ import { ReactiveControllerHost } from '../../utils/stencil/reactive-controller-host';
5
5
  export declare class LmvzIcon extends ReactiveControllerHost implements AriaValidationHost {
6
6
  private intersectionObserver?;
7
7
  private readonly ariaValidationController;
@@ -1,7 +1,7 @@
1
1
  import { type EventEmitter } from '../../stencil-public-runtime';
2
2
  import type { Input } from '../../api';
3
3
  import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
4
- import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
4
+ import { ReactiveControllerHost } from '../../utils/stencil/reactive-controller-host';
5
5
  export declare class LmvzInput extends ReactiveControllerHost implements AriaValidationHost {
6
6
  readonly el: HTMLElement;
7
7
  get validationEl(): HTMLElement;
@@ -1,4 +1,4 @@
1
- import { type Link } from '../../api/ds.constants.js';
1
+ import type { Link } from '../../api/ds.types.js';
2
2
  export declare class LmvzLink {
3
3
  href: string;
4
4
  target?: '_self' | '_blank' | '_parent' | '_top';
@@ -1,7 +1,7 @@
1
1
  import { type EventEmitter } from '../../stencil-public-runtime';
2
2
  import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
3
3
  import { type ElementActivationHost } from '../../utils/aria/element-activation-controller';
4
- import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
4
+ import { ReactiveControllerHost } from '../../utils/stencil/reactive-controller-host';
5
5
  export declare class LmvzMenuItem extends ReactiveControllerHost implements AriaValidationHost, ElementActivationHost {
6
6
  readonly el: HTMLElement;
7
7
  get validationEl(): HTMLElement;
@@ -1,6 +1,6 @@
1
1
  import { type EventEmitter } from '../../stencil-public-runtime';
2
2
  import { type AriaValidationHost } from '../../utils/aria/aria-validation-controller';
3
- import { ReactiveControllerHost } from '../../utils/reactive-controller-host';
3
+ import { ReactiveControllerHost } from '../../utils/stencil/reactive-controller-host';
4
4
  export declare class LmvzModal extends ReactiveControllerHost implements AriaValidationHost {
5
5
  readonly el: HTMLLmvzModalElement;
6
6
  private inheritedAriaAttributes;