@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.
- package/custom-elements.json +262 -67
- package/dist/components/hx-accordion/hx-accordion-item.d.ts.map +1 -1
- package/dist/components/hx-accordion/hx-accordion.d.ts +2 -0
- package/dist/components/hx-accordion/hx-accordion.d.ts.map +1 -1
- package/dist/components/hx-accordion/index.js +1 -1
- package/dist/components/hx-action-bar/hx-action-bar.d.ts +1 -0
- package/dist/components/hx-action-bar/hx-action-bar.d.ts.map +1 -1
- package/dist/components/hx-action-bar/index.js +1 -1
- package/dist/components/hx-alert/hx-alert.d.ts +1 -1
- package/dist/components/hx-alert/hx-alert.d.ts.map +1 -1
- package/dist/components/hx-alert/index.d.ts +1 -0
- package/dist/components/hx-alert/index.d.ts.map +1 -1
- package/dist/components/hx-avatar/hx-avatar.d.ts +1 -1
- package/dist/components/hx-avatar/hx-avatar.d.ts.map +1 -1
- package/dist/components/hx-avatar/hx-avatar.styles.d.ts.map +1 -1
- package/dist/components/hx-avatar/index.js +1 -1
- package/dist/components/hx-button/hx-button.d.ts +10 -4
- package/dist/components/hx-button/hx-button.d.ts.map +1 -1
- package/dist/components/hx-button/hx-button.styles.d.ts.map +1 -1
- package/dist/components/hx-button/index.js +1 -1
- package/dist/components/hx-button-group/hx-button-group.d.ts +6 -3
- package/dist/components/hx-button-group/hx-button-group.d.ts.map +1 -1
- package/dist/components/hx-button-group/hx-button-group.styles.d.ts.map +1 -1
- package/dist/components/hx-button-group/index.js +1 -1
- package/dist/components/hx-card/hx-card.d.ts +9 -0
- package/dist/components/hx-card/hx-card.d.ts.map +1 -1
- package/dist/components/hx-card/index.js +1 -1
- package/dist/components/hx-checkbox/hx-checkbox.d.ts +3 -0
- package/dist/components/hx-checkbox/hx-checkbox.d.ts.map +1 -1
- package/dist/components/hx-checkbox/hx-checkbox.styles.d.ts.map +1 -1
- package/dist/components/hx-checkbox/index.js +1 -1
- package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts +1 -0
- package/dist/components/hx-checkbox-group/hx-checkbox-group.d.ts.map +1 -1
- package/dist/components/hx-checkbox-group/index.js +1 -1
- package/dist/components/hx-code-snippet/hx-code-snippet.d.ts.map +1 -1
- package/dist/components/hx-code-snippet/index.js +1 -1
- package/dist/components/hx-color-picker/hx-color-picker.d.ts.map +1 -1
- package/dist/components/hx-color-picker/index.js +1 -1
- package/dist/components/hx-combobox/index.d.ts +1 -2
- package/dist/components/hx-combobox/index.d.ts.map +1 -1
- package/dist/components/hx-container/hx-container.d.ts +2 -0
- package/dist/components/hx-container/hx-container.d.ts.map +1 -1
- package/dist/components/hx-container/hx-container.styles.d.ts.map +1 -1
- package/dist/components/hx-container/index.js +1 -1
- package/dist/components/hx-dialog/index.js +1 -1
- package/dist/components/hx-divider/index.js +1 -1
- package/dist/components/hx-drawer/hx-drawer.d.ts +3 -2
- package/dist/components/hx-drawer/hx-drawer.d.ts.map +1 -1
- package/dist/components/hx-dropdown/index.d.ts +1 -1
- package/dist/components/hx-dropdown/index.d.ts.map +1 -1
- package/dist/components/hx-field/index.js +1 -1
- package/dist/components/hx-field-label/hx-field-label.d.ts +17 -7
- package/dist/components/hx-field-label/hx-field-label.d.ts.map +1 -1
- package/dist/components/hx-file-upload/hx-file-upload.d.ts +1 -0
- package/dist/components/hx-file-upload/hx-file-upload.d.ts.map +1 -1
- package/dist/components/hx-link/hx-link.d.ts +5 -1
- package/dist/components/hx-link/hx-link.d.ts.map +1 -1
- package/dist/components/hx-link/hx-link.styles.d.ts.map +1 -1
- package/dist/components/hx-link/index.js +1 -1
- package/dist/components/hx-menu/hx-menu-divider.d.ts.map +1 -1
- package/dist/components/hx-menu/hx-menu-divider.styles.d.ts +2 -0
- package/dist/components/hx-menu/hx-menu-divider.styles.d.ts.map +1 -0
- package/dist/components/hx-menu/hx-menu-item.d.ts +7 -0
- package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
- package/dist/components/hx-menu/hx-menu-item.styles.d.ts.map +1 -1
- package/dist/components/hx-menu/hx-menu.d.ts +11 -0
- package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
- package/dist/components/hx-menu/index.js +1 -1
- package/dist/components/hx-nav/hx-nav.d.ts +2 -0
- package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
- package/dist/components/hx-nav/hx-nav.styles.d.ts.map +1 -1
- package/dist/components/hx-nav/index.js +1 -1
- package/dist/components/hx-number-input/hx-number-input.styles.d.ts.map +1 -1
- package/dist/components/hx-number-input/index.js +1 -1
- package/dist/components/hx-progress-ring/hx-progress-ring.d.ts +3 -3
- package/dist/components/hx-progress-ring/hx-progress-ring.d.ts.map +1 -1
- package/dist/components/hx-progress-ring/index.js +1 -1
- package/dist/components/hx-radio-group/hx-radio-group.d.ts +1 -1
- package/dist/components/hx-radio-group/hx-radio-group.d.ts.map +1 -1
- package/dist/components/hx-radio-group/index.js +1 -1
- package/dist/components/hx-side-nav/hx-side-nav.d.ts.map +1 -1
- package/dist/components/hx-side-nav/index.js +1 -1
- package/dist/components/hx-slider/hx-slider.d.ts +2 -0
- package/dist/components/hx-slider/hx-slider.d.ts.map +1 -1
- package/dist/components/hx-slider/hx-slider.styles.d.ts.map +1 -1
- package/dist/components/hx-slider/index.js +1 -1
- package/dist/components/hx-split-panel/hx-split-panel.d.ts +1 -1
- package/dist/components/hx-split-panel/hx-split-panel.d.ts.map +1 -1
- package/dist/components/hx-split-panel/index.js +1 -1
- package/dist/components/hx-status-indicator/hx-status-indicator.d.ts +2 -0
- package/dist/components/hx-status-indicator/hx-status-indicator.d.ts.map +1 -1
- package/dist/components/hx-status-indicator/index.d.ts +1 -2
- package/dist/components/hx-status-indicator/index.d.ts.map +1 -1
- package/dist/components/hx-status-indicator/index.js +1 -1
- package/dist/components/hx-switch/hx-switch.d.ts.map +1 -1
- package/dist/components/hx-switch/index.d.ts +1 -0
- package/dist/components/hx-switch/index.d.ts.map +1 -1
- package/dist/components/hx-textarea/hx-textarea.d.ts +7 -1
- package/dist/components/hx-textarea/hx-textarea.d.ts.map +1 -1
- package/dist/components/hx-textarea/hx-textarea.styles.d.ts.map +1 -1
- package/dist/components/hx-textarea/index.js +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -25
- package/dist/shared/{hx-accordion-C84oGPj7.js → hx-accordion-D95XSAft.js} +33 -38
- package/dist/shared/hx-accordion-D95XSAft.js.map +1 -0
- package/dist/shared/{hx-action-bar-DxpGLABm.js → hx-action-bar-D43v5rA2.js} +11 -11
- package/dist/shared/hx-action-bar-D43v5rA2.js.map +1 -0
- package/dist/shared/hx-alert-BQpT4gL3.js.map +1 -1
- package/dist/shared/{hx-avatar-ekyZvOCm.js → hx-avatar-yHjmNdtf.js} +80 -58
- package/dist/shared/hx-avatar-yHjmNdtf.js.map +1 -0
- package/dist/shared/{hx-button-DpFW7PO3.js → hx-button-SAbf4_jC.js} +37 -30
- package/dist/shared/hx-button-SAbf4_jC.js.map +1 -0
- package/dist/shared/{hx-button-group-DxCwaWnu.js → hx-button-group-DET_Pkxt.js} +15 -26
- package/dist/shared/hx-button-group-DET_Pkxt.js.map +1 -0
- package/dist/shared/{hx-card-VdiB2Pc4.js → hx-card-DAkEfpJd.js} +12 -8
- package/dist/shared/hx-card-DAkEfpJd.js.map +1 -0
- package/dist/shared/{hx-checkbox-Dq2xXIvl.js → hx-checkbox-BMayOpAM.js} +13 -1
- package/dist/shared/hx-checkbox-BMayOpAM.js.map +1 -0
- package/dist/shared/{hx-checkbox-group-BLePVahw.js → hx-checkbox-group-CIIijwmc.js} +24 -24
- package/dist/shared/hx-checkbox-group-CIIijwmc.js.map +1 -0
- package/dist/shared/{hx-code-snippet-DjY96OY8.js → hx-code-snippet-DdEqy-1B.js} +3 -2
- package/dist/shared/{hx-code-snippet-DjY96OY8.js.map → hx-code-snippet-DdEqy-1B.js.map} +1 -1
- package/dist/shared/{hx-color-picker-O4b_6QXT.js → hx-color-picker-K2x_dyeG.js} +64 -66
- package/dist/shared/hx-color-picker-K2x_dyeG.js.map +1 -0
- package/dist/shared/{hx-container-COinHjxn.js → hx-container-BXZBaOGG.js} +13 -12
- package/dist/shared/hx-container-BXZBaOGG.js.map +1 -0
- package/dist/shared/{hx-dialog-1VegS0l1.js → hx-dialog-e4CSD8xX.js} +23 -23
- package/dist/shared/hx-dialog-e4CSD8xX.js.map +1 -0
- package/dist/shared/{hx-divider-UdSFzALX.js → hx-divider-XgWIz4Mr.js} +2 -2
- package/dist/shared/{hx-divider-UdSFzALX.js.map → hx-divider-XgWIz4Mr.js.map} +1 -1
- package/dist/shared/hx-drawer-CenIAGuR.js.map +1 -1
- package/dist/shared/{hx-field-BMyp6hBx.js → hx-field-Dz-7M_SC.js} +2 -2
- package/dist/shared/hx-field-Dz-7M_SC.js.map +1 -0
- package/dist/shared/hx-field-label-Bg-EWvqF.js.map +1 -1
- package/dist/shared/hx-file-upload-DnYiIhyN.js.map +1 -1
- package/dist/shared/{hx-link-D73HP4Lq.js → hx-link-DfNy_UU8.js} +4 -5
- package/dist/shared/hx-link-DfNy_UU8.js.map +1 -0
- package/dist/shared/{hx-menu-divider-Bds6Gn6b.js → hx-menu-divider-Buc5XA9E.js} +79 -52
- package/dist/shared/hx-menu-divider-Buc5XA9E.js.map +1 -0
- package/dist/shared/{hx-nav-TK0mPfU6.js → hx-nav-CWwByFdq.js} +78 -63
- package/dist/shared/hx-nav-CWwByFdq.js.map +1 -0
- package/dist/shared/{hx-nav-item-XvXQzMwc.js → hx-nav-item-DItaMWl0.js} +1 -2
- package/dist/shared/hx-nav-item-DItaMWl0.js.map +1 -0
- package/dist/shared/{hx-number-input-BJ5XSvjL.js → hx-number-input-CS6_w1lT.js} +7 -1
- package/dist/shared/hx-number-input-CS6_w1lT.js.map +1 -0
- package/dist/shared/{hx-progress-ring-QGg5fdis.js → hx-progress-ring-wOSv2y_I.js} +32 -35
- package/dist/shared/hx-progress-ring-wOSv2y_I.js.map +1 -0
- package/dist/shared/{hx-radio-CWzYFy-I.js → hx-radio-reSaVmIB.js} +41 -40
- package/dist/shared/hx-radio-reSaVmIB.js.map +1 -0
- package/dist/shared/{hx-slider-BMofa55D.js → hx-slider-CzHOl3Ur.js} +11 -2
- package/dist/shared/hx-slider-CzHOl3Ur.js.map +1 -0
- package/dist/shared/{hx-split-panel-D9Jg5qKO.js → hx-split-panel-Cxkeauwe.js} +22 -22
- package/dist/shared/hx-split-panel-Cxkeauwe.js.map +1 -0
- package/dist/shared/{hx-status-indicator-Mv44COA-.js → hx-status-indicator-oYWOkWlD.js} +31 -24
- package/dist/shared/{hx-status-indicator-Mv44COA-.js.map → hx-status-indicator-oYWOkWlD.js.map} +1 -1
- package/dist/shared/hx-switch-BPvIcDpM.js.map +1 -1
- package/dist/shared/{hx-textarea-Bsq5aJf8.js → hx-textarea-BLcReynr.js} +42 -26
- package/dist/shared/hx-textarea-BLcReynr.js.map +1 -0
- package/fouc.css +88 -0
- package/package.json +5 -3
- package/dist/shared/hx-accordion-C84oGPj7.js.map +0 -1
- package/dist/shared/hx-action-bar-DxpGLABm.js.map +0 -1
- package/dist/shared/hx-avatar-ekyZvOCm.js.map +0 -1
- package/dist/shared/hx-button-DpFW7PO3.js.map +0 -1
- package/dist/shared/hx-button-group-DxCwaWnu.js.map +0 -1
- package/dist/shared/hx-card-VdiB2Pc4.js.map +0 -1
- package/dist/shared/hx-checkbox-Dq2xXIvl.js.map +0 -1
- package/dist/shared/hx-checkbox-group-BLePVahw.js.map +0 -1
- package/dist/shared/hx-color-picker-O4b_6QXT.js.map +0 -1
- package/dist/shared/hx-container-COinHjxn.js.map +0 -1
- package/dist/shared/hx-dialog-1VegS0l1.js.map +0 -1
- package/dist/shared/hx-field-BMyp6hBx.js.map +0 -1
- package/dist/shared/hx-link-D73HP4Lq.js.map +0 -1
- package/dist/shared/hx-menu-divider-Bds6Gn6b.js.map +0 -1
- package/dist/shared/hx-nav-TK0mPfU6.js.map +0 -1
- package/dist/shared/hx-nav-item-XvXQzMwc.js.map +0 -1
- package/dist/shared/hx-number-input-BJ5XSvjL.js.map +0 -1
- package/dist/shared/hx-progress-ring-QGg5fdis.js.map +0 -1
- package/dist/shared/hx-radio-CWzYFy-I.js.map +0 -1
- package/dist/shared/hx-slider-BMofa55D.js.map +0 -1
- package/dist/shared/hx-split-panel-D9Jg5qKO.js.map +0 -1
- package/dist/shared/hx-textarea-Bsq5aJf8.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { css as p, LitElement as f,
|
|
2
|
-
import {
|
|
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
|
|
5
|
-
const
|
|
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
|
|
28
|
-
for (var n = i > 1 ? void 0 : i ?
|
|
29
|
-
(
|
|
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
|
|
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,
|
|
131
|
-
|
|
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
|
|
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
|
|
221
|
-
for (var n = i > 1 ? void 0 : i ?
|
|
222
|
-
(
|
|
223
|
-
return i && 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
365
|
+
return c`
|
|
342
366
|
<div
|
|
343
367
|
part="base"
|
|
344
|
-
class=${
|
|
368
|
+
class=${g(s)}
|
|
345
369
|
role=${e}
|
|
346
|
-
tabindex=${this.disabled ? "-1" :
|
|
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
|
-
|
|
395
|
+
a.styles = [v, I];
|
|
396
|
+
h([
|
|
397
|
+
_()
|
|
398
|
+
], a.prototype, "_rovingTabIndex", 2);
|
|
372
399
|
h([
|
|
373
|
-
|
|
374
|
-
],
|
|
400
|
+
u({ type: String })
|
|
401
|
+
], a.prototype, "value", 2);
|
|
375
402
|
h([
|
|
376
|
-
|
|
377
|
-
],
|
|
403
|
+
u({ type: Boolean, reflect: !0 })
|
|
404
|
+
], a.prototype, "disabled", 2);
|
|
378
405
|
h([
|
|
379
|
-
|
|
380
|
-
],
|
|
406
|
+
u({ type: Boolean, reflect: !0 })
|
|
407
|
+
], a.prototype, "checked", 2);
|
|
381
408
|
h([
|
|
382
|
-
|
|
383
|
-
],
|
|
409
|
+
u({ type: String, reflect: !0 })
|
|
410
|
+
], a.prototype, "type", 2);
|
|
384
411
|
h([
|
|
385
|
-
|
|
386
|
-
],
|
|
412
|
+
u({ type: Boolean, reflect: !0 })
|
|
413
|
+
], a.prototype, "loading", 2);
|
|
387
414
|
h([
|
|
388
415
|
_()
|
|
389
|
-
],
|
|
390
|
-
|
|
416
|
+
], a.prototype, "_hasSubmenu", 2);
|
|
417
|
+
a = h([
|
|
391
418
|
x("hx-menu-item")
|
|
392
|
-
],
|
|
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
|
|
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 =
|
|
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
|
-
|
|
453
|
+
a as b
|
|
427
454
|
};
|
|
428
|
-
//# sourceMappingURL=hx-menu-divider-
|
|
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
|
|
2
|
-
import { property as x, state as
|
|
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
|
|
5
|
-
import { tokenStyles as
|
|
6
|
-
const
|
|
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
|
-
|
|
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
|
|
246
|
-
for (var
|
|
247
|
-
(c = e[
|
|
248
|
-
return
|
|
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
|
|
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
|
|
276
|
-
a.preventDefault(), (
|
|
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,
|
|
295
|
-
const
|
|
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 (!
|
|
299
|
-
const
|
|
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(), (
|
|
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 =
|
|
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 =
|
|
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,
|
|
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
|
|
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,
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 ?
|
|
389
|
-
<line x1="6" y1="6" x2="18" y2="18"></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
|
|
424
|
+
_renderSubMenu(e, n, a) {
|
|
425
|
+
const t = this._expandedIndex === n;
|
|
415
426
|
return d`
|
|
416
|
-
<ul
|
|
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=${(
|
|
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),
|
|
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":
|
|
446
|
-
},
|
|
461
|
+
"nav__link--expanded": t
|
|
462
|
+
}, s = a ? d`
|
|
447
463
|
<button
|
|
448
464
|
part="link"
|
|
449
|
-
class=${v(
|
|
450
|
-
aria-expanded=${
|
|
451
|
-
|
|
452
|
-
@
|
|
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(
|
|
463
|
-
aria-current=${e.current ? "page" :
|
|
464
|
-
@click=${(
|
|
465
|
-
@keydown=${(
|
|
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">${
|
|
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
|
-
${
|
|
507
|
+
${w(
|
|
493
508
|
this.items,
|
|
494
|
-
(n) =>
|
|
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 = [
|
|
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
|
-
|
|
541
|
+
b()
|
|
527
542
|
], h.prototype, "_mobileOpen", 2);
|
|
528
543
|
p([
|
|
529
|
-
|
|
544
|
+
b()
|
|
530
545
|
], h.prototype, "_expandedIndex", 2);
|
|
531
546
|
h = p([
|
|
532
|
-
|
|
547
|
+
y("hx-nav")
|
|
533
548
|
], h);
|
|
534
549
|
export {
|
|
535
550
|
h as H
|
|
536
551
|
};
|
|
537
|
-
//# sourceMappingURL=hx-nav-
|
|
552
|
+
//# sourceMappingURL=hx-nav-CWwByFdq.js.map
|