le-kit 0.1.18 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/dist/cjs/index-pT2cVC5w.js.map +1 -1
  2. package/dist/cjs/le-button_13.cjs.entry.js +24 -28
  3. package/dist/cjs/le-card.cjs.entry.js +1 -1
  4. package/dist/cjs/le-combobox.cjs.entry.js +1 -1
  5. package/dist/cjs/le-header-placeholder.cjs.entry.js +1 -1
  6. package/dist/cjs/le-icon.cjs.entry.js +108 -0
  7. package/dist/cjs/le-kit.cjs.js +1 -1
  8. package/dist/cjs/le-multiselect.cjs.entry.js +3 -3
  9. package/dist/cjs/le-navigation.cjs.entry.js +499 -0
  10. package/dist/cjs/le-number-input.cjs.entry.js +1 -1
  11. package/dist/cjs/le-round-progress.cjs.entry.js +1 -1
  12. package/dist/cjs/le-segmented-control.cjs.entry.js +1 -1
  13. package/dist/cjs/le-stack.cjs.entry.js +1 -1
  14. package/dist/cjs/le-tab-bar.cjs.entry.js +1 -1
  15. package/dist/cjs/le-tab-panel.cjs.entry.js +2 -2
  16. package/dist/cjs/le-tab.cjs.entry.js +1 -1
  17. package/dist/cjs/le-tabs.cjs.entry.js +2 -2
  18. package/dist/cjs/le-tag.cjs.entry.js +1 -1
  19. package/dist/cjs/le-turntable.cjs.entry.js +1 -1
  20. package/dist/cjs/loader.cjs.js +1 -1
  21. package/dist/collection/assets/icons/chevron-down.svg +3 -0
  22. package/dist/collection/collection-manifest.json +2 -0
  23. package/dist/collection/components/le-button/le-button.css +24 -24
  24. package/dist/collection/components/le-button/le-button.js +2 -2
  25. package/dist/collection/components/le-button/le-button.js.map +1 -1
  26. package/dist/collection/components/le-card/le-card.js +1 -1
  27. package/dist/collection/components/le-checkbox/le-checkbox.js +1 -1
  28. package/dist/collection/components/le-collapse/le-collapse.css +3 -3
  29. package/dist/collection/components/le-collapse/le-collapse.js +11 -15
  30. package/dist/collection/components/le-collapse/le-collapse.js.map +1 -1
  31. package/dist/collection/components/le-combobox/le-combobox.js +1 -1
  32. package/dist/collection/components/le-current-heading/le-current-heading.js +1 -1
  33. package/dist/collection/components/le-dropdown-base/le-dropdown-base.js +1 -1
  34. package/dist/collection/components/le-header/le-header.js +2 -2
  35. package/dist/collection/components/le-header-placeholder/le-header-placeholder.js +1 -1
  36. package/dist/collection/components/le-icon/le-icon.css +13 -0
  37. package/dist/collection/components/le-icon/le-icon.js +168 -0
  38. package/dist/collection/components/le-icon/le-icon.js.map +1 -0
  39. package/dist/collection/components/le-multiselect/le-multiselect.js +3 -3
  40. package/dist/collection/components/le-navigation/le-navigation.css +323 -0
  41. package/dist/collection/components/le-navigation/le-navigation.js +742 -0
  42. package/dist/collection/components/le-navigation/le-navigation.js.map +1 -0
  43. package/dist/collection/components/le-number-input/le-number-input.js +1 -1
  44. package/dist/collection/components/le-popover/le-popover.js +3 -3
  45. package/dist/collection/components/le-popup/le-popup.js +7 -7
  46. package/dist/collection/components/le-round-progress/le-round-progress.js +1 -1
  47. package/dist/collection/components/le-scroll-progress/le-scroll-progress.js +1 -1
  48. package/dist/collection/components/le-segmented-control/le-segmented-control.js +1 -1
  49. package/dist/collection/components/le-select/le-select.js +2 -2
  50. package/dist/collection/components/le-slot/le-slot.js +1 -1
  51. package/dist/collection/components/le-stack/le-stack.js +1 -1
  52. package/dist/collection/components/le-string-input/le-string-input.js +2 -2
  53. package/dist/collection/components/le-tab/le-tab.js +1 -1
  54. package/dist/collection/components/le-tab-bar/le-tab-bar.js +1 -1
  55. package/dist/collection/components/le-tab-panel/le-tab-panel.js +2 -2
  56. package/dist/collection/components/le-tabs/le-tabs.js +2 -2
  57. package/dist/collection/components/le-tag/le-tag.js +1 -1
  58. package/dist/collection/components/le-turntable/le-turntable.js +1 -1
  59. package/dist/collection/dist/components/assets/custom-elements.json +2149 -1404
  60. package/dist/collection/dist/components/assets/icons/chevron-down.json +13 -0
  61. package/dist/collection/dist/components/assets/icons/chevron-down.svg +3 -0
  62. package/dist/collection/types/options.js.map +1 -1
  63. package/dist/components/assets/custom-elements.json +2149 -1404
  64. package/dist/components/assets/icons/chevron-down.json +13 -0
  65. package/dist/components/assets/icons/chevron-down.svg +3 -0
  66. package/dist/components/index.js.map +1 -1
  67. package/dist/components/le-button2.js +8 -8
  68. package/dist/components/le-button2.js.map +1 -1
  69. package/dist/components/le-card.js +1 -1
  70. package/dist/components/le-collapse.js +1 -137
  71. package/dist/components/le-collapse.js.map +1 -1
  72. package/dist/components/le-collapse2.js +138 -0
  73. package/dist/components/le-collapse2.js.map +1 -0
  74. package/dist/components/le-combobox.js +1 -1
  75. package/dist/components/le-current-heading.js +1 -1
  76. package/dist/components/le-dropdown-base2.js +1 -1
  77. package/dist/components/le-header-placeholder.js +1 -1
  78. package/dist/components/le-header.js +2 -2
  79. package/dist/components/le-icon.d.ts +11 -0
  80. package/dist/components/le-icon.js +9 -0
  81. package/dist/components/le-icon.js.map +1 -0
  82. package/dist/components/le-icon2.js +133 -0
  83. package/dist/components/le-icon2.js.map +1 -0
  84. package/dist/components/le-multiselect.js +3 -3
  85. package/dist/components/le-navigation.d.ts +11 -0
  86. package/dist/components/le-navigation.js +598 -0
  87. package/dist/components/le-navigation.js.map +1 -0
  88. package/dist/components/le-number-input.js +1 -1
  89. package/dist/components/le-popover2.js +3 -3
  90. package/dist/components/le-round-progress.js +1 -1
  91. package/dist/components/le-scroll-progress.js +1 -1
  92. package/dist/components/le-segmented-control.js +1 -1
  93. package/dist/components/le-stack.js +1 -1
  94. package/dist/components/le-tab-bar.js +1 -1
  95. package/dist/components/le-tab-panel.js +2 -2
  96. package/dist/components/le-tab2.js +1 -1
  97. package/dist/components/le-tabs.js +2 -2
  98. package/dist/components/le-tag2.js +1 -1
  99. package/dist/components/le-turntable.js +1 -1
  100. package/dist/docs.json +515 -27
  101. package/dist/esm/index-CNv6tzAt.js.map +1 -1
  102. package/dist/esm/le-button_13.entry.js +24 -28
  103. package/dist/esm/le-card.entry.js +1 -1
  104. package/dist/esm/le-combobox.entry.js +1 -1
  105. package/dist/esm/le-header-placeholder.entry.js +1 -1
  106. package/dist/esm/le-icon.entry.js +106 -0
  107. package/dist/esm/le-icon.entry.js.map +1 -0
  108. package/dist/esm/le-kit.js +1 -1
  109. package/dist/esm/le-multiselect.entry.js +3 -3
  110. package/dist/esm/le-navigation.entry.js +497 -0
  111. package/dist/esm/le-navigation.entry.js.map +1 -0
  112. package/dist/esm/le-number-input.entry.js +1 -1
  113. package/dist/esm/le-round-progress.entry.js +1 -1
  114. package/dist/esm/le-segmented-control.entry.js +1 -1
  115. package/dist/esm/le-stack.entry.js +1 -1
  116. package/dist/esm/le-tab-bar.entry.js +1 -1
  117. package/dist/esm/le-tab-panel.entry.js +2 -2
  118. package/dist/esm/le-tab.entry.js +1 -1
  119. package/dist/esm/le-tabs.entry.js +2 -2
  120. package/dist/esm/le-tag.entry.js +1 -1
  121. package/dist/esm/le-turntable.entry.js +1 -1
  122. package/dist/esm/loader.js +1 -1
  123. package/dist/le-kit/dist/components/assets/custom-elements.json +2149 -1404
  124. package/dist/le-kit/dist/components/assets/icons/chevron-down.json +13 -0
  125. package/dist/le-kit/dist/components/assets/icons/chevron-down.svg +3 -0
  126. package/dist/le-kit/le-kit.esm.js +1 -1
  127. package/dist/le-kit/{p-b3531106.entry.js → p-0ac4397c.entry.js} +2 -2
  128. package/dist/le-kit/{p-31c3649c.entry.js → p-25a29e69.entry.js} +2 -2
  129. package/dist/le-kit/p-2ec60692.entry.js +2 -0
  130. package/dist/le-kit/{p-269fb44f.entry.js → p-511fbb63.entry.js} +2 -2
  131. package/dist/le-kit/{p-8afe6862.entry.js → p-58120921.entry.js} +2 -2
  132. package/dist/le-kit/{p-c83a1255.entry.js → p-5ceb06d8.entry.js} +2 -2
  133. package/dist/le-kit/p-8c5a8f1e.entry.js +2 -0
  134. package/dist/le-kit/p-8c5a8f1e.entry.js.map +1 -0
  135. package/dist/le-kit/{p-deef1f4d.entry.js → p-9a3bdbe1.entry.js} +2 -2
  136. package/dist/le-kit/p-CNv6tzAt.js.map +1 -1
  137. package/dist/le-kit/{p-e4618b36.entry.js → p-a0d2c580.entry.js} +2 -2
  138. package/dist/le-kit/{p-629c5e13.entry.js → p-a8963634.entry.js} +2 -2
  139. package/dist/le-kit/p-b1dc7e06.entry.js +2 -0
  140. package/dist/le-kit/p-b1dc7e06.entry.js.map +1 -0
  141. package/dist/le-kit/p-bb160082.entry.js +2 -0
  142. package/dist/le-kit/p-bb160082.entry.js.map +1 -0
  143. package/dist/le-kit/{p-7d316315.entry.js → p-de5638c9.entry.js} +2 -2
  144. package/dist/le-kit/{p-d2a5d431.entry.js → p-df9389f0.entry.js} +2 -2
  145. package/dist/le-kit/{p-684adc9f.entry.js → p-e24d3e33.entry.js} +2 -2
  146. package/dist/le-kit/{p-95cf203e.entry.js → p-ec20e438.entry.js} +2 -2
  147. package/dist/le-kit/{p-9ba2bfb3.entry.js → p-f4f2c3e7.entry.js} +2 -2
  148. package/dist/types/components/le-collapse/le-collapse.d.ts +5 -3
  149. package/dist/types/components/le-icon/le-icon.d.ts +28 -0
  150. package/dist/types/components/le-navigation/le-navigation.d.ts +112 -0
  151. package/dist/types/components.d.ts +194 -10
  152. package/dist/types/types/options.d.ts +5 -0
  153. package/package.json +1 -1
  154. package/dist/collection/dist/components/assets/.gitkeep +0 -1
  155. package/dist/components/assets/.gitkeep +0 -1
  156. package/dist/le-kit/dist/components/assets/.gitkeep +0 -1
  157. package/dist/le-kit/p-3829f572.entry.js +0 -2
  158. package/dist/le-kit/p-3829f572.entry.js.map +0 -1
  159. package/dist/le-kit/p-e07d4b78.entry.js +0 -2
  160. /package/dist/le-kit/{p-b3531106.entry.js.map → p-0ac4397c.entry.js.map} +0 -0
  161. /package/dist/le-kit/{p-31c3649c.entry.js.map → p-25a29e69.entry.js.map} +0 -0
  162. /package/dist/le-kit/{p-e07d4b78.entry.js.map → p-2ec60692.entry.js.map} +0 -0
  163. /package/dist/le-kit/{p-269fb44f.entry.js.map → p-511fbb63.entry.js.map} +0 -0
  164. /package/dist/le-kit/{p-8afe6862.entry.js.map → p-58120921.entry.js.map} +0 -0
  165. /package/dist/le-kit/{p-c83a1255.entry.js.map → p-5ceb06d8.entry.js.map} +0 -0
  166. /package/dist/le-kit/{p-deef1f4d.entry.js.map → p-9a3bdbe1.entry.js.map} +0 -0
  167. /package/dist/le-kit/{p-e4618b36.entry.js.map → p-a0d2c580.entry.js.map} +0 -0
  168. /package/dist/le-kit/{p-629c5e13.entry.js.map → p-a8963634.entry.js.map} +0 -0
  169. /package/dist/le-kit/{p-7d316315.entry.js.map → p-de5638c9.entry.js.map} +0 -0
  170. /package/dist/le-kit/{p-d2a5d431.entry.js.map → p-df9389f0.entry.js.map} +0 -0
  171. /package/dist/le-kit/{p-684adc9f.entry.js.map → p-e24d3e33.entry.js.map} +0 -0
  172. /package/dist/le-kit/{p-95cf203e.entry.js.map → p-ec20e438.entry.js.map} +0 -0
  173. /package/dist/le-kit/{p-9ba2bfb3.entry.js.map → p-f4f2c3e7.entry.js.map} +0 -0
