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
@@ -46,34 +46,65 @@ function isEditableTarget(target) {
46
46
  return target.isContentEditable;
47
47
  }
48
48
  export class LeSidePanelToggle {
49
- el;
50
- /** Optional id used to target a specific panel. */
51
- panelId;
52
- /** Action to emit. Default toggles the panel. */
53
- action = 'toggle';
54
- /** Optional keyboard shortcut like `Mod+B` or `Alt+N`. */
55
- shortcut;
56
- /** Disables the toggle. */
57
- disabled = false;
58
- // Pass-through props for le-button
59
- mode;
60
- variant = 'solid';
61
- color = 'primary';
62
- size = 'medium';
63
- selected = false;
64
- fullWidth = false;
65
- iconOnly;
66
- iconStart;
67
- iconEnd;
68
- type = 'button';
69
- href;
70
- target;
71
- align = 'center';
72
- leSidePanelRequestToggle;
73
- shortcutSpec;
74
- expanded;
75
- buttonEl;
76
- forwardedNodes;
49
+ constructor() {
50
+ /** Action to emit. Default toggles the panel. */
51
+ this.action = 'toggle';
52
+ /** Disables the toggle. */
53
+ this.disabled = false;
54
+ this.variant = 'solid';
55
+ this.color = 'primary';
56
+ this.size = 'medium';
57
+ this.selected = false;
58
+ this.fullWidth = false;
59
+ this.type = 'button';
60
+ this.align = 'center';
61
+ this.onDocumentKeyDown = (ev) => {
62
+ if (this.disabled) {
63
+ return;
64
+ }
65
+ const spec = this.shortcutSpec;
66
+ if (!spec) {
67
+ return;
68
+ }
69
+ if (isEditableTarget(ev.target)) {
70
+ return;
71
+ }
72
+ const key = (ev.key || '').toLowerCase();
73
+ if (key !== spec.key) {
74
+ return;
75
+ }
76
+ if (!!ev.altKey !== spec.alt) {
77
+ return;
78
+ }
79
+ if (!!ev.ctrlKey !== spec.ctrl) {
80
+ return;
81
+ }
82
+ if (!!ev.metaKey !== spec.meta) {
83
+ return;
84
+ }
85
+ if (!!ev.shiftKey !== spec.shift) {
86
+ return;
87
+ }
88
+ ev.preventDefault();
89
+ this.emitRequest();
90
+ };
91
+ this.onPanelStateChange = (ev) => {
92
+ const detail = ev.detail || {};
93
+ const requestedId = this.getResolvedPanelId() || '';
94
+ const eventId = detail.panelId || '';
95
+ if (requestedId !== eventId) {
96
+ return;
97
+ }
98
+ if (typeof detail.open === 'boolean') {
99
+ this.expanded = detail.open;
100
+ this.syncAriaExpanded();
101
+ }
102
+ if (typeof detail.collapsed === 'boolean') {
103
+ this.expanded = !detail.collapsed;
104
+ this.syncAriaExpanded();
105
+ }
106
+ };
107
+ }
77
108
  onShortcutChanged() {
78
109
  this.shortcutSpec = parseShortcut(this.shortcut);
79
110
  this.syncShortcutListener();
@@ -132,52 +163,6 @@ export class LeSidePanelToggle {
132
163
  action: this.action,
133
164
  });
134
165
  }
