@lmvz-ds/components 0.33.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/cjs/async.util-BQ60l-WC.js +20 -0
  3. package/cjs/{ds.constants-CKeXfK-s.js → ds.constants-C6eKRAEu.js} +5 -1
  4. package/cjs/{element.util-Cq4y-_iX.js → element.util-Dbyc8yUG.js} +35 -0
  5. package/cjs/index.cjs.js +3 -1
  6. package/cjs/{list-keyboard-controller-StN6Yn8W.js → list-keyboard-controller-Dm5S_l0D.js} +1 -1
  7. package/cjs/lmvz-action-list.cjs.entry.js +11 -4
  8. package/cjs/lmvz-button-group.cjs.entry.js +3 -3
  9. package/cjs/lmvz-button_2.cjs.entry.js +3 -3
  10. package/cjs/lmvz-card.cjs.entry.js +1 -1
  11. package/cjs/lmvz-checkbox.cjs.entry.js +1 -1
  12. package/cjs/lmvz-chip.cjs.entry.js +2 -2
  13. package/cjs/lmvz-components.cjs.js +1 -1
  14. package/cjs/lmvz-header_2.cjs.entry.js +3 -3
  15. package/cjs/lmvz-input.cjs.entry.js +3 -2
  16. package/cjs/lmvz-link.cjs.entry.js +2 -2
  17. package/cjs/lmvz-menuitem.cjs.entry.js +1 -1
  18. package/cjs/lmvz-message.cjs.entry.js +1 -1
  19. package/cjs/lmvz-modal.cjs.entry.js +2 -2
  20. package/cjs/lmvz-popover.cjs.entry.js +1570 -0
  21. package/cjs/lmvz-radio.cjs.entry.js +2 -2
  22. package/cjs/lmvz-select.cjs.entry.js +2 -2
  23. package/cjs/lmvz-snackbar.cjs.entry.js +2 -2
  24. package/cjs/lmvz-spinner.cjs.entry.js +1 -1
  25. package/cjs/lmvz-tab.cjs.entry.js +2 -2
  26. package/cjs/lmvz-tabs.cjs.entry.js +4 -4
  27. package/cjs/lmvz-toggle.cjs.entry.js +4 -3
  28. package/cjs/loader.cjs.js +1 -1
  29. package/cjs/{stencil.util-DzvzXSwk.js → stencil.util-DxdYjVoH.js} +2 -10
  30. package/collection/api/ds.constants.js +3 -1
  31. package/collection/collection-manifest.json +1 -0
  32. package/collection/components/lmvz-action-list/lmvz-action-list.css +151 -39
  33. package/collection/components/lmvz-action-list/lmvz-action-list.js +9 -1
  34. package/collection/components/lmvz-button/lmvz-button.css +15 -19
  35. package/collection/components/lmvz-button/lmvz-button.js +1 -1
  36. package/collection/components/lmvz-button-group/lmvz-button-group.css +1 -2
  37. package/collection/components/lmvz-card/lmvz-card.css +20 -23
  38. package/collection/components/lmvz-checkbox/lmvz-checkbox.css +9 -12
  39. package/collection/components/lmvz-chip/lmvz-chip.css +20 -20
  40. package/collection/components/lmvz-header/lmvz-header.css +3 -3
  41. package/collection/components/lmvz-icon/lmvz-icon.css +1 -1
  42. package/collection/components/lmvz-input/lmvz-input.css +3 -3
  43. package/collection/components/lmvz-link/lmvz-link.css +6 -4
  44. package/collection/components/lmvz-menuitem/lmvz-menuitem.css +1 -2
  45. package/collection/components/lmvz-message/lmvz-message.css +5 -5
  46. package/collection/components/lmvz-modal/lmvz-modal.css +6 -7
  47. package/collection/components/lmvz-popover/lmvz-popover.css +46 -0
  48. package/collection/components/lmvz-popover/lmvz-popover.js +470 -0
  49. package/collection/components/lmvz-radio/lmvz-radio.css +10 -12
  50. package/collection/components/lmvz-radio/lmvz-radio.js +1 -1
  51. package/collection/components/lmvz-select/lmvz-select.css +5 -5
  52. package/collection/components/lmvz-select/lmvz-select.js +1 -1
  53. package/collection/components/lmvz-snackbar/lmvz-snackbar.css +13 -13
  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.css +9 -9
  57. package/collection/components/lmvz-tab/lmvz-tab.js +1 -1
  58. package/collection/components/lmvz-tabs/lmvz-tabs.css +2 -2
  59. package/collection/components/lmvz-tabs/lmvz-tabs.js +1 -1
  60. package/collection/components/lmvz-toggle/lmvz-toggle.css +4 -5
  61. package/collection/components/lmvz-toggle/lmvz-toggle.js +1 -1
  62. package/collection/integration/header-integration/header-integration.js +1 -1
  63. package/collection/utils/async/async.util.js +6 -0
  64. package/collection/utils/element/element.util.js +33 -0
  65. package/components/index.d.ts +2 -0
  66. package/components/index.d.ts.bak +2 -0
  67. package/components/index.js +1 -1
  68. package/components/lmvz-action-list.js +1 -1
  69. package/components/lmvz-button-group.js +1 -1
  70. package/components/lmvz-button.js +1 -1
  71. package/components/lmvz-card.js +1 -1
  72. package/components/lmvz-checkbox.js +1 -1
  73. package/components/lmvz-chip.js +1 -1
  74. package/components/lmvz-header.js +1 -1
  75. package/components/lmvz-icon.js +1 -1
  76. package/components/lmvz-input.js +1 -1
  77. package/components/lmvz-link.js +1 -1
  78. package/components/lmvz-menuitem.js +1 -1
  79. package/components/lmvz-message.js +1 -1
  80. package/components/lmvz-modal.js +1 -1
  81. package/components/lmvz-popover.d.ts +11 -0
  82. package/components/lmvz-popover.d.ts.bak +11 -0
  83. package/components/lmvz-popover.js +1 -0
  84. package/components/lmvz-radio.js +1 -1
  85. package/components/lmvz-select.js +1 -1
  86. package/components/lmvz-snackbar.js +1 -1
  87. package/components/lmvz-spinner.js +1 -1
  88. package/components/lmvz-tab.js +1 -1
  89. package/components/lmvz-tabs.js +1 -1
  90. package/components/lmvz-toggle.js +1 -1
  91. package/components/p-0ctLESas.js +1 -0
  92. package/components/p-BhSTYZC6.js +1 -0
  93. package/components/{p-CxfT9IA1.js → p-CK3Ixl1K.js} +1 -1
  94. package/components/{p-B4m1n4et.js → p-D-2gj6LP.js} +1 -1
  95. package/components/{p-Rf10bzJY.js → p-D7S1WiEC.js} +1 -1
  96. package/components/p-D9nUtvTm.js +1 -0
  97. package/components/{p-De-xQqdU.js → p-DbIm98qX.js} +1 -1
  98. package/components/p-JtkmlmeY.js +1 -0
  99. package/esm/async.util-D9nUtvTm.js +17 -0
  100. package/esm/{ds.constants-DuEtnKRj.js → ds.constants-0ctLESas.js} +4 -2
  101. package/esm/{element.util-CxfT9IA1.js → element.util-B0eCxdyI.js} +34 -1
  102. package/esm/index.js +1 -1
  103. package/esm/{list-keyboard-controller-BKa9Kd2t.js → list-keyboard-controller-tle6IRkv.js} +1 -1
  104. package/esm/lmvz-action-list.entry.js +11 -4
  105. package/esm/lmvz-button-group.entry.js +3 -3
  106. package/esm/lmvz-button_2.entry.js +3 -3
  107. package/esm/lmvz-card.entry.js +1 -1
  108. package/esm/lmvz-checkbox.entry.js +1 -1
  109. package/esm/lmvz-chip.entry.js +2 -2
  110. package/esm/lmvz-components.js +1 -1
  111. package/esm/lmvz-header_2.entry.js +3 -3
  112. package/esm/lmvz-input.entry.js +3 -2
  113. package/esm/lmvz-link.entry.js +2 -2
  114. package/esm/lmvz-menuitem.entry.js +1 -1
  115. package/esm/lmvz-message.entry.js +1 -1
  116. package/esm/lmvz-modal.entry.js +2 -2
  117. package/esm/lmvz-popover.entry.js +1568 -0
  118. package/esm/lmvz-radio.entry.js +2 -2
  119. package/esm/lmvz-select.entry.js +2 -2
  120. package/esm/lmvz-snackbar.entry.js +2 -2
  121. package/esm/lmvz-spinner.entry.js +1 -1
  122. package/esm/lmvz-tab.entry.js +2 -2
  123. package/esm/lmvz-tabs.entry.js +4 -4
  124. package/esm/lmvz-toggle.entry.js +4 -3
  125. package/esm/loader.js +1 -1
  126. package/esm/{stencil.util-CJRqhXjK.js → stencil.util-wGFRYLwZ.js} +1 -9
  127. package/hydrate/index.js +1660 -33
  128. package/hydrate/index.mjs +1660 -33
  129. package/lmvz-components/index.esm.js +1 -1
  130. package/lmvz-components/lmvz-components.esm.js +1 -1
  131. package/lmvz-components/{p-47824515.entry.js → p-0c05f24b.entry.js} +1 -1
  132. package/lmvz-components/p-0ctLESas.js +1 -0
  133. package/lmvz-components/{p-8be4dbb7.entry.js → p-1d2c11ea.entry.js} +1 -1
  134. package/lmvz-components/{p-3da087f4.entry.js → p-49e98627.entry.js} +1 -1
  135. package/lmvz-components/p-4c68d21a.entry.js +1 -0
  136. package/lmvz-components/p-50063516.entry.js +1 -0
  137. package/lmvz-components/{p-24125bcf.entry.js → p-5bbbcfc0.entry.js} +1 -1
  138. package/lmvz-components/p-76be3fc9.entry.js +1 -0
  139. package/lmvz-components/{p-703b10b5.entry.js → p-854f1c72.entry.js} +1 -1
  140. package/lmvz-components/p-886e42c7.entry.js +1 -0
  141. package/lmvz-components/{p-6140866f.entry.js → p-8fb4c347.entry.js} +1 -1
  142. package/lmvz-components/p-9f8fd077.entry.js +1 -0
  143. package/lmvz-components/{p-CxfT9IA1.js → p-B0eCxdyI.js} +1 -1
  144. package/lmvz-components/p-BhSTYZC6.js +1 -0
  145. package/lmvz-components/p-D9nUtvTm.js +1 -0
  146. package/lmvz-components/{p-B4m1n4et.js → p-DuLiExhX.js} +1 -1
  147. package/lmvz-components/{p-b4aa0978.entry.js → p-a4ef8e55.entry.js} +1 -1
  148. package/lmvz-components/p-bc237ab7.entry.js +1 -0
  149. package/lmvz-components/{p-3a644b99.entry.js → p-c082390b.entry.js} +1 -1
  150. package/lmvz-components/{p-b79af711.entry.js → p-c2544495.entry.js} +1 -1
  151. package/lmvz-components/p-c494bf8f.entry.js +1 -0
  152. package/lmvz-components/{p-48a7b033.entry.js → p-c87e2281.entry.js} +1 -1
  153. package/lmvz-components/{p-00ccaea4.entry.js → p-cb75c951.entry.js} +1 -1
  154. package/lmvz-components/{p-44781f01.entry.js → p-e0432f54.entry.js} +1 -1
  155. package/lmvz-components/{p-25a78ead.entry.js → p-ecbd9e93.entry.js} +1 -1
  156. package/manifest.json +386 -3
  157. package/package.json +5 -1
  158. package/types/api/ds.constants.d.ts +3 -1
  159. package/types/api/ds.types.d.ts +7 -0
  160. package/types/components/lmvz-popover/lmvz-popover.d.ts +37 -0
  161. package/types/components.d.ts +108 -1
  162. package/types/utils/async/async.util.d.ts +3 -0
  163. package/types/utils/element/element.util.d.ts +2 -0
  164. package/components/p-Bld_XR3X.js +0 -1
  165. package/components/p-CJRqhXjK.js +0 -1
  166. package/components/p-DuEtnKRj.js +0 -1
  167. package/lmvz-components/p-4072b2fb.entry.js +0 -1
  168. package/lmvz-components/p-8c7d9eaf.entry.js +0 -1
  169. package/lmvz-components/p-92d02c56.entry.js +0 -1
  170. package/lmvz-components/p-933e6033.entry.js +0 -1
  171. package/lmvz-components/p-CJRqhXjK.js +0 -1
  172. package/lmvz-components/p-DuEtnKRj.js +0 -1
  173. package/lmvz-components/p-d9619a4f.entry.js +0 -1
  174. package/lmvz-components/p-e1758128.entry.js +0 -1
