le-kit 0.5.2 → 0.5.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 (317) hide show
  1. package/LLM_CONTEXT.md +22 -0
  2. package/dist/cjs/le-bar_16.cjs.entry.js +945 -1257
  3. package/dist/cjs/le-box.cjs.entry.js +40 -88
  4. package/dist/cjs/le-breadcrumbs.cjs.entry.js +223 -0
  5. package/dist/cjs/le-card.cjs.entry.js +11 -11
  6. package/dist/cjs/le-code-input.cjs.entry.js +76 -110
  7. package/dist/cjs/le-combobox.cjs.entry.js +126 -153
  8. package/dist/cjs/le-header-placeholder.cjs.entry.js +1 -1
  9. package/dist/cjs/le-kit.cjs.js +1 -1
  10. package/dist/cjs/le-multiselect.cjs.entry.js +149 -171
  11. package/dist/cjs/le-number-input.cjs.entry.js +89 -129
  12. package/dist/cjs/le-round-progress.cjs.entry.js +6 -11
  13. package/dist/cjs/le-segmented-control.cjs.entry.js +77 -87
  14. package/dist/cjs/le-side-panel-toggle.cjs.entry.js +59 -75
  15. package/dist/cjs/le-side-panel.cjs.entry.js +130 -137
  16. package/dist/cjs/le-stack.cjs.entry.js +38 -51
  17. package/dist/cjs/le-tab-bar.cjs.entry.js +80 -89
  18. package/dist/cjs/le-tab-panel.cjs.entry.js +21 -39
  19. package/dist/cjs/le-tab.cjs.entry.js +53 -91
  20. package/dist/cjs/le-tabs.cjs.entry.js +112 -122
  21. package/dist/cjs/le-tag.cjs.entry.js +23 -40
  22. package/dist/cjs/le-text.cjs.entry.js +131 -148
  23. package/dist/cjs/le-turntable.cjs.entry.js +17 -25
  24. package/dist/cjs/loader.cjs.js +1 -1
  25. package/dist/collection/collection-manifest.json +1 -0
  26. package/dist/collection/components/le-bar/le-bar.js +132 -139
  27. package/dist/collection/components/le-bar/le-bar.js.map +1 -1
  28. package/dist/collection/components/le-box/le-box.js +41 -88
  29. package/dist/collection/components/le-box/le-box.js.map +1 -1
  30. package/dist/collection/components/le-breadcrumbs/le-breadcrumbs.css +72 -0
  31. package/dist/collection/components/le-breadcrumbs/le-breadcrumbs.js +372 -0
  32. package/dist/collection/components/le-breadcrumbs/le-breadcrumbs.js.map +1 -0
  33. package/dist/collection/components/le-button/le-button.js +50 -79
  34. package/dist/collection/components/le-button/le-button.js.map +1 -1
  35. package/dist/collection/components/le-card/le-card.js +12 -11
  36. package/dist/collection/components/le-card/le-card.js.map +1 -1
  37. package/dist/collection/components/le-checkbox/le-checkbox.js +27 -42
  38. package/dist/collection/components/le-checkbox/le-checkbox.js.map +1 -1
  39. package/dist/collection/components/le-code-input/le-code-input.js +77 -110
  40. package/dist/collection/components/le-code-input/le-code-input.js.map +1 -1
  41. package/dist/collection/components/le-collapse/le-collapse.js +15 -14
  42. package/dist/collection/components/le-collapse/le-collapse.js.map +1 -1
  43. package/dist/collection/components/le-combobox/le-combobox.js +127 -153
  44. package/dist/collection/components/le-combobox/le-combobox.js.map +1 -1
  45. package/dist/collection/components/le-component/le-component.js +14 -38
  46. package/dist/collection/components/le-component/le-component.js.map +1 -1
  47. package/dist/collection/components/le-current-heading/le-current-heading.js +6 -5
  48. package/dist/collection/components/le-current-heading/le-current-heading.js.map +1 -1
  49. package/dist/collection/components/le-dropdown-base/le-dropdown-base.js +139 -165
  50. package/dist/collection/components/le-dropdown-base/le-dropdown-base.js.map +1 -1
  51. package/dist/collection/components/le-header/le-header.js +22 -45
  52. package/dist/collection/components/le-header/le-header.js.map +1 -1
  53. package/dist/collection/components/le-header-placeholder/le-header-placeholder.js +1 -1
  54. package/dist/collection/components/le-icon/le-icon.js +14 -14
  55. package/dist/collection/components/le-icon/le-icon.js.map +1 -1
  56. package/dist/collection/components/le-multiselect/le-multiselect.js +150 -171
  57. package/dist/collection/components/le-multiselect/le-multiselect.js.map +1 -1
  58. package/dist/collection/components/le-navigation/le-navigation.js +118 -128
  59. package/dist/collection/components/le-navigation/le-navigation.js.map +1 -1
  60. package/dist/collection/components/le-number-input/le-number-input.js +90 -129
  61. package/dist/collection/components/le-number-input/le-number-input.js.map +1 -1
  62. package/dist/collection/components/le-popover/le-popover.css +2 -1
  63. package/dist/collection/components/le-popover/le-popover.js +101 -126
  64. package/dist/collection/components/le-popover/le-popover.js.map +1 -1
  65. package/dist/collection/components/le-popup/le-popup.js +89 -115
  66. package/dist/collection/components/le-popup/le-popup.js.map +1 -1
  67. package/dist/collection/components/le-round-progress/le-round-progress.js +7 -12
  68. package/dist/collection/components/le-round-progress/le-round-progress.js.map +1 -1
  69. package/dist/collection/components/le-scroll-progress/le-scroll-progress.js +6 -7
  70. package/dist/collection/components/le-scroll-progress/le-scroll-progress.js.map +1 -1
  71. package/dist/collection/components/le-segmented-control/le-segmented-control.js +78 -87
  72. package/dist/collection/components/le-segmented-control/le-segmented-control.js.map +1 -1
  73. package/dist/collection/components/le-select/le-select.js +88 -110
  74. package/dist/collection/components/le-select/le-select.js.map +1 -1
  75. package/dist/collection/components/le-side-panel/le-side-panel.css +10 -1
  76. package/dist/collection/components/le-side-panel/le-side-panel.js +131 -136
  77. package/dist/collection/components/le-side-panel/le-side-panel.js.map +1 -1
  78. package/dist/collection/components/le-side-panel-toggle/le-side-panel-toggle.js +60 -75
  79. package/dist/collection/components/le-side-panel-toggle/le-side-panel-toggle.js.map +1 -1
  80. package/dist/collection/components/le-slot/le-slot.js +96 -144
  81. package/dist/collection/components/le-slot/le-slot.js.map +1 -1
  82. package/dist/collection/components/le-stack/le-stack.js +39 -51
  83. package/dist/collection/components/le-stack/le-stack.js.map +1 -1
  84. package/dist/collection/components/le-string-input/le-string-input.js +41 -84
  85. package/dist/collection/components/le-string-input/le-string-input.js.map +1 -1
  86. package/dist/collection/components/le-tab/le-tab.js +54 -91
  87. package/dist/collection/components/le-tab/le-tab.js.map +1 -1
  88. package/dist/collection/components/le-tab-bar/le-tab-bar.js +81 -89
  89. package/dist/collection/components/le-tab-bar/le-tab-bar.js.map +1 -1
  90. package/dist/collection/components/le-tab-panel/le-tab-panel.js +22 -39
  91. package/dist/collection/components/le-tab-panel/le-tab-panel.js.map +1 -1
  92. package/dist/collection/components/le-tabs/le-tabs.js +113 -122
  93. package/dist/collection/components/le-tabs/le-tabs.js.map +1 -1
  94. package/dist/collection/components/le-tag/le-tag.js +25 -40
  95. package/dist/collection/components/le-tag/le-tag.js.map +1 -1
  96. package/dist/collection/components/le-text/le-text.js +132 -148
  97. package/dist/collection/components/le-text/le-text.js.map +1 -1
  98. package/dist/collection/components/le-turntable/le-turntable.js +18 -26
  99. package/dist/collection/components/le-turntable/le-turntable.js.map +1 -1
  100. package/dist/collection/dist/components/assets/custom-elements.json +973 -645
  101. package/dist/collection/dist/components/assets/icons/arrow-left.json +21 -0
  102. package/dist/collection/dist/components/assets/icons/arrow-right.json +21 -0
  103. package/dist/collection/dist/components/assets/icons/check.json +12 -0
  104. package/dist/collection/dist/components/assets/icons/chevron-down.json +1 -2
  105. package/dist/collection/dist/components/assets/icons/chevron-left.json +12 -0
  106. package/dist/collection/dist/components/assets/icons/chevron-right.json +12 -0
  107. package/dist/collection/dist/components/assets/icons/chevron-up.json +12 -0
  108. package/dist/components/assets/custom-elements.json +973 -645
  109. package/dist/components/assets/icons/arrow-left.json +21 -0
  110. package/dist/components/assets/icons/arrow-right.json +21 -0
  111. package/dist/components/assets/icons/check.json +12 -0
  112. package/dist/components/assets/icons/chevron-down.json +1 -2
  113. package/dist/components/assets/icons/chevron-left.json +12 -0
  114. package/dist/components/assets/icons/chevron-right.json +12 -0
  115. package/dist/components/assets/icons/chevron-up.json +12 -0
  116. package/dist/components/le-bar2.js +132 -140
  117. package/dist/components/le-bar2.js.map +1 -1
  118. package/dist/components/le-box.js +41 -89
  119. package/dist/components/le-box.js.map +1 -1
  120. package/dist/components/le-breadcrumbs.d.ts +11 -0
  121. package/dist/components/le-breadcrumbs.js +327 -0
  122. package/dist/components/le-breadcrumbs.js.map +1 -0
  123. package/dist/components/le-button2.js +405 -619
  124. package/dist/components/le-button2.js.map +1 -1
  125. package/dist/components/le-card.js +12 -12
  126. package/dist/components/le-card.js.map +1 -1
  127. package/dist/components/le-code-input.js +77 -111
  128. package/dist/components/le-code-input.js.map +1 -1
  129. package/dist/components/le-collapse2.js +15 -15
  130. package/dist/components/le-collapse2.js.map +1 -1
  131. package/dist/components/le-combobox.js +127 -154
  132. package/dist/components/le-combobox.js.map +1 -1
  133. package/dist/components/le-current-heading.js +6 -6
  134. package/dist/components/le-current-heading.js.map +1 -1
  135. package/dist/components/le-dropdown-base2.js +139 -166
  136. package/dist/components/le-dropdown-base2.js.map +1 -1
  137. package/dist/components/le-header-placeholder.js +1 -1
  138. package/dist/components/le-header.js +22 -46
  139. package/dist/components/le-header.js.map +1 -1
  140. package/dist/components/le-icon2.js +14 -15
  141. package/dist/components/le-icon2.js.map +1 -1
  142. package/dist/components/le-multiselect.js +150 -172
  143. package/dist/components/le-multiselect.js.map +1 -1
  144. package/dist/components/le-navigation.js +1 -494
  145. package/dist/components/le-navigation.js.map +1 -1
  146. package/dist/components/le-navigation2.js +488 -0
  147. package/dist/components/le-navigation2.js.map +1 -0
  148. package/dist/components/le-number-input.js +90 -130
  149. package/dist/components/le-number-input.js.map +1 -1
  150. package/dist/components/le-popover2.js +103 -128
  151. package/dist/components/le-popover2.js.map +1 -1
  152. package/dist/components/le-round-progress.js +7 -12
  153. package/dist/components/le-round-progress.js.map +1 -1
  154. package/dist/components/le-scroll-progress.js +6 -8
  155. package/dist/components/le-scroll-progress.js.map +1 -1
  156. package/dist/components/le-segmented-control.js +78 -88
  157. package/dist/components/le-segmented-control.js.map +1 -1
  158. package/dist/components/le-side-panel-toggle2.js +60 -76
  159. package/dist/components/le-side-panel-toggle2.js.map +1 -1
  160. package/dist/components/le-side-panel.js +133 -139
  161. package/dist/components/le-side-panel.js.map +1 -1
  162. package/dist/components/le-stack.js +39 -52
  163. package/dist/components/le-stack.js.map +1 -1
  164. package/dist/components/le-tab-bar.js +81 -90
  165. package/dist/components/le-tab-bar.js.map +1 -1
  166. package/dist/components/le-tab-panel.js +22 -40
  167. package/dist/components/le-tab-panel.js.map +1 -1
  168. package/dist/components/le-tab2.js +54 -92
  169. package/dist/components/le-tab2.js.map +1 -1
  170. package/dist/components/le-tabs.js +113 -123
  171. package/dist/components/le-tabs.js.map +1 -1
  172. package/dist/components/le-tag2.js +24 -41
  173. package/dist/components/le-tag2.js.map +1 -1
  174. package/dist/components/le-text.js +132 -149
  175. package/dist/components/le-text.js.map +1 -1
  176. package/dist/components/le-turntable.js +18 -26
  177. package/dist/components/le-turntable.js.map +1 -1
  178. package/dist/docs.json +294 -2
  179. package/dist/esm/le-bar_16.entry.js +946 -1258
  180. package/dist/esm/le-box.entry.js +41 -89
  181. package/dist/esm/le-box.entry.js.map +1 -1
  182. package/dist/esm/le-breadcrumbs.entry.js +221 -0
  183. package/dist/esm/le-breadcrumbs.entry.js.map +1 -0
  184. package/dist/esm/le-card.entry.js +12 -12
  185. package/dist/esm/le-card.entry.js.map +1 -1
  186. package/dist/esm/le-code-input.entry.js +77 -111
  187. package/dist/esm/le-code-input.entry.js.map +1 -1
  188. package/dist/esm/le-combobox.entry.js +127 -154
  189. package/dist/esm/le-combobox.entry.js.map +1 -1
  190. package/dist/esm/le-header-placeholder.entry.js +1 -1
  191. package/dist/esm/le-kit.js +1 -1
  192. package/dist/esm/le-multiselect.entry.js +150 -172
  193. package/dist/esm/le-multiselect.entry.js.map +1 -1
  194. package/dist/esm/le-number-input.entry.js +90 -130
  195. package/dist/esm/le-number-input.entry.js.map +1 -1
  196. package/dist/esm/le-round-progress.entry.js +7 -12
  197. package/dist/esm/le-round-progress.entry.js.map +1 -1
  198. package/dist/esm/le-segmented-control.entry.js +78 -88
  199. package/dist/esm/le-segmented-control.entry.js.map +1 -1
  200. package/dist/esm/le-side-panel-toggle.entry.js +60 -76
  201. package/dist/esm/le-side-panel-toggle.entry.js.map +1 -1
  202. package/dist/esm/le-side-panel.entry.js +131 -138
  203. package/dist/esm/le-side-panel.entry.js.map +1 -1
  204. package/dist/esm/le-stack.entry.js +39 -52
  205. package/dist/esm/le-stack.entry.js.map +1 -1
  206. package/dist/esm/le-tab-bar.entry.js +81 -90
  207. package/dist/esm/le-tab-bar.entry.js.map +1 -1
  208. package/dist/esm/le-tab-panel.entry.js +22 -40
  209. package/dist/esm/le-tab-panel.entry.js.map +1 -1
  210. package/dist/esm/le-tab.entry.js +54 -92
  211. package/dist/esm/le-tab.entry.js.map +1 -1
  212. package/dist/esm/le-tabs.entry.js +113 -123
  213. package/dist/esm/le-tabs.entry.js.map +1 -1
  214. package/dist/esm/le-tag.entry.js +23 -40
  215. package/dist/esm/le-tag.entry.js.map +1 -1
  216. package/dist/esm/le-text.entry.js +132 -149
  217. package/dist/esm/le-text.entry.js.map +1 -1
  218. package/dist/esm/le-turntable.entry.js +18 -26
  219. package/dist/esm/le-turntable.entry.js.map +1 -1
  220. package/dist/esm/loader.js +1 -1
  221. package/dist/le-kit/dist/components/assets/custom-elements.json +973 -645
  222. package/dist/le-kit/dist/components/assets/icons/arrow-left.json +21 -0
  223. package/dist/le-kit/dist/components/assets/icons/arrow-right.json +21 -0
  224. package/dist/le-kit/dist/components/assets/icons/check.json +12 -0
  225. package/dist/le-kit/dist/components/assets/icons/chevron-down.json +1 -2
  226. package/dist/le-kit/dist/components/assets/icons/chevron-left.json +12 -0
  227. package/dist/le-kit/dist/components/assets/icons/chevron-right.json +12 -0
  228. package/dist/le-kit/dist/components/assets/icons/chevron-up.json +12 -0
  229. package/dist/le-kit/le-kit.esm.js +1 -1
  230. package/dist/le-kit/p-3067b18f.entry.js +2 -0
  231. package/dist/le-kit/p-3067b18f.entry.js.map +1 -0
  232. package/dist/le-kit/p-34c4d97d.entry.js +2 -0
  233. package/dist/le-kit/p-34c4d97d.entry.js.map +1 -0
  234. package/dist/le-kit/p-45182541.entry.js +2 -0
  235. package/dist/le-kit/p-45182541.entry.js.map +1 -0
  236. package/dist/le-kit/p-52a41c96.entry.js +2 -0
  237. package/dist/le-kit/p-52a41c96.entry.js.map +1 -0
  238. package/dist/le-kit/p-55fb5dd2.entry.js +2 -0
  239. package/dist/le-kit/p-55fb5dd2.entry.js.map +1 -0
  240. package/dist/le-kit/{p-ab6c1def.entry.js → p-649025f4.entry.js} +2 -2
  241. package/dist/le-kit/p-649025f4.entry.js.map +1 -0
  242. package/dist/le-kit/p-67930309.entry.js +2 -0
  243. package/dist/le-kit/p-67930309.entry.js.map +1 -0
  244. package/dist/le-kit/p-6d222705.entry.js +2 -0
  245. package/dist/le-kit/p-6d222705.entry.js.map +1 -0
  246. package/dist/le-kit/p-8049e0c2.entry.js +2 -0
  247. package/dist/le-kit/p-8049e0c2.entry.js.map +1 -0
  248. package/dist/le-kit/p-884f57bd.entry.js +2 -0
  249. package/dist/le-kit/p-88c70f9d.entry.js +2 -0
  250. package/dist/le-kit/p-88c70f9d.entry.js.map +1 -0
  251. package/dist/le-kit/p-96610729.entry.js +2 -0
  252. package/dist/le-kit/p-96610729.entry.js.map +1 -0
  253. package/dist/le-kit/p-a34054e0.entry.js +2 -0
  254. package/dist/le-kit/p-a34054e0.entry.js.map +1 -0
  255. package/dist/le-kit/p-a388e46a.entry.js +2 -0
  256. package/dist/le-kit/p-a388e46a.entry.js.map +1 -0
  257. package/dist/le-kit/p-c0c53650.entry.js +2 -0
  258. package/dist/le-kit/p-c0c53650.entry.js.map +1 -0
  259. package/dist/le-kit/p-cbf17514.entry.js +2 -0
  260. package/dist/le-kit/p-cbf17514.entry.js.map +1 -0
  261. package/dist/le-kit/p-d934de74.entry.js +2 -0
  262. package/dist/le-kit/p-d934de74.entry.js.map +1 -0
  263. package/dist/le-kit/p-de72c8b5.entry.js +2 -0
  264. package/dist/le-kit/p-de72c8b5.entry.js.map +1 -0
  265. package/dist/le-kit/p-e3dd0f2a.entry.js +2 -0
  266. package/dist/le-kit/p-e3dd0f2a.entry.js.map +1 -0
  267. package/dist/le-kit/p-ee170967.entry.js +2 -0
  268. package/dist/le-kit/p-ee170967.entry.js.map +1 -0
  269. package/dist/le-kit/p-eedb2f75.entry.js +2 -0
  270. package/dist/le-kit/p-eedb2f75.entry.js.map +1 -0
  271. package/dist/types/components/le-breadcrumbs/le-breadcrumbs.d.ts +57 -0
  272. package/dist/types/components/le-side-panel/le-side-panel.d.ts +2 -0
  273. package/dist/types/components.d.ts +84 -0
  274. package/package.json +1 -1
  275. package/dist/collection/assets/icons/chevron-down.svg +0 -3
  276. package/dist/collection/dist/components/assets/icons/chevron-down.svg +0 -3
  277. package/dist/components/assets/icons/chevron-down.svg +0 -3
  278. package/dist/le-kit/dist/components/assets/icons/chevron-down.svg +0 -3
  279. package/dist/le-kit/p-221d379a.entry.js +0 -2
  280. package/dist/le-kit/p-221d379a.entry.js.map +0 -1
  281. package/dist/le-kit/p-24112ca3.entry.js +0 -2
  282. package/dist/le-kit/p-24112ca3.entry.js.map +0 -1
  283. package/dist/le-kit/p-2c6d080d.entry.js +0 -2
  284. package/dist/le-kit/p-2c6d080d.entry.js.map +0 -1
  285. package/dist/le-kit/p-46276e77.entry.js +0 -2
  286. package/dist/le-kit/p-46276e77.entry.js.map +0 -1
  287. package/dist/le-kit/p-516c8531.entry.js +0 -2
  288. package/dist/le-kit/p-6ae60ba5.entry.js +0 -2
  289. package/dist/le-kit/p-6ae60ba5.entry.js.map +0 -1
  290. package/dist/le-kit/p-6b69f9a2.entry.js +0 -2
  291. package/dist/le-kit/p-6b69f9a2.entry.js.map +0 -1
  292. package/dist/le-kit/p-6d14306f.entry.js +0 -2
  293. package/dist/le-kit/p-6d14306f.entry.js.map +0 -1
  294. package/dist/le-kit/p-7bcdf2d4.entry.js +0 -2
  295. package/dist/le-kit/p-7bcdf2d4.entry.js.map +0 -1
  296. package/dist/le-kit/p-7cf1e23c.entry.js +0 -2
  297. package/dist/le-kit/p-7cf1e23c.entry.js.map +0 -1
  298. package/dist/le-kit/p-85f2fd4d.entry.js +0 -2
  299. package/dist/le-kit/p-85f2fd4d.entry.js.map +0 -1
  300. package/dist/le-kit/p-98242429.entry.js +0 -2
  301. package/dist/le-kit/p-98242429.entry.js.map +0 -1
  302. package/dist/le-kit/p-ab6c1def.entry.js.map +0 -1
  303. package/dist/le-kit/p-ae4ead64.entry.js +0 -2
  304. package/dist/le-kit/p-ae4ead64.entry.js.map +0 -1
  305. package/dist/le-kit/p-b05d4511.entry.js +0 -2
  306. package/dist/le-kit/p-b05d4511.entry.js.map +0 -1
  307. package/dist/le-kit/p-b6ac02ff.entry.js +0 -2
  308. package/dist/le-kit/p-b6ac02ff.entry.js.map +0 -1
  309. package/dist/le-kit/p-c24769e2.entry.js +0 -2
  310. package/dist/le-kit/p-c24769e2.entry.js.map +0 -1
  311. package/dist/le-kit/p-dc0445ad.entry.js +0 -2
  312. package/dist/le-kit/p-dc0445ad.entry.js.map +0 -1
  313. package/dist/le-kit/p-eb5286f2.entry.js +0 -2
  314. package/dist/le-kit/p-eb5286f2.entry.js.map +0 -1
  315. package/dist/le-kit/p-f78b1ee6.entry.js +0 -2
  316. package/dist/le-kit/p-f78b1ee6.entry.js.map +0 -1
  317. /package/dist/le-kit/{p-516c8531.entry.js.map → p-884f57bd.entry.js.map} +0 -0