@@ -0,0 +1,497 @@
1
+ import { r as registerInstance, d as createEvent, c as getElement, h, H as Host } from './index-CNv6tzAt.js';
2
+ import { g as generateId, c as classnames } from './utils-BzC2tvPX.js';
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-horizontal-shell{position:relative}.nav-horizontal-measure{position:absolute;left:-10000px;top:-10000px;visibility:hidden;pointer-events:none;display:flex;align-items:center;gap:var(--le-spacing-2);flex-wrap:wrap}.nav-horizontal.wrap{flex-wrap:wrap}.nav-horizontal.nowrap{flex-wrap:nowrap;overflow:hidden}.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)}.more-trigger-wrap{display:flex;align-items:center}.more-trigger-wrap.is-measure{position:absolute;visibility:hidden;pointer-events:none}.more-trigger-wrap.is-visible{position:static;visibility:visible}.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}le-popover::part(content){padding:var(--le-spacing-1)}`;
5
+
6
+ const LeNavigation = class {
7
+ constructor(hostRef) {
8
+ registerInstance(this, hostRef);
9
+ this.leNavItemSelect = createEvent(this, "leNavItemSelect");
10
+ this.leNavItemToggle = createEvent(this, "leNavItemToggle");
11
+ }
12
+ get el() { return getElement(this); }
13
+ /**
14
+ * Navigation items.
15
+ * Can be passed as an array or JSON string (same pattern as le-select).
16
+ */
17
+ items = [];
18
+ /**
19
+ * Layout orientation.
20
+ */
21
+ orientation = 'vertical';
22
+ /**
23
+ * Horizontal wrapping behavior.
24
+ * If false, overflow behavior depends on `overflowMode`.
25
+ */
26
+ wrap = true;
27
+ /**
28
+ * Overflow behavior for horizontal, non-wrapping menus.
29
+ * - more: moves overflow items into a "More" popover
30
+ * - hamburger: turns the whole nav into a hamburger popover
31
+ */
32
+ overflowMode = 'more';
33
+ /**
34
+ * Enables a search input for the vertical navigation.
35
+ */
36
+ searchable = false;
37
+ /**
38
+ * Placeholder text for the search input.
39
+ */
40
+ searchPlaceholder = 'Search...';
41
+ /**
42
+ * Text shown when no items match the filter.
43
+ */
44
+ emptyText = 'No results found';
45
+ /**
46
+ * Whether submenu popovers should include a filter input.
47
+ */
48
+ submenuSearchable = false;
49
+ /**
50
+ * Fired when a navigation item is activated.
51
+ *
52
+ * This event is cancelable. Call `event.preventDefault()` to prevent
53
+ * default browser navigation and implement custom routing.
54
+ */
55
+ leNavItemSelect;
56
+ /**
57
+ * Fired when a tree branch is toggled.
58
+ */
59
+ leNavItemToggle;
60
+ searchQuery = '';
61
+ openState = {};
62
+ overflowIds = [];
63
+ hamburgerActive = false;
64
+ submenuQueries = {};
65
+ navContainerEl;
66
+ measureEl;
67
+ measureMoreEl;
68
+ topItemEls = new Map();
69
+ popoverRefs = new Map();
70
+ resizeObserver;
71
+ instanceId = generateId('le-nav');
72
+ handleLayoutInputsChange() {
73
+ this.scheduleOverflowRecalc();
74
+ }
75
+ componentDidLoad() {
76
+ this.setupResizeObserver();
77
+ this.scheduleOverflowRecalc();
78
+ }
79
+ disconnectedCallback() {
80
+ this.resizeObserver?.disconnect();
81
+ this.resizeObserver = undefined;
82
+ }
83
+ componentDidRender() {
84
+ // In case refs change after render.
85
+ this.scheduleOverflowRecalc();
86
+ }
87
+ setupResizeObserver() {
88
+ this.resizeObserver?.disconnect();
89
+ if (typeof ResizeObserver === 'undefined')
90
+ return;
91
+ this.resizeObserver = new ResizeObserver(() => this.computeOverflow());
92
+ this.observeContainer(this.navContainerEl);
93
+ }
94
+ observeContainer(el) {
95
+ if (!this.resizeObserver)
96
+ return;
97
+ this.resizeObserver.disconnect();
98
+ if (el)
99
+ this.resizeObserver.observe(el);
100
+ }
101
+ scheduleOverflowRecalc() {
102
+ // Avoid work for vertical layout.
103
+ if (this.orientation !== 'horizontal')
104
+ return;
105
+ // Ensure it runs after layout.
106
+ requestAnimationFrame(() => this.computeOverflow());
107
+ }
108
+ get parsedItems() {
109
+ if (typeof this.items === 'string') {
110
+ try {
111
+ return JSON.parse(this.items);
112
+ }
113
+ catch {
114
+ return [];
115
+ }
116
+ }
117
+ return this.items;
118
+ }
119
+ getItemId(item, path) {
120
+ return item.id ?? `${this.instanceId}:${path}`;
121
+ }
122
+ getChildItems(item) {
123
+ return Array.isArray(item.children) ? item.children : [];
124
+ }
125
+ isOpen(item, id) {
126
+ const fromState = this.openState[id];
127
+ if (typeof fromState === 'boolean')
128
+ return fromState;
129
+ return !!item.open;
130
+ }
131
+ setOpen(id, open) {
132
+ if (this.openState[id] === open)
133
+ return;
134
+ this.openState = {
135
+ ...this.openState,
136
+ [id]: open,
137
+ };
138
+ }
139
+ matchesQuery(option, query) {
140
+ if (!query)
141
+ return true;
142
+ const q = query.toLowerCase();
143
+ return (option.label.toLowerCase().includes(q) ||
144
+ (option.description?.toLowerCase().includes(q) ?? false));
145
+ }
146
+ filterTree(items, query, pathPrefix, autoOpen) {
147
+ if (!query)
148
+ return items;
149
+ const result = [];
150
+ items.forEach((item, index) => {
151
+ const path = pathPrefix ? `${pathPrefix}.${index}` : String(index);
152
+ const id = this.getItemId(item, path);
153
+ const children = this.getChildItems(item);
154
+ const filteredChildren = this.filterTree(children, query, path, autoOpen);
155
+ const selfMatch = this.matchesQuery(item, query);
156
+ const childMatch = filteredChildren.length > 0;
157
+ if (selfMatch || childMatch) {
158
+ if (childMatch) {
159
+ autoOpen.add(id);
160
+ }
161
+ if (childMatch && filteredChildren !== children) {
162
+ result.push({
163
+ ...item,
164
+ children: filteredChildren,
165
+ });
166
+ }
167
+ else {
168
+ result.push(item);
169
+ }
170
+ }
171
+ });
172
+ return result;
173
+ }
174
+ handleItemSelect = (e, item, id) => {
175
+ if (item.disabled) {
176
+ e.preventDefault();
177
+ e.stopPropagation();
178
+ return;
179
+ }
180
+ const emitted = this.leNavItemSelect.emit({
181
+ item,
182
+ id,
183
+ href: item.href,
184
+ originalEvent: e,
185
+ });
186
+ if (emitted.defaultPrevented) {
187
+ e.preventDefault();
188
+ }
189
+ };
190
+ handleToggle = (e, item, id) => {
191
+ e.preventDefault();
192
+ e.stopPropagation();
193
+ if (item.disabled)
194
+ return;
195
+ const next = !this.isOpen(item, id);
196
+ this.setOpen(id, next);
197
+ this.leNavItemToggle.emit({
198
+ item,
199
+ id,
200
+ open: next,
201
+ originalEvent: e,
202
+ });
203
+ };
204
+ handleSearchInput = (e) => {
205
+ const target = e.target;
206
+ this.searchQuery = target.value;
207
+ };
208
+ handleSubmenuSearchInput = (submenuId, e) => {
209
+ const target = e.target;
210
+ const value = target.value;
211
+ if (this.submenuQueries[submenuId] === value)
212
+ return;
213
+ this.submenuQueries = {
214
+ ...this.submenuQueries,
215
+ [submenuId]: value,
216
+ };
217
+ // Position may change as items filter.
218
+ requestAnimationFrame(() => this.popoverRefs.get(submenuId)?.updatePosition());
219
+ };
220
+ getTopLevelIds(items) {
221
+ return items.map((item, index) => this.getItemId(item, String(index)));
222
+ }
223
+ computeOverflow() {
224
+ // Only applies to horizontal, non-wrapping navs.
225
+ if (this.orientation !== 'horizontal' || this.wrap) {
226
+ if (this.overflowIds.length)
227
+ this.overflowIds = [];
228
+ if (this.hamburgerActive)
229
+ this.hamburgerActive = false;
230
+ return;
231
+ }
232
+ const container = this.navContainerEl;
233
+ if (!container)
234
+ return;
235
+ const topIds = this.getTopLevelIds(this.parsedItems);
236
+ const widths = topIds.map(id => this.topItemEls.get(id)?.getBoundingClientRect().width ?? 0);
237
+ const totalWidth = widths.reduce((a, b) => a + b, 0);
238
+ const availableWidth = container.getBoundingClientRect().width;
239
+ if (this.overflowMode === 'hamburger') {
240
+ const shouldHamburger = totalWidth > availableWidth;
241
+ if (shouldHamburger !== this.hamburgerActive) {
242
+ this.hamburgerActive = shouldHamburger;
243
+ }
244
+ if (this.overflowIds.length)
245
+ this.overflowIds = [];
246
+ return;
247
+ }
248
+ // overflowMode === 'more'
249
+ this.computeOverflowMoreByWrap(availableWidth);
250
+ }
251
+ computeOverflowMoreByWrap(availableWidth) {
252
+ const container = this.navContainerEl;
253
+ const measure = this.measureEl;
254
+ const measureMore = this.measureMoreEl;
255
+ const items = this.parsedItems;
256
+ if (!container || !measure)
257
+ return;
258
+ // Ensure measurement container matches visible container width.
259
+ measure.style.width = `${availableWidth}px`;
260
+ const allIds = this.getTopLevelIds(items);
261
+ const itemEls = allIds
262
+ .map(id => measure.querySelector(`[data-nav-id="${CSS.escape(id)}"]`))
263
+ .filter((el) => !!el);
264
+ // Reset measurement visibility.
265
+ itemEls.forEach(el => {
266
+ el.style.display = '';
267
+ });
268
+ if (measureMore) {
269
+ measureMore.style.display = 'none';
270
+ }
271
+ if (itemEls.length === 0) {
272
+ if (this.overflowIds.length)
273
+ this.overflowIds = [];
274
+ return;
275
+ }
276
+ const firstRowTop = Math.min(...itemEls.map(el => el.offsetTop));
277
+ const overflowSet = new Set();
278
+ // Pass 1: detect which items fall onto rows > 1 (without "More" in flow).
279
+ itemEls.forEach(el => {
280
+ const id = el.getAttribute('data-nav-id');
281
+ if (!id)
282
+ return;
283
+ if (el.offsetTop > firstRowTop)
284
+ overflowSet.add(id);
285
+ });
286
+ if (overflowSet.size === 0) {
287
+ if (this.overflowIds.length)
288
+ this.overflowIds = [];
289
+ return;
290
+ }
291
+ // Pass 2: show "More" and iteratively move items into overflow until "More" fits on row 1.
292
+ if (measureMore) {
293
+ measureMore.style.display = '';
294
+ }
295
+ // Hide currently overflowing items.
296
+ itemEls.forEach(el => {
297
+ const id = el.getAttribute('data-nav-id');
298
+ if (!id)
299
+ return;
300
+ if (overflowSet.has(id))
301
+ el.style.display = 'none';
302
+ });
303
+ const getVisibleItemEls = () => itemEls.filter(el => el.style.display !== 'none');
304
+ while (measureMore) {
305
+ const visible = getVisibleItemEls();
306
+ const rowTop = visible.length ? Math.min(...visible.map(el => el.offsetTop)) : 0;
307
+ if (measureMore.offsetTop <= rowTop)
308
+ break;
309
+ if (visible.length === 0)
310
+ break;
311
+ // Remove one last visible item and retry.
312
+ const last = visible[visible.length - 1];
313
+ const lastId = last.getAttribute('data-nav-id');
314
+ if (!lastId)
315
+ break;
316
+ last.style.display = 'none';
317
+ overflowSet.add(lastId);
318
+ }
319
+ const overflowIds = allIds.filter(id => overflowSet.has(id));
320
+ const same = overflowIds.length === this.overflowIds.length &&
321
+ overflowIds.every((v, i) => v === this.overflowIds[i]);
322
+ if (!same) {
323
+ this.overflowIds = overflowIds;
324
+ }
325
+ }
326
+ renderHorizontalMeasureItem(item, index) {
327
+ const id = this.getItemId(item, String(index));
328
+ const children = this.getChildItems(item);
329
+ const hasChildren = children.length > 0;
330
+ const setRef = (el) => {
331
+ if (el)
332
+ this.topItemEls.set(id, el);
333
+ };
334
+ if (!hasChildren) {
335
+ 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)))));
336
+ }
337
+ 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("span", { class: "nav-chevron" }, "\u25BC")))));
338
+ }
339
+ renderVerticalList(items, { depth, pathPrefix, autoOpenIds, searchable, searchQuery, searchPlaceholder, emptyText, submenuId, }) {
340
+ const query = searchQuery ?? '';
341
+ const openFromSearch = autoOpenIds ?? new Set();
342
+ const filtered = query ? this.filterTree(items, query, pathPrefix, openFromSearch) : items;
343
+ return (h("div", { class: classnames('nav-vertical', { 'is-submenu': !!submenuId }) }, searchable && (h("div", { class: "nav-search" }, h("le-string-input", { mode: "default", class: "nav-search-input", placeholder: searchPlaceholder ?? 'Search...', value: query, onInput: (e) => submenuId ? this.handleSubmenuSearchInput(submenuId, e) : this.handleSearchInput(e) }))), filtered.length === 0 ? (h("div", { class: "nav-empty" }, emptyText ?? this.emptyText)) : (h("ul", { class: "nav-list", role: "tree" }, filtered.map((item, index) => {
344
+ const path = pathPrefix ? `${pathPrefix}.${index}` : String(index);
345
+ const id = this.getItemId(item, path);
346
+ const children = this.getChildItems(item);
347
+ const hasChildren = children.length > 0;
348
+ const open = hasChildren && (this.isOpen(item, id) || openFromSearch.has(id));
349
+ const paddingLeft = `calc(var(--le-nav-item-padding-x) + ${depth} * var(--le-spacing-4))`;
350
+ const TagType = item.href && !item.disabled ? 'a' : 'button';
351
+ const attrs = TagType === 'a'
352
+ ? { href: item.href, role: 'treeitem' }
353
+ : { type: 'button', role: 'treeitem' };
354
+ return (h("li", { class: classnames('nav-node', {
355
+ 'disabled': item.disabled,
356
+ 'selected': item.selected,
357
+ open,
358
+ 'has-children': hasChildren,
359
+ }), key: id, role: "none" }, h("div", { class: "nav-row", style: { paddingLeft } }, hasChildren ? (h("button", { type: "button", class: "nav-toggle", "aria-label": open ? 'Collapse' : 'Expand', "aria-expanded": open ? 'true' : 'false', onClick: (e) => this.handleToggle(e, item, id), disabled: item.disabled }, h("le-icon", { name: "chevron-down", class: "nav-chevron", "aria-hidden": "true" }))) : (h("span", { class: "nav-toggle-spacer", "aria-hidden": "true" })), h(TagType, { class: "nav-item", ...attrs, "aria-disabled": item.disabled ? 'true' : undefined, onClick: (e) => {
360
+ // For buttons, also toggle if this is a purely structural node.
361
+ this.handleItemSelect(e, item, id);
362
+ if (!item.href && hasChildren && !item.disabled) {
363
+ this.handleToggle(e, item, id);
364
+ }
365
+ } }, item.iconStart && (h("span", { class: "nav-icon", "aria-hidden": "true" }, item.iconStart)), h("span", { class: "nav-text" }, h("span", { class: "nav-label" }, item.label), item.description && (h("span", { class: "nav-description" }, item.description))), item.iconEnd && (h("span", { class: "nav-icon nav-icon-end", "aria-hidden": "true" }, item.iconEnd)))), hasChildren && (h("le-collapse", { class: "nav-children", closed: !open, noFading: true, role: "group" }, this.renderVerticalList(children, {
366
+ depth: depth + 1,
367
+ pathPrefix: path,
368
+ autoOpenIds: openFromSearch,
369
+ })))));
370
+ })))));
371
+ }
372
+ renderHorizontalItem(item, index) {
373
+ const id = this.getItemId(item, String(index));
374
+ const children = this.getChildItems(item);
375
+ const hasChildren = children.length > 0;
376
+ if (!hasChildren) {
377
+ const TagType = item.href && !item.disabled ? 'a' : 'button';
378
+ const attrs = TagType === 'a'
379
+ ? { href: item.href, role: 'menuitem' }
380
+ : { type: 'button', role: 'menuitem' };
381
+ return (h("div", { class: "h-item" }, h(TagType, { class: classnames('h-link', {
382
+ disabled: item.disabled,
383
+ selected: item.selected,
384
+ }), ...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)))));
385
+ }
386
+ const submenuId = id;
387
+ return (h("div", { class: "h-item" }, h("le-popover", { ref: el => {
388
+ if (el)
389
+ this.popoverRefs.set(submenuId, el);
390
+ }, mode: "default", showClose: false, closeOnClickOutside: true, closeOnEscape: true, position: "bottom", align: "start", minWidth: "240px" }, h("div", { slot: "trigger", class: classnames('h-trigger', {
391
+ disabled: item.disabled,
392
+ selected: item.selected,
393
+ }), role: "menuitem", "aria-disabled": item.disabled ? 'true' : undefined, onClick: (e) => {
394
+ // Don’t let le-popover auto-toggle from its internal wrapper.
395
+ e.stopPropagation();
396
+ if (item.disabled)
397
+ return;
398
+ if (item.href) {
399
+ this.handleItemSelect(e, item, id);
400
+ }
401
+ else {
402
+ this.popoverRefs.get(submenuId)?.toggle();
403
+ }
404
+ } }, item.href ? (h("a", { class: "h-link", href: item.href, onClick: (e) => {
405
+ e.stopPropagation();
406
+ this.handleItemSelect(e, item, id);
407
+ } }, item.iconStart && (h("span", { class: "nav-icon", "aria-hidden": "true" }, item.iconStart)), h("span", { class: "h-label" }, item.label))) : (h("button", { type: "button", class: "h-link", onClick: (e) => {
408
+ e.stopPropagation();
409
+ if (item.disabled)
410
+ return;
411
+ this.popoverRefs.get(submenuId)?.toggle();
412
+ } }, item.iconStart && (h("span", { class: "nav-icon", "aria-hidden": "true" }, item.iconStart)), h("span", { class: "h-label" }, item.label))), h("button", { type: "button", class: "h-submenu-toggle", "aria-label": "Open submenu", onClick: (e) => {
413
+ e.preventDefault();
414
+ e.stopPropagation();
415
+ if (item.disabled)
416
+ return;
417
+ this.popoverRefs.get(submenuId)?.toggle();
418
+ } }, h("span", { class: "nav-chevron", "aria-hidden": "true" }, h("le-icon", { name: "chevron-down" })))), h("div", { class: "popover-menu" }, this.renderVerticalList(children, {
419
+ depth: 0,
420
+ pathPrefix: String(index),
421
+ searchable: this.submenuSearchable,
422
+ searchQuery: this.submenuQueries[submenuId] ?? '',
423
+ searchPlaceholder: this.searchPlaceholder,
424
+ emptyText: this.emptyText,
425
+ submenuId,
426
+ })))));
427
+ }
428
+ renderHorizontal() {
429
+ const items = this.parsedItems;
430
+ const overflowSet = new Set(this.overflowIds);
431
+ const overflowItems = [];
432
+ items.forEach((item, index) => {
433
+ const id = this.getItemId(item, String(index));
434
+ if (!this.wrap && this.overflowMode === 'more' && overflowSet.has(id)) {
435
+ overflowItems.push(item);
436
+ }
437
+ });
438
+ // Hamburger mode: show a single trigger if anything overflows.
439
+ if (!this.wrap && this.overflowMode === 'hamburger' && this.hamburgerActive) {
440
+ return (h("div", { class: "nav-horizontal-shell" }, h("div", { class: "nav-horizontal-measure", "aria-hidden": "true", ref: el => {
441
+ this.measureEl = el;
442
+ } }, items.map((item, index) => this.renderHorizontalMeasureItem(item, index)), h("div", { class: "h-item", ref: el => {
443
+ this.measureMoreEl = el;
444
+ } }, h("button", { type: "button", class: "overflow-trigger" }, "More"))), h("div", { class: "nav-horizontal", ref: el => {
445
+ this.navContainerEl = el;
446
+ this.setupResizeObserver();
447
+ this.observeContainer(this.navContainerEl);
448
+ } }, h("le-popover", { mode: "default", showClose: false, closeOnClickOutside: true, closeOnEscape: true, position: "bottom", align: "end", minWidth: "260px" }, h("button", { slot: "trigger", type: "button", class: "overflow-trigger", "aria-label": "Open menu" }, "\u2630"), h("div", { class: "popover-menu" }, this.renderVerticalList(items, { depth: 0, pathPrefix: '' }))))));
449
+ }
450
+ const showMore = !this.wrap && this.overflowMode === 'more' && overflowItems.length > 0;
451
+ return (h("div", { class: "nav-horizontal-shell", role: "menubar" }, h("div", { class: "nav-horizontal-measure", "aria-hidden": "true", ref: el => {
452
+ this.measureEl = el;
453
+ } }, items.map((item, index) => this.renderHorizontalMeasureItem(item, index)), h("div", { class: "h-item", ref: el => {
454
+ this.measureMoreEl = el;
455
+ } }, h("button", { type: "button", class: "overflow-trigger" }, "More"))), h("div", { class: classnames('nav-horizontal', {
456
+ wrap: this.wrap,
457
+ nowrap: !this.wrap,
458
+ }), ref: el => {
459
+ this.navContainerEl = el;
460
+ this.setupResizeObserver();
461
+ this.observeContainer(this.navContainerEl);
462
+ } }, items.map((item, index) => {
463
+ const id = this.getItemId(item, String(index));
464
+ const isOverflow = !this.wrap && this.overflowMode === 'more' && overflowSet.has(id);
465
+ if (isOverflow)
466
+ return null;
467
+ return this.renderHorizontalItem(item, index);
468
+ }), h("div", { class: classnames('more-trigger-wrap', {
469
+ 'is-visible': showMore,
470
+ 'is-measure': !showMore,
471
+ }) }, h("le-popover", { mode: "default", position: "bottom", align: "end", minWidth: "260px", showClose: false }, h("button", { slot: "trigger", type: "button", class: "overflow-trigger", "aria-label": "More" }, "More"), h("div", { class: "popover-menu" }, this.renderVerticalList(overflowItems, { depth: 0, pathPrefix: '' })))))));
472
+ }
473
+ render() {
474
+ const items = this.parsedItems;
475
+ if (this.orientation === 'horizontal') {
476
+ return (h(Host, null, h("le-component", { component: "le-navigation" }, this.renderHorizontal())));
477
+ }
478
+ return (h(Host, null, h("le-component", { component: "le-navigation" }, this.renderVerticalList(items, {
479
+ depth: 0,
480
+ pathPrefix: '',
481
+ searchable: this.searchable,
482
+ searchQuery: this.searchQuery,
483
+ searchPlaceholder: this.searchPlaceholder,
484
+ emptyText: this.emptyText,
485
+ }))));
486
+ }
487
+ static get watchers() { return {
488
+ "items": ["handleLayoutInputsChange"],
489
+ "orientation": ["handleLayoutInputsChange"],
490
+ "wrap": ["handleLayoutInputsChange"],
491
+ "overflowMode": ["handleLayoutInputsChange"]
492
+ }; }
493
+ };
494
+ LeNavigation.style = leNavigationCss();
495
+
496
+ export { LeNavigation as le_navigation };
497
+ //# sourceMappingURL=le-navigation.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"le-navigation.entry.js","sources":["src/components/le-navigation/le-navigation.css?tag=le-navigation&encapsulation=shadow","src/components/le-navigation/le-navigation.tsx"],"sourcesContent":[":host {\n display: block;\n\n --le-nav-radius: var(--le-radius-md);\n --le-nav-gap: var(--le-spacing-2);\n --le-nav-item-padding-x: var(--le-spacing-1);\n --le-nav-item-padding-y: var(--le-spacing-2);\n --le-nav-item-gap: var(--le-spacing-2);\n\n --le-nav-color: var(--le-color-text-primary);\n --le-nav-muted: var(--le-color-text-secondary);\n --le-nav-hover-bg: var(--le-color-gray-100);\n --le-nav-selected-bg: var(--le-color-primary);\n --le-nav-selected-color: var(--le-color-primary-contrast);\n}\n\n/* ==========================================\n * Vertical navigation\n * ========================================== */\n\n.nav-vertical {\n display: flex;\n flex-direction: column;\n gap: var(--le-nav-gap);\n}\n\n.nav-search {\n width: 100%;\n}\n\n.nav-search-input {\n --le-input-radius: var(--le-radius-md);\n}\n\n.nav-empty {\n padding: var(--le-spacing-2);\n color: var(--le-nav-muted);\n font-size: var(--le-font-size-sm);\n}\n\n.nav-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--le-spacing-1);\n}\n\n.nav-row {\n display: flex;\n align-items: stretch;\n gap: var(--le-spacing-1);\n border-radius: var(--le-nav-radius);\n}\n\n.nav-row:hover {\n background: var(--le-nav-hover-bg);\n}\n\n.nav-toggle,\n.nav-toggle-spacer {\n box-sizing: border-box;\n width: var(--le-spacing-4);\n min-width: var(--le-spacing-4);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px solid transparent;\n border-radius: var(--le-nav-radius);\n color: inherit;\n}\n\n.nav-toggle {\n background: transparent;\n cursor: pointer;\n opacity: 0.4;\n}\n\n.nav-toggle:hover:not(:disabled) {\n opacity: 1;\n}\n\n.nav-toggle:focus-visible {\n outline: 2px solid var(--le-color-focus);\n outline-offset: 2px;\n opacity: 1;\n}\n\n.nav-chevron {\n display: inline-block;\n transition: transform var(--le-transition-fast);\n}\n\n.nav-chevron svg {\n display: block;\n width: var(--le-spacing-4);\n height: var(--le-spacing-4);\n}\n\n.nav-node > div > button > .nav-chevron {\n transform: rotate(-90deg);\n}\n.nav-node.open > div > button > .nav-chevron {\n transform: rotate(0deg);\n}\n\n.nav-item {\n flex: 1;\n display: inline-flex;\n align-items: center;\n gap: var(--le-nav-item-gap);\n padding: var(--le-nav-item-padding-y) var(--le-nav-item-padding-x) var(--le-nav-item-padding-y) 0;\n border-radius: var(--le-nav-radius);\n border: 1px solid transparent;\n background: transparent;\n text-decoration: none;\n color: var(--le-nav-color);\n font-family: var(--le-font-family-base);\n font-size: var(--le-font-size-md);\n line-height: var(--le-line-height-tight);\n cursor: pointer;\n}\n\n.nav-item:focus-visible {\n outline: 2px solid var(--le-color-focus);\n outline-offset: 2px;\n}\n\n.nav-node.selected > .nav-row {\n background: var(--le-nav-selected-bg);\n color: var(--le-nav-selected-color);\n}\n.nav-node.selected > .nav-row > .nav-item {\n color: inherit;\n}\n\n.nav-node.disabled > .nav-row > .nav-item {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.nav-text {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.nav-label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.nav-description {\n color: color-mix(in srgb, var(--le-nav-muted) 90%, transparent);\n font-size: var(--le-font-size-sm);\n line-height: var(--le-line-height-tight);\n}\n\n.nav-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.nav-icon-end {\n margin-left: auto;\n}\n\n.nav-children {\n margin-top: var(--le-spacing-1);\n}\n\n/* ==========================================\n * Horizontal navigation\n * ========================================== */\n\n.nav-horizontal {\n display: flex;\n align-items: center;\n gap: var(--le-spacing-2);\n}\n\n.nav-horizontal-shell {\n position: relative;\n}\n\n.nav-horizontal-measure {\n position: absolute;\n left: -10000px;\n top: -10000px;\n visibility: hidden;\n pointer-events: none;\n display: flex;\n align-items: center;\n gap: var(--le-spacing-2);\n flex-wrap: wrap;\n}\n\n.nav-horizontal.wrap {\n flex-wrap: wrap;\n}\n\n.nav-horizontal.nowrap {\n flex-wrap: nowrap;\n overflow: hidden;\n}\n\n.h-item {\n display: flex;\n align-items: center;\n}\n\n.h-link {\n display: inline-flex;\n align-items: center;\n gap: var(--le-spacing-2);\n padding: var(--le-spacing-2) var(--le-spacing-3);\n border-radius: var(--le-nav-radius);\n border: 1px solid transparent;\n background: transparent;\n text-decoration: none;\n color: var(--le-nav-color);\n font-family: var(--le-font-family-base);\n font-size: var(--le-font-size-md);\n cursor: pointer;\n}\n\n.h-link:hover {\n background: var(--le-nav-hover-bg);\n}\n\n.h-link:focus-visible {\n outline: 2px solid var(--le-color-focus);\n outline-offset: 2px;\n}\n\n.h-link.disabled,\n.h-trigger.disabled {\n opacity: 0.5;\n pointer-events: none;\n}\n\n.h-link.selected,\n.h-trigger.selected {\n background: var(--le-nav-selected-bg);\n color: var(--le-nav-selected-color);\n}\n\n.h-label {\n white-space: nowrap;\n}\n\n.h-trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--le-spacing-1);\n border-radius: var(--le-nav-radius);\n}\n\n.h-submenu-toggle {\n width: var(--le-spacing-3);\n height: var(--le-spacing-3);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: 1px solid transparent;\n border-radius: var(--le-nav-radius);\n background: transparent;\n color: currentColor;\n cursor: pointer;\n}\n\n.h-submenu-toggle:hover {\n background: var(--le-nav-hover-bg);\n}\n\n.more-trigger-wrap {\n display: flex;\n align-items: center;\n}\n\n.more-trigger-wrap.is-measure {\n position: absolute;\n visibility: hidden;\n pointer-events: none;\n}\n\n.more-trigger-wrap.is-visible {\n position: static;\n visibility: visible;\n}\n\n.overflow-trigger {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--le-spacing-2);\n padding: var(--le-spacing-2) var(--le-spacing-3);\n border-radius: var(--le-nav-radius);\n border: 1px solid transparent;\n background: transparent;\n color: var(--le-nav-color);\n cursor: pointer;\n font-family: var(--le-font-family-base);\n font-size: var(--le-font-size-md);\n}\n\n.overflow-trigger:hover {\n background: var(--le-nav-hover-bg);\n}\n\n.overflow-trigger:focus-visible {\n outline: 2px solid var(--le-color-focus);\n outline-offset: 2px;\n}\n\n/* Popover list container */\nle-popover::part(content) {\n padding: var(--le-spacing-1);\n}\n","import {\n Component,\n Prop,\n State,\n Event,\n EventEmitter,\n Element,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport { LeOption } from '../../types/options';\nimport { classnames, generateId } from '../../utils/utils';\n\nexport interface LeNavigationItemSelectDetail {\n item: LeOption;\n id: string;\n href?: string;\n originalEvent: MouseEvent;\n}\n\nexport interface LeNavigationItemToggleDetail {\n item: LeOption;\n id: string;\n open: boolean;\n originalEvent: MouseEvent;\n}\n\ninterface VerticalListRenderOptions {\n depth: number;\n pathPrefix: string;\n autoOpenIds?: Set<string>;\n searchable?: boolean;\n searchQuery?: string;\n searchPlaceholder?: string;\n emptyText?: string;\n submenuId?: string;\n}\n\n/**\n * Navigation component with vertical (tree) and horizontal (menu) layouts.\n *\n * - Accepts items as `LeOption[]` or a JSON string.\n * - Supports hierarchical items via `children`.\n * - Supports persisted expansion via `open` on items.\n *\n * @cmsEditable true\n * @cmsCategory Navigation\n */\n@Component({\n tag: 'le-navigation',\n styleUrl: 'le-navigation.css',\n shadow: true,\n})\nexport class LeNavigation {\n @Element() el: HTMLElement;\n\n /**\n * Navigation items.\n * Can be passed as an array or JSON string (same pattern as le-select).\n */\n @Prop() items: LeOption[] | string = [];\n\n /**\n * Layout orientation.\n */\n @Prop({ reflect: true }) orientation: 'vertical' | 'horizontal' = 'vertical';\n\n /**\n * Horizontal wrapping behavior.\n * If false, overflow behavior depends on `overflowMode`.\n */\n @Prop({ reflect: true }) wrap: boolean = true;\n\n /**\n * Overflow behavior for horizontal, non-wrapping menus.\n * - more: moves overflow items into a \"More\" popover\n * - hamburger: turns the whole nav into a hamburger popover\n */\n @Prop({ reflect: true }) overflowMode: 'more' | 'hamburger' = 'more';\n\n /**\n * Enables a search input for the vertical navigation.\n */\n @Prop() searchable: boolean = false;\n\n /**\n * Placeholder text for the search input.\n */\n @Prop() searchPlaceholder: string = 'Search...';\n\n /**\n * Text shown when no items match the filter.\n */\n @Prop() emptyText: string = 'No results found';\n\n /**\n * Whether submenu popovers should include a filter input.\n */\n @Prop() submenuSearchable: boolean = false;\n\n /**\n * Fired when a navigation item is activated.\n *\n * This event is cancelable. Call `event.preventDefault()` to prevent\n * default browser navigation and implement custom routing.\n */\n @Event({ cancelable: true }) leNavItemSelect: EventEmitter<LeNavigationItemSelectDetail>;\n\n /**\n * Fired when a tree branch is toggled.\n */\n @Event() leNavItemToggle: EventEmitter<LeNavigationItemToggleDetail>;\n\n @State() private searchQuery: string = '';\n\n @State() private openState: Record<string, boolean> = {};\n\n @State() private overflowIds: string[] = [];\n\n @State() private hamburgerActive: boolean = false;\n\n @State() private submenuQueries: Record<string, string> = {};\n\n private navContainerEl?: HTMLElement;\n\n private measureEl?: HTMLElement;\n private measureMoreEl?: HTMLElement;\n\n private topItemEls: Map<string, HTMLElement> = new Map();\n\n private popoverRefs: Map<string, HTMLLePopoverElement> = new Map();\n\n private resizeObserver?: ResizeObserver;\n\n private instanceId: string = generateId('le-nav');\n\n @Watch('items')\n @Watch('orientation')\n @Watch('wrap')\n @Watch('overflowMode')\n handleLayoutInputsChange() {\n this.scheduleOverflowRecalc();\n }\n\n componentDidLoad() {\n this.setupResizeObserver();\n this.scheduleOverflowRecalc();\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = undefined;\n }\n\n componentDidRender() {\n // In case refs change after render.\n this.scheduleOverflowRecalc();\n }\n\n private setupResizeObserver() {\n this.resizeObserver?.disconnect();\n\n if (typeof ResizeObserver === 'undefined') return;\n\n this.resizeObserver = new ResizeObserver(() => this.computeOverflow());\n this.observeContainer(this.navContainerEl);\n }\n\n private observeContainer(el?: HTMLElement) {\n if (!this.resizeObserver) return;\n this.resizeObserver.disconnect();\n if (el) this.resizeObserver.observe(el);\n }\n\n private scheduleOverflowRecalc() {\n // Avoid work for vertical layout.\n if (this.orientation !== 'horizontal') return;\n\n // Ensure it runs after layout.\n requestAnimationFrame(() => this.computeOverflow());\n }\n\n private get parsedItems(): LeOption[] {\n if (typeof this.items === 'string') {\n try {\n return JSON.parse(this.items);\n } catch {\n return [];\n }\n }\n\n return this.items;\n }\n\n private getItemId(item: LeOption, path: string): string {\n return item.id ?? `${this.instanceId}:${path}`;\n }\n\n private getChildItems(item: LeOption): LeOption[] {\n return Array.isArray(item.children) ? item.children : [];\n }\n\n private isOpen(item: LeOption, id: string): boolean {\n const fromState = this.openState[id];\n if (typeof fromState === 'boolean') return fromState;\n return !!item.open;\n }\n\n private setOpen(id: string, open: boolean) {\n if (this.openState[id] === open) return;\n this.openState = {\n ...this.openState,\n [id]: open,\n };\n }\n\n private matchesQuery(option: LeOption, query: string): boolean {\n if (!query) return true;\n\n const q = query.toLowerCase();\n return (\n option.label.toLowerCase().includes(q) ||\n (option.description?.toLowerCase().includes(q) ?? false)\n );\n }\n\n private filterTree(\n items: LeOption[],\n query: string,\n pathPrefix: string,\n autoOpen: Set<string>,\n ): LeOption[] {\n if (!query) return items;\n\n const result: LeOption[] = [];\n\n items.forEach((item, index) => {\n const path = pathPrefix ? `${pathPrefix}.${index}` : String(index);\n const id = this.getItemId(item, path);\n\n const children = this.getChildItems(item);\n const filteredChildren = this.filterTree(children, query, path, autoOpen);\n const selfMatch = this.matchesQuery(item, query);\n const childMatch = filteredChildren.length > 0;\n\n if (selfMatch || childMatch) {\n if (childMatch) {\n autoOpen.add(id);\n }\n\n if (childMatch && filteredChildren !== children) {\n result.push({\n ...item,\n children: filteredChildren,\n });\n } else {\n result.push(item);\n }\n }\n });\n\n return result;\n }\n\n private handleItemSelect = (e: MouseEvent, item: LeOption, id: string) => {\n if (item.disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n const emitted = this.leNavItemSelect.emit({\n item,\n id,\n href: item.href,\n originalEvent: e,\n });\n\n if (emitted.defaultPrevented) {\n e.preventDefault();\n }\n };\n\n private handleToggle = (e: MouseEvent, item: LeOption, id: string) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (item.disabled) return;\n\n const next = !this.isOpen(item, id);\n this.setOpen(id, next);\n\n this.leNavItemToggle.emit({\n item,\n id,\n open: next,\n originalEvent: e,\n });\n };\n\n private handleSearchInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n this.searchQuery = target.value;\n };\n\n private handleSubmenuSearchInput = (submenuId: string, e: Event) => {\n const target = e.target as HTMLInputElement;\n const value = target.value;\n\n if (this.submenuQueries[submenuId] === value) return;\n\n this.submenuQueries = {\n ...this.submenuQueries,\n [submenuId]: value,\n };\n\n // Position may change as items filter.\n requestAnimationFrame(() => this.popoverRefs.get(submenuId)?.updatePosition());\n };\n\n private getTopLevelIds(items: LeOption[]): string[] {\n return items.map((item, index) => this.getItemId(item, String(index)));\n }\n\n private computeOverflow() {\n // Only applies to horizontal, non-wrapping navs.\n if (this.orientation !== 'horizontal' || this.wrap) {\n if (this.overflowIds.length) this.overflowIds = [];\n if (this.hamburgerActive) this.hamburgerActive = false;\n return;\n }\n\n const container = this.navContainerEl;\n if (!container) return;\n\n const topIds = this.getTopLevelIds(this.parsedItems);\n const widths = topIds.map(id => this.topItemEls.get(id)?.getBoundingClientRect().width ?? 0);\n\n const totalWidth = widths.reduce((a, b) => a + b, 0);\n const availableWidth = container.getBoundingClientRect().width;\n\n if (this.overflowMode === 'hamburger') {\n const shouldHamburger = totalWidth > availableWidth;\n if (shouldHamburger !== this.hamburgerActive) {\n this.hamburgerActive = shouldHamburger;\n }\n if (this.overflowIds.length) this.overflowIds = [];\n return;\n }\n\n // overflowMode === 'more'\n this.computeOverflowMoreByWrap(availableWidth);\n }\n\n private computeOverflowMoreByWrap(availableWidth: number) {\n const container = this.navContainerEl;\n const measure = this.measureEl;\n const measureMore = this.measureMoreEl;\n const items = this.parsedItems;\n\n if (!container || !measure) return;\n\n // Ensure measurement container matches visible container width.\n measure.style.width = `${availableWidth}px`;\n\n const allIds = this.getTopLevelIds(items);\n const itemEls = allIds\n .map(id => measure.querySelector<HTMLElement>(`[data-nav-id=\"${CSS.escape(id)}\"]`))\n .filter((el): el is HTMLElement => !!el);\n\n // Reset measurement visibility.\n itemEls.forEach(el => {\n el.style.display = '';\n });\n if (measureMore) {\n measureMore.style.display = 'none';\n }\n\n if (itemEls.length === 0) {\n if (this.overflowIds.length) this.overflowIds = [];\n return;\n }\n\n const firstRowTop = Math.min(...itemEls.map(el => el.offsetTop));\n const overflowSet = new Set<string>();\n\n // Pass 1: detect which items fall onto rows > 1 (without \"More\" in flow).\n itemEls.forEach(el => {\n const id = el.getAttribute('data-nav-id');\n if (!id) return;\n if (el.offsetTop > firstRowTop) overflowSet.add(id);\n });\n\n if (overflowSet.size === 0) {\n if (this.overflowIds.length) this.overflowIds = [];\n return;\n }\n\n // Pass 2: show \"More\" and iteratively move items into overflow until \"More\" fits on row 1.\n if (measureMore) {\n measureMore.style.display = '';\n }\n\n // Hide currently overflowing items.\n itemEls.forEach(el => {\n const id = el.getAttribute('data-nav-id');\n if (!id) return;\n if (overflowSet.has(id)) el.style.display = 'none';\n });\n\n const getVisibleItemEls = () => itemEls.filter(el => el.style.display !== 'none');\n\n while (measureMore) {\n const visible = getVisibleItemEls();\n const rowTop = visible.length ? Math.min(...visible.map(el => el.offsetTop)) : 0;\n\n if (measureMore.offsetTop <= rowTop) break;\n if (visible.length === 0) break;\n\n // Remove one last visible item and retry.\n const last = visible[visible.length - 1];\n const lastId = last.getAttribute('data-nav-id');\n if (!lastId) break;\n\n last.style.display = 'none';\n overflowSet.add(lastId);\n }\n\n const overflowIds = allIds.filter(id => overflowSet.has(id));\n\n const same =\n overflowIds.length === this.overflowIds.length &&\n overflowIds.every((v, i) => v === this.overflowIds[i]);\n\n if (!same) {\n this.overflowIds = overflowIds;\n }\n }\n\n private renderHorizontalMeasureItem(item: LeOption, index: number) {\n const id = this.getItemId(item, String(index));\n const children = this.getChildItems(item);\n const hasChildren = children.length > 0;\n\n const setRef = (el?: HTMLElement) => {\n if (el) this.topItemEls.set(id, el);\n };\n\n if (!hasChildren) {\n return (\n <div class=\"h-item\" ref={setRef} data-nav-id={id}>\n <span class=\"h-link\">\n {item.iconStart && (\n <span class=\"nav-icon\" aria-hidden=\"true\">\n {item.iconStart}\n </span>\n )}\n <span class=\"h-label\">{item.label}</span>\n {item.iconEnd && (\n <span class=\"nav-icon nav-icon-end\" aria-hidden=\"true\">\n {item.iconEnd}\n </span>\n )}\n </span>\n </div>\n );\n }\n\n return (\n <div class=\"h-item\" ref={setRef} data-nav-id={id}>\n <span class=\"h-trigger\">\n <span class=\"h-link\">\n {item.iconStart && (\n <span class=\"nav-icon\" aria-hidden=\"true\">\n {item.iconStart}\n </span>\n )}\n <span class=\"h-label\">{item.label}</span>\n </span>\n <span class=\"h-submenu-toggle\" aria-hidden=\"true\">\n <span class=\"nav-chevron\">▼</span>\n </span>\n </span>\n </div>\n );\n }\n\n private renderVerticalList(\n items: LeOption[],\n {\n depth,\n pathPrefix,\n autoOpenIds,\n searchable,\n searchQuery,\n searchPlaceholder,\n emptyText,\n submenuId,\n }: VerticalListRenderOptions,\n ) {\n const query = searchQuery ?? '';\n const openFromSearch = autoOpenIds ?? new Set<string>();\n\n const filtered = query ? this.filterTree(items, query, pathPrefix, openFromSearch) : items;\n\n return (\n <div class={classnames('nav-vertical', { 'is-submenu': !!submenuId })}>\n {searchable && (\n <div class=\"nav-search\">\n <le-string-input\n mode=\"default\"\n class=\"nav-search-input\"\n placeholder={searchPlaceholder ?? 'Search...'}\n value={query}\n onInput={(e: Event) =>\n submenuId ? this.handleSubmenuSearchInput(submenuId, e) : this.handleSearchInput(e)\n }\n />\n </div>\n )}\n\n {filtered.length === 0 ? (\n <div class=\"nav-empty\">{emptyText ?? this.emptyText}</div>\n ) : (\n <ul class=\"nav-list\" role=\"tree\">\n {filtered.map((item, index) => {\n const path = pathPrefix ? `${pathPrefix}.${index}` : String(index);\n const id = this.getItemId(item, path);\n const children = this.getChildItems(item);\n const hasChildren = children.length > 0;\n const open = hasChildren && (this.isOpen(item, id) || openFromSearch.has(id));\n\n const paddingLeft = `calc(var(--le-nav-item-padding-x) + ${depth} * var(--le-spacing-4))`;\n\n const TagType = item.href && !item.disabled ? 'a' : 'button';\n const attrs =\n TagType === 'a'\n ? { href: item.href, role: 'treeitem' }\n : { type: 'button', role: 'treeitem' };\n\n return (\n <li\n class={classnames('nav-node', {\n 'disabled': item.disabled,\n 'selected': item.selected,\n open,\n 'has-children': hasChildren,\n })}\n key={id}\n role=\"none\"\n >\n <div class=\"nav-row\" style={{ paddingLeft }}>\n {hasChildren ? (\n <button\n type=\"button\"\n class=\"nav-toggle\"\n aria-label={open ? 'Collapse' : 'Expand'}\n aria-expanded={open ? 'true' : 'false'}\n onClick={(e: MouseEvent) => this.handleToggle(e, item, id)}\n disabled={item.disabled}\n >\n <le-icon name=\"chevron-down\" class=\"nav-chevron\" aria-hidden=\"true\" />\n </button>\n ) : (\n <span class=\"nav-toggle-spacer\" aria-hidden=\"true\" />\n )}\n\n <TagType\n class=\"nav-item\"\n {...attrs}\n aria-disabled={item.disabled ? 'true' : undefined}\n onClick={(e: MouseEvent) => {\n // For buttons, also toggle if this is a purely structural node.\n this.handleItemSelect(e, item, id);\n if (!item.href && hasChildren && !item.disabled) {\n this.handleToggle(e, item, id);\n }\n }}\n >\n {item.iconStart && (\n <span class=\"nav-icon\" aria-hidden=\"true\">\n {item.iconStart}\n </span>\n )}\n <span class=\"nav-text\">\n <span class=\"nav-label\">{item.label}</span>\n {item.description && (\n <span class=\"nav-description\">{item.description}</span>\n )}\n </span>\n {item.iconEnd && (\n <span class=\"nav-icon nav-icon-end\" aria-hidden=\"true\">\n {item.iconEnd}\n </span>\n )}\n </TagType>\n </div>\n\n {hasChildren && (\n <le-collapse class=\"nav-children\" closed={!open} noFading={true} role=\"group\">\n {this.renderVerticalList(children, {\n depth: depth + 1,\n pathPrefix: path,\n autoOpenIds: openFromSearch,\n })}\n </le-collapse>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n }\n\n private renderHorizontalItem(item: LeOption, index: number) {\n const id = this.getItemId(item, String(index));\n const children = this.getChildItems(item);\n const hasChildren = children.length > 0;\n\n if (!hasChildren) {\n const TagType = item.href && !item.disabled ? 'a' : 'button';\n const attrs =\n TagType === 'a'\n ? { href: item.href, role: 'menuitem' }\n : { type: 'button', role: 'menuitem' };\n\n return (\n <div class=\"h-item\">\n <TagType\n class={classnames('h-link', {\n disabled: item.disabled,\n selected: item.selected,\n })}\n {...attrs}\n aria-disabled={item.disabled ? 'true' : undefined}\n onClick={(e: MouseEvent) => this.handleItemSelect(e, item, id)}\n >\n {item.iconStart && (\n <span class=\"nav-icon\" aria-hidden=\"true\">\n {item.iconStart}\n </span>\n )}\n <span class=\"h-label\">{item.label}</span>\n {item.iconEnd && (\n <span class=\"nav-icon nav-icon-end\" aria-hidden=\"true\">\n {item.iconEnd}\n </span>\n )}\n </TagType>\n </div>\n );\n }\n\n const submenuId = id;\n\n return (\n <div class=\"h-item\">\n <le-popover\n ref={el => {\n if (el) this.popoverRefs.set(submenuId, el);\n }}\n mode=\"default\"\n showClose={false}\n closeOnClickOutside={true}\n closeOnEscape={true}\n position=\"bottom\"\n align=\"start\"\n minWidth=\"240px\"\n >\n <div\n slot=\"trigger\"\n class={classnames('h-trigger', {\n disabled: item.disabled,\n selected: item.selected,\n })}\n role=\"menuitem\"\n aria-disabled={item.disabled ? 'true' : undefined}\n onClick={(e: MouseEvent) => {\n // Don’t let le-popover auto-toggle from its internal wrapper.\n e.stopPropagation();\n if (item.disabled) return;\n\n if (item.href) {\n this.handleItemSelect(e, item, id);\n } else {\n this.popoverRefs.get(submenuId)?.toggle();\n }\n }}\n >\n {item.href ? (\n <a\n class=\"h-link\"\n href={item.href}\n onClick={(e: MouseEvent) => {\n e.stopPropagation();\n this.handleItemSelect(e, item, id);\n }}\n >\n {item.iconStart && (\n <span class=\"nav-icon\" aria-hidden=\"true\">\n {item.iconStart}\n </span>\n )}\n <span class=\"h-label\">{item.label}</span>\n </a>\n ) : (\n <button\n type=\"button\"\n class=\"h-link\"\n onClick={(e: MouseEvent) => {\n e.stopPropagation();\n if (item.disabled) return;\n this.popoverRefs.get(submenuId)?.toggle();\n }}\n >\n {item.iconStart && (\n <span class=\"nav-icon\" aria-hidden=\"true\">\n {item.iconStart}\n </span>\n )}\n <span class=\"h-label\">{item.label}</span>\n </button>\n )}\n\n <button\n type=\"button\"\n class=\"h-submenu-toggle\"\n aria-label=\"Open submenu\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (item.disabled) return;\n this.popoverRefs.get(submenuId)?.toggle();\n }}\n >\n <span class=\"nav-chevron\" aria-hidden=\"true\">\n <le-icon name=\"chevron-down\" />\n </span>\n </button>\n </div>\n\n <div class=\"popover-menu\">\n {this.renderVerticalList(children, {\n depth: 0,\n pathPrefix: String(index),\n searchable: this.submenuSearchable,\n searchQuery: this.submenuQueries[submenuId] ?? '',\n searchPlaceholder: this.searchPlaceholder,\n emptyText: this.emptyText,\n submenuId,\n })}\n </div>\n </le-popover>\n </div>\n );\n }\n\n private renderHorizontal() {\n const items = this.parsedItems;\n\n const overflowSet = new Set(this.overflowIds);\n\n const overflowItems: LeOption[] = [];\n items.forEach((item, index) => {\n const id = this.getItemId(item, String(index));\n if (!this.wrap && this.overflowMode === 'more' && overflowSet.has(id)) {\n overflowItems.push(item);\n }\n });\n\n // Hamburger mode: show a single trigger if anything overflows.\n if (!this.wrap && this.overflowMode === 'hamburger' && this.hamburgerActive) {\n return (\n <div class=\"nav-horizontal-shell\">\n <div\n class=\"nav-horizontal-measure\"\n aria-hidden=\"true\"\n ref={el => {\n this.measureEl = el as HTMLElement;\n }}\n >\n {items.map((item, index) => this.renderHorizontalMeasureItem(item, index))}\n <div\n class=\"h-item\"\n ref={el => {\n this.measureMoreEl = el as HTMLElement;\n }}\n >\n <button type=\"button\" class=\"overflow-trigger\">\n More\n </button>\n </div>\n </div>\n\n <div\n class=\"nav-horizontal\"\n ref={el => {\n this.navContainerEl = el as HTMLElement;\n this.setupResizeObserver();\n this.observeContainer(this.navContainerEl);\n }}\n >\n <le-popover\n mode=\"default\"\n showClose={false}\n closeOnClickOutside={true}\n closeOnEscape={true}\n position=\"bottom\"\n align=\"end\"\n minWidth=\"260px\"\n >\n <button slot=\"trigger\" type=\"button\" class=\"overflow-trigger\" aria-label=\"Open menu\">\n ☰\n </button>\n <div class=\"popover-menu\">\n {this.renderVerticalList(items, { depth: 0, pathPrefix: '' })}\n </div>\n </le-popover>\n </div>\n </div>\n );\n }\n\n const showMore = !this.wrap && this.overflowMode === 'more' && overflowItems.length > 0;\n\n return (\n <div class=\"nav-horizontal-shell\" role=\"menubar\">\n <div\n class=\"nav-horizontal-measure\"\n aria-hidden=\"true\"\n ref={el => {\n this.measureEl = el as HTMLElement;\n }}\n >\n {items.map((item, index) => this.renderHorizontalMeasureItem(item, index))}\n <div\n class=\"h-item\"\n ref={el => {\n this.measureMoreEl = el as HTMLElement;\n }}\n >\n <button type=\"button\" class=\"overflow-trigger\">\n More\n </button>\n </div>\n </div>\n\n <div\n class={classnames('nav-horizontal', {\n wrap: this.wrap,\n nowrap: !this.wrap,\n })}\n ref={el => {\n this.navContainerEl = el as HTMLElement;\n this.setupResizeObserver();\n this.observeContainer(this.navContainerEl);\n }}\n >\n {items.map((item, index) => {\n const id = this.getItemId(item, String(index));\n const isOverflow = !this.wrap && this.overflowMode === 'more' && overflowSet.has(id);\n if (isOverflow) return null;\n return this.renderHorizontalItem(item, index);\n })}\n\n {/* Render a hidden trigger for measurement when not visible */}\n <div\n class={classnames('more-trigger-wrap', {\n 'is-visible': showMore,\n 'is-measure': !showMore,\n })}\n >\n <le-popover\n mode=\"default\"\n position=\"bottom\"\n align=\"end\"\n minWidth=\"260px\"\n showClose={false}\n >\n <button slot=\"trigger\" type=\"button\" class=\"overflow-trigger\" aria-label=\"More\">\n More\n </button>\n <div class=\"popover-menu\">\n {this.renderVerticalList(overflowItems, { depth: 0, pathPrefix: '' })}\n </div>\n </le-popover>\n </div>\n </div>\n </div>\n );\n }\n\n render() {\n const items = this.parsedItems;\n\n if (this.orientation === 'horizontal') {\n return (\n <Host>\n <le-component component=\"le-navigation\">{this.renderHorizontal()}</le-component>\n </Host>\n );\n }\n\n return (\n <Host>\n <le-component component=\"le-navigation\">\n {this.renderVerticalList(items, {\n depth: 0,\n pathPrefix: '',\n searchable: this.searchable,\n searchQuery: this.searchQuery,\n searchPlaceholder: this.searchPlaceholder,\n emptyText: this.emptyText,\n })}\n </le-component>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":"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"}