@helixui/library 0.1.3 → 0.3.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 (183) hide show
  1. package/custom-elements.json +262 -67
  2. package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
  3. package/dist/components/hx-accordion/hx-accordion.d.ts +2 -0
  4. package/dist/components/hx-accordion/hx-accordion.d.ts.map +1 -1
  5. package/dist/components/hx-accordion/index.js +1 -1
  6. package/dist/components/hx-action-bar/hx-action-bar.d.ts +1 -0
  7. package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
  8. package/dist/components/hx-action-bar/index.js +1 -1
  9. package/dist/components/hx-alert/hx-alert.d.ts +1 -1
  10. package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
  11. package/dist/components/hx-alert/index.d.ts +1 -0
  12. package/dist/components/hx-alert/index.d.ts.map +1 -1
  13. package/dist/components/hx-avatar/hx-avatar.d.ts +1 -1
  14. package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
  15. package/dist/components/hx-avatar/hx-avatar.styles.d.ts.map +1 -1
  16. package/dist/components/hx-avatar/index.js +1 -1
  17. package/dist/components/hx-button/hx-button.d.ts +10 -4
  18. package/dist/components/hx-button/hx-button.d.ts.map +1 -1
  19. package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
  20. package/dist/components/hx-button/index.js +1 -1
  21. package/dist/components/hx-button-group/hx-button-group.d.ts +6 -3
  22. package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
  23. package/dist/components/hx-button-group/hx-button-group.styles.d.ts.map +1 -1
  24. package/dist/components/hx-button-group/index.js +1 -1
  25. package/dist/components/hx-card/hx-card.d.ts +9 -0
  26. package/dist/components/hx-card/hx-card.d.ts.map +1 -1
  27. package/dist/components/hx-card/index.js +1 -1
  28. package/dist/components/hx-checkbox/hx-checkbox.d.ts +3 -0
  29. package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
  30. package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
  31. package/dist/components/hx-checkbox/index.js +1 -1
  32. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +1 -0
  33. package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
  34. package/dist/components/hx-checkbox-group/index.js +1 -1
  35. package/dist/components/hx-code-snippet/hx-code-snippet.d.ts.map +1 -1
  36. package/dist/components/hx-code-snippet/index.js +1 -1
  37. package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
  38. package/dist/components/hx-color-picker/index.js +1 -1
  39. package/dist/components/hx-combobox/index.d.ts +1 -2
  40. package/dist/components/hx-combobox/index.d.ts.map +1 -1
  41. package/dist/components/hx-container/hx-container.d.ts +2 -0
  42. package/dist/components/hx-container/hx-container.d.ts.map +1 -1
  43. package/dist/components/hx-container/hx-container.styles.d.ts.map +1 -1
  44. package/dist/components/hx-container/index.js +1 -1
  45. package/dist/components/hx-dialog/index.js +1 -1
  46. package/dist/components/hx-divider/index.js +1 -1
  47. package/dist/components/hx-drawer/hx-drawer.d.ts +3 -2
  48. package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
  49. package/dist/components/hx-dropdown/index.d.ts +1 -1
  50. package/dist/components/hx-dropdown/index.d.ts.map +1 -1
  51. package/dist/components/hx-field/index.js +1 -1
  52. package/dist/components/hx-field-label/hx-field-label.d.ts +17 -7
  53. package/dist/components/hx-field-label/hx-field-label.d.ts.map +1 -1
  54. package/dist/components/hx-file-upload/hx-file-upload.d.ts +1 -0
  55. package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
  56. package/dist/components/hx-link/hx-link.d.ts +5 -1
  57. package/dist/components/hx-link/hx-link.d.ts.map +1 -1
  58. package/dist/components/hx-link/hx-link.styles.d.ts.map +1 -1
  59. package/dist/components/hx-link/index.js +1 -1
  60. package/dist/components/hx-menu/hx-menu-divider.d.ts.map +1 -1
  61. package/dist/components/hx-menu/hx-menu-divider.styles.d.ts +2 -0
  62. package/dist/components/hx-menu/hx-menu-divider.styles.d.ts.map +1 -0
  63. package/dist/components/hx-menu/hx-menu-item.d.ts +7 -0
  64. package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
  65. package/dist/components/hx-menu/hx-menu-item.styles.d.ts.map +1 -1
  66. package/dist/components/hx-menu/hx-menu.d.ts +11 -0
  67. package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
  68. package/dist/components/hx-menu/index.js +1 -1
  69. package/dist/components/hx-nav/hx-nav.d.ts +2 -0
  70. package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
  71. package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
  72. package/dist/components/hx-nav/index.js +1 -1
  73. package/dist/components/hx-number-input/hx-number-input.styles.d.ts.map +1 -1
  74. package/dist/components/hx-number-input/index.js +1 -1
  75. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts +3 -3
  76. package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
  77. package/dist/components/hx-progress-ring/index.js +1 -1
  78. package/dist/components/hx-radio-group/hx-radio-group.d.ts +1 -1
  79. package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
  80. package/dist/components/hx-radio-group/index.js +1 -1
  81. package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
  82. package/dist/components/hx-side-nav/index.js +1 -1
  83. package/dist/components/hx-slider/hx-slider.d.ts +2 -0
  84. package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
  85. package/dist/components/hx-slider/hx-slider.styles.d.ts.map +1 -1
  86. package/dist/components/hx-slider/index.js +1 -1
  87. package/dist/components/hx-split-panel/hx-split-panel.d.ts +1 -1
  88. package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
  89. package/dist/components/hx-split-panel/index.js +1 -1
  90. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts +2 -0
  91. package/dist/components/hx-status-indicator/hx-status-indicator.d.ts.map +1 -1
  92. package/dist/components/hx-status-indicator/index.d.ts +1 -2
  93. package/dist/components/hx-status-indicator/index.d.ts.map +1 -1
  94. package/dist/components/hx-status-indicator/index.js +1 -1
  95. package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
  96. package/dist/components/hx-switch/index.d.ts +1 -0
  97. package/dist/components/hx-switch/index.d.ts.map +1 -1
  98. package/dist/components/hx-textarea/hx-textarea.d.ts +7 -1
  99. package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
  100. package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
  101. package/dist/components/hx-textarea/index.js +1 -1
  102. package/dist/index.d.ts +11 -3
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +25 -25
  105. package/dist/shared/{hx-accordion-C84oGPj7.js → hx-accordion-D95XSAft.js} +33 -38
  106. package/dist/shared/hx-accordion-D95XSAft.js.map +1 -0
  107. package/dist/shared/{hx-action-bar-DxpGLABm.js → hx-action-bar-D43v5rA2.js} +11 -11
  108. package/dist/shared/hx-action-bar-D43v5rA2.js.map +1 -0
  109. package/dist/shared/hx-alert-BQpT4gL3.js.map +1 -1
  110. package/dist/shared/{hx-avatar-ekyZvOCm.js → hx-avatar-yHjmNdtf.js} +80 -58
  111. package/dist/shared/hx-avatar-yHjmNdtf.js.map +1 -0
  112. package/dist/shared/{hx-button-DpFW7PO3.js → hx-button-SAbf4_jC.js} +37 -30
  113. package/dist/shared/hx-button-SAbf4_jC.js.map +1 -0
  114. package/dist/shared/{hx-button-group-DxCwaWnu.js → hx-button-group-DET_Pkxt.js} +15 -26
  115. package/dist/shared/hx-button-group-DET_Pkxt.js.map +1 -0
  116. package/dist/shared/{hx-card-VdiB2Pc4.js → hx-card-DAkEfpJd.js} +12 -8
  117. package/dist/shared/hx-card-DAkEfpJd.js.map +1 -0
  118. package/dist/shared/{hx-checkbox-Dq2xXIvl.js → hx-checkbox-BMayOpAM.js} +13 -1
  119. package/dist/shared/hx-checkbox-BMayOpAM.js.map +1 -0
  120. package/dist/shared/{hx-checkbox-group-BLePVahw.js → hx-checkbox-group-CIIijwmc.js} +24 -24
  121. package/dist/shared/hx-checkbox-group-CIIijwmc.js.map +1 -0
  122. package/dist/shared/{hx-code-snippet-DjY96OY8.js → hx-code-snippet-DdEqy-1B.js} +3 -2
  123. package/dist/shared/{hx-code-snippet-DjY96OY8.js.map → hx-code-snippet-DdEqy-1B.js.map} +1 -1
  124. package/dist/shared/{hx-color-picker-O4b_6QXT.js → hx-color-picker-K2x_dyeG.js} +64 -66
  125. package/dist/shared/hx-color-picker-K2x_dyeG.js.map +1 -0
  126. package/dist/shared/{hx-container-COinHjxn.js → hx-container-BXZBaOGG.js} +13 -12
  127. package/dist/shared/hx-container-BXZBaOGG.js.map +1 -0
  128. package/dist/shared/{hx-dialog-1VegS0l1.js → hx-dialog-e4CSD8xX.js} +23 -23
  129. package/dist/shared/hx-dialog-e4CSD8xX.js.map +1 -0
  130. package/dist/shared/{hx-divider-UdSFzALX.js → hx-divider-XgWIz4Mr.js} +2 -2
  131. package/dist/shared/{hx-divider-UdSFzALX.js.map → hx-divider-XgWIz4Mr.js.map} +1 -1
  132. package/dist/shared/hx-drawer-CenIAGuR.js.map +1 -1
  133. package/dist/shared/{hx-field-BMyp6hBx.js → hx-field-Dz-7M_SC.js} +2 -2
  134. package/dist/shared/hx-field-Dz-7M_SC.js.map +1 -0
  135. package/dist/shared/hx-field-label-Bg-EWvqF.js.map +1 -1
  136. package/dist/shared/hx-file-upload-DnYiIhyN.js.map +1 -1
  137. package/dist/shared/{hx-link-D73HP4Lq.js → hx-link-DfNy_UU8.js} +4 -5
  138. package/dist/shared/hx-link-DfNy_UU8.js.map +1 -0
  139. package/dist/shared/{hx-menu-divider-Bds6Gn6b.js → hx-menu-divider-Buc5XA9E.js} +79 -52
  140. package/dist/shared/hx-menu-divider-Buc5XA9E.js.map +1 -0
  141. package/dist/shared/{hx-nav-TK0mPfU6.js → hx-nav-CWwByFdq.js} +78 -63
  142. package/dist/shared/hx-nav-CWwByFdq.js.map +1 -0
  143. package/dist/shared/{hx-nav-item-XvXQzMwc.js → hx-nav-item-DItaMWl0.js} +1 -2
  144. package/dist/shared/hx-nav-item-DItaMWl0.js.map +1 -0
  145. package/dist/shared/{hx-number-input-BJ5XSvjL.js → hx-number-input-CS6_w1lT.js} +7 -1
  146. package/dist/shared/hx-number-input-CS6_w1lT.js.map +1 -0
  147. package/dist/shared/{hx-progress-ring-QGg5fdis.js → hx-progress-ring-wOSv2y_I.js} +32 -35
  148. package/dist/shared/hx-progress-ring-wOSv2y_I.js.map +1 -0
  149. package/dist/shared/{hx-radio-CWzYFy-I.js → hx-radio-reSaVmIB.js} +41 -40
  150. package/dist/shared/hx-radio-reSaVmIB.js.map +1 -0
  151. package/dist/shared/{hx-slider-BMofa55D.js → hx-slider-CzHOl3Ur.js} +11 -2
  152. package/dist/shared/hx-slider-CzHOl3Ur.js.map +1 -0
  153. package/dist/shared/{hx-split-panel-D9Jg5qKO.js → hx-split-panel-Cxkeauwe.js} +22 -22
  154. package/dist/shared/hx-split-panel-Cxkeauwe.js.map +1 -0
  155. package/dist/shared/{hx-status-indicator-Mv44COA-.js → hx-status-indicator-oYWOkWlD.js} +31 -24
  156. package/dist/shared/{hx-status-indicator-Mv44COA-.js.map → hx-status-indicator-oYWOkWlD.js.map} +1 -1
  157. package/dist/shared/hx-switch-BPvIcDpM.js.map +1 -1
  158. package/dist/shared/{hx-textarea-Bsq5aJf8.js → hx-textarea-BLcReynr.js} +42 -26
  159. package/dist/shared/hx-textarea-BLcReynr.js.map +1 -0
  160. package/fouc.css +88 -0
  161. package/package.json +5 -3
  162. package/dist/shared/hx-accordion-C84oGPj7.js.map +0 -1
  163. package/dist/shared/hx-action-bar-DxpGLABm.js.map +0 -1
  164. package/dist/shared/hx-avatar-ekyZvOCm.js.map +0 -1
  165. package/dist/shared/hx-button-DpFW7PO3.js.map +0 -1
  166. package/dist/shared/hx-button-group-DxCwaWnu.js.map +0 -1
  167. package/dist/shared/hx-card-VdiB2Pc4.js.map +0 -1
  168. package/dist/shared/hx-checkbox-Dq2xXIvl.js.map +0 -1
  169. package/dist/shared/hx-checkbox-group-BLePVahw.js.map +0 -1
  170. package/dist/shared/hx-color-picker-O4b_6QXT.js.map +0 -1
  171. package/dist/shared/hx-container-COinHjxn.js.map +0 -1
  172. package/dist/shared/hx-dialog-1VegS0l1.js.map +0 -1
  173. package/dist/shared/hx-field-BMyp6hBx.js.map +0 -1
  174. package/dist/shared/hx-link-D73HP4Lq.js.map +0 -1
  175. package/dist/shared/hx-menu-divider-Bds6Gn6b.js.map +0 -1
  176. package/dist/shared/hx-nav-TK0mPfU6.js.map +0 -1
  177. package/dist/shared/hx-nav-item-XvXQzMwc.js.map +0 -1
  178. package/dist/shared/hx-number-input-BJ5XSvjL.js.map +0 -1
  179. package/dist/shared/hx-progress-ring-QGg5fdis.js.map +0 -1
  180. package/dist/shared/hx-radio-CWzYFy-I.js.map +0 -1
  181. package/dist/shared/hx-slider-BMofa55D.js.map +0 -1
  182. package/dist/shared/hx-split-panel-D9Jg5qKO.js.map +0 -1
  183. package/dist/shared/hx-textarea-Bsq5aJf8.js.map +0 -1