@@ -14,52 +14,82 @@ const LeSegmentedControl$1 = /*@__PURE__*/ proxyCustomElement(class LeSegmentedC
14
14
  }
15
15
  this.__attachShadow();
16
16
  this.leChange = createEvent(this, "leChange", 7);
17
+ /**
18
+ * Array of options for the segmented control.
19
+ */
20
+ this.options = [];
21
+ /**
22
+ * Size of the control.
23
+ * @allowedValues small | medium | large
24
+ */
25
+ this.size = 'medium';
26
+ /**
27
+ * Scroll behavior for overflowing tabs.
28
+ * @allowedValues auto | hidden | visible | scroll
29
+ */
30
+ this.overflow = 'auto';
31
+ /**
32
+ * Whether the control should take full width.
33
+ */
34
+ this.fullWidth = false;
35
+ /**
36
+ * Whether the control is disabled.
37
+ */
38
+ this.disabled = false;
39
+ /**
40
+ * Internal tab configurations (built from children or tabs prop)
41
+ */
42
+ this.segmentConfigs = [];
43
+ /**
44
+ * Internal state for focused index (keyboard navigation)
45
+ */
46
+ this.focusedIndex = 0;
47
+ /**
48
+ * Whether we're using declarative mode (le-tab children)
49
+ */
50
+ this.isDeclarativeMode = false;
51
+ this.handleClick = (option) => {
52
+ this.selectOption(option);
53
+ };
54
+ this.handleKeyDown = (event) => {
55
+ const { segmentConfigs } = this;
56
+ let newIndex = this.focusedIndex;
57
+ switch (event.key) {
58
+ case 'ArrowLeft':
59
+ event.preventDefault();
60
+ newIndex = this.findNextEnabled(-1);
61
+ break;
62
+ case 'ArrowRight':
63
+ event.preventDefault();
64
+ newIndex = this.findNextEnabled(1);
65
+ break;
66
+ case 'Home':
67
+ event.preventDefault();
68
+ newIndex = this.findFirstEnabled();
69
+ break;
70
+ case 'End':
71
+ event.preventDefault();
72
+ newIndex = this.findLastEnabled();
73
+ break;
74
+ case 'Enter':
75
+ case ' ':
76
+ event.preventDefault();
77
+ if (segmentConfigs[this.focusedIndex]) {
78
+ this.selectOption(segmentConfigs[this.focusedIndex]);
79
+ }
80
+ return;
81
+ default:
82
+ return;
83
+ }
84
+ if (newIndex !== this.focusedIndex) {
85
+ this.focusedIndex = newIndex;
86
+ this.focusSegment(newIndex);
87
+ if (segmentConfigs[newIndex]) {
88
+ this.selectOption(segmentConfigs[newIndex]);
89
+ }
90
+ }
91
+ };
17
92
  }
