le-kit 0.3.5 → 0.4.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 (222) hide show
  1. package/dist/cjs/{index-BPF04Jvb.js → index-BzadfLTc.js} +6 -3
  2. package/dist/cjs/index-BzadfLTc.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +2 -2
  4. package/dist/cjs/le-bar_16.cjs.entry.js +21 -21
  5. package/dist/cjs/le-box.cjs.entry.js +5 -5
  6. package/dist/cjs/le-card.cjs.entry.js +5 -5
  7. package/dist/cjs/le-combobox.cjs.entry.js +2 -2
  8. package/dist/cjs/le-header-placeholder.cjs.entry.js +2 -2
  9. package/dist/cjs/le-kit.cjs.js +2 -2
  10. package/dist/cjs/le-multiselect.cjs.entry.js +4 -4
  11. package/dist/cjs/le-number-input.cjs.entry.js +3 -3
  12. package/dist/cjs/le-round-progress.cjs.entry.js +2 -2
  13. package/dist/cjs/le-segmented-control.cjs.entry.js +2 -2
  14. package/dist/cjs/le-side-panel-toggle.cjs.entry.js +229 -0
  15. package/dist/cjs/le-side-panel.cjs.entry.js +546 -0
  16. package/dist/cjs/le-stack.cjs.entry.js +3 -3
  17. package/dist/cjs/le-tab-bar.cjs.entry.js +2 -2
  18. package/dist/cjs/le-tab-panel.cjs.entry.js +3 -3
  19. package/dist/cjs/le-tab.cjs.entry.js +3 -3
  20. package/dist/cjs/le-tabs.cjs.entry.js +4 -4
  21. package/dist/cjs/le-tag.cjs.entry.js +2 -2
  22. package/dist/cjs/le-text.cjs.entry.js +8 -8
  23. package/dist/cjs/le-turntable.cjs.entry.js +2 -2
  24. package/dist/cjs/loader.cjs.js +2 -2
  25. package/dist/cjs/{utils-BYsLPHN1.js → utils-Dxx9WhWK.js} +3 -3
  26. package/dist/cjs/{utils-BYsLPHN1.js.map → utils-Dxx9WhWK.js.map} +1 -1
  27. package/dist/collection/collection-manifest.json +2 -0
  28. package/dist/collection/components/le-box/le-box.js +3 -3
  29. package/dist/collection/components/le-box/le-box.js.map +1 -1
  30. package/dist/collection/components/le-button/le-button.css +2 -2
  31. package/dist/collection/components/le-button/le-button.js +1 -1
  32. package/dist/collection/components/le-card/le-card.js +3 -3
  33. package/dist/collection/components/le-card/le-card.js.map +1 -1
  34. package/dist/collection/components/le-checkbox/le-checkbox.js +1 -1
  35. package/dist/collection/components/le-collapse/le-collapse.js +1 -1
  36. package/dist/collection/components/le-combobox/le-combobox.js +1 -1
  37. package/dist/collection/components/le-current-heading/le-current-heading.js +1 -1
  38. package/dist/collection/components/le-dropdown-base/le-dropdown-base.js +1 -1
  39. package/dist/collection/components/le-header/le-header.js +2 -2
  40. package/dist/collection/components/le-header-placeholder/le-header-placeholder.js +1 -1
  41. package/dist/collection/components/le-icon/le-icon.js +1 -1
  42. package/dist/collection/components/le-multiselect/le-multiselect.js +3 -3
  43. package/dist/collection/components/le-navigation/le-navigation.css +10 -4
  44. package/dist/collection/components/le-number-input/le-number-input.js +1 -1
  45. package/dist/collection/components/le-popover/le-popover.js +3 -3
  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-side-panel/le-side-panel.css +193 -0
  51. package/dist/collection/components/le-side-panel/le-side-panel.js +953 -0
  52. package/dist/collection/components/le-side-panel/le-side-panel.js.map +1 -0
  53. package/dist/collection/components/le-side-panel-toggle/le-side-panel-toggle.js +610 -0
  54. package/dist/collection/components/le-side-panel-toggle/le-side-panel-toggle.js.map +1 -0
  55. package/dist/collection/components/le-slot/le-slot.js +1 -1
  56. package/dist/collection/components/le-stack/le-stack.js +1 -1
  57. package/dist/collection/components/le-string-input/le-string-input.js +2 -2
  58. package/dist/collection/components/le-tab/le-tab.js +1 -1
  59. package/dist/collection/components/le-tab-bar/le-tab-bar.js +1 -1
  60. package/dist/collection/components/le-tab-panel/le-tab-panel.js +2 -2
  61. package/dist/collection/components/le-tabs/le-tabs.js +2 -2
  62. package/dist/collection/components/le-tag/le-tag.js +1 -1
  63. package/dist/collection/components/le-text/le-text.js +7 -7
  64. package/dist/collection/components/le-text/le-text.js.map +1 -1
  65. package/dist/collection/components/le-turntable/le-turntable.js +1 -1
  66. package/dist/collection/dist/components/assets/custom-elements.json +5035 -4019
  67. package/dist/collection/dist/components/assets/icons/side-panel.json +61 -0
  68. package/dist/collection/dist/themes/dark.css +1 -0
  69. package/dist/collection/dist/themes/default.css +1 -0
  70. package/dist/collection/dist/themes/gradient.css +1 -0
  71. package/dist/collection/dist/themes/minimal.css +1 -0
  72. package/dist/collection/dist/themes/warm.css +1 -0
  73. package/dist/components/assets/custom-elements.json +5035 -4019
  74. package/dist/components/assets/icons/side-panel.json +61 -0
  75. package/dist/components/index.js.map +1 -1
  76. package/dist/components/le-box.js +3 -3
  77. package/dist/components/le-box.js.map +1 -1
  78. package/dist/components/le-button2.js +8 -8
  79. package/dist/components/le-button2.js.map +1 -1
  80. package/dist/components/le-card.js +3 -3
  81. package/dist/components/le-card.js.map +1 -1
  82. package/dist/components/le-collapse2.js +1 -1
  83. package/dist/components/le-combobox.js +1 -1
  84. package/dist/components/le-current-heading.js +1 -1
  85. package/dist/components/le-dropdown-base2.js +1 -1
  86. package/dist/components/le-header-placeholder.js +1 -1
  87. package/dist/components/le-header.js +2 -2
  88. package/dist/components/le-icon2.js +1 -1
  89. package/dist/components/le-multiselect.js +3 -3
  90. package/dist/components/le-navigation.js +1 -1
  91. package/dist/components/le-navigation.js.map +1 -1
  92. package/dist/components/le-number-input.js +1 -1
  93. package/dist/components/le-popover2.js +3 -3
  94. package/dist/components/le-round-progress.js +1 -1
  95. package/dist/components/le-scroll-progress.js +1 -1
  96. package/dist/components/le-segmented-control.js +1 -1
  97. package/dist/components/le-side-panel-toggle.d.ts +11 -0
  98. package/dist/components/le-side-panel-toggle.js +9 -0
  99. package/dist/components/le-side-panel-toggle.js.map +1 -0
  100. package/dist/components/le-side-panel-toggle2.js +311 -0
  101. package/dist/components/le-side-panel-toggle2.js.map +1 -0
  102. package/dist/components/le-side-panel.d.ts +11 -0
  103. package/dist/components/le-side-panel.js +660 -0
  104. package/dist/components/le-side-panel.js.map +1 -0
  105. package/dist/components/le-stack.js +1 -1
  106. package/dist/components/le-tab-bar.js +1 -1
  107. package/dist/components/le-tab-panel.js +2 -2
  108. package/dist/components/le-tab2.js +1 -1
  109. package/dist/components/le-tabs.js +2 -2
  110. package/dist/components/le-tag2.js +1 -1
  111. package/dist/components/le-text.js +6 -6
  112. package/dist/components/le-text.js.map +1 -1
  113. package/dist/components/le-turntable.js +1 -1
  114. package/dist/docs.json +1397 -130
  115. package/dist/esm/{index-C-Chwj1b.js → index-DFTm5BqT.js} +7 -4
  116. package/dist/esm/index-DFTm5BqT.js.map +1 -0
  117. package/dist/esm/index.js +2 -2
  118. package/dist/esm/le-bar_16.entry.js +21 -21
  119. package/dist/esm/le-box.entry.js +5 -5
  120. package/dist/esm/le-box.entry.js.map +1 -1
  121. package/dist/esm/le-card.entry.js +5 -5
  122. package/dist/esm/le-card.entry.js.map +1 -1
  123. package/dist/esm/le-combobox.entry.js +2 -2
  124. package/dist/esm/le-header-placeholder.entry.js +2 -2
  125. package/dist/esm/le-kit.js +3 -3
  126. package/dist/esm/le-multiselect.entry.js +4 -4
  127. package/dist/esm/le-number-input.entry.js +3 -3
  128. package/dist/esm/le-round-progress.entry.js +2 -2
  129. package/dist/esm/le-segmented-control.entry.js +2 -2
  130. package/dist/esm/le-side-panel-toggle.entry.js +227 -0
  131. package/dist/esm/le-side-panel-toggle.entry.js.map +1 -0
  132. package/dist/esm/le-side-panel.entry.js +544 -0
  133. package/dist/esm/le-side-panel.entry.js.map +1 -0
  134. package/dist/esm/le-stack.entry.js +3 -3
  135. package/dist/esm/le-tab-bar.entry.js +2 -2
  136. package/dist/esm/le-tab-panel.entry.js +3 -3
  137. package/dist/esm/le-tab.entry.js +3 -3
  138. package/dist/esm/le-tabs.entry.js +4 -4
  139. package/dist/esm/le-tag.entry.js +2 -2
  140. package/dist/esm/le-text.entry.js +8 -8
  141. package/dist/esm/le-text.entry.js.map +1 -1
  142. package/dist/esm/le-turntable.entry.js +2 -2
  143. package/dist/esm/loader.js +3 -3
  144. package/dist/esm/{utils-B3alHV04.js → utils-DZYCZLrF.js} +3 -3
  145. package/dist/esm/{utils-B3alHV04.js.map → utils-DZYCZLrF.js.map} +1 -1
  146. package/dist/le-kit/dist/components/assets/custom-elements.json +5035 -4019
  147. package/dist/le-kit/dist/components/assets/icons/side-panel.json +61 -0
  148. package/dist/le-kit/dist/themes/dark.css +1 -0
  149. package/dist/le-kit/dist/themes/default.css +1 -0
  150. package/dist/le-kit/dist/themes/gradient.css +1 -0
  151. package/dist/le-kit/dist/themes/minimal.css +1 -0
  152. package/dist/le-kit/dist/themes/warm.css +1 -0
  153. package/dist/le-kit/index.esm.js +1 -1
  154. package/dist/le-kit/le-kit.css +1 -1
  155. package/dist/le-kit/le-kit.esm.js +1 -1
  156. package/dist/le-kit/p-221d379a.entry.js +2 -0
  157. package/dist/le-kit/p-221d379a.entry.js.map +1 -0
  158. package/dist/le-kit/{p-d161946c.entry.js → p-33a24394.entry.js} +2 -2
  159. package/dist/le-kit/{p-3d22aeb2.entry.js → p-36f126bb.entry.js} +2 -2
  160. package/dist/le-kit/p-3f26be75.entry.js +2 -0
  161. package/dist/le-kit/{p-3ceede4e.entry.js.map → p-3f26be75.entry.js.map} +1 -1
  162. package/dist/le-kit/{p-3d873cdb.entry.js → p-3f31e31b.entry.js} +2 -2
  163. package/dist/le-kit/{p-ea71f22c.entry.js → p-46276e77.entry.js} +2 -2
  164. package/dist/le-kit/p-46276e77.entry.js.map +1 -0
  165. package/dist/le-kit/p-69dd089a.entry.js +2 -0
  166. package/dist/le-kit/{p-f8034500.entry.js.map → p-69dd089a.entry.js.map} +1 -1
  167. package/dist/le-kit/p-6da2d81a.entry.js +2 -0
  168. package/dist/le-kit/{p-06d2d79c.entry.js.map → p-6da2d81a.entry.js.map} +1 -1
  169. package/dist/le-kit/{p-2230ecd7.entry.js → p-7201ae65.entry.js} +2 -2
  170. package/dist/le-kit/p-7a60bfff.entry.js +2 -0
  171. package/dist/le-kit/p-98242429.entry.js +2 -0
  172. package/dist/le-kit/p-98242429.entry.js.map +1 -0
  173. package/dist/le-kit/{p-923828fe.entry.js → p-9863d6fb.entry.js} +2 -2
  174. package/dist/le-kit/{p-DFr88Szp.js → p-D8RYDS9p.js} +2 -2
  175. package/dist/le-kit/{p-DFr88Szp.js.map → p-D8RYDS9p.js.map} +1 -1
  176. package/dist/le-kit/{p-C-Chwj1b.js → p-DFTm5BqT.js} +3 -3
  177. package/dist/le-kit/p-DFTm5BqT.js.map +1 -0
  178. package/dist/le-kit/{p-be2a7276.entry.js → p-bf66757c.entry.js} +2 -2
  179. package/dist/le-kit/p-c4975e66.entry.js +2 -0
  180. package/dist/le-kit/{p-e1846fc2.entry.js.map → p-c4975e66.entry.js.map} +1 -1
  181. package/dist/le-kit/p-cd38c01b.entry.js +2 -0
  182. package/dist/le-kit/{p-33c2168a.entry.js.map → p-cd38c01b.entry.js.map} +1 -1
  183. package/dist/le-kit/{p-68d836a3.entry.js → p-d1eee582.entry.js} +2 -2
  184. package/dist/le-kit/{p-e6b2cf9a.entry.js → p-d449a88b.entry.js} +2 -2
  185. package/dist/le-kit/p-eb710c8e.entry.js +2 -0
  186. package/dist/le-kit/p-eb710c8e.entry.js.map +1 -0
  187. package/dist/le-kit/{p-5d72c894.entry.js → p-f78b1ee6.entry.js} +2 -2
  188. package/dist/le-kit/p-f78b1ee6.entry.js.map +1 -0
  189. package/dist/themes/dark.css +1 -0
  190. package/dist/themes/default.css +1 -0
  191. package/dist/themes/gradient.css +1 -0
  192. package/dist/themes/minimal.css +1 -0
  193. package/dist/themes/warm.css +1 -0
  194. package/dist/types/components/le-side-panel/le-side-panel.d.ts +100 -0
  195. package/dist/types/components/le-side-panel-toggle/le-side-panel-toggle.d.ts +48 -0
  196. package/dist/types/components.d.ts +336 -2
  197. package/package.json +1 -1
  198. package/dist/cjs/index-BPF04Jvb.js.map +0 -1
  199. package/dist/esm/index-C-Chwj1b.js.map +0 -1
  200. package/dist/le-kit/p-05ccab91.entry.js +0 -2
  201. package/dist/le-kit/p-05ccab91.entry.js.map +0 -1
  202. package/dist/le-kit/p-06d2d79c.entry.js +0 -2
  203. package/dist/le-kit/p-33c2168a.entry.js +0 -2
  204. package/dist/le-kit/p-3ceede4e.entry.js +0 -2
  205. package/dist/le-kit/p-4a45ff67.entry.js +0 -2
  206. package/dist/le-kit/p-5d72c894.entry.js.map +0 -1
  207. package/dist/le-kit/p-C-Chwj1b.js.map +0 -1
  208. package/dist/le-kit/p-e1846fc2.entry.js +0 -2
  209. package/dist/le-kit/p-ea71f22c.entry.js.map +0 -1
  210. package/dist/le-kit/p-f8034500.entry.js +0 -2
  211. /package/dist/collection/components/le-box/{le-box.default.css → le-box.css} +0 -0
  212. /package/dist/collection/components/le-card/{le-card.default.css → le-card.css} +0 -0
  213. /package/dist/collection/components/le-text/{le-text.default.css → le-text.css} +0 -0
  214. /package/dist/le-kit/{p-d161946c.entry.js.map → p-33a24394.entry.js.map} +0 -0
  215. /package/dist/le-kit/{p-3d22aeb2.entry.js.map → p-36f126bb.entry.js.map} +0 -0
  216. /package/dist/le-kit/{p-3d873cdb.entry.js.map → p-3f31e31b.entry.js.map} +0 -0
  217. /package/dist/le-kit/{p-2230ecd7.entry.js.map → p-7201ae65.entry.js.map} +0 -0
  218. /package/dist/le-kit/{p-4a45ff67.entry.js.map → p-7a60bfff.entry.js.map} +0 -0
  219. /package/dist/le-kit/{p-923828fe.entry.js.map → p-9863d6fb.entry.js.map} +0 -0
  220. /package/dist/le-kit/{p-be2a7276.entry.js.map → p-bf66757c.entry.js.map} +0 -0
  221. /package/dist/le-kit/{p-68d836a3.entry.js.map → p-d1eee582.entry.js.map} +0 -0
  222. /package/dist/le-kit/{p-e6b2cf9a.entry.js.map → p-d449a88b.entry.js.map} +0 -0
