le-kit 0.3.1 → 0.3.3

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 (155) hide show
  1. package/dist/cjs/{index-CNRmviSz.js → index-BDXkMiZB.js} +27 -2
  2. package/dist/cjs/index-BDXkMiZB.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +3 -2
  4. package/dist/cjs/index.cjs.js.map +1 -1
  5. package/dist/cjs/{le-button_13.cjs.entry.js → le-bar_16.cjs.entry.js} +967 -7
  6. package/dist/cjs/le-box.cjs.entry.js +2 -2
  7. package/dist/cjs/le-card.cjs.entry.js +2 -2
  8. package/dist/cjs/le-combobox.cjs.entry.js +1 -1
  9. package/dist/cjs/le-header-placeholder.cjs.entry.js +1 -1
  10. package/dist/cjs/le-kit.cjs.js +2 -2
  11. package/dist/cjs/le-multiselect.cjs.entry.js +1 -1
  12. package/dist/cjs/le-number-input.cjs.entry.js +2 -2
  13. package/dist/cjs/le-round-progress.cjs.entry.js +1 -1
  14. package/dist/cjs/le-segmented-control.cjs.entry.js +1 -1
  15. package/dist/cjs/le-stack.cjs.entry.js +2 -2
  16. package/dist/cjs/le-tab-bar.cjs.entry.js +1 -1
  17. package/dist/cjs/le-tab-panel.cjs.entry.js +1 -1
  18. package/dist/cjs/le-tab.cjs.entry.js +2 -2
  19. package/dist/cjs/le-tabs.cjs.entry.js +2 -2
  20. package/dist/cjs/le-tag.cjs.entry.js +1 -1
  21. package/dist/cjs/le-text.cjs.entry.js +2 -2
  22. package/dist/cjs/le-turntable.cjs.entry.js +1 -1
  23. package/dist/cjs/loader.cjs.js +2 -2
  24. package/dist/cjs/{utils-CZG22_vQ.js → utils-Co3xnkR-.js} +3 -3
  25. package/dist/cjs/{utils-CZG22_vQ.js.map → utils-Co3xnkR-.js.map} +1 -1
  26. package/dist/collection/components/le-bar/le-bar.js +59 -7
  27. package/dist/collection/components/le-bar/le-bar.js.map +1 -1
  28. package/dist/collection/components/le-component/le-component.js +1 -1
  29. package/dist/collection/components/le-component/le-component.js.map +1 -1
  30. package/dist/collection/components/le-icon/le-icon.js +19 -4
  31. package/dist/collection/components/le-icon/le-icon.js.map +1 -1
  32. package/dist/collection/components/le-navigation/le-navigation.js +3 -3
  33. package/dist/collection/components/le-navigation/le-navigation.js.map +1 -1
  34. package/dist/collection/components/le-select/le-select.js +3 -3
  35. package/dist/collection/components/le-select/le-select.js.map +1 -1
  36. package/dist/collection/dist/components/assets/custom-elements.json +1057 -1039
  37. package/dist/collection/global/app.js +24 -0
  38. package/dist/collection/global/app.js.map +1 -1
  39. package/dist/collection/index.js +1 -1
  40. package/dist/collection/index.js.map +1 -1
  41. package/dist/components/app.js +194 -0
  42. package/dist/components/app.js.map +1 -0
  43. package/dist/components/assets/custom-elements.json +1057 -1039
  44. package/dist/components/index.js +3 -2
  45. package/dist/components/index.js.map +1 -1
  46. package/dist/components/le-bar2.js +41 -8
  47. package/dist/components/le-bar2.js.map +1 -1
  48. package/dist/components/le-box.js +1 -1
  49. package/dist/components/le-button2.js +6 -5
  50. package/dist/components/le-button2.js.map +1 -1
  51. package/dist/components/le-card.js +1 -1
  52. package/dist/components/le-header.js +1 -1
  53. package/dist/components/le-icon2.js +19 -4
  54. package/dist/components/le-icon2.js.map +1 -1
  55. package/dist/components/le-navigation.js +3 -3
  56. package/dist/components/le-navigation.js.map +1 -1
  57. package/dist/components/le-number-input.js +1 -1
  58. package/dist/components/le-popover2.js +1 -1
  59. package/dist/components/le-stack.js +1 -1
  60. package/dist/components/le-tab2.js +1 -1
  61. package/dist/components/le-tabs.js +1 -1
  62. package/dist/components/utils.js +2 -166
  63. package/dist/components/utils.js.map +1 -1
  64. package/dist/docs.json +33 -4
  65. package/dist/esm/{index-BqH-zsXr.js → index-Bb6rgQY0.js} +27 -3
  66. package/dist/esm/index-Bb6rgQY0.js.map +1 -0
  67. package/dist/esm/index.js +2 -2
  68. package/dist/esm/{le-button_13.entry.js → le-bar_16.entry.js} +965 -8
  69. package/dist/esm/le-box.entry.js +2 -2
  70. package/dist/esm/le-card.entry.js +2 -2
  71. package/dist/esm/le-combobox.entry.js +1 -1
  72. package/dist/esm/le-header-placeholder.entry.js +1 -1
  73. package/dist/esm/le-kit.js +3 -3
  74. package/dist/esm/le-multiselect.entry.js +1 -1
  75. package/dist/esm/le-number-input.entry.js +2 -2
  76. package/dist/esm/le-round-progress.entry.js +1 -1
  77. package/dist/esm/le-segmented-control.entry.js +1 -1
  78. package/dist/esm/le-stack.entry.js +2 -2
  79. package/dist/esm/le-tab-bar.entry.js +1 -1
  80. package/dist/esm/le-tab-panel.entry.js +1 -1
  81. package/dist/esm/le-tab.entry.js +2 -2
  82. package/dist/esm/le-tabs.entry.js +2 -2
  83. package/dist/esm/le-tag.entry.js +1 -1
  84. package/dist/esm/le-text.entry.js +2 -2
  85. package/dist/esm/le-turntable.entry.js +1 -1
  86. package/dist/esm/loader.js +3 -3
  87. package/dist/esm/{utils-CdBk0DdF.js → utils-CDrgAR8V.js} +3 -3
  88. package/dist/esm/{utils-CdBk0DdF.js.map → utils-CDrgAR8V.js.map} +1 -1
  89. package/dist/le-kit/dist/components/assets/custom-elements.json +1057 -1039
  90. package/dist/le-kit/index.esm.js +1 -1
  91. package/dist/le-kit/le-kit.esm.js +1 -1
  92. package/dist/le-kit/{p-ebd86d4f.entry.js → p-166d31fd.entry.js} +2 -2
  93. package/dist/le-kit/{p-73f7de28.entry.js → p-1d4f84f6.entry.js} +2 -2
  94. package/dist/le-kit/{p-4b88b0da.entry.js → p-43a17d84.entry.js} +2 -2
  95. package/dist/le-kit/{p-b21277e8.entry.js → p-52cc2518.entry.js} +2 -2
  96. package/dist/le-kit/p-5a0efabf.entry.js +2 -0
  97. package/dist/le-kit/p-5a0efabf.entry.js.map +1 -0
  98. package/dist/le-kit/{p-b6997587.entry.js → p-5ad31bd2.entry.js} +2 -2
  99. package/dist/le-kit/{p-ac822433.entry.js → p-5e7e2d06.entry.js} +2 -2
  100. package/dist/le-kit/{p-07705c61.entry.js → p-68d94a06.entry.js} +2 -2
  101. package/dist/le-kit/{p-43f87acb.entry.js → p-84a778b1.entry.js} +2 -2
  102. package/dist/le-kit/{p-c0ccc9aa.entry.js → p-957f50aa.entry.js} +2 -2
  103. package/dist/le-kit/p-Bb6rgQY0.js +3 -0
  104. package/dist/le-kit/p-Bb6rgQY0.js.map +1 -0
  105. package/dist/le-kit/{p-VG5nXRzT.js → p-DG6SMiyr.js} +2 -2
  106. package/dist/le-kit/{p-VG5nXRzT.js.map → p-DG6SMiyr.js.map} +1 -1
  107. package/dist/le-kit/{p-249db213.entry.js → p-a44540d7.entry.js} +2 -2
  108. package/dist/le-kit/{p-0a270831.entry.js → p-bb7a199f.entry.js} +2 -2
  109. package/dist/le-kit/{p-3a0a57e9.entry.js → p-c8a9e104.entry.js} +2 -2
  110. package/dist/le-kit/{p-244ff3d7.entry.js → p-ca766522.entry.js} +2 -2
  111. package/dist/le-kit/{p-764005e3.entry.js → p-cb392b4b.entry.js} +2 -2
  112. package/dist/le-kit/{p-61edb398.entry.js → p-eb4b678f.entry.js} +2 -2
  113. package/dist/le-kit/{p-6d0090c1.entry.js → p-f45d86de.entry.js} +2 -2
  114. package/dist/types/components/le-bar/le-bar.d.ts +6 -0
  115. package/dist/types/components.d.ts +14 -4
  116. package/dist/types/global/app.d.ts +22 -0
  117. package/dist/types/index.d.ts +1 -1
  118. package/package.json +1 -1
  119. package/dist/cjs/index-CNRmviSz.js.map +0 -1
  120. package/dist/cjs/le-bar.cjs.entry.js +0 -428
  121. package/dist/cjs/le-icon.cjs.entry.js +0 -110
  122. package/dist/cjs/le-navigation.cjs.entry.js +0 -393
  123. package/dist/esm/index-BqH-zsXr.js.map +0 -1
  124. package/dist/esm/le-bar.entry.js +0 -426
  125. package/dist/esm/le-bar.entry.js.map +0 -1
  126. package/dist/esm/le-icon.entry.js +0 -108
  127. package/dist/esm/le-icon.entry.js.map +0 -1
  128. package/dist/esm/le-navigation.entry.js +0 -391
  129. package/dist/esm/le-navigation.entry.js.map +0 -1
  130. package/dist/le-kit/p-0efce278.entry.js +0 -2
  131. package/dist/le-kit/p-0efce278.entry.js.map +0 -1
  132. package/dist/le-kit/p-2102a152.entry.js +0 -2
  133. package/dist/le-kit/p-2102a152.entry.js.map +0 -1
  134. package/dist/le-kit/p-53d9c363.entry.js +0 -2
  135. package/dist/le-kit/p-53d9c363.entry.js.map +0 -1
  136. package/dist/le-kit/p-94f774af.entry.js +0 -2
  137. package/dist/le-kit/p-94f774af.entry.js.map +0 -1
  138. package/dist/le-kit/p-BqH-zsXr.js +0 -3
  139. package/dist/le-kit/p-BqH-zsXr.js.map +0 -1
  140. /package/dist/le-kit/{p-ebd86d4f.entry.js.map → p-166d31fd.entry.js.map} +0 -0
  141. /package/dist/le-kit/{p-73f7de28.entry.js.map → p-1d4f84f6.entry.js.map} +0 -0
  142. /package/dist/le-kit/{p-4b88b0da.entry.js.map → p-43a17d84.entry.js.map} +0 -0
  143. /package/dist/le-kit/{p-b21277e8.entry.js.map → p-52cc2518.entry.js.map} +0 -0
  144. /package/dist/le-kit/{p-b6997587.entry.js.map → p-5ad31bd2.entry.js.map} +0 -0
  145. /package/dist/le-kit/{p-ac822433.entry.js.map → p-5e7e2d06.entry.js.map} +0 -0
  146. /package/dist/le-kit/{p-07705c61.entry.js.map → p-68d94a06.entry.js.map} +0 -0
  147. /package/dist/le-kit/{p-43f87acb.entry.js.map → p-84a778b1.entry.js.map} +0 -0
  148. /package/dist/le-kit/{p-c0ccc9aa.entry.js.map → p-957f50aa.entry.js.map} +0 -0
  149. /package/dist/le-kit/{p-249db213.entry.js.map → p-a44540d7.entry.js.map} +0 -0
  150. /package/dist/le-kit/{p-0a270831.entry.js.map → p-bb7a199f.entry.js.map} +0 -0
  151. /package/dist/le-kit/{p-3a0a57e9.entry.js.map → p-c8a9e104.entry.js.map} +0 -0
  152. /package/dist/le-kit/{p-244ff3d7.entry.js.map → p-ca766522.entry.js.map} +0 -0
  153. /package/dist/le-kit/{p-764005e3.entry.js.map → p-cb392b4b.entry.js.map} +0 -0
  154. /package/dist/le-kit/{p-61edb398.entry.js.map → p-eb4b678f.entry.js.map} +0 -0
  155. /package/dist/le-kit/{p-6d0090c1.entry.js.map → p-f45d86de.entry.js.map} +0 -0
