@lmvz-ds/components 0.35.2 → 0.36.1

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 (239) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/assets/icons/calendar.svg +7 -0
  3. package/cjs/{aria-validation-controller-BC0Eaiv4.js → aria-validation-controller-Do0uEK4t.js} +1 -1
  4. package/cjs/aria.constants-DPK5mQEL.js +65 -0
  5. package/cjs/{directional-focus-controller-DBat-oF7.js → directional-focus-controller-8Xd_7MHT.js} +3 -1
  6. package/cjs/{element-activation-controller-BHqCUgQv.js → element-activation-controller-DzTUocEO.js} +1 -1
  7. package/cjs/{element.util-CRS_YJ59.js → element.util-BlhcwmfR.js} +8 -54
  8. package/cjs/{index-TGsVZNDP.js → index-BgvZ4y-3.js} +12 -0
  9. package/cjs/lmvz-action-list.cjs.entry.js +5 -4
  10. package/cjs/lmvz-action.cjs.entry.js +1 -1
  11. package/cjs/lmvz-button-group.cjs.entry.js +3 -2
  12. package/cjs/lmvz-button_2.cjs.entry.js +6 -5
  13. package/cjs/lmvz-card.cjs.entry.js +1 -1
  14. package/cjs/lmvz-checkbox.cjs.entry.js +40 -6
  15. package/cjs/lmvz-chip.cjs.entry.js +2 -2
  16. package/cjs/lmvz-components.cjs.js +2 -2
  17. package/cjs/lmvz-datepicker.cjs.entry.js +2771 -0
  18. package/cjs/lmvz-header_2.cjs.entry.js +7 -6
  19. package/cjs/lmvz-input.cjs.entry.js +71 -15
  20. package/cjs/lmvz-link.cjs.entry.js +2 -2
  21. package/cjs/lmvz-menuitem.cjs.entry.js +6 -5
  22. package/cjs/lmvz-message.cjs.entry.js +2 -2
  23. package/cjs/lmvz-modal.cjs.entry.js +5 -4
  24. package/cjs/lmvz-popover.cjs.entry.js +25 -10
  25. package/cjs/lmvz-radio.cjs.entry.js +63 -5
  26. package/cjs/lmvz-select.cjs.entry.js +425 -18
  27. package/cjs/lmvz-snackbar.cjs.entry.js +2 -2
  28. package/cjs/lmvz-spinner.cjs.entry.js +2 -2
  29. package/cjs/lmvz-tab.cjs.entry.js +2 -2
  30. package/cjs/lmvz-tabs.cjs.entry.js +5 -4
  31. package/cjs/lmvz-toggle.cjs.entry.js +7 -4
  32. package/cjs/loader.cjs.js +2 -2
  33. package/collection/assets/icons/calendar.svg +7 -0
  34. package/collection/collection-manifest.json +1 -0
  35. package/collection/components/lmvz-checkbox/lmvz-checkbox.css +4 -2
  36. package/collection/components/lmvz-checkbox/lmvz-checkbox.js +68 -8
  37. package/collection/components/lmvz-datepicker/lmvz-datepicker.css +161 -0
  38. package/collection/components/lmvz-datepicker/lmvz-datepicker.js +1002 -0
  39. package/collection/components/lmvz-datepicker/lmvz-datepicker.utils.js +189 -0
  40. package/collection/components/lmvz-datepicker/test/lmvz-datepicker.utils.unit.js +300 -0
  41. package/collection/components/lmvz-header/lmvz-header.js +1 -1
  42. package/collection/components/lmvz-icon/lmvz-icon.js +1 -1
  43. package/collection/components/lmvz-input/lmvz-input.css +1 -1
  44. package/collection/components/lmvz-input/lmvz-input.js +85 -12
  45. package/collection/components/lmvz-link/lmvz-link.js +1 -1
  46. package/collection/components/lmvz-menuitem/lmvz-menuitem.js +1 -1
  47. package/collection/components/lmvz-message/lmvz-message.js +1 -1
  48. package/collection/components/lmvz-modal/lmvz-modal.js +1 -1
  49. package/collection/components/lmvz-popover/lmvz-popover.css +1 -1
  50. package/collection/components/lmvz-popover/lmvz-popover.js +50 -6
  51. package/collection/components/lmvz-radio/lmvz-radio.js +77 -9
  52. package/collection/components/lmvz-select/lmvz-select.css +96 -34
  53. package/collection/components/lmvz-select/lmvz-select.js +412 -21
  54. package/collection/components/lmvz-snackbar/lmvz-snackbar.js +1 -1
  55. package/collection/components/lmvz-spinner/lmvz-spinner.js +1 -1
  56. package/collection/components/lmvz-tab/lmvz-tab.js +1 -1
  57. package/collection/components/lmvz-tabs/lmvz-tabs.js +1 -1
  58. package/collection/components/lmvz-toggle/lmvz-toggle.js +21 -1
  59. package/collection/integration/header-integration/header-integration.js +1 -1
  60. package/collection/styles/fragments/_focus-within.css +2 -2
  61. package/collection/utils/aria/aria.constants.js +7 -0
  62. package/collection/utils/aria/directional-focus-controller.js +3 -1
  63. package/collection/utils/aria/listbox-controller.js +154 -0
  64. package/collection/utils/element/element.util.js +5 -0
  65. package/collection/utils/radio/radio-group-controller.js +17 -0
  66. package/components/index.d.ts +2 -0
  67. package/components/index.d.ts.bak +2 -0
  68. package/components/index.js +1 -1
  69. package/components/lmvz-action-list.js +1 -1
  70. package/components/lmvz-action.js +1 -1
  71. package/components/lmvz-button-group.js +1 -1
  72. package/components/lmvz-button.js +1 -1
  73. package/components/lmvz-card.js +1 -1
  74. package/components/lmvz-checkbox.js +1 -1
  75. package/components/lmvz-chip.js +1 -1
  76. package/components/lmvz-datepicker.d.ts +11 -0
  77. package/components/lmvz-datepicker.d.ts.bak +11 -0
  78. package/components/lmvz-datepicker.js +1 -0
  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-popover.js +1 -1
  87. package/components/lmvz-radio.js +1 -1
  88. package/components/lmvz-select.js +1 -1
  89. package/components/lmvz-snackbar.js +1 -1
  90. package/components/lmvz-spinner.js +1 -1
  91. package/components/lmvz-tab.js +1 -1
  92. package/components/lmvz-tabs.js +1 -1
  93. package/components/lmvz-toggle.js +1 -1
  94. package/components/{p-Chj7BuUZ.js → p--FDdvoIg.js} +1 -1
  95. package/components/{p-CFTmV4XZ.js → p-BAj4FkUt.js} +1 -1
  96. package/components/p-BApwCp0R.js +1 -0
  97. package/components/{p-CxLd309t.js → p-BLMXiDE0.js} +1 -1
  98. package/components/{p-DGg7OzDl.js → p-BPYBmylI.js} +1 -1
  99. package/components/p-BhALzK62.js +1 -0
  100. package/components/{p-B_rnXUwq.js → p-Bnri3fEI.js} +1 -1
  101. package/components/p-C-pRMuMh.js +1 -0
  102. package/components/p-C5gRiLRR.js +1 -0
  103. package/components/{p-D5FL8n1q.js → p-CrQCHVKL.js} +1 -1
  104. package/components/p-DqdrUt_G.js +1 -0
  105. package/components/{p-CgK6-SEe.js → p-diOze8wI.js} +1 -1
  106. package/esm/{aria-validation-controller-BvOU1BO8.js → aria-validation-controller-Cp6pofER.js} +1 -1
  107. package/esm/aria.constants-DIyiticz.js +62 -0
  108. package/esm/{directional-focus-controller-DgAdCZrG.js → directional-focus-controller-QukTTWBE.js} +3 -1
  109. package/esm/{element-activation-controller-7PNSl6io.js → element-activation-controller-dxJZKMag.js} +1 -1
  110. package/esm/{element.util-BFcYfHYq.js → element.util-3ydVsxUW.js} +7 -54
  111. package/esm/{index-BPeerEwm.js → index-BOXP1Vx0.js} +12 -1
  112. package/esm/lmvz-action-list.entry.js +5 -4
  113. package/esm/lmvz-action.entry.js +1 -1
  114. package/esm/lmvz-button-group.entry.js +3 -2
  115. package/esm/lmvz-button_2.entry.js +6 -5
  116. package/esm/lmvz-card.entry.js +1 -1
  117. package/esm/lmvz-checkbox.entry.js +40 -6
  118. package/esm/lmvz-chip.entry.js +2 -2
  119. package/esm/lmvz-components.js +3 -3
  120. package/esm/lmvz-datepicker.entry.js +2769 -0
  121. package/esm/lmvz-header_2.entry.js +7 -6
  122. package/esm/lmvz-input.entry.js +71 -15
  123. package/esm/lmvz-link.entry.js +2 -2
  124. package/esm/lmvz-menuitem.entry.js +6 -5
  125. package/esm/lmvz-message.entry.js +2 -2
  126. package/esm/lmvz-modal.entry.js +5 -4
  127. package/esm/lmvz-popover.entry.js +25 -10
  128. package/esm/lmvz-radio.entry.js +63 -5
  129. package/esm/lmvz-select.entry.js +425 -18
  130. package/esm/lmvz-snackbar.entry.js +2 -2
  131. package/esm/lmvz-spinner.entry.js +2 -2
  132. package/esm/lmvz-tab.entry.js +2 -2
  133. package/esm/lmvz-tabs.entry.js +5 -4
  134. package/esm/lmvz-toggle.entry.js +7 -4
  135. package/esm/loader.js +3 -3
  136. package/hydrate/index.js +3474 -75
  137. package/hydrate/index.mjs +3474 -75
  138. package/lmvz-components/lmvz-components.esm.js +1 -1
  139. package/lmvz-components/{p-eb62d4af.entry.js → p-0af0211a.entry.js} +1 -1
  140. package/lmvz-components/{p-5bbbcfc0.entry.js → p-0f65d001.entry.js} +1 -1
  141. package/lmvz-components/p-137b1fe1.entry.js +1 -0
  142. package/lmvz-components/p-26dd9684.entry.js +1 -0
  143. package/lmvz-components/p-36f44108.entry.js +1 -0
  144. package/lmvz-components/p-398b5cf4.entry.js +1 -0
  145. package/lmvz-components/p-3a396fc8.entry.js +1 -0
  146. package/lmvz-components/{p-0c05f24b.entry.js → p-3d5867df.entry.js} +1 -1
  147. package/lmvz-components/p-40716828.entry.js +1 -0
  148. package/lmvz-components/{p-a887018d.entry.js → p-492adf21.entry.js} +1 -1
  149. package/lmvz-components/{p-24d13be6.entry.js → p-4fa6e72f.entry.js} +1 -1
  150. package/lmvz-components/p-70f1e31a.entry.js +1 -0
  151. package/lmvz-components/p-71d06d1d.entry.js +1 -0
  152. package/lmvz-components/{p-d45164a8.entry.js → p-7a7aa922.entry.js} +1 -1
  153. package/lmvz-components/p-88661c50.entry.js +1 -0
  154. package/lmvz-components/p-91eb71bb.entry.js +1 -0
  155. package/lmvz-components/p-BA3wizqg.js +1 -0
  156. package/lmvz-components/{p-BPeerEwm.js → p-BOXP1Vx0.js} +2 -2
  157. package/lmvz-components/{p-D9PQIBzA.js → p-BeY96W7m.js} +1 -1
  158. package/lmvz-components/p-CHxiS3ja.js +1 -0
  159. package/lmvz-components/{p-wlMjNjuv.js → p-CPSyM_e-.js} +1 -1
  160. package/lmvz-components/p-DIyiticz.js +1 -0
  161. package/lmvz-components/p-a680a7b2.entry.js +1 -0
  162. package/lmvz-components/{p-c2544495.entry.js → p-a6fe9b61.entry.js} +1 -1
  163. package/lmvz-components/{p-ecbd9e93.entry.js → p-a99acb02.entry.js} +1 -1
  164. package/lmvz-components/p-f16a19fc.entry.js +1 -0
  165. package/lmvz-components/p-f3f0ed49.entry.js +1 -0
  166. package/lmvz-components/p-f516a949.entry.js +1 -0
  167. package/manifest.json +1305 -188
  168. package/package.json +5 -1
  169. package/types/api/ds.constants.d.ts +0 -1
  170. package/types/api/ds.types.d.ts +9 -0
  171. package/types/components/lmvz-action/lmvz-action.d.ts +0 -1
  172. package/types/components/lmvz-action-list/lmvz-action-list.d.ts +0 -1
  173. package/types/components/lmvz-button/lmvz-button.d.ts +0 -1
  174. package/types/components/lmvz-button-group/lmvz-button-group.d.ts +0 -1
  175. package/types/components/lmvz-card/lmvz-card.d.ts +0 -1
  176. package/types/components/lmvz-checkbox/lmvz-checkbox.d.ts +9 -2
  177. package/types/components/lmvz-chip/lmvz-chip.d.ts +0 -1
  178. package/types/components/lmvz-datepicker/lmvz-datepicker.d.ts +77 -0
  179. package/types/components/lmvz-datepicker/lmvz-datepicker.utils.d.ts +22 -0
  180. package/types/components/lmvz-datepicker/test/lmvz-datepicker.utils.unit.d.ts +1 -0
  181. package/types/components/lmvz-header/lmvz-header.d.ts +0 -1
  182. package/types/components/lmvz-icon/lmvz-icon.d.ts +0 -1
  183. package/types/components/lmvz-input/lmvz-input.d.ts +8 -1
  184. package/types/components/lmvz-link/lmvz-link.d.ts +0 -1
  185. package/types/components/lmvz-menuitem/lmvz-menuitem.d.ts +0 -1
  186. package/types/components/lmvz-message/lmvz-message.d.ts +0 -1
  187. package/types/components/lmvz-message/public.d.ts +0 -1
  188. package/types/components/lmvz-modal/lmvz-modal.d.ts +0 -1
  189. package/types/components/lmvz-modal/test/testing.d.ts +0 -1
  190. package/types/components/lmvz-popover/lmvz-popover.d.ts +2 -1
  191. package/types/components/lmvz-radio/lmvz-radio.d.ts +12 -3
  192. package/types/components/lmvz-select/lmvz-select.d.ts +53 -5
  193. package/types/components/lmvz-snackbar/lmvz-snackbar.d.ts +0 -1
  194. package/types/components/lmvz-snackbar/public.d.ts +0 -1
  195. package/types/components/lmvz-snackbar/snackbar-controller.d.ts +0 -1
  196. package/types/components/lmvz-spinner/lmvz-spinner.d.ts +0 -1
  197. package/types/components/lmvz-tab/lmvz-tab.d.ts +0 -1
  198. package/types/components/lmvz-tabs/lmvz-tabs.d.ts +0 -1
  199. package/types/components/lmvz-toggle/lmvz-toggle.d.ts +1 -1
  200. package/types/components.d.ts +312 -12
  201. package/types/index.d.ts +0 -1
  202. package/types/utils/aria/aria-validation-controller.d.ts +0 -1
  203. package/types/utils/aria/aria.constants.d.ts +1 -1
  204. package/types/utils/aria/directional-focus-controller.d.ts +0 -1
  205. package/types/utils/aria/element-activation-controller.d.ts +0 -1
  206. package/types/utils/aria/listbox-controller.d.ts +42 -0
  207. package/types/utils/async/async.util.d.ts +1 -2
  208. package/types/utils/data/event.util.d.ts +0 -1
  209. package/types/utils/data/number.util.d.ts +0 -1
  210. package/types/utils/data/object.util.d.ts +0 -1
  211. package/types/utils/data/time.util.d.ts +0 -1
  212. package/types/utils/element/element.util.d.ts +1 -1
  213. package/types/utils/environment.d.ts +0 -1
  214. package/types/utils/icons/icons-registry.d.ts +0 -1
  215. package/types/utils/icons/icons.d.ts +0 -1
  216. package/types/utils/icons/icons.unit.d.ts +0 -1
  217. package/types/utils/icons/public.d.ts +0 -1
  218. package/types/utils/public.d.ts +0 -1
  219. package/types/utils/radio/radio-group-controller.d.ts +3 -1
  220. package/types/utils/stencil/assets.d.ts +0 -1
  221. package/types/utils/stencil/reactive-controller-host.d.ts +0 -1
  222. package/types/utils/stencil/stencil.util.d.ts +0 -1
  223. package/components/p-DLUsBYJH.js +0 -1
  224. package/components/p-zMWemcoB.js +0 -1
  225. package/lmvz-components/p-194a3af5.entry.js +0 -1
  226. package/lmvz-components/p-46edf36f.entry.js +0 -1
  227. package/lmvz-components/p-5ff55ba9.entry.js +0 -1
  228. package/lmvz-components/p-888e04d7.entry.js +0 -1
  229. package/lmvz-components/p-9dc420e2.entry.js +0 -1
  230. package/lmvz-components/p-BFcYfHYq.js +0 -1
  231. package/lmvz-components/p-BuEA0MWd.js +0 -1
  232. package/lmvz-components/p-aaa7691c.entry.js +0 -1
  233. package/lmvz-components/p-b6dd045b.entry.js +0 -1
  234. package/lmvz-components/p-c3e62aba.entry.js +0 -1
  235. package/lmvz-components/p-d4154a65.entry.js +0 -1
  236. package/lmvz-components/p-e4ce63b3.entry.js +0 -1
  237. package/lmvz-components/p-eb4c5a6f.entry.js +0 -1
  238. package/lmvz-components/p-f42b16e6.entry.js +0 -1
  239. package/lmvz-components/p-fbf066d9.entry.js +0 -1