package/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2026-06-24T11:33:28",
2
+ "timestamp": "2026-06-29T10:54:10",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.43.5",
@@ -456,10 +456,10 @@
456
456
  },
457
457
  {
458
458
  "name": "variant",
459
- "type": "\"primary\" | \"secondary\" | \"tertiary\" | undefined",
459
+ "type": "\"danger\" | \"primary\" | \"secondary\" | \"tertiary\" | undefined",
460
460
  "complexType": {
461
461
  "original": "Button.Variant",
462
- "resolved": "\"primary\" | \"secondary\" | \"tertiary\" | undefined",
462
+ "resolved": "\"danger\" | \"primary\" | \"secondary\" | \"tertiary\" | undefined",
463
463
  "references": {
464
464
  "Button": {
465
465
  "location": "import",
@@ -480,6 +480,10 @@
480
480
  }
481
481
  ],
482
482
  "values": [
483
+ {
484
+ "value": "danger",
485
+ "type": "string"
486
+ },
483
487
  {
484
488
  "value": "primary",
485
489
  "type": "string"
@@ -6502,6 +6506,380 @@
6502
6506
  ]
6503
6507
  }
6504
6508
  },
6509
+ {
6510
+ "filePath": "src/components/lmvz-popover/lmvz-popover.tsx",
6511
+ "encapsulation": "shadow",
6512
+ "tag": "lmvz-popover",
6513
+ "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",
6514
+ "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.",
6515
+ "docsTags": [
6516
+ {
6517
+ "name": "slot",
6518
+ "text": "default - Popover content. Any element may be slotted here."
6519
+ }
6520
+ ],
6521
+ "usage": {},
6522
+ "props": [
6523
+ {
6524
+ "name": "anchor",
6525
+ "type": "HTMLElement | string | undefined",
6526
+ "complexType": {
6527
+ "original": "string | HTMLElement",
6528
+ "resolved": "HTMLElement | string | undefined",
6529
+ "references": {
6530
+ "HTMLElement": {
6531
+ "location": "global",
6532
+ "id": "global::HTMLElement"
6533
+ }
6534
+ }
6535
+ },
6536
+ "mutable": false,
6537
+ "attr": "anchor",
6538
+ "reflectToAttr": false,
6539
+ "docs": "The anchor element or its id. Used for positioning.",
6540
+ "docsTags": [],
6541
+ "values": [
6542
+ {
6543
+ "type": "HTMLElement"
6544
+ },
6545
+ {
6546
+ "type": "string"
6547
+ },
6548
+ {
6549
+ "type": "undefined"
6550
+ }
6551
+ ],
6552
+ "optional": true,
6553
+ "required": false,
6554
+ "getter": false,
6555
+ "setter": false
6556
+ },
6557
+ {
6558
+ "name": "autoFocus",
6559
+ "type": "boolean",
6560
+ "complexType": {
6561
+ "original": "boolean",
6562
+ "resolved": "boolean",
6563
+ "references": {}
6564
+ },
6565
+ "mutable": false,
6566
+ "attr": "auto-focus",
6567
+ "reflectToAttr": false,
6568
+ "docs": "Whether to move focus to the first focusable element on open.",
6569
+ "docsTags": [
6570
+ {
6571
+ "name": "default",
6572
+ "text": "true"
6573
+ }
6574
+ ],
6575
+ "default": "true",
6576
+ "values": [
6577
+ {
6578
+ "type": "boolean"
6579
+ }
6580
+ ],
6581
+ "optional": false,
6582
+ "required": false,
6583
+ "getter": false,
6584
+ "setter": false
6585
+ },
6586
+ {
6587
+ "name": "label",
6588
+ "type": "string | undefined",
6589
+ "complexType": {
6590
+ "original": "string",
6591
+ "resolved": "string | undefined",
6592
+ "references": {}
6593
+ },
6594
+ "mutable": false,
6595
+ "attr": "label",
6596
+ "reflectToAttr": false,
6597
+ "docs": "Accessible label for the popover container.",
6598
+ "docsTags": [],
6599
+ "values": [
6600
+ {
6601
+ "type": "string"
6602
+ },
6603
+ {
6604
+ "type": "undefined"
6605
+ }
6606
+ ],
6607
+ "optional": true,
6608
+ "required": false,
6609
+ "getter": false,
6610
+ "setter": false
6611
+ },
6612
+ {
6613
+ "name": "open",
6614
+ "type": "boolean",
6615
+ "complexType": {
6616
+ "original": "boolean",
6617
+ "resolved": "boolean",
6618
+ "references": {}
6619
+ },
6620
+ "mutable": true,
6621
+ "attr": "open",
6622
+ "reflectToAttr": true,
6623
+ "docs": "Whether the popover is open.",
6624
+ "docsTags": [
6625
+ {
6626
+ "name": "default",
6627
+ "text": "false"
6628
+ }
6629
+ ],
6630
+ "default": "false",
6631
+ "values": [
6632
+ {
6633
+ "type": "boolean"
6634
+ }
6635
+ ],
6636
+ "optional": false,
6637
+ "required": false,
6638
+ "getter": false,
6639
+ "setter": false
6640
+ },
6641
+ {
6642
+ "name": "placement",
6643
+ "type": "\"bottom\" | \"bottom-end\" | \"bottom-start\" | \"end\" | \"start\" | \"top\" | \"top-end\" | \"top-start\"",
6644
+ "complexType": {
6645
+ "original": "Popover.Placement",
6646
+ "resolved": "\"bottom\" | \"bottom-end\" | \"bottom-start\" | \"end\" | \"start\" | \"top\" | \"top-end\" | \"top-start\"",
6647
+ "references": {
6648
+ "Popover": {
6649
+ "location": "import",
6650
+ "path": "../../api",
6651
+ "id": "src/api/index.d.ts::Popover",
6652
+ "referenceLocation": "Popover"
6653
+ }
6654
+ }
6655
+ },
6656
+ "mutable": false,
6657
+ "attr": "placement",
6658
+ "reflectToAttr": false,
6659
+ "docs": "Preferred placement relative to the anchor.",
6660
+ "docsTags": [
6661
+ {
6662
+ "name": "default",
6663
+ "text": "'bottom-start'"
6664
+ }
6665
+ ],
6666
+ "default": "'bottom-start'",
6667
+ "values": [
6668
+ {
6669
+ "value": "bottom",
6670
+ "type": "string"
6671
+ },
6672
+ {
6673
+ "value": "bottom-end",
6674
+ "type": "string"
6675
+ },
6676
+ {
6677
+ "value": "bottom-start",
6678
+ "type": "string"
6679
+ },
6680
+ {
6681
+ "value": "end",
6682
+ "type": "string"
6683
+ },
6684
+ {
6685
+ "value": "start",
6686
+ "type": "string"
6687
+ },
6688
+ {
6689
+ "value": "top",
6690
+ "type": "string"
6691
+ },
6692
+ {
6693
+ "value": "top-end",
6694
+ "type": "string"
6695
+ },
6696
+ {
6697
+ "value": "top-start",
6698
+ "type": "string"
6699
+ }
6700
+ ],
6701
+ "optional": false,
6702
+ "required": false,
6703
+ "getter": false,
6704
+ "setter": false
6705
+ },
6706
+ {
6707
+ "name": "size",
6708
+ "type": "\"lg\" | \"md\" | \"sm\"",
6709
+ "complexType": {
6710
+ "original": "Popover.Size",
6711
+ "resolved": "\"lg\" | \"md\" | \"sm\"",
6712
+ "references": {
6713
+ "Popover": {
6714
+ "location": "import",
6715
+ "path": "../../api",
6716
+ "id": "src/api/index.d.ts::Popover",
6717
+ "referenceLocation": "Popover"
6718
+ }
6719
+ }
6720
+ },
6721
+ "mutable": false,
6722
+ "attr": "size",
6723
+ "reflectToAttr": false,
6724
+ "docs": "Controls the size variant of the card surface.",
6725
+ "docsTags": [
6726
+ {
6727
+ "name": "default",
6728
+ "text": "'sm'"
6729
+ }
6730
+ ],
6731
+ "default": "'sm'",
6732
+ "values": [
6733
+ {
6734
+ "value": "lg",
6735
+ "type": "string"
6736
+ },
6737
+ {
6738
+ "value": "md",
6739
+ "type": "string"
6740
+ },
6741
+ {
6742
+ "value": "sm",
6743
+ "type": "string"
6744
+ }
6745
+ ],
6746
+ "optional": false,
6747
+ "required": false,
6748
+ "getter": false,
6749
+ "setter": false
6750
+ }
6751
+ ],
6752
+ "methods": [
6753
+ {
6754
+ "name": "hide",
6755
+ "returns": {
6756
+ "type": "Promise<void>",
6757
+ "docs": ""
6758
+ },
6759
+ "complexType": {
6760
+ "signature": "() => Promise<void>",
6761
+ "parameters": [],
6762
+ "references": {
6763
+ "Promise": {
6764
+ "location": "global",
6765
+ "id": "global::Promise"
6766
+ }
6767
+ },
6768
+ "return": "Promise<void>"
6769
+ },
6770
+ "signature": "hide() => Promise<void>",
6771
+ "parameters": [],
6772
+ "docs": "Closes the popover, firing lmvzCancel first. If cancelled, the popover stays open.",
6773
+ "docsTags": []
6774
+ },
6775
+ {
6776
+ "name": "show",
6777
+ "returns": {
6778
+ "type": "Promise<void>",
6779
+ "docs": ""
6780
+ },
6781
+ "complexType": {
6782
+ "signature": "() => Promise<void>",
6783
+ "parameters": [],
6784
+ "references": {
6785
+ "Promise": {
6786
+ "location": "global",
6787
+ "id": "global::Promise"
6788
+ }
6789
+ },
6790
+ "return": "Promise<void>"
6791
+ },
6792
+ "signature": "show() => Promise<void>",
6793
+ "parameters": [],
6794
+ "docs": "Opens the popover.",
6795
+ "docsTags": []
6796
+ },
6797
+ {
6798
+ "name": "toggle",
6799
+ "returns": {
6800
+ "type": "Promise<void>",
6801
+ "docs": ""
6802
+ },
6803
+ "complexType": {
6804
+ "signature": "() => Promise<void>",
6805
+ "parameters": [],
6806
+ "references": {
6807
+ "Promise": {
6808
+ "location": "global",
6809
+ "id": "global::Promise"
6810
+ }
6811
+ },
6812
+ "return": "Promise<void>"
6813
+ },
6814
+ "signature": "toggle() => Promise<void>",
6815
+ "parameters": [],
6816
+ "docs": "Toggles the popover open state.",
6817
+ "docsTags": []
6818
+ }
6819
+ ],
6820
+ "events": [
6821
+ {
6822
+ "event": "lmvzCancel",
6823
+ "detail": "void",
6824
+ "bubbles": true,
6825
+ "complexType": {
6826
+ "original": "void",
6827
+ "resolved": "void",
6828
+ "references": {}
6829
+ },
6830
+ "cancelable": true,
6831
+ "composed": true,
6832
+ "docs": "Fired before light-dismiss or Escape close.\nCall `event.preventDefault()` to veto the close.",
6833
+ "docsTags": []
6834
+ },
6835
+ {
6836
+ "event": "lmvzClose",
6837
+ "detail": "void",
6838
+ "bubbles": true,
6839
+ "complexType": {
6840
+ "original": "void",
6841
+ "resolved": "void",
6842
+ "references": {}
6843
+ },
6844
+ "cancelable": true,
6845
+ "composed": true,
6846
+ "docs": "Fired after the popover closes.",
6847
+ "docsTags": []
6848
+ },
6849
+ {
6850
+ "event": "lmvzOpen",
6851
+ "detail": "void",
6852
+ "bubbles": true,
6853
+ "complexType": {
6854
+ "original": "void",
6855
+ "resolved": "void",
6856
+ "references": {}
6857
+ },
6858
+ "cancelable": true,
6859
+ "composed": true,
6860
+ "docs": "Fired after the popover opens.",
6861
+ "docsTags": []
6862
+ }
6863
+ ],
6864
+ "listeners": [],
6865
+ "styles": [],
6866
+ "slots": [
6867
+ {
6868
+ "name": "default",
6869
+ "docs": "Popover content. Any element may be slotted here."
6870
+ }
6871
+ ],
6872
+ "parts": [
6873
+ {
6874
+ "name": "container",
6875
+ "docs": ""
6876
+ }
6877
+ ],
6878
+ "states": [],
6879
+ "dependents": [],
6880
+ "dependencies": [],
6881
+ "dependencyGraph": {}
6882
+ },
6505
6883
  {
6506
6884
  "filePath": "src/components/lmvz-radio/lmvz-radio.tsx",
6507
6885
  "encapsulation": "scoped",
@@ -8335,6 +8713,11 @@
8335
8713
  "docstring": "",
8336
8714
  "path": "src/api/index.d.ts"
8337
8715
  },
8716
+ "src/api/index.d.ts::Popover": {
8717
+ "declaration": "any",
8718
+ "docstring": "",
8719
+ "path": "src/api/index.d.ts"
8720
+ },
8338
8721
  "src/api/index.d.ts::Select": {
8339
8722
  "declaration": "any",
8340
8723
  "docstring": "",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lmvz-ds/components",
3
3
  "private": false,
4
- "version": "0.33.0",
4
+ "version": "0.35.0",
5
5
  "type": "module",
6
6
  "description": "The components of the design system",
7
7
  "author": "Patrick Nemenz <patrick.nemenz@adesso.at>",
@@ -115,6 +115,10 @@
115
115
  "./lmvz-action-list": {
116
116
  "import": "./components/lmvz-action-list.js",
117
117
  "types": "./components/lmvz-action-list.d.ts"
118
+ },
119
+ "./lmvz-popover": {
120
+ "import": "./components/lmvz-popover.js",
121
+ "types": "./components/lmvz-popover.d.ts"
118
122
  }
119
123
  },
120
124
  "main": "./index.cjs.js",
@@ -1,4 +1,4 @@
1
- export declare const variants: readonly ["primary", "secondary", "tertiary"];
1
+ export declare const variants: readonly ["primary", "secondary", "tertiary", "danger"];
2
2
  export declare const scaleValues: readonly ["small", "default", "large"];
3
3
  export declare const sizes: readonly ["xs", "sm", "md", "lg"];
4
4
  export declare const textSizes: readonly ["xs", "sm", "md", "lg", "xl"];
@@ -14,3 +14,5 @@ export declare const messageTypes: readonly ["neutral", "warning"];
14
14
  export declare const snackbarStatuses: readonly ["success", "warning", "error"];
15
15
  export declare const snackbarPriorities: readonly ["low", "normal", "high"];
16
16
  export declare const snackbarDismissReasons: readonly ["timeout", "manual", "action", "overridden", "swallowed"];
17
+ export declare const popoverPlacements: readonly ["top", "bottom", "start", "end", "top-start", "top-end", "bottom-start", "bottom-end"];
18
+ export declare const popoverSizes: readonly ["sm", "md", "lg"];
@@ -7,6 +7,8 @@ import type {
7
7
  inputTypes,
8
8
  linkTypes,
9
9
  messageTypes,
10
+ popoverPlacements,
11
+ popoverSizes,
10
12
  scaleValues,
11
13
  selectSizes,
12
14
  sizes,
@@ -67,5 +69,10 @@ export namespace Snackbar {
67
69
  export type DismissReason = (typeof snackbarDismissReasons)[number];
68
70
  }
69
71
 
72
+ export namespace Popover {
73
+ export type Placement = (typeof popoverPlacements)[number];
74
+ export type Size = (typeof popoverSizes)[number];
75
+ }
76
+
70
77
  export type Attributes = { [key: string]: unknown };
71
78
  export type FormRef = string | HTMLFormElement | undefined;
@@ -0,0 +1,37 @@
1
+ import { type EventEmitter } from '../../stencil-public-runtime';
2
+ import type { Popover } from '../../api';
3
+ export declare class LmvzPopover {
4
+ readonly el: HTMLElement;
5
+ private readonly closureController;
6
+ private containerEl?;
7
+ private slotEl?;
8
+ private previouslyFocusedElement;
9
+ open: boolean;
10
+ anchor?: string | HTMLElement;
11
+ placement: Popover.Placement;
12
+ size: Popover.Size;
13
+ autoFocus: boolean;
14
+ label?: string;
15
+ lmvzOpen: EventEmitter<void>;
16
+ lmvzClose: EventEmitter<void>;
17
+ lmvzCancel: EventEmitter<void>;
18
+ show(): Promise<void>;
19
+ hide(): Promise<void>;
20
+ toggle(): Promise<void>;
21
+ componentDidLoad(): void;
22
+ protected handleOpenChange(isOpen: boolean): void;
23
+ protected handleAnchorChange(): void;
24
+ disconnectedCallback(): void;
25
+ private resolveAnchor;
26
+ private updatePosition;
27
+ private onOpen;
28
+ private onClose;
29
+ private applyAnchorAriaOpen;
30
+ private applyAnchorAriaClose;
31
+ private focusFirst;
32
+ private restoreFocus;
33
+ private triggerClose;
34
+ private setupCloseHandlers;
35
+ private removeCloseHandlers;
36
+ render(): any;
37
+ }
@@ -492,6 +492,48 @@ export declare namespace Components {
492
492
  */
493
493
  "open": boolean;
494
494
  }
495
+ export interface LmvzPopover {
496
+ /**
497
+ * The anchor element or its id. Used for positioning.
498
+ */
499
+ "anchor"?: string | HTMLElement;
500
+ /**
501
+ * Whether to move focus to the first focusable element on open.
502
+ * @default true
503
+ */
504
+ "autoFocus": boolean;
505
+ /**
506
+ * Closes the popover, firing lmvzCancel first. If cancelled, the popover stays open.
507
+ */
508
+ "hide": () => Promise<void>;
509
+ /**
510
+ * Accessible label for the popover container.
511
+ */
512
+ "label"?: string;
513
+ /**
514
+ * Whether the popover is open.
515
+ * @default false
516
+ */
517
+ "open": boolean;
518
+ /**
519
+ * Preferred placement relative to the anchor.
520
+ * @default 'bottom-start'
521
+ */
522
+ "placement": Popover.Placement;
523
+ /**
524
+ * Opens the popover.
525
+ */
526
+ "show": () => Promise<void>;
527
+ /**
528
+ * Controls the size variant of the card surface.
529
+ * @default 'sm'
530
+ */
531
+ "size": Popover.Size;
532
+ /**
533
+ * Toggles the popover open state.
534
+ */
535
+ "toggle": () => Promise<void>;
536
+ }
495
537
  /**
496
538
  * Radio button component with form association, ARIA validation, accessible label support,
497
539
  * and ARIA APG-compliant Arrow-key keyboard navigation.
@@ -1294,6 +1336,48 @@ export declare namespace JSX {
1294
1336
  */
1295
1337
  "open"?: boolean;
1296
1338
  }
1339
+ export interface LmvzPopover {
1340
+ /**
1341
+ * The anchor element or its id. Used for positioning.
1342
+ */
1343
+ "anchor"?: string | HTMLElement;
1344
+ /**
1345
+ * Whether to move focus to the first focusable element on open.
1346
+ * @default true
1347
+ */
1348
+ "autoFocus"?: boolean;
1349
+ /**
1350
+ * Accessible label for the popover container.
1351
+ */
1352
+ "label"?: string;
1353
+ /**
1354
+ * Fired before light-dismiss or Escape close. Call `event.preventDefault()` to veto the close.
1355
+ */
1356
+ "onLmvzCancel"?: (event: LmvzPopoverCustomEvent<void>) => void;
1357
+ /**
1358
+ * Fired after the popover closes.
1359
+ */
1360
+ "onLmvzClose"?: (event: LmvzPopoverCustomEvent<void>) => void;
1361
+ /**
1362
+ * Fired after the popover opens.
1363
+ */
1364
+ "onLmvzOpen"?: (event: LmvzPopoverCustomEvent<void>) => void;
1365
+ /**
1366
+ * Whether the popover is open.
1367
+ * @default false
1368
+ */
1369
+ "open"?: boolean;
1370
+ /**
1371
+ * Preferred placement relative to the anchor.
1372
+ * @default 'bottom-start'
1373
+ */
1374
+ "placement"?: Popover.Placement;
1375
+ /**
1376
+ * Controls the size variant of the card surface.
1377
+ * @default 'sm'
1378
+ */
1379
+ "size"?: Popover.Size;
1380
+ }
1297
1381
  /**
1298
1382
  * Radio button component with form association, ARIA validation, accessible label support,
1299
1383
  * and ARIA APG-compliant Arrow-key keyboard navigation.
@@ -1672,6 +1756,14 @@ export declare namespace JSX {
1672
1756
  "open": boolean;
1673
1757
  "closeLabel": string;
1674
1758
  }
1759
+ export interface LmvzPopoverAttributes {
1760
+ "open": boolean;
1761
+ "anchor": string | HTMLElement;
1762
+ "placement": Popover.Placement;
1763
+ "size": Popover.Size;
1764
+ "autoFocus": boolean;
1765
+ "label": string;
1766
+ }
1675
1767
  export interface LmvzRadioAttributes {
1676
1768
  "label": string;
1677
1769
  "checked": boolean;
@@ -1740,6 +1832,7 @@ export declare namespace JSX {
1740
1832
  "lmvz-menuitem": Omit<LmvzMenuitem, keyof LmvzMenuitemAttributes> & { [K in keyof LmvzMenuitem & keyof LmvzMenuitemAttributes]?: LmvzMenuitem[K] } & { [K in keyof LmvzMenuitem & keyof LmvzMenuitemAttributes as `attr:${K}`]?: LmvzMenuitemAttributes[K] } & { [K in keyof LmvzMenuitem & keyof LmvzMenuitemAttributes as `prop:${K}`]?: LmvzMenuitem[K] };
1741
1833
  "lmvz-message": Omit<LmvzMessage, keyof LmvzMessageAttributes> & { [K in keyof LmvzMessage & keyof LmvzMessageAttributes]?: LmvzMessage[K] } & { [K in keyof LmvzMessage & keyof LmvzMessageAttributes as `attr:${K}`]?: LmvzMessageAttributes[K] } & { [K in keyof LmvzMessage & keyof LmvzMessageAttributes as `prop:${K}`]?: LmvzMessage[K] };
1742
1834
  "lmvz-modal": Omit<LmvzModal, keyof LmvzModalAttributes> & { [K in keyof LmvzModal & keyof LmvzModalAttributes]?: LmvzModal[K] } & { [K in keyof LmvzModal & keyof LmvzModalAttributes as `attr:${K}`]?: LmvzModalAttributes[K] } & { [K in keyof LmvzModal & keyof LmvzModalAttributes as `prop:${K}`]?: LmvzModal[K] };
1835
+ "lmvz-popover": Omit<LmvzPopover, keyof LmvzPopoverAttributes> & { [K in keyof LmvzPopover & keyof LmvzPopoverAttributes]?: LmvzPopover[K] } & { [K in keyof LmvzPopover & keyof LmvzPopoverAttributes as `attr:${K}`]?: LmvzPopoverAttributes[K] } & { [K in keyof LmvzPopover & keyof LmvzPopoverAttributes as `prop:${K}`]?: LmvzPopover[K] };
1743
1836
  "lmvz-radio": Omit<LmvzRadio, keyof LmvzRadioAttributes> & { [K in keyof LmvzRadio & keyof LmvzRadioAttributes]?: LmvzRadio[K] } & { [K in keyof LmvzRadio & keyof LmvzRadioAttributes as `attr:${K}`]?: LmvzRadioAttributes[K] } & { [K in keyof LmvzRadio & keyof LmvzRadioAttributes as `prop:${K}`]?: LmvzRadio[K] } & OneOf<"label", LmvzRadio["label"], LmvzRadioAttributes["label"]>;
1744
1837
  "lmvz-select": Omit<LmvzSelect, keyof LmvzSelectAttributes> & { [K in keyof LmvzSelect & keyof LmvzSelectAttributes]?: LmvzSelect[K] } & { [K in keyof LmvzSelect & keyof LmvzSelectAttributes as `attr:${K}`]?: LmvzSelectAttributes[K] } & { [K in keyof LmvzSelect & keyof LmvzSelectAttributes as `prop:${K}`]?: LmvzSelect[K] } & OneOf<"label", LmvzSelect["label"], LmvzSelectAttributes["label"]>;
1745
1838
  "lmvz-snackbar": Omit<LmvzSnackbar, keyof LmvzSnackbarAttributes> & { [K in keyof LmvzSnackbar & keyof LmvzSnackbarAttributes]?: LmvzSnackbar[K] } & { [K in keyof LmvzSnackbar & keyof LmvzSnackbarAttributes as `attr:${K}`]?: LmvzSnackbarAttributes[K] } & { [K in keyof LmvzSnackbar & keyof LmvzSnackbarAttributes as `prop:${K}`]?: LmvzSnackbar[K] };
@@ -1801,6 +1894,11 @@ export declare interface LmvzModalCustomEvent<T> extends CustomEvent<T> {
1801
1894
  target: HTMLLmvzModalElement;
1802
1895
  }
1803
1896
 
1897
+ export declare interface LmvzPopoverCustomEvent<T> extends CustomEvent<T> {
1898
+ detail: T;
1899
+ target: HTMLLmvzPopoverElement;
1900
+ }
1901
+
1804
1902
  export declare interface LmvzRadioCustomEvent<T> extends CustomEvent<T> {
1805
1903
  detail: T;
1806
1904
  target: HTMLLmvzRadioElement;
@@ -1832,6 +1930,15 @@ export declare namespace Message {
1832
1930
 
1833
1931
  declare const messageTypes: readonly ["neutral", "warning"];
1834
1932
 
1933
+ export declare namespace Popover {
1934
+ export type Placement = (typeof popoverPlacements)[number];
1935
+ export type Size = (typeof popoverSizes)[number];
1936
+ }
1937
+
1938
+ declare const popoverPlacements: readonly ["top", "bottom", "start", "end", "top-start", "top-end", "bottom-start", "bottom-end"];
1939
+
1940
+ declare const popoverSizes: readonly ["sm", "md", "lg"];
1941
+
1835
1942
  declare const scaleValues: readonly ["small", "default", "large"];
1836
1943
 
1837
1944
  export declare namespace Select {
@@ -1856,6 +1963,6 @@ declare const snackbarStatuses: readonly ["success", "warning", "error"];
1856
1963
 
1857
1964
  export declare type SVGString = string & Brand.Brand<'SVG'>;
1858
1965
 
1859
- declare const variants: readonly ["primary", "secondary", "tertiary"];
1966
+ declare const variants: readonly ["primary", "secondary", "tertiary", "danger"];
1860
1967
 
1861
1968
  export { }