le-kit 0.2.4 → 0.2.6
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/dist/cjs/le-bar.cjs.entry.js +428 -0
- package/dist/cjs/le-box.cjs.entry.js +1 -1
- package/dist/cjs/le-button_13.cjs.entry.js +17 -17
- package/dist/cjs/le-card.cjs.entry.js +1 -1
- package/dist/cjs/le-combobox.cjs.entry.js +1 -1
- package/dist/cjs/le-header-placeholder.cjs.entry.js +1 -1
- package/dist/cjs/le-icon.cjs.entry.js +1 -1
- package/dist/cjs/le-kit.cjs.js +1 -1
- package/dist/cjs/le-multiselect.cjs.entry.js +3 -3
- package/dist/cjs/le-navigation.cjs.entry.js +61 -250
- package/dist/cjs/le-number-input.cjs.entry.js +1 -1
- package/dist/cjs/le-round-progress.cjs.entry.js +1 -1
- package/dist/cjs/le-segmented-control.cjs.entry.js +1 -1
- package/dist/cjs/le-stack.cjs.entry.js +1 -1
- package/dist/cjs/le-tab-bar.cjs.entry.js +1 -1
- package/dist/cjs/le-tab-panel.cjs.entry.js +2 -2
- package/dist/cjs/le-tab.cjs.entry.js +1 -1
- package/dist/cjs/le-tabs.cjs.entry.js +2 -2
- package/dist/cjs/le-tag.cjs.entry.js +1 -1
- package/dist/cjs/le-turntable.cjs.entry.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/le-bar/le-bar.css +255 -0
- package/dist/collection/components/le-bar/le-bar.js +628 -0
- package/dist/collection/components/le-bar/le-bar.js.map +1 -0
- package/dist/collection/components/le-box/le-box.js +1 -1
- package/dist/collection/components/le-button/le-button.js +1 -1
- package/dist/collection/components/le-card/le-card.js +1 -1
- package/dist/collection/components/le-checkbox/le-checkbox.js +1 -1
- package/dist/collection/components/le-collapse/le-collapse.js +1 -1
- package/dist/collection/components/le-combobox/le-combobox.js +1 -1
- package/dist/collection/components/le-current-heading/le-current-heading.js +1 -1
- package/dist/collection/components/le-dropdown-base/le-dropdown-base.js +1 -1
- package/dist/collection/components/le-header/le-header.js +2 -2
- package/dist/collection/components/le-header-placeholder/le-header-placeholder.js +1 -1
- package/dist/collection/components/le-icon/le-icon.js +1 -1
- package/dist/collection/components/le-multiselect/le-multiselect.js +3 -3
- package/dist/collection/components/le-navigation/le-navigation.css +29 -47
- package/dist/collection/components/le-navigation/le-navigation.js +62 -251
- package/dist/collection/components/le-navigation/le-navigation.js.map +1 -1
- package/dist/collection/components/le-number-input/le-number-input.js +1 -1
- package/dist/collection/components/le-popover/le-popover.js +3 -3
- package/dist/collection/components/le-popup/le-popup.js +1 -1
- package/dist/collection/components/le-round-progress/le-round-progress.js +1 -1
- package/dist/collection/components/le-scroll-progress/le-scroll-progress.js +1 -1
- package/dist/collection/components/le-segmented-control/le-segmented-control.js +1 -1
- package/dist/collection/components/le-select/le-select.js +2 -2
- package/dist/collection/components/le-slot/le-slot.js +1 -1
- package/dist/collection/components/le-stack/le-stack.js +1 -1
- package/dist/collection/components/le-string-input/le-string-input.js +2 -2
- package/dist/collection/components/le-tab/le-tab.js +1 -1
- package/dist/collection/components/le-tab-bar/le-tab-bar.js +1 -1
- package/dist/collection/components/le-tab-panel/le-tab-panel.js +2 -2
- package/dist/collection/components/le-tabs/le-tabs.js +2 -2
- package/dist/collection/components/le-tag/le-tag.js +1 -1
- package/dist/collection/components/le-turntable/le-turntable.js +1 -1
- package/dist/collection/dist/components/assets/custom-elements.json +2147 -1764
- package/dist/components/assets/custom-elements.json +2147 -1764
- package/dist/components/le-bar.d.ts +11 -0
- package/dist/components/le-bar.js +9 -0
- package/dist/components/le-bar.js.map +1 -0
- package/dist/components/le-bar2.js +473 -0
- package/dist/components/le-bar2.js.map +1 -0
- package/dist/components/le-box.js +1 -1
- package/dist/components/le-button2.js +8 -8
- package/dist/components/le-card.js +1 -1
- package/dist/components/le-collapse2.js +1 -1
- package/dist/components/le-combobox.js +1 -1
- package/dist/components/le-current-heading.js +1 -1
- package/dist/components/le-dropdown-base2.js +1 -1
- package/dist/components/le-header-placeholder.js +1 -1
- package/dist/components/le-header.js +2 -2
- package/dist/components/le-icon2.js +1 -1
- package/dist/components/le-multiselect.js +3 -3
- package/dist/components/le-navigation.js +70 -253
- package/dist/components/le-navigation.js.map +1 -1
- package/dist/components/le-number-input.js +1 -1
- package/dist/components/le-popover2.js +3 -3
- package/dist/components/le-round-progress.js +1 -1
- package/dist/components/le-scroll-progress.js +1 -1
- package/dist/components/le-segmented-control.js +1 -1
- package/dist/components/le-stack.js +1 -1
- package/dist/components/le-tab-bar.js +1 -1
- package/dist/components/le-tab-panel.js +2 -2
- package/dist/components/le-tab2.js +1 -1
- package/dist/components/le-tabs.js +2 -2
- package/dist/components/le-tag2.js +1 -1
- package/dist/components/le-turntable.js +1 -1
- package/dist/docs.json +404 -13
- package/dist/esm/le-bar.entry.js +426 -0
- package/dist/esm/le-bar.entry.js.map +1 -0
- package/dist/esm/le-box.entry.js +1 -1
- package/dist/esm/le-button_13.entry.js +17 -17
- package/dist/esm/le-card.entry.js +1 -1
- package/dist/esm/le-combobox.entry.js +1 -1
- package/dist/esm/le-header-placeholder.entry.js +1 -1
- package/dist/esm/le-icon.entry.js +1 -1
- package/dist/esm/le-kit.js +1 -1
- package/dist/esm/le-multiselect.entry.js +3 -3
- package/dist/esm/le-navigation.entry.js +61 -250
- package/dist/esm/le-navigation.entry.js.map +1 -1
- package/dist/esm/le-number-input.entry.js +1 -1
- package/dist/esm/le-round-progress.entry.js +1 -1
- package/dist/esm/le-segmented-control.entry.js +1 -1
- package/dist/esm/le-stack.entry.js +1 -1
- package/dist/esm/le-tab-bar.entry.js +1 -1
- package/dist/esm/le-tab-panel.entry.js +2 -2
- package/dist/esm/le-tab.entry.js +1 -1
- package/dist/esm/le-tabs.entry.js +2 -2
- package/dist/esm/le-tag.entry.js +1 -1
- package/dist/esm/le-turntable.entry.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/le-kit/dist/components/assets/custom-elements.json +2147 -1764
- package/dist/le-kit/le-kit.esm.js +1 -1
- package/dist/le-kit/p-045e0d4a.entry.js +2 -0
- package/dist/le-kit/p-045e0d4a.entry.js.map +1 -0
- package/dist/le-kit/{p-00cd6dc4.entry.js → p-07705c61.entry.js} +2 -2
- package/dist/le-kit/{p-0b5ab6ec.entry.js → p-0a270831.entry.js} +2 -2
- package/dist/le-kit/p-2102a152.entry.js +2 -0
- package/dist/le-kit/{p-02699578.entry.js.map → p-2102a152.entry.js.map} +1 -1
- package/dist/le-kit/{p-76d03b1e.entry.js → p-244ff3d7.entry.js} +2 -2
- package/dist/le-kit/{p-a5e21c8e.entry.js → p-249db213.entry.js} +2 -2
- package/dist/le-kit/{p-348a4e39.entry.js → p-3a0a57e9.entry.js} +2 -2
- package/dist/le-kit/{p-2db32332.entry.js → p-4b88b0da.entry.js} +2 -2
- package/dist/le-kit/p-4f11ea11.entry.js +2 -0
- package/dist/le-kit/p-4f11ea11.entry.js.map +1 -0
- package/dist/le-kit/{p-9f409d74.entry.js → p-61edb398.entry.js} +2 -2
- package/dist/le-kit/{p-17ace252.entry.js → p-6d0090c1.entry.js} +2 -2
- package/dist/le-kit/{p-91421993.entry.js → p-73f7de28.entry.js} +2 -2
- package/dist/le-kit/{p-8907cf95.entry.js → p-764005e3.entry.js} +2 -2
- package/dist/le-kit/{p-509caf7f.entry.js → p-94f774af.entry.js} +2 -2
- package/dist/le-kit/p-ac822433.entry.js +2 -0
- package/dist/le-kit/{p-995f6de8.entry.js → p-b21277e8.entry.js} +2 -2
- package/dist/le-kit/{p-65fa68c3.entry.js → p-b6997587.entry.js} +2 -2
- package/dist/le-kit/{p-0aab5747.entry.js → p-c0ccc9aa.entry.js} +2 -2
- package/dist/le-kit/{p-b4dcb4df.entry.js → p-ebd86d4f.entry.js} +2 -2
- package/dist/types/components/le-bar/le-bar.d.ts +125 -0
- package/dist/types/components/le-navigation/le-navigation.d.ts +10 -18
- package/dist/types/components.d.ts +148 -0
- package/package.json +4 -4
- package/dist/le-kit/p-02699578.entry.js +0 -2
- package/dist/le-kit/p-a1c26c46.entry.js +0 -2
- package/dist/le-kit/p-a1c26c46.entry.js.map +0 -1
- package/dist/le-kit/p-ccf4c548.entry.js +0 -2
- /package/dist/le-kit/{p-00cd6dc4.entry.js.map → p-07705c61.entry.js.map} +0 -0
- /package/dist/le-kit/{p-0b5ab6ec.entry.js.map → p-0a270831.entry.js.map} +0 -0
- /package/dist/le-kit/{p-76d03b1e.entry.js.map → p-244ff3d7.entry.js.map} +0 -0
- /package/dist/le-kit/{p-a5e21c8e.entry.js.map → p-249db213.entry.js.map} +0 -0
- /package/dist/le-kit/{p-348a4e39.entry.js.map → p-3a0a57e9.entry.js.map} +0 -0
- /package/dist/le-kit/{p-2db32332.entry.js.map → p-4b88b0da.entry.js.map} +0 -0
- /package/dist/le-kit/{p-9f409d74.entry.js.map → p-61edb398.entry.js.map} +0 -0
- /package/dist/le-kit/{p-17ace252.entry.js.map → p-6d0090c1.entry.js.map} +0 -0
- /package/dist/le-kit/{p-91421993.entry.js.map → p-73f7de28.entry.js.map} +0 -0
- /package/dist/le-kit/{p-8907cf95.entry.js.map → p-764005e3.entry.js.map} +0 -0
- /package/dist/le-kit/{p-509caf7f.entry.js.map → p-94f774af.entry.js.map} +0 -0
- /package/dist/le-kit/{p-ccf4c548.entry.js.map → p-ac822433.entry.js.map} +0 -0
- /package/dist/le-kit/{p-995f6de8.entry.js.map → p-b21277e8.entry.js.map} +0 -0
- /package/dist/le-kit/{p-65fa68c3.entry.js.map → p-b6997587.entry.js.map} +0 -0
- /package/dist/le-kit/{p-0aab5747.entry.js.map → p-c0ccc9aa.entry.js.map} +0 -0
- /package/dist/le-kit/{p-b4dcb4df.entry.js.map → p-ebd86d4f.entry.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as registerInstance, d as createEvent, c as getElement, h, H as Host } from './index-BqH-zsXr.js';
|
|
2
2
|
import { g as generateId, c as classnames } from './utils-CdBk0DdF.js';
|
|
3
3
|
|
|
4
|
-
const leNavigationCss = () => `:host{display:block;--le-nav-radius:var(--le-radius-md);--le-nav-gap:var(--le-spacing-2);--le-nav-item-padding-x:var(--le-spacing-1);--le-nav-item-padding-y:var(--le-spacing-2);--le-nav-item-gap:var(--le-spacing-2);--le-nav-color:var(--le-color-text-primary);--le-nav-muted:var(--le-color-text-secondary);--le-nav-hover-bg:var(--le-color-gray-100);--le-nav-selected-bg:var(--le-color-primary);--le-nav-selected-color:var(--le-color-primary-contrast)}.nav-vertical{display:flex;flex-direction:column;gap:var(--le-nav-gap)}.nav-search{width:100%}.nav-search-input{--le-input-radius:var(--le-radius-md)}.nav-empty{padding:var(--le-spacing-2);color:var(--le-nav-muted);font-size:var(--le-font-size-sm)}.nav-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--le-spacing-1)}.nav-row{display:flex;align-items:stretch;gap:var(--le-spacing-1);border-radius:var(--le-nav-radius)}.nav-row:hover{background:var(--le-nav-hover-bg)}.nav-toggle,.nav-toggle-spacer{box-sizing:border-box;width:var(--le-spacing-4);min-width:var(--le-spacing-4);display:inline-flex;align-items:center;justify-content:center;border:1px solid transparent;border-radius:var(--le-nav-radius);color:inherit}.nav-toggle{background:transparent;cursor:pointer;opacity:0.4}.nav-toggle:hover:not(:disabled){opacity:1}.nav-toggle:focus-visible{outline:2px solid var(--le-color-focus);outline-offset:2px;opacity:1}.nav-chevron{display:inline-block;transition:transform var(--le-transition-fast)}.nav-chevron svg{display:block;width:var(--le-spacing-4);height:var(--le-spacing-4)}.nav-node>div>button>.nav-chevron{transform:rotate(-90deg)}.nav-node.open>div>button>.nav-chevron{transform:rotate(0deg)}.nav-item{flex:1;display:inline-flex;align-items:center;gap:var(--le-nav-item-gap);padding:var(--le-nav-item-padding-y) var(--le-nav-item-padding-x) var(--le-nav-item-padding-y) 0;border-radius:var(--le-nav-radius);border:1px solid transparent;background:transparent;text-decoration:none;color:var(--le-nav-color);font-family:var(--le-font-family-base);font-size:var(--le-font-size-md);line-height:var(--le-line-height-tight);cursor:pointer}.nav-item:focus-visible{outline:2px solid var(--le-color-focus);outline-offset:2px}.nav-node.selected>.nav-row{background:var(--le-nav-selected-bg);color:var(--le-nav-selected-color)}.nav-node.selected>.nav-row>.nav-item{color:inherit}.nav-node.disabled>.nav-row>.nav-item{opacity:0.5;cursor:not-allowed}.nav-text{display:flex;flex-direction:column;min-width:0}.nav-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nav-description{color:color-mix(in srgb, var(--le-nav-muted) 90%, transparent);font-size:var(--le-font-size-sm);line-height:var(--le-line-height-tight)}.nav-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.nav-icon-end{margin-left:auto}.nav-children{margin-top:var(--le-spacing-1)}.nav-horizontal{display:flex;align-items:center;gap:var(--le-spacing-2)}.nav-
|
|
4
|
+
const leNavigationCss = () => `:host{display:block;--le-nav-radius:var(--le-radius-md);--le-nav-gap:var(--le-spacing-2);--le-nav-item-padding-x:var(--le-spacing-1);--le-nav-item-padding-y:var(--le-spacing-2);--le-nav-item-gap:var(--le-spacing-2);--le-nav-color:var(--le-color-text-primary);--le-nav-muted:var(--le-color-text-secondary);--le-nav-hover-bg:var(--le-color-gray-100);--le-nav-selected-bg:var(--le-color-primary);--le-nav-selected-color:var(--le-color-primary-contrast)}:host([orientation='horizontal']:not([wrap])){flex:1 1 0%;min-width:0}.nav-vertical{display:flex;flex-direction:column;gap:var(--le-nav-gap)}.nav-search{width:100%}.nav-search-input{--le-input-radius:var(--le-radius-md)}.nav-empty{padding:var(--le-spacing-2);color:var(--le-nav-muted);font-size:var(--le-font-size-sm)}.nav-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--le-spacing-1)}.nav-row{display:flex;align-items:stretch;gap:var(--le-spacing-1);border-radius:var(--le-nav-radius)}.nav-row:hover{background:var(--le-nav-hover-bg)}.nav-toggle,.nav-toggle-spacer{box-sizing:border-box;width:var(--le-spacing-4);min-width:var(--le-spacing-4);display:inline-flex;align-items:center;justify-content:center;border:1px solid transparent;border-radius:var(--le-nav-radius);color:inherit}.nav-toggle{background:transparent;cursor:pointer;opacity:0.4}.nav-toggle:hover:not(:disabled){opacity:1}.nav-toggle:focus-visible{outline:2px solid var(--le-color-focus);outline-offset:2px;opacity:1}.nav-chevron{display:inline-block;transition:transform var(--le-transition-fast)}.nav-chevron svg{display:block;width:var(--le-spacing-4);height:var(--le-spacing-4)}.nav-node>div>button>.nav-chevron{transform:rotate(-90deg)}.nav-node.open>div>button>.nav-chevron{transform:rotate(0deg)}.nav-item{flex:1;display:inline-flex;align-items:center;gap:var(--le-nav-item-gap);padding:var(--le-nav-item-padding-y) var(--le-nav-item-padding-x) var(--le-nav-item-padding-y) 0;border-radius:var(--le-nav-radius);border:1px solid transparent;background:transparent;text-decoration:none;color:var(--le-nav-color);font-family:var(--le-font-family-base);font-size:var(--le-font-size-md);line-height:var(--le-line-height-tight);cursor:pointer}.nav-item:focus-visible{outline:2px solid var(--le-color-focus);outline-offset:2px}.nav-node.selected>.nav-row{background:var(--le-nav-selected-bg);color:var(--le-nav-selected-color)}.nav-node.selected>.nav-row>.nav-item{color:inherit}.nav-node.disabled>.nav-row>.nav-item{opacity:0.5;cursor:not-allowed}.nav-text{display:flex;flex-direction:column;min-width:0}.nav-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nav-description{color:color-mix(in srgb, var(--le-nav-muted) 90%, transparent);font-size:var(--le-font-size-sm);line-height:var(--le-line-height-tight)}.nav-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.nav-icon-end{margin-left:auto}.nav-children{margin-top:var(--le-spacing-1)}.nav-horizontal-wrapper{display:flex;align-items:center;gap:var(--le-spacing-2)}.nav-bar{flex:1 1 0%;min-width:0;--le-bar-gap:var(--le-spacing-2)}.nav-bar.align-end{--le-bar-justify:flex-end}.nav-bar.align-center{--le-bar-justify:center}.nav-bar.align-space-between{--le-bar-justify:space-between}.h-item{display:flex;align-items:center}.h-link{display:inline-flex;align-items:center;gap:var(--le-spacing-2);padding:var(--le-spacing-2) var(--le-spacing-3);border-radius:var(--le-nav-radius);border:1px solid transparent;background:transparent;text-decoration:none;color:var(--le-nav-color);font-family:var(--le-font-family-base);font-size:var(--le-font-size-md);cursor:pointer}.h-link:hover{background:var(--le-nav-hover-bg)}.h-link:focus-visible{outline:2px solid var(--le-color-focus);outline-offset:2px}.h-link.disabled,.h-trigger.disabled{opacity:0.5;pointer-events:none}.h-link.selected,.h-trigger.selected{background:var(--le-nav-selected-bg);color:var(--le-nav-selected-color)}.h-label{white-space:nowrap}.h-trigger{display:inline-flex;align-items:center;gap:var(--le-spacing-1);border-radius:var(--le-nav-radius)}.h-submenu-toggle{width:var(--le-spacing-3);height:var(--le-spacing-3);display:inline-flex;align-items:center;justify-content:center;border:1px solid transparent;border-radius:var(--le-nav-radius);background:transparent;color:currentColor;cursor:pointer}.h-submenu-toggle:hover{background:var(--le-nav-hover-bg)}.overflow-trigger{display:inline-flex;align-items:center;justify-content:center;gap:var(--le-spacing-2);padding:var(--le-spacing-2) var(--le-spacing-3);border-radius:var(--le-nav-radius);border:1px solid transparent;background:transparent;color:var(--le-nav-color);cursor:pointer;font-family:var(--le-font-family-base);font-size:var(--le-font-size-md)}.overflow-trigger:hover{background:var(--le-nav-hover-bg)}.overflow-trigger:focus-visible{outline:2px solid var(--le-color-focus);outline-offset:2px}.nav-overflow-trigger{display:flex;align-items:center}le-popover::part(content){padding:var(--le-spacing-1)}`;
|
|
5
5
|
|
|
6
6
|
const LeNavigation = class {
|
|
7
7
|
constructor(hostRef) {
|
|
@@ -72,19 +72,14 @@ const LeNavigation = class {
|
|
|
72
72
|
leNavItemToggle;
|
|
73
73
|
searchQuery = '';
|
|
74
74
|
openState = {};
|
|
75
|
+
/** IDs of items currently in overflow (from le-bar) */
|
|
75
76
|
overflowIds = [];
|
|
77
|
+
/** Whether hamburger mode is active (from le-bar) */
|
|
76
78
|
hamburgerActive = false;
|
|
77
|
-
fallbackHamburger = false;
|
|
78
79
|
submenuQueries = {};
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
measureMoreEl;
|
|
82
|
-
topItemEls = new Map();
|
|
80
|
+
/** Whether the overflow popover is open */
|
|
81
|
+
overflowPopoverOpen = false;
|
|
83
82
|
popoverRefs = new Map();
|
|
84
|
-
moreTriggerEl;
|
|
85
|
-
hamburgerPopoverEl;
|
|
86
|
-
morePopoverEl;
|
|
87
|
-
resizeObserver;
|
|
88
83
|
instanceId = generateId('le-nav');
|
|
89
84
|
partFromOptionPart(base, part) {
|
|
90
85
|
const raw = (part ?? '').trim();
|
|
@@ -99,40 +94,12 @@ const LeNavigation = class {
|
|
|
99
94
|
return [base, ...tokens.map(t => `${base}-${t}`)].join(' ');
|
|
100
95
|
}
|
|
101
96
|
handleLayoutInputsChange() {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
this.setupResizeObserver();
|
|
106
|
-
this.scheduleOverflowRecalc();
|
|
97
|
+
// Reset overflow state when layout inputs change
|
|
98
|
+
this.overflowIds = [];
|
|
99
|
+
this.hamburgerActive = false;
|
|
107
100
|
}
|
|
108
101
|
disconnectedCallback() {
|
|
109
|
-
|
|
110
|
-
this.resizeObserver = undefined;
|
|
111
|
-
}
|
|
112
|
-
componentDidRender() {
|
|
113
|
-
// In case refs change after render.
|
|
114
|
-
this.scheduleOverflowRecalc();
|
|
115
|
-
}
|
|
116
|
-
setupResizeObserver() {
|
|
117
|
-
this.resizeObserver?.disconnect();
|
|
118
|
-
if (typeof ResizeObserver === 'undefined')
|
|
119
|
-
return;
|
|
120
|
-
this.resizeObserver = new ResizeObserver(() => this.computeOverflow());
|
|
121
|
-
this.observeContainer(this.navContainerEl);
|
|
122
|
-
}
|
|
123
|
-
observeContainer(el) {
|
|
124
|
-
if (!this.resizeObserver)
|
|
125
|
-
return;
|
|
126
|
-
this.resizeObserver.disconnect();
|
|
127
|
-
if (el)
|
|
128
|
-
this.resizeObserver.observe(el);
|
|
129
|
-
}
|
|
130
|
-
scheduleOverflowRecalc() {
|
|
131
|
-
// Avoid work for vertical layout.
|
|
132
|
-
if (this.orientation !== 'horizontal')
|
|
133
|
-
return;
|
|
134
|
-
// Ensure it runs after layout.
|
|
135
|
-
requestAnimationFrame(() => this.computeOverflow());
|
|
102
|
+
// Cleanup if needed
|
|
136
103
|
}
|
|
137
104
|
get parsedItems() {
|
|
138
105
|
if (typeof this.items === 'string') {
|
|
@@ -246,149 +213,16 @@ const LeNavigation = class {
|
|
|
246
213
|
// Position may change as items filter.
|
|
247
214
|
requestAnimationFrame(() => this.popoverRefs.get(submenuId)?.updatePosition());
|
|
248
215
|
};
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
if (this.fallbackHamburger)
|
|
260
|
-
this.fallbackHamburger = false;
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
const container = this.navContainerEl;
|
|
264
|
-
if (!container)
|
|
265
|
-
return;
|
|
266
|
-
const topIds = this.getTopLevelIds(this.parsedItems);
|
|
267
|
-
const widths = topIds.map(id => this.topItemEls.get(id)?.getBoundingClientRect().width ?? 0);
|
|
268
|
-
const totalWidth = widths.reduce((a, b) => a + b, 0);
|
|
269
|
-
const availableWidth = container.getBoundingClientRect().width;
|
|
270
|
-
if (this.overflowMode === 'hamburger') {
|
|
271
|
-
const shouldHamburger = totalWidth > availableWidth;
|
|
272
|
-
if (shouldHamburger !== this.hamburgerActive) {
|
|
273
|
-
this.hamburgerActive = shouldHamburger;
|
|
274
|
-
}
|
|
275
|
-
if (!this.overflowIds || this.overflowIds.length)
|
|
276
|
-
this.overflowIds = [];
|
|
277
|
-
if (this.fallbackHamburger)
|
|
278
|
-
this.fallbackHamburger = false;
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
// overflowMode === 'more'
|
|
282
|
-
if (this.hamburgerActive)
|
|
283
|
-
this.hamburgerActive = false;
|
|
284
|
-
const computedOverflow = this.computeOverflowMoreByWrap(availableWidth);
|
|
285
|
-
if (!computedOverflow)
|
|
286
|
-
return;
|
|
287
|
-
// Fallback to hamburger when "More" would leave too few items visible
|
|
288
|
-
// or when the trigger itself cannot fit the row.
|
|
289
|
-
const visibleCount = this.parsedItems.length - computedOverflow.length;
|
|
290
|
-
const moreWidth = this.moreTriggerEl?.getBoundingClientRect().width ?? 0;
|
|
291
|
-
const minVisible = Math.max(0, Number(this.minVisibleItemsForMore) || 0);
|
|
292
|
-
const shouldFallback = (computedOverflow.length > 0 && visibleCount < minVisible) ||
|
|
293
|
-
(moreWidth > 0 && moreWidth > availableWidth);
|
|
294
|
-
if (shouldFallback !== this.fallbackHamburger) {
|
|
295
|
-
this.fallbackHamburger = shouldFallback;
|
|
296
|
-
}
|
|
297
|
-
const nextOverflow = shouldFallback ? [] : computedOverflow;
|
|
298
|
-
const same = nextOverflow.length === this.overflowIds?.length &&
|
|
299
|
-
nextOverflow.every((v, i) => v === this.overflowIds[i]);
|
|
300
|
-
if (!same) {
|
|
301
|
-
this.overflowIds = nextOverflow;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
computeOverflowMoreByWrap(availableWidth) {
|
|
305
|
-
const container = this.navContainerEl;
|
|
306
|
-
const measure = this.measureEl;
|
|
307
|
-
const measureMore = this.measureMoreEl;
|
|
308
|
-
const items = this.parsedItems;
|
|
309
|
-
if (!container || !measure)
|
|
310
|
-
return null;
|
|
311
|
-
// Ensure measurement container matches visible container width.
|
|
312
|
-
measure.style.width = `${availableWidth}px`;
|
|
313
|
-
// Keep the measured "More" width aligned with the real trigger width (supports slotted content).
|
|
314
|
-
const realMoreWidth = this.moreTriggerEl?.getBoundingClientRect().width;
|
|
315
|
-
if (measureMore && realMoreWidth && realMoreWidth > 0) {
|
|
316
|
-
const btn = measureMore.querySelector('button');
|
|
317
|
-
if (btn) {
|
|
318
|
-
btn.style.width = `${realMoreWidth}px`;
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
const allIds = this.getTopLevelIds(items);
|
|
322
|
-
const itemEls = allIds
|
|
323
|
-
.map(id => measure.querySelector(`[data-nav-id="${CSS.escape(id)}"]`))
|
|
324
|
-
.filter((el) => !!el);
|
|
325
|
-
// Reset measurement visibility.
|
|
326
|
-
itemEls.forEach(el => {
|
|
327
|
-
el.style.display = '';
|
|
328
|
-
});
|
|
329
|
-
if (measureMore) {
|
|
330
|
-
measureMore.style.display = 'none';
|
|
331
|
-
}
|
|
332
|
-
if (itemEls.length === 0) {
|
|
333
|
-
return [];
|
|
334
|
-
}
|
|
335
|
-
const firstRowTop = Math.min(...itemEls.map(el => el.offsetTop));
|
|
336
|
-
const overflowSet = new Set();
|
|
337
|
-
// Pass 1: detect which items fall onto rows > 1 (without "More" in flow).
|
|
338
|
-
itemEls.forEach(el => {
|
|
339
|
-
const id = el.getAttribute('data-nav-id');
|
|
340
|
-
if (!id)
|
|
341
|
-
return;
|
|
342
|
-
if (el.offsetTop > firstRowTop)
|
|
343
|
-
overflowSet.add(id);
|
|
344
|
-
});
|
|
345
|
-
if (overflowSet.size === 0) {
|
|
346
|
-
return [];
|
|
347
|
-
}
|
|
348
|
-
// Pass 2: show "More" and iteratively move items into overflow until "More" fits on row 1.
|
|
349
|
-
if (measureMore) {
|
|
350
|
-
measureMore.style.display = '';
|
|
351
|
-
}
|
|
352
|
-
// Hide currently overflowing items.
|
|
353
|
-
itemEls.forEach(el => {
|
|
354
|
-
const id = el.getAttribute('data-nav-id');
|
|
355
|
-
if (!id)
|
|
356
|
-
return;
|
|
357
|
-
if (overflowSet.has(id))
|
|
358
|
-
el.style.display = 'none';
|
|
359
|
-
});
|
|
360
|
-
const getVisibleItemEls = () => itemEls.filter(el => el.style.display !== 'none');
|
|
361
|
-
while (measureMore) {
|
|
362
|
-
const visible = getVisibleItemEls();
|
|
363
|
-
const rowTop = visible.length ? Math.min(...visible.map(el => el.offsetTop)) : 0;
|
|
364
|
-
if (measureMore.offsetTop <= rowTop)
|
|
365
|
-
break;
|
|
366
|
-
if (visible.length === 0)
|
|
367
|
-
break;
|
|
368
|
-
// Remove one last visible item and retry.
|
|
369
|
-
const last = visible[visible.length - 1];
|
|
370
|
-
const lastId = last.getAttribute('data-nav-id');
|
|
371
|
-
if (!lastId)
|
|
372
|
-
break;
|
|
373
|
-
last.style.display = 'none';
|
|
374
|
-
overflowSet.add(lastId);
|
|
375
|
-
}
|
|
376
|
-
const overflowIds = allIds.filter(id => overflowSet.has(id));
|
|
377
|
-
return overflowIds;
|
|
378
|
-
}
|
|
379
|
-
renderHorizontalMeasureItem(item, index) {
|
|
380
|
-
const id = this.getItemId(item, String(index));
|
|
381
|
-
const children = this.getChildItems(item);
|
|
382
|
-
const hasChildren = children.length > 0;
|
|
383
|
-
const setRef = (el) => {
|
|
384
|
-
if (el)
|
|
385
|
-
this.topItemEls.set(id, el);
|
|
386
|
-
};
|
|
387
|
-
if (!hasChildren) {
|
|
388
|
-
return (h("div", { class: "h-item", ref: setRef, "data-nav-id": id }, h("span", { class: "h-link" }, item.iconStart && (h("span", { class: "nav-icon", "aria-hidden": "true" }, item.iconStart)), h("span", { class: "h-label" }, item.label), item.iconEnd && (h("span", { class: "nav-icon nav-icon-end", "aria-hidden": "true" }, item.iconEnd)))));
|
|
389
|
-
}
|
|
390
|
-
return (h("div", { class: "h-item", ref: setRef, "data-nav-id": id }, h("span", { class: "h-trigger" }, h("span", { class: "h-link" }, item.iconStart && (h("span", { class: "nav-icon", "aria-hidden": "true" }, item.iconStart)), h("span", { class: "h-label" }, item.label)), h("span", { class: "h-submenu-toggle", "aria-hidden": "true" }, h("le-icon", { name: "chevron-down" })))));
|
|
391
|
-
}
|
|
216
|
+
handleBarOverflowChange = (e) => {
|
|
217
|
+
this.overflowIds = e.detail.overflowingIds;
|
|
218
|
+
this.hamburgerActive = e.detail.hamburgerActive;
|
|
219
|
+
};
|
|
220
|
+
openOverflowPopover = () => {
|
|
221
|
+
this.overflowPopoverOpen = true;
|
|
222
|
+
};
|
|
223
|
+
closeOverflowPopover = () => {
|
|
224
|
+
this.overflowPopoverOpen = false;
|
|
225
|
+
};
|
|
392
226
|
renderVerticalList(items, { depth, pathPrefix, autoOpenIds, searchable, searchQuery, searchPlaceholder, emptyText, submenuId, closePopover, }) {
|
|
393
227
|
const query = searchQuery ?? '';
|
|
394
228
|
const openFromSearch = autoOpenIds ?? new Set();
|
|
@@ -439,14 +273,14 @@ const LeNavigation = class {
|
|
|
439
273
|
? { href: item.href, role: 'menuitem' }
|
|
440
274
|
: { type: 'button', role: 'menuitem' };
|
|
441
275
|
const itemPart = this.partFromOptionPart('item', item.part);
|
|
442
|
-
return (h("div", { class: "h-item" }, h(TagType, { class: classnames('h-link', {
|
|
276
|
+
return (h("div", { class: "h-item", "data-bar-id": id }, h(TagType, { class: classnames('h-link', {
|
|
443
277
|
disabled: item.disabled,
|
|
444
278
|
selected: item.selected || (this.activeUrl && item.href === this.activeUrl),
|
|
445
279
|
}), part: itemPart, ...attrs, "aria-disabled": item.disabled ? 'true' : undefined, onClick: (e) => this.handleItemSelect(e, item, id) }, item.iconStart && (h("span", { class: "nav-icon", "aria-hidden": "true" }, item.iconStart)), h("span", { class: "h-label" }, item.label), item.iconEnd && (h("span", { class: "nav-icon nav-icon-end", "aria-hidden": "true" }, item.iconEnd)))));
|
|
446
280
|
}
|
|
447
281
|
const submenuId = id;
|
|
448
282
|
const itemPart = this.partFromOptionPart('item', item.part);
|
|
449
|
-
return (h("div", { class: "h-item" }, h("le-popover", { ref: el => {
|
|
283
|
+
return (h("div", { class: "h-item", "data-bar-id": id }, h("le-popover", { ref: el => {
|
|
450
284
|
if (el)
|
|
451
285
|
this.popoverRefs.set(submenuId, el);
|
|
452
286
|
}, mode: "default", showClose: false, closeOnClickOutside: true, closeOnEscape: true, position: "bottom", align: "start", minWidth: "240px" }, h("div", { slot: "trigger", class: classnames('h-trigger', {
|
|
@@ -483,75 +317,52 @@ const LeNavigation = class {
|
|
|
483
317
|
closePopover: () => this.popoverRefs.get(submenuId)?.hide(),
|
|
484
318
|
})))));
|
|
485
319
|
}
|
|
486
|
-
|
|
320
|
+
getOverflowMode() {
|
|
321
|
+
if (this.wrap)
|
|
322
|
+
return 'wrap';
|
|
323
|
+
return this.overflowMode;
|
|
324
|
+
}
|
|
325
|
+
getBarAlignment() {
|
|
326
|
+
// Map le-navigation align to le-bar alignItems
|
|
327
|
+
// 'space-between' doesn't map directly, use 'stretch' as closest
|
|
328
|
+
if (this.align === 'space-between')
|
|
329
|
+
return 'stretch';
|
|
330
|
+
return this.align;
|
|
331
|
+
}
|
|
332
|
+
renderOverflowPopover() {
|
|
487
333
|
const items = this.parsedItems;
|
|
488
334
|
const overflowSet = new Set(this.overflowIds);
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
((
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
return (h("div", { class: "nav-horizontal-shell" }, h("div", { class: "nav-horizontal-measure", "aria-hidden": "true", ref: el => {
|
|
502
|
-
this.measureEl = el;
|
|
503
|
-
} }, items.map((item, index) => this.renderHorizontalMeasureItem(item, index)), h("div", { class: "h-item", ref: el => {
|
|
504
|
-
this.measureMoreEl = el;
|
|
505
|
-
} }, h("button", { type: "button", class: "overflow-trigger" }, "More"))), h("div", { class: classnames('nav-horizontal', {
|
|
506
|
-
'align-end': this.align === 'end',
|
|
507
|
-
'align-center': this.align === 'center',
|
|
508
|
-
'align-space-between': this.align === 'space-between',
|
|
509
|
-
}), ref: el => {
|
|
510
|
-
this.navContainerEl = el;
|
|
511
|
-
this.setupResizeObserver();
|
|
512
|
-
this.observeContainer(this.navContainerEl);
|
|
513
|
-
} }, h("le-popover", { ref: el => {
|
|
514
|
-
this.hamburgerPopoverEl = el;
|
|
515
|
-
}, mode: "default", showClose: false, closeOnClickOutside: true, closeOnEscape: true, position: "bottom", align: "end", minWidth: "260px" }, h("button", { slot: "trigger", type: "button", class: "overflow-trigger", part: "hamburger-trigger", "aria-label": "Open menu" }, h("slot", { name: "hamburger-trigger" }, h("le-icon", { name: "hamburger" }))), h("div", { class: "popover-menu" }, this.renderVerticalList(items, {
|
|
516
|
-
depth: 0,
|
|
517
|
-
pathPrefix: '',
|
|
518
|
-
closePopover: () => this.hamburgerPopoverEl?.hide(),
|
|
519
|
-
}))))));
|
|
335
|
+
// Determine which items to show in the popover
|
|
336
|
+
let itemsToShow;
|
|
337
|
+
if (this.hamburgerActive) {
|
|
338
|
+
// In hamburger mode, show all items
|
|
339
|
+
itemsToShow = items;
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
// In "more" mode, show only overflow items
|
|
343
|
+
itemsToShow = items.filter((item, index) => {
|
|
344
|
+
const id = this.getItemId(item, String(index));
|
|
345
|
+
return overflowSet.has(id);
|
|
346
|
+
});
|
|
520
347
|
}
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
348
|
+
if (itemsToShow.length === 0)
|
|
349
|
+
return null;
|
|
350
|
+
const isHamburger = this.hamburgerActive;
|
|
351
|
+
return (h("le-popover", { mode: "default", open: this.overflowPopoverOpen, showClose: false, closeOnClickOutside: true, closeOnEscape: true, position: "bottom", align: "end", minWidth: "260px", onLePopoverClose: this.closeOverflowPopover }, h("button", { slot: "trigger", type: "button", class: "overflow-trigger", part: isHamburger ? 'hamburger-trigger' : 'more-trigger', "aria-label": isHamburger ? 'Open menu' : 'More', onClick: this.openOverflowPopover }, h("slot", { name: isHamburger ? 'hamburger-trigger' : 'more-trigger' }, h("le-icon", { name: isHamburger ? 'hamburger' : 'ellipsis-horizontal' }))), h("div", { class: "popover-menu" }, this.renderVerticalList(itemsToShow, {
|
|
352
|
+
depth: 0,
|
|
353
|
+
pathPrefix: '',
|
|
354
|
+
closePopover: this.closeOverflowPopover,
|
|
355
|
+
}))));
|
|
356
|
+
}
|
|
357
|
+
renderHorizontal() {
|
|
358
|
+
const items = this.parsedItems;
|
|
359
|
+
const overflowMode = this.getOverflowMode();
|
|
360
|
+
const showOverflowButton = this.overflowIds.length > 0 || this.hamburgerActive;
|
|
361
|
+
return (h("div", { class: "nav-horizontal-wrapper" }, h("le-bar", { class: classnames('nav-bar', {
|
|
529
362
|
'align-end': this.align === 'end',
|
|
530
363
|
'align-center': this.align === 'center',
|
|
531
364
|
'align-space-between': this.align === 'space-between',
|
|
532
|
-
}),
|
|
533
|
-
this.navContainerEl = el;
|
|
534
|
-
this.setupResizeObserver();
|
|
535
|
-
this.observeContainer(this.navContainerEl);
|
|
536
|
-
} }, items.map((item, index) => {
|
|
537
|
-
const id = this.getItemId(item, String(index));
|
|
538
|
-
const isOverflow = !this.wrap && this.overflowMode === 'more' && overflowSet.has(id);
|
|
539
|
-
if (isOverflow)
|
|
540
|
-
return null;
|
|
541
|
-
return this.renderHorizontalItem(item, index);
|
|
542
|
-
}), h("div", { class: classnames('more-trigger-wrap', {
|
|
543
|
-
'is-visible': showMore,
|
|
544
|
-
'is-measure': !showMore,
|
|
545
|
-
}) }, h("le-popover", { ref: el => {
|
|
546
|
-
this.morePopoverEl = el;
|
|
547
|
-
}, mode: "default", position: "bottom", align: "end", minWidth: "260px", showClose: false }, h("button", { slot: "trigger", type: "button", class: "overflow-trigger", part: "more-trigger", "aria-label": "More", ref: el => {
|
|
548
|
-
if (el)
|
|
549
|
-
this.moreTriggerEl = el;
|
|
550
|
-
} }, h("slot", { name: "more-trigger" }, h("le-icon", { name: "ellipsis-horizontal" }))), h("div", { class: "popover-menu" }, this.renderVerticalList(overflowItems, {
|
|
551
|
-
depth: 0,
|
|
552
|
-
pathPrefix: '',
|
|
553
|
-
closePopover: () => this.morePopoverEl?.hide(),
|
|
554
|
-
})))))));
|
|
365
|
+
}), overflow: overflowMode, alignItems: this.getBarAlignment(), disablePopover: true, onLeBarOverflowChange: this.handleBarOverflowChange }, items.map((item, index) => this.renderHorizontalItem(item, index))), showOverflowButton && this.renderOverflowPopover()));
|
|
555
366
|
}
|
|
556
367
|
render() {
|
|
557
368
|
const items = this.parsedItems;
|