package/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-07-07T12:07:13",
2
+ "timestamp": "2026-07-10T08:26:43",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.5",
@@ -568,12 +568,16 @@
568
568
  ],
569
569
  "states": [],
570
570
  "dependents": [
571
+ "lmvz-datepicker",
571
572
  "lmvz-message",
572
573
  "lmvz-modal",
573
574
  "lmvz-snackbar"
574
575
  ],
575
576
  "dependencies": [],
576
577
  "dependencyGraph": {
578
+ "lmvz-datepicker": [
579
+ "lmvz-button"
580
+ ],
577
581
  "lmvz-message": [
578
582
  "lmvz-button"
579
583
  ],
@@ -853,7 +857,7 @@
853
857
  "filePath": "src/components/lmvz-checkbox/lmvz-checkbox.tsx",
854
858
  "encapsulation": "scoped",
855
859
  "tag": "lmvz-checkbox",
856
- "readme": "# lmvz-checkbox\n\nAccessible, form-associated checkbox built as a Stencil scoped web component. Participates in native HTML forms via `ElementInternals` and emits a `lmvzChange` event on toggle.\n\n## Usage\n\n### Basic\n\n```html\n<lmvz-checkbox label=\"Accept terms and conditions\"></lmvz-checkbox>\n\n<!-- With helper text -->\n<lmvz-checkbox\n label=\"Subscribe to newsletter\"\n helper-text=\"You can unsubscribe at any time.\"\n></lmvz-checkbox>\n\n<!-- Required with error state -->\n<lmvz-checkbox\n label=\"I agree to the privacy policy\"\n required\n error\n error-message=\"You must accept the privacy policy to continue.\"\n></lmvz-checkbox>\n```\n\n### Form integration\n\n`lmvz-checkbox` participates in native form submission via `ElementInternals`. Use `name` to set the field name and `value` to control the submitted value (defaults to `'on'`).\n\n```html\n<form id=\"signup-form\">\n <lmvz-checkbox\n name=\"terms\"\n label=\"Accept terms and conditions\"\n value=\"accepted\"\n required\n ></lmvz-checkbox>\n <button type=\"submit\">Submit</button>\n</form>\n```\n\n```js\ndocument.getElementById('signup-form').addEventListener('submit', (event) => {\n event.preventDefault();\n const data = new FormData(event.target);\n // data.get('terms') === 'accepted' when checked, null when unchecked\n console.log(data.get('terms'));\n});\n```\n\nTo associate the checkbox with a form outside its DOM subtree, pass the form element's `id` via the `form` attribute:\n\n```html\n<form id=\"external-form\">...</form>\n<lmvz-checkbox name=\"consent\" label=\"I consent\" form=\"external-form\"></lmvz-checkbox>\n```\n\n## Reflected Attributes\n\nThe following props are reflected as HTML attributes and can be used in CSS attribute selectors:\n\n| Prop | Attribute |\n|------|-----------|\n| `checked` | `checked` |\n| `disabled` | `disabled` |\n| `required` | `required` |\n| `error` | `error` |\n\n## CSS Custom Properties\n\nOverride these on the `:host` element to theme the component. All defaults reference LMVZ semantic or global design tokens.\n\n| Custom Property | Default | Purpose |\n|----------------|---------|---------|\n| `--checkbox-box-size` | `var(--lmvz-global-dimension-s18)` | Width and height of the checkbox box |\n| `--checkbox-border-radius` | `var(--lmvz-global-dimension-s4)` | Border radius of the checkbox box |\n| `--checkbox-border-color` | `var(--lmvz-semantic-color-border-default)` | Default (unchecked) border color |\n| `--checkbox-border-color-hover` | `var(--lmvz-semantic-color-border-hover)` | Border color on hover |\n| `--checkbox-border-color-checked` | `var(--lmvz-semantic-color-border-active)` | Border color when checked |\n| `--checkbox-border-color-error` | `var(--lmvz-semantic-color-status-on-danger)` | Border color in error state |\n| `--checkbox-focus-color` | `var(--lmvz-semantic-color-status-on-active)` | Focus ring color |\n| `--checkbox-checkmark-color` | `var(--lmvz-semantic-color-border-active)` | Checkmark SVG stroke color |\n| `--checkbox-label-color` | `var(--lmvz-semantic-color-on-surface-primary)` | Label text color (default and hover) |\n| `--checkbox-label-color-checked` | `var(--lmvz-semantic-color-status-on-active)` | Label text color when checked |\n| `--checkbox-wrapper-bg-hover` | `var(--lmvz-semantic-color-int-tertiary-hover)` | Pill background on hover |\n| `--checkbox-wrapper-bg-checked` | `var(--lmvz-semantic-color-status-active)` | Pill background when checked |\n| `--checkbox-ripple-bg` | `var(--lmvz-semantic-color-int-secondary-hover)` | Ripple dot color |\n| `--checkbox-helper-color` | `var(--lmvz-semantic-color-on-surface-secondary)` | Helper text color |\n| `--checkbox-error-color` | `var(--lmvz-semantic-color-status-on-danger)` | Error message text color |\n| `--checkbox-disabled-opacity` | `var(--lmvz-component-input-disabled-opacity)` | Opacity when disabled — see caveat below |\n\n## Known Caveats\n\n### Checkbox box size uses a generic dimension token (5.1)\n\n`--checkbox-box-size` defaults to `--lmvz-global-dimension-s18` (18 px). This is a global dimension token; a component-specific token (`component.checkbox.box-size`) is the recommended long-term solution. The effective rendered size is 18 px until that token exists.\n\n### Border-radius uses a generic dimension token (5.2)\n\n`--checkbox-border-radius` defaults to `--lmvz-global-dimension-s4` (4 px). This is a generic dimension token. If `component.checkbox.border-radius` is introduced, this property should be migrated to it.\n\n### Checked label contrast borderline (5.3)\n\nWhen checked, the label text color (`--lmvz-semantic-color-status-on-active`, `#0e7ab4`) against the checked wrapper background (`--lmvz-semantic-color-status-active`, `#f1f9fe`) produces approximately 4.4:1 contrast. This is marginally below the WCAG AA minimum of 4.5:1 for normal text. This was accepted as a design trade-off. Verify contrast against the actual rendered background before each accessibility audit.\n\n### Helper text font-weight inconsistency with `lmvz-input` (5.6)\n\nHelper text renders at `font-weight: 400` per the `body-sm` design token. `lmvz-input` uses `font-weight: 500` for its helper text — a pre-existing inconsistency in the design system. `lmvz-checkbox` intentionally follows the token-specified value. This should be resolved at the design system token level.\n\n### Disabled opacity token export bug (5.7)\n\n`--lmvz-component-input-disabled-opacity` resolves from `global.opacity.opacity-disabled`, which has a known Supernova export bug: the token value is stored as `\"40px\"` (dimension type) instead of `0.4` (unitless number). If disabled checkboxes render at full opacity or at an incorrect size, apply the following workaround at the consuming app level:\n\n```css\nlmvz-checkbox[disabled] {\n --checkbox-disabled-opacity: 0.4;\n}\n```\n\nThis token bug should be tracked and fixed in `packages/design-tokens`.\n",
860
+ "readme": "# lmvz-checkbox\n\nAccessible, form-associated checkbox built as a Stencil scoped web component. Participates in native HTML forms via `ElementInternals` and emits a `lmvzChange` event on toggle.\n\n## Usage\n\n### Basic\n\n```html\n<lmvz-checkbox label=\"Accept terms and conditions\"></lmvz-checkbox>\n\n<!-- With helper text -->\n<lmvz-checkbox\n label=\"Subscribe to newsletter\"\n helper-text=\"You can unsubscribe at any time.\"\n></lmvz-checkbox>\n\n<!-- Required with error state -->\n<lmvz-checkbox\n label=\"I agree to the privacy policy\"\n required\n error\n error-message=\"You must accept the privacy policy to continue.\"\n></lmvz-checkbox>\n```\n\n### Form integration\n\n`lmvz-checkbox` participates in native form submission via `ElementInternals`. Use `name` to set the field name and `value` to control the submitted value (defaults to `'on'`).\n\n```html\n<form id=\"signup-form\">\n <lmvz-checkbox\n name=\"terms\"\n label=\"Accept terms and conditions\"\n value=\"accepted\"\n required\n ></lmvz-checkbox>\n <button type=\"submit\">Submit</button>\n</form>\n```\n\n```js\ndocument.getElementById('signup-form').addEventListener('submit', (event) => {\n event.preventDefault();\n const data = new FormData(event.target);\n // data.get('terms') === 'accepted' when checked, null when unchecked\n console.log(data.get('terms'));\n});\n```\n\nTo associate the checkbox with a form outside its DOM subtree, pass the form element's `id` via the `form` attribute:\n\n```html\n<form id=\"external-form\">...</form>\n<lmvz-checkbox name=\"consent\" label=\"I consent\" form=\"external-form\"></lmvz-checkbox>\n```\n\nUse `checkValidity()`, `reportValidity()`, and `getValidationMessage()` for programmatic validation. The `error` prop can be set manually or will automatically reflect constraint validation state after a validation attempt; correspondingly, `aria-invalid` is set to `true` when `error=true` or when the real constraint validity becomes invalid, and is cleared once resolved.\n\n## Reflected Attributes\n\nThe following props are reflected as HTML attributes and can be used in CSS attribute selectors:\n\n| Prop | Attribute |\n|------|-----------|\n| `checked` | `checked` |\n| `disabled` | `disabled` |\n| `required` | `required` |\n| `error` | `error` |\n\n## CSS Custom Properties\n\nOverride these on the `:host` element to theme the component. All defaults reference LMVZ semantic or global design tokens.\n\n| Custom Property | Default | Purpose |\n|----------------|---------|---------|\n| `--checkbox-box-size` | `var(--lmvz-global-dimension-s18)` | Width and height of the checkbox box |\n| `--checkbox-border-radius` | `var(--lmvz-global-dimension-s4)` | Border radius of the checkbox box |\n| `--checkbox-border-color` | `var(--lmvz-semantic-color-border-default)` | Default (unchecked) border color |\n| `--checkbox-border-color-hover` | `var(--lmvz-semantic-color-border-hover)` | Border color on hover |\n| `--checkbox-border-color-checked` | `var(--lmvz-semantic-color-border-active)` | Border color when checked |\n| `--checkbox-border-color-error` | `var(--lmvz-semantic-color-status-on-danger)` | Border color in error state |\n| `--checkbox-focus-color` | `var(--lmvz-semantic-color-status-on-active)` | Focus ring color |\n| `--checkbox-checkmark-color` | `var(--lmvz-semantic-color-border-active)` | Checkmark SVG stroke color |\n| `--checkbox-label-color` | `var(--lmvz-semantic-color-on-surface-primary)` | Label text color (default and hover) |\n| `--checkbox-label-color-checked` | `var(--lmvz-semantic-color-status-on-active)` | Label text color when checked |\n| `--checkbox-wrapper-bg-hover` | `var(--lmvz-semantic-color-int-tertiary-hover)` | Pill background on hover |\n| `--checkbox-wrapper-bg-checked` | `var(--lmvz-semantic-color-status-active)` | Pill background when checked |\n| `--checkbox-ripple-bg` | `var(--lmvz-semantic-color-int-secondary-hover)` | Ripple dot color |\n| `--checkbox-helper-color` | `var(--lmvz-semantic-color-on-surface-secondary)` | Helper text color |\n| `--checkbox-error-color` | `var(--lmvz-semantic-color-status-on-danger)` | Error message text color |\n| `--checkbox-disabled-opacity` | `var(--lmvz-component-input-disabled-opacity)` | Opacity when disabled — see caveat below |\n\n## Known Caveats\n\n### Checkbox box size uses a generic dimension token (5.1)\n\n`--checkbox-box-size` defaults to `--lmvz-global-dimension-s18` (18 px). This is a global dimension token; a component-specific token (`component.checkbox.box-size`) is the recommended long-term solution. The effective rendered size is 18 px until that token exists.\n\n### Border-radius uses a generic dimension token (5.2)\n\n`--checkbox-border-radius` defaults to `--lmvz-global-dimension-s4` (4 px). This is a generic dimension token. If `component.checkbox.border-radius` is introduced, this property should be migrated to it.\n\n### Checked label contrast borderline (5.3)\n\nWhen checked, the label text color (`--lmvz-semantic-color-status-on-active`, `#0e7ab4`) against the checked wrapper background (`--lmvz-semantic-color-status-active`, `#f1f9fe`) produces approximately 4.4:1 contrast. This is marginally below the WCAG AA minimum of 4.5:1 for normal text. This was accepted as a design trade-off. Verify contrast against the actual rendered background before each accessibility audit.\n\n### Helper text font-weight inconsistency with `lmvz-input` (5.6)\n\nHelper text renders at `font-weight: 400` per the `body-sm` design token. `lmvz-input` uses `font-weight: 500` for its helper text — a pre-existing inconsistency in the design system. `lmvz-checkbox` intentionally follows the token-specified value. This should be resolved at the design system token level.\n\n### Disabled opacity token export bug (5.7)\n\n`--lmvz-component-input-disabled-opacity` resolves from `global.opacity.opacity-disabled`, which has a known Supernova export bug: the token value is stored as `\"40px\"` (dimension type) instead of `0.4` (unitless number). If disabled checkboxes render at full opacity or at an incorrect size, apply the following workaround at the consuming app level:\n\n```css\nlmvz-checkbox[disabled] {\n --checkbox-disabled-opacity: 0.4;\n}\n```\n\nThis token bug should be tracked and fixed in `packages/design-tokens`.\n",
857
861
  "docs": "Checkbox component with form association, ARIA validation, and accessible label support.",
858
862
  "docsTags": [
859
863
  {
@@ -968,7 +972,6 @@
968
972
  "text": "false"
969
973
  }
970
974
  ],
971
- "default": "false",
972
975
  "values": [
973
976
  {
974
977
  "type": "boolean"
@@ -976,8 +979,8 @@
976
979
  ],
977
980
  "optional": false,
978
981
  "required": false,
979
- "getter": false,
980
- "setter": false
982
+ "getter": true,
983
+ "setter": true
981
984
  },
982
985
  {
983
986
  "name": "errorMessage",
@@ -1090,7 +1093,7 @@
1090
1093
  },
1091
1094
  "mutable": false,
1092
1095
  "attr": "name",
1093
- "reflectToAttr": false,
1096
+ "reflectToAttr": true,
1094
1097
  "docs": "Name attribute for form submission via ElementInternals.",
1095
1098
  "docsTags": [],
1096
1099
  "values": [
@@ -1211,193 +1214,972 @@
1211
1214
  "docsTags": []
1212
1215
  },
1213
1216
  {
1214
- "name": "reportValidity",
1215
- "returns": {
1216
- "type": "Promise<boolean>",
1217
- "docs": ""
1218
- },
1217
+ "name": "getValidationMessage",
1218
+ "returns": {
1219
+ "type": "Promise<string>",
1220
+ "docs": ""
1221
+ },
1222
+ "complexType": {
1223
+ "signature": "() => Promise<string>",
1224
+ "parameters": [],
1225
+ "references": {
1226
+ "Promise": {
1227
+ "location": "global",
1228
+ "id": "global::Promise"
1229
+ }
1230
+ },
1231
+ "return": "Promise<string>"
1232
+ },
1233
+ "signature": "getValidationMessage() => Promise<string>",
1234
+ "parameters": [],
1235
+ "docs": "Returns the current validation message, if any.",
1236
+ "docsTags": []
1237
+ },
1238
+ {
1239
+ "name": "reportValidity",
1240
+ "returns": {
1241
+ "type": "Promise<boolean>",
1242
+ "docs": ""
1243
+ },
1244
+ "complexType": {
1245
+ "signature": "() => Promise<boolean>",
1246
+ "parameters": [],
1247
+ "references": {
1248
+ "Promise": {
1249
+ "location": "global",
1250
+ "id": "global::Promise"
1251
+ }
1252
+ },
1253
+ "return": "Promise<boolean>"
1254
+ },
1255
+ "signature": "reportValidity() => Promise<boolean>",
1256
+ "parameters": [],
1257
+ "docs": "Reports validation errors to the user.",
1258
+ "docsTags": []
1259
+ }
1260
+ ],
1261
+ "events": [
1262
+ {
1263
+ "event": "lmvzChange",
1264
+ "detail": "boolean",
1265
+ "bubbles": true,
1266
+ "complexType": {
1267
+ "original": "boolean",
1268
+ "resolved": "boolean",
1269
+ "references": {}
1270
+ },
1271
+ "cancelable": true,
1272
+ "composed": true,
1273
+ "docs": "Emitted whenever the checkbox checked state changes.\nEvent detail contains the new checked boolean value.",
1274
+ "docsTags": []
1275
+ }
1276
+ ],
1277
+ "listeners": [
1278
+ {
1279
+ "event": "invalid",
1280
+ "capture": false,
1281
+ "passive": false
1282
+ }
1283
+ ],
1284
+ "styles": [],
1285
+ "slots": [],
1286
+ "parts": [],
1287
+ "states": [],
1288
+ "dependents": [],
1289
+ "dependencies": [],
1290
+ "dependencyGraph": {}
1291
+ },
1292
+ {
1293
+ "filePath": "src/components/lmvz-chip/lmvz-chip.tsx",
1294
+ "encapsulation": "shadow",
1295
+ "tag": "lmvz-chip",
1296
+ "readme": "# lmvz-chip\n\n\n",
1297
+ "docs": "The chip displays a compact semantic status as a non-interactive UI element.",
1298
+ "docsTags": [
1299
+ {
1300
+ "name": "slot",
1301
+ "text": "default - Arbitrary inline content used as the chip label. Icons passed here may not be aligned or spaced with the text content properly."
1302
+ },
1303
+ {
1304
+ "name": "slot",
1305
+ "text": "before-text - Optional slot for content to be placed before the text content. Common use case is an icon."
1306
+ },
1307
+ {
1308
+ "name": "slot",
1309
+ "text": "after-text - Optional slot for content to be placed after the text content. Common use case is an icon.\n\nSlotted `lmvz-icon`s are controlled by the chip's internal sizing."
1310
+ }
1311
+ ],
1312
+ "usage": {},
1313
+ "props": [
1314
+ {
1315
+ "name": "size",
1316
+ "type": "\"default\" | \"small\"",
1317
+ "complexType": {
1318
+ "original": "Chip.Size",
1319
+ "resolved": "\"default\" | \"small\"",
1320
+ "references": {
1321
+ "Chip": {
1322
+ "location": "import",
1323
+ "path": "../../api/ds.types.js",
1324
+ "id": "src/api/ds.types.d.ts::Chip",
1325
+ "referenceLocation": "Chip"
1326
+ }
1327
+ }
1328
+ },
1329
+ "mutable": true,
1330
+ "attr": "size",
1331
+ "reflectToAttr": true,
1332
+ "docs": "Size variant of the chip.\nInvalid values are normalized to `default` at runtime.",
1333
+ "docsTags": [
1334
+ {
1335
+ "name": "default",
1336
+ "text": "'default'"
1337
+ }
1338
+ ],
1339
+ "default": "'default'",
1340
+ "values": [
1341
+ {
1342
+ "value": "default",
1343
+ "type": "string"
1344
+ },
1345
+ {
1346
+ "value": "small",
1347
+ "type": "string"
1348
+ }
1349
+ ],
1350
+ "optional": false,
1351
+ "required": false,
1352
+ "getter": false,
1353
+ "setter": false
1354
+ },
1355
+ {
1356
+ "name": "type",
1357
+ "type": "\"active\" | \"error\" | \"neutral\" | \"success\" | \"warning\"",
1358
+ "complexType": {
1359
+ "original": "Chip.Type",
1360
+ "resolved": "\"active\" | \"error\" | \"neutral\" | \"success\" | \"warning\"",
1361
+ "references": {
1362
+ "Chip": {
1363
+ "location": "import",
1364
+ "path": "../../api/ds.types.js",
1365
+ "id": "src/api/ds.types.d.ts::Chip",
1366
+ "referenceLocation": "Chip"
1367
+ }
1368
+ }
1369
+ },
1370
+ "mutable": true,
1371
+ "attr": "type",
1372
+ "reflectToAttr": true,
1373
+ "docs": "Semantic variant of the chip.\nInvalid values are normalized to `active` at runtime.",
1374
+ "docsTags": [
1375
+ {
1376
+ "name": "default",
1377
+ "text": "'active'"
1378
+ }
1379
+ ],
1380
+ "default": "'active'",
1381
+ "values": [
1382
+ {
1383
+ "value": "active",
1384
+ "type": "string"
1385
+ },
1386
+ {
1387
+ "value": "error",
1388
+ "type": "string"
1389
+ },
1390
+ {
1391
+ "value": "neutral",
1392
+ "type": "string"
1393
+ },
1394
+ {
1395
+ "value": "success",
1396
+ "type": "string"
1397
+ },
1398
+ {
1399
+ "value": "warning",
1400
+ "type": "string"
1401
+ }
1402
+ ],
1403
+ "optional": false,
1404
+ "required": false,
1405
+ "getter": false,
1406
+ "setter": false
1407
+ }
1408
+ ],
1409
+ "methods": [],
1410
+ "events": [],
1411
+ "listeners": [],
1412
+ "styles": [],
1413
+ "slots": [
1414
+ {
1415
+ "name": "after-text",
1416
+ "docs": "Optional slot for content to be placed after the text content. Common use case is an icon.\n\nSlotted `lmvz-icon`s are controlled by the chip's internal sizing."
1417
+ },
1418
+ {
1419
+ "name": "before-text",
1420
+ "docs": "Optional slot for content to be placed before the text content. Common use case is an icon."
1421
+ },
1422
+ {
1423
+ "name": "default",
1424
+ "docs": "Arbitrary inline content used as the chip label. Icons passed here may not be aligned or spaced with the text content properly."
1425
+ }
1426
+ ],
1427
+ "parts": [],
1428
+ "states": [],
1429
+ "dependents": [],
1430
+ "dependencies": [],
1431
+ "dependencyGraph": {}
1432
+ },
1433
+ {
1434
+ "filePath": "src/components/lmvz-datepicker/lmvz-datepicker.tsx",
1435
+ "encapsulation": "shadow",
1436
+ "tag": "lmvz-datepicker",
1437
+ "readme": "# lmvz-datepicker\n\n`lmvz-datepicker` composes an `lmvz-input` text field with a decorative calendar icon and an `lmvz-popover` calendar panel into a single, form-associated date-picker control.\n\n## Breaking Change: Event Payload Migration\n\n**If you are upgrading from an earlier version, your integration code must change.**\n\nThe `lmvzChange` event payload changed from `Temporal.PlainDate` to a plain `IsoDateString` (`YYYY-MM-DD`):\n\n| Before | After |\n|--------|-------|\n| `event.detail.value` is a `Temporal.PlainDate` object | `event.detail.value` is a string like `\"2024-06-15\"` |\n| Consumers called `.toString()` or used Temporal APIs on the payload | Consumers now read `event.detail.value` directly as a plain string |\n| Angular: the value accessor invoked `.value.toString()` on the temporal object | Angular: the value accessor reads the string directly (no extraction needed) |\n\nIf your code uses `.value.toString()` or calls Temporal methods on the payload, update it to treat `value` as a plain ISO date string instead. The `temporal-polyfill` used internally is bundled into the component's build output — consumers do not need to import or provide it.\n\n## Form Association\n\nThe component is form-associated (`formAssociated: true`, `ElementInternals`). It participates in native `<form>` submission under the `name` attribute (submitted value is an `IsoDateString`), honors `required`/`min`/`max` constraints via `ElementInternals.setValidity` (`valueMissing`, `badInput`, `rangeUnderflow`/`rangeOverflow`), and supports `formResetCallback`/`formStateRestoreCallback` for form reset and browser autofill/bfcache restoration. \n\nUse `checkValidity()` and `reportValidity()` to validate or show validation UI (the component delegates `ElementInternals` validation to these methods explicitly — native form submission does not call them automatically). The composed text field's visual error state and `aria-invalid` are intentionally not shown until a real validation attempt occurs (via `checkValidity()`, `reportValidity()`, or a failed form submit), even though `ElementInternals.setValidity` itself is always kept accurate from the current value — the field can be internally invalid before it is visually flagged, by design.\n\n## Localization\n\nThe popover's accessible dialog label and the default fallback validation message are localized per the `locale` prop for de/en/fr/it, with regional variant fallback (e.g., `de-AT` falls back to `de`).\n\n## Accessibility Note\n\nThe composed `lmvz-input` text field correctly exposes and toggles `aria-expanded`, `aria-haspopup`, and `aria-controls` as the calendar opens and closes, ensuring assistive technology receives proper combobox-pattern semantics.\n",
1438
+ "docs": "`lmvz-datepicker` composes an `lmvz-input` text field with a decorative calendar icon and an `lmvz-popover` calendar panel into a single, form-associated date-picker control.",
1439
+ "docsTags": [
1440
+ {
1441
+ "name": "part",
1442
+ "text": "panel - The outer container panel of the datepicker"
1443
+ },
1444
+ {
1445
+ "name": "part",
1446
+ "text": "header - The header row containing navigation buttons and month/year label"
1447
+ },
1448
+ {
1449
+ "name": "part",
1450
+ "text": "nav-prev - The previous-month navigation button"
1451
+ },
1452
+ {
1453
+ "name": "part",
1454
+ "text": "nav-next - The next-month navigation button"
1455
+ },
1456
+ {
1457
+ "name": "part",
1458
+ "text": "month-label - The month and year label in the header"
1459
+ },
1460
+ {
1461
+ "name": "part",
1462
+ "text": "weekday-row - The row of weekday column headers"
1463
+ },
1464
+ {
1465
+ "name": "part",
1466
+ "text": "weekday - An individual weekday column header cell"
1467
+ },
1468
+ {
1469
+ "name": "part",
1470
+ "text": "grid - The calendar day grid"
1471
+ },
1472
+ {
1473
+ "name": "part",
1474
+ "text": "week-row - A week row within the calendar grid"
1475
+ },
1476
+ {
1477
+ "name": "part",
1478
+ "text": "day - A day cell within the calendar grid"
1479
+ },
1480
+ {
1481
+ "name": "part",
1482
+ "text": "day--today - A day cell representing today"
1483
+ },
1484
+ {
1485
+ "name": "part",
1486
+ "text": "day--selected - The currently selected day cell"
1487
+ },
1488
+ {
1489
+ "name": "part",
1490
+ "text": "day--out-of-month - A day cell that belongs to an adjacent month"
1491
+ },
1492
+ {
1493
+ "name": "part",
1494
+ "text": "day--disabled - A day cell that is disabled (out of min/max bounds)"
1495
+ }
1496
+ ],
1497
+ "usage": {},
1498
+ "props": [
1499
+ {
1500
+ "name": "disabled",
1501
+ "type": "boolean",
1502
+ "complexType": {
1503
+ "original": "boolean",
1504
+ "resolved": "boolean",
1505
+ "references": {}
1506
+ },
1507
+ "mutable": false,
1508
+ "attr": "disabled",
1509
+ "reflectToAttr": true,
1510
+ "docs": "Whether the entire datepicker (input + panel) is disabled.",
1511
+ "docsTags": [
1512
+ {
1513
+ "name": "default",
1514
+ "text": "false"
1515
+ }
1516
+ ],
1517
+ "default": "false",
1518
+ "values": [
1519
+ {
1520
+ "type": "boolean"
1521
+ }
1522
+ ],
1523
+ "optional": false,
1524
+ "required": false,
1525
+ "getter": false,
1526
+ "setter": false
1527
+ },
1528
+ {
1529
+ "name": "displayFormat",
1530
+ "type": "string | undefined",
1531
+ "complexType": {
1532
+ "original": "Datepicker.DisplayFormat",
1533
+ "resolved": "string | undefined",
1534
+ "references": {
1535
+ "Datepicker": {
1536
+ "location": "import",
1537
+ "path": "../../api",
1538
+ "id": "src/api/index.d.ts::Datepicker",
1539
+ "referenceLocation": "Datepicker"
1540
+ }
1541
+ }
1542
+ },
1543
+ "mutable": false,
1544
+ "attr": "display-format",
1545
+ "reflectToAttr": false,
1546
+ "docs": "Custom display-format pattern for the text field, using the tokens `yyyy`, `MM`, `dd`\n(e.g. `'dd.MM.yyyy'`). Defaults to a pattern derived from `locale`.",
1547
+ "docsTags": [],
1548
+ "values": [
1549
+ {
1550
+ "type": "string"
1551
+ },
1552
+ {
1553
+ "type": "undefined"
1554
+ }
1555
+ ],
1556
+ "optional": true,
1557
+ "required": false,
1558
+ "getter": false,
1559
+ "setter": false
1560
+ },
1561
+ {
1562
+ "name": "errorMessage",
1563
+ "type": "string | undefined",
1564
+ "complexType": {
1565
+ "original": "string",
1566
+ "resolved": "string | undefined",
1567
+ "references": {}
1568
+ },
1569
+ "mutable": false,
1570
+ "attr": "error-message",
1571
+ "reflectToAttr": false,
1572
+ "docs": "Error message displayed below the text field when the value is invalid.",
1573
+ "docsTags": [],
1574
+ "values": [
1575
+ {
1576
+ "type": "string"
1577
+ },
1578
+ {
1579
+ "type": "undefined"
1580
+ }
1581
+ ],
1582
+ "optional": true,
1583
+ "required": false,
1584
+ "getter": false,
1585
+ "setter": false
1586
+ },
1587
+ {
1588
+ "name": "firstDayOfWeek",
1589
+ "type": "0 | 1",
1590
+ "complexType": {
1591
+ "original": "0 | 1",
1592
+ "resolved": "0 | 1",
1593
+ "references": {}
1594
+ },
1595
+ "mutable": false,
1596
+ "attr": "first-day-of-week",
1597
+ "reflectToAttr": false,
1598
+ "docs": "First day of the week: `0` = Sunday, `1` = Monday.\nMonday-first is hardcoded for v1; this prop is reserved for future runtime support.",
1599
+ "docsTags": [
1600
+ {
1601
+ "name": "default",
1602
+ "text": "1"
1603
+ }
1604
+ ],
1605
+ "default": "1",
1606
+ "values": [
1607
+ {
1608
+ "value": "0",
1609
+ "type": "number"
1610
+ },
1611
+ {
1612
+ "value": "1",
1613
+ "type": "number"
1614
+ }
1615
+ ],
1616
+ "optional": false,
1617
+ "required": false,
1618
+ "getter": false,
1619
+ "setter": false
1620
+ },
1621
+ {
1622
+ "name": "helperText",
1623
+ "type": "string | undefined",
1624
+ "complexType": {
1625
+ "original": "string",
1626
+ "resolved": "string | undefined",
1627
+ "references": {}
1628
+ },
1629
+ "mutable": false,
1630
+ "attr": "helper-text",
1631
+ "reflectToAttr": false,
1632
+ "docs": "Helper text displayed below the text field.",
1633
+ "docsTags": [],
1634
+ "values": [
1635
+ {
1636
+ "type": "string"
1637
+ },
1638
+ {
1639
+ "type": "undefined"
1640
+ }
1641
+ ],
1642
+ "optional": true,
1643
+ "required": false,
1644
+ "getter": false,
1645
+ "setter": false
1646
+ },
1647
+ {
1648
+ "name": "label",
1649
+ "type": "string | undefined",
1650
+ "complexType": {
1651
+ "original": "string",
1652
+ "resolved": "string | undefined",
1653
+ "references": {}
1654
+ },
1655
+ "mutable": false,
1656
+ "attr": "label",
1657
+ "reflectToAttr": false,
1658
+ "docs": "Label for the composed text field.",
1659
+ "docsTags": [],
1660
+ "values": [
1661
+ {
1662
+ "type": "string"
1663
+ },
1664
+ {
1665
+ "type": "undefined"
1666
+ }
1667
+ ],
1668
+ "optional": true,
1669
+ "required": false,
1670
+ "getter": false,
1671
+ "setter": false
1672
+ },
1673
+ {
1674
+ "name": "locale",
1675
+ "type": "string",
1676
+ "complexType": {
1677
+ "original": "string",
1678
+ "resolved": "string",
1679
+ "references": {}
1680
+ },
1681
+ "mutable": false,
1682
+ "attr": "locale",
1683
+ "reflectToAttr": false,
1684
+ "docs": "BCP 47 locale tag used for weekday/month names, ARIA labels, and the default display format.",
1685
+ "docsTags": [
1686
+ {
1687
+ "name": "default",
1688
+ "text": "'de-CH'"
1689
+ }
1690
+ ],
1691
+ "default": "'de-CH'",
1692
+ "values": [
1693
+ {
1694
+ "type": "string"
1695
+ }
1696
+ ],
1697
+ "optional": false,
1698
+ "required": false,
1699
+ "getter": false,
1700
+ "setter": false
1701
+ },
1702
+ {
1703
+ "name": "max",
1704
+ "type": "`${number}-${number}-${number}` | undefined",
1705
+ "complexType": {
1706
+ "original": "IsoDateString | undefined",
1707
+ "resolved": "`${number}-${number}-${number}` | undefined",
1708
+ "references": {
1709
+ "IsoDateString": {
1710
+ "location": "import",
1711
+ "path": "@lmvz-ds/lib-ts/date/IsoDateString.js",
1712
+ "id": "../../lib/ts/src/date/IsoDateString.d.ts::IsoDateString",
1713
+ "referenceLocation": "IsoDateString"
1714
+ }
1715
+ }
1716
+ },
1717
+ "mutable": false,
1718
+ "attr": "max",
1719
+ "reflectToAttr": false,
1720
+ "docs": "Maximum selectable date in ISO `YYYY-MM-DD` format.\nDays after this date are disabled.",
1721
+ "docsTags": [],
1722
+ "values": [
1723
+ {
1724
+ "type": "`${number}-${number}-${number}`"
1725
+ },
1726
+ {
1727
+ "type": "undefined"
1728
+ }
1729
+ ],
1730
+ "optional": false,
1731
+ "required": false,
1732
+ "getter": false,
1733
+ "setter": false
1734
+ },
1735
+ {
1736
+ "name": "min",
1737
+ "type": "`${number}-${number}-${number}` | undefined",
1738
+ "complexType": {
1739
+ "original": "IsoDateString | undefined",
1740
+ "resolved": "`${number}-${number}-${number}` | undefined",
1741
+ "references": {
1742
+ "IsoDateString": {
1743
+ "location": "import",
1744
+ "path": "@lmvz-ds/lib-ts/date/IsoDateString.js",
1745
+ "id": "../../lib/ts/src/date/IsoDateString.d.ts::IsoDateString",
1746
+ "referenceLocation": "IsoDateString"
1747
+ }
1748
+ }
1749
+ },
1750
+ "mutable": false,
1751
+ "attr": "min",
1752
+ "reflectToAttr": false,
1753
+ "docs": "Minimum selectable date in ISO `YYYY-MM-DD` format.\nDays before this date are disabled.",
1754
+ "docsTags": [],
1755
+ "values": [
1756
+ {
1757
+ "type": "`${number}-${number}-${number}`"
1758
+ },
1759
+ {
1760
+ "type": "undefined"
1761
+ }
1762
+ ],
1763
+ "optional": false,
1764
+ "required": false,
1765
+ "getter": false,
1766
+ "setter": false
1767
+ },
1768
+ {
1769
+ "name": "name",
1770
+ "type": "string | undefined",
1771
+ "complexType": {
1772
+ "original": "string",
1773
+ "resolved": "string | undefined",
1774
+ "references": {}
1775
+ },
1776
+ "mutable": false,
1777
+ "attr": "name",
1778
+ "reflectToAttr": true,
1779
+ "docs": "Name submitted with the form.",
1780
+ "docsTags": [],
1781
+ "values": [
1782
+ {
1783
+ "type": "string"
1784
+ },
1785
+ {
1786
+ "type": "undefined"
1787
+ }
1788
+ ],
1789
+ "optional": true,
1790
+ "required": false,
1791
+ "getter": false,
1792
+ "setter": false
1793
+ },
1794
+ {
1795
+ "name": "open",
1796
+ "type": "boolean",
1797
+ "complexType": {
1798
+ "original": "boolean",
1799
+ "resolved": "boolean",
1800
+ "references": {}
1801
+ },
1802
+ "mutable": true,
1803
+ "attr": "open",
1804
+ "reflectToAttr": true,
1805
+ "docs": "Whether the calendar popover is open. Reflects the actual open state — it is kept\nin sync with focus/keyboard interactions and with light-dismiss/Escape closing.",
1806
+ "docsTags": [
1807
+ {
1808
+ "name": "default",
1809
+ "text": "false"
1810
+ }
1811
+ ],
1812
+ "default": "false",
1813
+ "values": [
1814
+ {
1815
+ "type": "boolean"
1816
+ }
1817
+ ],
1818
+ "optional": false,
1819
+ "required": false,
1820
+ "getter": false,
1821
+ "setter": false
1822
+ },
1823
+ {
1824
+ "name": "placeholder",
1825
+ "type": "string | undefined",
1826
+ "complexType": {
1827
+ "original": "string",
1828
+ "resolved": "string | undefined",
1829
+ "references": {}
1830
+ },
1831
+ "mutable": false,
1832
+ "attr": "placeholder",
1833
+ "reflectToAttr": false,
1834
+ "docs": "Placeholder for the composed text field. Defaults to the locale-derived display pattern (e.g. `dd.MM.yyyy`).",
1835
+ "docsTags": [],
1836
+ "values": [
1837
+ {
1838
+ "type": "string"
1839
+ },
1840
+ {
1841
+ "type": "undefined"
1842
+ }
1843
+ ],
1844
+ "optional": true,
1845
+ "required": false,
1846
+ "getter": false,
1847
+ "setter": false
1848
+ },
1849
+ {
1850
+ "name": "readonly",
1851
+ "type": "boolean",
1852
+ "complexType": {
1853
+ "original": "boolean",
1854
+ "resolved": "boolean",
1855
+ "references": {}
1856
+ },
1857
+ "mutable": false,
1858
+ "attr": "readonly",
1859
+ "reflectToAttr": true,
1860
+ "docs": "Whether the datepicker is readonly. The text field cannot be typed into and the calendar cannot change the value,\nbut the value is still submitted with the form.",
1861
+ "docsTags": [
1862
+ {
1863
+ "name": "default",
1864
+ "text": "false"
1865
+ }
1866
+ ],
1867
+ "default": "false",
1868
+ "values": [
1869
+ {
1870
+ "type": "boolean"
1871
+ }
1872
+ ],
1873
+ "optional": false,
1874
+ "required": false,
1875
+ "getter": false,
1876
+ "setter": false
1877
+ },
1878
+ {
1879
+ "name": "required",
1880
+ "type": "boolean",
1881
+ "complexType": {
1882
+ "original": "boolean",
1883
+ "resolved": "boolean",
1884
+ "references": {}
1885
+ },
1886
+ "mutable": false,
1887
+ "attr": "required",
1888
+ "reflectToAttr": true,
1889
+ "docs": "Whether a value is required for the form to be valid.",
1890
+ "docsTags": [
1891
+ {
1892
+ "name": "default",
1893
+ "text": "false"
1894
+ }
1895
+ ],
1896
+ "default": "false",
1897
+ "values": [
1898
+ {
1899
+ "type": "boolean"
1900
+ }
1901
+ ],
1902
+ "optional": false,
1903
+ "required": false,
1904
+ "getter": false,
1905
+ "setter": false
1906
+ },
1907
+ {
1908
+ "name": "value",
1909
+ "type": "`${number}-${number}-${number}` | undefined",
1910
+ "complexType": {
1911
+ "original": "`${number}-${number}-${number}` | undefined",
1912
+ "resolved": "`${number}-${number}-${number}` | undefined",
1913
+ "references": {}
1914
+ },
1915
+ "mutable": false,
1916
+ "attr": "value",
1917
+ "reflectToAttr": false,
1918
+ "docs": "The selected date in ISO `YYYY-MM-DD` format.",
1919
+ "docsTags": [],
1920
+ "values": [
1921
+ {
1922
+ "type": "`${number}-${number}-${number}`"
1923
+ },
1924
+ {
1925
+ "type": "undefined"
1926
+ }
1927
+ ],
1928
+ "optional": false,
1929
+ "required": false,
1930
+ "getter": true,
1931
+ "setter": true
1932
+ },
1933
+ {
1934
+ "name": "visibleMonth",
1935
+ "type": "`${number}-${number}` | undefined",
1936
+ "complexType": {
1937
+ "original": "IsoYearMonthString | undefined",
1938
+ "resolved": "`${number}-${number}` | undefined",
1939
+ "references": {
1940
+ "IsoYearMonthString": {
1941
+ "location": "import",
1942
+ "path": "@lmvz-ds/lib-ts/date/IsoDateString.js",
1943
+ "id": "../../lib/ts/src/date/IsoDateString.d.ts::IsoYearMonthString",
1944
+ "referenceLocation": "IsoYearMonthString"
1945
+ }
1946
+ }
1947
+ },
1948
+ "mutable": false,
1949
+ "attr": "visible-month",
1950
+ "reflectToAttr": false,
1951
+ "docs": "ISO year-month string (`YYYY-MM`) whose month is currently displayed.\nDefaults to the current month when unset.",
1952
+ "docsTags": [],
1953
+ "values": [
1954
+ {
1955
+ "type": "`${number}-${number}`"
1956
+ },
1957
+ {
1958
+ "type": "undefined"
1959
+ }
1960
+ ],
1961
+ "optional": false,
1962
+ "required": false,
1963
+ "getter": true,
1964
+ "setter": true
1965
+ }
1966
+ ],
1967
+ "methods": [
1968
+ {
1969
+ "name": "checkValidity",
1970
+ "returns": {
1971
+ "type": "Promise<boolean>",
1972
+ "docs": ""
1973
+ },
1974
+ "complexType": {
1975
+ "signature": "() => Promise<boolean>",
1976
+ "parameters": [],
1977
+ "references": {
1978
+ "Promise": {
1979
+ "location": "global",
1980
+ "id": "global::Promise"
1981
+ }
1982
+ },
1983
+ "return": "Promise<boolean>"
1984
+ },
1985
+ "signature": "checkValidity() => Promise<boolean>",
1986
+ "parameters": [],
1987
+ "docs": "Returns whether the current value satisfies `required`/`min`/`max` and is a parseable date.\nUnlike a native `<input>`, form-associated custom elements do not forward `ElementInternals`'\nconstraint-validation API to the element automatically — this delegates to it explicitly.",
1988
+ "docsTags": []
1989
+ },
1990
+ {
1991
+ "name": "reportValidity",
1992
+ "returns": {
1993
+ "type": "Promise<boolean>",
1994
+ "docs": ""
1995
+ },
1996
+ "complexType": {
1997
+ "signature": "() => Promise<boolean>",
1998
+ "parameters": [],
1999
+ "references": {
2000
+ "Promise": {
2001
+ "location": "global",
2002
+ "id": "global::Promise"
2003
+ }
2004
+ },
2005
+ "return": "Promise<boolean>"
2006
+ },
2007
+ "signature": "reportValidity() => Promise<boolean>",
2008
+ "parameters": [],
2009
+ "docs": "Reports validation errors to the user (e.g. shows the browser's native validation bubble)\nand returns whether the current value is valid.",
2010
+ "docsTags": []
2011
+ }
2012
+ ],
2013
+ "events": [
2014
+ {
2015
+ "event": "lmvzChange",
2016
+ "detail": "{ value: `${number}-${number}-${number}` | undefined; }",
2017
+ "bubbles": true,
2018
+ "complexType": {
2019
+ "original": "{ value: IsoDateString | undefined }",
2020
+ "resolved": "{ value: `${number}-${number}-${number}` | undefined; }",
2021
+ "references": {
2022
+ "IsoDateString": {
2023
+ "location": "import",
2024
+ "path": "@lmvz-ds/lib-ts/date/IsoDateString.js",
2025
+ "id": "../../lib/ts/src/date/IsoDateString.d.ts::IsoDateString",
2026
+ "referenceLocation": "IsoDateString"
2027
+ }
2028
+ }
2029
+ },
2030
+ "cancelable": true,
2031
+ "composed": true,
2032
+ "docs": "Emitted when the user selects a date (via the calendar grid or by typing a complete valid date).\nThe `value` field carries an IsoDateString representing the selected date.",
2033
+ "docsTags": []
2034
+ },
2035
+ {
2036
+ "event": "lmvzClose",
2037
+ "detail": "void",
2038
+ "bubbles": true,
2039
+ "complexType": {
2040
+ "original": "void",
2041
+ "resolved": "void",
2042
+ "references": {}
2043
+ },
2044
+ "cancelable": true,
2045
+ "composed": true,
2046
+ "docs": "Forwarded from the internal popover: fired after the calendar panel closes.",
2047
+ "docsTags": []
2048
+ },
2049
+ {
2050
+ "event": "lmvzMonthChange",
2051
+ "detail": "{ visibleMonth: `${number}-${number}`; }",
2052
+ "bubbles": true,
1219
2053
  "complexType": {
1220
- "signature": "() => Promise<boolean>",
1221
- "parameters": [],
2054
+ "original": "{ visibleMonth: IsoYearMonthString }",
2055
+ "resolved": "{ visibleMonth: `${number}-${number}`; }",
1222
2056
  "references": {
1223
- "Promise": {
1224
- "location": "global",
1225
- "id": "global::Promise"
2057
+ "IsoYearMonthString": {
2058
+ "location": "import",
2059
+ "path": "@lmvz-ds/lib-ts/date/IsoDateString.js",
2060
+ "id": "../../lib/ts/src/date/IsoDateString.d.ts::IsoYearMonthString",
2061
+ "referenceLocation": "IsoYearMonthString"
1226
2062
  }
1227
- },
1228
- "return": "Promise<boolean>"
2063
+ }
1229
2064
  },
1230
- "signature": "reportValidity() => Promise<boolean>",
1231
- "parameters": [],
1232
- "docs": "Reports validation errors to the user.",
2065
+ "cancelable": true,
2066
+ "composed": true,
2067
+ "docs": "Emitted when the displayed month changes via prev/next navigation.\nThe `visibleMonth` field carries an IsoYearMonthString representing the new month.",
1233
2068
  "docsTags": []
1234
- }
1235
- ],
1236
- "events": [
2069
+ },
1237
2070
  {
1238
- "event": "lmvzChange",
1239
- "detail": "boolean",
2071
+ "event": "lmvzOpen",
2072
+ "detail": "void",
1240
2073
  "bubbles": true,
1241
2074
  "complexType": {
1242
- "original": "boolean",
1243
- "resolved": "boolean",
2075
+ "original": "void",
2076
+ "resolved": "void",
1244
2077
  "references": {}
1245
2078
  },
1246
2079
  "cancelable": true,
1247
2080
  "composed": true,
1248
- "docs": "Emitted whenever the checkbox checked state changes.\nEvent detail contains the new checked boolean value.",
2081
+ "docs": "Forwarded from the internal popover: fired after the calendar panel opens.",
1249
2082
  "docsTags": []
1250
2083
  }
1251
2084
  ],