@@ -1,428 +0,0 @@
1
- 'use strict';
2
-
3
- var index = require('./index-CNRmviSz.js');
4
- var utils = require('./utils-CZG22_vQ.js');
5
-
6
- const leBarCss = () => `:host{display:block;--le-bar-gap:var(--le-spacing-2);--le-bar-padding:var(--le-spacing-2);--le-bar-min-height:2.5rem;--le-bar-background:transparent;--le-bar-border-color:var(--le-color-border);--le-bar-border-radius:var(--le-radius-md);--le-bar-button-size:2rem;--le-bar-button-color:var(--le-color-text-primary);--le-bar-button-hover-bg:var(--le-color-gray-100);--le-bar-button-border-radius:var(--le-radius-sm);--le-bar-arrow-size:1.5rem;--le-bar-popover-min-width:200px;--le-bar-popover-gap:var(--le-spacing-1)}.bar-container{display:flex;align-items:center;gap:var(--le-bar-gap);min-height:var(--le-bar-min-height);background:var(--le-bar-background);border-radius:var(--le-bar-border-radius);padding:var(--le-bar-padding)}.bar-container.align-start{justify-content:flex-start}.bar-container.align-end .bar-items{justify-content:flex-end}.bar-container.align-center .bar-items{justify-content:center}.bar-container.align-stretch .bar-items{justify-content:space-evenly}.bar-items{display:flex;flex-wrap:wrap;align-items:center;gap:var(--le-bar-gap);overflow:hidden;min-width:0;flex:1 1 0%;position:relative}.bar-items[style*="height"]{overflow:hidden}.bar-items.is-scrollable{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;scroll-behavior:smooth;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none}.bar-items.is-scrollable::-webkit-scrollbar{display:none}.bar-items.is-scrollable ::slotted(*){scroll-snap-align:start;flex-shrink:0}.bar-items.is-wrapping{flex-wrap:wrap;overflow:visible;height:auto !important}.bar-controls{display:flex;align-items:center;gap:var(--le-spacing-1);flex-shrink:0}.bar-controls-start{order:-1}.bar-controls-end{order:1}.bar-more-button,.bar-hamburger-button,.bar-all-menu-button{display:inline-flex;align-items:center;justify-content:center;width:var(--le-bar-button-size);height:var(--le-bar-button-size);padding:0;border:none;background:transparent;color:var(--le-bar-button-color);border-radius:var(--le-bar-button-border-radius);cursor:pointer;transition:background-color 0.15s ease}.bar-more-button:hover,.bar-hamburger-button:hover,.bar-all-menu-button:hover{background:var(--le-bar-button-hover-bg)}.bar-more-button:focus-visible,.bar-hamburger-button:focus-visible,.bar-all-menu-button:focus-visible{outline:2px solid var(--le-color-focus);outline-offset:2px}.bar-arrow{display:inline-flex;align-items:center;justify-content:center;width:var(--le-bar-arrow-size);height:var(--le-bar-arrow-size);padding:0;border:none;background:transparent;color:var(--le-bar-button-color);border-radius:var(--le-bar-button-border-radius);cursor:pointer;transition:background-color 0.15s ease, opacity 0.15s ease}.bar-arrow:hover:not(:disabled){background:var(--le-bar-button-hover-bg)}.bar-arrow:focus-visible{outline:2px solid var(--le-color-focus);outline-offset:2px}.bar-arrow:disabled,.bar-arrow.disabled{opacity:0.3;cursor:not-allowed}.arrow-icon-start{transform:rotate(90deg)}.arrow-icon-end{transform:rotate(-90deg)}.bar-overflow-trigger,.bar-all-menu-trigger{display:inline-flex}.bar-popover-content{display:flex;flex-direction:column;gap:var(--le-bar-popover-gap);min-width:var(--le-bar-popover-min-width);padding:var(--le-spacing-2)}.bar-popover-item{cursor:pointer}.bar-popover-item:hover{background:var(--le-bar-button-hover-bg);border-radius:var(--le-bar-button-border-radius)}:host(.hamburger-active) .bar-items{visibility:hidden;pointer-events:none}`;
7
-
8
- const LeBar = class {
9
- constructor(hostRef) {
10
- index.registerInstance(this, hostRef);
11
- this.leBarOverflowChange = index.createEvent(this, "leBarOverflowChange");
12
- }
13
- get el() { return index.getElement(this); }
14
- /**
15
- * Overflow behavior when items don't fit on one row.
16
- * - `more`: Overflow items appear in a "more" dropdown
17
- * - `scroll`: Items scroll horizontally with optional arrows
18
- * - `hamburger`: All items go into a hamburger menu if any overflow
19
- * - `wrap`: Items wrap to additional rows
20
- */
21
- overflow = 'more';
22
- /**
23
- * Alignment of items within the bar (maps to justify-content).
24
- */
25
- alignItems = 'start';
26
- /**
27
- * Show scroll arrows when overflow is "scroll".
28
- */
29
- arrows = false;
30
- /**
31
- * Disable the internal overflow popover.
32
- * When true, the bar still detects overflow and hides items,
33
- * but doesn't render its own popover. Use this when providing
34
- * custom overflow handling via the leBarOverflowChange event.
35
- */
36
- disablePopover = false;
37
- /**
38
- * Show an "all items" menu button.
39
- * - `false`: Don't show
40
- * - `true` or `'end'`: Show at end
41
- * - `'start'`: Show at start
42
- */
43
- showAllMenu = false;
44
- /**
45
- * Emitted when overflow state changes.
46
- */
47
- leBarOverflowChange;
48
- /** Whether the hamburger/more popover is open */
49
- popoverOpen = false;
50
- /** Whether hamburger mode is active (for hamburger overflow) */
51
- hamburgerActive = false;
52
- /** IDs of items that are overflowing */
53
- overflowingIds = new Set();
54
- /** Whether we can scroll left */
55
- canScrollStart = false;
56
- /** Whether we can scroll right */
57
- canScrollEnd = false;
58
- /** Whether the all-menu popover is open */
59
- allMenuOpen = false;
60
- /** Current height of the items container (for overflow handling) */
61
- containerHeight = null;
62
- itemsContainerEl;
63
- moreButtonEl;
64
- resizeObserver;
65
- mutationObserver;
66
- instanceId = utils.generateId('le-bar');
67
- // Map to track item elements and their IDs
68
- itemMap = new Map();
69
- // Prevent multiple recalculations in the same frame
70
- pendingRecalc = null;
71
- handleOverflowChange() {
72
- this.resetOverflowState();
73
- this.scheduleOverflowRecalc();
74
- }
75
- handleSlotChange() {
76
- this.scheduleOverflowRecalc();
77
- }
78
- connectedCallback() {
79
- this.setupObservers();
80
- }
81
- componentDidLoad() {
82
- this.scheduleOverflowRecalc();
83
- }
84
- componentDidRender() {
85
- // Recalculate after render in case children changed
86
- this.scheduleOverflowRecalc();
87
- }
88
- disconnectedCallback() {
89
- this.resizeObserver?.disconnect();
90
- this.mutationObserver?.disconnect();
91
- }
92
- /**
93
- * Force recalculation of overflow state.
94
- */
95
- async recalculate() {
96
- this.computeOverflow();
97
- }
98
- setupObservers() {
99
- // ResizeObserver for container size changes
100
- if (typeof ResizeObserver !== 'undefined') {
101
- this.resizeObserver = new ResizeObserver(() => {
102
- this.computeOverflow();
103
- this.updateScrollState();
104
- });
105
- }
106
- // MutationObserver for child changes
107
- this.mutationObserver = new MutationObserver(() => {
108
- this.scheduleOverflowRecalc();
109
- });
110
- this.mutationObserver.observe(this.el, {
111
- childList: true,
112
- subtree: false,
113
- });
114
- }
115
- observeContainer(el) {
116
- if (!this.resizeObserver)
117
- return;
118
- this.resizeObserver.disconnect();
119
- if (el)
120
- this.resizeObserver.observe(el);
121
- }
122
- scheduleOverflowRecalc() {
123
- // Debounce recalculations to prevent infinite loops
124
- if (this.pendingRecalc !== null) {
125
- cancelAnimationFrame(this.pendingRecalc);
126
- }
127
- this.pendingRecalc = requestAnimationFrame(() => {
128
- this.pendingRecalc = null;
129
- this.computeOverflow();
130
- });
131
- }
132
- resetOverflowState() {
133
- this.hamburgerActive = false;
134
- this.overflowingIds = new Set();
135
- this.containerHeight = null;
136
- this.popoverOpen = false;
137
- }
138
- getSlottedItems() {
139
- // Get direct children from the light DOM (excluding named slot elements)
140
- return Array.from(this.el.children).filter((el) => el instanceof HTMLElement && !el.hasAttribute('slot'));
141
- }
142
- getItemId(el, index) {
143
- return el.id || el.dataset.barId || `${this.instanceId}-item-${index}`;
144
- }
145
- computeOverflow() {
146
- if (this.overflow === 'wrap' || this.overflow === 'scroll') {
147
- // No overflow handling needed for wrap/scroll modes
148
- this.resetOverflowState();
149
- this.updateScrollState();
150
- return;
151
- }
152
- const container = this.itemsContainerEl;
153
- if (!container)
154
- return;
155
- const items = this.getSlottedItems();
156
- if (items.length === 0) {
157
- this.resetOverflowState();
158
- return;
159
- }
160
- // Build item map
161
- this.itemMap.clear();
162
- items.forEach((item, index) => {
163
- const id = this.getItemId(item, index);
164
- this.itemMap.set(id, item);
165
- });
166
- // Get the position of items to determine which are on the first row
167
- const itemRects = items.map((item, index) => ({
168
- item,
169
- id: this.getItemId(item, index),
170
- rect: item.getBoundingClientRect(),
171
- }));
172
- if (itemRects.length === 0) {
173
- return;
174
- }
175
- // Find the first row's top position (accounting for vertical alignment)
176
- const containerRect = container.getBoundingClientRect();
177
- const topValues = itemRects.map(i => i.rect.top - containerRect.top);
178
- const minTop = Math.min(...topValues);
179
- // Items are on the first row if their top is close to minTop
180
- // Allow some tolerance for alignment differences
181
- const tolerance = 15;
182
- const firstRowItems = itemRects.filter(i => i.rect.top - containerRect.top <= minTop + tolerance);
183
- const overflowItems = itemRects.filter(i => i.rect.top - containerRect.top > minTop + tolerance);
184
- // Calculate the height of the first row
185
- const firstRowBottom = firstRowItems.length > 0
186
- ? Math.max(...firstRowItems.map(i => i.rect.bottom - containerRect.top))
187
- : 0;
188
- if (this.overflow === 'hamburger') {
189
- // In hamburger mode, if ANY item overflows, all go into the menu
190
- const shouldHamburger = overflowItems.length > 0;
191
- if (shouldHamburger !== this.hamburgerActive) {
192
- this.hamburgerActive = shouldHamburger;
193
- this.emitOverflowChange();
194
- }
195
- // Set height to show only first row (or hide all if hamburger is active)
196
- if (shouldHamburger && firstRowBottom > 0) {
197
- this.containerHeight = firstRowBottom;
198
- }
199
- else {
200
- this.containerHeight = null;
201
- }
202
- }
203
- else {
204
- // 'more' mode
205
- const newOverflowingIds = new Set(overflowItems.map(i => i.id));
206
- // Check if we need to make room for the "more" button
207
- if (newOverflowingIds.size > 0 && this.moreButtonEl) {
208
- const moreRect = this.moreButtonEl.getBoundingClientRect();
209
- const moreTop = moreRect.top - containerRect.top;
210
- // If "more" button is not on the first row, we need to hide one more item
211
- if (moreTop > minTop + tolerance) {
212
- // Find the last visible item and move it to overflow
213
- const lastVisible = firstRowItems[firstRowItems.length - 1];
214
- if (lastVisible) {
215
- newOverflowingIds.add(lastVisible.id);
216
- }
217
- }
218
- }
219
- // Check if overflow state changed
220
- const hasChanged = newOverflowingIds.size !== this.overflowingIds.size ||
221
- ![...newOverflowingIds].every(id => this.overflowingIds.has(id));
222
- if (hasChanged) {
223
- this.overflowingIds = newOverflowingIds;
224
- this.emitOverflowChange();
225
- }
226
- // Set container height to show only first row
227
- if ((newOverflowingIds?.size ?? 0) > 0 && firstRowBottom > 0) {
228
- this.containerHeight = firstRowBottom;
229
- }
230
- else {
231
- this.containerHeight = null;
232
- }
233
- }
234
- }
235
- emitOverflowChange() {
236
- this.leBarOverflowChange.emit({
237
- overflowingIds: [...(this.overflowingIds ?? [])],
238
- hamburgerActive: this.hamburgerActive,
239
- });
240
- }
241
- updateScrollState() {
242
- if (this.overflow !== 'scroll' || !this.itemsContainerEl) {
243
- this.canScrollStart = false;
244
- this.canScrollEnd = false;
245
- return;
246
- }
247
- const el = this.itemsContainerEl;
248
- this.canScrollStart = el.scrollLeft > 0;
249
- this.canScrollEnd = el.scrollLeft < el.scrollWidth - el.clientWidth - 1;
250
- }
251
- handleScroll = () => {
252
- this.updateScrollState();
253
- };
254
- scrollToStart = () => {
255
- if (!this.itemsContainerEl)
256
- return;
257
- const items = this.getSlottedItems();
258
- const container = this.itemsContainerEl;
259
- // Find the scroll position of the previous item
260
- const currentScroll = container.scrollLeft;
261
- let targetScroll = 0;
262
- for (let i = items.length - 1; i >= 0; i--) {
263
- const item = items[i];
264
- // Calculate item's left edge relative to container's scroll position
265
- const itemLeft = item.offsetLeft - container.offsetLeft;
266
- // If this item starts before current scroll position, scroll to it
267
- if (itemLeft < currentScroll - 1) {
268
- targetScroll = itemLeft;
269
- break;
270
- }
271
- }
272
- container.scrollTo({ left: targetScroll, behavior: 'smooth' });
273
- // Update scroll state after animation
274
- setTimeout(() => this.updateScrollState(), 300);
275
- };
276
- scrollToEnd = () => {
277
- if (!this.itemsContainerEl)
278
- return;
279
- const container = this.itemsContainerEl;
280
- const items = this.getSlottedItems();
281
- if (items.length === 0)
282
- return;
283
- const containerWidth = container.clientWidth;
284
- const currentScroll = container.scrollLeft;
285
- let targetScroll = container.scrollWidth - containerWidth;
286
- for (const item of items) {
287
- // Calculate item's right edge relative to container
288
- const itemLeft = item.offsetLeft - container.offsetLeft;
289
- // If this is the next item to scroll to from left to right then scroll to it
290
- if (itemLeft > currentScroll + 1) {
291
- targetScroll = itemLeft;
292
- break;
293
- }
294
- }
295
- container.scrollTo({ left: Math.max(0, targetScroll), behavior: 'smooth' });
296
- // Update scroll state after animation
297
- setTimeout(() => this.updateScrollState(), 300);
298
- };
299
- togglePopover = () => {
300
- this.popoverOpen = !this.popoverOpen;
301
- };
302
- closePopover = () => {
303
- this.popoverOpen = false;
304
- };
305
- toggleAllMenu = () => {
306
- this.allMenuOpen = !this.allMenuOpen;
307
- };
308
- closeAllMenu = () => {
309
- this.allMenuOpen = false;
310
- };
311
- handleItemClick = (_e, id) => {
312
- // Close popover when an item inside is clicked
313
- const originalItem = this.itemMap.get(id);
314
- if (originalItem) {
315
- // Clone the click to the original item
316
- const cloneEvent = new MouseEvent('click', {
317
- bubbles: true,
318
- cancelable: true,
319
- view: window,
320
- });
321
- originalItem.dispatchEvent(cloneEvent);
322
- }
323
- this.closePopover();
324
- this.closeAllMenu();
325
- };
326
- renderMoreButton() {
327
- const hasSlottedMore = this.el.querySelector('[slot="more"]');
328
- return (index.h("button", { class: "bar-more-button", part: "more-button", ref: el => (this.moreButtonEl = el), onClick: this.togglePopover, "aria-expanded": String(this.popoverOpen), "aria-haspopup": "true" }, hasSlottedMore ? index.h("slot", { name: "more" }) : index.h("le-icon", { name: "ellipsis-horizontal" })));
329
- }
330
- renderHamburgerButton() {
331
- const hasSlottedHamburger = this.el.querySelector('[slot="hamburger"]');
332
- return (index.h("button", { class: "bar-hamburger-button", part: "hamburger-button", onClick: this.togglePopover, "aria-expanded": String(this.popoverOpen), "aria-haspopup": "true" }, hasSlottedHamburger ? index.h("slot", { name: "hamburger" }) : index.h("le-icon", { name: "hamburger" })));
333
- }
334
- renderScrollArrows() {
335
- if (!this.arrows || this.overflow !== 'scroll')
336
- return null;
337
- const hasSlottedStartArrow = this.el.querySelector('[slot="start-arrow"]');
338
- const hasSlottedEndArrow = this.el.querySelector('[slot="end-arrow"]');
339
- return [
340
- index.h("button", { class: utils.classnames('bar-arrow', 'bar-arrow-start', {
341
- disabled: !this.canScrollStart,
342
- }), part: "arrow-start", onClick: this.scrollToStart, disabled: !this.canScrollStart, "aria-label": "Scroll to start" }, hasSlottedStartArrow ? (index.h("slot", { name: "start-arrow" })) : (index.h("le-icon", { name: "chevron-down", class: "arrow-icon-start" }))),
343
- index.h("button", { class: utils.classnames('bar-arrow', 'bar-arrow-end', {
344
- disabled: !this.canScrollEnd,
345
- }), part: "arrow-end", onClick: this.scrollToEnd, disabled: !this.canScrollEnd, "aria-label": "Scroll to end" }, hasSlottedEndArrow ? (index.h("slot", { name: "end-arrow" })) : (index.h("le-icon", { name: "chevron-down", class: "arrow-icon-end" }))),
346
- ];
347
- }
348
- renderAllMenuButton() {
349
- if (!this.showAllMenu)
350
- return null;
351
- const hasSlottedAllMenu = this.el.querySelector('[slot="all-menu"]');
352
- return (index.h("button", { class: "bar-all-menu-button", part: "all-menu-button", onClick: this.toggleAllMenu, "aria-expanded": String(this.allMenuOpen), "aria-haspopup": "true" }, hasSlottedAllMenu ? index.h("slot", { name: "all-menu" }) : index.h("le-icon", { name: "hamburger" })));
353
- }
354
- renderPopoverContent(itemsToShow) {
355
- return (index.h("div", { class: "bar-popover-content", part: "popover-content" }, itemsToShow.map(({ id, item }) => (index.h("div", { class: "bar-popover-item", key: id, onClick: (e) => this.handleItemClick(e, id), innerHTML: item.outerHTML })))));
356
- }
357
- renderOverflowPopover() {
358
- if (this.overflow !== 'more' && this.overflow !== 'hamburger')
359
- return null;
360
- const items = this.getSlottedItems();
361
- let itemsToShow = [];
362
- if (this.overflow === 'hamburger' && this.hamburgerActive) {
363
- // Show all items in hamburger mode
364
- itemsToShow = items.map((item, index) => ({
365
- id: this.getItemId(item, index),
366
- item,
367
- }));
368
- }
369
- else if (this.overflow === 'more' && (this.overflowingIds?.size ?? 0) > 0) {
370
- // Show only overflowing items
371
- itemsToShow = items
372
- .map((item, index) => ({
373
- id: this.getItemId(item, index),
374
- item,
375
- }))
376
- .filter(({ id }) => this.overflowingIds?.has(id));
377
- }
378
- if (itemsToShow.length === 0)
379
- return null;
380
- return (index.h("le-popover", { mode: "default", open: this.popoverOpen, position: "bottom", align: "end", showClose: false, closeOnClickOutside: true, closeOnEscape: true, onLePopoverClose: this.closePopover }, index.h("div", { slot: "trigger", class: "bar-overflow-trigger" }, this.overflow === 'hamburger' ? this.renderHamburgerButton() : this.renderMoreButton()), this.renderPopoverContent(itemsToShow)));
381
- }
382
- renderAllMenuPopover() {
383
- if (!this.showAllMenu)
384
- return null;
385
- const items = this.getSlottedItems();
386
- const itemsToShow = items.map((item, index) => ({
387
- id: this.getItemId(item, index),
388
- item,
389
- }));
390
- const position = this.showAllMenu === 'start' ? 'start' : 'end';
391
- return (index.h("le-popover", { mode: "default", open: this.allMenuOpen, position: "bottom", align: position, showClose: false, closeOnClickOutside: true, closeOnEscape: true, onLePopoverClose: this.closeAllMenu }, index.h("div", { slot: "trigger", class: "bar-all-menu-trigger" }, this.renderAllMenuButton()), this.renderPopoverContent(itemsToShow)));
392
- }
393
- render() {
394
- const showOverflowButton = !this.disablePopover &&
395
- ((this.overflow === 'more' && (this.overflowingIds?.size ?? 0) > 0) ||
396
- (this.overflow === 'hamburger' && this.hamburgerActive));
397
- const containerStyle = {};
398
- if (this.containerHeight !== null &&
399
- (this.overflow === 'more' || this.overflow === 'hamburger')) {
400
- containerStyle.height = `${this.containerHeight}px`;
401
- }
402
- const showAllMenuAtStart = this.showAllMenu === 'start';
403
- const showAllMenuAtEnd = this.showAllMenu === true || this.showAllMenu === 'end';
404
- return (index.h(index.Host, { key: 'b15277217f45b9a2b4015e1062192ad7bfcafae3', class: utils.classnames({
405
- 'overflow-more': this.overflow === 'more',
406
- 'overflow-scroll': this.overflow === 'scroll',
407
- 'overflow-hamburger': this.overflow === 'hamburger',
408
- 'overflow-wrap': this.overflow === 'wrap',
409
- 'hamburger-active': this.hamburgerActive,
410
- 'has-overflow': (this.overflowingIds?.size ?? 0) > 0 || this.hamburgerActive,
411
- }) }, index.h("div", { key: 'cc8ff523ebc98f307cae7313a1998468e98dd712', class: utils.classnames('bar-container', {
412
- [`align-${this.alignItems}`]: true,
413
- }), part: "container" }, this.overflow === 'scroll' && this.arrows && (index.h("div", { key: '00f0afbd5b4280f4b231fa4d499ef8a7c0e4bd47', class: "bar-controls bar-controls-start" }, this.renderScrollArrows()?.[0])), showAllMenuAtStart && (index.h("div", { key: '57234a8145f97f7a803c0488b520786a25584a9d', class: "bar-controls bar-controls-start" }, this.renderAllMenuPopover())), index.h("div", { key: '15db1e36049182161823998fc1041ad91d327816', class: utils.classnames('bar-items', {
414
- 'is-scrollable': this.overflow === 'scroll',
415
- 'is-wrapping': this.overflow === 'wrap',
416
- }), style: containerStyle, ref: el => {
417
- this.itemsContainerEl = el;
418
- this.observeContainer(el);
419
- }, onScroll: this.overflow === 'scroll' ? this.handleScroll : undefined }, index.h("slot", { key: '6b967b1c0f251e1214b0ae58b18e767ef9d096a8' })), showOverflowButton && (index.h("div", { key: 'b77c30910b01bffae047f9744f2589743a29eb29', class: "bar-controls bar-controls-end" }, this.renderOverflowPopover())), showAllMenuAtEnd && (index.h("div", { key: '971d727e51f4b4682ed1b600e930b2f33b3c0a65', class: "bar-controls bar-controls-end" }, this.renderAllMenuPopover())), this.overflow === 'scroll' && this.arrows && (index.h("div", { key: 'a6b6fc87ceae32503fc55a0da54b1e38f7f95ff7', class: "bar-controls bar-controls-end" }, this.renderScrollArrows()?.[1])))));
420
- }
421
- static get watchers() { return {
422
- "overflow": ["handleOverflowChange"]
423
- }; }
424
- };
425
- LeBar.style = leBarCss();
426
-
427
- exports.le_bar = LeBar;
428
- //# sourceMappingURL=le-bar.entry.cjs.js.map
@@ -1,110 +0,0 @@
1
- 'use strict';
2
-
3
- var index = require('./index-CNRmviSz.js');
4
-
5
- const leIconCss = () => `:host{display:inline-block;width:var(--le-icon-size, var(--le-size-4));height:var(--le-icon-size, var(--le-size-4));color:var(--le-icon-color, var(--le-color-text-primary))}:host svg{display:block;fill:currentColor}`;
6
-
7
- const iconCache = {};
8
- const requestCache = {};
9
- async function fetchIcon({ name }) {
10
- if (iconCache[name]) {
11
- return iconCache[name];
12
- }
13
- if (!requestCache[name]) {
14
- console.log(`Fetching icon "${name}"`, index.getAssetPath(`./assets/icons/${name}.json`));
15
- requestCache[name] = fetch(index.getAssetPath(`./assets/icons/${name}.json`))
16
- .then(resp => resp.json())
17
- .catch(() => {
18
- console.error(`"${name}" is not a valid name`);
19
- return '';
20
- });
21
- }
22
- const path = await requestCache[name];
23
- iconCache[name] = path;
24
- return path;
25
- }
26
- const LeIcon = class {
27
- constructor(hostRef) {
28
- index.registerInstance(this, hostRef);
29
- }
30
- get el() { return index.getElement(this); }
31
- /**
32
- * Name of the icon to display. Corresponds to a JSON file in the assets folder.
33
- * For example, "search" will load the "search.json" file.
34
- */
35
- name = null;
36
- /**
37
- * Size of the icon in pixels. Default is 16.
38
- */
39
- size = 16;
40
- iconData = null;
41
- visible = false;
42
- async loadIconData() {
43
- const { name, visible } = this;
44
- if (!name || !visible) {
45
- return;
46
- }
47
- this.iconData = await fetchIcon({ name });
48
- }
49
- intersectionObserver;
50
- connectedCallback() {
51
- this.waitUntilVisible(() => {
52
- this.visible = true;
53
- this.loadIconData();
54
- });
55
- }
56
- disconnectedCallback() {
57
- if (this.intersectionObserver) {
58
- this.intersectionObserver.disconnect();
59
- this.intersectionObserver = null;
60
- }
61
- }
62
- async componentWillLoad() {
63
- this.loadIconData();
64
- }
65
- waitUntilVisible(callback) {
66
- if (typeof window === 'undefined' ||
67
- !window.IntersectionObserver) {
68
- callback();
69
- return;
70
- }
71
- this.intersectionObserver = new IntersectionObserver(entries => {
72
- entries.forEach(entry => {
73
- if (entry.isIntersecting) {
74
- this.intersectionObserver.disconnect();
75
- this.intersectionObserver = null;
76
- callback();
77
- }
78
- });
79
- }, { rootMargin: '50px' });
80
- this.intersectionObserver.observe(this.el);
81
- }
82
- /**
83
- * Renders the SVG content out of a JSON data in a format:
84
- * { "viewBox": "...", children: [{ "tag": "g", ""children": [ ... ], ...attrs }, ...] }
85
- *
86
- * @returns JSX.Element | null
87
- */
88
- renderSVGContent(children) {
89
- if (!children || children.length === 0) {
90
- return null;
91
- }
92
- const createElement = node => {
93
- const { tag, children, ...attrs } = node;
94
- return index.h(tag, attrs, children ? children.map(createElement) : null);
95
- };
96
- const svgElements = children.map(createElement);
97
- return svgElements;
98
- }
99
- render() {
100
- return (index.h("svg", { key: 'ef551908a289cd765ae88ded83b99057d510e142', xmlns: "http://www.w3.org/2000/svg", fill: "currentColor", height: this.size || 16, width: this.size || 16, viewBox: this.iconData?.viewBox || `0 0 ${this.size || 16} ${this.size || 16}` }, this.renderSVGContent(this.iconData?.children)));
101
- }
102
- static get assetsDirs() { return ["assets/icons"]; }
103
- static get watchers() { return {
104
- "name": ["loadIconData"]
105
- }; }
106
- };
107
- LeIcon.style = leIconCss();
108
-
109
- exports.le_icon = LeIcon;
110
- //# sourceMappingURL=le-icon.entry.cjs.js.map