135
- onDocumentKeyDown = (ev) => {
136
- if (this.disabled) {
137
- return;
138
- }
139
- const spec = this.shortcutSpec;
140
- if (!spec) {
141
- return;
142
- }
143
- if (isEditableTarget(ev.target)) {
144
- return;
145
- }
146
- const key = (ev.key || '').toLowerCase();
147
- if (key !== spec.key) {
148
- return;
149
- }
150
- if (!!ev.altKey !== spec.alt) {
151
- return;
152
- }
153
- if (!!ev.ctrlKey !== spec.ctrl) {
154
- return;
155
- }
156
- if (!!ev.metaKey !== spec.meta) {
157
- return;
158
- }
159
- if (!!ev.shiftKey !== spec.shift) {
160
- return;
161
- }
162
- ev.preventDefault();
163
- this.emitRequest();
164
- };
165
- onPanelStateChange = (ev) => {
166
- const detail = ev.detail || {};
167
- const requestedId = this.getResolvedPanelId() || '';
168
- const eventId = detail.panelId || '';
169
- if (requestedId !== eventId) {
170
- return;
171
- }
172
- if (typeof detail.open === 'boolean') {
173
- this.expanded = detail.open;
174
- this.syncAriaExpanded();
175
- }
176
- if (typeof detail.collapsed === 'boolean') {
177
- this.expanded = !detail.collapsed;
178
- this.syncAriaExpanded();
179
- }
180
- };
181
166
  syncForwardedNodesIntoButton() {
182
167
  const btn = this.buttonEl;
183
168
  if (!btn || !this.forwardedNodes || this.forwardedNodes.length === 0) {
@@ -214,7 +199,7 @@ export class LeSidePanelToggle {
214
199
  }
215
200
  }
216
201
  render() {
217
- 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() }));
202
+ 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() }));
218
203
  }
219
204
  static get is() { return "le-side-panel-toggle"; }
220
205
  static get encapsulation() { return "shadow"; }
@@ -1 +1 @@
1
- {"version":3,"file":"le-side-panel-toggle.js","sourceRoot":"","sources":["../../../src/components/le-side-panel-toggle/le-side-panel-toggle.tsx"],"names":[],"mappings":"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","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"]}
1
+ {"version":3,"file":"le-side-panel-toggle.js","sourceRoot":"","sources":["../../../src/components/le-side-panel-toggle/le-side-panel-toggle.tsx"],"names":[],"mappings":"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","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"]}
@@ -15,96 +15,101 @@ import { getLeKitConfig } from "../../global/app";
15
15
  * @cmsCategory System
16
16
  */