@@ -1,8 +1,8 @@
1
- import { css as p, LitElement as f, html as u, nothing as l } from "lit";
2
- import { customElement as x, property as c, state as _ } from "lit/decorators.js";
1
+ import { css as p, LitElement as f, nothing as l, html as c } from "lit";
2
+ import { property as u, customElement as x, state as _ } from "lit/decorators.js";
3
3
  import { tokenStyles as v } from "@helixui/tokens/lit";
4
- import { classMap as b } from "lit/directives/class-map.js";
5
- const g = p`
4
+ import { classMap as g } from "lit/directives/class-map.js";
5
+ const y = p`
6
6
  :host {
7
7
  display: block;
8
8
  }
@@ -24,34 +24,44 @@ const g = p`
24
24
  outline: none;
25
25
  }
26
26
  `;
27
- var y = Object.getOwnPropertyDescriptor, k = (e, t, s, i) => {
28
- for (var n = i > 1 ? void 0 : i ? y(t, s) : t, r = e.length - 1, a; r >= 0; r--)
29
- (a = e[r]) && (n = a(n) || n);
30
- return n;
27
+ var k = Object.defineProperty, w = Object.getOwnPropertyDescriptor, b = (e, t, s, i) => {
28
+ for (var n = i > 1 ? void 0 : i ? w(t, s) : t, r = e.length - 1, o; r >= 0; r--)
29
+ (o = e[r]) && (n = (i ? o(t, s, n) : o(n)) || n);
30
+ return i && n && k(t, s, n), n;
31
31
  };
32
32
  let d = class extends f {
33
33
  constructor() {
34
- super(...arguments), this._focusedIndex = -1, this._typeaheadBuffer = "";
34
+ super(...arguments), this.label = "", this._focusedIndex = -1, this._typeaheadBuffer = "";
35
35
  }
36
36
  _getItems() {
37
37
  return Array.from(this.querySelectorAll("hx-menu-item")).filter(
38
38
  (e) => !e.disabled && !e.loading
39
39
  );
40
40
  }
41
+ /**
42
+ * Synchronize roving tabindex across all enabled items.
43
+ * Only the active item (or first item if none active) gets tabindex=0.
44
+ */
45
+ _syncRovingTabIndex() {
46
+ const e = this._getItems(), t = this._focusedIndex >= 0 ? this._focusedIndex : 0;
47
+ e.forEach((s, i) => {
48
+ s.setRovingTabIndex(i === t ? 0 : -1);
49
+ });
50
+ }
41
51
  /** Focus the first menu item. */
42
52
  focusFirst() {
43
53
  const t = this._getItems()[0];
44
- t !== void 0 && (this._focusedIndex = 0, t.focus());
54
+ t !== void 0 && (this._focusedIndex = 0, this._syncRovingTabIndex(), t.focus());
45
55
  }
46
56
  /** Focus the last menu item. */
47
57
  focusLast() {
48
58
  const e = this._getItems(), t = e[e.length - 1];
49
- t !== void 0 && (this._focusedIndex = e.length - 1, t.focus());
59
+ t !== void 0 && (this._focusedIndex = e.length - 1, this._syncRovingTabIndex(), t.focus());
50
60
  }
51
61
  _focusItem(e) {
52
62
  const t = this._getItems();
53
63
  if (t.length === 0) return;
54
- this._focusedIndex = Math.max(0, Math.min(e, t.length - 1));
64
+ this._focusedIndex = Math.max(0, Math.min(e, t.length - 1)), this._syncRovingTabIndex();
55
65
  const s = t[this._focusedIndex];
56
66
  s !== void 0 && s.focus();
57
67
  }
@@ -101,7 +111,7 @@ let d = class extends f {
101
111
  const s = /* @__PURE__ */ new Set(["hx-menu-item", "hx-menu-divider"]), i = t.assignedElements().filter((n) => !s.has(n.tagName.toLowerCase()));
102
112
  i.length > 0 && console.warn(
103
113
  `[hx-menu] Default slot expects <hx-menu-item> or <hx-menu-divider> elements. Found unexpected: ${i.map((n) => `<${n.tagName.toLowerCase()}>`).join(", ")}`
104
- );
114
+ ), this._syncRovingTabIndex();
105
115
  }
106
116
  _handleItemSelect(e) {
107
117
  const t = e.detail, s = this._getItems();
@@ -114,11 +124,12 @@ let d = class extends f {
114
124
  );
115
125
  }
116
126
  render() {
117
- return u`
127
+ return c`
118
128
  <div
119
129
  part="base"
120
130
  class="menu"
121
131
  role="menu"
132
+ aria-label=${this.label || l}
122
133
  @keydown=${this._handleKeyDown}
123
134
  @hx-item-select=${this._handleItemSelect}
124
135
  >
@@ -127,11 +138,14 @@ let d = class extends f {
127
138
  `;
128
139
  }
129
140
  };
130
- d.styles = [v, g];
131
- d = k([
141
+ d.styles = [v, y];
142
+ b([
143
+ u({ type: String, reflect: !0 })
144
+ ], d.prototype, "label", 2);
145
+ d = b([
132
146
  x("hx-menu")
133
147
  ], d);
134
- const w = p`
148
+ const I = p`
135
149
  :host {
136
150
  display: block;
137
151
  }
@@ -166,6 +180,12 @@ const w = p`
166
180
  background-color: var(--hx-menu-item-hover-bg, var(--hx-color-neutral-100, #f1f5f9));
167
181
  }
168
182
 
183
+ .menu-item:focus-visible {
184
+ outline: var(--hx-focus-ring-width, 2px) solid
185
+ var(--hx-focus-ring-color, var(--hx-color-primary-500, #3b82f6));
186
+ outline-offset: 0px;
187
+ }
188
+
169
189
  .menu-item__prefix,
170
190
  .menu-item__suffix {
171
191
  display: inline-flex;
@@ -217,14 +237,18 @@ const w = p`
217
237
  }
218
238
  }
219
239
  `;
220
- var I = Object.defineProperty, S = Object.getOwnPropertyDescriptor, h = (e, t, s, i) => {
221
- for (var n = i > 1 ? void 0 : i ? S(t, s) : t, r = e.length - 1, a; r >= 0; r--)
222
- (a = e[r]) && (n = (i ? a(t, s, n) : a(n)) || n);
223
- return i && n && I(t, s, n), n;
240
+ var S = Object.defineProperty, C = Object.getOwnPropertyDescriptor, h = (e, t, s, i) => {
241
+ for (var n = i > 1 ? void 0 : i ? C(t, s) : t, r = e.length - 1, o; r >= 0; r--)
242
+ (o = e[r]) && (n = (i ? o(t, s, n) : o(n)) || n);
243
+ return i && n && S(t, s, n), n;
224
244
  };
225
- let o = class extends f {
245
+ let a = class extends f {
226
246
  constructor() {
227
- super(...arguments), this.value = "", this.disabled = !1, this.checked = !1, this.type = "normal", this.loading = !1, this._hasSubmenu = !1;
247
+ super(...arguments), this._rovingTabIndex = -1, this.value = "", this.disabled = !1, this.checked = !1, this.type = "normal", this.loading = !1, this._hasSubmenu = !1;
248
+ }
249
+ /** @internal Set the roving tabindex value. Called by parent hx-menu. */
250
+ setRovingTabIndex(e) {
251
+ this._rovingTabIndex = e;
228
252
  }
229
253
  /** Focus the inner interactive element. */
230
254
  focus(e) {
@@ -275,7 +299,7 @@ let o = class extends f {
275
299
  ));
276
300
  }
277
301
  _renderCheckedIcon() {
278
- return u`
302
+ return c`
279
303
  <span part="checked-icon" class="menu-item__checked-icon" aria-hidden="true">
280
304
  <svg
281
305
  width="1em"
@@ -293,7 +317,7 @@ let o = class extends f {
293
317
  `;
294
318
  }
295
319
  _renderSubmenuIcon() {
296
- return u`
320
+ return c`
297
321
  <span part="submenu-icon" class="menu-item__submenu-icon" aria-hidden="true">
298
322
  <svg
299
323
  width="1em"
@@ -311,7 +335,7 @@ let o = class extends f {
311
335
  `;
312
336
  }
313
337
  _renderSpinner() {
314
- return u`
338
+ return c`
315
339
  <svg class="menu-item__spinner" aria-hidden="true" viewBox="0 0 24 24" fill="none">
316
340
  <circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="3" opacity="0.3" />
317
341
  <path
@@ -338,12 +362,12 @@ let o = class extends f {
338
362
  "menu-item": !0,
339
363
  "menu-item--checked": this.checked
340
364
  };
341
- return u`
365
+ return c`
342
366
  <div
343
367
  part="base"
344
- class=${b(s)}
368
+ class=${g(s)}
345
369
  role=${e}
346
- tabindex=${this.disabled ? "-1" : "0"}
370
+ tabindex=${this.disabled ? "-1" : String(this._rovingTabIndex)}
347
371
  aria-disabled=${this.disabled ? "true" : l}
348
372
  aria-checked=${t ? this.checked ? "true" : "false" : l}
349
373
  aria-haspopup=${this._hasSubmenu ? "true" : l}
@@ -368,33 +392,31 @@ let o = class extends f {
368
392
  `;
369
393
  }
370
394
  };
371
- o.styles = [v, w];
395
+ a.styles = [v, I];
396
+ h([
397
+ _()
398
+ ], a.prototype, "_rovingTabIndex", 2);
372
399
  h([
373
- c({ type: String })
374
- ], o.prototype, "value", 2);
400
+ u({ type: String })
401
+ ], a.prototype, "value", 2);
375
402
  h([
376
- c({ type: Boolean, reflect: !0 })
377
- ], o.prototype, "disabled", 2);
403
+ u({ type: Boolean, reflect: !0 })
404
+ ], a.prototype, "disabled", 2);
378
405
  h([
379
- c({ type: Boolean, reflect: !0 })
380
- ], o.prototype, "checked", 2);
406
+ u({ type: Boolean, reflect: !0 })
407
+ ], a.prototype, "checked", 2);
381
408
  h([
382
- c({ type: String, reflect: !0 })
383
- ], o.prototype, "type", 2);
409
+ u({ type: String, reflect: !0 })
410
+ ], a.prototype, "type", 2);
384
411
  h([
385
- c({ type: Boolean, reflect: !0 })
386
- ], o.prototype, "loading", 2);
412
+ u({ type: Boolean, reflect: !0 })
413
+ ], a.prototype, "loading", 2);
387
414
  h([
388
415
  _()
389
- ], o.prototype, "_hasSubmenu", 2);
390
- o = h([
416
+ ], a.prototype, "_hasSubmenu", 2);
417
+ a = h([
391
418
  x("hx-menu-item")
392
- ], o);
393
- var C = Object.getOwnPropertyDescriptor, D = (e, t, s, i) => {
394
- for (var n = i > 1 ? void 0 : i ? C(t, s) : t, r = e.length - 1, a; r >= 0; r--)
395
- (a = e[r]) && (n = a(n) || n);
396
- return n;
397
- };
419
+ ], a);
398
420
  const $ = p`
399
421
  :host {
400
422
  display: block;
@@ -406,9 +428,14 @@ const $ = p`
406
428
  margin: var(--hx-space-1, 0.25rem) calc(-1 * var(--hx-space-1, 0.25rem));
407
429
  }
408
430
  `;
431
+ var D = Object.getOwnPropertyDescriptor, E = (e, t, s, i) => {
432
+ for (var n = i > 1 ? void 0 : i ? D(t, s) : t, r = e.length - 1, o; r >= 0; r--)
433
+ (o = e[r]) && (n = o(n) || n);
434
+ return n;
435
+ };
409
436
  let m = class extends f {
410
437
  render() {
411
- return u`<div
438
+ return c`<div
412
439
  part="base"
413
440
  class="menu-divider"
414
441
  role="separator"
@@ -417,12 +444,12 @@ let m = class extends f {
417
444
  }
418
445
  };
419
446
  m.styles = [v, $];
420
- m = D([
447
+ m = E([
421
448
  x("hx-menu-divider")
422
449
  ], m);
423
450
  export {
424
451
  d as H,
425
452
  m as a,
426
- o as b
453
+ a as b
427
454
  };
428
- //# sourceMappingURL=hx-menu-divider-Bds6Gn6b.js.map
455
+ //# sourceMappingURL=hx-menu-divider-Buc5XA9E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hx-menu-divider-Buc5XA9E.js","sources":["../../src/components/hx-menu/hx-menu.styles.ts","../../src/components/hx-menu/hx-menu.ts","../../src/components/hx-menu/hx-menu-item.styles.ts","../../src/components/hx-menu/hx-menu-item.ts","../../src/components/hx-menu/hx-menu-divider.styles.ts","../../src/components/hx-menu/hx-menu-divider.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const helixMenuStyles = css`\n :host {\n display: block;\n }\n\n .menu {\n display: flex;\n flex-direction: column;\n padding: var(--hx-space-1, 0.25rem);\n background: var(--hx-menu-bg, var(--hx-color-neutral-0, #ffffff));\n border: var(--hx-border-width-thin, 1px) solid\n var(--hx-menu-border-color, var(--hx-color-neutral-200, #e2e8f0));\n border-radius: var(--hx-menu-border-radius, var(--hx-border-radius-md, 0.375rem));\n box-shadow: var(\n --hx-menu-shadow,\n 0 4px 6px -1px rgb(0 0 0 / 0.1),\n 0 2px 4px -2px rgb(0 0 0 / 0.1)\n );\n min-width: var(--hx-menu-min-width, 10rem);\n outline: none;\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixMenuStyles } from './hx-menu.styles.js';\nimport type { HelixMenuItem } from './hx-menu-item.js';\n\n/**\n * A menu container that manages keyboard navigation over a list of menu items.\n * Use with `hx-menu-item` and `hx-menu-divider`.\n *\n * @summary Context/action menu with keyboard-navigable items.\n *\n * @tag hx-menu\n *\n * @slot - Default slot for hx-menu-item and hx-menu-divider elements.\n *\n * @fires {CustomEvent<{item: HelixMenuItem, value: string}>} hx-select - Dispatched when an item is selected.\n * @fires {CustomEvent<void>} hx-close - Dispatched when Escape is pressed.\n *\n * @csspart base - The root menu element.\n *\n * @cssprop [--hx-menu-bg=var(--hx-color-neutral-0)] - Menu background color.\n * @cssprop [--hx-menu-border-color=var(--hx-color-neutral-200)] - Menu border color.\n * @cssprop [--hx-menu-border-radius=var(--hx-border-radius-md)] - Menu border radius.\n * @cssprop [--hx-menu-shadow] - Menu box shadow.\n * @cssprop [--hx-menu-min-width=10rem] - Minimum menu width.\n */\n@customElement('hx-menu')\nexport class HelixMenu extends LitElement {\n static override styles = [tokenStyles, helixMenuStyles];\n\n /**\n * Accessible label for the menu. Rendered as `aria-label` on the inner\n * `role=\"menu\"` element when set.\n * @attr label\n */\n @property({ type: String, reflect: true })\n label = '';\n\n private _focusedIndex = -1;\n\n private _typeaheadBuffer = '';\n\n private _typeaheadTimeout: ReturnType<typeof setTimeout> | undefined;\n\n private _getItems(): HelixMenuItem[] {\n return Array.from(this.querySelectorAll<HelixMenuItem>('hx-menu-item')).filter(\n (item) => !item.disabled && !item.loading,\n );\n }\n\n /**\n * Synchronize roving tabindex across all enabled items.\n * Only the active item (or first item if none active) gets tabindex=0.\n */\n private _syncRovingTabIndex(): void {\n const items = this._getItems();\n const activeIndex = this._focusedIndex >= 0 ? this._focusedIndex : 0;\n items.forEach((item, i) => {\n item.setRovingTabIndex(i === activeIndex ? 0 : -1);\n });\n }\n\n /** Focus the first menu item. */\n focusFirst(): void {\n const items = this._getItems();\n const first = items[0];\n if (first !== undefined) {\n this._focusedIndex = 0;\n this._syncRovingTabIndex();\n first.focus();\n }\n }\n\n /** Focus the last menu item. */\n focusLast(): void {\n const items = this._getItems();\n const last = items[items.length - 1];\n if (last !== undefined) {\n this._focusedIndex = items.length - 1;\n this._syncRovingTabIndex();\n last.focus();\n }\n }\n\n private _focusItem(index: number): void {\n const items = this._getItems();\n if (items.length === 0) return;\n this._focusedIndex = Math.max(0, Math.min(index, items.length - 1));\n this._syncRovingTabIndex();\n const target = items[this._focusedIndex];\n if (target !== undefined) target.focus();\n }\n\n private _updateFocusedIndex(): void {\n const items = this._getItems();\n const active = this.shadowRoot?.activeElement ?? document.activeElement;\n // Find the active item by checking if any item's shadow root contains the active element\n const idx = items.findIndex((item) => item.matches(':focus-within') || item === active);\n if (idx !== -1) this._focusedIndex = idx;\n }\n\n private _handleKeyDown(e: KeyboardEvent): void {\n this._updateFocusedIndex();\n const items = this._getItems();\n if (items.length === 0) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n this._focusItem(this._focusedIndex + 1 < items.length ? this._focusedIndex + 1 : 0);\n break;\n case 'ArrowUp':\n e.preventDefault();\n this._focusItem(this._focusedIndex > 0 ? this._focusedIndex - 1 : items.length - 1);\n break;\n case 'Home':\n e.preventDefault();\n this._focusItem(0);\n break;\n case 'End':\n e.preventDefault();\n this._focusItem(items.length - 1);\n break;\n case 'Escape':\n e.preventDefault();\n this.dispatchEvent(new CustomEvent('hx-close', { bubbles: true, composed: true }));\n break;\n default:\n if (e.key.length === 1 && e.key !== ' ' && !e.ctrlKey && !e.metaKey && !e.altKey) {\n this._handleTypeahead(e.key, items);\n }\n break;\n }\n }\n\n private _handleTypeahead(char: string, items: HelixMenuItem[]): void {\n clearTimeout(this._typeaheadTimeout);\n this._typeaheadBuffer += char.toLowerCase();\n this._typeaheadTimeout = setTimeout(() => {\n this._typeaheadBuffer = '';\n }, 500);\n\n const match = items.findIndex((item) => {\n if (item.disabled || item.hasAttribute('disabled')) return false;\n const text = item.textContent?.trim().toLowerCase() ?? '';\n return text.startsWith(this._typeaheadBuffer);\n });\n\n if (match !== -1) {\n this._focusItem(match);\n }\n }\n\n private _handleSlotChange(e: Event): void {\n const slot = e.target;\n if (!(slot instanceof HTMLSlotElement)) return;\n const validTags = new Set(['hx-menu-item', 'hx-menu-divider']);\n const invalid = slot\n .assignedElements()\n .filter((el) => !validTags.has(el.tagName.toLowerCase()));\n if (invalid.length > 0) {\n console.warn(\n `[hx-menu] Default slot expects <hx-menu-item> or <hx-menu-divider> elements. Found unexpected: ${invalid.map((el) => `<${el.tagName.toLowerCase()}>`).join(', ')}`,\n );\n }\n // Initialize roving tabindex when items are slotted\n this._syncRovingTabIndex();\n }\n\n private _handleItemSelect(e: Event): void {\n const detail = (e as CustomEvent<{ item: HelixMenuItem; value: string }>).detail;\n const items = this._getItems();\n this._focusedIndex = items.indexOf(detail.item);\n\n this.dispatchEvent(\n new CustomEvent('hx-select', {\n bubbles: true,\n composed: true,\n detail: { item: detail.item, value: detail.value },\n }),\n );\n }\n\n override render() {\n return html`\n <div\n part=\"base\"\n class=\"menu\"\n role=\"menu\"\n aria-label=${this.label || nothing}\n @keydown=${this._handleKeyDown}\n @hx-item-select=${this._handleItemSelect}\n >\n <slot @slotchange=${this._handleSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-menu': HelixMenu;\n }\n}\n","import { css } from 'lit';\n\nexport const helixMenuItemStyles = css`\n :host {\n display: block;\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: var(--hx-opacity-disabled, 0.5);\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: var(--hx-space-2, 0.5rem);\n padding: var(--hx-space-2, 0.5rem) var(--hx-space-3, 0.75rem);\n border-radius: var(--hx-border-radius-sm, 0.25rem);\n cursor: pointer;\n color: var(--hx-menu-item-color, var(--hx-color-neutral-900, #0f172a));\n font-size: var(--hx-font-size-sm, 0.875rem);\n font-family: var(--hx-font-family-sans, sans-serif);\n line-height: var(--hx-line-height-tight, 1.25);\n user-select: none;\n -webkit-user-select: none;\n outline: none;\n background: none;\n width: 100%;\n box-sizing: border-box;\n transition: background-color var(--hx-transition-fast, 150ms ease);\n }\n\n .menu-item:hover,\n .menu-item:focus-visible {\n background-color: var(--hx-menu-item-hover-bg, var(--hx-color-neutral-100, #f1f5f9));\n }\n\n .menu-item:focus-visible {\n outline: var(--hx-focus-ring-width, 2px) solid\n var(--hx-focus-ring-color, var(--hx-color-primary-500, #3b82f6));\n outline-offset: 0px;\n }\n\n .menu-item__prefix,\n .menu-item__suffix {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n }\n\n .menu-item__label {\n flex: 1 1 auto;\n }\n\n .menu-item__checked-icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n width: 1em;\n opacity: 0;\n transition: opacity var(--hx-transition-fast, 150ms ease);\n }\n\n .menu-item--checked .menu-item__checked-icon {\n opacity: 1;\n }\n\n .menu-item__submenu-icon {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n margin-inline-start: auto;\n }\n\n .menu-item__spinner {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n animation: hx-menu-spin var(--hx-duration-spinner, 750ms) linear infinite;\n }\n\n @keyframes hx-menu-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .menu-item__spinner {\n animation: none;\n opacity: var(--hx-opacity-muted, 0.6);\n }\n }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixMenuItemStyles } from './hx-menu-item.styles.js';\n\n/**\n * A single interactive item for use inside `hx-menu`. Supports normal, checkbox,\n * and radio types, loading state, prefix/suffix slots, and submenu nesting.\n * Use `aria-label` on the parent `hx-menu` to provide an accessible name.\n *\n * @summary Interactive item within an hx-menu.\n *\n * @tag hx-menu-item\n *\n * @slot - Default slot for the item label.\n * @slot prefix - Icon or content rendered before the label.\n * @slot suffix - Shortcut text or icon rendered after the label.\n * @slot submenu - A nested hx-menu for submenu content.\n *\n * @fires {CustomEvent<{item: HelixMenuItem, value: string}>} hx-item-select - Dispatched when the item is activated via click, Enter, or Space.\n * @fires {CustomEvent<{item: HelixMenuItem}>} hx-item-submenu-open - Dispatched when ArrowRight is pressed on an item with a submenu.\n *\n * @csspart base - The root item element.\n * @csspart prefix - Prefix slot wrapper.\n * @csspart label - Label slot wrapper.\n * @csspart suffix - Suffix slot wrapper.\n * @csspart submenu-icon - The chevron icon indicating a submenu.\n * @csspart checked-icon - The checkmark icon for checkbox-type items.\n *\n * @cssprop [--hx-menu-item-color=var(--hx-color-neutral-900)] - Item text color.\n * @cssprop [--hx-menu-item-hover-bg=var(--hx-color-neutral-100)] - Item hover/focus background.\n */\n@customElement('hx-menu-item')\nexport class HelixMenuItem extends LitElement {\n static override styles = [tokenStyles, helixMenuItemStyles];\n\n /**\n * @internal Managed by parent hx-menu for roving tabindex.\n * Only the active item in the menu has tabindex=0; all others have -1.\n */\n @state()\n private _rovingTabIndex = -1;\n\n /** @internal Set the roving tabindex value. Called by parent hx-menu. */\n setRovingTabIndex(value: number): void {\n this._rovingTabIndex = value;\n }\n\n /**\n * The value associated with this item, emitted in the hx-select event.\n * @attr value\n */\n @property({ type: String })\n value = '';\n\n /**\n * Whether the item is disabled. Prevents interaction and event dispatch.\n * @attr disabled\n */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Whether the item is checked. Only meaningful when type=\"checkbox\".\n * @attr checked\n */\n @property({ type: Boolean, reflect: true })\n checked = false;\n\n /**\n * The type of menu item. \"checkbox\" renders a checkmark and toggles checked state.\n * \"radio\" renders a checkmark and emits selection for radio-group behavior.\n * @attr type\n */\n @property({ type: String, reflect: true })\n type: 'normal' | 'checkbox' | 'radio' = 'normal';\n\n /**\n * Whether the item is in a loading state. Shows a spinner and prevents interaction.\n * @attr loading\n */\n @property({ type: Boolean, reflect: true })\n loading = false;\n\n @state()\n private _hasSubmenu = false;\n\n /** Focus the inner interactive element. */\n override focus(options?: FocusOptions): void {\n this.shadowRoot?.querySelector<HTMLElement>('.menu-item')?.focus(options);\n }\n\n private _handleSubmenuSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasSubmenu = slot.assignedElements().length > 0;\n }\n\n private _activate(): void {\n if (this.disabled || this.loading) return;\n\n if (this.type === 'checkbox') {\n this.checked = !this.checked;\n } else if (this.type === 'radio') {\n const menu = this.closest('hx-menu');\n if (menu) {\n menu\n .querySelectorAll<HelixMenuItem>(':scope > hx-menu-item[type=\"radio\"]')\n .forEach((sibling) => {\n sibling.checked = sibling === this;\n });\n } else {\n this.checked = true;\n }\n }\n\n this.dispatchEvent(\n new CustomEvent('hx-item-select', {\n bubbles: true,\n composed: true,\n detail: { item: this, value: this.value },\n }),\n );\n }\n\n private _handleClick(e: MouseEvent): void {\n if (this.disabled || this.loading) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n this._activate();\n }\n\n private _handleKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._activate();\n return;\n }\n\n if (e.key === 'ArrowRight' && this._hasSubmenu) {\n e.preventDefault();\n this.dispatchEvent(\n new CustomEvent('hx-item-submenu-open', {\n bubbles: true,\n composed: true,\n detail: { item: this },\n }),\n );\n }\n }\n\n private _renderCheckedIcon() {\n return html`\n <span part=\"checked-icon\" class=\"menu-item__checked-icon\" aria-hidden=\"true\">\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </span>\n `;\n }\n\n private _renderSubmenuIcon() {\n return html`\n <span part=\"submenu-icon\" class=\"menu-item__submenu-icon\" aria-hidden=\"true\">\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </span>\n `;\n }\n\n private _renderSpinner() {\n return html`\n <svg class=\"menu-item__spinner\" aria-hidden=\"true\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"3\" opacity=\"0.3\" />\n <path\n d=\"M12 2a10 10 0 0 1 10 10\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n />\n </svg>\n `;\n }\n\n private _getRole(): string {\n switch (this.type) {\n case 'checkbox':\n return 'menuitemcheckbox';\n case 'radio':\n return 'menuitemradio';\n default:\n return 'menuitem';\n }\n }\n\n override render() {\n const role = this._getRole();\n const hasCheckableRole = this.type === 'checkbox' || this.type === 'radio';\n const classes = {\n 'menu-item': true,\n 'menu-item--checked': this.checked,\n };\n\n return html`\n <div\n part=\"base\"\n class=${classMap(classes)}\n role=${role}\n tabindex=${this.disabled ? '-1' : String(this._rovingTabIndex)}\n aria-disabled=${this.disabled ? 'true' : nothing}\n aria-checked=${hasCheckableRole ? (this.checked ? 'true' : 'false') : nothing}\n aria-haspopup=${this._hasSubmenu ? 'true' : nothing}\n aria-busy=${this.loading ? 'true' : nothing}\n @click=${this._handleClick}\n @keydown=${this._handleKeyDown}\n >\n ${this.loading ? this._renderSpinner() : nothing}\n ${hasCheckableRole ? this._renderCheckedIcon() : nothing}\n <span part=\"prefix\" class=\"menu-item__prefix\">\n <slot name=\"prefix\"></slot>\n </span>\n <span part=\"label\" class=\"menu-item__label\">\n <slot></slot>\n </span>\n <span part=\"suffix\" class=\"menu-item__suffix\">\n <slot name=\"suffix\"></slot>\n </span>\n ${this._hasSubmenu ? this._renderSubmenuIcon() : nothing}\n <slot name=\"submenu\" @slotchange=${this._handleSubmenuSlotChange}></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-menu-item': HelixMenuItem;\n }\n}\n","import { css } from 'lit';\n\nexport const helixMenuDividerStyles = css`\n :host {\n display: block;\n }\n\n .menu-divider {\n height: var(--hx-border-width-thin, 1px);\n background-color: var(--hx-menu-divider-color, var(--hx-color-neutral-200, #e2e8f0));\n margin: var(--hx-space-1, 0.25rem) calc(-1 * var(--hx-space-1, 0.25rem));\n }\n`;\n","import { LitElement, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { tokenStyles } from '@helixui/tokens/lit';\nimport { helixMenuDividerStyles } from './hx-menu-divider.styles.js';\n\n/**\n * A visual separator for grouping items within an `hx-menu`.\n *\n * @summary Horizontal divider between menu sections.\n *\n * @tag hx-menu-divider\n *\n * @csspart base - The root separator element.\n *\n * @cssprop [--hx-menu-divider-color=var(--hx-color-neutral-200)] - Divider line color.\n */\n@customElement('hx-menu-divider')\nexport class HelixMenuDivider extends LitElement {\n static override styles = [tokenStyles, helixMenuDividerStyles];\n\n override render() {\n return html`<div\n part=\"base\"\n class=\"menu-divider\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n ></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'hx-menu-divider': HelixMenuDivider;\n }\n}\n"],"names":["helixMenuStyles","css","HelixMenu","LitElement","item","items","activeIndex","first","last","index","target","active","_a","idx","char","match","slot","validTags","invalid","el","detail","html","nothing","tokenStyles","__decorateClass","property","customElement","helixMenuItemStyles","HelixMenuItem","value","options","_b","menu","sibling","role","hasCheckableRole","classes","classMap","state","helixMenuDividerStyles","HelixMenuDivider"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { css as b, LitElement as g, svg as m, html as d, nothing as _ } from "lit";
2
- import { property as x, state as f, customElement as k } from "lit/decorators.js";
1
+ import { css as g, LitElement as k, svg as _, html as d, nothing as f } from "lit";
2
+ import { property as x, state as b, customElement as y } from "lit/decorators.js";
3
3
  import { classMap as v } from "lit/directives/class-map.js";
4
- import { repeat as y } from "lit/directives/repeat.js";
5
- import { tokenStyles as w } from "@helixui/tokens/lit";
6
- const $ = b`
4
+ import { repeat as w } from "lit/directives/repeat.js";
5
+ import { tokenStyles as $ } from "@helixui/tokens/lit";
6
+ const C = g`
7
7
  :host {
8
8
  display: block;
9
9
  font-family: var(--hx-nav-font-family, var(--hx-font-family-sans, sans-serif));
@@ -122,16 +122,18 @@ const $ = b`
122
122
  position: absolute;
123
123
  top: calc(100% + var(--hx-space-1, 0.25rem));
124
124
  left: 0;
125
- min-width: 12rem;
125
+ min-width: var(--hx-nav-submenu-min-width, 12rem);
126
126
  list-style: none;
127
127
  margin: 0;
128
128
  padding: var(--hx-space-1, 0.25rem) 0;
129
129
  background-color: var(--hx-nav-submenu-bg, var(--hx-color-neutral-800, #1f2937));
130
130
  border-radius: var(--hx-border-radius-md, 0.375rem);
131
- box-shadow:
131
+ box-shadow: var(
132
+ --hx-shadow-md,
132
133
  0 4px 6px -1px rgb(0 0 0 / 0.1),
133
- 0 2px 4px -2px rgb(0 0 0 / 0.1);
134
- z-index: 100;
134
+ 0 2px 4px -2px rgb(0 0 0 / 0.1)
135
+ );
136
+ z-index: var(--hx-z-index-dropdown, 100);
135
137
  }
136
138
 
137
139
  .nav__submenu[hidden] {
@@ -242,12 +244,12 @@ const $ = b`
242
244
  }
243
245
  }
244
246
  `;
245
- var C = Object.defineProperty, I = Object.getOwnPropertyDescriptor, p = (e, n, a, r) => {
246
- for (var t = r > 1 ? void 0 : r ? I(n, a) : n, l = e.length - 1, c; l >= 0; l--)
247
- (c = e[l]) && (t = (r ? c(n, a, t) : c(t)) || t);
248
- return r && t && C(n, a, t), t;
247
+ var I = Object.defineProperty, O = Object.getOwnPropertyDescriptor, p = (e, n, a, t) => {
248
+ for (var r = t > 1 ? void 0 : t ? O(n, a) : n, s = e.length - 1, c; s >= 0; s--)
249
+ (c = e[s]) && (r = (t ? c(n, a, r) : c(r)) || r);
250
+ return t && r && I(n, a, r), r;
249
251
  };
250
- let h = class extends g {
252
+ let h = class extends k {
251
253
  constructor() {
252
254
  super(...arguments), this.items = [], this.orientation = "horizontal", this.label = "Main navigation", this._mobileOpen = !1, this._expandedIndex = null, this._boundOutsideClick = this._handleOutsideClick.bind(this);
253
255
  }
@@ -272,8 +274,8 @@ let h = class extends g {
272
274
  this._mobileOpen = !this._mobileOpen, this._mobileOpen || (this._expandedIndex = null);
273
275
  }
274
276
  _handleItemClick(e, n, a) {
275
- var r;
276
- a.preventDefault(), (r = e.children) != null && r.length ? this._expandedIndex = this._expandedIndex === n ? null : n : (this._mobileOpen = !1, this._expandedIndex = null, this.dispatchEvent(
277
+ var t;
278
+ a.preventDefault(), (t = e.children) != null && t.length ? this._expandedIndex = this._expandedIndex === n ? null : n : (this._mobileOpen = !1, this._expandedIndex = null, this.dispatchEvent(
277
279
  new CustomEvent("hx-nav-select", {
278
280
  bubbles: !0,
279
281
  composed: !0,
@@ -281,8 +283,8 @@ let h = class extends g {
281
283
  })
282
284
  ));
283
285
  }
284
- _handleSubItemClick(e) {
285
- this._mobileOpen = !1, this._expandedIndex = null, this.dispatchEvent(
286
+ _handleSubItemClick(e, n) {
287
+ n.preventDefault(), this._mobileOpen = !1, this._expandedIndex = null, this.dispatchEvent(
286
288
  new CustomEvent("hx-nav-select", {
287
289
  bubbles: !0,
288
290
  composed: !0,
@@ -291,16 +293,16 @@ let h = class extends g {
291
293
  );
292
294
  }
293
295
  _handleKeydown(e, n, a) {
294
- var c, s, u;
295
- const r = (c = this.shadowRoot) == null ? void 0 : c.querySelectorAll(
296
- ':scope > nav > [part="list"] > [part="item"] > [part="link"]'
296
+ var c, l, u;
297
+ const t = (c = this.shadowRoot) == null ? void 0 : c.querySelectorAll(
298
+ ':scope > [part="nav"] > [part="list"] > [part="item"] > [part="link"]'
297
299
  );
298
- if (!r) return;
299
- const t = Array.from(r), l = t[n];
300
+ if (!t) return;
301
+ const r = Array.from(t), s = r[n];
300
302
  switch (e.key) {
301
303
  case "ArrowRight":
302
304
  case "ArrowDown": {
303
- if (e.preventDefault(), (s = a.children) != null && s.length && e.key === "ArrowDown" && this.orientation === "horizontal")
305
+ if (e.preventDefault(), (l = a.children) != null && l.length && e.key === "ArrowDown" && this.orientation === "horizontal")
304
306
  this._expandedIndex = n, this.updateComplete.then(() => {
305
307
  var o;
306
308
  const i = (o = this.shadowRoot) == null ? void 0 : o.querySelector(
@@ -309,7 +311,7 @@ let h = class extends g {
309
311
  i == null || i.focus();
310
312
  });
311
313
  else {
312
- const i = t[n + 1] ?? t[0];
314
+ const i = r[n + 1] ?? r[0];
313
315
  i == null || i.focus();
314
316
  }
315
317
  break;
@@ -317,38 +319,48 @@ let h = class extends g {
317
319
  case "ArrowLeft":
318
320
  case "ArrowUp": {
319
321
  e.preventDefault();
320
- const i = t[n - 1] ?? t[t.length - 1];
322
+ const i = r[n - 1] ?? r[r.length - 1];
321
323
  i == null || i.focus();
322
324
  break;
323
325
  }
324
326
  case "Escape": {
325
- this._expandedIndex = null, l == null || l.focus();
327
+ this._expandedIndex = null, s == null || s.focus();
326
328
  break;
327
329
  }
328
330
  case "Enter":
329
331
  case " ": {
330
- (u = a.children) != null && u.length && (e.preventDefault(), this._expandedIndex = this._expandedIndex === n ? null : n);
332
+ if ((u = a.children) != null && u.length) {
333
+ e.preventDefault();
334
+ const i = this._expandedIndex === n;
335
+ this._expandedIndex = i ? null : n, i || this.updateComplete.then(() => {
336
+ var m;
337
+ const o = (m = this.shadowRoot) == null ? void 0 : m.querySelector(
338
+ '.nav__submenu:not([hidden]) [part="link"]'
339
+ );
340
+ o == null || o.focus();
341
+ });
342
+ }
331
343
  break;
332
344
  }
333
345
  }
334
346
  }
335
347
  _handleSubKeydown(e, n) {
336
- var c, s, u, i;
348
+ var c, l, u, i;
337
349
  const a = (c = this.shadowRoot) == null ? void 0 : c.querySelectorAll(
338
350
  '.nav__submenu:not([hidden]) [part="link"]'
339
351
  );
340
352
  if (!a) return;
341
- const r = Array.from(a), t = (s = this.shadowRoot) == null ? void 0 : s.activeElement, l = r.indexOf(t);
353
+ const t = Array.from(a), r = (l = this.shadowRoot) == null ? void 0 : l.activeElement, s = t.indexOf(r);
342
354
  switch (e.key) {
343
355
  case "ArrowDown": {
344
356
  e.preventDefault();
345
- const o = r[l + 1] ?? r[0];
357
+ const o = t[s + 1] ?? t[0];
346
358
  o == null || o.focus();
347
359
  break;
348
360
  }
349
361
  case "ArrowUp": {
350
362
  e.preventDefault();
351
- const o = r[l - 1] ?? r[r.length - 1];
363
+ const o = t[s - 1] ?? t[t.length - 1];
352
364
  o == null || o.focus();
353
365
  break;
354
366
  }
@@ -363,8 +375,7 @@ let h = class extends g {
363
375
  }
364
376
  }
365
377
  _handleOutsideClick(e) {
366
- var n;
367
- !this.contains(e.target) && !((n = this.shadowRoot) != null && n.contains(e.target)) && (this._expandedIndex = null);
378
+ e.composedPath().includes(this) || (this._expandedIndex = null);
368
379
  }
369
380
  // ─── Lifecycle ───
370
381
  connectedCallback() {
@@ -385,8 +396,8 @@ let h = class extends g {
385
396
  stroke-linecap="round"
386
397
  aria-hidden="true"
387
398
  >
388
- ${this._mobileOpen ? m`<line x1="18" y1="6" x2="6" y2="18"></line>
389
- <line x1="6" y1="6" x2="18" y2="18"></line>` : m`<line x1="3" y1="12" x2="21" y2="12"></line>
399
+ ${this._mobileOpen ? _`<line x1="18" y1="6" x2="6" y2="18"></line>
400
+ <line x1="6" y1="6" x2="18" y2="18"></line>` : _`<line x1="3" y1="12" x2="21" y2="12"></line>
390
401
  <line x1="3" y1="6" x2="21" y2="6"></line>
391
402
  <line x1="3" y1="18" x2="21" y2="18"></line>`}
392
403
  </svg>`;
@@ -410,10 +421,15 @@ let h = class extends g {
410
421
  />
411
422
  </svg>`;
412
423
  }
413
- _renderSubMenu(e, n) {
414
- const a = this._expandedIndex === n;
424
+ _renderSubMenu(e, n, a) {
425
+ const t = this._expandedIndex === n;
415
426
  return d`
416
- <ul class="nav__submenu" role="list" aria-label="Submenu" ?hidden=${!a}>
427
+ <ul
428
+ class="nav__submenu"
429
+ role="list"
430
+ aria-label="${a} submenu"
431
+ ?hidden=${!t}
432
+ >
417
433
  ${e.map(
418
434
  (r) => d`
419
435
  <li class="nav__submenu-item">
@@ -424,9 +440,9 @@ let h = class extends g {
424
440
  nav__link: !0,
425
441
  "nav__link--active": !!r.current
426
442
  })}
427
- aria-current=${r.current ? "page" : _}
428
- @click=${() => this._handleSubItemClick(r)}
429
- @keydown=${(t) => this._handleSubKeydown(t, n)}
443
+ aria-current=${r.current ? "page" : f}
444
+ @click=${(s) => this._handleSubItemClick(r, s)}
445
+ @keydown=${(s) => this._handleSubKeydown(s, n)}
430
446
  >
431
447
  ${r.label}
432
448
  </a>
@@ -438,36 +454,35 @@ let h = class extends g {
438
454
  }
439
455
  _renderItem(e, n) {
440
456
  var c;
441
- const a = !!((c = e.children) != null && c.length), r = this._expandedIndex === n, t = {
457
+ const a = !!((c = e.children) != null && c.length), t = this._expandedIndex === n, r = {
442
458
  nav__link: !0,
443
459
  "nav__link--active": !!e.current,
444
460
  "nav__link--has-submenu": a,
445
- "nav__link--expanded": r
446
- }, l = a ? d`
461
+ "nav__link--expanded": t
462
+ }, s = a ? d`
447
463
  <button
448
464
  part="link"
449
- class=${v(t)}
450
- aria-expanded=${r ? "true" : "false"}
451
- aria-haspopup="menu"
452
- @click=${(s) => this._handleItemClick(e, n, s)}
453
- @keydown=${(s) => this._handleKeydown(s, n, e)}
465
+ class=${v(r)}
466
+ aria-expanded=${t ? "true" : "false"}
467
+ @click=${(l) => this._handleItemClick(e, n, l)}
468
+ @keydown=${(l) => this._handleKeydown(l, n, e)}
454
469
  >
455
470
  ${e.label} ${this._renderChevronIcon()}
456
471
  </button>
457
- ${this._renderSubMenu(e.children ?? [], n)}
472
+ ${this._renderSubMenu(e.children ?? [], n, e.label)}
458
473
  ` : d`
459
474
  <a
460
475
  part="link"
461
476
  href=${this._sanitizeHref(e.href)}
462
- class=${v(t)}
463
- aria-current=${e.current ? "page" : _}
464
- @click=${(s) => this._handleItemClick(e, n, s)}
465
- @keydown=${(s) => this._handleKeydown(s, n, e)}
477
+ class=${v(r)}
478
+ aria-current=${e.current ? "page" : f}
479
+ @click=${(l) => this._handleItemClick(e, n, l)}
480
+ @keydown=${(l) => this._handleKeydown(l, n, e)}
466
481
  >
467
482
  ${e.label}
468
483
  </a>
469
484
  `;
470
- return d` <li part="item" class="nav__item">${l}</li> `;
485
+ return d` <li part="item" class="nav__item">${s}</li> `;
471
486
  }
472
487
  // ─── Render ───
473
488
  render() {
@@ -489,9 +504,9 @@ let h = class extends g {
489
504
  </button>
490
505
 
491
506
  <ul part="list" id="nav-list" class=${v(e)} role="list">
492
- ${y(
507
+ ${w(
493
508
  this.items,
494
- (n) => n.label,
509
+ (n, a) => a,
495
510
  (n, a) => this._renderItem(n, a)
496
511
  )}
497
512
  </ul>
@@ -499,7 +514,7 @@ let h = class extends g {
499
514
  `;
500
515
  }
501
516
  };
502
- h.styles = [w, $];
517
+ h.styles = [$, C];
503
518
  p([
504
519
  x({
505
520
  type: Array,
@@ -523,15 +538,15 @@ p([
523
538
  x({ type: String })
524
539
  ], h.prototype, "label", 2);
525
540
  p([
526
- f()
541
+ b()
527
542
  ], h.prototype, "_mobileOpen", 2);
528
543
  p([
529
- f()
544
+ b()
530
545
  ], h.prototype, "_expandedIndex", 2);
531
546
  h = p([
532
- k("hx-nav")
547
+ y("hx-nav")
533
548
  ], h);
534
549
  export {
535
550
  h as H
536
551
  };
537
- //# sourceMappingURL=hx-nav-TK0mPfU6.js.map
552
+ //# sourceMappingURL=hx-nav-CWwByFdq.js.map