@helixui/library 1.1.2-next.8 → 1.1.2-next.9
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 +627 -580
- package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts +1 -0
- package/dist/components/hx-breadcrumb/hx-breadcrumb-item.d.ts.map +1 -1
- package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts +10 -8
- package/dist/components/hx-breadcrumb/hx-breadcrumb.d.ts.map +1 -1
- package/dist/components/hx-breadcrumb/index.js +1 -1
- package/dist/components/hx-menu/hx-menu-item.d.ts +5 -0
- package/dist/components/hx-menu/hx-menu-item.d.ts.map +1 -1
- package/dist/components/hx-menu/hx-menu.d.ts +1 -0
- package/dist/components/hx-menu/hx-menu.d.ts.map +1 -1
- package/dist/components/hx-menu/hx-menu.styles.d.ts.map +1 -1
- package/dist/components/hx-menu/index.js +1 -1
- package/dist/components/hx-nav/hx-nav.d.ts +10 -0
- package/dist/components/hx-nav/hx-nav.d.ts.map +1 -1
- package/dist/components/hx-nav/index.js +1 -1
- package/dist/components/hx-pagination/hx-pagination.d.ts.map +1 -1
- package/dist/components/hx-pagination/index.js +1 -1
- package/dist/components/hx-tabs/hx-tab.styles.d.ts.map +1 -1
- package/dist/components/hx-tabs/hx-tabs.d.ts +10 -0
- package/dist/components/hx-tabs/hx-tabs.d.ts.map +1 -1
- package/dist/components/hx-tabs/index.js +1 -1
- package/dist/components/hx-tree-view/hx-tree-item.d.ts +5 -0
- package/dist/components/hx-tree-view/hx-tree-item.d.ts.map +1 -1
- package/dist/components/hx-tree-view/hx-tree-view.d.ts +6 -0
- package/dist/components/hx-tree-view/hx-tree-view.d.ts.map +1 -1
- package/dist/components/hx-tree-view/index.js +1 -1
- package/dist/css/helix-all.css +2 -0
- package/dist/css/helix-navigation.css +2 -0
- package/dist/css/hx-menu.css +2 -0
- package/dist/css/index.css +1 -1
- package/dist/css/manifest.json +2 -1
- package/dist/index.js +6 -6
- package/dist/shared/{hx-breadcrumb-item-B2rjepqy.js → hx-breadcrumb-item-CObc-WJl.js} +8 -6
- package/dist/shared/hx-breadcrumb-item-CObc-WJl.js.map +1 -0
- package/dist/shared/{hx-menu-divider-DR4G_rqw.js → hx-menu-divider-puPmRAdN.js} +40 -20
- package/dist/shared/hx-menu-divider-puPmRAdN.js.map +1 -0
- package/dist/shared/{hx-nav-D377Ngz4.js → hx-nav-CiyqaW2I.js} +112 -99
- package/dist/shared/hx-nav-CiyqaW2I.js.map +1 -0
- package/dist/shared/{hx-pagination-DYhYPqDn.js → hx-pagination-Cb9UEWXz.js} +74 -66
- package/dist/shared/{hx-pagination-DYhYPqDn.js.map → hx-pagination-Cb9UEWXz.js.map} +1 -1
- package/dist/shared/{hx-tab-panel-GGjk6Qg4.js → hx-tab-panel-Dnt8aA74.js} +89 -61
- package/dist/shared/hx-tab-panel-Dnt8aA74.js.map +1 -0
- package/dist/shared/{hx-tree-item-DTDIBRrI.js → hx-tree-item-C1PhX-HE.js} +50 -19
- package/dist/shared/hx-tree-item-C1PhX-HE.js.map +1 -0
- package/package.json +2 -2
- package/dist/shared/hx-breadcrumb-item-B2rjepqy.js.map +0 -1
- package/dist/shared/hx-menu-divider-DR4G_rqw.js.map +0 -1
- package/dist/shared/hx-nav-D377Ngz4.js.map +0 -1
- package/dist/shared/hx-tab-panel-GGjk6Qg4.js.map +0 -1
- package/dist/shared/hx-tree-item-DTDIBRrI.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { css as p, LitElement as f, html as u, nothing as h } from "lit";
|
|
2
|
-
import { property as c, customElement as x, state as
|
|
3
|
-
import { tokenStyles as
|
|
2
|
+
import { property as c, customElement as x, state as _, query as g } from "lit/decorators.js";
|
|
3
|
+
import { tokenStyles as v } from "@helixui/tokens/lit";
|
|
4
4
|
import { d as y } from "./dev-warn-YlwPHjtX.js";
|
|
5
5
|
import { classMap as k } from "lit/directives/class-map.js";
|
|
6
6
|
const I = p`
|
|
@@ -22,11 +22,13 @@ const I = p`
|
|
|
22
22
|
0 2px 4px -2px rgb(0 0 0 / 0.1)
|
|
23
23
|
);
|
|
24
24
|
min-width: var(--hx-menu-min-width, 10rem);
|
|
25
|
+
max-height: var(--hx-menu-max-height, 20rem);
|
|
26
|
+
overflow-y: auto;
|
|
25
27
|
outline: none;
|
|
26
28
|
}
|
|
27
29
|
`;
|
|
28
|
-
var w = Object.defineProperty,
|
|
29
|
-
for (var n = i > 1 ? void 0 : i ?
|
|
30
|
+
var w = Object.defineProperty, S = Object.getOwnPropertyDescriptor, b = (e, t, s, i) => {
|
|
31
|
+
for (var n = i > 1 ? void 0 : i ? S(t, s) : t, r = e.length - 1, o; r >= 0; r--)
|
|
30
32
|
(o = e[r]) && (n = (i ? o(t, s, n) : o(n)) || n);
|
|
31
33
|
return i && n && w(t, s, n), n;
|
|
32
34
|
};
|
|
@@ -155,14 +157,14 @@ let d = class extends f {
|
|
|
155
157
|
`;
|
|
156
158
|
}
|
|
157
159
|
};
|
|
158
|
-
d.styles = [
|
|
160
|
+
d.styles = [v, I];
|
|
159
161
|
b([
|
|
160
162
|
c({ type: String, reflect: !0 })
|
|
161
163
|
], d.prototype, "label", 2);
|
|
162
164
|
d = b([
|
|
163
165
|
x("hx-menu")
|
|
164
166
|
], d);
|
|
165
|
-
const
|
|
167
|
+
const C = p`
|
|
166
168
|
:host {
|
|
167
169
|
display: block;
|
|
168
170
|
}
|
|
@@ -262,19 +264,23 @@ const S = p`
|
|
|
262
264
|
}
|
|
263
265
|
}
|
|
264
266
|
`;
|
|
265
|
-
var T = Object.defineProperty,
|
|
266
|
-
for (var n = i > 1 ? void 0 : i ?
|
|
267
|
+
var T = Object.defineProperty, E = Object.getOwnPropertyDescriptor, l = (e, t, s, i) => {
|
|
268
|
+
for (var n = i > 1 ? void 0 : i ? E(t, s) : t, r = e.length - 1, o; r >= 0; r--)
|
|
267
269
|
(o = e[r]) && (n = (i ? o(t, s, n) : o(n)) || n);
|
|
268
270
|
return i && n && T(t, s, n), n;
|
|
269
271
|
};
|
|
270
272
|
let a = class extends f {
|
|
271
273
|
constructor() {
|
|
272
|
-
super(...arguments), this._rovingTabIndex = -1, this.value = "", this.disabled = !1, this.checked = !1, this.type = "normal", this.loading = !1, this._hasSubmenu = !1;
|
|
274
|
+
super(...arguments), this._rovingTabIndex = -1, this.value = "", this.disabled = !1, this.checked = !1, this.type = "normal", this.loading = !1, this._hasSubmenu = !1, this._submenuOpen = !1;
|
|
273
275
|
}
|
|
274
276
|
/** @internal Set the roving tabindex value. Called by parent hx-menu. */
|
|
275
277
|
setRovingTabIndex(e) {
|
|
276
278
|
this._rovingTabIndex = e;
|
|
277
279
|
}
|
|
280
|
+
/** Set whether the nested submenu is open. Called by the component managing submenu visibility. */
|
|
281
|
+
setSubmenuOpen(e) {
|
|
282
|
+
this._submenuOpen = e;
|
|
283
|
+
}
|
|
278
284
|
/** Focus the inner interactive element. */
|
|
279
285
|
focus(e) {
|
|
280
286
|
var t;
|
|
@@ -322,8 +328,18 @@ let a = class extends f {
|
|
|
322
328
|
e.preventDefault(), this._activate();
|
|
323
329
|
return;
|
|
324
330
|
}
|
|
325
|
-
e.key === "ArrowRight" && this._hasSubmenu
|
|
326
|
-
|
|
331
|
+
if (e.key === "ArrowRight" && this._hasSubmenu) {
|
|
332
|
+
e.preventDefault(), this.dispatchEvent(
|
|
333
|
+
new CustomEvent("hx-item-submenu-open", {
|
|
334
|
+
bubbles: !0,
|
|
335
|
+
composed: !0,
|
|
336
|
+
detail: { item: this }
|
|
337
|
+
})
|
|
338
|
+
);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
e.key === "ArrowLeft" && (e.preventDefault(), this.dispatchEvent(
|
|
342
|
+
new CustomEvent("hx-item-submenu-close", {
|
|
327
343
|
bubbles: !0,
|
|
328
344
|
composed: !0,
|
|
329
345
|
detail: { item: this }
|
|
@@ -406,7 +422,8 @@ let a = class extends f {
|
|
|
406
422
|
tabindex=${this.disabled ? "-1" : String(this._rovingTabIndex)}
|
|
407
423
|
aria-disabled=${this.disabled ? "true" : h}
|
|
408
424
|
aria-checked=${t ? this.checked ? "true" : "false" : h}
|
|
409
|
-
aria-haspopup=${this._hasSubmenu ? "
|
|
425
|
+
aria-haspopup=${this._hasSubmenu ? "menu" : h}
|
|
426
|
+
aria-expanded=${this._hasSubmenu ? this._submenuOpen ? "true" : "false" : h}
|
|
410
427
|
aria-busy=${this.loading ? "true" : h}
|
|
411
428
|
@click=${this._handleClick}
|
|
412
429
|
@keydown=${this._handleKeyDown}
|
|
@@ -428,9 +445,9 @@ let a = class extends f {
|
|
|
428
445
|
`;
|
|
429
446
|
}
|
|
430
447
|
};
|
|
431
|
-
a.styles = [
|
|
448
|
+
a.styles = [v, C];
|
|
432
449
|
l([
|
|
433
|
-
|
|
450
|
+
_()
|
|
434
451
|
], a.prototype, "_rovingTabIndex", 2);
|
|
435
452
|
l([
|
|
436
453
|
c({ type: String })
|
|
@@ -448,15 +465,18 @@ l([
|
|
|
448
465
|
c({ type: Boolean, reflect: !0 })
|
|
449
466
|
], a.prototype, "loading", 2);
|
|
450
467
|
l([
|
|
451
|
-
|
|
468
|
+
_()
|
|
452
469
|
], a.prototype, "_hasSubmenu", 2);
|
|
470
|
+
l([
|
|
471
|
+
_()
|
|
472
|
+
], a.prototype, "_submenuOpen", 2);
|
|
453
473
|
l([
|
|
454
474
|
g(".menu-item")
|
|
455
475
|
], a.prototype, "_menuItemEl", 2);
|
|
456
476
|
a = l([
|
|
457
477
|
x("hx-menu-item")
|
|
458
478
|
], a);
|
|
459
|
-
const
|
|
479
|
+
const $ = p`
|
|
460
480
|
:host {
|
|
461
481
|
display: block;
|
|
462
482
|
}
|
|
@@ -467,7 +487,7 @@ const E = p`
|
|
|
467
487
|
margin: var(--hx-space-1, 0.25rem) calc(-1 * var(--hx-space-1, 0.25rem));
|
|
468
488
|
}
|
|
469
489
|
`;
|
|
470
|
-
var D = Object.getOwnPropertyDescriptor,
|
|
490
|
+
var D = Object.getOwnPropertyDescriptor, O = (e, t, s, i) => {
|
|
471
491
|
for (var n = i > 1 ? void 0 : i ? D(t, s) : t, r = e.length - 1, o; r >= 0; r--)
|
|
472
492
|
(o = e[r]) && (n = o(n) || n);
|
|
473
493
|
return n;
|
|
@@ -482,8 +502,8 @@ let m = class extends f {
|
|
|
482
502
|
></div>`;
|
|
483
503
|
}
|
|
484
504
|
};
|
|
485
|
-
m.styles = [
|
|
486
|
-
m =
|
|
505
|
+
m.styles = [v, $];
|
|
506
|
+
m = O([
|
|
487
507
|
x("hx-menu-divider")
|
|
488
508
|
], m);
|
|
489
509
|
export {
|
|
@@ -491,4 +511,4 @@ export {
|
|
|
491
511
|
m as a,
|
|
492
512
|
a as b
|
|
493
513
|
};
|
|
494
|
-
//# sourceMappingURL=hx-menu-divider-
|
|
514
|
+
//# sourceMappingURL=hx-menu-divider-puPmRAdN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hx-menu-divider-puPmRAdN.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 max-height: var(--hx-menu-max-height, 20rem);\n overflow-y: auto;\n outline: none;\n }\n`;\n","import { LitElement, html } 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';\nimport { devWarn } from '../../utils/dev-warn.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 * @cssprop [--hx-menu-max-height=20rem] - Maximum menu height before vertical scroll is activated.\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 /**\n * Index of the currently focused menu item within the list of enabled items.\n * @internal\n */\n private _focusedIndex = -1;\n\n /**\n * Accumulated character buffer for typeahead search within menu items.\n * @internal\n */\n private _typeaheadBuffer = '';\n\n /**\n * Timer handle that clears the typeahead buffer after a period of inactivity.\n * @internal\n */\n private _typeaheadTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** @internal */\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 /** @internal */\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 /** @internal */\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 /** @internal */\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 /** @internal */\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<void>('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 /** @internal */\n private _handleTypeahead(char: string, items: HelixMenuItem[]): void {\n if (this._typeaheadTimer !== null) {\n clearTimeout(this._typeaheadTimer);\n }\n this._typeaheadBuffer += char.toLowerCase();\n this._typeaheadTimer = setTimeout(() => {\n this._typeaheadBuffer = '';\n this._typeaheadTimer = null;\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 /** @internal */\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 devWarn(\n 'hx-menu',\n `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 /** @internal */\n private _handleItemSelect(e: Event): void {\n if (!(e instanceof CustomEvent)) return;\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<{ item: HelixMenuItem; value: string }>('hx-select', {\n bubbles: true,\n composed: true,\n detail: { item: detail.item, value: detail.value },\n }),\n );\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this._typeaheadTimer !== null) {\n clearTimeout(this._typeaheadTimer);\n this._typeaheadTimer = null;\n }\n }\n\n override firstUpdated(): void {\n if (!this.label) {\n devWarn(\n 'hx-menu',\n 'No accessible label provided. Set the `label` attribute on hx-menu so screen readers can identify this menu (WCAG 4.1.2).',\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 || 'Menu'}\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-menu-item-focus-ring-color, var(--hx-focus-ring-color, var(--hx-color-primary-500)));\n outline-offset: var(--hx-menu-item-focus-ring-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 {\n transition: none;\n }\n\n .menu-item__checked-icon {\n transition: none;\n }\n\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, query, 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';\nimport { devWarn } from '../../utils/dev-warn.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 * @fires {CustomEvent<{item: HelixMenuItem}>} hx-item-submenu-close - Dispatched when ArrowLeft is pressed on an item, signaling the parent to close the submenu and return focus.\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 /** Set whether the nested submenu is open. Called by the component managing submenu visibility. */\n setSubmenuOpen(open: boolean): void {\n this._submenuOpen = open;\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 /** @internal */\n @state()\n private _hasSubmenu = false;\n\n /** @internal Tracks whether the nested submenu is currently open. */\n @state()\n private _submenuOpen = false;\n\n /** @internal */\n @query('.menu-item') private _menuItemEl!: HTMLElement | null;\n\n /** Focus the inner interactive element. */\n override focus(options?: FocusOptions): void {\n this._menuItemEl?.focus(options);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n // WCAG 4.1.2: menuitem role is only valid inside a role=\"menu\" or role=\"menubar\" container.\n // Check the closest ancestor with a menu role.\n const menuHost = this.closest('hx-menu, hx-split-button, [role=\"menu\"], [role=\"menubar\"]');\n if (!menuHost) {\n devWarn(\n 'hx-menu-item',\n 'hx-menu-item must be used inside an hx-menu or an element with role=\"menu\". ' +\n 'An orphaned menuitem violates WCAG 1.3.1 (Info and Relationships).',\n );\n }\n }\n\n /** @internal */\n private _handleSubmenuSlotChange(e: Event): void {\n const slot = e.target as HTMLSlotElement;\n this._hasSubmenu = slot.assignedElements().length > 0;\n }\n\n /** @internal */\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<{ item: HelixMenuItem; value: string }>('hx-item-select', {\n bubbles: true,\n composed: true,\n detail: { item: this, value: this.value },\n }),\n );\n }\n\n /** @internal */\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 /** @internal */\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<{ item: HelixMenuItem }>('hx-item-submenu-open', {\n bubbles: true,\n composed: true,\n detail: { item: this },\n }),\n );\n return;\n }\n\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n this.dispatchEvent(\n new CustomEvent<{ item: HelixMenuItem }>('hx-item-submenu-close', {\n bubbles: true,\n composed: true,\n detail: { item: this },\n }),\n );\n }\n }\n\n /** @internal */\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 /** @internal */\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 /** @internal */\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 /** @internal */\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 ? 'menu' : nothing}\n aria-expanded=${this._hasSubmenu ? (this._submenuOpen ? 'true' : 'false') : 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","devWarn","detail","html","tokenStyles","__decorateClass","property","customElement","helixMenuItemStyles","HelixMenuItem","value","open","options","menu","sibling","role","hasCheckableRole","classes","classMap","nothing","state","query","helixMenuDividerStyles","HelixMenuDivider"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { css as
|
|
2
|
-
import { property as
|
|
3
|
-
import { classMap as
|
|
4
|
-
import { repeat as
|
|
5
|
-
import { tokenStyles as
|
|
6
|
-
const
|
|
1
|
+
import { css as y, LitElement as w, svg as g, html as u, nothing as f } from "lit";
|
|
2
|
+
import { property as x, state as k, customElement as C } from "lit/decorators.js";
|
|
3
|
+
import { classMap as m } from "lit/directives/class-map.js";
|
|
4
|
+
import { repeat as $ } from "lit/directives/repeat.js";
|
|
5
|
+
import { tokenStyles as I } from "@helixui/tokens/lit";
|
|
6
|
+
const O = y`
|
|
7
7
|
:host {
|
|
8
8
|
display: block;
|
|
9
9
|
font-family: var(--hx-nav-font-family, var(--hx-font-family-sans, sans-serif));
|
|
@@ -246,14 +246,14 @@ const $ = g`
|
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
248
|
`;
|
|
249
|
-
var
|
|
250
|
-
for (var t =
|
|
251
|
-
(l = e[i]) && (t = (
|
|
252
|
-
return
|
|
249
|
+
var S = Object.defineProperty, A = Object.getOwnPropertyDescriptor, p = (e, n, r, o) => {
|
|
250
|
+
for (var t = o > 1 ? void 0 : o ? A(n, r) : n, i = e.length - 1, l; i >= 0; i--)
|
|
251
|
+
(l = e[i]) && (t = (o ? l(n, r, t) : l(t)) || t);
|
|
252
|
+
return o && t && S(n, r, t), t;
|
|
253
253
|
};
|
|
254
|
-
let c = class extends
|
|
254
|
+
let c = class extends w {
|
|
255
255
|
constructor() {
|
|
256
|
-
super(...arguments), this.items = [], this.orientation = "horizontal", this.label = "Main navigation", this.labelOpenMenu = "Open navigation menu", this.labelCloseMenu = "Close navigation menu", this._mobileOpen = !1, this._expandedIndex = null, this._boundOutsideClick = this._handleOutsideClick.bind(this);
|
|
256
|
+
super(...arguments), this.items = [], this.orientation = "horizontal", this.label = "Main navigation", this.labelOpenMenu = "Open navigation menu", this.labelCloseMenu = "Close navigation menu", this._mobileOpen = !1, this._expandedIndex = null, this._boundOutsideClick = this._handleOutsideClick.bind(this), this._boundFocusout = this._handleFocusout.bind(this);
|
|
257
257
|
}
|
|
258
258
|
/**
|
|
259
259
|
* Sanitizes a URL to prevent XSS via javascript: or data: URIs.
|
|
@@ -277,9 +277,9 @@ let c = class extends k {
|
|
|
277
277
|
this._mobileOpen = !this._mobileOpen, this._mobileOpen || (this._expandedIndex = null);
|
|
278
278
|
}
|
|
279
279
|
/** @internal */
|
|
280
|
-
_handleItemClick(e, n,
|
|
281
|
-
var
|
|
282
|
-
|
|
280
|
+
_handleItemClick(e, n, r) {
|
|
281
|
+
var o;
|
|
282
|
+
r.preventDefault(), (o = e.children) != null && o.length ? this._expandedIndex = this._expandedIndex === n ? null : n : (this._mobileOpen = !1, this._expandedIndex = null, this.dispatchEvent(
|
|
283
283
|
new CustomEvent("hx-nav-select", {
|
|
284
284
|
bubbles: !0,
|
|
285
285
|
composed: !0,
|
|
@@ -298,35 +298,43 @@ let c = class extends k {
|
|
|
298
298
|
);
|
|
299
299
|
}
|
|
300
300
|
/** @internal */
|
|
301
|
-
_handleKeydown(e, n,
|
|
302
|
-
var l,
|
|
303
|
-
const
|
|
301
|
+
_handleKeydown(e, n, r) {
|
|
302
|
+
var l, d, h, a, _;
|
|
303
|
+
const o = (l = this.shadowRoot) == null ? void 0 : l.querySelectorAll(
|
|
304
304
|
'[part="list"] > [part="item"] > [part="link"]'
|
|
305
305
|
);
|
|
306
|
-
if (!
|
|
307
|
-
const t = Array.from(
|
|
306
|
+
if (!o) return;
|
|
307
|
+
const t = Array.from(o), i = t[n];
|
|
308
308
|
switch (e.key) {
|
|
309
309
|
case "ArrowRight":
|
|
310
310
|
case "ArrowDown": {
|
|
311
|
-
if (e.preventDefault(), (
|
|
311
|
+
if (e.preventDefault(), (d = r.children) != null && d.length && e.key === "ArrowDown" && this.orientation === "horizontal")
|
|
312
312
|
this._expandedIndex = n, this.updateComplete.then(() => {
|
|
313
|
-
var
|
|
314
|
-
const
|
|
313
|
+
var v;
|
|
314
|
+
const s = (v = this.shadowRoot) == null ? void 0 : v.querySelector(
|
|
315
315
|
'.nav__submenu [part="link"]'
|
|
316
316
|
);
|
|
317
|
-
|
|
317
|
+
s == null || s.focus();
|
|
318
318
|
});
|
|
319
319
|
else {
|
|
320
|
-
const
|
|
321
|
-
|
|
320
|
+
const s = t[n + 1] ?? t[0];
|
|
321
|
+
s == null || s.focus();
|
|
322
322
|
}
|
|
323
323
|
break;
|
|
324
324
|
}
|
|
325
325
|
case "ArrowLeft":
|
|
326
326
|
case "ArrowUp": {
|
|
327
327
|
e.preventDefault();
|
|
328
|
-
const
|
|
329
|
-
|
|
328
|
+
const s = t[n - 1] ?? t[t.length - 1];
|
|
329
|
+
s == null || s.focus();
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
case "Home": {
|
|
333
|
+
e.preventDefault(), (h = t[0]) == null || h.focus();
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
case "End": {
|
|
337
|
+
e.preventDefault(), (a = t[t.length - 1]) == null || a.focus();
|
|
330
338
|
break;
|
|
331
339
|
}
|
|
332
340
|
case "Escape": {
|
|
@@ -335,15 +343,15 @@ let c = class extends k {
|
|
|
335
343
|
}
|
|
336
344
|
case "Enter":
|
|
337
345
|
case " ": {
|
|
338
|
-
if ((
|
|
346
|
+
if ((_ = r.children) != null && _.length) {
|
|
339
347
|
e.preventDefault();
|
|
340
|
-
const
|
|
341
|
-
this._expandedIndex =
|
|
342
|
-
var
|
|
343
|
-
const
|
|
348
|
+
const s = this._expandedIndex === n;
|
|
349
|
+
this._expandedIndex = s ? null : n, s || this.updateComplete.then(() => {
|
|
350
|
+
var b;
|
|
351
|
+
const v = (b = this.shadowRoot) == null ? void 0 : b.querySelector(
|
|
344
352
|
'.nav__submenu:not([hidden]) [part="link"]'
|
|
345
353
|
);
|
|
346
|
-
|
|
354
|
+
v == null || v.focus();
|
|
347
355
|
});
|
|
348
356
|
}
|
|
349
357
|
break;
|
|
@@ -352,31 +360,31 @@ let c = class extends k {
|
|
|
352
360
|
}
|
|
353
361
|
/** @internal */
|
|
354
362
|
_handleSubKeydown(e, n) {
|
|
355
|
-
var l,
|
|
356
|
-
const
|
|
363
|
+
var l, d, h;
|
|
364
|
+
const r = (l = this.shadowRoot) == null ? void 0 : l.querySelectorAll(
|
|
357
365
|
'.nav__submenu:not([hidden]) [part="link"]'
|
|
358
366
|
);
|
|
359
|
-
if (!
|
|
360
|
-
const
|
|
367
|
+
if (!r) return;
|
|
368
|
+
const o = Array.from(r), t = e.currentTarget ?? e.target, i = o.indexOf(t);
|
|
361
369
|
switch (e.key) {
|
|
362
370
|
case "ArrowDown": {
|
|
363
371
|
e.preventDefault();
|
|
364
|
-
const
|
|
365
|
-
|
|
372
|
+
const a = o[i + 1] ?? o[0];
|
|
373
|
+
a == null || a.focus();
|
|
366
374
|
break;
|
|
367
375
|
}
|
|
368
376
|
case "ArrowUp": {
|
|
369
377
|
e.preventDefault();
|
|
370
|
-
const
|
|
371
|
-
|
|
378
|
+
const a = o[i - 1] ?? o[o.length - 1];
|
|
379
|
+
a == null || a.focus();
|
|
372
380
|
break;
|
|
373
381
|
}
|
|
374
382
|
case "Escape": {
|
|
375
383
|
e.preventDefault(), this._expandedIndex = null;
|
|
376
|
-
const
|
|
384
|
+
const a = (d = this.shadowRoot) == null ? void 0 : d.querySelectorAll(
|
|
377
385
|
'[part="list"] > [part="item"] > [part="link"]'
|
|
378
386
|
);
|
|
379
|
-
(
|
|
387
|
+
(h = a == null ? void 0 : a[n]) == null || h.focus();
|
|
380
388
|
break;
|
|
381
389
|
}
|
|
382
390
|
}
|
|
@@ -385,17 +393,26 @@ let c = class extends k {
|
|
|
385
393
|
_handleOutsideClick(e) {
|
|
386
394
|
e.composedPath().includes(this) || (this._expandedIndex = null);
|
|
387
395
|
}
|
|
396
|
+
/**
|
|
397
|
+
* hx-nav-008: Close expanded submenu when focus moves outside the component.
|
|
398
|
+
* @internal
|
|
399
|
+
*/
|
|
400
|
+
_handleFocusout(e) {
|
|
401
|
+
var r;
|
|
402
|
+
const n = e.relatedTarget;
|
|
403
|
+
n && this.contains(n) || n && ((r = this.shadowRoot) != null && r.contains(n)) || (this._expandedIndex = null);
|
|
404
|
+
}
|
|
388
405
|
// ─── Lifecycle ───
|
|
389
406
|
connectedCallback() {
|
|
390
|
-
super.connectedCallback(), typeof document < "u" && document.addEventListener("click", this._boundOutsideClick);
|
|
407
|
+
super.connectedCallback(), typeof document < "u" && document.addEventListener("click", this._boundOutsideClick), this.addEventListener("focusout", this._boundFocusout);
|
|
391
408
|
}
|
|
392
409
|
disconnectedCallback() {
|
|
393
|
-
super.disconnectedCallback(), document.removeEventListener("click", this._boundOutsideClick);
|
|
410
|
+
super.disconnectedCallback(), document.removeEventListener("click", this._boundOutsideClick), this.removeEventListener("focusout", this._boundFocusout);
|
|
394
411
|
}
|
|
395
412
|
// ─── Render Helpers ───
|
|
396
413
|
/** @internal */
|
|
397
414
|
_renderHamburgerIcon() {
|
|
398
|
-
return
|
|
415
|
+
return u`<svg
|
|
399
416
|
width="24"
|
|
400
417
|
height="24"
|
|
401
418
|
viewBox="0 0 24 24"
|
|
@@ -405,15 +422,15 @@ let c = class extends k {
|
|
|
405
422
|
stroke-linecap="round"
|
|
406
423
|
aria-hidden="true"
|
|
407
424
|
>
|
|
408
|
-
${this._mobileOpen ?
|
|
409
|
-
<line x1="6" y1="6" x2="18" y2="18"></line>` :
|
|
425
|
+
${this._mobileOpen ? g`<line x1="18" y1="6" x2="6" y2="18"></line>
|
|
426
|
+
<line x1="6" y1="6" x2="18" y2="18"></line>` : g`<line x1="3" y1="12" x2="21" y2="12"></line>
|
|
410
427
|
<line x1="3" y1="6" x2="21" y2="6"></line>
|
|
411
428
|
<line x1="3" y1="18" x2="21" y2="18"></line>`}
|
|
412
429
|
</svg>`;
|
|
413
430
|
}
|
|
414
431
|
/** @internal */
|
|
415
432
|
_renderChevronIcon() {
|
|
416
|
-
return
|
|
433
|
+
return u`<svg
|
|
417
434
|
class="nav__chevron"
|
|
418
435
|
width="16"
|
|
419
436
|
height="16"
|
|
@@ -432,22 +449,17 @@ let c = class extends k {
|
|
|
432
449
|
</svg>`;
|
|
433
450
|
}
|
|
434
451
|
/** @internal */
|
|
435
|
-
_renderSubMenu(e, n,
|
|
436
|
-
const
|
|
437
|
-
return
|
|
438
|
-
<ul
|
|
439
|
-
class="nav__submenu"
|
|
440
|
-
role="list"
|
|
441
|
-
aria-label="${o} submenu"
|
|
442
|
-
?hidden=${!a}
|
|
443
|
-
>
|
|
452
|
+
_renderSubMenu(e, n, r) {
|
|
453
|
+
const o = this._expandedIndex === n;
|
|
454
|
+
return u`
|
|
455
|
+
<ul class="nav__submenu" aria-label="${r} submenu" ?hidden=${!o}>
|
|
444
456
|
${e.map(
|
|
445
|
-
(t) =>
|
|
457
|
+
(t) => u`
|
|
446
458
|
<li class="nav__submenu-item">
|
|
447
459
|
<a
|
|
448
460
|
part="link"
|
|
449
461
|
href=${this._sanitizeHref(t.href)}
|
|
450
|
-
class=${
|
|
462
|
+
class=${m({
|
|
451
463
|
nav__link: !0,
|
|
452
464
|
"nav__link--active": !!t.current
|
|
453
465
|
})}
|
|
@@ -465,36 +477,37 @@ let c = class extends k {
|
|
|
465
477
|
}
|
|
466
478
|
/** @internal */
|
|
467
479
|
_renderItem(e, n) {
|
|
468
|
-
var
|
|
469
|
-
const
|
|
480
|
+
var d, h;
|
|
481
|
+
const r = !!((d = e.children) != null && d.length), o = this._expandedIndex === n, t = r && !!((h = e.children) != null && h.some((a) => a.current)), i = {
|
|
470
482
|
nav__link: !0,
|
|
471
|
-
"nav__link--active": !!e.current,
|
|
472
|
-
"nav__link--has-submenu":
|
|
473
|
-
"nav__link--expanded":
|
|
474
|
-
},
|
|
483
|
+
"nav__link--active": !!e.current || t,
|
|
484
|
+
"nav__link--has-submenu": r,
|
|
485
|
+
"nav__link--expanded": o
|
|
486
|
+
}, l = r ? u`
|
|
475
487
|
<button
|
|
476
488
|
part="link"
|
|
477
|
-
class=${
|
|
478
|
-
aria-expanded=${
|
|
479
|
-
|
|
480
|
-
@
|
|
489
|
+
class=${m(i)}
|
|
490
|
+
aria-expanded=${o ? "true" : "false"}
|
|
491
|
+
aria-current=${t ? "true" : f}
|
|
492
|
+
@click=${(a) => this._handleItemClick(e, n, a)}
|
|
493
|
+
@keydown=${(a) => this._handleKeydown(a, n, e)}
|
|
481
494
|
>
|
|
482
495
|
${e.label} ${this._renderChevronIcon()}
|
|
483
496
|
</button>
|
|
484
497
|
${this._renderSubMenu(e.children ?? [], n, e.label)}
|
|
485
|
-
` :
|
|
498
|
+
` : u`
|
|
486
499
|
<a
|
|
487
500
|
part="link"
|
|
488
501
|
href=${this._sanitizeHref(e.href)}
|
|
489
|
-
class=${
|
|
502
|
+
class=${m(i)}
|
|
490
503
|
aria-current=${e.current ? "page" : f}
|
|
491
|
-
@click=${(
|
|
492
|
-
@keydown=${(
|
|
504
|
+
@click=${(a) => this._handleItemClick(e, n, a)}
|
|
505
|
+
@keydown=${(a) => this._handleKeydown(a, n, e)}
|
|
493
506
|
>
|
|
494
507
|
${e.label}
|
|
495
508
|
</a>
|
|
496
509
|
`;
|
|
497
|
-
return
|
|
510
|
+
return u` <li part="item" class="nav__item">${l}</li> `;
|
|
498
511
|
}
|
|
499
512
|
// ─── Render ───
|
|
500
513
|
render() {
|
|
@@ -502,7 +515,7 @@ let c = class extends k {
|
|
|
502
515
|
nav__list: !0,
|
|
503
516
|
"nav__list--open": this._mobileOpen
|
|
504
517
|
};
|
|
505
|
-
return
|
|
518
|
+
return u`
|
|
506
519
|
<nav part="nav" aria-label=${this.label}>
|
|
507
520
|
<button
|
|
508
521
|
part="toggle"
|
|
@@ -515,20 +528,20 @@ let c = class extends k {
|
|
|
515
528
|
${this._renderHamburgerIcon()}
|
|
516
529
|
</button>
|
|
517
530
|
|
|
518
|
-
<ul part="list" id="nav-list" class=${
|
|
519
|
-
${
|
|
531
|
+
<ul part="list" id="nav-list" class=${m(e)} role="list">
|
|
532
|
+
${$(
|
|
520
533
|
this.items,
|
|
521
|
-
(n,
|
|
522
|
-
(n,
|
|
534
|
+
(n, r) => r,
|
|
535
|
+
(n, r) => this._renderItem(n, r)
|
|
523
536
|
)}
|
|
524
537
|
</ul>
|
|
525
538
|
</nav>
|
|
526
539
|
`;
|
|
527
540
|
}
|
|
528
541
|
};
|
|
529
|
-
c.styles = [
|
|
530
|
-
|
|
531
|
-
|
|
542
|
+
c.styles = [I, O];
|
|
543
|
+
p([
|
|
544
|
+
x({
|
|
532
545
|
type: Array,
|
|
533
546
|
converter: {
|
|
534
547
|
fromAttribute(e) {
|
|
@@ -543,28 +556,28 @@ h([
|
|
|
543
556
|
}
|
|
544
557
|
})
|
|
545
558
|
], c.prototype, "items", 2);
|
|
546
|
-
|
|
547
|
-
|
|
559
|
+
p([
|
|
560
|
+
x({ type: String, reflect: !0 })
|
|
548
561
|
], c.prototype, "orientation", 2);
|
|
549
|
-
|
|
550
|
-
|
|
562
|
+
p([
|
|
563
|
+
x({ type: String })
|
|
551
564
|
], c.prototype, "label", 2);
|
|
552
|
-
|
|
553
|
-
|
|
565
|
+
p([
|
|
566
|
+
x({ type: String, attribute: "label-open-menu" })
|
|
554
567
|
], c.prototype, "labelOpenMenu", 2);
|
|
555
|
-
|
|
556
|
-
|
|
568
|
+
p([
|
|
569
|
+
x({ type: String, attribute: "label-close-menu" })
|
|
557
570
|
], c.prototype, "labelCloseMenu", 2);
|
|
558
|
-
|
|
559
|
-
|
|
571
|
+
p([
|
|
572
|
+
k()
|
|
560
573
|
], c.prototype, "_mobileOpen", 2);
|
|
561
|
-
|
|
562
|
-
|
|
574
|
+
p([
|
|
575
|
+
k()
|
|
563
576
|
], c.prototype, "_expandedIndex", 2);
|
|
564
|
-
c =
|
|
565
|
-
|
|
577
|
+
c = p([
|
|
578
|
+
C("hx-nav")
|
|
566
579
|
], c);
|
|
567
580
|
export {
|
|
568
581
|
c as H
|
|
569
582
|
};
|
|
570
|
-
//# sourceMappingURL=hx-nav-
|
|
583
|
+
//# sourceMappingURL=hx-nav-CiyqaW2I.js.map
|