17
17
  export class LeSlot {
18
- el;
19
- /**
20
- * The type of slot content.
21
- * - `slot`: Default, shows a dropzone for components (default)
22
- * - `text`: Shows a single-line text input
23
- * - `textarea`: Shows a multi-line text area
24
- */
25
- type = 'slot';
26
- /**
27
- * The name of the slot this placeholder represents.
28
- * Should match the slot name in the parent component.
29
- */
30
- name = '';
31
- /**
32
- * Label to display in admin mode.
33
- * If not provided, the slot name will be used.
34
- */
35
- label;
36
- /**
37
- * Description of what content this slot accepts.
38
- * Shown in admin mode to guide content editors.
39
- */
40
- description;
41
- /**
42
- * Comma-separated list of allowed component tags for this slot.
43
- * Used by CMS to filter available components.
44
- *
45
- * @example "le-card,le-button,le-text"
46
- */
47
- allowedComponents;
48
- /**
49
- * Whether multiple components can be dropped in this slot.
50
- */
51
- multiple = true;
52
- /**
53
- * Whether this slot is required to have content.
54
- */
55
- required = false;
56
- /**
57
- * Placeholder text for text/textarea inputs in admin mode.
58
- */
59
- placeholder;
60
- /**
61
- * The HTML tag to create when there's no slotted element.
62
- * Used with type="text" or type="textarea" to auto-create elements.
63
- *
64
- * @example "h3" - creates <h3 slot="header">content</h3>
65
- * @example "p" - creates <p slot="content">content</p>
66
- */
67
- tag;
68
- /**
69
- * CSS styles for the slot dropzone container.
70
- * Useful for layouts - e.g., "flex-direction: row" for horizontal stacks.
71
- * Only applies in admin mode for type="slot".
72
- */
73
- slotStyle;
74
- /**
75
- * Internal state to track admin mode
76
- */
77
- adminMode = false;
78
- /**
79
- * Internal state for text input value (synced from slot content)
80
- */
81
- textValue = '';
82
- /**
83
- * Whether the current textValue contains valid HTML
84
- */
85
- isValidHtml = true;
86
- /**
87
- * Available components loaded from Custom Elements Manifest
88
- */
89
- availableComponents = [];
90
- /**
91
- * Whether the component picker popover is open
92
- */
93
- pickerOpen = false;
94
- /**
95
- * Reference to the slot element to access assignedNodes
96
- */
97
- slotRef;
98
- /**
99
- * The original slotted element (e.g., <h3 slot="header">)
100
- */
101
- slottedElement;
102
- /**
103
- * Emitted when text content changes in admin mode.
104
- * The event detail contains the new text value and validity.
105
- */
106
- leSlotChange;
107
- disconnectModeObserver;
18
+ constructor() {
19
+ /**
20
+ * The type of slot content.
21
+ * - `slot`: Default, shows a dropzone for components (default)
22
+ * - `text`: Shows a single-line text input
23
+ * - `textarea`: Shows a multi-line text area
24
+ */
25
+ this.type = 'slot';
26
+ /**
27
+ * The name of the slot this placeholder represents.
28
+ * Should match the slot name in the parent component.
29
+ */
30
+ this.name = '';
31
+ /**
32
+ * Whether multiple components can be dropped in this slot.
33
+ */
34
+ this.multiple = true;
35
+ /**
36
+ * Whether this slot is required to have content.
37
+ */
38
+ this.required = false;
39
+ /**
40
+ * Internal state to track admin mode
41
+ */
42
+ this.adminMode = false;
43
+ /**
44
+ * Internal state for text input value (synced from slot content)
45
+ */
46
+ this.textValue = '';
47
+ /**
48
+ * Whether the current textValue contains valid HTML
49
+ */
50
+ this.isValidHtml = true;
51
+ /**
52
+ * Available components loaded from Custom Elements Manifest
53
+ */
54
+ this.availableComponents = [];
55
+ /**
56
+ * Whether the component picker popover is open
57
+ */
58
+ this.pickerOpen = false;
59
+ /**
60
+ * Flag to prevent re-reading content right after we updated it
61
+ */
62
+ this.isUpdating = false;
63
+ this.handleTextInput = (event) => {
64
+ const target = event.target;
65
+ this.textValue = target.value;
66
+ this.isValidHtml = this.validateHtml(this.textValue);
67
+ if (this.isValidHtml) {
68
+ // Set flag to prevent slotchange from re-reading what we just wrote
69
+ this.isUpdating = true;
70
+ console.log('Updating text value:', this.textValue, 'slottedElement:', this.slottedElement);
71
+ if (this.slottedElement) {
72
+ // Update existing slotted element's innerHTML
73
+ this.slottedElement.innerHTML = this.textValue;
74
+ }
75
+ else if (this.tag && this.textValue) {
76
+ // No slotted element exists
77
+ // If the slot doesn't have a name, then it's the default slot
78
+ // remove the existing non-slotted content (text nodes and elements without slot attribute)
79
+ const rootNode = this.el.getRootNode();
80
+ if (!this.name && rootNode instanceof ShadowRoot) {
81
+ const hostComponent = rootNode.host;
82
+ Array.from(hostComponent.childNodes).forEach(node => {
83
+ if (node.nodeType === Node.TEXT_NODE || (node.nodeType === Node.ELEMENT_NODE && !node.hasAttribute('slot'))) {
84
+ node.remove();
85
+ }
86
+ });
87
+ }
88
+ // create one using the specified tag
89
+ this.createSlottedElement();
90
+ }
91
+ else if (this.textValue) {
92
+ // no tag specified - just replace everything in the host component
93
+ const rootNode = this.el.getRootNode();
94
+ if (rootNode instanceof ShadowRoot) {
95
+ const hostComponent = rootNode.host;
96
+ hostComponent.innerHTML = this.textValue;
97
+ }
98
+ }
99
+ }
100
+ this.leSlotChange.emit({
101
+ name: this.name,
102
+ value: this.textValue,
103
+ isValid: this.isValidHtml,
104
+ });
105
+ };
106
+ /**
107
+ * Handle slot change event to re-read content when nodes are assigned
108
+ */
109
+ this.handleSlotChange = () => {
110
+ this.readSlottedContent();
111
+ };
112
+ }
108
113
  connectedCallback() {
109
114
  this.disconnectModeObserver = observeModeChanges(this.el, mode => {
110
115
  const wasAdmin = this.adminMode;
@@ -123,10 +128,6 @@ export class LeSlot {
123
128
  disconnectedCallback() {
124
129
  this.disconnectModeObserver?.();
125
130
  }
126
- /**
127
- * Flag to prevent re-reading content right after we updated it
128
- */
129
- isUpdating = false;
130
131
  /**
131
132
  * Read content from slotted elements via assignedNodes()
132
133
  */
@@ -190,49 +191,6 @@ export class LeSlot {
190
191
  }
191
192
  return true;
192
193
  }
193
- handleTextInput = (event) => {
194
- const target = event.target;
195
- this.textValue = target.value;
196
- this.isValidHtml = this.validateHtml(this.textValue);
197
- if (this.isValidHtml) {
198
- // Set flag to prevent slotchange from re-reading what we just wrote
199
- this.isUpdating = true;
200
- console.log('Updating text value:', this.textValue, 'slottedElement:', this.slottedElement);
201
- if (this.slottedElement) {
202
- // Update existing slotted element's innerHTML
203
- this.slottedElement.innerHTML = this.textValue;
204
- }
205
- else if (this.tag && this.textValue) {
206
- // No slotted element exists
207
- // If the slot doesn't have a name, then it's the default slot
208
- // remove the existing non-slotted content (text nodes and elements without slot attribute)
209
- const rootNode = this.el.getRootNode();
210
- if (!this.name && rootNode instanceof ShadowRoot) {
211
- const hostComponent = rootNode.host;
212
- Array.from(hostComponent.childNodes).forEach(node => {
213
- if (node.nodeType === Node.TEXT_NODE || (node.nodeType === Node.ELEMENT_NODE && !node.hasAttribute('slot'))) {
214
- node.remove();
215
- }
216
- });
217
- }
218
- // create one using the specified tag
219
- this.createSlottedElement();
220
- }
221
- else if (this.textValue) {
222
- // no tag specified - just replace everything in the host component
223
- const rootNode = this.el.getRootNode();
224
- if (rootNode instanceof ShadowRoot) {
225
- const hostComponent = rootNode.host;
226
- hostComponent.innerHTML = this.textValue;
227
- }
228
- }
229
- }
230
- this.leSlotChange.emit({
231
- name: this.name,
232
- value: this.textValue,
233
- isValid: this.isValidHtml,
234
- });
235
- };
236
194
  /**
237
195
  * Create a new slotted element when none exists.
238
196
  * The element is appended to the host component's light DOM.
@@ -334,16 +292,10 @@ export class LeSlot {
334
292
  isValid: true,
335
293
  });
336
294
  }
337
- /**
338
- * Handle slot change event to re-read content when nodes are assigned
339
- */
340
- handleSlotChange = () => {
341
- this.readSlottedContent();
342
- };
343
295
  render() {
344
296
  const displayLabel = this.label || this.name;
345
297
  // Always render the same structure, CSS handles visibility via .admin-mode class
346
- return (h(Host, { key: '8a48f7865340d9a2e201a2f878b2f1c66c55d86c', class: {
298
+ return (h(Host, { key: 'fb2a01670291a714608bc59069991a8ef65dc3e9', class: {
347
299
  'admin-mode': this.adminMode,
348
300
  'invalid-html': !this.isValidHtml,
349
301
  }, role: this.adminMode ? 'region' : undefined, "aria-label": this.adminMode ? `Slot: ${displayLabel}` : undefined, "data-slot-name": this.name, "data-slot-type": this.type, "data-allowed": this.allowedComponents, "data-multiple": this.multiple, "data-required": this.required }, this.adminMode ? (h("div", { class: "le-slot-container" }, h("div", { class: classnames('le-slot-header', {