18
- get el() { return this; }
19
- containerRef;
20
- /**
21
- * Array of options for the segmented control.
22
- */
23
- options = [];
24
- /**
25
- * The value of the currently selected option.
26
- */
27
- value;
28
- /**
29
- * Size of the control.
30
- * @allowedValues small | medium | large
31
- */
32
- size = 'medium';
33
- /**
34
- * Scroll behavior for overflowing tabs.
35
- * @allowedValues auto | hidden | visible | scroll
36
- */
37
- overflow = 'auto';
38
- /**
39
- * Whether the control should take full width.
40
- */
41
- fullWidth = false;
42
- /**
43
- * Whether the control is disabled.
44
- */
45
- disabled = false;
46
- /**
47
- * Internal tab configurations (built from children or tabs prop)
48
- */
49
- segmentConfigs = [];
50
- /**
51
- * Internal state for focused index (keyboard navigation)
52
- */
53
- focusedIndex = 0;
54
- /**
55
- * Whether we're using declarative mode (le-tab children)
56
- */
57
- isDeclarativeMode = false;
58
- /**
59
- * Emitted when the selection changes.
60
- */
61
- leChange;
62
- mutationObserver;
63
93
  tabsChanged() {
64
94
  if (!this.isDeclarativeMode) {
65
95
  this.buildSegmentsConfigs();
@@ -157,47 +187,6 @@ const LeSegmentedControl$1 = /*@__PURE__*/ proxyCustomElement(class LeSegmentedC
157
187
  }
158
188
  this.leChange.emit({ value, option });
159
189
  }
160
- handleClick = (option) => {
161
- this.selectOption(option);
162
- };
163
- handleKeyDown = (event) => {
164
- const { segmentConfigs } = this;
165
- let newIndex = this.focusedIndex;
166
- switch (event.key) {
167
- case 'ArrowLeft':
168
- event.preventDefault();
169
- newIndex = this.findNextEnabled(-1);
170
- break;
171
- case 'ArrowRight':
172
- event.preventDefault();
173
- newIndex = this.findNextEnabled(1);
174
- break;
175
- case 'Home':
176
- event.preventDefault();
177
- newIndex = this.findFirstEnabled();
178
- break;
179
- case 'End':
180
- event.preventDefault();
181
- newIndex = this.findLastEnabled();
182
- break;
183
- case 'Enter':
184
- case ' ':
185
- event.preventDefault();
186
- if (segmentConfigs[this.focusedIndex]) {
187
- this.selectOption(segmentConfigs[this.focusedIndex]);
188
- }
189
- return;
190
- default:
191
- return;
192
- }
193
- if (newIndex !== this.focusedIndex) {
194
- this.focusedIndex = newIndex;
195
- this.focusSegment(newIndex);
196
- if (segmentConfigs[newIndex]) {
197
- this.selectOption(segmentConfigs[newIndex]);
198
- }
199
- }
200
- };
201
190
  findNextEnabled(direction) {
202
191
  const { segmentConfigs } = this;
203
192
  let index = this.focusedIndex;
@@ -234,18 +223,19 @@ const LeSegmentedControl$1 = /*@__PURE__*/ proxyCustomElement(class LeSegmentedC
234
223
  'full-width': fullWidth,
235
224
  'disabled': disabled,
236
225
  };
237
- return (h(Host, { key: 'dfe7d637e07af470756a57e8878e455c472a2790', class: `overflow-${this.overflow}` }, h("le-component", { key: '5ffa309951b8f509fe0b0db09a9273256ec5a1b5', component: "le-segmented-control" }, h("div", { key: 'a448e9be4011230c689a4bab5963f1588496c1ba', class: classes, ref: el => (this.containerRef = el), role: "radiogroup", part: "container", onKeyDown: this.handleKeyDown, tabIndex: 0 }, segmentConfigs.map(option => {
226
+ return (h(Host, { key: 'dd580b3e3f6ca9fc5d8316978f0fcd77832d562f', class: `overflow-${this.overflow}` }, h("le-component", { key: 'baf3bf0005cdb4678eac78b73f3c7140ba631159', component: "le-segmented-control" }, h("div", { key: 'bc78e64043731781fddb107321c22187314f20c0', class: classes, ref: el => (this.containerRef = el), role: "radiogroup", part: "container", onKeyDown: this.handleKeyDown, tabIndex: 0 }, segmentConfigs.map(option => {
238
227
  const optValue = this.getOptionValue(option);
239
228
  const isSelected = optValue === value;
240
229
  const isDisabled = option.disabled || disabled;
241
230
  return (h("le-tab", { key: optValue, class: "segment", role: "radio", variant: "enclosed", selected: isSelected, disabled: isDisabled, focusable: false, size: size, part: isSelected ? 'segment segment-active' : 'segment', "aria-checked": isSelected ? 'true' : 'false', "aria-disabled": isDisabled ? 'true' : undefined, onClick: () => this.handleClick(option), iconStart: option.iconStart, iconEnd: option.iconEnd }, h("span", { class: "segment-label" }, option.label)));
242
231
  })))));
243
232
  }
233
+ get el() { return this; }
244
234
  static get watchers() { return {
245
235
  "options": ["tabsChanged"]
246
236
  }; }
247
237
  static get style() { return leSegmentedControlCss(); }
248
- }, [769, "le-segmented-control", {
238
+ }, [257, "le-segmented-control", {
249
239
  "options": [16],
250
240
  "value": [1032],
251
241
  "size": [1],
@@ -1 +1 @@
1
- {"file":"le-segmented-control.js","mappings":"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","names":["LeSegmentedControl","__stencil_proxyCustomElement"],"sources":["src/components/le-segmented-control/le-segmented-control.css?tag=le-segmented-control&encapsulation=shadow","src/components/le-segmented-control/le-segmented-control.tsx"],"sourcesContent":["/**\n * le-segmented-control - Default mode styles\n */\n\n:host {\n display: inline-block;\n max-width: 100%;\n --le-segmented-control-bg: var(--le-color-background-secondary);\n --le-segmented-control-padding: var(--le-spacing-1);\n}\n:host([full-width]) {\n width: 100%;\n}\n:host(.overflow-visible) {\n max-width: none;\n}\n\n.le-segmented-control {\n flex-direction: row;\n white-space: nowrap;\n border: none;\n gap: 0;\n background-color: var(--le-segmented-control-bg);\n border-radius: calc(var(--le-radius-md) + var(--le-segmented-control-padding));\n padding: var(--le-segmented-control-padding);\n}\n\n.le-segmented-control.overflow-auto {\n overflow: auto;\n}\n.le-segmented-control.overflow-hidden {\n overflow: hidden;\n}\n.le-segmented-control.overflow-visible {\n overflow: visible;\n}\n.le-segmented-control.overflow-scroll {\n overflow: scroll;\n}\n\n.le-segmented-control.full-width {\n display: flex;\n width: 100%;\n width: calc(100% - var(--le-segmented-control-padding) * 2);\n}\n\n.le-segmented-control.disabled {\n opacity: 0.5;\n pointer-events: none;\n}\n\n.le-segmented-control:focus {\n outline: 2px solid var(--le-color-focus);\n outline-offset: 2px;\n}\n\n\n/* ============================================\n * SEGMENT BUTTON\n * ============================================ */\n\n.full-width .segment {\n flex: 1;\n}\n\n.segment:focus-visible {\n outline: 2px solid var(--le-focus-ring-color, var(--le-color-primary));\n outline-offset: 2px;\n}\n\n.segment-active {\n color: var(--le-segmented-text-color-active, var(--le-text-primary));\n}\n\n.segment-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n","import {\n Component,\n Prop,\n State,\n Event,\n EventEmitter,\n h,\n Element,\n Watch,\n Listen,\n Host,\n} from '@stencil/core';\nimport { LeOption, LeOptionValue, LeOptionSelectDetail } from '../../types/options';\n\ninterface SegmentConfig {\n label: string;\n value: string;\n iconStart?: string;\n iconEnd?: string;\n disabled: boolean;\n}\n\ninterface TabConfig {\n label: string;\n value: string;\n iconStart?: string;\n iconEnd?: string;\n disabled: boolean;\n panel?: HTMLElement & { setActive: (active: boolean) => Promise<void> };\n}\n\n/**\n * A segmented control component (iOS-style toggle buttons).\n *\n * Perfect for toggling between a small set of related options.\n *\n * @cssprop --le-segmented-bg - Background color of the control\n * @cssprop --le-segmented-padding - Padding around segments\n * @cssprop --le-segmented-gap - Gap between segments\n * @cssprop --le-segmented-radius - Border radius of the control\n *\n * @csspart container - The main container\n * @csspart segment - Individual segment buttons\n * @csspart segment-active - The currently active segment\n *\n * @cmsEditable true\n * @cmsCategory Form\n */\n@Component({\n tag: 'le-segmented-control',\n styleUrl: 'le-segmented-control.css',\n shadow: true,\n})\nexport class LeSegmentedControl {\n @Element() el: HTMLElement;\n\n private containerRef?: HTMLElement;\n\n /**\n * Array of options for the segmented control.\n */\n @Prop() options: LeOption[] = [];\n\n /**\n * The value of the currently selected option.\n */\n @Prop({ mutable: true }) value?: LeOptionValue;\n\n /**\n * Size of the control.\n * @allowedValues small | medium | large\n */\n @Prop() size: 'small' | 'medium' | 'large' = 'medium';\n\n /**\n * Scroll behavior for overflowing tabs.\n * @allowedValues auto | hidden | visible | scroll\n */\n @Prop() overflow: 'auto' | 'hidden' | 'visible' | 'scroll' = 'auto';\n\n /**\n * Whether the control should take full width.\n */\n @Prop() fullWidth: boolean = false;\n\n /**\n * Whether the control is disabled.\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Internal tab configurations (built from children or tabs prop)\n */\n @State() private segmentConfigs: SegmentConfig[] = [];\n\n /**\n * Internal state for focused index (keyboard navigation)\n */\n @State() private focusedIndex: number = 0;\n\n /**\n * Whether we're using declarative mode (le-tab children)\n */\n @State() private isDeclarativeMode: boolean = false;\n\n /**\n * Emitted when the selection changes.\n */\n @Event() leChange: EventEmitter<LeOptionSelectDetail>;\n\n private mutationObserver?: MutationObserver;\n\n @Watch('options')\n tabsChanged() {\n if (!this.isDeclarativeMode) {\n this.buildSegmentsConfigs();\n }\n }\n\n @Listen('slotchange')\n handleSlotChange() {\n this.buildSegmentsConfigs();\n }\n\n componentWillLoad() {\n this.buildSegmentsConfigs();\n if (this.value === undefined && this.options.length > 0) {\n const firstEnabled = this.options.find(opt => !opt.disabled);\n if (firstEnabled) {\n this.value = this.getOptionValue(firstEnabled);\n }\n }\n if (this.value !== undefined) {\n const index = this.getOptionIndex(this.value);\n if (index >= 0) {\n this.focusedIndex = index;\n }\n }\n }\n\n connectedCallback() {\n // Watch for dynamic changes to children\n this.mutationObserver = new MutationObserver(() => {\n this.buildSegmentsConfigs();\n });\n this.mutationObserver.observe(this.el, {\n attributes: true,\n childList: true,\n subtree: true,\n });\n }\n\n disconnectedCallback() {\n this.mutationObserver?.disconnect();\n }\n\n private async buildSegmentsConfigs() {\n // Check for le-tab children\n const segments = Array.from(this.el.querySelectorAll(':scope > le-tab')) as Array<\n HTMLElement & {\n getTabConfig: () => Promise<TabConfig>;\n setActive: (active: boolean) => Promise<void>;\n }\n >;\n\n if (segments.length > 0) {\n // Declarative mode - build from children\n this.isDeclarativeMode = true;\n const configs: TabConfig[] = [];\n\n for (const segment of segments) {\n const config = await segment.getTabConfig();\n configs.push({ ...config });\n }\n\n this.segmentConfigs = configs;\n } else if (this.options.length > 0) {\n // Programmatic mode - use options prop\n this.isDeclarativeMode = false;\n this.segmentConfigs = this.options.map(option => ({\n label: option.label,\n value: (option.value !== undefined ? option.value : option.label) as string,\n iconStart: option.iconStart,\n iconEnd: option.iconEnd,\n disabled: option.disabled ?? false,\n }));\n } else {\n this.segmentConfigs = [];\n }\n\n // Set default selected\n if (this.value === undefined && this.segmentConfigs.length > 0) {\n const firstEnabled = this.segmentConfigs.find(t => !t.disabled);\n if (firstEnabled) {\n this.value = firstEnabled.value;\n }\n }\n\n // Initialize focused index\n if (this.value !== undefined) {\n const index = this.segmentConfigs.findIndex(t => t.value === this.value);\n if (index >= 0) {\n this.focusedIndex = index;\n }\n }\n }\n\n private getOptionValue(option: LeOption): LeOptionValue {\n return option.value !== undefined ? option.value : option.label;\n }\n\n private getOptionIndex(value: LeOptionValue): number {\n return this.options.findIndex(opt => this.getOptionValue(opt) === value);\n }\n\n private selectOption(option: LeOption) {\n if (option.disabled || this.disabled) return;\n\n const value = this.getOptionValue(option);\n this.value = value;\n\n // update focused index\n const index = this.segmentConfigs.findIndex(seg => seg.value === value);\n if (index >= 0) {\n this.focusedIndex = index;\n }\n\n this.leChange.emit({ value, option });\n }\n\n private handleClick = (option: LeOption) => {\n this.selectOption(option);\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n const { segmentConfigs } = this;\n let newIndex = this.focusedIndex;\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n newIndex = this.findNextEnabled(-1);\n break;\n case 'ArrowRight':\n event.preventDefault();\n newIndex = this.findNextEnabled(1);\n break;\n case 'Home':\n event.preventDefault();\n newIndex = this.findFirstEnabled();\n break;\n case 'End':\n event.preventDefault();\n newIndex = this.findLastEnabled();\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (segmentConfigs[this.focusedIndex]) {\n this.selectOption(segmentConfigs[this.focusedIndex]);\n }\n return;\n default:\n return;\n }\n\n if (newIndex !== this.focusedIndex) {\n this.focusedIndex = newIndex;\n this.focusSegment(newIndex);\n if (segmentConfigs[newIndex]) {\n this.selectOption(segmentConfigs[newIndex]);\n }\n }\n };\n\n private findNextEnabled(direction: 1 | -1): number {\n const { segmentConfigs } = this;\n let index = this.focusedIndex;\n const length = segmentConfigs.length;\n\n for (let i = 0; i < length; i++) {\n index = (index + direction + length) % length;\n if (!segmentConfigs[index].disabled) {\n return index;\n }\n }\n return this.focusedIndex;\n }\n\n private findFirstEnabled(): number {\n return this.segmentConfigs.findIndex(opt => !opt.disabled);\n }\n\n private findLastEnabled(): number {\n for (let i = this.segmentConfigs.length - 1; i >= 0; i--) {\n if (!this.segmentConfigs[i].disabled) return i;\n }\n return 0;\n }\n\n private focusSegment(index: number) {\n const container = this.containerRef;\n const segment = container?.querySelectorAll('.segment')[index] as HTMLElement;\n segment?.focus();\n }\n\n render() {\n const { segmentConfigs, value, size, fullWidth, disabled } = this;\n\n const classes = {\n 'le-segmented-control': true,\n [`size-${size}`]: true,\n [`overflow-${this.overflow}`]: true,\n 'full-width': fullWidth,\n 'disabled': disabled,\n };\n\n return (\n <Host class={`overflow-${this.overflow}`}>\n <le-component component=\"le-segmented-control\">\n <div\n class={classes}\n ref={el => (this.containerRef = el)}\n role=\"radiogroup\"\n part=\"container\"\n onKeyDown={this.handleKeyDown}\n tabIndex={0}\n >\n {segmentConfigs.map(option => {\n const optValue = this.getOptionValue(option);\n const isSelected = optValue === value;\n const isDisabled = option.disabled || disabled;\n\n return (\n <le-tab\n key={optValue}\n class=\"segment\"\n role=\"radio\"\n variant=\"enclosed\"\n selected={isSelected}\n disabled={isDisabled}\n focusable={false}\n size={size}\n part={isSelected ? 'segment segment-active' : 'segment'}\n aria-checked={isSelected ? 'true' : 'false'}\n aria-disabled={isDisabled ? 'true' : undefined}\n onClick={() => this.handleClick(option)}\n iconStart={option.iconStart}\n iconEnd={option.iconEnd}\n >\n <span class=\"segment-label\">{option.label}</span>\n </le-tab>\n );\n })}\n </div>\n </le-component>\n </Host>\n );\n }\n}\n"],"version":3}
1
+ {"file":"le-segmented-control.js","mappings":"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","names":["LeSegmentedControl","__stencil_proxyCustomElement"],"sources":["src/components/le-segmented-control/le-segmented-control.css?tag=le-segmented-control&encapsulation=shadow","src/components/le-segmented-control/le-segmented-control.tsx"],"sourcesContent":["/**\n * le-segmented-control - Default mode styles\n */\n\n:host {\n display: inline-block;\n max-width: 100%;\n --le-segmented-control-bg: var(--le-color-background-secondary);\n --le-segmented-control-padding: var(--le-spacing-1);\n}\n:host([full-width]) {\n width: 100%;\n}\n:host(.overflow-visible) {\n max-width: none;\n}\n\n.le-segmented-control {\n flex-direction: row;\n white-space: nowrap;\n border: none;\n gap: 0;\n background-color: var(--le-segmented-control-bg);\n border-radius: calc(var(--le-radius-md) + var(--le-segmented-control-padding));\n padding: var(--le-segmented-control-padding);\n}\n\n.le-segmented-control.overflow-auto {\n overflow: auto;\n}\n.le-segmented-control.overflow-hidden {\n overflow: hidden;\n}\n.le-segmented-control.overflow-visible {\n overflow: visible;\n}\n.le-segmented-control.overflow-scroll {\n overflow: scroll;\n}\n\n.le-segmented-control.full-width {\n display: flex;\n width: 100%;\n width: calc(100% - var(--le-segmented-control-padding) * 2);\n}\n\n.le-segmented-control.disabled {\n opacity: 0.5;\n pointer-events: none;\n}\n\n.le-segmented-control:focus {\n outline: 2px solid var(--le-color-focus);\n outline-offset: 2px;\n}\n\n\n/* ============================================\n * SEGMENT BUTTON\n * ============================================ */\n\n.full-width .segment {\n flex: 1;\n}\n\n.segment:focus-visible {\n outline: 2px solid var(--le-focus-ring-color, var(--le-color-primary));\n outline-offset: 2px;\n}\n\n.segment-active {\n color: var(--le-segmented-text-color-active, var(--le-text-primary));\n}\n\n.segment-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n","import {\n Component,\n Prop,\n State,\n Event,\n EventEmitter,\n h,\n Element,\n Watch,\n Listen,\n Host,\n} from '@stencil/core';\nimport { LeOption, LeOptionValue, LeOptionSelectDetail } from '../../types/options';\n\ninterface SegmentConfig {\n label: string;\n value: string;\n iconStart?: string;\n iconEnd?: string;\n disabled: boolean;\n}\n\ninterface TabConfig {\n label: string;\n value: string;\n iconStart?: string;\n iconEnd?: string;\n disabled: boolean;\n panel?: HTMLElement & { setActive: (active: boolean) => Promise<void> };\n}\n\n/**\n * A segmented control component (iOS-style toggle buttons).\n *\n * Perfect for toggling between a small set of related options.\n *\n * @cssprop --le-segmented-bg - Background color of the control\n * @cssprop --le-segmented-padding - Padding around segments\n * @cssprop --le-segmented-gap - Gap between segments\n * @cssprop --le-segmented-radius - Border radius of the control\n *\n * @csspart container - The main container\n * @csspart segment - Individual segment buttons\n * @csspart segment-active - The currently active segment\n *\n * @cmsEditable true\n * @cmsCategory Form\n */\n@Component({\n tag: 'le-segmented-control',\n styleUrl: 'le-segmented-control.css',\n shadow: true,\n})\nexport class LeSegmentedControl {\n @Element() el: HTMLElement;\n\n private containerRef?: HTMLElement;\n\n /**\n * Array of options for the segmented control.\n */\n @Prop() options: LeOption[] = [];\n\n /**\n * The value of the currently selected option.\n */\n @Prop({ mutable: true }) value?: LeOptionValue;\n\n /**\n * Size of the control.\n * @allowedValues small | medium | large\n */\n @Prop() size: 'small' | 'medium' | 'large' = 'medium';\n\n /**\n * Scroll behavior for overflowing tabs.\n * @allowedValues auto | hidden | visible | scroll\n */\n @Prop() overflow: 'auto' | 'hidden' | 'visible' | 'scroll' = 'auto';\n\n /**\n * Whether the control should take full width.\n */\n @Prop() fullWidth: boolean = false;\n\n /**\n * Whether the control is disabled.\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Internal tab configurations (built from children or tabs prop)\n */\n @State() private segmentConfigs: SegmentConfig[] = [];\n\n /**\n * Internal state for focused index (keyboard navigation)\n */\n @State() private focusedIndex: number = 0;\n\n /**\n * Whether we're using declarative mode (le-tab children)\n */\n @State() private isDeclarativeMode: boolean = false;\n\n /**\n * Emitted when the selection changes.\n */\n @Event() leChange: EventEmitter<LeOptionSelectDetail>;\n\n private mutationObserver?: MutationObserver;\n\n @Watch('options')\n tabsChanged() {\n if (!this.isDeclarativeMode) {\n this.buildSegmentsConfigs();\n }\n }\n\n @Listen('slotchange')\n handleSlotChange() {\n this.buildSegmentsConfigs();\n }\n\n componentWillLoad() {\n this.buildSegmentsConfigs();\n if (this.value === undefined && this.options.length > 0) {\n const firstEnabled = this.options.find(opt => !opt.disabled);\n if (firstEnabled) {\n this.value = this.getOptionValue(firstEnabled);\n }\n }\n if (this.value !== undefined) {\n const index = this.getOptionIndex(this.value);\n if (index >= 0) {\n this.focusedIndex = index;\n }\n }\n }\n\n connectedCallback() {\n // Watch for dynamic changes to children\n this.mutationObserver = new MutationObserver(() => {\n this.buildSegmentsConfigs();\n });\n this.mutationObserver.observe(this.el, {\n attributes: true,\n childList: true,\n subtree: true,\n });\n }\n\n disconnectedCallback() {\n this.mutationObserver?.disconnect();\n }\n\n private async buildSegmentsConfigs() {\n // Check for le-tab children\n const segments = Array.from(this.el.querySelectorAll(':scope > le-tab')) as Array<\n HTMLElement & {\n getTabConfig: () => Promise<TabConfig>;\n setActive: (active: boolean) => Promise<void>;\n }\n >;\n\n if (segments.length > 0) {\n // Declarative mode - build from children\n this.isDeclarativeMode = true;\n const configs: TabConfig[] = [];\n\n for (const segment of segments) {\n const config = await segment.getTabConfig();\n configs.push({ ...config });\n }\n\n this.segmentConfigs = configs;\n } else if (this.options.length > 0) {\n // Programmatic mode - use options prop\n this.isDeclarativeMode = false;\n this.segmentConfigs = this.options.map(option => ({\n label: option.label,\n value: (option.value !== undefined ? option.value : option.label) as string,\n iconStart: option.iconStart,\n iconEnd: option.iconEnd,\n disabled: option.disabled ?? false,\n }));\n } else {\n this.segmentConfigs = [];\n }\n\n // Set default selected\n if (this.value === undefined && this.segmentConfigs.length > 0) {\n const firstEnabled = this.segmentConfigs.find(t => !t.disabled);\n if (firstEnabled) {\n this.value = firstEnabled.value;\n }\n }\n\n // Initialize focused index\n if (this.value !== undefined) {\n const index = this.segmentConfigs.findIndex(t => t.value === this.value);\n if (index >= 0) {\n this.focusedIndex = index;\n }\n }\n }\n\n private getOptionValue(option: LeOption): LeOptionValue {\n return option.value !== undefined ? option.value : option.label;\n }\n\n private getOptionIndex(value: LeOptionValue): number {\n return this.options.findIndex(opt => this.getOptionValue(opt) === value);\n }\n\n private selectOption(option: LeOption) {\n if (option.disabled || this.disabled) return;\n\n const value = this.getOptionValue(option);\n this.value = value;\n\n // update focused index\n const index = this.segmentConfigs.findIndex(seg => seg.value === value);\n if (index >= 0) {\n this.focusedIndex = index;\n }\n\n this.leChange.emit({ value, option });\n }\n\n private handleClick = (option: LeOption) => {\n this.selectOption(option);\n };\n\n private handleKeyDown = (event: KeyboardEvent) => {\n const { segmentConfigs } = this;\n let newIndex = this.focusedIndex;\n\n switch (event.key) {\n case 'ArrowLeft':\n event.preventDefault();\n newIndex = this.findNextEnabled(-1);\n break;\n case 'ArrowRight':\n event.preventDefault();\n newIndex = this.findNextEnabled(1);\n break;\n case 'Home':\n event.preventDefault();\n newIndex = this.findFirstEnabled();\n break;\n case 'End':\n event.preventDefault();\n newIndex = this.findLastEnabled();\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (segmentConfigs[this.focusedIndex]) {\n this.selectOption(segmentConfigs[this.focusedIndex]);\n }\n return;\n default:\n return;\n }\n\n if (newIndex !== this.focusedIndex) {\n this.focusedIndex = newIndex;\n this.focusSegment(newIndex);\n if (segmentConfigs[newIndex]) {\n this.selectOption(segmentConfigs[newIndex]);\n }\n }\n };\n\n private findNextEnabled(direction: 1 | -1): number {\n const { segmentConfigs } = this;\n let index = this.focusedIndex;\n const length = segmentConfigs.length;\n\n for (let i = 0; i < length; i++) {\n index = (index + direction + length) % length;\n if (!segmentConfigs[index].disabled) {\n return index;\n }\n }\n return this.focusedIndex;\n }\n\n private findFirstEnabled(): number {\n return this.segmentConfigs.findIndex(opt => !opt.disabled);\n }\n\n private findLastEnabled(): number {\n for (let i = this.segmentConfigs.length - 1; i >= 0; i--) {\n if (!this.segmentConfigs[i].disabled) return i;\n }\n return 0;\n }\n\n private focusSegment(index: number) {\n const container = this.containerRef;\n const segment = container?.querySelectorAll('.segment')[index] as HTMLElement;\n segment?.focus();\n }\n\n render() {\n const { segmentConfigs, value, size, fullWidth, disabled } = this;\n\n const classes = {\n 'le-segmented-control': true,\n [`size-${size}`]: true,\n [`overflow-${this.overflow}`]: true,\n 'full-width': fullWidth,\n 'disabled': disabled,\n };\n\n return (\n <Host class={`overflow-${this.overflow}`}>\n <le-component component=\"le-segmented-control\">\n <div\n class={classes}\n ref={el => (this.containerRef = el)}\n role=\"radiogroup\"\n part=\"container\"\n onKeyDown={this.handleKeyDown}\n tabIndex={0}\n >\n {segmentConfigs.map(option => {\n const optValue = this.getOptionValue(option);\n const isSelected = optValue === value;\n const isDisabled = option.disabled || disabled;\n\n return (\n <le-tab\n key={optValue}\n class=\"segment\"\n role=\"radio\"\n variant=\"enclosed\"\n selected={isSelected}\n disabled={isDisabled}\n focusable={false}\n size={size}\n part={isSelected ? 'segment segment-active' : 'segment'}\n aria-checked={isSelected ? 'true' : 'false'}\n aria-disabled={isDisabled ? 'true' : undefined}\n onClick={() => this.handleClick(option)}\n iconStart={option.iconStart}\n iconEnd={option.iconEnd}\n >\n <span class=\"segment-label\">{option.label}</span>\n </le-tab>\n );\n })}\n </div>\n </le-component>\n </Host>\n );\n }\n}\n"],"version":3}
@@ -56,35 +56,64 @@ const LeSidePanelToggle = /*@__PURE__*/ proxyCustomElement(class LeSidePanelTogg
56
56
  }
57
57
  this.__attachShadow();
58
58
  this.leSidePanelRequestToggle = createEvent(this, "leSidePanelRequestToggle", 7);
59
+ /** Action to emit. Default toggles the panel. */
60
+ this.action = 'toggle';
61
+ /** Disables the toggle. */
62
+ this.disabled = false;
63
+ this.variant = 'solid';
64
+ this.color = 'primary';
65
+ this.size = 'medium';
66
+ this.selected = false;
67
+ this.fullWidth = false;
68
+ this.type = 'button';
69
+ this.align = 'center';
70
+ this.onDocumentKeyDown = (ev) => {
71
+ if (this.disabled) {
72
+ return;
73
+ }
74
+ const spec = this.shortcutSpec;
75
+ if (!spec) {
76
+ return;
77
+ }
78
+ if (isEditableTarget(ev.target)) {
79
+ return;
80
+ }
81
+ const key = (ev.key || '').toLowerCase();
82
+ if (key !== spec.key) {
83
+ return;
84
+ }
85
+ if (!!ev.altKey !== spec.alt) {
86
+ return;
87
+ }
88
+ if (!!ev.ctrlKey !== spec.ctrl) {
89
+ return;
90
+ }
91
+ if (!!ev.metaKey !== spec.meta) {
92
+ return;
93
+ }
94
+ if (!!ev.shiftKey !== spec.shift) {
95
+ return;
96
+ }
97
+ ev.preventDefault();
98
+ this.emitRequest();
99
+ };
100
+ this.onPanelStateChange = (ev) => {
101
+ const detail = ev.detail || {};
102
+ const requestedId = this.getResolvedPanelId() || '';
103
+ const eventId = detail.panelId || '';
104
+ if (requestedId !== eventId) {
105
+ return;
106
+ }
107
+ if (typeof detail.open === 'boolean') {
108
+ this.expanded = detail.open;
109
+ this.syncAriaExpanded();
110
+ }
111
+ if (typeof detail.collapsed === 'boolean') {
112
+ this.expanded = !detail.collapsed;
113
+ this.syncAriaExpanded();
114
+ }
115
+ };
59
116
  }
60
- get el() { return this; }
61
- /** Optional id used to target a specific panel. */
62
- panelId;
63
- /** Action to emit. Default toggles the panel. */
64
- action = 'toggle';
65
- /** Optional keyboard shortcut like `Mod+B` or `Alt+N`. */
66
- shortcut;
67
- /** Disables the toggle. */
68
- disabled = false;
69
- // Pass-through props for le-button
70
- mode;
71
- variant = 'solid';
72
- color = 'primary';
73
- size = 'medium';
74
- selected = false;
75
- fullWidth = false;
76
- iconOnly;
77
- iconStart;
78
- iconEnd;
79
- type = 'button';
80
- href;
81
- target;
82
- align = 'center';
83
- leSidePanelRequestToggle;
84
- shortcutSpec;
85
- expanded;
86
- buttonEl;
87
- forwardedNodes;
88
117
  onShortcutChanged() {
89
118
  this.shortcutSpec = parseShortcut(this.shortcut);
90
119
  this.syncShortcutListener();
@@ -143,52 +172,6 @@ const LeSidePanelToggle = /*@__PURE__*/ proxyCustomElement(class LeSidePanelTogg
143
172
  action: this.action,
144
173
  });
145
174
  }
146
- onDocumentKeyDown = (ev) => {
147
- if (this.disabled) {
148
- return;
149
- }
150
- const spec = this.shortcutSpec;
151
- if (!spec) {
152
- return;
153
- }
154
- if (isEditableTarget(ev.target)) {
155
- return;
156
- }
157
- const key = (ev.key || '').toLowerCase();
158
- if (key !== spec.key) {
159
- return;
160
- }
161
- if (!!ev.altKey !== spec.alt) {
162
- return;
163
- }
164
- if (!!ev.ctrlKey !== spec.ctrl) {
165
- return;
166
- }
167
- if (!!ev.metaKey !== spec.meta) {
168
- return;
169
- }
170
- if (!!ev.shiftKey !== spec.shift) {
171
- return;
172
- }
173
- ev.preventDefault();
174
- this.emitRequest();
175
- };
176
- onPanelStateChange = (ev) => {
177
- const detail = ev.detail || {};
178
- const requestedId = this.getResolvedPanelId() || '';
179
- const eventId = detail.panelId || '';
180
- if (requestedId !== eventId) {
181
- return;
182
- }
183
- if (typeof detail.open === 'boolean') {
184
- this.expanded = detail.open;
185
- this.syncAriaExpanded();
186
- }
187
- if (typeof detail.collapsed === 'boolean') {
188
- this.expanded = !detail.collapsed;
189
- this.syncAriaExpanded();
190
- }
191
- };
192
175
  syncForwardedNodesIntoButton() {
193
176
  const btn = this.buttonEl;
194
177
  if (!btn || !this.forwardedNodes || this.forwardedNodes.length === 0) {
@@ -225,12 +208,13 @@ const LeSidePanelToggle = /*@__PURE__*/ proxyCustomElement(class LeSidePanelTogg
225
208
  }
226
209
  }
227
210
  render() {
228
- return (h("le-button", { key: '382be5b4b8c301dc1d5b8c2d8709bd83cfc08409', ref: el => (this.buttonEl = el), mode: this.mode, variant: this.variant, color: this.color, size: this.size, selected: this.selected, fullWidth: this.fullWidth, iconOnly: this.iconOnly, iconStart: this.iconStart, iconEnd: this.iconEnd, disabled: this.disabled, type: this.type, href: this.href, target: this.target, align: this.align, onClick: () => this.emitRequest() }));
211
+ return (h("le-button", { key: '172c8abec7d24a91974626d9bd083c7227400a2a', ref: el => (this.buttonEl = el), mode: this.mode, variant: this.variant, color: this.color, size: this.size, selected: this.selected, fullWidth: this.fullWidth, iconOnly: this.iconOnly, iconStart: this.iconStart, iconEnd: this.iconEnd, disabled: this.disabled, type: this.type, href: this.href, target: this.target, align: this.align, onClick: () => this.emitRequest() }));
229
212
  }
213
+ get el() { return this; }
230
214
  static get watchers() { return {
231
215
  "shortcut": ["onShortcutChanged"]
232
216
  }; }
233
- }, [769, "le-side-panel-toggle", {
217
+ }, [257, "le-side-panel-toggle", {
234
218
  "panelId": [1, "panel-id"],
235
219
  "action": [1],
236
220
  "shortcut": [1],
@@ -1 +1 @@
1
- {"file":"le-side-panel-toggle2.js","mappings":"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","names":["__stencil_proxyCustomElement"],"sources":["src/components/le-side-panel-toggle/le-side-panel-toggle.tsx"],"sourcesContent":["import { Build, Component, Element, Event, EventEmitter, Prop, Watch, h } from '@stencil/core';\n\nexport type LeSidePanelToggleAction = 'toggle' | 'open' | 'close';\n\nexport type LeSidePanelRequestToggleDetail = {\n panelId?: string;\n action: LeSidePanelToggleAction;\n};\n\ntype ShortcutSpec = {\n key: string;\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\nfunction parseShortcut(input?: string): ShortcutSpec | undefined {\n if (!input) {\n return undefined;\n }\n const trimmed = input.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const parts = trimmed\n .split('+')\n .map(p => p.trim())\n .filter(Boolean);\n if (parts.length === 0) {\n return undefined;\n }\n\n const key = parts[parts.length - 1];\n const mods = parts.slice(0, -1).map(m => m.toLowerCase());\n\n const spec: ShortcutSpec = {\n key: key.toLowerCase(),\n alt: mods.includes('alt') || mods.includes('option'),\n ctrl: mods.includes('ctrl') || mods.includes('control'),\n meta: mods.includes('meta') || mods.includes('cmd') || mods.includes('command'),\n shift: mods.includes('shift'),\n };\n\n if (mods.includes('mod')) {\n // mac: Cmd, others: Ctrl\n const isMac = typeof navigator !== 'undefined' && /mac/i.test(navigator.platform);\n if (isMac) {\n spec.meta = true;\n } else {\n spec.ctrl = true;\n }\n }\n\n return spec;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n const tag = target.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') {\n return true;\n }\n return target.isContentEditable;\n}\n\n@Component({\n tag: 'le-side-panel-toggle',\n shadow: true,\n})\nexport class LeSidePanelToggle {\n @Element() el: HTMLElement;\n\n /** Optional id used to target a specific panel. */\n @Prop() panelId?: string;\n\n /** Action to emit. Default toggles the panel. */\n @Prop() action: LeSidePanelToggleAction = 'toggle';\n\n /** Optional keyboard shortcut like `Mod+B` or `Alt+N`. */\n @Prop() shortcut?: string;\n\n /** Disables the toggle. */\n @Prop() disabled: boolean = false;\n\n // Pass-through props for le-button\n @Prop({ mutable: true, reflect: true }) mode: 'default' | 'admin';\n @Prop() variant: 'solid' | 'outlined' | 'clear' | 'system' = 'solid';\n @Prop() color: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' = 'primary';\n @Prop() size: 'small' | 'medium' | 'large' = 'medium';\n @Prop() selected: boolean = false;\n @Prop({ reflect: true }) fullWidth: boolean = false;\n @Prop() iconOnly?: string | Node;\n @Prop() iconStart?: string | Node;\n @Prop() iconEnd?: string | Node;\n @Prop() type: 'button' | 'submit' | 'reset' = 'button';\n @Prop() href?: string;\n @Prop() target?: string;\n @Prop() align: 'start' | 'center' | 'space-between' | 'end' = 'center';\n\n @Event({\n eventName: 'leSidePanelRequestToggle',\n bubbles: true,\n composed: true,\n })\n leSidePanelRequestToggle: EventEmitter<LeSidePanelRequestToggleDetail>;\n\n private shortcutSpec?: ShortcutSpec;\n private expanded: boolean | undefined;\n\n private buttonEl?: HTMLElement;\n private forwardedNodes?: ChildNode[];\n\n @Watch('shortcut')\n protected onShortcutChanged() {\n this.shortcutSpec = parseShortcut(this.shortcut);\n this.syncShortcutListener();\n }\n\n connectedCallback() {\n this.shortcutSpec = parseShortcut(this.shortcut);\n this.forwardedNodes = Array.from(this.el.childNodes);\n\n if (Build.isBrowser) {\n this.syncShortcutListener();\n document.addEventListener('leSidePanelOpenChange', this.onPanelStateChange as any);\n document.addEventListener('leSidePanelCollapsedChange', this.onPanelStateChange as any);\n }\n }\n\n componentDidLoad() {\n this.syncForwardedNodesIntoButton();\n this.syncAriaExpanded();\n }\n\n componentDidRender() {\n this.syncForwardedNodesIntoButton();\n this.syncAriaExpanded();\n }\n\n disconnectedCallback() {\n if (Build.isBrowser) {\n document.removeEventListener('keydown', this.onDocumentKeyDown, true);\n document.removeEventListener('leSidePanelOpenChange', this.onPanelStateChange as any);\n document.removeEventListener('leSidePanelCollapsedChange', this.onPanelStateChange as any);\n }\n }\n\n private syncShortcutListener() {\n if (!Build.isBrowser) {\n return;\n }\n if (this.shortcutSpec) {\n document.addEventListener('keydown', this.onDocumentKeyDown, true);\n } else {\n document.removeEventListener('keydown', this.onDocumentKeyDown, true);\n }\n }\n\n private getResolvedPanelId(): string | undefined {\n if (this.panelId) {\n return this.panelId;\n }\n const closestPanel = this.el?.closest?.('le-side-panel') as any;\n if (closestPanel?.panelId) {\n return closestPanel.panelId;\n }\n return undefined;\n }\n\n private emitRequest() {\n if (this.disabled) {\n return;\n }\n\n this.leSidePanelRequestToggle.emit({\n panelId: this.getResolvedPanelId(),\n action: this.action,\n });\n }\n\n private onDocumentKeyDown = (ev: KeyboardEvent) => {\n if (this.disabled) {\n return;\n }\n const spec = this.shortcutSpec;\n if (!spec) {\n return;\n }\n\n if (isEditableTarget(ev.target)) {\n return;\n }\n\n const key = (ev.key || '').toLowerCase();\n if (key !== spec.key) {\n return;\n }\n\n if (!!ev.altKey !== spec.alt) {\n return;\n }\n if (!!ev.ctrlKey !== spec.ctrl) {\n return;\n }\n if (!!ev.metaKey !== spec.meta) {\n return;\n }\n if (!!ev.shiftKey !== spec.shift) {\n return;\n }\n\n ev.preventDefault();\n this.emitRequest();\n };\n\n private onPanelStateChange = (ev: CustomEvent<any>) => {\n const detail = ev.detail || {};\n const requestedId = this.getResolvedPanelId() || '';\n const eventId = detail.panelId || '';\n\n if (requestedId !== eventId) {\n return;\n }\n\n if (typeof detail.open === 'boolean') {\n this.expanded = detail.open;\n this.syncAriaExpanded();\n }\n if (typeof detail.collapsed === 'boolean') {\n this.expanded = !detail.collapsed;\n this.syncAriaExpanded();\n }\n };\n\n private syncForwardedNodesIntoButton() {\n const btn = this.buttonEl as any;\n if (!btn || !this.forwardedNodes || this.forwardedNodes.length === 0) {\n return;\n }\n\n for (const node of this.forwardedNodes) {\n if (!node) {\n continue;\n }\n if (node.parentNode !== btn) {\n try {\n btn.appendChild(node);\n } catch {\n // ignore\n }\n }\n }\n }\n\n private syncAriaExpanded() {\n const value = typeof this.expanded === 'boolean' ? String(this.expanded) : null;\n const hostBtn = this.buttonEl as any;\n if (!hostBtn) {\n return;\n }\n\n // Best-effort: set on the actual internal <button>/<a> inside le-button.\n const inner = (hostBtn.shadowRoot?.querySelector?.('[part=\"button\"]') as HTMLElement) || null;\n const target = inner || hostBtn;\n if (value) {\n target.setAttribute('aria-expanded', value);\n } else {\n target.removeAttribute('aria-expanded');\n }\n }\n\n render() {\n return (\n <le-button\n ref={el => (this.buttonEl = el as HTMLElement)}\n mode={this.mode}\n variant={this.variant}\n color={this.color}\n size={this.size}\n selected={this.selected}\n fullWidth={this.fullWidth}\n iconOnly={this.iconOnly as any}\n iconStart={this.iconStart as any}\n iconEnd={this.iconEnd as any}\n disabled={this.disabled}\n type={this.type}\n href={this.href}\n target={this.target}\n align={this.align}\n onClick={() => this.emitRequest()}\n />\n );\n }\n}\n"],"version":3}
1
+ {"file":"le-side-panel-toggle2.js","mappings":"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","names":["__stencil_proxyCustomElement"],"sources":["src/components/le-side-panel-toggle/le-side-panel-toggle.tsx"],"sourcesContent":["import { Build, Component, Element, Event, EventEmitter, Prop, Watch, h } from '@stencil/core';\n\nexport type LeSidePanelToggleAction = 'toggle' | 'open' | 'close';\n\nexport type LeSidePanelRequestToggleDetail = {\n panelId?: string;\n action: LeSidePanelToggleAction;\n};\n\ntype ShortcutSpec = {\n key: string;\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\nfunction parseShortcut(input?: string): ShortcutSpec | undefined {\n if (!input) {\n return undefined;\n }\n const trimmed = input.trim();\n if (!trimmed) {\n return undefined;\n }\n\n const parts = trimmed\n .split('+')\n .map(p => p.trim())\n .filter(Boolean);\n if (parts.length === 0) {\n return undefined;\n }\n\n const key = parts[parts.length - 1];\n const mods = parts.slice(0, -1).map(m => m.toLowerCase());\n\n const spec: ShortcutSpec = {\n key: key.toLowerCase(),\n alt: mods.includes('alt') || mods.includes('option'),\n ctrl: mods.includes('ctrl') || mods.includes('control'),\n meta: mods.includes('meta') || mods.includes('cmd') || mods.includes('command'),\n shift: mods.includes('shift'),\n };\n\n if (mods.includes('mod')) {\n // mac: Cmd, others: Ctrl\n const isMac = typeof navigator !== 'undefined' && /mac/i.test(navigator.platform);\n if (isMac) {\n spec.meta = true;\n } else {\n spec.ctrl = true;\n }\n }\n\n return spec;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n const tag = target.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') {\n return true;\n }\n return target.isContentEditable;\n}\n\n@Component({\n tag: 'le-side-panel-toggle',\n shadow: true,\n})\nexport class LeSidePanelToggle {\n @Element() el: HTMLElement;\n\n /** Optional id used to target a specific panel. */\n @Prop() panelId?: string;\n\n /** Action to emit. Default toggles the panel. */\n @Prop() action: LeSidePanelToggleAction = 'toggle';\n\n /** Optional keyboard shortcut like `Mod+B` or `Alt+N`. */\n @Prop() shortcut?: string;\n\n /** Disables the toggle. */\n @Prop() disabled: boolean = false;\n\n // Pass-through props for le-button\n @Prop({ mutable: true, reflect: true }) mode: 'default' | 'admin';\n @Prop() variant: 'solid' | 'outlined' | 'clear' | 'system' = 'solid';\n @Prop() color: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' = 'primary';\n @Prop() size: 'small' | 'medium' | 'large' = 'medium';\n @Prop() selected: boolean = false;\n @Prop({ reflect: true }) fullWidth: boolean = false;\n @Prop() iconOnly?: string | Node;\n @Prop() iconStart?: string | Node;\n @Prop() iconEnd?: string | Node;\n @Prop() type: 'button' | 'submit' | 'reset' = 'button';\n @Prop() href?: string;\n @Prop() target?: string;\n @Prop() align: 'start' | 'center' | 'space-between' | 'end' = 'center';\n\n @Event({\n eventName: 'leSidePanelRequestToggle',\n bubbles: true,\n composed: true,\n })\n leSidePanelRequestToggle: EventEmitter<LeSidePanelRequestToggleDetail>;\n\n private shortcutSpec?: ShortcutSpec;\n private expanded: boolean | undefined;\n\n private buttonEl?: HTMLElement;\n private forwardedNodes?: ChildNode[];\n\n @Watch('shortcut')\n protected onShortcutChanged() {\n this.shortcutSpec = parseShortcut(this.shortcut);\n this.syncShortcutListener();\n }\n\n connectedCallback() {\n this.shortcutSpec = parseShortcut(this.shortcut);\n this.forwardedNodes = Array.from(this.el.childNodes);\n\n if (Build.isBrowser) {\n this.syncShortcutListener();\n document.addEventListener('leSidePanelOpenChange', this.onPanelStateChange as any);\n document.addEventListener('leSidePanelCollapsedChange', this.onPanelStateChange as any);\n }\n }\n\n componentDidLoad() {\n this.syncForwardedNodesIntoButton();\n this.syncAriaExpanded();\n }\n\n componentDidRender() {\n this.syncForwardedNodesIntoButton();\n this.syncAriaExpanded();\n }\n\n disconnectedCallback() {\n if (Build.isBrowser) {\n document.removeEventListener('keydown', this.onDocumentKeyDown, true);\n document.removeEventListener('leSidePanelOpenChange', this.onPanelStateChange as any);\n document.removeEventListener('leSidePanelCollapsedChange', this.onPanelStateChange as any);\n }\n }\n\n private syncShortcutListener() {\n if (!Build.isBrowser) {\n return;\n }\n if (this.shortcutSpec) {\n document.addEventListener('keydown', this.onDocumentKeyDown, true);\n } else {\n document.removeEventListener('keydown', this.onDocumentKeyDown, true);\n }\n }\n\n private getResolvedPanelId(): string | undefined {\n if (this.panelId) {\n return this.panelId;\n }\n const closestPanel = this.el?.closest?.('le-side-panel') as any;\n if (closestPanel?.panelId) {\n return closestPanel.panelId;\n }\n return undefined;\n }\n\n private emitRequest() {\n if (this.disabled) {\n return;\n }\n\n this.leSidePanelRequestToggle.emit({\n panelId: this.getResolvedPanelId(),\n action: this.action,\n });\n }\n\n private onDocumentKeyDown = (ev: KeyboardEvent) => {\n if (this.disabled) {\n return;\n }\n const spec = this.shortcutSpec;\n if (!spec) {\n return;\n }\n\n if (isEditableTarget(ev.target)) {\n return;\n }\n\n const key = (ev.key || '').toLowerCase();\n if (key !== spec.key) {\n return;\n }\n\n if (!!ev.altKey !== spec.alt) {\n return;\n }\n if (!!ev.ctrlKey !== spec.ctrl) {\n return;\n }\n if (!!ev.metaKey !== spec.meta) {\n return;\n }\n if (!!ev.shiftKey !== spec.shift) {\n return;\n }\n\n ev.preventDefault();\n this.emitRequest();\n };\n\n private onPanelStateChange = (ev: CustomEvent<any>) => {\n const detail = ev.detail || {};\n const requestedId = this.getResolvedPanelId() || '';\n const eventId = detail.panelId || '';\n\n if (requestedId !== eventId) {\n return;\n }\n\n if (typeof detail.open === 'boolean') {\n this.expanded = detail.open;\n this.syncAriaExpanded();\n }\n if (typeof detail.collapsed === 'boolean') {\n this.expanded = !detail.collapsed;\n this.syncAriaExpanded();\n }\n };\n\n private syncForwardedNodesIntoButton() {\n const btn = this.buttonEl as any;\n if (!btn || !this.forwardedNodes || this.forwardedNodes.length === 0) {\n return;\n }\n\n for (const node of this.forwardedNodes) {\n if (!node) {\n continue;\n }\n if (node.parentNode !== btn) {\n try {\n btn.appendChild(node);\n } catch {\n // ignore\n }\n }\n }\n }\n\n private syncAriaExpanded() {\n const value = typeof this.expanded === 'boolean' ? String(this.expanded) : null;\n const hostBtn = this.buttonEl as any;\n if (!hostBtn) {\n return;\n }\n\n // Best-effort: set on the actual internal <button>/<a> inside le-button.\n const inner = (hostBtn.shadowRoot?.querySelector?.('[part=\"button\"]') as HTMLElement) || null;\n const target = inner || hostBtn;\n if (value) {\n target.setAttribute('aria-expanded', value);\n } else {\n target.removeAttribute('aria-expanded');\n }\n }\n\n render() {\n return (\n <le-button\n ref={el => (this.buttonEl = el as HTMLElement)}\n mode={this.mode}\n variant={this.variant}\n color={this.color}\n size={this.size}\n selected={this.selected}\n fullWidth={this.fullWidth}\n iconOnly={this.iconOnly as any}\n iconStart={this.iconStart as any}\n iconEnd={this.iconEnd as any}\n disabled={this.disabled}\n type={this.type}\n href={this.href}\n target={this.target}\n align={this.align}\n onClick={() => this.emitRequest()}\n />\n );\n }\n}\n"],"version":3}