1252
- "listeners": [],
1253
- "styles": [],
1254
- "slots": [],
1255
- "parts": [],
1256
- "states": [],
1257
- "dependents": [],
1258
- "dependencies": [],
1259
- "dependencyGraph": {}
1260
- },
1261
- {
1262
- "filePath": "src/components/lmvz-chip/lmvz-chip.tsx",
1263
- "encapsulation": "shadow",
1264
- "tag": "lmvz-chip",
1265
- "readme": "# lmvz-chip\n\n\n",
1266
- "docs": "The chip displays a compact semantic status as a non-interactive UI element.",
1267
- "docsTags": [
2085
+ "listeners": [
1268
2086
  {
1269
- "name": "slot",
1270
- "text": "default - Arbitrary inline content used as the chip label. Icons passed here may not be aligned or spaced with the text content properly."
2087
+ "event": "keydown",
2088
+ "capture": false,
2089
+ "passive": false
1271
2090
  },
1272
2091
  {
1273
- "name": "slot",
1274
- "text": "before-text - Optional slot for content to be placed before the text content. Common use case is an icon."
2092
+ "event": "focusin",
2093
+ "capture": false,
2094
+ "passive": false
1275
2095
  },
1276
2096
  {
1277
- "name": "slot",
1278
- "text": "after-text - Optional slot for content to be placed after the text content. Common use case is an icon.\n\nSlotted `lmvz-icon`s are controlled by the chip's internal sizing."
1279
- }
1280
- ],
1281
- "usage": {},
1282
- "props": [
1283
- {
1284
- "name": "size",
1285
- "type": "\"default\" | \"small\"",
1286
- "complexType": {
1287
- "original": "Chip.Size",
1288
- "resolved": "\"default\" | \"small\"",
1289
- "references": {
1290
- "Chip": {
1291
- "location": "import",
1292
- "path": "../../api/ds.types.js",
1293
- "id": "src/api/ds.types.d.ts::Chip",
1294
- "referenceLocation": "Chip"
1295
- }
1296
- }
1297
- },
1298
- "mutable": true,
1299
- "attr": "size",
1300
- "reflectToAttr": true,
1301
- "docs": "Size variant of the chip.\nInvalid values are normalized to `default` at runtime.",
1302
- "docsTags": [
1303
- {
1304
- "name": "default",
1305
- "text": "'default'"
1306
- }
1307
- ],
1308
- "default": "'default'",
1309
- "values": [
1310
- {
1311
- "value": "default",
1312
- "type": "string"
1313
- },
1314
- {
1315
- "value": "small",
1316
- "type": "string"
1317
- }
1318
- ],
1319
- "optional": false,
1320
- "required": false,
1321
- "getter": false,
1322
- "setter": false
2097
+ "event": "click",
2098
+ "capture": false,
2099
+ "passive": false
1323
2100
  },
1324
2101
  {
1325
- "name": "type",
1326
- "type": "\"active\" | \"error\" | \"neutral\" | \"success\" | \"warning\"",
1327
- "complexType": {
1328
- "original": "Chip.Type",
1329
- "resolved": "\"active\" | \"error\" | \"neutral\" | \"success\" | \"warning\"",
1330
- "references": {
1331
- "Chip": {
1332
- "location": "import",
1333
- "path": "../../api/ds.types.js",
1334
- "id": "src/api/ds.types.d.ts::Chip",
1335
- "referenceLocation": "Chip"
1336
- }
1337
- }
1338
- },
1339
- "mutable": true,
1340
- "attr": "type",
1341
- "reflectToAttr": true,
1342
- "docs": "Semantic variant of the chip.\nInvalid values are normalized to `active` at runtime.",
1343
- "docsTags": [
1344
- {
1345
- "name": "default",
1346
- "text": "'active'"
1347
- }
1348
- ],
1349
- "default": "'active'",
1350
- "values": [
1351
- {
1352
- "value": "active",
1353
- "type": "string"
1354
- },
1355
- {
1356
- "value": "error",
1357
- "type": "string"
1358
- },
1359
- {
1360
- "value": "neutral",
1361
- "type": "string"
1362
- },
1363
- {
1364
- "value": "success",
1365
- "type": "string"
1366
- },
1367
- {
1368
- "value": "warning",
1369
- "type": "string"
1370
- }
1371
- ],
1372
- "optional": false,
1373
- "required": false,
1374
- "getter": false,
1375
- "setter": false
2102
+ "event": "invalid",
2103
+ "capture": false,
2104
+ "passive": false
1376
2105
  }
1377
2106
  ],
1378
- "methods": [],
1379
- "events": [],
1380
- "listeners": [],
1381
2107
  "styles": [],
1382
- "slots": [
2108
+ "slots": [],
2109
+ "parts": [
1383
2110
  {
1384
- "name": "after-text",
1385
- "docs": "Optional slot for content to be placed after the text content. Common use case is an icon.\n\nSlotted `lmvz-icon`s are controlled by the chip's internal sizing."
2111
+ "name": "day",
2112
+ "docs": "A day cell within the calendar grid"
1386
2113
  },
1387
2114
  {
1388
- "name": "before-text",
1389
- "docs": "Optional slot for content to be placed before the text content. Common use case is an icon."
2115
+ "name": "day--disabled",
2116
+ "docs": "A day cell that is disabled (out of min/max bounds)"
1390
2117
  },
1391
2118
  {
1392
- "name": "default",
1393
- "docs": "Arbitrary inline content used as the chip label. Icons passed here may not be aligned or spaced with the text content properly."
2119
+ "name": "day--out-of-month",
2120
+ "docs": "A day cell that belongs to an adjacent month"
2121
+ },
2122
+ {
2123
+ "name": "day--selected",
2124
+ "docs": "The currently selected day cell"
2125
+ },
2126
+ {
2127
+ "name": "day--today",
2128
+ "docs": "A day cell representing today"
2129
+ },
2130
+ {
2131
+ "name": "grid",
2132
+ "docs": "The calendar day grid"
2133
+ },
2134
+ {
2135
+ "name": "header",
2136
+ "docs": "The header row containing navigation buttons and month/year label"
2137
+ },
2138
+ {
2139
+ "name": "month-label",
2140
+ "docs": "The month and year label in the header"
2141
+ },
2142
+ {
2143
+ "name": "nav-next",
2144
+ "docs": "The next-month navigation button"
2145
+ },
2146
+ {
2147
+ "name": "nav-prev",
2148
+ "docs": "The previous-month navigation button"
2149
+ },
2150
+ {
2151
+ "name": "panel",
2152
+ "docs": "The outer container panel of the datepicker"
2153
+ },
2154
+ {
2155
+ "name": "week-row",
2156
+ "docs": "A week row within the calendar grid"
2157
+ },
2158
+ {
2159
+ "name": "weekday",
2160
+ "docs": "An individual weekday column header cell"
2161
+ },
2162
+ {
2163
+ "name": "weekday-row",
2164
+ "docs": "The row of weekday column headers"
1394
2165
  }
1395
2166
  ],
1396
- "parts": [],
1397
2167
  "states": [],
1398
2168
  "dependents": [],
1399
- "dependencies": [],
1400
- "dependencyGraph": {}
2169
+ "dependencies": [
2170
+ "lmvz-button",
2171
+ "lmvz-icon",
2172
+ "lmvz-input",
2173
+ "lmvz-popover"
2174
+ ],
2175
+ "dependencyGraph": {
2176
+ "lmvz-datepicker": [
2177
+ "lmvz-button",
2178
+ "lmvz-icon",
2179
+ "lmvz-input",
2180
+ "lmvz-popover"
2181
+ ]
2182
+ }
1401
2183
  },
1402
2184
  {
1403
2185
  "filePath": "src/components/lmvz-header/lmvz-header.tsx",
@@ -1754,6 +2536,7 @@
1754
2536
  "parts": [],
1755
2537
  "states": [],
1756
2538
  "dependents": [
2539
+ "lmvz-datepicker",
1757
2540
  "lmvz-link",
1758
2541
  "lmvz-message",
1759
2542
  "lmvz-modal",
@@ -1761,6 +2544,9 @@
1761
2544
  ],
1762
2545
  "dependencies": [],
1763
2546
  "dependencyGraph": {
2547
+ "lmvz-datepicker": [
2548
+ "lmvz-icon"
2549
+ ],
1764
2550
  "lmvz-link": [
1765
2551
  "lmvz-icon"
1766
2552
  ],
@@ -1779,7 +2565,7 @@
1779
2565
  "filePath": "src/components/lmvz-input/lmvz-input.tsx",
1780
2566
  "encapsulation": "scoped",
1781
2567
  "tag": "lmvz-input",
1782
- "readme": "# lmvz-input\n\n## Size Variants\n\nThe `size` prop controls the input's height, padding, and associated typography. Set `size` to one of `'sm'`, `'md'`, or `'lg'`. The default is `'md'`.\n\n| Size | Height | Notes |\n|------|--------|-------|\n| `sm` | ~36px | Compact variant with reduced padding |\n| `md` | ~44px | Default; balanced spacing and readability |\n| `lg` | ~48px | Expanded variant with generous padding |\n\nHeights are fluid and derive from design tokens; exact pixel values depend on user font size settings.\n",
2568
+ "readme": "# lmvz-input\n\n## Size Variants\n\nThe `size` prop controls the input's height, padding, and associated typography. Set `size` to one of `'sm'`, `'md'`, or `'lg'`. The default is `'md'`.\n\n| Size | Height | Notes |\n|------|--------|-------|\n| `sm` | ~36px | Compact variant with reduced padding |\n| `md` | ~44px | Default; balanced spacing and readability |\n| `lg` | ~48px | Expanded variant with generous padding |\n\nHeights are fluid and derive from design tokens; exact pixel values depend on user font size settings.\n\n## Error State and Validation\n\nThe `error` prop reflects native HTML5 validation state: set it manually to indicate an error, or let it automatically reflect the input's constraint validity following a validation attempt (e.g., after a blur with no prior keystroke, or after a failed `submit`, `checkValidity()`, or `reportValidity()` call). Correspondingly, `aria-invalid` is set to `true` when `error=true` or when the real constraint validity becomes invalid, and is cleared once resolved. Use `checkValidity()`, `reportValidity()`, and `getValidationMessage()` for programmatic validation.\n",
1783
2569
  "docs": "Input component with floating label, (form) validation, and slotted content support.",
1784
2570
  "docsTags": [
1785
2571
  {
@@ -5742,6 +6528,28 @@
5742
6528
  "docs": "Returns the native HTMLInputElement.\n\nPromise resolves when the element is ready and the input is available. If the input is not yet rendered, it waits for the component to be ready.",
5743
6529
  "docsTags": []
5744
6530
  },
6531
+ {
6532
+ "name": "getValidationMessage",
6533
+ "returns": {
6534
+ "type": "Promise<string>",
6535
+ "docs": ""
6536
+ },
6537
+ "complexType": {
6538
+ "signature": "() => Promise<string>",
6539
+ "parameters": [],
6540
+ "references": {
6541
+ "Promise": {
6542
+ "location": "global",
6543
+ "id": "global::Promise"
6544
+ }
6545
+ },
6546
+ "return": "Promise<string>"
6547
+ },
6548
+ "signature": "getValidationMessage() => Promise<string>",
6549
+ "parameters": [],
6550
+ "docs": "Returns the current validation message, if any.",
6551
+ "docsTags": []
6552
+ },
5745
6553
  {
5746
6554
  "name": "reportValidity",
5747
6555
  "returns": {
@@ -5851,9 +6659,15 @@
5851
6659
  ],
5852
6660
  "parts": [],
5853
6661
  "states": [],
5854
- "dependents": [],
6662
+ "dependents": [
6663
+ "lmvz-datepicker"
6664
+ ],
5855
6665
  "dependencies": [],
5856
- "dependencyGraph": {}
6666
+ "dependencyGraph": {
6667
+ "lmvz-datepicker": [
6668
+ "lmvz-input"
6669
+ ]
6670
+ }
5857
6671
  },
5858
6672
  {
5859
6673
  "filePath": "src/components/lmvz-link/lmvz-link.tsx",
@@ -6562,7 +7376,7 @@
6562
7376
  "filePath": "src/components/lmvz-popover/lmvz-popover.tsx",
6563
7377
  "encapsulation": "shadow",
6564
7378
  "tag": "lmvz-popover",
6565
- "readme": "# lmvz-popover\n\nA non-modal floating dialog anchored to a trigger element. Positions automatically via `@floating-ui/dom` with collision avoidance (flip and shift middleware). Content-agnostic: accepts any slotted elements.\n\n## Usage\n\nAnchor the popover to a trigger element by setting the `anchor` prop to the trigger's `id` or element reference.\n\nIf no `id` is set on the popover host, one is auto-assigned at load time.\n\n```html\n<button\n id=\"trigger\"\n onclick=\"document.getElementById('my-popover').toggle()\"\n>\n Open menu\n</button>\n<lmvz-popover id=\"my-popover\" anchor=\"trigger\" label=\"Menu options\">\n <p>Popover content goes here</p>\n</lmvz-popover>\n```\n\n## Props\n\n| Prop | Type | Default | Description |\n|---|---|---|---|\n| `open` | `boolean` | `false` | Opens or closes the popover. |\n| `anchor` | `string \\| HTMLElement` | – | Anchor element id or reference for positioning. |\n| `placement` | `'top' \\| 'bottom' \\| 'start' \\| 'end' \\| 'top-start' \\| 'top-end' \\| 'bottom-start' \\| 'bottom-end'` | `'bottom-start'` | Preferred placement relative to the anchor. |\n| `size` | `'sm' \\| 'md' \\| 'lg'` | `'sm'` | Size variant of the card surface. |\n| `autoFocus` | `boolean` | `true` | Moves focus to the first focusable element when opened. |\n| `label` | `string` | – | Accessible label for the popover container (reflected on dialog role). |\n\n## Slots\n\n| Slot | Description |\n|---|---|\n| `default` | Popover content. Any elements may be slotted. |\n\n## Events\n\n| Event | Cancelable | Description |\n|---|---|---|\n| `lmvzOpen` | No | Fired after the popover opens. |\n| `lmvzClose` | No | Fired after the popover closes. |\n| `lmvzCancel` | **Yes** | Fired before light-dismiss (click outside) or Escape close. Call `event.preventDefault()` to veto the close and keep the popover open. |\n\n## Methods\n\n| Method | Returns | Description |\n|---|---|---|\n| `show()` | `Promise<void>` | Opens the popover. |\n| `hide()` | `Promise<void>` | Closes the popover after firing `lmvzCancel`. If `lmvzCancel` is prevented, the popover remains open. |\n| `toggle()` | `Promise<void>` | Toggles the open state. |\n\n## CSS Customization\n\n### Shadow Parts\n\n| Part | Description |\n|---|---|\n| `container` | The popover's dialog container. Target to customize positioning, overflow, or appearance. |\n\n### Custom Properties\n\n| Property | Description | Default |\n|---|---|---|\n| `--lmvz-popover-max-width` | Maximum width of the popover surface. | `none` |\n| `--lmvz-popover-max-height` | Maximum height of the popover surface. | `none` |\n| `--lmvz-popover-z-index` | Z-index of the popover surface. | `1` |\n\n## Accessibility\n\n### Trigger Requirements\n\nWhen you set the `anchor` prop, the popover automatically writes three ARIA attributes to the resolved anchor element for screen reader and assistive technology support:\n\n- **`aria-haspopup=\"dialog\"`** — Announces that the trigger opens a dialog.\n- **`aria-expanded`** — Reflects the popover's open state (`\"true\"` when open, `\"false\"` when closed).\n- **`aria-controls`** — Points to the popover's `id` to establish the relationship between trigger and content.\n\nDo not set these attributes manually. Exception: if you pre-set `aria-haspopup` to a different value (e.g. `\"menu\"` for an action-list popover), the component preserves your value.\n\n### Content Semantics\n\nThe component renders a `role=\"dialog\"` container. Provide a `label` prop or set `aria-labelledby` on the host element to satisfy dialog labeling requirements.\n\n### AriaValidation\n\nWhen `@lmvz-ds/aria-validation` is enabled (development only), the component validates:\n\n- **Host element:** Must have an accessible label via the `label` prop or `aria-labelledby` attribute.\n- **Anchor element:** Must be interactive and focusable (e.g., `<button>`, `<a href>`, elements with `tabindex`, or elements with an interactive ARIA role). Non-interactive anchors produce a dev-time warning.\n\nValidation is disabled in production builds and test runtimes.\n\n## Notes\n\n- The popover is non-modal: focus is not trapped, and interaction outside does not require acknowledgment.\n- Positioning is automatic with collision avoidance. Use `placement` to express preference, but the component will flip or shift as needed to keep content visible.\n- Light-dismiss (clicking outside the popover or pressing Escape) fires `lmvzCancel` first, allowing consumers to intercept and prevent close (e.g., to warn unsaved changes).\n\n## Out of Scope\n\nIntegration with sibling components (e.g., action-list, select, date-picker) is intentionally not implemented in the popover itself. These components integrate via the trigger element and slot content, and remain the responsibility of the consuming application.\n",
7379
+ "readme": "# lmvz-popover\n\nA non-modal floating dialog anchored to a trigger element. Positions automatically via `@floating-ui/dom` with collision avoidance (flip and shift middleware). Content-agnostic: accepts any slotted elements.\n\n## Usage\n\nAnchor the popover to a trigger element by setting the `anchor` prop to the trigger's `id` or element reference.\n\nIf no `id` is set on the popover host, one is auto-assigned at load time.\n\n```html\n<button\n id=\"trigger\"\n onclick=\"document.getElementById('my-popover').toggle()\"\n>\n Open menu\n</button>\n<lmvz-popover id=\"my-popover\" anchor=\"trigger\" label=\"Menu options\">\n <p>Popover content goes here</p>\n</lmvz-popover>\n```\n\n## Props\n\n| Prop | Type | Default | Description |\n|---|---|---|---|\n| `open` | `boolean` | `false` | Opens or closes the popover. |\n| `anchor` | `string \\| HTMLElement` | – | Anchor element id or reference for positioning. |\n| `placement` | `'top' \\| 'bottom' \\| 'start' \\| 'end' \\| 'top-start' \\| 'top-end' \\| 'bottom-start' \\| 'bottom-end'` | `'bottom-start'` | Preferred placement relative to the anchor. |\n| `size` | `'sm' \\| 'md' \\| 'lg'` | `'sm'` | Size variant of the card surface. |\n| `autoFocus` | `boolean` | `true` | Moves focus to the first focusable element when opened. |\n| `label` | `string` | – | Accessible label for the popover container (reflected on dialog role). |\n\n## Slots\n\n| Slot | Description |\n|---|---|\n| `default` | Popover content. Any elements may be slotted. |\n\n## Events\n\n| Event | Cancelable | Description |\n|---|---|---|\n| `lmvzOpen` | No | Fired after the popover opens. |\n| `lmvzClose` | No | Fired after the popover closes. |\n| `lmvzCancel` | **Yes** | Fired before light-dismiss (click outside) or Escape close. Call `event.preventDefault()` to veto the close and keep the popover open. |\n\n## Methods\n\n| Method | Returns | Description |\n|---|---|---|\n| `show()` | `Promise<void>` | Opens the popover. |\n| `hide()` | `Promise<void>` | Closes the popover after firing `lmvzCancel`. If `lmvzCancel` is prevented, the popover remains open. |\n| `toggle()` | `Promise<void>` | Toggles the open state. |\n\n## CSS Customization\n\n### Shadow Parts\n\n| Part | Description |\n|---|---|\n| `container` | The popover's dialog container. Target to customize positioning, overflow, or appearance. |\n\n### Custom Properties\n\n| Property | Description | Default |\n|---|---|---|\n| `--lmvz-popover-max-width` | Maximum width of the popover surface. | `none` |\n| `--lmvz-popover-max-height` | Maximum height of the popover surface. | `none` |\n| `--lmvz-popover-z-index` | Z-index of the popover surface. | `1` |\n\n## Accessibility\n\n### Trigger Requirements\n\nWhen you set the `anchor` prop, the popover automatically writes three ARIA attributes to the resolved anchor element for screen reader and assistive technology support:\n\n- **`aria-haspopup=\"dialog\"`** — Announces that the trigger opens a dialog.\n- **`aria-expanded`** — Reflects the popover's open state (`\"true\"` when open, `\"false\"` when closed).\n- **`aria-controls`** — Points to the popover's `id` to establish the relationship between trigger and content.\n\nDo not set these attributes manually. Exception: if you pre-set `aria-haspopup` to a different value (e.g. `\"menu\"` for an action-list popover), the component preserves your value.\n\n### Content Semantics\n\nThe component renders a `role=\"dialog\"` container. Provide a `label` prop or set `aria-labelledby` on the host element to satisfy dialog labeling requirements.\n\n### AriaValidation\n\nWhen `@lmvz-ds/aria-validation` is enabled (development only), the component validates:\n\n- **Host element:** Must have an accessible label via the `label` prop or `aria-labelledby` attribute.\n- **Anchor element:** Must be interactive and focusable (e.g., `<button>`, `<a href>`, elements with `tabindex`, or elements with an interactive ARIA role). Non-interactive anchors produce a dev-time warning.\n\nValidation is disabled in production builds and test runtimes.\n\n## Notes\n\n- The popover is non-modal: focus is not trapped, and interaction outside does not require acknowledgment.\n- Positioning is automatic with collision avoidance. Use `placement` to express preference, but the component will flip or shift as needed to keep content visible.\n- Light-dismiss (clicking outside the popover or pressing Escape) fires `lmvzCancel` first, allowing consumers to intercept and prevent close (e.g., to warn unsaved changes).\n\n## Integration Patterns\n\n### Combobox and Listbox (Active Descendant Model)\n\nThe popover supports integration with combobox and listbox components via the `containerRole` prop. When `containerRole` is set to a non-dialog value (e.g. `'listbox'`, `'menu'`, `'tree'`, or `'grid'`):\n\n- The popover container receives the specified ARIA role instead of `role=\"dialog\"`\n- Focus remains on the trigger/anchor element (active descendant pattern), so `autoFocus` has no effect\n- `aria-haspopup` on the anchor is automatically set to match the `containerRole` value\n\nThis enables tight integration with components like `lmvz-select`, which uses `containerRole=\"listbox\"` to implement the WAI-ARIA combobox pattern with a listbox popup. In this mode, the popover acts as a styled container while the trigger manages focus and active descendant state.\n\n## Out of Scope\n\nBroader component integration patterns (e.g., date-picker, action menu with complex internal logic) remain the responsibility of consuming applications. The popover provides the container and positioning mechanism; application-specific behavior flows stay at the consuming component level.\n",
6566
7380
  "docs": "A non-modal floating dialog anchored to a trigger element. Positions automatically via `@floating-ui/dom` with collision avoidance (flip and shift middleware). Content-agnostic: accepts any slotted elements.",
6567
7381
  "docsTags": [
6568
7382
  {
@@ -6615,19 +7429,72 @@
6615
7429
  "references": {}
6616
7430
  },
6617
7431
  "mutable": false,
6618
- "attr": "auto-focus",
7432
+ "attr": "auto-focus",
7433
+ "reflectToAttr": false,
7434
+ "docs": "Whether to move focus to the first focusable element on open.\nIgnored (treated as `false`) when `containerRole` is not `'dialog'`, since\nnon-dialog roles (e.g. `'listbox'` for combobox/activedescendant integrations)\nmust keep focus on the anchor/trigger element.",
7435
+ "docsTags": [
7436
+ {
7437
+ "name": "default",
7438
+ "text": "true"
7439
+ }
7440
+ ],
7441
+ "default": "true",
7442
+ "values": [
7443
+ {
7444
+ "type": "boolean"
7445
+ }
7446
+ ],
7447
+ "optional": false,
7448
+ "required": false,
7449
+ "getter": false,
7450
+ "setter": false
7451
+ },
7452
+ {
7453
+ "name": "containerRole",
7454
+ "type": "\"dialog\" | \"grid\" | \"listbox\" | \"menu\" | \"tree\"",
7455
+ "complexType": {
7456
+ "original": "Popover.ContainerRole",
7457
+ "resolved": "\"dialog\" | \"grid\" | \"listbox\" | \"menu\" | \"tree\"",
7458
+ "references": {
7459
+ "Popover": {
7460
+ "location": "import",
7461
+ "path": "../../api",
7462
+ "id": "src/api/index.d.ts::Popover",
7463
+ "referenceLocation": "Popover"
7464
+ }
7465
+ }
7466
+ },
7467
+ "mutable": false,
7468
+ "attr": "container-role",
6619
7469
  "reflectToAttr": false,
6620
- "docs": "Whether to move focus to the first focusable element on open.",
7470
+ "docs": "ARIA role applied to the popover container.\nUse `'dialog'` (default) for focus-moving dialog-style popovers.\nUse a non-dialog role such as `'listbox'` to integrate with a `role=\"combobox\"`\ntrigger using the activedescendant model, in which case focus is kept on the\nanchor/trigger element instead of being moved into the popover.",
6621
7471
  "docsTags": [
6622
7472
  {
6623
7473
  "name": "default",
6624
- "text": "true"
7474
+ "text": "'dialog'"
6625
7475
  }
6626
7476
  ],
6627
- "default": "true",
7477
+ "default": "'dialog'",
6628
7478
  "values": [
6629
7479
  {
6630
- "type": "boolean"
7480
+ "value": "dialog",
7481
+ "type": "string"
7482
+ },
7483
+ {
7484
+ "value": "grid",
7485
+ "type": "string"
7486
+ },
7487
+ {
7488
+ "value": "listbox",
7489
+ "type": "string"
7490
+ },
7491
+ {
7492
+ "value": "menu",
7493
+ "type": "string"
7494
+ },
7495
+ {
7496
+ "value": "tree",
7497
+ "type": "string"
6631
7498
  }
6632
7499
  ],
6633
7500
  "optional": false,
@@ -6928,15 +7795,25 @@
6928
7795
  }
6929
7796
  ],
6930
7797
  "states": [],
6931
- "dependents": [],
7798
+ "dependents": [
7799
+ "lmvz-datepicker",
7800
+ "lmvz-select"
7801
+ ],
6932
7802
  "dependencies": [],
6933
- "dependencyGraph": {}
7803
+ "dependencyGraph": {
7804
+ "lmvz-datepicker": [
7805
+ "lmvz-popover"
7806
+ ],
7807
+ "lmvz-select": [
7808
+ "lmvz-popover"
7809
+ ]
7810
+ }
6934
7811
  },
6935
7812
  {
6936
7813
  "filePath": "src/components/lmvz-radio/lmvz-radio.tsx",
6937
7814
  "encapsulation": "scoped",
6938
7815
  "tag": "lmvz-radio",
6939
- "readme": "# lmvz-radio\n\nAccessible, form-associated radio button built as a Stencil scoped web component. Supports form association, native radio group mutual exclusion via `name` forwarding, roving tabindex, and ARIA APG-compliant keyboard navigation.\n\n## Usage\n\n### Basic\n\n```html\n<lmvz-radio name=\"choice\" value=\"a\" label=\"Option A\"></lmvz-radio>\n<lmvz-radio name=\"choice\" value=\"b\" label=\"Option B\"></lmvz-radio>\n```\n\n## Form Integration\n\n`lmvz-radio` is a FACE (Form-Associated Custom Element). It participates in native HTML forms via `ElementInternals`: the `name` and `value` attributes are submitted to the form when the radio is `checked`.\n\nSetting `required` triggers native form validation — the form will not submit unless a radio with the given `name` is checked.\n\n### Form Reset Behavior\n\nWhen a form is reset, `lmvz-radio` restores its `checked` state to the value it held when the component first mounted (the `initialChecked` value), without emitting `lmvzChange`. This matches native `<input type=\"radio\">` behavior. Internal form state (via `ElementInternals.setFormValue`) is always updated regardless. Browser autofill and session-restore operations (via `formStateRestoreCallback`) also do not emit `lmvzChange`.\n\n> **Note:** `aria-required` is intentionally absent from `lmvz-radio`. When a radio group is required, expose `aria-required` on the `role=\"radiogroup\"` wrapper element via your application code. This is the consumer's responsibility.\n\n## Radio Group Behavior\n\nWhen multiple `lmvz-radio` elements share the same `name` attribute and are within the same form (or document scope if outside any form), they form a native radio group. The `name` is forwarded directly to the native `<input type=\"radio\">`, enabling the browser's built-in mutual-exclusion logic: selecting one radio automatically deselects all others with the same name in the same scope. Radios with the same `name` in different forms are treated as independent groups.\n\n**Roving tabindex:** The component automatically manages keyboard focus navigation via the `RadioGroupController`. When a group of radios shares the same `name`:\n- The checked radio has `tabindex=\"0\"` and is reachable via Tab.\n- All other enabled radios have `tabindex=\"-1\"` and are not directly tabbable.\n- If no radio is checked, the first enabled radio in DOM order receives `tabindex=\"0\"`, ensuring the group is always reachable.\n\n**Keyboard navigation (manual selection pattern):**\n\n| Key | Action |\n|-----|--------|\n| Arrow Down / Arrow Right | Moves focus to the next radio in the group (no selection) |\n| Arrow Up / Arrow Left | Moves focus to the previous radio in the group (no selection) |\n| Home | Moves focus to the first radio in the group (no selection) |\n| End | Moves focus to the last radio in the group (no selection) |\n| Space | Selects the focused radio; emits `lmvzActivation` and (if state changed) `lmvzChange` |\n| Tab | Moves focus out of the radio group |\n\nDisabled radios are skipped during navigation.\n\nThis component implements the WAI-ARIA [manual selection](https://www.w3.org/WAI/ARIA/apg/patterns/radio/) pattern: focus and selection are decoupled. Arrow keys move focus without selecting. The consumer is responsible for wrapping grouped radios in a `role=\"radiogroup\"` element.\n\n**Consumer responsibility — `role=\"radiogroup\"`:**\nWrap a group of related `lmvz-radio` elements in a container element with `role=\"radiogroup\"` and an accessible label via `aria-label` or `aria-labelledby`. The radio component does not add this role itself because a radio button cannot also be a radiogroup.\n\n## Accessibility\n\n- A native `<input type=\"radio\">` is rendered inside the component for full keyboard and screen reader support.\n- `role=\"radiogroup\"` must be added by the consumer on a wrapper element (see \"Radio Group Behavior\" above).\n- `aria-invalid` is set when `error=true`.\n- `aria-describedby` links the input to helper text when `helper-text` is provided.\n- Helper text uses `aria-live=\"polite\"` for dynamic updates.\n- The focus ring is visible and meets WCAG 2.1 AA contrast requirements.\n- Forced Colors (Windows High Contrast Mode) is supported.\n\n## CSS Custom Properties\n\nOverride these on the `:host` element to theme the component. All defaults reference LMVZ semantic or global design tokens.\n\n| Property | Default | Description |\n|---|---|---|\n| `--radio-circle-size` | `var(--lmvz-global-s18)` | Width and height of the radio circle |\n| `--radio-dot-size` | `0.5rem` | Size of the inner selected dot |\n| `--radio-bg` | `var(--lmvz-semantic-color-surface-input-primary)` | Circle background (unchecked) |\n| `--radio-border-color` | `var(--lmvz-semantic-color-border-default)` | Circle border (default) |\n| `--radio-border-color-hover` | `var(--lmvz-semantic-color-border-hover)` | Circle border on hover |\n| `--radio-border-color-checked` | `var(--lmvz-semantic-color-border-active)` | Circle border when checked |\n| `--radio-border-color-error` | `var(--lmvz-semantic-color-status-on-danger)` | Circle border in error state |\n| `--radio-dot-color` | `var(--lmvz-semantic-color-border-active)` | Color of the inner dot |\n| `--radio-wrapper-bg-hover` | `var(--lmvz-semantic-color-int-tertiary-hover)` | Pill background on hover |\n| `--radio-wrapper-bg-active` | `var(--lmvz-semantic-color-int-tertiary-active)` | Pill background when pressed |\n| `--radio-wrapper-bg-checked` | `var(--lmvz-semantic-color-status-active)` | Pill background when checked |\n| `--radio-label-color` | `var(--lmvz-semantic-color-on-surface-primary)` | Label text color (default) |\n| `--radio-label-color-checked` | `var(--lmvz-semantic-color-status-on-active)` | Label text color when checked |\n| `--radio-helper-color` | `var(--lmvz-semantic-color-on-surface-secondary)` | Helper text color |\n| `--radio-focus-color` | `var(--lmvz-semantic-color-status-on-active)` | Focus ring color |\n| `--radio-easing` | `var(--lmvz-global-easing-default, ease)` | Transition easing function |\n| `--radio-duration` | `0.2s` | Transition duration |\n\n## lmvzChange Emission Contract\n\nThe `lmvzChange` event emits only when the radio's checked state changes. The event detail contains the new `checked` boolean value.\n\n**Fires on:**\n- User activation: clicking the radio or pressing Space (only if state changes)\n- Programmatic checked state transitions: setting `checked = true` or `checked = false`\n\n**Does NOT fire on:**\n- Arrow key navigation (Arrow Down, Arrow Up, Home, End). These move focus only, without selection.\n- Browser form lifecycle callbacks (`formResetCallback`, `formStateRestoreCallback`). This matches native `<input type=\"radio\">` behavior, which does not fire `change` on form reset. Internal form state (`ElementInternals.setFormValue`) is always updated regardless.\n\n## Angular Integration\n\n### Automatic Form Integration\n\nUse the `LmvzCheckableValueChangeHelper` directive (included in `@lmvz-ds/angular`) to automatically wire `lmvz-radio` to Angular form controls. When this directive is present on the element, it automatically binds the `lmvzChange` event to the form control's `valueChange` output:\n\n```html\n<!-- With [(ngModel)] -->\n<lmvz-radio\n label=\"Option A\"\n name=\"choice\"\n value=\"a\"\n [(ngModel)]=\"selectedValue\">\n</lmvz-radio>\n\n<!-- With [formControl] -->\n<lmvz-radio\n label=\"Option B\"\n name=\"choice\"\n value=\"b\"\n [formControl]=\"controlRef\">\n</lmvz-radio>\n```\n\nNo additional setup is required — the directive is applied automatically via the selector `lmvz-checkbox, lmvz-radio`.\n\n### Manual Event Binding\n\nIf you need direct event handling, listen to the `lmvzChange` event:\n\n```html\n<lmvz-radio\n label=\"Option\"\n name=\"choice\"\n [checked]=\"isChecked\"\n (lmvzChange)=\"isChecked = $event.target.checked\">\n</lmvz-radio>\n```\n\n## Public Methods\n\n### focusInput()\n\nProgrammatically set focus on the native radio input. Use this method when you need to move keyboard focus to a radio after a user interaction or page state change:\n\n```typescript\nconst radioEl = document.querySelector('lmvz-radio');\nawait radioEl.focusInput();\n```\n\n## Event Reference\n\n### lmvzActivation\n\nThe `lmvzActivation` event fires on every explicit user activation: click or Space on the native input. This includes re-activation of an already-checked radio. Use this event to react directly to user intent, distinct from state transitions.\n\n### lmvzChange vs lmvzActivation\n\n- **`lmvzActivation`:** Fires on every explicit user activation (click or Space), regardless of whether the checked state actually changes.\n- **`lmvzChange`:** Fires only on state transitions (checked ↔ unchecked).\n\nWhen a user selects a different radio in a group, both events fire together. When a user re-activates an already-checked radio, only `lmvzActivation` fires.\n\n## Design Notes / Waivers\n\n### Checked + hover state (OQ-5)\n\nWhen a radio is both checked and hovered, the checked background (`--radio-wrapper-bg-checked`) is held — the hover background does not override it. No Figma spec exists for this combined state; this behavior is an intentional implementation decision.\n\n### Label wrapping (OQ-3)\n\nThe label uses `overflow-wrap: break-word` (normal wrapping). `white-space: nowrap` is intentionally not applied.\n",
7816
+ "readme": "# lmvz-radio\n\nAccessible, form-associated radio button built as a Stencil scoped web component. Supports form association via `ElementInternals`, JS-driven radio group mutual exclusion, roving tabindex, and ARIA APG-compliant keyboard navigation.\n\n## Usage\n\n### Basic\n\n```html\n<lmvz-radio name=\"choice\" value=\"a\" label=\"Option A\"></lmvz-radio>\n<lmvz-radio name=\"choice\" value=\"b\" label=\"Option B\"></lmvz-radio>\n```\n\n## Form Integration\n\n`lmvz-radio` is a FACE (Form-Associated Custom Element). It participates in native HTML forms via `ElementInternals`: the `name` and `value` attributes are submitted to the form when the radio is `checked`.\n\nSetting `required` triggers native form validation — the form will not submit unless a radio with the given `name` is checked. For a required radio group (multiple radios with the same `name`), validity is group-aware: the group becomes invalid only when no radio in the group is checked, and valid as soon as any radio is selected. Use `getValidationMessage()` to retrieve the validation message.\n\n### Form Reset Behavior\n\nWhen a form is reset, `lmvz-radio` restores its `checked` state to the value it held when the component first mounted (the `initialChecked` value), without emitting `lmvzChange`. This matches native `<input type=\"radio\">` behavior. Internal form state (via `ElementInternals.setFormValue`) is always updated regardless. Browser autofill and session-restore operations (via `formStateRestoreCallback`) also do not emit `lmvzChange`.\n\n> **Note:** `aria-required` is intentionally absent from `lmvz-radio`. When a radio group is required, expose `aria-required` on the `role=\"radiogroup\"` wrapper element via your application code. This is the consumer's responsibility.\n\n## Radio Group Behavior\n\nWhen multiple `lmvz-radio` elements share the same `name` attribute and are within the same form (or document scope if outside any form), they form a radio group tracked by `RadioGroupController`. The `name` attribute is NOT forwarded to the native `<input type=\"radio\">` — because this component renders in `scoped` (light DOM) mode, doing so would make the inner `<input>` an independent, genuinely form-associated element of the outer `<form>`, submitting a duplicate value alongside the host's own `ElementInternals` participation. Instead, mutual exclusion is enforced entirely in JavaScript: selecting one radio calls `RadioGroup.select()`, which sets `checked = false` on every other host sharing the same name and scope. Radios with the same `name` in different forms are treated as independent groups.\n\n**Roving tabindex:** The component automatically manages keyboard focus navigation via the `RadioGroupController`. When a group of radios shares the same `name`:\n- The checked radio has `tabindex=\"0\"` and is reachable via Tab.\n- All other enabled radios have `tabindex=\"-1\"` and are not directly tabbable.\n- If no radio is checked, the first enabled radio in DOM order receives `tabindex=\"0\"`, ensuring the group is always reachable.\n\n**Keyboard navigation (manual selection pattern):**\n\n| Key | Action |\n|-----|--------|\n| Arrow Down / Arrow Right | Moves focus to the next radio in the group (no selection) |\n| Arrow Up / Arrow Left | Moves focus to the previous radio in the group (no selection) |\n| Home | Moves focus to the first radio in the group (no selection) |\n| End | Moves focus to the last radio in the group (no selection) |\n| Space | Selects the focused radio; emits `lmvzActivation` and (if state changed) `lmvzChange` |\n| Tab | Moves focus out of the radio group |\n\nDisabled radios are skipped during navigation.\n\nThis component implements the WAI-ARIA [manual selection](https://www.w3.org/WAI/ARIA/apg/patterns/radio/) pattern: focus and selection are decoupled. Arrow keys move focus without selecting. The consumer is responsible for wrapping grouped radios in a `role=\"radiogroup\"` element.\n\n**Consumer responsibility — `role=\"radiogroup\"`:**\nWrap a group of related `lmvz-radio` elements in a container element with `role=\"radiogroup\"` and an accessible label via `aria-label` or `aria-labelledby`. The radio component does not add this role itself because a radio button cannot also be a radiogroup.\n\n## Accessibility\n\n- A native `<input type=\"radio\">` is rendered inside the component for full keyboard and screen reader support.\n- `role=\"radiogroup\"` must be added by the consumer on a wrapper element (see \"Radio Group Behavior\" above).\n- `aria-invalid` is set when `error=true`, and is also automatically set when the radio's real constraint validity becomes invalid following a validation attempt (e.g., after a failed `submit`, `checkValidity()`, or `reportValidity()` call), clearing once resolved.\n- `aria-describedby` links the input to helper text when `helper-text` is provided.\n- Helper text uses `aria-live=\"polite\"` for dynamic updates.\n- The focus ring is visible and meets WCAG 2.1 AA contrast requirements.\n- Forced Colors (Windows High Contrast Mode) is supported.\n\n## CSS Custom Properties\n\nOverride these on the `:host` element to theme the component. All defaults reference LMVZ semantic or global design tokens.\n\n| Property | Default | Description |\n|---|---|---|\n| `--radio-circle-size` | `var(--lmvz-global-s18)` | Width and height of the radio circle |\n| `--radio-dot-size` | `0.5rem` | Size of the inner selected dot |\n| `--radio-bg` | `var(--lmvz-semantic-color-surface-input-primary)` | Circle background (unchecked) |\n| `--radio-border-color` | `var(--lmvz-semantic-color-border-default)` | Circle border (default) |\n| `--radio-border-color-hover` | `var(--lmvz-semantic-color-border-hover)` | Circle border on hover |\n| `--radio-border-color-checked` | `var(--lmvz-semantic-color-border-active)` | Circle border when checked |\n| `--radio-border-color-error` | `var(--lmvz-semantic-color-status-on-danger)` | Circle border in error state |\n| `--radio-dot-color` | `var(--lmvz-semantic-color-border-active)` | Color of the inner dot |\n| `--radio-wrapper-bg-hover` | `var(--lmvz-semantic-color-int-tertiary-hover)` | Pill background on hover |\n| `--radio-wrapper-bg-active` | `var(--lmvz-semantic-color-int-tertiary-active)` | Pill background when pressed |\n| `--radio-wrapper-bg-checked` | `var(--lmvz-semantic-color-status-active)` | Pill background when checked |\n| `--radio-label-color` | `var(--lmvz-semantic-color-on-surface-primary)` | Label text color (default) |\n| `--radio-label-color-checked` | `var(--lmvz-semantic-color-status-on-active)` | Label text color when checked |\n| `--radio-helper-color` | `var(--lmvz-semantic-color-on-surface-secondary)` | Helper text color |\n| `--radio-focus-color` | `var(--lmvz-semantic-color-status-on-active)` | Focus ring color |\n| `--radio-easing` | `var(--lmvz-global-easing-default, ease)` | Transition easing function |\n| `--radio-duration` | `0.2s` | Transition duration |\n\n## lmvzChange Emission Contract\n\nThe `lmvzChange` event emits only when the radio's checked state changes. The event detail contains the new `checked` boolean value.\n\n**Fires on:**\n- User activation: clicking the radio or pressing Space (only if state changes)\n- Programmatic checked state transitions: setting `checked = true` or `checked = false`\n\n**Does NOT fire on:**\n- Arrow key navigation (Arrow Down, Arrow Up, Home, End). These move focus only, without selection.\n- Browser form lifecycle callbacks (`formResetCallback`, `formStateRestoreCallback`). This matches native `<input type=\"radio\">` behavior, which does not fire `change` on form reset. Internal form state (`ElementInternals.setFormValue`) is always updated regardless.\n\n## Angular Integration\n\n### Automatic Form Integration\n\nUse the `LmvzCheckableValueChangeHelper` directive (included in `@lmvz-ds/angular`) to automatically wire `lmvz-radio` to Angular form controls. When this directive is present on the element, it automatically binds the `lmvzChange` event to the form control's `valueChange` output:\n\n```html\n<!-- With [(ngModel)] -->\n<lmvz-radio\n label=\"Option A\"\n name=\"choice\"\n value=\"a\"\n [(ngModel)]=\"selectedValue\">\n</lmvz-radio>\n\n<!-- With [formControl] -->\n<lmvz-radio\n label=\"Option B\"\n name=\"choice\"\n value=\"b\"\n [formControl]=\"controlRef\">\n</lmvz-radio>\n```\n\nNo additional setup is required — the directive is applied automatically via the selector `lmvz-checkbox, lmvz-radio`.\n\n### Manual Event Binding\n\nIf you need direct event handling, listen to the `lmvzChange` event:\n\n```html\n<lmvz-radio\n label=\"Option\"\n name=\"choice\"\n [checked]=\"isChecked\"\n (lmvzChange)=\"isChecked = $event.target.checked\">\n</lmvz-radio>\n```\n\n## Public Methods\n\n### focusInput()\n\nProgrammatically set focus on the native radio input. Use this method when you need to move keyboard focus to a radio after a user interaction or page state change:\n\n```typescript\nconst radioEl = document.querySelector('lmvz-radio');\nawait radioEl.focusInput();\n```\n\n## Event Reference\n\n### lmvzActivation\n\nThe `lmvzActivation` event fires on every explicit user activation: click or Space on the native input. This includes re-activation of an already-checked radio. Use this event to react directly to user intent, distinct from state transitions.\n\n### lmvzChange vs lmvzActivation\n\n- **`lmvzActivation`:** Fires on every explicit user activation (click or Space), regardless of whether the checked state actually changes.\n- **`lmvzChange`:** Fires only on state transitions (checked ↔ unchecked).\n\nWhen a user selects a different radio in a group, both events fire together. When a user re-activates an already-checked radio, only `lmvzActivation` fires.\n\n## Design Notes / Waivers\n\n### Checked + hover state (OQ-5)\n\nWhen a radio is both checked and hovered, the checked background (`--radio-wrapper-bg-checked`) is held — the hover background does not override it. No Figma spec exists for this combined state; this behavior is an intentional implementation decision.\n\n### Label wrapping (OQ-3)\n\nThe label uses `overflow-wrap: break-word` (normal wrapping). `white-space: nowrap` is intentionally not applied.\n",
6940
7817
  "docs": "Radio button component with form association, ARIA validation, accessible label support,\nand ARIA APG-compliant Arrow-key keyboard navigation.\n\n**Consumer responsibility — `role=\"radiogroup\"`:**\nWrap a group of `lmvz-radio` elements in a container element with `role=\"radiogroup\"` and\nan accessible label via `aria-label` or `aria-labelledby`. `lmvz-radio` must not carry\n`role=\"radiogroup\"` itself because a radio cannot also be a radiogroup.\n\n**Arrow-key navigation and roving tabindex:**\nWhen multiple `lmvz-radio` elements share the same `name` attribute, this component\nautomatically handles Arrow Down / Arrow Right (next), Arrow Up / Arrow Left (previous),\nHome (first), and End (last) navigation with wrapping. Disabled radios are skipped.\nThe checked radio has `tabindex=\"0\"`. When no radio is checked, the first enabled radio\nin DOM order receives `tabindex=\"0\"`, ensuring the group is always reachable by Tab.",
6941
7818
  "docsTags": [
6942
7819
  {
@@ -7051,7 +7928,6 @@
7051
7928
  "text": "false"
7052
7929
  }
7053
7930
  ],
7054
- "default": "false",
7055
7931
  "values": [
7056
7932
  {
7057
7933
  "type": "boolean"
@@ -7059,8 +7935,8 @@
7059
7935
  ],
7060
7936
  "optional": false,
7061
7937
  "required": false,
7062
- "getter": false,
7063
- "setter": false
7938
+ "getter": true,
7939
+ "setter": true
7064
7940
  },
7065
7941
  {
7066
7942
  "name": "form",
@@ -7147,12 +8023,12 @@
7147
8023
  },
7148
8024
  "mutable": false,
7149
8025
  "attr": "name",
7150
- "reflectToAttr": false,
7151
- "docs": "Name attribute for form submission via ElementInternals.\n\nWhen multiple `lmvz-radio` elements share the same `name` and form scope,\nthe `name` is forwarded directly to the native `<input type=\"radio\">`,\nenabling browser-native mutual exclusion: selecting one radio automatically\ndeselects all others with the same name in that form. If a radio is outside\nany form, its scope defaults to the document level — same-name radios\noutside forms form a document-scoped group. Radios with the same `name` in\ndifferent forms are independent groups.\n\nThe `RadioGroupController` automatically manages roving tabindex (only the\nchecked radio has `tabindex=\"0\"`) and keyboard navigation (Arrow keys, Home, End)\nwithin the form-scoped group.",
8026
+ "reflectToAttr": true,
8027
+ "docs": "Name attribute for form submission via ElementInternals.\n\nThe `name` is NOT forwarded to the native `<input type=\"radio\">` — this component\nrenders in `scoped` (light DOM) mode, so a native `name` attribute would make the\ninner `<input>` an independent, genuinely form-associated element of the outer\n`<form>`, submitting a duplicate value alongside the host's own `ElementInternals`\nparticipation. Instead, `name` is used purely as a JS-level grouping key: the\n`RadioGroupController` tracks all `lmvz-radio` hosts sharing the same `name` and form\nscope in an internal registry and enforces mutual exclusion itself (via\n`RadioGroup.select()`, which sets `checked = false` on every other host in the group).\nIf a radio is outside any form, its scope defaults to the document level — same-name\nradios outside forms form a document-scoped group. Radios with the same `name` in\ndifferent forms are independent groups.\n\nThe `RadioGroupController` also manages roving tabindex (only the checked radio has\n`tabindex=\"0\"`) and keyboard navigation (Arrow keys, Home, End) within the group.",
7152
8028
  "docsTags": [
7153
8029
  {
7154
8030
  "name": "remarks",
7155
- "text": "A value of `\"\"` (empty string) is forwarded to the native `<input>`, but\n`RadioGroupController` treats it as unnamed — no group coordination occurs between\nradios with `name=\"\"`."
8031
+ "text": "A value of `\"\"` (empty string) is treated as unnamed by `RadioGroupController` —\nno group coordination occurs between radios with `name=\"\"`."
7156
8032
  }
7157
8033
  ],
7158
8034
  "values": [
@@ -7272,6 +8148,28 @@
7272
8148
  "docs": "Sets focus on the native radio input.",
7273
8149
  "docsTags": []
7274
8150
  },
8151
+ {
8152
+ "name": "getValidationMessage",
8153
+ "returns": {
8154
+ "type": "Promise<string>",
8155
+ "docs": ""
8156
+ },
8157
+ "complexType": {
8158
+ "signature": "() => Promise<string>",
8159
+ "parameters": [],
8160
+ "references": {
8161
+ "Promise": {
8162
+ "location": "global",
8163
+ "id": "global::Promise"
8164
+ }
8165
+ },
8166
+ "return": "Promise<string>"
8167
+ },
8168
+ "signature": "getValidationMessage() => Promise<string>",
8169
+ "parameters": [],
8170
+ "docs": "Returns the current validation message, if any.",
8171
+ "docsTags": []
8172
+ },
7275
8173
  {
7276
8174
  "name": "reportValidity",
7277
8175
  "returns": {
@@ -7326,6 +8224,11 @@
7326
8224
  }
7327
8225
  ],
7328
8226
  "listeners": [
8227
+ {
8228
+ "event": "invalid",
8229
+ "capture": false,
8230
+ "passive": false
8231
+ },
7329
8232
  {
7330
8233
  "event": "keydown",
7331
8234
  "capture": false,
@@ -7344,8 +8247,8 @@
7344
8247
  "filePath": "src/components/lmvz-select/lmvz-select.tsx",
7345
8248
  "encapsulation": "scoped",
7346
8249
  "tag": "lmvz-select",
7347
- "readme": "# lmvz-select\n\n## Props\n\n### `size`\n\n- Type: `'small' | 'default' | 'large'`\n- Default: `'default'`\n\nControls the visual height variant of the select field. Use `small` for compact layouts, `default` for standard use, and `large` for emphasis.\n\n### `highlighted`\n\n- Type: `boolean`\n- Default: `false`\n\nIndicates that an active filter or selection applies (e.g., a filter chip is active). When `true`:\n- The host attribute `[highlighted]` is present for CSS styling (`:host([highlighted])`).\n- The host attribute `data-highlighted=\"true\"` is set for assistive-technology consumers.\n\nWhen `false`, `data-highlighted=\"false\"` is set. Note that `aria-pressed` and `aria-selected` are not used here; they conflict with native `<select>` semantics. The `data-highlighted` attribute provides the accessible contract.\n",
7348
- "docs": "Select component with floating label and pill-shaped trigger.\nWraps a native `<select>` element for full keyboard and form support.",
8250
+ "readme": "# lmvz-select\n\nSelect component with floating label and pill-shaped trigger that implements the WAI-ARIA \"combobox with listbox popup\" pattern.\n\n## What changed: Breaking rewrite from native `<select>` to custom WAI-ARIA combobox\n\nIn previous versions, `lmvz-select` wrapped a native `<select>` element and inherited its form behavior and platform-specific UI (including native mobile pickers on iOS/Android). As of this version, it is a fully custom WAI-ARIA combobox implemented using:\n\n- A `role=\"combobox\"` trigger button (your interaction target)\n- A `role=\"listbox\"` popup menu hosted in `lmvz-popover`\n- Focus management via `aria-activedescendant` (trigger keeps focus; the selected item is tracked via an aria attribute rather than DOM focus)\n- Form submission via `ElementInternals` (like `lmvz-input`, `lmvz-checkbox`, etc. in this design system)\n\n**What consumers must know:**\n\n- **No native mobile picker:** On iOS, Android, and other platforms, users see the custom popup instead of the OS-native picker. This is by design, to ensure consistent styling and behavior across platforms.\n- **Slot contract:** You pass native `<option>` and `<optgroup>` elements as children. The component translates them internally to `role=\"listbox\"` and `role=\"option\"` elements.\n- **`<option selected>` is meaningful:** If you do not set the `value` prop, the first `<option selected=\"selected\">` becomes the initial value.\n- **Validation is minimal:** The component uses native HTML form constraint validation (`ElementInternals.setValidity()`). When `required` is true and no value is set, the browser's default validation UI appears on form submit; the component does not provide custom validation message styling beyond `errorMessage` (which you control via props).\n- **Form submission:** Use the `name` attribute (set directly on the `<lmvz-select>` host) and the current `value` to participate in HTML form submission. Form reset correctly restores the initial value.\n\n## Slot contract\n\nThe default slot accepts only native `<option>` and `<optgroup>` elements. The component reads this markup once on mount and translates it into an internal listbox model, re-parsing whenever the slotted content changes structurally (options/optgroups added or removed) or an already-slotted option/optgroup is mutated in place (e.g. `.disabled`, `.selected`, `.value`, `.label`, or its text content), mirroring native `<select>` reactivity. The slotted markup is never rendered; it serves as a template.\n\n```html\n<lmvz-select label=\"Fruit\" name=\"fruit\">\n <option value=\"apple\">Apple</option>\n <optgroup label=\"Citrus\">\n <option value=\"orange\">Orange</option>\n <option value=\"lemon\">Lemon</option>\n </optgroup>\n <option value=\"banana\" selected>Banana</option>\n</lmvz-select>\n```\n\n## Form integration\n\n`lmvz-select` is a form-associated custom element (`formAssociated: true`). Set the `name` attribute on the host element, and the component participates in:\n\n- **Form submission:** The current `value` is submitted under the `name` key.\n- **Form reset:** Restores `value` to its initial state (the prop value at mount time).\n- **Validation:** Set `required` to enforce that a value is present. Use `checkValidity()`, `reportValidity()`, and `getValidationMessage()` methods for programmatic validation.\n\n## Props explained\n\n### `size`\n\n- Type: `'small' | 'default' | 'large'`\n- Default: `'default'`\n\nControls the visual height variant of the select trigger. Use `small` for compact layouts, `default` for standard use, and `large` for emphasis.\n\n### `highlighted`\n\n- Type: `boolean`\n- Default: `false`\n\nIndicates that an active filter or selection applies (e.g., a filter chip is active). When `true`:\n- The host attribute `[highlighted]` is present for CSS styling (`:host([highlighted])`).\n- The host attribute `data-highlighted=\"true\"` is set for assistive-technology consumers.\n\nWhen `false`, `data-highlighted=\"false\"` is set. The `data-highlighted` attribute (rather than `aria-pressed`) provides this accessible contract; `aria-selected` is reserved for the `role=\"option\"` elements in the listbox popup.\n\n### `error`\n\n- Type: `boolean`\n- Default: `false`\n- Reflected as host attribute: yes\n\nWhen `true`:\n- Applies danger-themed border color to the combobox trigger.\n- Sets `aria-invalid=\"true\"` on the trigger element.\n\n`aria-invalid` is also automatically set to `true` when the select's real constraint validity becomes invalid following a validation attempt (e.g., after a failed `submit`, `checkValidity()`, or `reportValidity()` call), and is cleared once the constraint is resolved. This allows automatic reflect of native HTML5 validation state independent of the `error` prop.\n\nTypically set alongside `errorMessage` to provide inline error text.\n\n### `errorMessage`\n\n- Type: `string | undefined`\n- Default: `undefined`\n\nError message text rendered below the select field when `error={true}`. Rendered as an assertive live region (`role=\"alert\"`), linked to the trigger via `aria-describedby` and `aria-errormessage`.\n\nCoexists with `helperText` — both can be displayed simultaneously, with `helperText` rendered first.\n",
8251
+ "docs": "Select component with floating label and pill-shaped trigger.\nImplements the WAI-ARIA APG \"combobox with listbox popup\" pattern: a `role=\"combobox\"`\ntrigger drives an `lmvz-popover`-hosted `role=\"listbox\"`/`role=\"option\"` list via the\nactivedescendant model (the trigger keeps real DOM focus; `aria-activedescendant` tracks\nthe highlighted option).\n\nParticipates in native HTML forms via `ElementInternals` (form-associated custom element):\nthe `name` attribute (set directly on the host element) and the current `value` are submitted,\nand the value resets to its initial value on form reset.",
7349
8252
  "docsTags": [
7350
8253
  {
7351
8254
  "name": "example",
@@ -7357,7 +8260,7 @@
7357
8260
  },
7358
8261
  {
7359
8262
  "name": "slot",
7360
- "text": "default - Native `<option>` or `<optgroup>` elements."
8263
+ "text": "default - Native `<option>` or `<optgroup>` elements. Never rendered directly; read once\nassigned to build the internal `role=\"option\"` listbox, and re-read on structural slot changes\nor in-place mutation (attribute/text/subtree) of already-slotted elements. `<option selected>`\ndetermines the initial value when the `value` prop is not set."
7361
8264
  }
7362
8265
  ],
7363
8266
  "usage": {},
@@ -7391,6 +8294,60 @@
7391
8294
  "getter": false,
7392
8295
  "setter": false
7393
8296
  },
8297
+ {
8298
+ "name": "error",
8299
+ "type": "boolean",
8300
+ "complexType": {
8301
+ "original": "boolean",
8302
+ "resolved": "boolean",
8303
+ "references": {}
8304
+ },
8305
+ "mutable": false,
8306
+ "attr": "error",
8307
+ "reflectToAttr": true,
8308
+ "docs": "Whether the select is in an error state.\nWhen not set manually, this will automatically reflect native HTML5 validation state",
8309
+ "docsTags": [
8310
+ {
8311
+ "name": "default",
8312
+ "text": "false"
8313
+ }
8314
+ ],
8315
+ "values": [
8316
+ {
8317
+ "type": "boolean"
8318
+ }
8319
+ ],
8320
+ "optional": false,
8321
+ "required": false,
8322
+ "getter": true,
8323
+ "setter": true
8324
+ },
8325
+ {
8326
+ "name": "errorMessage",
8327
+ "type": "string | undefined",
8328
+ "complexType": {
8329
+ "original": "string",
8330
+ "resolved": "string | undefined",
8331
+ "references": {}
8332
+ },
8333
+ "mutable": false,
8334
+ "attr": "error-message",
8335
+ "reflectToAttr": false,
8336
+ "docs": "Error message displayed below the select field when error is true.",
8337
+ "docsTags": [],
8338
+ "values": [
8339
+ {
8340
+ "type": "string"
8341
+ },
8342
+ {
8343
+ "type": "undefined"
8344
+ }
8345
+ ],
8346
+ "optional": true,
8347
+ "required": false,
8348
+ "getter": false,
8349
+ "setter": false
8350
+ },
7394
8351
  {
7395
8352
  "name": "helperText",
7396
8353
  "type": "string | undefined",
@@ -7428,7 +8385,7 @@
7428
8385
  "mutable": false,
7429
8386
  "attr": "highlighted",
7430
8387
  "reflectToAttr": true,
7431
- "docs": "Whether the select has an active filter or selection that should be visually\ndistinguished (e.g. a filter chip is applied).\n\nWhen `true`:\n- The host attribute `highlighted` is present (CSS: `:host([highlighted])`).\n- The host attribute `data-highlighted=\"true\"` is set for assistive-technology\n consumers that observe data attributes. When `false`, `data-highlighted` is\n set to `\"false\"`.\n\nNote: `aria-pressed` and `aria-selected` are intentionally not used here.\n`aria-pressed` is reserved for toggle-button roles; `aria-selected` is\nreserved for option/listbox roles. The `data-highlighted` attribute provides\nthe accessible contract without conflicting with native `<select>` semantics.",
8388
+ "docs": "Whether the select has an active filter or selection that should be visually\ndistinguished (e.g. a filter chip is applied).\n\nWhen `true`:\n- The host attribute `highlighted` is present (CSS: `:host([highlighted])`).\n- The host attribute `data-highlighted=\"true\"` is set for assistive-technology\n consumers that observe data attributes. When `false`, `data-highlighted` is\n set to `\"false\"`.\n\nNote: `aria-pressed` is intentionally not used here; it is reserved for toggle-button\nroles. `aria-selected` is reserved for this component's own `role=\"option\"` elements.\nThe `data-highlighted` attribute provides the accessible contract for this state.",
7432
8389
  "docsTags": [
7433
8390
  {
7434
8391
  "name": "default",
@@ -7479,8 +8436,8 @@
7479
8436
  },
7480
8437
  "mutable": false,
7481
8438
  "attr": "name",
7482
- "reflectToAttr": false,
7483
- "docs": "Name attribute passed to the native select for form submission.",
8439
+ "reflectToAttr": true,
8440
+ "docs": "Name attribute for form submission via ElementInternals.",
7484
8441
  "docsTags": [],
7485
8442
  "values": [
7486
8443
  {
@@ -7596,7 +8553,118 @@
7596
8553
  "setter": false
7597
8554
  }
7598
8555
  ],
7599
- "methods": [],
8556
+ "methods": [
8557
+ {
8558
+ "name": "blurTrigger",
8559
+ "returns": {
8560
+ "type": "Promise<void>",
8561
+ "docs": ""
8562
+ },
8563
+ "complexType": {
8564
+ "signature": "() => Promise<void>",
8565
+ "parameters": [],
8566
+ "references": {
8567
+ "Promise": {
8568
+ "location": "global",
8569
+ "id": "global::Promise"
8570
+ }
8571
+ },
8572
+ "return": "Promise<void>"
8573
+ },
8574
+ "signature": "blurTrigger() => Promise<void>",
8575
+ "parameters": [],
8576
+ "docs": "Removes focus from the combobox trigger.",
8577
+ "docsTags": []
8578
+ },
8579
+ {
8580
+ "name": "checkValidity",
8581
+ "returns": {
8582
+ "type": "Promise<boolean>",
8583
+ "docs": ""
8584
+ },
8585
+ "complexType": {
8586
+ "signature": "() => Promise<boolean>",
8587
+ "parameters": [],
8588
+ "references": {
8589
+ "Promise": {
8590
+ "location": "global",
8591
+ "id": "global::Promise"
8592
+ }
8593
+ },
8594
+ "return": "Promise<boolean>"
8595
+ },
8596
+ "signature": "checkValidity() => Promise<boolean>",
8597
+ "parameters": [],
8598
+ "docs": "Returns whether the select satisfies its validation constraints.",
8599
+ "docsTags": []
8600
+ },
8601
+ {
8602
+ "name": "focusTrigger",
8603
+ "returns": {
8604
+ "type": "Promise<void>",
8605
+ "docs": ""
8606
+ },
8607
+ "complexType": {
8608
+ "signature": "() => Promise<void>",
8609
+ "parameters": [],
8610
+ "references": {
8611
+ "Promise": {
8612
+ "location": "global",
8613
+ "id": "global::Promise"
8614
+ }
8615
+ },
8616
+ "return": "Promise<void>"
8617
+ },
8618
+ "signature": "focusTrigger() => Promise<void>",
8619
+ "parameters": [],
8620
+ "docs": "Sets focus on the combobox trigger.",
8621
+ "docsTags": []
8622
+ },
8623
+ {
8624
+ "name": "getValidationMessage",
8625
+ "returns": {
8626
+ "type": "Promise<string>",
8627
+ "docs": ""
8628
+ },
8629
+ "complexType": {
8630
+ "signature": "() => Promise<string>",
8631
+ "parameters": [],
8632
+ "references": {
8633
+ "Promise": {
8634
+ "location": "global",
8635
+ "id": "global::Promise"
8636
+ }
8637
+ },
8638
+ "return": "Promise<string>"
8639
+ },
8640
+ "signature": "getValidationMessage() => Promise<string>",
8641
+ "parameters": [],
8642
+ "docs": "Returns the current validation message, if any.",
8643
+ "docsTags": []
8644
+ },
8645
+ {
8646
+ "name": "reportValidity",
8647
+ "returns": {
8648
+ "type": "Promise<boolean>",
8649
+ "docs": ""
8650
+ },
8651
+ "complexType": {
8652
+ "signature": "() => Promise<boolean>",
8653
+ "parameters": [],
8654
+ "references": {
8655
+ "Promise": {
8656
+ "location": "global",
8657
+ "id": "global::Promise"
8658
+ }
8659
+ },
8660
+ "return": "Promise<boolean>"
8661
+ },
8662
+ "signature": "reportValidity() => Promise<boolean>",
8663
+ "parameters": [],
8664
+ "docs": "Reports validation errors to the user.",
8665
+ "docsTags": []
8666
+ }
8667
+ ],
7600
8668
  "events": [
7601
8669
  {
7602
8670
  "event": "lmvzChange",
@@ -7613,19 +8681,31 @@
7613
8681
  "docsTags": []
7614
8682
  }
7615
8683
  ],
7616
- "listeners": [],
8684
+ "listeners": [
8685
+ {
8686
+ "event": "invalid",
8687
+ "capture": false,
8688
+ "passive": false
8689
+ }
8690
+ ],
7617
8691
  "styles": [],
7618
8692
  "slots": [
7619
8693
  {
7620
8694
  "name": "default",
7621
- "docs": "Native `<option>` or `<optgroup>` elements."
8695
+ "docs": "Native `<option>` or `<optgroup>` elements. Never rendered directly; read once\nassigned to build the internal `role=\"option\"` listbox, and re-read on structural slot changes\nor in-place mutation (attribute/text/subtree) of already-slotted elements. `<option selected>`\ndetermines the initial value when the `value` prop is not set."
7622
8696
  }
7623
8697
  ],
7624
8698
  "parts": [],
7625
8699
  "states": [],
7626
8700
  "dependents": [],
7627
- "dependencies": [],
7628
- "dependencyGraph": {}
8701
+ "dependencies": [
8702
+ "lmvz-popover"
8703
+ ],
8704
+ "dependencyGraph": {
8705
+ "lmvz-select": [
8706
+ "lmvz-popover"
8707
+ ]
8708
+ }
7629
8709
  },
7630
8710
  {
7631
8711
  "filePath": "src/components/lmvz-snackbar/lmvz-snackbar.tsx",
@@ -8697,6 +9777,28 @@
8697
9777
  "docs": "Returns the native HTMLInputElement.\n\nPromise resolves when the element is ready and the input is available.",
8698
9778
  "docsTags": []
8699
9779
  },
9780
+ {
9781
+ "name": "getValidationMessage",
9782
+ "returns": {
9783
+ "type": "Promise<string>",
9784
+ "docs": ""
9785
+ },
9786
+ "complexType": {
9787
+ "signature": "() => Promise<string>",
9788
+ "parameters": [],
9789
+ "references": {
9790
+ "Promise": {
9791
+ "location": "global",
9792
+ "id": "global::Promise"
9793
+ }
9794
+ },
9795
+ "return": "Promise<string>"
9796
+ },
9797
+ "signature": "getValidationMessage() => Promise<string>",
9798
+ "parameters": [],
9799
+ "docs": "Returns the current validation message, if any.",
9800
+ "docsTags": []
9801
+ },
8700
9802
  {
8701
9803
  "name": "reportValidity",
8702
9804
  "returns": {
@@ -8762,6 +9864,21 @@
8762
9864
  "docstring": "",
8763
9865
  "path": "src/api/ds.types.d.ts"
8764
9866
  },
9867
+ "../../lib/ts/src/date/IsoDateString.d.ts::IsoYearMonthString": {
9868
+ "declaration": "`${number}-${number}`",
9869
+ "docstring": "",
9870
+ "path": "../../lib/ts/src/date/IsoDateString.d.ts"
9871
+ },
9872
+ "../../lib/ts/src/date/IsoDateString.d.ts::IsoDateString": {
9873
+ "declaration": "`${number}-${number}-${number}`",
9874
+ "docstring": "",
9875
+ "path": "../../lib/ts/src/date/IsoDateString.d.ts"
9876
+ },
9877
+ "src/api/index.d.ts::Datepicker": {
9878
+ "declaration": "any",
9879
+ "docstring": "",
9880
+ "path": "src/api/index.d.ts"
9881
+ },
8765
9882
  "../../lib/ts/dist/validation/SVGString.d.ts::SVGString": {
8766
9883
  "declaration": "export type SVGString = string & Brand.Brand<'SVG'>;",
8767
9884
  "docstring": "",