@@ -0,0 +1,660 @@
1
+ import { proxyCustomElement, HTMLElement, createEvent, Build, h, transformTag } from '@stencil/core/internal/client';
2
+ import { d as defineCustomElement$2, a as defineCustomElement$3, b as defineCustomElement$5, c as defineCustomElement$6, e as defineCustomElement$9, f as defineCustomElement$a, g as defineCustomElement$b } from './le-button2.js';
3
+ import { d as defineCustomElement$8 } from './le-icon2.js';
4
+ import { d as defineCustomElement$7 } from './le-popover2.js';
5
+ import { d as defineCustomElement$4 } from './le-side-panel-toggle2.js';
6
+
7
+ const leSidePanelCss = () => `:host{display:block;height:100%;--le-side-panel-width:280px;--le-side-panel-margin:0px;--le-side-panel-backdrop:var(--le-color-backdrop);--le-side-panel-border-radius:var(--le-radius-lg)}.host{position:relative;height:100%;min-height:0}.layout{display:flex;align-items:stretch;min-width:0;height:100%;min-height:0}.layout.start{flex-direction:row}.layout.end{flex-direction:row-reverse}.inlinePanel{flex:0 0 auto;width:var(--le-side-panel-width);min-width:0;height:100%;overflow:hidden;transition:width var(--le-side-panel-transition, var(--le-transition-normal))}.inlinePanel.hidden{width:0}.inlinePanel .panel{transform:translateX(0);opacity:1;transition:transform var(--le-side-panel-transition, var(--le-transition-normal)),
8
+ opacity var(--le-side-panel-transition, var(--le-transition-normal))}.layout.start .inlinePanel.hidden .panel{transform:translateX(-100%);opacity:0;pointer-events:none}.layout.end .inlinePanel.hidden .panel{transform:translateX(100%);opacity:0;pointer-events:none}.content{flex:1 1 auto;min-width:0;height:100%;min-height:0}.panel{position:relative;height:100%;max-height:min(calc(100% - (var(--le-side-panel-margin) * 2)), calc(100vh - (var(--le-side-panel-margin) * 2)));margin:var(--le-side-panel-margin);border-radius:var(--le-side-panel-border-radius);background:var(--le-color-surface, #fff);color:var(--le-color-text, #000);border-right:1px solid var(--le-color-border, rgba(0, 0, 0, 0.12));box-sizing:border-box}.panel.end{border-right:0;border-left:1px solid var(--le-color-border, rgba(0, 0, 0, 0.12))}.panel-scroller{height:100%;overflow:auto}.close{position:absolute;top:4px;right:4px;z-index:1;border:0;border-radius:6px;background:transparent;color:inherit;cursor:pointer}.handle{position:absolute;top:0;bottom:0;width:10px;cursor:col-resize}.handle.start{right:-5px}.handle.end{left:-5px}.overlayRoot{position:absolute;inset:0;background:var(--le-side-panel-backdrop);z-index:var(--le-z-modal-backdrop, 1040);opacity:0;pointer-events:none;transition:opacity var(--le-side-panel-transition, var(--le-transition-normal));height:100%}.overlayRoot.visible{opacity:1;pointer-events:auto}.overlayPanelWrap{position:absolute;top:0;bottom:0;width:min(100%, var(--le-side-panel-width));height:100%;z-index:var(--le-z-modal, 1050);display:flex;align-items:stretch}.overlayPanelWrap.start{left:0;transform:translateX(-100%)}.overlayPanelWrap.end{right:0;transform:translateX(100%)}.overlayPanelWrap.visible.start,.overlayPanelWrap.visible.end{transform:translateX(0)}.overlayPanelWrap{transition:transform var(--le-side-panel-transition, var(--le-transition-normal))}.host[data-resizing='true'] .panel,.host[data-resizing='true'] .overlayPanelWrap,.host[data-resizing='true'] .inlinePanel{transition:none}@media (prefers-reduced-motion: reduce){.overlayPanelWrap,.overlayRoot,.inlinePanel{transition:none}}`;
9
+
10
+ function clamp(value, min, max) {
11
+ return Math.min(max, Math.max(min, value));
12
+ }
13
+ function readCssVariablePixels(varName) {
14
+ if (!Build.isBrowser) {
15
+ return undefined;
16
+ }
17
+ const v = getComputedStyle(document.documentElement).getPropertyValue(varName).trim();
18
+ if (!v) {
19
+ return undefined;
20
+ }
21
+ const parsed = Number.parseFloat(v);
22
+ return Number.isFinite(parsed) ? parsed : undefined;
23
+ }
24
+ function parseCollapseAtPx(value) {
25
+ if (!value) {
26
+ return undefined;
27
+ }
28
+ const trimmed = value.trim();
29
+ if (!trimmed) {
30
+ return undefined;
31
+ }
32
+ if (trimmed.startsWith('--')) {
33
+ const fromVar = readCssVariablePixels(trimmed);
34
+ return fromVar;
35
+ }
36
+ const numeric = Number.parseFloat(trimmed);
37
+ return Number.isFinite(numeric) ? numeric : undefined;
38
+ }
39
+ const LeSidePanel$1 = /*@__PURE__*/ proxyCustomElement(class LeSidePanel extends HTMLElement {
40
+ constructor(registerHost) {
41
+ super();
42
+ if (registerHost !== false) {
43
+ this.__registerHost();
44
+ }
45
+ this.__attachShadow();
46
+ this.leSidePanelOpenChange = createEvent(this, "leSidePanelOpenChange", 7);
47
+ this.leSidePanelCollapsedChange = createEvent(this, "leSidePanelCollapsedChange", 7);
48
+ this.leSidePanelWidthChange = createEvent(this, "leSidePanelWidthChange", 7);
49
+ }
50
+ get el() { return this; }
51
+ /**
52
+ * Optional id used to match toggle requests.
53
+ * If set, the panel only responds to toggle events with the same `panelId`.
54
+ */
55
+ panelId;
56
+ /** Which side the panel is attached to. */
57
+ side = 'start';
58
+ /** Width breakpoint (in px or a CSS var like `--le-breakpoint-md`) below which the panel enters "narrow" mode. */
59
+ collapseAt;
60
+ /** Behavior when in narrow mode. */
61
+ narrowBehavior = 'overlay';
62
+ /**
63
+ * Panel open state for narrow mode.
64
+ * - overlay: controls modal drawer visibility
65
+ * - push: controls whether panel is shown (non-modal)
66
+ */
67
+ open = false;
68
+ /** Panel collapsed state for wide mode (fully hidden). */
69
+ collapsed = false;
70
+ /** Default panel width in pixels. */
71
+ panelWidth = 280;
72
+ /** Minimum allowed width when resizable. */
73
+ minPanelWidth = 220;
74
+ /** Maximum allowed width when resizable. */
75
+ maxPanelWidth = 420;
76
+ /** Allows users to resize the panel by dragging its edge. */
77
+ resizable = false;
78
+ /** When set, panel width + collapsed state are persisted in localStorage. */
79
+ persistKey;
80
+ /** Show a close button inside the panel (primarily used in narrow overlay mode). */
81
+ showCloseButton = true;
82
+ /** When crossing to wide mode, automatically show the panel (collapsed=false). */
83
+ autoShowOnWide = true;
84
+ /** When crossing to narrow mode, automatically hide the panel (open=false). */
85
+ autoHideOnNarrow = true;
86
+ /** Accessible label for the panel navigation region. */
87
+ panelLabel = 'Navigation';
88
+ leSidePanelOpenChange;
89
+ leSidePanelCollapsedChange;
90
+ leSidePanelWidthChange;
91
+ isNarrow = false;
92
+ responsiveReady = false;
93
+ overlayMounted = false;
94
+ overlayVisible = false;
95
+ currentWidthPx = this.panelWidth;
96
+ resizing = false;
97
+ resizeObserver;
98
+ panelEl;
99
+ overlayWrapEl;
100
+ focusedBeforeOpen;
101
+ dragPointerId;
102
+ dragStartX;
103
+ dragStartWidth;
104
+ connectedCallback() {
105
+ this.restorePersistedState();
106
+ this.currentWidthPx = clamp(this.currentWidthPx || this.panelWidth, this.minPanelWidth, this.maxPanelWidth);
107
+ if (Build.isBrowser && 'ResizeObserver' in window) {
108
+ this.resizeObserver = new ResizeObserver(() => {
109
+ this.recomputeNarrow();
110
+ });
111
+ this.resizeObserver.observe(this.el);
112
+ }
113
+ // Ensure we get at least one post-layout measurement.
114
+ if (Build.isBrowser) {
115
+ requestAnimationFrame(() => this.recomputeNarrow());
116
+ }
117
+ }
118
+ componentWillLoad() {
119
+ this.recomputeNarrow();
120
+ }
121
+ disconnectedCallback() {
122
+ this.resizeObserver?.disconnect();
123
+ this.teardownDragListeners();
124
+ }
125
+ isModalOverlayActive() {
126
+ return this.isNarrow && this.narrowBehavior === 'overlay' && this.open;
127
+ }
128
+ syncOverlayToState() {
129
+ const shouldUseOverlay = this.isNarrow && this.narrowBehavior === 'overlay';
130
+ if (!shouldUseOverlay) {
131
+ this.overlayVisible = false;
132
+ this.overlayMounted = false;
133
+ return;
134
+ }
135
+ if (this.open) {
136
+ if (!this.overlayMounted) {
137
+ this.overlayMounted = true;
138
+ this.overlayVisible = false;
139
+ requestAnimationFrame(() => {
140
+ if (this.isNarrow && this.narrowBehavior === 'overlay' && this.open) {
141
+ this.overlayVisible = true;
142
+ this.focusFirstInsidePanel();
143
+ }
144
+ });
145
+ }
146
+ return;
147
+ }
148
+ // Closed: allow unmount to be handled by transition end / fallback timeout.
149
+ this.overlayVisible = false;
150
+ }
151
+ onPanelWidthChanged() {
152
+ if (!Number.isFinite(this.panelWidth)) {
153
+ return;
154
+ }
155
+ if (!this.resizing) {
156
+ this.currentWidthPx = clamp(this.panelWidth, this.minPanelWidth, this.maxPanelWidth);
157
+ this.persistState();
158
+ }
159
+ }
160
+ onCollapsedChanged() {
161
+ this.persistState();
162
+ this.leSidePanelCollapsedChange.emit({ collapsed: this.collapsed, panelId: this.panelId });
163
+ }
164
+ onOpenChanged(newValue) {
165
+ const shouldUseOverlay = this.isNarrow && this.narrowBehavior === 'overlay';
166
+ if (!shouldUseOverlay) {
167
+ this.persistState();
168
+ this.leSidePanelOpenChange.emit({ open: this.open, panelId: this.panelId });
169
+ return;
170
+ }
171
+ if (newValue) {
172
+ this.focusedBeforeOpen = document.activeElement || null;
173
+ this.overlayMounted = true;
174
+ this.overlayVisible = false;
175
+ requestAnimationFrame(() => {
176
+ this.overlayVisible = true;
177
+ this.focusFirstInsidePanel();
178
+ });
179
+ }
180
+ else {
181
+ this.overlayVisible = false;
182
+ this.persistState();
183
+ this.restoreFocusAfterClose();
184
+ // Fallback: if transitionend doesn't fire, ensure overlay unmounts.
185
+ // (e.g. interrupted transitions or unusual browser behavior)
186
+ window.setTimeout(() => {
187
+ const shouldUseOverlay = this.isNarrow && this.narrowBehavior === 'overlay';
188
+ if (shouldUseOverlay && !this.open && !this.overlayVisible) {
189
+ this.overlayMounted = false;
190
+ }
191
+ }, 350);
192
+ }
193
+ this.leSidePanelOpenChange.emit({ open: this.open, panelId: this.panelId });
194
+ }
195
+ onResponsivePropChanged() {
196
+ this.recomputeNarrow();
197
+ }
198
+ onDocumentKeyDown(ev) {
199
+ if (!Build.isBrowser) {
200
+ return;
201
+ }
202
+ if (!this.isModalOverlayActive()) {
203
+ return;
204
+ }
205
+ if (ev.key === 'Escape') {
206
+ ev.preventDefault();
207
+ ev.stopPropagation();
208
+ this.open = false;
209
+ return;
210
+ }
211
+ if (ev.key !== 'Tab') {
212
+ return;
213
+ }
214
+ const panel = this.panelEl;
215
+ if (!panel) {
216
+ return;
217
+ }
218
+ const focusables = this.getFocusableElements(panel);
219
+ if (focusables.length === 0) {
220
+ ev.preventDefault();
221
+ try {
222
+ panel.focus();
223
+ }
224
+ catch {
225
+ // ignore
226
+ }
227
+ return;
228
+ }
229
+ const first = focusables[0];
230
+ const last = focusables[focusables.length - 1];
231
+ const active = document.activeElement;
232
+ if (ev.shiftKey) {
233
+ if (!active || active === first || !panel.contains(active)) {
234
+ ev.preventDefault();
235
+ try {
236
+ last.focus();
237
+ }
238
+ catch {
239
+ // ignore
240
+ }
241
+ }
242
+ }
243
+ else {
244
+ if (active === last) {
245
+ ev.preventDefault();
246
+ try {
247
+ first.focus();
248
+ }
249
+ catch {
250
+ // ignore
251
+ }
252
+ }
253
+ }
254
+ }
255
+ onToggleRequest(ev) {
256
+ const detail = ev.detail;
257
+ if (!detail || !detail.action) {
258
+ return;
259
+ }
260
+ // panelId matching rules:
261
+ // - If this panel has panelId: respond only when detail.panelId matches.
262
+ // - If this panel has no panelId: respond only when detail.panelId is empty.
263
+ const requestedId = detail.panelId || '';
264
+ const myId = this.panelId || '';
265
+ if (myId !== requestedId) {
266
+ return;
267
+ }
268
+ if (this.isNarrow) {
269
+ this.applyActionToOpen(detail.action);
270
+ }
271
+ else {
272
+ this.applyActionToCollapsed(detail.action);
273
+ }
274
+ }
275
+ applyActionToOpen(action) {
276
+ if (action === 'open') {
277
+ this.open = true;
278
+ return;
279
+ }
280
+ if (action === 'close') {
281
+ this.open = false;
282
+ return;
283
+ }
284
+ this.open = !this.open;
285
+ }
286
+ applyActionToCollapsed(action) {
287
+ if (action === 'open') {
288
+ this.collapsed = false;
289
+ return;
290
+ }
291
+ if (action === 'close') {
292
+ this.collapsed = true;
293
+ return;
294
+ }
295
+ this.collapsed = !this.collapsed;
296
+ }
297
+ recomputeNarrow() {
298
+ const collapseAtPx = parseCollapseAtPx(this.collapseAt);
299
+ if (!collapseAtPx) {
300
+ this.isNarrow = false;
301
+ this.responsiveReady = true;
302
+ this.syncOverlayToState();
303
+ return;
304
+ }
305
+ const width = this.el.clientWidth;
306
+ // If we can't measure yet (common on first paint), don't guess a mode.
307
+ // This prevents a brief "wide" flash before ResizeObserver kicks in.
308
+ if (!(width > 0)) {
309
+ this.responsiveReady = false;
310
+ return;
311
+ }
312
+ this.responsiveReady = true;
313
+ const nextIsNarrow = width < collapseAtPx;
314
+ const prevIsNarrow = this.isNarrow;
315
+ this.isNarrow = nextIsNarrow;
316
+ if (prevIsNarrow !== nextIsNarrow) {
317
+ if (nextIsNarrow) {
318
+ if (this.autoHideOnNarrow) {
319
+ this.open = false;
320
+ }
321
+ }
322
+ else {
323
+ // entering wide mode
324
+ this.open = false;
325
+ this.overlayVisible = false;
326
+ this.overlayMounted = false;
327
+ if (this.autoShowOnWide) {
328
+ this.collapsed = false;
329
+ }
330
+ }
331
+ }
332
+ this.syncOverlayToState();
333
+ }
334
+ restorePersistedState() {
335
+ if (!Build.isBrowser || !this.persistKey) {
336
+ return;
337
+ }
338
+ try {
339
+ const raw = window.localStorage.getItem(this.persistKey);
340
+ if (!raw) {
341
+ return;
342
+ }
343
+ const parsed = JSON.parse(raw);
344
+ if (typeof parsed.width === 'number' && Number.isFinite(parsed.width)) {
345
+ this.currentWidthPx = parsed.width;
346
+ }
347
+ if (typeof parsed.collapsed === 'boolean') {
348
+ this.collapsed = parsed.collapsed;
349
+ }
350
+ }
351
+ catch {
352
+ // ignore
353
+ }
354
+ }
355
+ persistState() {
356
+ if (!Build.isBrowser || !this.persistKey) {
357
+ return;
358
+ }
359
+ const payload = {
360
+ width: this.currentWidthPx,
361
+ collapsed: this.collapsed,
362
+ };
363
+ try {
364
+ window.localStorage.setItem(this.persistKey, JSON.stringify(payload));
365
+ }
366
+ catch {
367
+ // ignore
368
+ }
369
+ }
370
+ focusFirstInsidePanel() {
371
+ if (!Build.isBrowser) {
372
+ return;
373
+ }
374
+ const root = this.panelEl;
375
+ if (!root) {
376
+ return;
377
+ }
378
+ const candidates = this.getFocusableElements(root);
379
+ for (const el of candidates) {
380
+ if (el.hasAttribute('disabled')) {
381
+ continue;
382
+ }
383
+ const tabindex = el.getAttribute('tabindex');
384
+ if (tabindex === '-1') {
385
+ continue;
386
+ }
387
+ try {
388
+ el.focus();
389
+ return;
390
+ }
391
+ catch {
392
+ // ignore
393
+ }
394
+ }
395
+ }
396
+ getFocusableElements(root) {
397
+ const selector = 'button,[href],input,select,textarea,[tabindex]:not([tabindex="-1"])';
398
+ const all = Array.from(root.querySelectorAll(selector));
399
+ return all.filter(el => {
400
+ if (el.hasAttribute('disabled')) {
401
+ return false;
402
+ }
403
+ const tabindex = el.getAttribute('tabindex');
404
+ if (tabindex === '-1') {
405
+ return false;
406
+ }
407
+ return true;
408
+ });
409
+ }
410
+ restoreFocusAfterClose() {
411
+ if (!Build.isBrowser) {
412
+ return;
413
+ }
414
+ const prev = this.focusedBeforeOpen;
415
+ this.focusedBeforeOpen = null;
416
+ if (prev && document.contains(prev)) {
417
+ try {
418
+ prev.focus();
419
+ }
420
+ catch {
421
+ // ignore
422
+ }
423
+ }
424
+ }
425
+ onOverlayTransitionEnd = (ev) => {
426
+ if (ev.target !== this.overlayWrapEl) {
427
+ return;
428
+ }
429
+ if (ev.propertyName !== 'transform') {
430
+ return;
431
+ }
432
+ const shouldUseOverlay = this.isNarrow && this.narrowBehavior === 'overlay';
433
+ if (!shouldUseOverlay) {
434
+ return;
435
+ }
436
+ if (!this.open && !this.overlayVisible) {
437
+ this.overlayMounted = false;
438
+ }
439
+ };
440
+ onOverlayPointerDown = (ev) => {
441
+ // Close on any click outside the panel.
442
+ const panel = this.panelEl;
443
+ if (!panel) {
444
+ return;
445
+ }
446
+ const path = ev.composedPath();
447
+ if (!path.includes(panel)) {
448
+ this.open = false;
449
+ }
450
+ };
451
+ startResizeDrag = (ev) => {
452
+ if (!this.resizable) {
453
+ return;
454
+ }
455
+ // No resizing if fully hidden.
456
+ if (!this.isNarrow && this.collapsed) {
457
+ return;
458
+ }
459
+ if (this.isNarrow && this.narrowBehavior === 'overlay' && !this.open) {
460
+ return;
461
+ }
462
+ if (this.isNarrow && this.narrowBehavior === 'push' && !this.open) {
463
+ return;
464
+ }
465
+ this.resizing = true;
466
+ this.dragPointerId = ev.pointerId;
467
+ this.dragStartX = ev.clientX;
468
+ this.dragStartWidth = this.currentWidthPx;
469
+ ev.currentTarget?.setPointerCapture?.(ev.pointerId);
470
+ window.addEventListener('pointermove', this.onResizeDragMove, { passive: false });
471
+ window.addEventListener('pointerup', this.onResizeDragEnd, { passive: true });
472
+ window.addEventListener('pointercancel', this.onResizeDragEnd, { passive: true });
473
+ };
474
+ onResizeDragMove = (ev) => {
475
+ if (!this.resizing || this.dragPointerId !== ev.pointerId) {
476
+ return;
477
+ }
478
+ ev.preventDefault();
479
+ const startX = this.dragStartX ?? ev.clientX;
480
+ const startWidth = this.dragStartWidth ?? this.currentWidthPx;
481
+ const delta = ev.clientX - startX;
482
+ const dir = this.side === 'start' ? 1 : -1;
483
+ const nextWidth = clamp(startWidth + delta * dir, this.minPanelWidth, this.maxPanelWidth);
484
+ this.currentWidthPx = nextWidth;
485
+ this.leSidePanelWidthChange.emit({ width: this.currentWidthPx, panelId: this.panelId });
486
+ };
487
+ onResizeDragEnd = (ev) => {
488
+ if (!this.resizing || this.dragPointerId !== ev.pointerId) {
489
+ return;
490
+ }
491
+ this.resizing = false;
492
+ this.dragPointerId = undefined;
493
+ this.dragStartX = undefined;
494
+ this.dragStartWidth = undefined;
495
+ this.teardownDragListeners();
496
+ this.persistState();
497
+ this.leSidePanelWidthChange.emit({ width: this.currentWidthPx, panelId: this.panelId });
498
+ };
499
+ teardownDragListeners() {
500
+ window.removeEventListener('pointermove', this.onResizeDragMove);
501
+ window.removeEventListener('pointerup', this.onResizeDragEnd);
502
+ window.removeEventListener('pointercancel', this.onResizeDragEnd);
503
+ }
504
+ renderPanelInner(opts) {
505
+ const renderPanelSlot = opts?.renderPanelSlot ?? true;
506
+ const showClose = this.showCloseButton && this.isNarrow && this.narrowBehavior === 'overlay';
507
+ const tabIndex = this.isNarrow && this.narrowBehavior === 'overlay' ? -1 : null;
508
+ return (h("div", { class: {
509
+ panel: true,
510
+ start: this.side === 'start',
511
+ end: this.side === 'end',
512
+ resizing: this.resizing,
513
+ }, part: "panel", ref: el => (this.panelEl = el), role: "navigation", "aria-label": this.panelLabel, tabindex: tabIndex }, showClose ? (h("le-side-panel-toggle", { "panel-id": "demo-side", action: "toggle", shortcut: "Mod+B", variant: "clear", class: "close", part: "close-button", "aria-label": "Close panel", "icon-only": "true", style: {
514
+ '--le-button-icon-only-padding': 'var(--le-space-sm)',
515
+ }, onClick: () => (this.open = false) }, h("slot", { name: "close-icon", slot: "icon-only" }, h("le-icon", { name: "side-panel" })))) : null, h("div", { class: "panel-scroller", part: "panel-scroller" }, renderPanelSlot ? h("slot", { name: "panel" }) : null), this.resizable ? (h("div", { class: {
516
+ handle: true,
517
+ start: this.side === 'start',
518
+ end: this.side === 'end',
519
+ }, part: "resize-handle", role: "separator", "aria-orientation": "vertical", tabindex: -1, onPointerDown: this.startResizeDrag })) : null));
520
+ }
521
+ render() {
522
+ const widthStyle = {
523
+ '--le-side-panel-width': `${this.currentWidthPx}px`,
524
+ };
525
+ const isOverlay = this.isNarrow && this.narrowBehavior === 'overlay';
526
+ const isModalOverlayOpen = isOverlay && this.open;
527
+ const allowPanel = this.responsiveReady;
528
+ const showWidePanel = allowPanel && !this.isNarrow && !this.collapsed;
529
+ const showNarrowPushPanel = allowPanel && this.isNarrow && this.narrowBehavior === 'push' && this.open;
530
+ const layoutHasInlinePanel = showWidePanel || showNarrowPushPanel;
531
+ return (h("div", { key: '5ced2e49e6f13628929c54ec931cd44b28908ffa', class: {
532
+ host: true,
533
+ narrow: this.isNarrow,
534
+ wide: !this.isNarrow,
535
+ overlay: isOverlay,
536
+ push: !isOverlay,
537
+ collapsed: !this.isNarrow && this.collapsed,
538
+ }, style: widthStyle, "data-resizing": this.resizing ? 'true' : null }, h("div", { key: '0fe007d5bfa12f1130f906195a664c8da719ed5e', class: {
539
+ 'layout': true,
540
+ 'has-panel': layoutHasInlinePanel,
541
+ 'start': this.side === 'start',
542
+ 'end': this.side === 'end',
543
+ } }, h("div", { key: 'a44957d185db52f78322216a4b3c8ddff95045d8', class: {
544
+ inlinePanel: true,
545
+ hidden: !layoutHasInlinePanel,
546
+ }, "aria-hidden": !layoutHasInlinePanel ? 'true' : null }, this.renderPanelInner({ renderPanelSlot: !isOverlay })), h("div", { key: 'd1d2f48f442a7394732adff1208636270e4e97e7', class: "content", part: "content", "aria-hidden": isModalOverlayOpen ? 'true' : null }, h("slot", { key: '5cc1bf9fb162cb84cf4a7897da83c3259fb8edba' }))), allowPanel && isOverlay && this.overlayMounted ? (h("div", { class: { overlayRoot: true, visible: this.overlayVisible }, part: "scrim", role: "presentation", onPointerDown: this.onOverlayPointerDown, "aria-hidden": isModalOverlayOpen ? null : 'true' }, h("div", { class: {
547
+ overlayPanelWrap: true,
548
+ visible: this.overlayVisible,
549
+ start: this.side === 'start',
550
+ end: this.side === 'end',
551
+ }, part: "overlay", ref: el => (this.overlayWrapEl = el), onTransitionEnd: this.onOverlayTransitionEnd, role: "dialog", "aria-modal": "true" }, this.renderPanelInner({ renderPanelSlot: true })))) : null));
552
+ }
553
+ static get watchers() { return {
554
+ "panelWidth": ["onPanelWidthChanged"],
555
+ "collapsed": ["onCollapsedChanged"],
556
+ "open": ["onOpenChanged"],
557
+ "collapseAt": ["onResponsivePropChanged"],
558
+ "narrowBehavior": ["onResponsivePropChanged"]
559
+ }; }
560
+ static get style() { return leSidePanelCss(); }
561
+ }, [769, "le-side-panel", {
562
+ "panelId": [1, "panel-id"],
563
+ "side": [1],
564
+ "collapseAt": [1, "collapse-at"],
565
+ "narrowBehavior": [1, "narrow-behavior"],
566
+ "open": [1540],
567
+ "collapsed": [1540],
568
+ "panelWidth": [2, "panel-width"],
569
+ "minPanelWidth": [2, "min-panel-width"],
570
+ "maxPanelWidth": [2, "max-panel-width"],
571
+ "resizable": [4],
572
+ "persistKey": [1, "persist-key"],
573
+ "showCloseButton": [4, "show-close-button"],
574
+ "autoShowOnWide": [4, "auto-show-on-wide"],
575
+ "autoHideOnNarrow": [4, "auto-hide-on-narrow"],
576
+ "panelLabel": [1, "panel-label"],
577
+ "isNarrow": [32],
578
+ "responsiveReady": [32],
579
+ "overlayMounted": [32],
580
+ "overlayVisible": [32],
581
+ "currentWidthPx": [32],
582
+ "resizing": [32]
583
+ }, [[6, "keydown", "onDocumentKeyDown"], [4, "leSidePanelRequestToggle", "onToggleRequest"]], {
584
+ "panelWidth": ["onPanelWidthChanged"],
585
+ "collapsed": ["onCollapsedChanged"],
586
+ "open": ["onOpenChanged"],
587
+ "collapseAt": ["onResponsivePropChanged"],
588
+ "narrowBehavior": ["onResponsivePropChanged"]
589
+ }]);
590
+ function defineCustomElement$1() {
591
+ if (typeof customElements === "undefined") {
592
+ return;
593
+ }
594
+ const components = ["le-side-panel", "le-button", "le-checkbox", "le-component", "le-icon", "le-popover", "le-popup", "le-select", "le-side-panel-toggle", "le-slot", "le-string-input"];
595
+ components.forEach(tagName => { switch (tagName) {
596
+ case "le-side-panel":
597
+ if (!customElements.get(transformTag(tagName))) {
598
+ customElements.define(transformTag(tagName), LeSidePanel$1);
599
+ }
600
+ break;
601
+ case "le-button":
602
+ if (!customElements.get(transformTag(tagName))) {
603
+ defineCustomElement$b();
604
+ }
605
+ break;
606
+ case "le-checkbox":
607
+ if (!customElements.get(transformTag(tagName))) {
608
+ defineCustomElement$a();
609
+ }
610
+ break;
611
+ case "le-component":
612
+ if (!customElements.get(transformTag(tagName))) {
613
+ defineCustomElement$9();
614
+ }
615
+ break;
616
+ case "le-icon":
617
+ if (!customElements.get(transformTag(tagName))) {
618
+ defineCustomElement$8();
619
+ }
620
+ break;
621
+ case "le-popover":
622
+ if (!customElements.get(transformTag(tagName))) {
623
+ defineCustomElement$7();
624
+ }
625
+ break;
626
+ case "le-popup":
627
+ if (!customElements.get(transformTag(tagName))) {
628
+ defineCustomElement$6();
629
+ }
630
+ break;
631
+ case "le-select":
632
+ if (!customElements.get(transformTag(tagName))) {
633
+ defineCustomElement$5();
634
+ }
635
+ break;
636
+ case "le-side-panel-toggle":
637
+ if (!customElements.get(transformTag(tagName))) {
638
+ defineCustomElement$4();
639
+ }
640
+ break;
641
+ case "le-slot":
642
+ if (!customElements.get(transformTag(tagName))) {
643
+ defineCustomElement$3();
644
+ }
645
+ break;
646
+ case "le-string-input":
647
+ if (!customElements.get(transformTag(tagName))) {
648
+ defineCustomElement$2();
649
+ }
650
+ break;
651
+ } });
652
+ }
653
+
654
+ const LeSidePanel = LeSidePanel$1;
655
+ const defineCustomElement = defineCustomElement$1;
656
+
657
+ export { LeSidePanel, defineCustomElement };
658
+ //# sourceMappingURL=le-side-panel.js.map
659
+
660
+ //# sourceMappingURL=le-side-panel.js.map