le-kit 0.1.14 → 0.1.15

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 (538) hide show
  1. package/dist/{core/cjs/index-B0mg71He.js → cjs/index-C3iQZ-Ja.js} +10 -3
  2. package/dist/cjs/index-C3iQZ-Ja.js.map +1 -0
  3. package/dist/{core/cjs → cjs}/index.cjs.js +4 -3
  4. package/dist/cjs/index.cjs.js.map +1 -0
  5. package/dist/{core/cjs → cjs}/le-box.cjs.entry.js +3 -3
  6. package/dist/cjs/le-box.entry.cjs.js.map +1 -0
  7. package/dist/cjs/le-button.le-checkbox.le-component.le-popover.le-popup.le-slot.le-string-input.entry.cjs.js.map +1 -0
  8. package/dist/cjs/le-button_7.cjs.entry.js +1452 -0
  9. package/dist/cjs/le-card.cjs.entry.js +29 -0
  10. package/dist/cjs/le-card.entry.cjs.js.map +1 -0
  11. package/dist/cjs/le-combobox.cjs.entry.js +237 -0
  12. package/dist/cjs/le-combobox.entry.cjs.js.map +1 -0
  13. package/dist/cjs/le-dropdown-base.cjs.entry.js +348 -0
  14. package/dist/cjs/le-dropdown-base.entry.cjs.js.map +1 -0
  15. package/dist/cjs/le-kit.cjs.js +25 -0
  16. package/dist/cjs/le-multiselect.cjs.entry.js +306 -0
  17. package/dist/cjs/le-multiselect.entry.cjs.js.map +1 -0
  18. package/dist/{core/cjs → cjs}/le-number-input.cjs.entry.js +3 -3
  19. package/dist/cjs/le-number-input.entry.cjs.js.map +1 -0
  20. package/dist/{core/cjs → cjs}/le-round-progress.cjs.entry.js +2 -2
  21. package/dist/cjs/le-round-progress.entry.cjs.js.map +1 -0
  22. package/dist/cjs/le-segmented-control.cjs.entry.js +245 -0
  23. package/dist/cjs/le-segmented-control.entry.cjs.js.map +1 -0
  24. package/dist/cjs/le-select.cjs.entry.js +188 -0
  25. package/dist/cjs/le-select.entry.cjs.js.map +1 -0
  26. package/dist/{core/cjs → cjs}/le-stack.cjs.entry.js +4 -4
  27. package/dist/cjs/le-stack.entry.cjs.js.map +1 -0
  28. package/dist/cjs/le-tab-bar.cjs.entry.js +242 -0
  29. package/dist/cjs/le-tab-bar.entry.cjs.js.map +1 -0
  30. package/dist/cjs/le-tab-panel.cjs.entry.js +100 -0
  31. package/dist/cjs/le-tab-panel.entry.cjs.js.map +1 -0
  32. package/dist/cjs/le-tab.cjs.entry.js +133 -0
  33. package/dist/cjs/le-tab.entry.cjs.js.map +1 -0
  34. package/dist/cjs/le-tabs.cjs.entry.js +307 -0
  35. package/dist/cjs/le-tabs.entry.cjs.js.map +1 -0
  36. package/dist/cjs/le-tag.cjs.entry.js +68 -0
  37. package/dist/cjs/le-tag.entry.cjs.js.map +1 -0
  38. package/dist/{core/cjs → cjs}/le-text.cjs.entry.js +3 -3
  39. package/dist/cjs/le-text.entry.cjs.js.map +1 -0
  40. package/dist/{core/cjs → cjs}/le-turntable.cjs.entry.js +2 -2
  41. package/dist/cjs/le-turntable.entry.cjs.js.map +1 -0
  42. package/dist/cjs/loader.cjs.js +13 -0
  43. package/dist/{core/cjs/utils-jdqP71LP.js → cjs/utils-DjPcLPN9.js} +3 -3
  44. package/dist/cjs/utils-DjPcLPN9.js.map +1 -0
  45. package/dist/{core/collection → collection}/collection-manifest.json +12 -0
  46. package/dist/{core/collection → collection}/components/le-box/le-box.js +1 -1
  47. package/dist/collection/components/le-box/le-box.js.map +1 -0
  48. package/dist/{core/collection/components/le-button/le-button.default.css → collection/components/le-button/le-button.css} +65 -38
  49. package/dist/{core/collection → collection}/components/le-button/le-button.js +106 -16
  50. package/dist/collection/components/le-button/le-button.js.map +1 -0
  51. package/dist/{core/collection → collection}/components/le-card/le-card.default.css +6 -6
  52. package/dist/{core/collection → collection}/components/le-card/le-card.js +2 -2
  53. package/dist/collection/components/le-card/le-card.js.map +1 -0
  54. package/dist/{core/collection → collection}/components/le-checkbox/le-checkbox.js +2 -2
  55. package/dist/collection/components/le-checkbox/le-checkbox.js.map +1 -0
  56. package/dist/collection/components/le-combobox/le-combobox.css +144 -0
  57. package/dist/collection/components/le-combobox/le-combobox.js +659 -0
  58. package/dist/collection/components/le-combobox/le-combobox.js.map +1 -0
  59. package/dist/collection/components/le-component/le-component.css +189 -0
  60. package/dist/{le-kit/le-component.entry.js → collection/components/le-component/le-component.js} +136 -16
  61. package/dist/collection/components/le-component/le-component.js.map +1 -0
  62. package/dist/collection/components/le-dropdown-base/le-dropdown-base.css +163 -0
  63. package/dist/collection/components/le-dropdown-base/le-dropdown-base.js +761 -0
  64. package/dist/collection/components/le-dropdown-base/le-dropdown-base.js.map +1 -0
  65. package/dist/collection/components/le-multiselect/le-multiselect.css +163 -0
  66. package/dist/collection/components/le-multiselect/le-multiselect.js +734 -0
  67. package/dist/collection/components/le-multiselect/le-multiselect.js.map +1 -0
  68. package/dist/{core/collection → collection}/components/le-number-input/le-number-input.js +2 -2
  69. package/dist/collection/components/le-number-input/le-number-input.js.map +1 -0
  70. package/dist/{core/collection → collection}/components/le-popover/le-popover.css +10 -0
  71. package/dist/{core/collection → collection}/components/le-popover/le-popover.js +61 -10
  72. package/dist/collection/components/le-popover/le-popover.js.map +1 -0
  73. package/dist/{core/collection → collection}/components/le-popup/le-popup.api.js +2 -1
  74. package/dist/collection/components/le-popup/le-popup.api.js.map +1 -0
  75. package/dist/{core/collection → collection}/components/le-popup/le-popup.js +49 -19
  76. package/dist/collection/components/le-popup/le-popup.js.map +1 -0
  77. package/dist/{core/collection → collection}/components/le-round-progress/le-round-progress.js +1 -1
  78. package/dist/collection/components/le-round-progress/le-round-progress.js.map +1 -0
  79. package/dist/collection/components/le-segmented-control/le-segmented-control.css +78 -0
  80. package/dist/collection/components/le-segmented-control/le-segmented-control.js +445 -0
  81. package/dist/collection/components/le-segmented-control/le-segmented-control.js.map +1 -0
  82. package/dist/collection/components/le-select/le-select.css +121 -0
  83. package/dist/collection/components/le-select/le-select.js +578 -0
  84. package/dist/collection/components/le-select/le-select.js.map +1 -0
  85. package/dist/collection/components/le-slot/le-slot.default.css +222 -0
  86. package/dist/{le-kit/le-slot.entry.js → collection/components/le-slot/le-slot.js} +268 -17
  87. package/dist/collection/components/le-slot/le-slot.js.map +1 -0
  88. package/dist/{core/collection → collection}/components/le-stack/le-stack.js +2 -2
  89. package/dist/collection/components/le-stack/le-stack.js.map +1 -0
  90. package/dist/{core/collection → collection}/components/le-string-input/le-string-input.css +1 -1
  91. package/dist/{core/collection → collection}/components/le-string-input/le-string-input.js +60 -6
  92. package/dist/collection/components/le-string-input/le-string-input.js.map +1 -0
  93. package/dist/collection/components/le-tab/le-tab.css +289 -0
  94. package/dist/collection/components/le-tab/le-tab.js +565 -0
  95. package/dist/collection/components/le-tab/le-tab.js.map +1 -0
  96. package/dist/collection/components/le-tab-bar/le-tab-bar.css +89 -0
  97. package/dist/collection/components/le-tab-bar/le-tab-bar.js +467 -0
  98. package/dist/collection/components/le-tab-bar/le-tab-bar.js.map +1 -0
  99. package/dist/collection/components/le-tab-panel/le-tab-panel.css +30 -0
  100. package/dist/collection/components/le-tab-panel/le-tab-panel.js +302 -0
  101. package/dist/collection/components/le-tab-panel/le-tab-panel.js.map +1 -0
  102. package/dist/collection/components/le-tabs/le-tabs.css +146 -0
  103. package/dist/collection/components/le-tabs/le-tabs.js +588 -0
  104. package/dist/collection/components/le-tabs/le-tabs.js.map +1 -0
  105. package/dist/collection/components/le-tag/le-tag.css +139 -0
  106. package/dist/collection/components/le-tag/le-tag.js +266 -0
  107. package/dist/collection/components/le-tag/le-tag.js.map +1 -0
  108. package/dist/{core/collection → collection}/components/le-text/le-text.js +1 -1
  109. package/dist/collection/components/le-text/le-text.js.map +1 -0
  110. package/dist/{core/collection → collection}/components/le-turntable/le-turntable.js +1 -1
  111. package/dist/collection/components/le-turntable/le-turntable.js.map +1 -0
  112. package/dist/collection/dist/components/assets/.gitkeep +1 -0
  113. package/dist/{le-kit → collection/dist/components}/assets/custom-elements.json +5064 -1199
  114. package/dist/collection/dist/components/themes/base.css +133 -0
  115. package/dist/collection/dist/components/themes/dark.css +103 -0
  116. package/dist/collection/dist/components/themes/default.css +111 -0
  117. package/dist/collection/dist/components/themes/gradient.css +103 -0
  118. package/dist/collection/dist/components/themes/index.css +415 -0
  119. package/dist/collection/dist/components/themes/minimal.css +103 -0
  120. package/dist/collection/dist/components/themes/warm.css +103 -0
  121. package/dist/collection/global/app.js.map +1 -0
  122. package/dist/collection/index.js.map +1 -0
  123. package/dist/collection/types/blocks.js.map +1 -0
  124. package/dist/collection/types/options.js.map +1 -0
  125. package/dist/collection/utils/utils.js.map +1 -0
  126. package/dist/components/assets/.gitkeep +1 -0
  127. package/dist/components/assets/custom-elements.json +8170 -0
  128. package/dist/components/index.js +11 -0
  129. package/dist/components/index.js.map +1 -0
  130. package/dist/{core/components → components}/le-box.js +11 -6
  131. package/dist/components/le-box.js.map +1 -0
  132. package/dist/{core/components → components}/le-button.js +1 -1
  133. package/dist/{core/components → components}/le-button2.js +371 -35
  134. package/dist/components/le-button2.js.map +1 -0
  135. package/dist/{core/components → components}/le-card.js +11 -6
  136. package/dist/components/le-card.js.map +1 -0
  137. package/dist/{core/components → components}/le-checkbox.js +1 -1
  138. package/dist/components/le-combobox.d.ts +11 -0
  139. package/dist/components/le-combobox.js +321 -0
  140. package/dist/components/le-combobox.js.map +1 -0
  141. package/dist/{core/components → components}/le-component.js +1 -1
  142. package/dist/components/le-dropdown-base.d.ts +11 -0
  143. package/dist/components/le-dropdown-base.js +9 -0
  144. package/dist/components/le-dropdown-base.js.map +1 -0
  145. package/dist/components/le-dropdown-base2.js +393 -0
  146. package/dist/components/le-dropdown-base2.js.map +1 -0
  147. package/dist/components/le-multiselect.d.ts +11 -0
  148. package/dist/components/le-multiselect.js +400 -0
  149. package/dist/components/le-multiselect.js.map +1 -0
  150. package/dist/{core/components → components}/le-number-input.js +12 -7
  151. package/dist/components/le-number-input.js.map +1 -0
  152. package/dist/{core/components → components}/le-popover2.js +24 -11
  153. package/dist/components/le-popover2.js.map +1 -0
  154. package/dist/{core/components/index.js → components/le-popup.api.js} +5 -12
  155. package/dist/components/le-popup.api.js.map +1 -0
  156. package/dist/components/le-popup.js +9 -0
  157. package/dist/components/le-popup.js.map +1 -0
  158. package/dist/{core/components → components}/le-round-progress.js +1 -1
  159. package/dist/components/le-segmented-control.d.ts +11 -0
  160. package/dist/components/le-segmented-control.js +320 -0
  161. package/dist/components/le-segmented-control.js.map +1 -0
  162. package/dist/components/le-select.d.ts +11 -0
  163. package/dist/components/le-select.js +271 -0
  164. package/dist/components/le-select.js.map +1 -0
  165. package/dist/{core/components → components}/le-slot.js +1 -1
  166. package/dist/{core/components → components}/le-stack.js +12 -7
  167. package/dist/components/le-stack.js.map +1 -0
  168. package/dist/{core/components → components}/le-string-input.js +1 -1
  169. package/dist/components/le-tab-bar.d.ts +11 -0
  170. package/dist/components/le-tab-bar.js +319 -0
  171. package/dist/components/le-tab-bar.js.map +1 -0
  172. package/dist/components/le-tab-panel.d.ts +11 -0
  173. package/dist/components/le-tab-panel.js +171 -0
  174. package/dist/components/le-tab-panel.js.map +1 -0
  175. package/dist/components/le-tab.d.ts +11 -0
  176. package/dist/components/le-tab.js +9 -0
  177. package/dist/components/le-tab.js.map +1 -0
  178. package/dist/components/le-tab2.js +206 -0
  179. package/dist/components/le-tab2.js.map +1 -0
  180. package/dist/components/le-tabs.d.ts +11 -0
  181. package/dist/components/le-tabs.js +386 -0
  182. package/dist/components/le-tabs.js.map +1 -0
  183. package/dist/components/le-tag.d.ts +11 -0
  184. package/dist/components/le-tag.js +9 -0
  185. package/dist/components/le-tag.js.map +1 -0
  186. package/dist/components/le-tag2.js +130 -0
  187. package/dist/components/le-tag2.js.map +1 -0
  188. package/dist/{core/components → components}/le-text.js +11 -6
  189. package/dist/components/le-text.js.map +1 -0
  190. package/dist/{core/components → components}/le-turntable.js +1 -1
  191. package/dist/components/themes/base.css +44 -0
  192. package/dist/components/themes/dark.css +4 -1
  193. package/dist/components/themes/default.css +4 -1
  194. package/dist/components/themes/gradient.css +4 -1
  195. package/dist/components/themes/index.css +2 -0
  196. package/dist/components/themes/minimal.css +4 -1
  197. package/dist/components/themes/warm.css +4 -1
  198. package/dist/docs.d.ts +443 -0
  199. package/dist/docs.json +10488 -0
  200. package/dist/{core/esm/index-SKsXnjWI.js → esm/index-DzgCnDLJ.js} +10 -4
  201. package/dist/esm/index-DzgCnDLJ.js.map +1 -0
  202. package/dist/{core/esm → esm}/index.js +4 -3
  203. package/dist/esm/index.js.map +1 -0
  204. package/dist/{le-kit → esm}/le-box.entry.js +3 -3
  205. package/dist/esm/le-box.entry.js.map +1 -0
  206. package/dist/esm/le-button.le-checkbox.le-component.le-popover.le-popup.le-slot.le-string-input.entry.js.map +1 -0
  207. package/dist/esm/le-button_7.entry.js +1444 -0
  208. package/dist/{le-kit → esm}/le-card.entry.js +3 -3
  209. package/dist/esm/le-card.entry.js.map +1 -0
  210. package/dist/esm/le-combobox.entry.js +235 -0
  211. package/dist/esm/le-combobox.entry.js.map +1 -0
  212. package/dist/esm/le-dropdown-base.entry.js +346 -0
  213. package/dist/esm/le-dropdown-base.entry.js.map +1 -0
  214. package/dist/esm/le-kit.js +21 -0
  215. package/dist/esm/le-multiselect.entry.js +304 -0
  216. package/dist/esm/le-multiselect.entry.js.map +1 -0
  217. package/dist/{le-kit → esm}/le-number-input.entry.js +6 -6
  218. package/dist/esm/le-number-input.entry.js.map +1 -0
  219. package/dist/{core/esm → esm}/le-round-progress.entry.js +2 -2
  220. package/dist/esm/le-round-progress.entry.js.map +1 -0
  221. package/dist/esm/le-segmented-control.entry.js +243 -0
  222. package/dist/esm/le-segmented-control.entry.js.map +1 -0
  223. package/dist/esm/le-select.entry.js +186 -0
  224. package/dist/esm/le-select.entry.js.map +1 -0
  225. package/dist/{le-kit → esm}/le-stack.entry.js +4 -4
  226. package/dist/esm/le-stack.entry.js.map +1 -0
  227. package/dist/esm/le-tab-bar.entry.js +240 -0
  228. package/dist/esm/le-tab-bar.entry.js.map +1 -0
  229. package/dist/esm/le-tab-panel.entry.js +98 -0
  230. package/dist/esm/le-tab-panel.entry.js.map +1 -0
  231. package/dist/esm/le-tab.entry.js +131 -0
  232. package/dist/esm/le-tab.entry.js.map +1 -0
  233. package/dist/esm/le-tabs.entry.js +305 -0
  234. package/dist/esm/le-tabs.entry.js.map +1 -0
  235. package/dist/esm/le-tag.entry.js +66 -0
  236. package/dist/esm/le-tag.entry.js.map +1 -0
  237. package/dist/{le-kit → esm}/le-text.entry.js +3 -3
  238. package/dist/esm/le-text.entry.js.map +1 -0
  239. package/dist/{core/esm → esm}/le-turntable.entry.js +2 -2
  240. package/dist/esm/le-turntable.entry.js.map +1 -0
  241. package/dist/esm/loader.js +11 -0
  242. package/dist/{le-kit/utils-cwSNy7ZS.js → esm/utils-Dp5xFMCl.js} +3 -3
  243. package/dist/{le-kit/utils-cwSNy7ZS.js.map → esm/utils-Dp5xFMCl.js.map} +1 -1
  244. package/dist/le-kit/dist/components/assets/.gitkeep +1 -0
  245. package/dist/le-kit/dist/components/assets/custom-elements.json +8170 -0
  246. package/dist/le-kit/dist/components/themes/base.css +44 -0
  247. package/dist/le-kit/dist/components/themes/dark.css +4 -1
  248. package/dist/le-kit/dist/components/themes/default.css +4 -1
  249. package/dist/le-kit/dist/components/themes/gradient.css +4 -1
  250. package/dist/le-kit/dist/components/themes/index.css +2 -0
  251. package/dist/le-kit/dist/components/themes/minimal.css +4 -1
  252. package/dist/le-kit/dist/components/themes/warm.css +4 -1
  253. package/dist/le-kit/index.esm.js +2 -116
  254. package/dist/le-kit/index.esm.js.map +1 -1
  255. package/dist/le-kit/le-button.le-checkbox.le-component.le-popover.le-popup.le-slot.le-string-input.entry.esm.js.map +1 -0
  256. package/dist/le-kit/le-combobox.entry.esm.js.map +1 -0
  257. package/dist/le-kit/le-dropdown-base.entry.esm.js.map +1 -0
  258. package/dist/le-kit/le-kit.css +1 -1010
  259. package/dist/le-kit/le-kit.esm.js +2 -48
  260. package/dist/le-kit/le-kit.esm.js.map +1 -1
  261. package/dist/le-kit/le-multiselect.entry.esm.js.map +1 -0
  262. package/dist/le-kit/le-segmented-control.entry.esm.js.map +1 -0
  263. package/dist/le-kit/le-select.entry.esm.js.map +1 -0
  264. package/dist/le-kit/le-tab-bar.entry.esm.js.map +1 -0
  265. package/dist/le-kit/le-tab-panel.entry.esm.js.map +1 -0
  266. package/dist/le-kit/le-tab.entry.esm.js.map +1 -0
  267. package/dist/le-kit/le-tabs.entry.esm.js.map +1 -0
  268. package/dist/le-kit/le-tag.entry.esm.js.map +1 -0
  269. package/dist/{core/le-kit/p-55f70091.entry.js → le-kit/p-0bd7803f.entry.js} +2 -2
  270. package/dist/le-kit/p-0bd7803f.entry.js.map +1 -0
  271. package/dist/le-kit/p-1f55a4a2.entry.js +2 -0
  272. package/dist/le-kit/p-1f55a4a2.entry.js.map +1 -0
  273. package/dist/{core/le-kit/p-a9d05ef6.entry.js → le-kit/p-2c37f174.entry.js} +2 -2
  274. package/dist/le-kit/p-2c37f174.entry.js.map +1 -0
  275. package/dist/{core/le-kit/p-6e414a5c.entry.js → le-kit/p-33612923.entry.js} +2 -2
  276. package/dist/le-kit/p-33612923.entry.js.map +1 -0
  277. package/dist/le-kit/p-3a52c4de.entry.js +2 -0
  278. package/dist/le-kit/p-3a52c4de.entry.js.map +1 -0
  279. package/dist/le-kit/p-4130c60b.entry.js +2 -0
  280. package/dist/le-kit/p-4130c60b.entry.js.map +1 -0
  281. package/dist/le-kit/p-432e8231.entry.js +2 -0
  282. package/dist/le-kit/p-432e8231.entry.js.map +1 -0
  283. package/dist/le-kit/p-548d130b.entry.js +2 -0
  284. package/dist/le-kit/p-548d130b.entry.js.map +1 -0
  285. package/dist/le-kit/p-6ecdad85.entry.js +2 -0
  286. package/dist/le-kit/p-6ecdad85.entry.js.map +1 -0
  287. package/dist/le-kit/p-6ee06c44.entry.js +2 -0
  288. package/dist/le-kit/p-6ee06c44.entry.js.map +1 -0
  289. package/dist/le-kit/p-71c78784.entry.js +2 -0
  290. package/dist/le-kit/p-71c78784.entry.js.map +1 -0
  291. package/dist/le-kit/p-7b180d58.entry.js +2 -0
  292. package/dist/le-kit/p-7b180d58.entry.js.map +1 -0
  293. package/dist/le-kit/p-91993261.entry.js +2 -0
  294. package/dist/le-kit/p-91993261.entry.js.map +1 -0
  295. package/dist/{core/le-kit/p--VxUdzYV.js → le-kit/p-DaA5gINj.js} +2 -2
  296. package/dist/le-kit/p-DaA5gINj.js.map +1 -0
  297. package/dist/le-kit/p-DzgCnDLJ.js +3 -0
  298. package/dist/le-kit/p-DzgCnDLJ.js.map +1 -0
  299. package/dist/le-kit/p-a5d31d40.entry.js +2 -0
  300. package/dist/le-kit/p-a5d31d40.entry.js.map +1 -0
  301. package/dist/{core/le-kit/p-4f133e72.entry.js → le-kit/p-b66fd9e1.entry.js} +2 -2
  302. package/dist/le-kit/p-b66fd9e1.entry.js.map +1 -0
  303. package/dist/le-kit/p-beb87e61.entry.js +2 -0
  304. package/dist/le-kit/p-beb87e61.entry.js.map +1 -0
  305. package/dist/le-kit/p-cc0797b0.entry.js +2 -0
  306. package/dist/le-kit/p-cc0797b0.entry.js.map +1 -0
  307. package/dist/le-kit/p-d504a369.entry.js +2 -0
  308. package/dist/le-kit/p-d504a369.entry.js.map +1 -0
  309. package/dist/themes/base.css +133 -0
  310. package/dist/themes/dark.css +103 -0
  311. package/dist/themes/default.css +111 -0
  312. package/dist/themes/gradient.css +103 -0
  313. package/dist/themes/index.css +415 -0
  314. package/dist/themes/minimal.css +103 -0
  315. package/dist/themes/warm.css +103 -0
  316. package/dist/types/components/le-button/le-button.d.ts +19 -4
  317. package/dist/types/components/le-combobox/le-combobox.d.ts +128 -0
  318. package/dist/types/components/le-dropdown-base/le-dropdown-base.d.ts +118 -0
  319. package/dist/types/components/le-multiselect/le-multiselect.d.ts +143 -0
  320. package/dist/types/components/le-popover/le-popover.d.ts +13 -2
  321. package/dist/types/components/le-popup/le-popup.d.ts +5 -0
  322. package/dist/types/components/le-segmented-control/le-segmented-control.d.ts +82 -0
  323. package/dist/types/components/le-select/le-select.d.ts +125 -0
  324. package/dist/types/components/le-string-input/le-string-input.d.ts +8 -0
  325. package/dist/types/components/le-tab/le-tab.d.ts +116 -0
  326. package/dist/types/components/le-tab-bar/le-tab-bar.d.ts +88 -0
  327. package/dist/types/components/le-tab-panel/le-tab-panel.d.ts +75 -0
  328. package/dist/types/components/le-tabs/le-tabs.d.ts +108 -0
  329. package/dist/types/components/le-tag/le-tag.d.ts +78 -0
  330. package/dist/types/components.d.ts +2310 -40
  331. package/dist/types/types/options.d.ts +9 -0
  332. package/package.json +3 -18
  333. package/dist/core/cjs/index-B0mg71He.js.map +0 -1
  334. package/dist/core/cjs/index.cjs.js.map +0 -1
  335. package/dist/core/cjs/le-box.entry.cjs.js.map +0 -1
  336. package/dist/core/cjs/le-button.cjs.entry.js +0 -92
  337. package/dist/core/cjs/le-button.entry.cjs.js.map +0 -1
  338. package/dist/core/cjs/le-card.cjs.entry.js +0 -29
  339. package/dist/core/cjs/le-card.entry.cjs.js.map +0 -1
  340. package/dist/core/cjs/le-checkbox.cjs.entry.js +0 -61
  341. package/dist/core/cjs/le-checkbox.entry.cjs.js.map +0 -1
  342. package/dist/core/cjs/le-kit.cjs.js +0 -25
  343. package/dist/core/cjs/le-number-input.entry.cjs.js.map +0 -1
  344. package/dist/core/cjs/le-popover.cjs.entry.js +0 -348
  345. package/dist/core/cjs/le-popover.entry.cjs.js.map +0 -1
  346. package/dist/core/cjs/le-popup.cjs.entry.js +0 -212
  347. package/dist/core/cjs/le-popup.entry.cjs.js.map +0 -1
  348. package/dist/core/cjs/le-round-progress.entry.cjs.js.map +0 -1
  349. package/dist/core/cjs/le-stack.entry.cjs.js.map +0 -1
  350. package/dist/core/cjs/le-string-input.cjs.entry.js +0 -95
  351. package/dist/core/cjs/le-string-input.entry.cjs.js.map +0 -1
  352. package/dist/core/cjs/le-text.entry.cjs.js.map +0 -1
  353. package/dist/core/cjs/le-turntable.entry.cjs.js.map +0 -1
  354. package/dist/core/cjs/loader.cjs.js +0 -13
  355. package/dist/core/cjs/utils-jdqP71LP.js.map +0 -1
  356. package/dist/core/collection/components/le-box/le-box.js.map +0 -1
  357. package/dist/core/collection/components/le-button/le-button.js.map +0 -1
  358. package/dist/core/collection/components/le-card/le-card.js.map +0 -1
  359. package/dist/core/collection/components/le-checkbox/le-checkbox.js.map +0 -1
  360. package/dist/core/collection/components/le-number-input/le-number-input.js.map +0 -1
  361. package/dist/core/collection/components/le-popover/le-popover.js.map +0 -1
  362. package/dist/core/collection/components/le-popup/le-popup.api.js.map +0 -1
  363. package/dist/core/collection/components/le-popup/le-popup.js.map +0 -1
  364. package/dist/core/collection/components/le-round-progress/le-round-progress.js.map +0 -1
  365. package/dist/core/collection/components/le-stack/le-stack.js.map +0 -1
  366. package/dist/core/collection/components/le-string-input/le-string-input.js.map +0 -1
  367. package/dist/core/collection/components/le-text/le-text.js.map +0 -1
  368. package/dist/core/collection/components/le-turntable/le-turntable.js.map +0 -1
  369. package/dist/core/collection/global/app.js.map +0 -1
  370. package/dist/core/collection/index.js.map +0 -1
  371. package/dist/core/collection/types/blocks.js.map +0 -1
  372. package/dist/core/collection/types/options.js.map +0 -1
  373. package/dist/core/collection/utils/utils.js.map +0 -1
  374. package/dist/core/components/index.d.ts +0 -33
  375. package/dist/core/components/index.js.map +0 -1
  376. package/dist/core/components/le-box.d.ts +0 -11
  377. package/dist/core/components/le-box.js.map +0 -1
  378. package/dist/core/components/le-button.d.ts +0 -11
  379. package/dist/core/components/le-button2.js.map +0 -1
  380. package/dist/core/components/le-card.d.ts +0 -11
  381. package/dist/core/components/le-card.js.map +0 -1
  382. package/dist/core/components/le-checkbox.d.ts +0 -11
  383. package/dist/core/components/le-component.d.ts +0 -11
  384. package/dist/core/components/le-number-input.d.ts +0 -11
  385. package/dist/core/components/le-number-input.js.map +0 -1
  386. package/dist/core/components/le-popover.d.ts +0 -11
  387. package/dist/core/components/le-popover2.js.map +0 -1
  388. package/dist/core/components/le-popup.d.ts +0 -11
  389. package/dist/core/components/le-popup.js +0 -279
  390. package/dist/core/components/le-popup.js.map +0 -1
  391. package/dist/core/components/le-round-progress.d.ts +0 -11
  392. package/dist/core/components/le-slot.d.ts +0 -11
  393. package/dist/core/components/le-stack.d.ts +0 -11
  394. package/dist/core/components/le-stack.js.map +0 -1
  395. package/dist/core/components/le-string-input.d.ts +0 -11
  396. package/dist/core/components/le-text.d.ts +0 -11
  397. package/dist/core/components/le-text.js.map +0 -1
  398. package/dist/core/components/le-turntable.d.ts +0 -11
  399. package/dist/core/esm/index-SKsXnjWI.js.map +0 -1
  400. package/dist/core/esm/index.js.map +0 -1
  401. package/dist/core/esm/le-box.entry.js +0 -182
  402. package/dist/core/esm/le-box.entry.js.map +0 -1
  403. package/dist/core/esm/le-button.entry.js +0 -90
  404. package/dist/core/esm/le-button.entry.js.map +0 -1
  405. package/dist/core/esm/le-card.entry.js +0 -27
  406. package/dist/core/esm/le-card.entry.js.map +0 -1
  407. package/dist/core/esm/le-checkbox.entry.js +0 -59
  408. package/dist/core/esm/le-checkbox.entry.js.map +0 -1
  409. package/dist/core/esm/le-kit.js +0 -21
  410. package/dist/core/esm/le-number-input.entry.js +0 -200
  411. package/dist/core/esm/le-number-input.entry.js.map +0 -1
  412. package/dist/core/esm/le-popover.entry.js +0 -346
  413. package/dist/core/esm/le-popover.entry.js.map +0 -1
  414. package/dist/core/esm/le-popup.entry.js +0 -210
  415. package/dist/core/esm/le-popup.entry.js.map +0 -1
  416. package/dist/core/esm/le-round-progress.entry.js.map +0 -1
  417. package/dist/core/esm/le-stack.entry.js +0 -133
  418. package/dist/core/esm/le-stack.entry.js.map +0 -1
  419. package/dist/core/esm/le-string-input.entry.js +0 -93
  420. package/dist/core/esm/le-string-input.entry.js.map +0 -1
  421. package/dist/core/esm/le-text.entry.js +0 -333
  422. package/dist/core/esm/le-text.entry.js.map +0 -1
  423. package/dist/core/esm/le-turntable.entry.js.map +0 -1
  424. package/dist/core/esm/loader.js +0 -11
  425. package/dist/core/esm/utils-DZdP1JiG.js +0 -146
  426. package/dist/core/esm/utils-DZdP1JiG.js.map +0 -1
  427. package/dist/core/le-kit/index.esm.js +0 -2
  428. package/dist/core/le-kit/index.esm.js.map +0 -1
  429. package/dist/core/le-kit/le-box.entry.esm.js.map +0 -1
  430. package/dist/core/le-kit/le-button.entry.esm.js.map +0 -1
  431. package/dist/core/le-kit/le-card.entry.esm.js.map +0 -1
  432. package/dist/core/le-kit/le-checkbox.entry.esm.js.map +0 -1
  433. package/dist/core/le-kit/le-kit.css +0 -1
  434. package/dist/core/le-kit/le-kit.esm.js +0 -2
  435. package/dist/core/le-kit/le-kit.esm.js.map +0 -1
  436. package/dist/core/le-kit/le-number-input.entry.esm.js.map +0 -1
  437. package/dist/core/le-kit/le-popover.entry.esm.js.map +0 -1
  438. package/dist/core/le-kit/le-popup.entry.esm.js.map +0 -1
  439. package/dist/core/le-kit/le-round-progress.entry.esm.js.map +0 -1
  440. package/dist/core/le-kit/le-stack.entry.esm.js.map +0 -1
  441. package/dist/core/le-kit/le-string-input.entry.esm.js.map +0 -1
  442. package/dist/core/le-kit/le-text.entry.esm.js.map +0 -1
  443. package/dist/core/le-kit/le-turntable.entry.esm.js.map +0 -1
  444. package/dist/core/le-kit/loader.esm.js.map +0 -1
  445. package/dist/core/le-kit/p--VxUdzYV.js.map +0 -1
  446. package/dist/core/le-kit/p-189cb775.entry.js +0 -2
  447. package/dist/core/le-kit/p-189cb775.entry.js.map +0 -1
  448. package/dist/core/le-kit/p-35c1d413.entry.js +0 -2
  449. package/dist/core/le-kit/p-35c1d413.entry.js.map +0 -1
  450. package/dist/core/le-kit/p-4f133e72.entry.js.map +0 -1
  451. package/dist/core/le-kit/p-55f70091.entry.js.map +0 -1
  452. package/dist/core/le-kit/p-5fd7b23a.entry.js +0 -2
  453. package/dist/core/le-kit/p-5fd7b23a.entry.js.map +0 -1
  454. package/dist/core/le-kit/p-6e414a5c.entry.js.map +0 -1
  455. package/dist/core/le-kit/p-7b121ca7.entry.js +0 -2
  456. package/dist/core/le-kit/p-7b121ca7.entry.js.map +0 -1
  457. package/dist/core/le-kit/p-8c81fa95.entry.js +0 -2
  458. package/dist/core/le-kit/p-8c81fa95.entry.js.map +0 -1
  459. package/dist/core/le-kit/p-9aa81442.entry.js +0 -2
  460. package/dist/core/le-kit/p-9aa81442.entry.js.map +0 -1
  461. package/dist/core/le-kit/p-SKsXnjWI.js +0 -3
  462. package/dist/core/le-kit/p-SKsXnjWI.js.map +0 -1
  463. package/dist/core/le-kit/p-a9d05ef6.entry.js.map +0 -1
  464. package/dist/core/le-kit/p-b2bd2a80.entry.js +0 -2
  465. package/dist/core/le-kit/p-b2bd2a80.entry.js.map +0 -1
  466. package/dist/core/le-kit/p-ccac9611.entry.js +0 -2
  467. package/dist/core/le-kit/p-ccac9611.entry.js.map +0 -1
  468. package/dist/core/loader/cdn.js +0 -1
  469. package/dist/core/loader/index.cjs.js +0 -1
  470. package/dist/core/loader/index.d.ts +0 -24
  471. package/dist/core/loader/index.es2017.js +0 -1
  472. package/dist/core/loader/index.js +0 -2
  473. package/dist/core/types/components/le-box/le-box.d.ts +0 -111
  474. package/dist/core/types/components/le-button/le-button.d.ts +0 -78
  475. package/dist/core/types/components/le-card/le-card.d.ts +0 -37
  476. package/dist/core/types/components/le-checkbox/le-checkbox.d.ts +0 -46
  477. package/dist/core/types/components/le-number-input/le-number-input.d.ts +0 -106
  478. package/dist/core/types/components/le-popover/le-popover.d.ts +0 -109
  479. package/dist/core/types/components/le-popup/le-popup.api.d.ts +0 -73
  480. package/dist/core/types/components/le-popup/le-popup.d.ts +0 -122
  481. package/dist/core/types/components/le-round-progress/le-round-progress.d.ts +0 -37
  482. package/dist/core/types/components/le-stack/le-stack.d.ts +0 -73
  483. package/dist/core/types/components/le-string-input/le-string-input.d.ts +0 -83
  484. package/dist/core/types/components/le-text/le-text.d.ts +0 -141
  485. package/dist/core/types/components/le-turntable/le-turntable.d.ts +0 -55
  486. package/dist/core/types/components.d.ts +0 -1752
  487. package/dist/core/types/global/app.d.ts +0 -73
  488. package/dist/core/types/index.d.ts +0 -15
  489. package/dist/core/types/stencil-public-runtime.d.ts +0 -1756
  490. package/dist/core/types/types/blocks.d.ts +0 -136
  491. package/dist/core/types/types/options.d.ts +0 -124
  492. package/dist/core/types/utils/utils.d.ts +0 -54
  493. package/dist/le-kit/index-CAY3Hk_i.js +0 -4559
  494. package/dist/le-kit/index-CAY3Hk_i.js.map +0 -1
  495. package/dist/le-kit/le-button.entry.esm.js.map +0 -1
  496. package/dist/le-kit/le-button.entry.js +0 -90
  497. package/dist/le-kit/le-checkbox.entry.esm.js.map +0 -1
  498. package/dist/le-kit/le-checkbox.entry.js +0 -59
  499. package/dist/le-kit/le-component.entry.esm.js.map +0 -1
  500. package/dist/le-kit/le-popover.entry.esm.js.map +0 -1
  501. package/dist/le-kit/le-popover.entry.js +0 -346
  502. package/dist/le-kit/le-popup.entry.esm.js.map +0 -1
  503. package/dist/le-kit/le-popup.entry.js +0 -210
  504. package/dist/le-kit/le-round-progress.entry.js +0 -104
  505. package/dist/le-kit/le-slot.entry.esm.js.map +0 -1
  506. package/dist/le-kit/le-string-input.entry.esm.js.map +0 -1
  507. package/dist/le-kit/le-string-input.entry.js +0 -93
  508. package/dist/le-kit/le-turntable.entry.js +0 -137
  509. /package/dist/{core/cjs → cjs}/le-kit.cjs.js.map +0 -0
  510. /package/dist/{core/cjs → cjs}/loader.cjs.js.map +0 -0
  511. /package/dist/{core/collection → collection}/components/le-box/le-box.default.css +0 -0
  512. /package/dist/{core/collection → collection}/components/le-checkbox/le-checkbox.css +0 -0
  513. /package/dist/{core/collection → collection}/components/le-number-input/le-number-input.css +0 -0
  514. /package/dist/{core/collection → collection}/components/le-popup/le-popup.css +0 -0
  515. /package/dist/{core/collection → collection}/components/le-round-progress/le-round-progress.css +0 -0
  516. /package/dist/{core/collection → collection}/components/le-stack/le-stack.default.css +0 -0
  517. /package/dist/{core/collection → collection}/components/le-text/le-text.default.css +0 -0
  518. /package/dist/{core/collection → collection}/components/le-turntable/le-turntable.css +0 -0
  519. /package/dist/{core/collection → collection}/global/app.js +0 -0
  520. /package/dist/{core/collection → collection}/index.js +0 -0
  521. /package/dist/{core/collection → collection}/types/blocks.js +0 -0
  522. /package/dist/{core/collection → collection}/types/options.js +0 -0
  523. /package/dist/{core/collection → collection}/utils/utils.js +0 -0
  524. /package/dist/{core/components → components}/le-button.js.map +0 -0
  525. /package/dist/{core/components → components}/le-checkbox.js.map +0 -0
  526. /package/dist/{core/components → components}/le-component.js.map +0 -0
  527. /package/dist/{core/components → components}/le-popover.js +0 -0
  528. /package/dist/{core/components → components}/le-popover.js.map +0 -0
  529. /package/dist/{core/components → components}/le-round-progress.js.map +0 -0
  530. /package/dist/{core/components → components}/le-slot.js.map +0 -0
  531. /package/dist/{core/components → components}/le-string-input.js.map +0 -0
  532. /package/dist/{core/components → components}/le-turntable.js.map +0 -0
  533. /package/dist/{core/components → components}/utils.js +0 -0
  534. /package/dist/{core/components → components}/utils.js.map +0 -0
  535. /package/dist/{core/esm → esm}/le-kit.js.map +0 -0
  536. /package/dist/{core/esm → esm}/loader.js.map +0 -0
  537. /package/dist/{core/index.cjs.js → index.cjs.js} +0 -0
  538. /package/dist/{core/index.js → index.js} +0 -0
@@ -0,0 +1,1444 @@
1
+ import { r as registerInstance, d as createEvent, c as getElement, h, F as Fragment, e as getAssetPath, H as Host, f as getLeKitConfig } from './index-DzgCnDLJ.js';
2
+ import { c as classnames, o as observeModeChanges } from './utils-Dp5xFMCl.js';
3
+ import { leConfirm } from './index.js';
4
+
5
+ const leButtonCss = ":host{display:inline-block;--le-button-border-radius:var(--le-radius-md);--le-button-padding-x:var(--le-spacing-3);--le-button-padding-y:var(--le-spacing-1);--le-button-padding:var(--le-button-padding-y) var(--le-button-padding-x);--le-button-small-padding:0.25rem;--le-button-font-size:var(--le-font-size-md);--le-button-font-weight:var(--le-font-weight-medium);--le-button-transition:var(--le-transition-fast);--le-transition-easing:ease-in-out;--le-button-icon-aspect-ratio:1;--le-button-color:var(--le-color-primary-contrast);--_btn-bg:var(--le-color-primary);--_btn-bg-hover:var(--le-color-primary-dark);--_btn-bg-system:var(--le-color-black);--_btn-color:var(--le-button-color);--_btn-border-color:var(--le-color-primary)}:host([full-width]){display:block;width:100%}.le-button-container{display:inline-flex;flex-direction:row;align-items:center;justify-content:center;gap:var(--le-spacing-3);width:100%;padding:var(--le-button-padding);border:1px solid var(--_btn-border-color);border-radius:var(--le-button-border-radius);background:var(--_btn-bg);color:var(--_btn-color);font-family:var(--le-font-family-base);font-size:var(--le-button-font-size);font-weight:var(--le-button-font-weight);line-height:var(--le-line-height-tight);text-decoration:none;cursor:pointer;transition:background-color var(--le-button-transition) var(--le-transition-easing),\n border-color var(--le-button-transition) var(--le-transition-easing),\n box-shadow var(--le-button-transition) var(--le-transition-easing),\n transform var(--le-button-transition) var(--le-transition-easing)}.le-button-container:hover:not(:disabled){background:var(--_btn-bg-hover);border-color:var(--_btn-bg-hover)}.le-button-container:active:not(:disabled){box-shadow:inset 0 0 6px var(--le-color-shadow)}.le-button-container:focus-visible{outline:2px solid var(--le-color-focus);outline-offset:2px}.le-button-container:disabled{opacity:0.5;cursor:not-allowed}.le-button-label{display:inline-flex;flex-direction:row;align-items:center;justify-content:center;gap:var(--le-spacing-2)}:host>le-component.color-primary{--_btn-bg:var(--le-color-primary);--_btn-bg-hover:var(--le-color-primary-dark);--_btn-color:var(--le-button-color);--_btn-border-color:var(--le-color-primary)}:host>le-component.color-secondary{--_btn-bg:var(--le-color-secondary);--_btn-bg-hover:var(--le-color-secondary-dark);--_btn-color:var(--le-color-secondary-contrast);--_btn-border-color:var(--le-color-secondary)}:host>le-component.color-success{--_btn-bg:var(--le-color-success);--_btn-bg-hover:var(--le-color-success-dark);--_btn-color:var(--le-color-success-contrast);--_btn-border-color:var(--le-color-success)}:host>le-component.color-warning{--_btn-bg:var(--le-color-warning);--_btn-bg-hover:var(--le-color-warning-dark);--_btn-color:var(--le-color-warning-contrast);--_btn-border-color:var(--le-color-warning)}:host>le-component.color-danger{--_btn-bg:var(--le-color-danger);--_btn-bg-hover:var(--le-color-danger-dark);--_btn-color:var(--le-color-danger-contrast);--_btn-border-color:var(--le-color-danger)}:host>le-component.color-info{--_btn-bg:var(--le-color-info);--_btn-bg-hover:var(--le-color-info-dark);--_btn-color:var(--le-color-info-contrast);--_btn-border-color:var(--le-color-info)}:host>le-component.variant-solid .le-button-container{box-shadow:var(--le-shadow-sm)}:host>le-component.variant-solid .le-button-container:hover:not(:disabled){box-shadow:var(--le-shadow-md)}:host>le-component.variant-outlined .le-button-container{background:transparent;color:var(--_btn-bg);border-color:color-mix(in srgb, var(--_btn-border-color) 33%, transparent)}:host>le-component.variant-outlined .le-button-container:hover:not(:disabled){border-color:var(--_btn-border-color)}:host>le-component.variant-clear .le-button-container{background:transparent;color:var(--_btn-bg);border-color:transparent}:host>le-component.variant-clear .le-button-container:hover:not(:disabled){background:var(--le-color-gray-100);border-color:transparent}:host>le-component.variant-system .le-button-container{background:transparent;color:var(--_btn-bg-system);border-color:transparent}:host>le-component.size-small .le-button-container{--le-button-padding-x:0.4rem;--le-button-padding-y:0.3rem;--le-button-padding-top:0.35rem;--le-button-font-size:var(--le-button-small-font-size, var(--le-font-size-xs))}:host>le-component.size-large .le-button-container{--le-button-padding-x:0.9rem;--le-button-padding-y:0.6rem;--le-button-font-size:var(--le-font-size-xl)}:host>le-component.full-width{display:block;width:100%}:host>le-component.selected .le-button-container{box-shadow:inset 0 0 4px var(--le-color-shadow)}:host>le-component.variant-outlined.selected .le-button-container,:host>le-component.variant-clear.selected .le-button-container{background:var(--_btn-bg);color:var(--_btn-color)}:host>le-component.icon-only .le-button-container{padding:0.5rem;padding-bottom:0.6rem;aspect-ratio:var(--le-button-icon-aspect-ratio, 1)}:host>le-component.icon-only.size-small .le-button-container{padding:var(--le-button-small-padding, 0.25rem)}:host>le-component.icon-only.size-large .le-button-container{padding:0.75rem}:host>le-component.icon-only .content{display:none}.content{display:inline}.content:empty{display:none}.icon-start,.icon-only,.icon-end{display:flex;align-items:center;justify-content:center}.icon-start:empty,.icon-only:empty,.icon-end:empty{display:none}::slotted([slot=\"icon-start\"]),::slotted([slot=\"icon-only\"]),::slotted([slot=\"icon-end\"]){display:flex;align-items:center;justify-content:center;width:1.125em;height:1.125em}.le-button-align-start{justify-content:flex-start}.le-button-align-center{justify-content:center}.le-button-align-space-between{justify-content:space-between}.le-button-align-end{justify-content:flex-end}";
6
+
7
+ const LeButton = class {
8
+ constructor(hostRef) {
9
+ registerInstance(this, hostRef);
10
+ this.leClick = createEvent(this, "click");
11
+ }
12
+ get el() { return getElement(this); }
13
+ /**
14
+ * Mode of the popover should be 'default' for internal use
15
+ */
16
+ mode;
17
+ /**
18
+ * Button variant style
19
+ * @allowedValues solid | outlined | clear
20
+ */
21
+ variant = 'solid';
22
+ /**
23
+ * Button color theme (uses theme semantic colors)
24
+ * @allowedValues primary | secondary | success | warning | danger | info
25
+ */
26
+ color = 'primary';
27
+ /**
28
+ * Button size
29
+ * @allowedValues small | medium | large
30
+ */
31
+ size = 'medium';
32
+ /**
33
+ * Whether the button is in a selected/active state
34
+ */
35
+ selected = false;
36
+ /**
37
+ * Whether the button takes full width of its container
38
+ */
39
+ fullWidth = false;
40
+ /**
41
+ * Icon only button image or emoji
42
+ * if this prop is set, the button will render only the icon slot
43
+ */
44
+ iconOnly;
45
+ /**
46
+ * Start icon image or emoji
47
+ */
48
+ iconStart;
49
+ /**
50
+ * End icon image or emoji
51
+ */
52
+ iconEnd;
53
+ /**
54
+ * Whether the button is disabled
55
+ */
56
+ disabled = false;
57
+ /**
58
+ * The button type attribute
59
+ * @allowedValues button | submit | reset
60
+ */
61
+ type = 'button';
62
+ /**
63
+ * Optional href to make the button act as a link
64
+ */
65
+ href;
66
+ /**
67
+ * Link target when href is set
68
+ */
69
+ target;
70
+ /**
71
+ * Alignment of the button label without the end icon
72
+ * @allowedValues start | center | space-between | end
73
+ */
74
+ align = 'center';
75
+ /**
76
+ * Emitted when the button is clicked.
77
+ * This is a custom event that wraps the native click but ensures the target is the le-button.
78
+ */
79
+ leClick;
80
+ handleClick = (event) => {
81
+ // We stop the internal button click from bubbling up
82
+ event.stopPropagation();
83
+ if (this.disabled) {
84
+ event.preventDefault();
85
+ return;
86
+ }
87
+ // And emit our own click event from the host element
88
+ this.leClick.emit(event);
89
+ };
90
+ render() {
91
+ const classes = classnames(`variant-${this.variant}`, `color-${this.color}`, `size-${this.size}`, {
92
+ 'selected': this.selected,
93
+ 'full-width': this.fullWidth,
94
+ 'icon-only': this.iconOnly,
95
+ 'disabled': this.disabled,
96
+ });
97
+ const TagType = this.href ? 'a' : 'button';
98
+ const attrs = this.href ? { href: this.href, target: this.target, role: 'button' } : { type: this.type, disabled: this.disabled };
99
+ return (h("le-component", { key: 'bf247365c4ceeaccdb05cbbb17604265f1608fa4', component: "le-button", hostClass: classes }, h(TagType, { key: 'a01540b86ace35d55b5635e2e5ce1049f480a788', class: classnames('le-button-container', `le-button-align-${this.align}`), part: "button", ...attrs, onClick: this.handleClick }, this.iconOnly !== undefined ? (h("slot", { name: "icon-only" }, typeof this.iconOnly === 'string' ? this.iconOnly : null)) : (h(Fragment, null, h("span", { class: "le-button-label" }, this.iconStart && (h("span", { class: "icon-start", part: "icon-start" }, this.iconStart)), h("le-slot", { name: "", description: "Button text", type: "text", class: "content", part: "content" }, h("slot", null))), this.iconEnd && (h("span", { class: "icon-end", part: "icon-end" }, this.iconEnd)))))));
100
+ }
101
+ };
102
+ LeButton.style = leButtonCss;
103
+
104
+ const leCheckboxCss = ":host{display:block;--le-checkbox-size:18px;--le-checkbox-color:var(--le-color-primary, #007bff);--le-checkbox-label-color:var(--le-color-text-primary, #333);--le-checkbox-desc-color:var(--le-color-text-secondary, #666);--le-checkbox-border-radius:var(--le-radius-sm, 2px);--le-checkbox-marker-color:var(--le-color-surface, #fff)}.le-checkbox-wrapper{display:flex;flex-direction:column;gap:4px}.le-checkbox-label{display:inline-flex;align-items:flex-start;gap:8px;cursor:pointer;user-select:none}:host([disabled]) .le-checkbox-label{cursor:not-allowed;opacity:0.6}.le-checkbox-input{display:flex;align-items:center;justify-content:center;min-height:1.4em}input[type=\"checkbox\"]{appearance:none;-webkit-appearance:none;width:var(--le-checkbox-size);height:var(--le-checkbox-size);border:var(--le-border-width, 2px) solid var(--le-checkbox-color);border-radius:var(--le-checkbox-border-radius);margin:0;margin-top:2px;position:relative;cursor:inherit;background-color:transparent;transition:background-color 0.2s, border-color 0.2s}input[type=\"checkbox\"]:checked{background-color:var(--le-checkbox-color)}input[type=\"checkbox\"]:checked::after{content:'';position:absolute;left:0;top:0;bottom:calc(var(--le-checkbox-size) / 5);right:0;margin:auto;width:calc(var(--le-checkbox-size) / 4);height:calc(var(--le-checkbox-size) / 2);border:solid var(--le-checkbox-marker-color, #fff);border-width:0 calc(var(--le-checkbox-size) / 10) calc(var(--le-checkbox-size) / 10) 0;transform:rotate(45deg)}input[type=\"checkbox\"]:focus-visible{outline:2px solid var(--le-color-focus);outline-offset:2px}.le-checkbox-text{flex:1;flex-wrap:wrap;color:var(--le-checkbox-label-color);line-height:1.5;text-align:start}.le-checkbox-description{margin-left:calc(var(--le-checkbox-size) + 8px);font-size:0.875em;color:var(--le-checkbox-desc-color);line-height:1.4}:host [slot=\"description\"]{margin:0}";
105
+
106
+ const LeCheckbox = class {
107
+ constructor(hostRef) {
108
+ registerInstance(this, hostRef);
109
+ this.leChange = createEvent(this, "change");
110
+ }
111
+ get el() { return getElement(this); }
112
+ /**
113
+ * Whether the checkbox is checked
114
+ */
115
+ checked = false;
116
+ /**
117
+ * Whether the checkbox is disabled
118
+ */
119
+ disabled = false;
120
+ /**
121
+ * The name of the checkbox input
122
+ */
123
+ name;
124
+ /**
125
+ * The value of the checkbox input
126
+ */
127
+ value;
128
+ /**
129
+ * External ID for linking with external systems (e.g. database ID, PDF form field ID)
130
+ */
131
+ externalId;
132
+ /**
133
+ * Emitted when the checked state changes
134
+ */
135
+ leChange;
136
+ handleChange = (event) => {
137
+ // We stop the internal button click from bubbling up
138
+ event.stopPropagation();
139
+ if (this.disabled) {
140
+ event.preventDefault();
141
+ return;
142
+ }
143
+ const input = event.target;
144
+ this.checked = input.checked;
145
+ this.leChange.emit({
146
+ checked: this.checked,
147
+ value: this.value,
148
+ name: this.name,
149
+ externalId: this.externalId
150
+ });
151
+ };
152
+ render() {
153
+ return (h("le-component", { key: '43399929e07835e0019d509803e50a151921fa72', component: "le-checkbox", hostClass: classnames({ 'disabled': this.disabled }) }, h("div", { key: '7ddbf2ac1690bb09082adfea70b9767c972d007a', class: "le-checkbox-wrapper" }, h("label", { key: '8eec4055c713e8b3b155695751b10bff64c9f903', class: "le-checkbox-label" }, h("span", { key: '2118b1cbe7911ff1674e522d723949d81cade185', class: "le-checkbox-input" }, h("input", { key: 'd0a30af5c14497fa6fa294c07ba74ae2e032481f', type: "checkbox", name: this.name, value: this.value, checked: this.checked, disabled: this.disabled, onChange: this.handleChange })), h("span", { key: '02cf9588431240039a53ee50e02b08ba5d63b974', class: "le-checkbox-text" }, h("le-slot", { key: 'e7d7b253deab72e627164eb72fc06109abfca6a5', name: "", type: "text", tag: "span" }, h("slot", { key: '1d8c443073e48848513a8a6d04cd7805a394e54e' })))), h("div", { key: '16c2c927dc0c0f7844a203a0628bf0e561009bd0', class: "le-checkbox-description" }, h("le-slot", { key: 'c6898ecc8992dce4786e68ab4b136bf5c3a4d3aa', name: "description", type: "text", tag: "div", label: "Description" }, h("slot", { key: '3342add8ed1400ab74681e445163eeb3dd415941', name: "description" }))))));
154
+ }
155
+ };
156
+ LeCheckbox.style = leCheckboxCss;
157
+
158
+ const leComponentCss = ":host{display:contents}:host(.admin-mode){display:block}.le-component-wrapper{position:relative;border:2px dashed var(--le-admin-border-color, #90caf9);border-radius:var(--le-radius-md, 8px);background:var(--le-admin-bg, rgba(144, 202, 249, 0.05));transition:border-color 0.2s ease, box-shadow 0.2s ease}.le-component-wrapper:hover{border-color:var(--le-admin-border-hover, #42a5f5);box-shadow:0 0 0 2px var(--le-admin-glow, rgba(66, 165, 245, 0.2))}.le-component-header{display:flex;align-items:center;justify-content:space-between;gap:var(--le-spacing-1, 4px);padding:0 0 0 var(--le-spacing-1, 4px);background:var(--le-admin-header-bg, rgba(144, 202, 249, 0.15));border-bottom:1px solid var(--le-admin-border-color, #90caf9);border-radius:var(--le-radius-md, 8px) var(--le-radius-md, 8px) 0 0;font-size:var(--le-font-size-xs, 11px)}.le-component-name{font-weight:var(--le-font-weight-medium, 500);color:var(--le-admin-text, #1976d2);text-transform:capitalize;text-align:start;overflow:hidden;width:0;flex:1 1 0%}.le-component-content{padding:var(--le-space-xs, 4px)}.le-component-trigger{font-size:24px;line-height:0px;width:12px;height:12px}.le-component-button{width:20px}.property-editor{display:flex;flex-direction:column;gap:var(--le-space-sm, 8px);max-width:380px}.property-field{display:flex;flex-direction:column;gap:var(--le-space-xs, 4px)}.property-field label{display:flex;flex-direction:column;gap:2px;font-size:var(--le-font-size-sm, 13px);font-weight:var(--le-font-weight-medium, 500);color:var(--le-color-text, #333)}.property-hint{font-size:var(--le-font-size-xs, 11px);font-weight:normal;color:var(--le-color-text-secondary, #666);line-height:1.3}.property-field input[type=\"text\"],.property-field input[type=\"number\"],.property-field select{padding:var(--le-space-xs, 4px) var(--le-space-sm, 8px);border:1px solid var(--le-color-border, #ddd);border-radius:var(--le-radius-md, 7px);font-size:var(--le-font-size-sm, 13px);font-family:inherit;background:var(--le-color-surface, #fff);color:var(--le-color-text, #333);transition:border-color 0.15s ease, box-shadow 0.15s ease}.property-field input:focus,.property-field select:focus{outline:none;border-color:var(--le-color-primary, #1976d2);box-shadow:0 0 0 2px var(--le-color-primary-light, rgba(25, 118, 210, 0.2))}.property-field--checkbox{flex-direction:column}.property-field--checkbox label{flex-direction:row;align-items:center;gap:var(--le-space-sm, 8px);cursor:pointer}.property-field--checkbox input[type=\"checkbox\"]{width:16px;height:16px;margin:0;cursor:pointer;accent-color:var(--le-color-primary, #1976d2)}.property-field--checkbox .property-hint{margin-left:24px}.no-properties{margin:0;padding:var(--le-space-sm, 8px);font-size:var(--le-font-size-sm, 13px);color:var(--le-color-text-secondary, #666);text-align:center}.property-editor-container{display:flex;flex-direction:column;gap:var(--le-space-md, 12px)}.property-editor-actions{padding-top:var(--le-space-sm, 8px);border-top:1px solid var(--le-color-border, #e5e5e5)}.delete-component-btn{display:flex;align-items:center;justify-content:center;gap:var(--le-space-xs, 4px);width:100%;padding:var(--le-space-sm, 8px) var(--le-space-md, 12px);border:1px solid var(--le-color-danger, #e53935);border-radius:var(--le-radius-md, 6px);background:transparent;color:var(--le-color-danger, #e53935);font-size:var(--le-font-size-sm, 13px);font-weight:500;cursor:pointer;transition:background-color 0.15s, color 0.15s}.delete-component-btn:hover{background:var(--le-color-danger, #e53935);color:white}.delete-component-btn:active{opacity:0.9}";
159
+
160
+ const LeComponent = class {
161
+ constructor(hostRef) {
162
+ registerInstance(this, hostRef);
163
+ }
164
+ get el() { return getElement(this); }
165
+ /**
166
+ * The tag name of the component (e.g., 'le-card').
167
+ * Used to look up property metadata and display the component name.
168
+ */
169
+ component;
170
+ /**
171
+ * Optional display name for the component.
172
+ * If not provided, the tag name will be formatted as the display name.
173
+ */
174
+ displayName;
175
+ /**
176
+ * Classes to apply to the host element.
177
+ * Allows parent components to pass their styling classes.
178
+ */
179
+ hostClass;
180
+ /**
181
+ * Inline styles to apply to the host element.
182
+ * Allows parent components to pass dynamic styles (e.g., flex properties).
183
+ */
184
+ hostStyle;
185
+ /**
186
+ * Reference to the host element (found automatically from parent)
187
+ */
188
+ hostElement;
189
+ /**
190
+ * Internal state to track admin mode
191
+ */
192
+ adminMode = false;
193
+ /**
194
+ * Component metadata loaded from Custom Elements Manifest
195
+ */
196
+ componentMeta = null;
197
+ /**
198
+ * Current property values of the host component
199
+ */
200
+ propertyValues = {};
201
+ disconnectModeObserver;
202
+ connectedCallback() {
203
+ // Find the host element - le-component is rendered inside the component's shadow DOM,
204
+ // so we need to find the shadow root's host element
205
+ this.findHostElement();
206
+ this.disconnectModeObserver = observeModeChanges(this.el, mode => {
207
+ this.adminMode = mode === 'admin';
208
+ // Load metadata and refresh property values only when entering admin mode
209
+ if (this.adminMode) {
210
+ if (!this.componentMeta) {
211
+ this.loadComponentMetadata();
212
+ }
213
+ else {
214
+ this.readPropertyValues();
215
+ }
216
+ }
217
+ });
218
+ }
219
+ /**
220
+ * Find the host element by traversing up through shadow DOM
221
+ */
222
+ findHostElement() {
223
+ // Get the shadow root that contains this le-component
224
+ const rootNode = this.el.getRootNode();
225
+ if (rootNode instanceof ShadowRoot) {
226
+ // The host of this shadow root is our target component (e.g., le-card)
227
+ this.hostElement = rootNode.host;
228
+ }
229
+ }
230
+ componentDidLoad() {
231
+ // Read initial property values from the host element
232
+ this.readPropertyValues();
233
+ }
234
+ disconnectedCallback() {
235
+ this.disconnectModeObserver?.();
236
+ }
237
+ /**
238
+ * Formats a tag name into a display name
239
+ * e.g., 'le-card' -> 'Card'
240
+ */
241
+ formatDisplayName(tagName) {
242
+ return tagName
243
+ .replace(/^le-/, '') // Remove 'le-' prefix
244
+ .split('-')
245
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
246
+ .join(' ');
247
+ }
248
+ /**
249
+ * Load component metadata from the Custom Elements Manifest
250
+ */
251
+ async loadComponentMetadata() {
252
+ try {
253
+ // Fetch the manifest from configured URL
254
+ const { manifestFile } = getLeKitConfig();
255
+ const manifestFileResolved = getAssetPath(`./assets/${manifestFile}`);
256
+ const response = await fetch(manifestFileResolved);
257
+ const manifest = await response.json();
258
+ // Find the component definition
259
+ for (const module of manifest.modules) {
260
+ for (const declaration of module.declarations || []) {
261
+ if (declaration.tagName === this.component) {
262
+ const attributes = (declaration.attributes || []).filter((attr) => !this.isInternalAttribute(attr.name));
263
+ this.componentMeta = {
264
+ tagName: declaration.tagName,
265
+ description: declaration.description,
266
+ attributes,
267
+ };
268
+ // console.log(`[le-component] Loaded metadata for ${this.component}:`, this.componentMeta);
269
+ // Read property values after metadata is loaded
270
+ this.readPropertyValues();
271
+ return;
272
+ }
273
+ }
274
+ }
275
+ // console.warn(`[le-component] No metadata found for component: ${this.component}`);
276
+ }
277
+ catch (error) {
278
+ // console.warn(`[le-component] Failed to load metadata for component: ${this.component}`, error);
279
+ }
280
+ }
281
+ /**
282
+ * Check if an attribute is internal (should not be shown in editor)
283
+ */
284
+ isInternalAttribute(name) {
285
+ const internalAttrs = ['mode', 'theme', 'class', 'style', 'id', 'slot'];
286
+ return internalAttrs.includes(name);
287
+ }
288
+ /**
289
+ * Read current property values from the host element
290
+ */
291
+ readPropertyValues() {
292
+ if (!this.hostElement || !this.componentMeta)
293
+ return;
294
+ const values = {};
295
+ for (const attr of this.componentMeta.attributes) {
296
+ const value = this.hostElement.getAttribute(attr.name);
297
+ values[attr.name] = this.parseAttributeValue(value, attr.type?.text);
298
+ }
299
+ this.propertyValues = values;
300
+ }
301
+ /**
302
+ * Parse an attribute value based on its type
303
+ */
304
+ parseAttributeValue(value, type) {
305
+ if (value === null)
306
+ return undefined;
307
+ if (type === 'boolean') {
308
+ return value !== null && value !== 'false';
309
+ }
310
+ if (type === 'number') {
311
+ return parseFloat(value);
312
+ }
313
+ return value;
314
+ }
315
+ /**
316
+ * Handle property value changes from the editor
317
+ */
318
+ handlePropertyChange(attrName, value, type) {
319
+ if (!this.hostElement)
320
+ return;
321
+ // Update the host element's attribute
322
+ if (type === 'boolean') {
323
+ if (value) {
324
+ this.hostElement.setAttribute(attrName, '');
325
+ }
326
+ else {
327
+ this.hostElement.removeAttribute(attrName);
328
+ }
329
+ }
330
+ else if (value === undefined || value === '') {
331
+ this.hostElement.removeAttribute(attrName);
332
+ }
333
+ else {
334
+ this.hostElement.setAttribute(attrName, String(value));
335
+ }
336
+ // Update local state
337
+ this.propertyValues = { ...this.propertyValues, [attrName]: value };
338
+ // update the host element the way the parent element mutation observer would catch it?
339
+ }
340
+ /**
341
+ * Delete this component from the DOM
342
+ */
343
+ deleteComponent() {
344
+ if (!this.hostElement)
345
+ return;
346
+ // Confirm deletion
347
+ const name = this.displayName || this.formatDisplayName(this.component);
348
+ if (!leConfirm(`Delete this ${name}?`))
349
+ return;
350
+ // Remove the host element from its parent
351
+ const parent = this.hostElement.parentElement;
352
+ if (parent) {
353
+ this.hostElement.remove();
354
+ }
355
+ }
356
+ /**
357
+ * Render the property editor form
358
+ */
359
+ renderPropertyEditor() {
360
+ const hasProperties = this.componentMeta && this.componentMeta.attributes.length > 0;
361
+ return (h("div", { class: "property-editor-container" }, hasProperties ? (h("form", { class: "property-editor", onSubmit: e => e.preventDefault() }, this.componentMeta.attributes.map(attr => this.renderPropertyField(attr)))) : (h("p", { class: "no-properties" }, "No editable properties")), h("div", { class: "property-editor-actions" }, h("le-button", { type: "button", variant: "outlined", color: "danger", "full-width": true, onClick: () => this.deleteComponent() }, h("span", { slot: "icon-start" }, "\uD83D\uDDD1\uFE0F"), h("span", null, "Delete Component")))));
362
+ }
363
+ /**
364
+ * Render a single property field based on its type
365
+ */
366
+ renderPropertyField(attr) {
367
+ const value = this.propertyValues[attr.name];
368
+ const type = attr.type?.text || 'string';
369
+ // Check if type is a union of string literals (e.g., "'default' | 'outlined' | 'elevated'")
370
+ const enumMatch = type.match(/^'[^']+'/);
371
+ if (enumMatch) {
372
+ const options = type.split('|').map(opt => opt.trim().replace(/'/g, ''));
373
+ return (h("div", { class: "property-field" }, h("label", { htmlFor: `prop-${attr.name}` }, attr.name, attr.description && h("span", { class: "property-hint" }, attr.description)), h("select", { id: `prop-${attr.name}`, onChange: e => this.handlePropertyChange(attr.name, e.target.value, type) }, options.map(opt => (h("option", { value: opt, selected: value === opt || (!value && attr.default?.replace(/'/g, '') === opt) }, opt))))));
374
+ }
375
+ // Boolean type
376
+ if (type === 'boolean') {
377
+ return (h("div", { class: "property-field property-field--checkbox" }, h("le-checkbox", { name: `prop-${attr.name}`, checked: value === true || value === '', onChange: e => this.handlePropertyChange(attr.name, e.target.checked, type) }, attr.name, attr.description && h("div", { slot: "description" }, attr.description))));
378
+ }
379
+ // Number type
380
+ if (type === 'number') {
381
+ return (h("div", { class: "property-field" }, h("label", { htmlFor: `prop-${attr.name}` }, attr.name, attr.description && h("span", { class: "property-hint" }, attr.description)), h("input", { type: "number", id: `prop-${attr.name}`, value: value ?? '', placeholder: attr.default, onChange: e => this.handlePropertyChange(attr.name, e.target.value, type) })));
382
+ }
383
+ // Default: string/text input
384
+ return (h("div", { class: "property-field" }, h("le-string-input", { name: `prop-${attr.name}`, label: attr.name, value: value ?? '', placeholder: attr.default?.replace(/'/g, ''), onChange: (e) => this.handlePropertyChange(attr.name, e.detail.value, type) }, h("span", { slot: "description" }, attr.description))));
385
+ }
386
+ render() {
387
+ const name = this.displayName || this.formatDisplayName(this.component);
388
+ // In default mode, just pass through content with host classes
389
+ if (!this.adminMode) {
390
+ return (h(Host, { class: classnames(this.component, this.hostClass), style: this.hostStyle }, h("slot", null)));
391
+ }
392
+ // In admin mode, show wrapper with header and settings
393
+ return (h(Host, { class: classnames(this.component, this.hostClass, 'admin-mode'), style: this.hostStyle }, h("div", { class: "le-component-wrapper" }, h("div", { class: "le-component-header" }, h("span", { class: "le-component-name" }, name), h("le-popover", { popoverTitle: `${name} Settings`, position: "right", align: "start", "min-width": "300px", mode: "default" }, h("le-button", { type: "button", class: "le-component-button", slot: "trigger", variant: "clear", size: "small", "aria-label": "Edit component properties", "icon-only": true }, h("span", { class: "le-component-trigger", slot: "icon-only" }, "\u2699")), this.renderPropertyEditor())), h("div", { class: "le-component-content" }, h("slot", null)))));
394
+ }
395
+ static get assetsDirs() { return ["assets"]; }
396
+ };
397
+ LeComponent.style = leComponentCss;
398
+
399
+ const lePopoverCss = "/* ============================================\n le-popover.css\n Popover using native HTML Popover API\n ============================================ */\n\n:host {\n display: inline-block;\n position: relative;\n}\n\n:host([trigger-full-width]) {\n display: block;\n width: 100%;\n}\n\n/* ============================================\n Trigger\n ============================================ */\n\n.le-popover-trigger {\n display: inline-flex;\n cursor: pointer;\n}\n\n.le-popover-trigger-full-width {\n display: flex;\n width: 100%;\n}\n\n.le-popover-default-trigger {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: 1px solid var(--le-color-border, #e0e0e0);\n border-radius: var(--le-radius-md, 6px);\n background: var(--le-color-surface, #fff);\n color: var(--le-color-text-secondary, #666);\n font-size: 16px;\n cursor: pointer;\n transition: all var(--le-transition-fast, 0.15s ease);\n}\n\n.le-popover-default-trigger:hover {\n border-color: var(--le-color-primary, #2196f3);\n color: var(--le-color-primary, #2196f3);\n background: var(--le-color-primary-light, rgba(33, 150, 243, 0.1));\n}\n\n/* ============================================\n Popover Content (native popover)\n ============================================ */\n\n.le-popover-content {\n /* Reset native popover defaults */\n margin: 0;\n padding: 0;\n border: none;\n background: transparent;\n \n /* Positioning - will be set via JS */\n position: fixed;\n inset: unset;\n \n /* Styling */\n background: var(--le-color-surface, #ffffff);\n border: 1px solid var(--le-color-border, #e0e0e0);\n border-radius: var(--le-radius-lg, 8px);\n box-shadow: var(--le-shadow-lg, 0 4px 12px rgba(0, 0, 0, 0.15));\n overflow: hidden;\n font-family: var(--le-font-family, system-ui, -apple-system, sans-serif);\n font-size: var(--le-font-size-sm, 0.875rem);\n color: var(--le-color-text, #333);\n \n /* Animation */\n opacity: 0;\n transform: scale(0.95);\n transition: opacity 0.15s ease, transform 0.15s ease, display 0.15s ease allow-discrete;\n}\n\n/* When popover is open */\n.le-popover-content:popover-open {\n opacity: 1;\n transform: scale(1);\n}\n\n/* Starting style for animation (CSS Anchor Positioning spec) */\n@starting-style {\n .le-popover-content:popover-open {\n opacity: 0;\n transform: scale(0.95);\n }\n}\n\n/* ============================================\n Header\n ============================================ */\n\n.le-popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--le-space-xs, 4px) var(--le-space-xs, 4px) var(--le-space-xs, 4px) var(--le-space-sm, 8px);\n border-bottom: 1px solid var(--le-color-border, #e0e0e0);\n background: var(--le-color-surface-alt, #f9f9f9);\n min-height: 32px;\n}\n\n.le-popover-title {\n font-weight: var(--le-font-weight-semibold, 600);\n font-size: var(--le-font-size-sm, 0.875rem);\n color: var(--le-color-text, #333);\n}\n\n.le-popover-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: none;\n background: transparent;\n color: var(--le-color-text-secondary, #666);\n font-size: 18px;\n line-height: 1;\n cursor: pointer;\n border-radius: var(--le-radius-sm, 4px);\n transition: background-color 0.15s, color 0.15s;\n}\n\n.le-popover-close:hover {\n background: var(--le-color-surface-hover, rgba(0, 0, 0, 0.05));\n color: var(--le-color-text, #333);\n}\n\n/* ============================================\n Body\n ============================================ */\n\n.le-popover-body {\n padding: var(--le-space-md, 12px);\n}\n\n/* ============================================\n Scrollable content\n ============================================ */\n\n.le-popover-content[style*=\"overflow-y: auto\"] .le-popover-body {\n overflow-y: auto;\n}\n";
400
+
401
+ const LePopover = class {
402
+ constructor(hostRef) {
403
+ registerInstance(this, hostRef);
404
+ this.lePopoverOpen = createEvent(this, "lePopoverOpen");
405
+ this.lePopoverClose = createEvent(this, "lePopoverClose");
406
+ }
407
+ get el() { return getElement(this); }
408
+ /**
409
+ * Mode of the popover should be 'default' for internal use
410
+ */
411
+ mode;
412
+ /**
413
+ * Whether the popover is currently open
414
+ */
415
+ open = false;
416
+ /**
417
+ * Position of the popover relative to its trigger
418
+ */
419
+ position = 'bottom';
420
+ /**
421
+ * Alignment of the popover
422
+ */
423
+ align = 'start';
424
+ /**
425
+ * Optional title for the popover header
426
+ */
427
+ popoverTitle;
428
+ /**
429
+ * Whether to show a close button in the header
430
+ */
431
+ showClose = true;
432
+ /**
433
+ * Whether clicking outside closes the popover
434
+ */
435
+ closeOnClickOutside = true;
436
+ /**
437
+ * Whether pressing Escape closes the popover
438
+ */
439
+ closeOnEscape = true;
440
+ /**
441
+ * Offset from the trigger element (in pixels)
442
+ */
443
+ offset = 8;
444
+ /**
445
+ * Fixed width for the popover (e.g., '300px', '20rem')
446
+ */
447
+ width;
448
+ /**
449
+ * Minimum width for the popover (e.g., '200px', '15rem')
450
+ */
451
+ minWidth = '200px';
452
+ /**
453
+ * Maximum width for the popover (e.g., '400px', '25rem')
454
+ */
455
+ maxWidth;
456
+ /**
457
+ * Should the popover's trigger take full width of its container
458
+ */
459
+ triggerFullWidth = false;
460
+ /**
461
+ * Emitted when the popover opens
462
+ */
463
+ lePopoverOpen;
464
+ /**
465
+ * Emitted when the popover closes
466
+ */
467
+ lePopoverClose;
468
+ /**
469
+ * Method to update the popover position from a parent component
470
+ */
471
+ async updatePosition() {
472
+ this._updatePosition();
473
+ }
474
+ isPositioned = false;
475
+ triggerEl;
476
+ popoverEl;
477
+ uniqueId = `le-popover-${Math.random().toString(36).substr(2, 9)}`;
478
+ scrollParents = [];
479
+ componentDidLoad() {
480
+ // Listen for toggle events from the native popover API
481
+ this.popoverEl?.addEventListener('toggle', this.handlePopoverToggle);
482
+ // Listen for other popovers opening to close this one
483
+ document.addEventListener('le-popover-will-open', this.handleOtherPopoverOpen);
484
+ }
485
+ disconnectedCallback() {
486
+ this.popoverEl?.removeEventListener('toggle', this.handlePopoverToggle);
487
+ document.removeEventListener('le-popover-will-open', this.handleOtherPopoverOpen);
488
+ this.removeScrollListeners();
489
+ }
490
+ /**
491
+ * Find all scrollable parent elements
492
+ */
493
+ getScrollParents(element) {
494
+ const scrollParents = [];
495
+ let parent = element.parentElement;
496
+ while (parent) {
497
+ const style = getComputedStyle(parent);
498
+ const overflow = style.overflow + style.overflowY + style.overflowX;
499
+ if (/(auto|scroll)/.test(overflow)) {
500
+ scrollParents.push(parent);
501
+ }
502
+ parent = parent.parentElement;
503
+ }
504
+ // Always include window for page scroll
505
+ return scrollParents;
506
+ }
507
+ /**
508
+ * Add scroll listeners to all scrollable parents
509
+ */
510
+ addScrollListeners() {
511
+ if (!this.triggerEl)
512
+ return;
513
+ this.scrollParents = this.getScrollParents(this.triggerEl);
514
+ // Listen to each scroll parent
515
+ this.scrollParents.forEach(parent => {
516
+ parent.addEventListener('scroll', this.handleScroll, { passive: true });
517
+ });
518
+ // Also listen to window scroll and resize
519
+ window.addEventListener('scroll', this.handleScroll, { passive: true });
520
+ window.addEventListener('resize', this.handleScroll, { passive: true });
521
+ }
522
+ /**
523
+ * Remove scroll listeners
524
+ */
525
+ removeScrollListeners() {
526
+ this.scrollParents.forEach(parent => {
527
+ parent.removeEventListener('scroll', this.handleScroll);
528
+ });
529
+ window.removeEventListener('scroll', this.handleScroll);
530
+ window.removeEventListener('resize', this.handleScroll);
531
+ this.scrollParents = [];
532
+ }
533
+ handleScroll = () => {
534
+ if (this.open) {
535
+ this._updatePosition();
536
+ }
537
+ };
538
+ handlePopoverToggle = (event) => {
539
+ if (event.newState === 'open') {
540
+ this.open = true;
541
+ this.addScrollListeners();
542
+ this._updatePosition();
543
+ this.lePopoverOpen.emit();
544
+ }
545
+ else {
546
+ this.open = false;
547
+ this.isPositioned = false;
548
+ this.removeScrollListeners();
549
+ this.lePopoverClose.emit();
550
+ }
551
+ };
552
+ handleOtherPopoverOpen = (event) => {
553
+ const customEvent = event;
554
+ if (customEvent.detail?.popover === this.el)
555
+ return;
556
+ if (this.open) {
557
+ this.hide();
558
+ }
559
+ };
560
+ /**
561
+ * Opens the popover
562
+ */
563
+ async show() {
564
+ document.dispatchEvent(new CustomEvent('le-popover-will-open', {
565
+ detail: { popover: this.el },
566
+ }));
567
+ this.popoverEl?.showPopover();
568
+ }
569
+ /**
570
+ * Closes the popover
571
+ */
572
+ async hide() {
573
+ this.popoverEl?.hidePopover();
574
+ }
575
+ /**
576
+ * Toggles the popover
577
+ */
578
+ async toggle() {
579
+ if (this.open) {
580
+ await this.hide();
581
+ }
582
+ else {
583
+ await this.show();
584
+ }
585
+ }
586
+ handleTriggerClick = (event) => {
587
+ event.stopPropagation();
588
+ this.toggle();
589
+ };
590
+ _updatePosition() {
591
+ if (!this.triggerEl || !this.popoverEl)
592
+ return;
593
+ const triggerRect = this.triggerEl.getBoundingClientRect();
594
+ const popoverRect = this.popoverEl.getBoundingClientRect();
595
+ const viewportWidth = window.innerWidth;
596
+ const viewportHeight = window.innerHeight;
597
+ const viewportPadding = 8;
598
+ let position = this.position;
599
+ let align = this.align;
600
+ // Auto-position logic
601
+ const spaceBelow = viewportHeight - triggerRect.bottom - viewportPadding;
602
+ const spaceAbove = triggerRect.top - viewportPadding;
603
+ const spaceRight = viewportWidth - triggerRect.right - viewportPadding;
604
+ const spaceLeft = triggerRect.left - viewportPadding;
605
+ if (position === 'auto') {
606
+ if (spaceBelow >= popoverRect.height + this.offset) {
607
+ position = 'bottom';
608
+ }
609
+ else if (spaceAbove >= popoverRect.height + this.offset) {
610
+ position = 'top';
611
+ }
612
+ else if (spaceRight >= popoverRect.width + this.offset) {
613
+ position = 'right';
614
+ }
615
+ else if (spaceLeft >= popoverRect.width + this.offset) {
616
+ position = 'left';
617
+ }
618
+ else {
619
+ const maxSpace = Math.max(spaceBelow, spaceAbove, spaceRight, spaceLeft);
620
+ if (maxSpace === spaceBelow)
621
+ position = 'bottom';
622
+ else if (maxSpace === spaceAbove)
623
+ position = 'top';
624
+ else if (maxSpace === spaceRight)
625
+ position = 'right';
626
+ else
627
+ position = 'left';
628
+ }
629
+ }
630
+ // Adjust alignment for horizontal overflow
631
+ if (position === 'top' || position === 'bottom') {
632
+ if (align === 'start' &&
633
+ triggerRect.left + popoverRect.width > viewportWidth - viewportPadding) {
634
+ align = 'end';
635
+ }
636
+ else if (align === 'end' && triggerRect.right - popoverRect.width < viewportPadding) {
637
+ align = 'start';
638
+ }
639
+ else if (align === 'center') {
640
+ const triggerCenter = triggerRect.left + triggerRect.width / 2;
641
+ if (triggerCenter - popoverRect.width / 2 < viewportPadding) {
642
+ align = 'start';
643
+ }
644
+ else if (triggerCenter + popoverRect.width / 2 > viewportWidth - viewportPadding) {
645
+ align = 'end';
646
+ }
647
+ }
648
+ }
649
+ // Calculate position
650
+ let top = 0;
651
+ let left = 0;
652
+ let maxHeight = null;
653
+ switch (position) {
654
+ case 'top':
655
+ top = triggerRect.top - popoverRect.height - this.offset;
656
+ if (top < viewportPadding) {
657
+ maxHeight = triggerRect.top - this.offset - viewportPadding * 2;
658
+ top = viewportPadding;
659
+ }
660
+ break;
661
+ case 'bottom':
662
+ top = triggerRect.bottom + this.offset;
663
+ if (top + popoverRect.height > viewportHeight - viewportPadding) {
664
+ maxHeight = viewportHeight - top - viewportPadding;
665
+ }
666
+ break;
667
+ case 'left':
668
+ left = triggerRect.left - popoverRect.width - this.offset;
669
+ top = triggerRect.top;
670
+ if (left < viewportPadding)
671
+ left = viewportPadding;
672
+ break;
673
+ case 'right':
674
+ left = triggerRect.right + this.offset;
675
+ top = triggerRect.top;
676
+ if (left + popoverRect.width > viewportWidth - viewportPadding) {
677
+ left = viewportWidth - popoverRect.width - viewportPadding;
678
+ }
679
+ break;
680
+ }
681
+ // Calculate horizontal alignment for top/bottom
682
+ if (position === 'top' || position === 'bottom') {
683
+ switch (align) {
684
+ case 'start':
685
+ left = triggerRect.left;
686
+ break;
687
+ case 'center':
688
+ left = triggerRect.left + triggerRect.width / 2 - popoverRect.width / 2;
689
+ break;
690
+ case 'end':
691
+ left = triggerRect.right - popoverRect.width;
692
+ break;
693
+ }
694
+ // Constrain to viewport
695
+ if (left < viewportPadding) {
696
+ left = viewportPadding;
697
+ }
698
+ else if (left + popoverRect.width > viewportWidth - viewportPadding) {
699
+ left = viewportWidth - popoverRect.width - viewportPadding;
700
+ }
701
+ }
702
+ // Calculate vertical alignment for left/right
703
+ if (position === 'left' || position === 'right') {
704
+ switch (align) {
705
+ case 'start':
706
+ top = triggerRect.top;
707
+ break;
708
+ case 'center':
709
+ top = triggerRect.top + triggerRect.height / 2 - popoverRect.height / 2;
710
+ break;
711
+ case 'end':
712
+ top = triggerRect.bottom - popoverRect.height;
713
+ break;
714
+ }
715
+ if (top < viewportPadding)
716
+ top = viewportPadding;
717
+ if (top + popoverRect.height > viewportHeight - viewportPadding) {
718
+ maxHeight = viewportHeight - top - viewportPadding;
719
+ }
720
+ }
721
+ // Apply styles
722
+ this.popoverEl.style.top = `${top}px`;
723
+ this.popoverEl.style.left = `${left}px`;
724
+ if (maxHeight !== null && maxHeight > 100) {
725
+ this.popoverEl.style.maxHeight = `${maxHeight}px`;
726
+ this.popoverEl.style.overflowY = 'auto';
727
+ }
728
+ else {
729
+ this.popoverEl.style.maxHeight = '';
730
+ this.popoverEl.style.overflowY = '';
731
+ }
732
+ this.isPositioned = true;
733
+ }
734
+ render() {
735
+ const popoverStyles = {
736
+ visibility: this.isPositioned ? 'visible' : 'hidden',
737
+ };
738
+ if (this.width)
739
+ popoverStyles.width = this.width;
740
+ if (this.minWidth)
741
+ popoverStyles.minWidth = this.minWidth;
742
+ if (this.maxWidth)
743
+ popoverStyles.maxWidth = this.maxWidth;
744
+ return (h(Host, { key: 'f3e1ae33b67abbaa13ac506271961b3dfcfaeec2', "trigger-full-width": this.triggerFullWidth }, h("div", { key: '4fc806cb1b4b59612bd7820d263b54db53f2d6d2', class: classnames('le-popover-trigger', {
745
+ 'le-popover-trigger-full-width': this.triggerFullWidth,
746
+ }), ref: el => (this.triggerEl = el), onClick: this.handleTriggerClick, part: "trigger" }, h("slot", { key: 'b62f6201f31246ccbb047b7a6539fd54604cc45e', name: "trigger" }, h("button", { key: '17a1a253776424812e82e4c747d2f0a2414efd48', type: "button", class: "le-popover-default-trigger" }, h("span", { key: '3c9c4d0390222cd3c1afea8f864d7287c3d55a8f' }, "\u2295")))), h("div", { key: '5c786402b8e1c9a5b60894f201de1bccf20f5288', id: this.uniqueId, class: "le-popover-content", popover: this.closeOnClickOutside ? 'auto' : 'manual', ref: el => (this.popoverEl = el), style: popoverStyles }, (this.popoverTitle || this.showClose) && (h("div", { key: 'b9e810e52400b9f3246621e80ecd432ea4fca3e5', class: "le-popover-header" }, this.popoverTitle && h("span", { key: 'b4164ebd8da381274b2eca584a221d5fddfcb473', class: "le-popover-title" }, this.popoverTitle), this.showClose && (h("button", { key: 'e5dc86d2aeef127cf9eaa54af50363a1ad7a80a8', type: "button", class: "le-popover-close", onClick: () => this.hide(), "aria-label": "Close" }, "\u00D7")))), h("div", { key: '4b4cf379cec1e3ec083dc2aa48b5919b35761648', class: "le-popover-body", part: "content" }, h("slot", { key: '767680e6675b50024ec4baa22343e08c26317962' })))));
747
+ }
748
+ };
749
+ LePopover.style = lePopoverCss;
750
+
751
+ const lePopupCss = ":host{display:contents}.le-popup-dialog{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;padding:0;border:none;background:transparent;max-width:none;max-height:none;overflow:visible;--_popup-min-width:var(--le-popup-min-width, 320px);--_popup-max-width:var(--le-popup-max-width, min(500px, 90vw));--_popup-min-height:var(--le-popup-min-height, auto)}.le-popup-dialog::backdrop{background:var(--le-popup-backdrop-color, rgba(0, 0, 0, 0.5));animation:le-popup-backdrop-fade 0.2s ease-out}@keyframes le-popup-backdrop-fade{from{opacity:0}to{opacity:1}}.le-popup-position-center{margin:auto}.le-popup-position-top{margin:var(--le-space-2xl, 48px) auto auto auto}.le-popup-position-top-left{margin:var(--le-space-lg, 24px) auto auto var(--le-space-lg, 24px)}.le-popup-position-top-right{margin:var(--le-space-lg, 24px) var(--le-space-lg, 24px) auto auto}.le-popup-position-bottom{margin:auto auto var(--le-space-2xl, 48px) auto}.le-popup-position-bottom-left{margin:auto auto var(--le-space-lg, 24px) var(--le-space-lg, 24px)}.le-popup-position-bottom-right{margin:auto var(--le-space-lg, 24px) var(--le-space-lg, 24px) auto}.le-popup-container{display:flex;flex-direction:column;min-width:var(--_popup-min-width);max-width:var(--_popup-max-width);min-height:var(--_popup-min-height);max-height:calc(100vh - var(--le-space-2xl, 48px) * 2);background:var(--le-color-surface, #ffffff);border:1px solid var(--le-color-border, #e0e0e0);border-radius:var(--le-radius-lg, 12px);box-shadow:var(--le-shadow-xl, 0 8px 32px rgba(0, 0, 0, 0.15));overflow:hidden;font-family:var(--le-font-family, system-ui, -apple-system, sans-serif);color:var(--le-color-text, #333);animation:le-popup-appear 0.2s ease-out}@keyframes le-popup-appear{from{opacity:0;transform:scale(0.95) translateY(-10px)}to{opacity:1;transform:scale(1) translateY(0)}}.le-popup-header{flex-shrink:0;padding:var(--le-space-md, 16px) var(--le-space-lg, 24px);border-bottom:1px solid var(--le-color-border, #e0e0e0);background:var(--le-color-surface-alt, #f9f9f9);font-size:var(--le-font-size-lg, 1.125rem);font-weight:var(--le-font-weight-semibold, 600);color:var(--le-color-text, #333)}.le-popup-body{flex:1;padding:var(--le-space-lg, 24px);overflow-y:auto}.le-popup-message{margin:0;font-size:var(--le-font-size-md, 1rem);line-height:var(--le-line-height-relaxed, 1.6);color:var(--le-color-text, #333)}.le-popup-message+::slotted(*){margin-top:var(--le-space-md, 16px)}.le-popup-input{display:block;width:100%;margin-top:var(--le-space-md, 16px);padding:var(--le-space-sm, 8px) var(--le-space-md, 16px);font-family:inherit;font-size:var(--le-font-size-md, 1rem);color:var(--le-color-text, #333);background:var(--le-color-background, #fff);border:1px solid var(--le-color-border, #e0e0e0);border-radius:var(--le-radius-md, 8px);outline:none;transition:border-color var(--le-transition-fast, 0.15s ease),\n box-shadow var(--le-transition-fast, 0.15s ease);box-sizing:border-box}.le-popup-input:focus{border-color:var(--le-color-primary, #2196f3);box-shadow:0 0 0 3px var(--le-color-primary-light, rgba(33, 150, 243, 0.2))}.le-popup-input::placeholder{color:var(--le-color-text-muted, #999)}.le-popup-footer{flex-shrink:0;display:flex;justify-content:flex-end;gap:var(--le-space-sm, 8px);padding:var(--le-space-md, 16px) var(--le-space-lg, 24px);border-top:1px solid var(--le-color-border, #e0e0e0);background:var(--le-color-surface-alt, #f9f9f9)}.le-popup-btn{min-width:80px}@media (max-width: 480px){.le-popup-container{min-width:calc(100vw - var(--le-space-md, 16px) * 2);max-width:calc(100vw - var(--le-space-md, 16px) * 2)}.le-popup-footer{flex-direction:column-reverse}.le-popup-btn{width:100%}}";
752
+
753
+ const LePopup = class {
754
+ constructor(hostRef) {
755
+ registerInstance(this, hostRef);
756
+ this.leConfirm = createEvent(this, "leConfirm");
757
+ this.leCancel = createEvent(this, "leCancel");
758
+ this.leOpen = createEvent(this, "leOpen");
759
+ this.leClose = createEvent(this, "leClose");
760
+ }
761
+ get el() { return getElement(this); }
762
+ /**
763
+ * The mode of the Le Kit (e.g., 'default' or 'admin')
764
+ */
765
+ mode = 'default';
766
+ /**
767
+ * Whether the popup is currently visible
768
+ */
769
+ open = false;
770
+ /**
771
+ * Type of popup: alert (OK only), confirm (OK/Cancel), prompt (input + OK/Cancel), custom
772
+ */
773
+ type = 'alert';
774
+ /**
775
+ * Optional title for the popup header
776
+ */
777
+ popupTitle;
778
+ /**
779
+ * Message text to display (for alert/confirm/prompt types)
780
+ */
781
+ message;
782
+ /**
783
+ * Whether the popup is modal (blocks interaction with page behind)
784
+ */
785
+ modal = true;
786
+ /**
787
+ * Position of the popup on screen
788
+ */
789
+ position = 'center';
790
+ /**
791
+ * Text for the confirm/OK button
792
+ */
793
+ confirmText = 'OK';
794
+ /**
795
+ * Text for the cancel button
796
+ */
797
+ cancelText = 'Cancel';
798
+ /**
799
+ * Placeholder text for prompt input
800
+ */
801
+ placeholder = '';
802
+ /**
803
+ * Default value for prompt input
804
+ */
805
+ defaultValue = '';
806
+ /**
807
+ * Whether clicking the backdrop closes the popup (modal only)
808
+ */
809
+ closeOnBackdrop = true;
810
+ /**
811
+ * Internal state for prompt input value
812
+ */
813
+ inputValue = '';
814
+ /**
815
+ * Emitted when the popup is confirmed (OK clicked)
816
+ */
817
+ leConfirm;
818
+ /**
819
+ * Emitted when the popup is cancelled (Cancel clicked or dismissed)
820
+ */
821
+ leCancel;
822
+ /**
823
+ * Emitted when the popup opens
824
+ */
825
+ leOpen;
826
+ /**
827
+ * Emitted when the popup closes
828
+ */
829
+ leClose;
830
+ dialogEl;
831
+ inputEl;
832
+ resolvePromise;
833
+ componentWillLoad() {
834
+ this.inputValue = this.defaultValue;
835
+ }
836
+ componentDidLoad() {
837
+ // Native dialog handles Escape key automatically when modal
838
+ // We just need to listen for the cancel event
839
+ this.dialogEl?.addEventListener('cancel', this.handleDialogCancel);
840
+ }
841
+ disconnectedCallback() {
842
+ this.dialogEl?.removeEventListener('cancel', this.handleDialogCancel);
843
+ }
844
+ handleDialogCancel = (e) => {
845
+ e.preventDefault(); // Prevent default close to handle it ourselves
846
+ this.handleCancel();
847
+ };
848
+ /**
849
+ * Opens the popup and returns a promise that resolves when closed
850
+ */
851
+ async show() {
852
+ return new Promise(resolve => {
853
+ this.resolvePromise = resolve;
854
+ this.inputValue = this.defaultValue;
855
+ this.open = true;
856
+ // Use requestAnimationFrame to ensure the dialog element is rendered
857
+ requestAnimationFrame(() => {
858
+ if (this.dialogEl) {
859
+ if (this.modal) {
860
+ this.dialogEl.showModal();
861
+ }
862
+ else {
863
+ this.dialogEl.show();
864
+ }
865
+ this.leOpen.emit();
866
+ // Focus input for prompt type
867
+ if (this.type === 'prompt' && this.inputEl) {
868
+ this.inputEl.focus();
869
+ this.inputEl.select();
870
+ }
871
+ }
872
+ });
873
+ });
874
+ }
875
+ /**
876
+ * Closes the popup with a result
877
+ */
878
+ async hide(confirmed = false) {
879
+ const result = {
880
+ confirmed,
881
+ value: this.type === 'prompt' ? this.inputValue : undefined,
882
+ };
883
+ this.dialogEl?.close();
884
+ this.open = false;
885
+ this.leClose.emit(result);
886
+ if (this.resolvePromise) {
887
+ this.resolvePromise(result);
888
+ this.resolvePromise = undefined;
889
+ }
890
+ }
891
+ handleConfirm = () => {
892
+ const result = {
893
+ confirmed: true,
894
+ value: this.type === 'prompt' ? this.inputValue : undefined,
895
+ };
896
+ this.leConfirm.emit(result);
897
+ this.hide(true);
898
+ };
899
+ handleCancel = () => {
900
+ const result = {
901
+ confirmed: false,
902
+ value: undefined,
903
+ };
904
+ this.leCancel.emit(result);
905
+ this.hide(false);
906
+ };
907
+ handleBackdropClick = (e) => {
908
+ // Check if click was on the dialog backdrop (outside the dialog box)
909
+ if (this.closeOnBackdrop && e.target === this.dialogEl) {
910
+ const rect = this.dialogEl.getBoundingClientRect();
911
+ const clickedInDialog = e.clientX >= rect.left &&
912
+ e.clientX <= rect.right &&
913
+ e.clientY >= rect.top &&
914
+ e.clientY <= rect.bottom;
915
+ if (!clickedInDialog) {
916
+ this.handleCancel();
917
+ }
918
+ }
919
+ };
920
+ handleInputChange = (e) => {
921
+ this.inputValue = e.target.value;
922
+ };
923
+ handleKeyDown = (e) => {
924
+ if (e.key === 'Enter' && this.type !== 'custom') {
925
+ e.preventDefault();
926
+ this.handleConfirm();
927
+ }
928
+ };
929
+ hasSlot(name) {
930
+ return !!this.el.querySelector(`[slot="${name}"]`);
931
+ }
932
+ renderHeader() {
933
+ if (this.hasSlot('header')) {
934
+ return (h("div", { class: "le-popup-header", part: "header" }, h("slot", { name: "header" })));
935
+ }
936
+ if (this.popupTitle) {
937
+ return (h("div", { class: "le-popup-header", part: "header" }, this.popupTitle));
938
+ }
939
+ return null;
940
+ }
941
+ renderBody() {
942
+ return (h("div", { class: "le-popup-body", part: "body" }, this.message && h("p", { class: "le-popup-message" }, this.message), this.type === 'prompt' && (h("input", { type: "text", class: "le-popup-input", part: "input", placeholder: this.placeholder, value: this.inputValue, onInput: this.handleInputChange, onKeyDown: this.handleKeyDown, ref: el => (this.inputEl = el) })), h("le-slot", { name: "", tag: "div", description: "Custom popup content", type: "slot" }, h("slot", null))));
943
+ }
944
+ renderFooter() {
945
+ if (this.hasSlot('footer')) {
946
+ return (h("div", { class: "le-popup-footer", part: "footer" }, h("slot", { name: "footer" })));
947
+ }
948
+ // For custom type without footer slot, don't render default buttons
949
+ if (this.type === 'custom') {
950
+ return null;
951
+ }
952
+ return (h("div", { class: "le-popup-footer", part: "footer" }, (this.type === 'confirm' || this.type === 'prompt') && (h("le-button", { variant: "outlined", part: "button-cancel", class: "le-popup-btn", onClick: this.handleCancel }, this.cancelText)), h("le-button", { variant: "solid", part: "button-confirm", class: "le-popup-btn", onClick: this.handleConfirm }, this.confirmText)));
953
+ }
954
+ render() {
955
+ const positionClass = `le-popup-position-${this.position}`;
956
+ return (h("dialog", { key: '20ac8e086b2999191c769a0ee03b1c1182103809', class: `le-popup-dialog ${positionClass}`, part: "dialog", ref: el => (this.dialogEl = el), onClick: this.handleBackdropClick }, h("le-component", { key: '468b1d737c2301b041c2a7a13afc658505f74c5b', component: "le-popup" }, h("div", { key: '829cad08439dc5d0b3f9c78092a46faa016bbec2', class: "le-popup-container", part: "container" }, this.renderHeader(), this.renderBody(), this.renderFooter()))));
957
+ }
958
+ };
959
+ LePopup.style = lePopupCss;
960
+
961
+ const leSlotDefaultCss = ":host{display:contents;--le-slot-border-color:#0088ff;--le-slot-bg-color:rgba(0, 136, 255, 0.05);--le-slot-header-bg:rgb(218, 238, 255);--le-slot-label-color:#0066cc;--le-slot-description-color:#666;--le-slot-required-color:#e53935;--le-slot-dropzone-min-height:20px;--le-slot-dropzone-border-color:#ccc}.le-slot-container,.le-slot-header,.le-slot-description,.le-slot-dropzone,.le-slot-input{display:none}.hidden-slot{display:none}:host(.admin-mode){display:block;flex:1}:host(.admin-mode) .le-slot-container{position:relative;display:flex;flex-direction:column;border:2px dashed var(--le-slot-border-color);border-radius:4px;background:var(--le-slot-bg-color);margin:4px 0}:host(.admin-mode) .le-slot-header{display:flex;align-items:center;gap:4px;padding:0 0 0 var(--le-spacing-1, 4px);background:var(--le-slot-header-bg);border-bottom:1px solid var(--le-slot-border-color);font-size:var(--le-font-size-xs, 11px);font-weight:400;text-transform:capitalize}:host(.admin-mode) .le-slot-header-no-label{justify-content:flex-end;height:16px;border:none;background-color:transparent}.le-slot-label{color:var(--le-slot-label-color);text-align:start;overflow:hidden;width:0;flex:1 1 0%}.le-slot-required{color:var(--le-slot-required-color);font-weight:bold}:host(.admin-mode) .le-slot-description{display:block;padding:4px 8px;font-size:12px;color:var(--le-slot-description-color);font-style:italic}:host(.admin-mode) .le-slot-description-icon{display:inline-block;font-size:9px;line-height:1;cursor:pointer;color:var(--le-slot-description-color)}:host(.admin-mode) .le-slot-dropzone{display:block;min-height:var(--le-slot-dropzone-min-height);padding:var(--le-spacing-1, 4px);position:relative}:host(.admin-mode) .le-slot-dropzone:empty::before{content:'Drop content here';display:flex;align-items:center;justify-content:center;position:absolute;inset:8px;border:2px dashed var(--le-slot-dropzone-border-color);border-radius:4px;color:#999;font-size:12px;pointer-events:none}:host(.admin-mode.drag-over) .le-slot-container{border-color:#00cc66;background:rgba(0, 204, 102, 0.1)}:host(.admin-mode.drag-over) .le-slot-dropzone:empty::before{border-color:#00cc66;color:#00cc66;content:'Release to drop'}:host(.admin-mode) .le-slot-input{display:block;padding:var(--le-spacing-1, 4px)}:host(.admin-mode) .le-slot-input input,:host(.admin-mode) .le-slot-input textarea{display:block;width:100%;padding:8px 10px;border:1px solid var(--le-slot-dropzone-border-color);border-radius:4px;font-family:inherit;font-size:14px;line-height:1.4;background:#fff;color:#333;box-sizing:border-box;transition:border-color 0.2s, box-shadow 0.2s}:host(.admin-mode) .le-slot-input input:focus,:host(.admin-mode) .le-slot-input textarea:focus{outline:none;border-color:var(--le-slot-border-color);box-shadow:0 0 0 3px rgba(0, 136, 255, 0.15)}:host(.admin-mode) .le-slot-input input::placeholder,:host(.admin-mode) .le-slot-input textarea::placeholder{color:#999}:host(.admin-mode) .le-slot-input textarea{resize:vertical;min-height:60px}:host(.admin-mode) .le-slot-input slot{display:none}.le-slot-invalid{color:var(--le-slot-required-color);font-size:10px;margin-left:auto;font-weight:normal;text-transform:none}:host(.admin-mode) .le-slot-input.has-error input,:host(.admin-mode) .le-slot-input.has-error textarea{border-color:var(--le-slot-required-color);background:rgba(229, 57, 53, 0.05)}:host(.admin-mode) .le-slot-input.has-error input:focus,:host(.admin-mode) .le-slot-input.has-error textarea:focus{border-color:var(--le-slot-required-color);box-shadow:0 0 0 3px rgba(229, 57, 53, 0.15)}.le-slot-add-btn{font-size:24px;line-height:0px;width:12px;height:12px}.le-slot-header-no-label .le-slot-add-btn{font-size:16px}.le-slot-button{width:20px;height:20px}:host(.admin-mode) .le-slot-header-no-label.le-slot-header-text{height:0}";
962
+
963
+ const LeSlot = class {
964
+ constructor(hostRef) {
965
+ registerInstance(this, hostRef);
966
+ this.leSlotChange = createEvent(this, "leSlotChange");
967
+ }
968
+ get el() { return getElement(this); }
969
+ /**
970
+ * The type of slot content.
971
+ * - `slot`: Default, shows a dropzone for components (default)
972
+ * - `text`: Shows a single-line text input
973
+ * - `textarea`: Shows a multi-line text area
974
+ */
975
+ type = 'slot';
976
+ /**
977
+ * The name of the slot this placeholder represents.
978
+ * Should match the slot name in the parent component.
979
+ */
980
+ name = '';
981
+ /**
982
+ * Label to display in admin mode.
983
+ * If not provided, the slot name will be used.
984
+ */
985
+ label;
986
+ /**
987
+ * Description of what content this slot accepts.
988
+ * Shown in admin mode to guide content editors.
989
+ */
990
+ description;
991
+ /**
992
+ * Comma-separated list of allowed component tags for this slot.
993
+ * Used by CMS to filter available components.
994
+ *
995
+ * @example "le-card,le-button,le-text"
996
+ */
997
+ allowedComponents;
998
+ /**
999
+ * Whether multiple components can be dropped in this slot.
1000
+ */
1001
+ multiple = true;
1002
+ /**
1003
+ * Whether this slot is required to have content.
1004
+ */
1005
+ required = false;
1006
+ /**
1007
+ * Placeholder text for text/textarea inputs in admin mode.
1008
+ */
1009
+ placeholder;
1010
+ /**
1011
+ * The HTML tag to create when there's no slotted element.
1012
+ * Used with type="text" or type="textarea" to auto-create elements.
1013
+ *
1014
+ * @example "h3" - creates <h3 slot="header">content</h3>
1015
+ * @example "p" - creates <p slot="content">content</p>
1016
+ */
1017
+ tag;
1018
+ /**
1019
+ * CSS styles for the slot dropzone container.
1020
+ * Useful for layouts - e.g., "flex-direction: row" for horizontal stacks.
1021
+ * Only applies in admin mode for type="slot".
1022
+ */
1023
+ slotStyle;
1024
+ /**
1025
+ * Internal state to track admin mode
1026
+ */
1027
+ adminMode = false;
1028
+ /**
1029
+ * Internal state for text input value (synced from slot content)
1030
+ */
1031
+ textValue = '';
1032
+ /**
1033
+ * Whether the current textValue contains valid HTML
1034
+ */
1035
+ isValidHtml = true;
1036
+ /**
1037
+ * Available components loaded from Custom Elements Manifest
1038
+ */
1039
+ availableComponents = [];
1040
+ /**
1041
+ * Whether the component picker popover is open
1042
+ */
1043
+ pickerOpen = false;
1044
+ /**
1045
+ * Reference to the slot element to access assignedNodes
1046
+ */
1047
+ slotRef;
1048
+ /**
1049
+ * The original slotted element (e.g., <h3 slot="header">)
1050
+ */
1051
+ slottedElement;
1052
+ /**
1053
+ * Emitted when text content changes in admin mode.
1054
+ * The event detail contains the new text value and validity.
1055
+ */
1056
+ leSlotChange;
1057
+ disconnectModeObserver;
1058
+ connectedCallback() {
1059
+ this.disconnectModeObserver = observeModeChanges(this.el, mode => {
1060
+ const wasAdmin = this.adminMode;
1061
+ this.adminMode = mode === 'admin';
1062
+ // When entering admin mode, read content from slotted elements
1063
+ if (this.adminMode && !wasAdmin) {
1064
+ // Need to wait for render to access slot ref
1065
+ requestAnimationFrame(() => this.readSlottedContent());
1066
+ // Load available components for the component picker
1067
+ if (this.type === 'slot') {
1068
+ this.loadAvailableComponents();
1069
+ }
1070
+ }
1071
+ });
1072
+ }
1073
+ disconnectedCallback() {
1074
+ this.disconnectModeObserver?.();
1075
+ }
1076
+ /**
1077
+ * Flag to prevent re-reading content right after we updated it
1078
+ */
1079
+ isUpdating = false;
1080
+ /**
1081
+ * Read content from slotted elements via assignedNodes()
1082
+ */
1083
+ readSlottedContent() {
1084
+ if (!this.slotRef)
1085
+ return;
1086
+ // Skip if we just updated the content ourselves
1087
+ if (this.isUpdating) {
1088
+ this.isUpdating = false;
1089
+ return;
1090
+ }
1091
+ const assignedNodes = this.slotRef.assignedNodes({ flatten: true });
1092
+ // For text/textarea types, we want to edit the innerHTML of slotted elements
1093
+ if (this.type === 'text' || this.type === 'textarea') {
1094
+ // Find the first element node (skip text nodes that are just whitespace)
1095
+ const elementNode = assignedNodes.find(node => node.nodeType === Node.ELEMENT_NODE);
1096
+ if (elementNode) {
1097
+ // Only update textValue if slotted element changed or we don't have one yet
1098
+ if (this.slottedElement !== elementNode) {
1099
+ this.slottedElement = elementNode;
1100
+ this.textValue = elementNode.innerHTML?.trim() || '';
1101
+ // console.log(`[le-slot "${this.name}"] Read slotted content:`, this.textValue);
1102
+ }
1103
+ }
1104
+ else {
1105
+ // No element, check for direct text content
1106
+ const textContent = assignedNodes
1107
+ .filter(node => node.nodeType === Node.TEXT_NODE)
1108
+ .map(node => node.textContent)
1109
+ .join('')
1110
+ .trim();
1111
+ if (textContent && !this.textValue) {
1112
+ this.textValue = textContent;
1113
+ // console.log(`[le-slot "${this.name}"] Read text content:`, this.textValue);
1114
+ }
1115
+ }
1116
+ }
1117
+ }
1118
+ /**
1119
+ * Validates if a string contains valid HTML
1120
+ */
1121
+ validateHtml(html) {
1122
+ // Empty string is valid
1123
+ if (!html.trim())
1124
+ return true;
1125
+ // Create a template element to parse the HTML
1126
+ const template = document.createElement('template');
1127
+ template.innerHTML = html;
1128
+ // Check that we don't have obviously broken HTML
1129
+ // Count opening and closing tags for common elements
1130
+ const openTags = (html.match(/<[a-z][^>]*(?<!\/)>/gi) || []).length;
1131
+ const closeTags = (html.match(/<\/[a-z][^>]*>/gi) || []).length;
1132
+ const selfClosing = (html.match(/<[a-z][^>]*\/>/gi) || []).length;
1133
+ // Simple validation: opening tags (minus self-closing) should roughly match closing tags
1134
+ // Allow some tolerance for void elements like <br>, <img>, etc.
1135
+ const voidElements = (html.match(/<(br|hr|img|input|meta|link|area|base|col|embed|param|source|track|wbr)[^>]*>/gi) || []).length;
1136
+ const effectiveOpenTags = openTags - selfClosing - voidElements;
1137
+ // If difference is too large, HTML is likely broken
1138
+ if (Math.abs(effectiveOpenTags - closeTags) > 1) {
1139
+ return false;
1140
+ }
1141
+ return true;
1142
+ }
1143
+ handleTextInput = (event) => {
1144
+ const target = event.target;
1145
+ this.textValue = target.value;
1146
+ this.isValidHtml = this.validateHtml(this.textValue);
1147
+ if (this.isValidHtml) {
1148
+ // Set flag to prevent slotchange from re-reading what we just wrote
1149
+ this.isUpdating = true;
1150
+ console.log('Updating text value:', this.textValue, 'slottedElement:', this.slottedElement);
1151
+ if (this.slottedElement) {
1152
+ // Update existing slotted element's innerHTML
1153
+ this.slottedElement.innerHTML = this.textValue;
1154
+ }
1155
+ else if (this.tag && this.textValue) {
1156
+ // No slotted element exists
1157
+ // If the slot doesn't have a name, then it's the default slot
1158
+ // remove the existing non-slotted content (text nodes and elements without slot attribute)
1159
+ const rootNode = this.el.getRootNode();
1160
+ if (!this.name && rootNode instanceof ShadowRoot) {
1161
+ const hostComponent = rootNode.host;
1162
+ Array.from(hostComponent.childNodes).forEach(node => {
1163
+ if (node.nodeType === Node.TEXT_NODE || (node.nodeType === Node.ELEMENT_NODE && !node.hasAttribute('slot'))) {
1164
+ node.remove();
1165
+ }
1166
+ });
1167
+ }
1168
+ // create one using the specified tag
1169
+ this.createSlottedElement();
1170
+ }
1171
+ else if (this.textValue) {
1172
+ // no tag specified - just replace everything in the host component
1173
+ const rootNode = this.el.getRootNode();
1174
+ if (rootNode instanceof ShadowRoot) {
1175
+ const hostComponent = rootNode.host;
1176
+ hostComponent.innerHTML = this.textValue;
1177
+ }
1178
+ }
1179
+ }
1180
+ this.leSlotChange.emit({
1181
+ name: this.name,
1182
+ value: this.textValue,
1183
+ isValid: this.isValidHtml,
1184
+ });
1185
+ };
1186
+ /**
1187
+ * Create a new slotted element when none exists.
1188
+ * The element is appended to the host component's light DOM.
1189
+ */
1190
+ createSlottedElement() {
1191
+ if (!this.tag)
1192
+ return;
1193
+ // Find the host component (le-card, etc.) by traversing up through shadow DOM
1194
+ // le-slot is inside le-card's shadow DOM, so we need to find le-card's host
1195
+ const rootNode = this.el.getRootNode();
1196
+ if (!(rootNode instanceof ShadowRoot))
1197
+ return;
1198
+ const hostComponent = rootNode.host;
1199
+ if (!hostComponent)
1200
+ return;
1201
+ // Create the new element
1202
+ const newElement = document.createElement(this.tag);
1203
+ newElement.innerHTML = this.textValue;
1204
+ // Set the slot attribute if this is a named slot
1205
+ if (this.name) {
1206
+ newElement.setAttribute('slot', this.name);
1207
+ }
1208
+ // Append to the host component's light DOM
1209
+ hostComponent.appendChild(newElement);
1210
+ // Store reference to the new element
1211
+ this.slottedElement = newElement;
1212
+ // console.log(`[le-slot "${this.name}"] Created new <${this.tag}> element`);
1213
+ }
1214
+ /**
1215
+ * Load available components from Custom Elements Manifest
1216
+ */
1217
+ async loadAvailableComponents() {
1218
+ try {
1219
+ const { manifestFile } = getLeKitConfig();
1220
+ const manifestFileResolved = getAssetPath(`./assets/${manifestFile}`);
1221
+ const response = await fetch(manifestFileResolved);
1222
+ const manifest = await response.json();
1223
+ const components = [];
1224
+ const allowedList = this.allowedComponents?.split(',').map(s => s.trim()) || [];
1225
+ for (const module of manifest.modules) {
1226
+ for (const declaration of module.declarations || []) {
1227
+ if (declaration.tagName && declaration.customElement) {
1228
+ // Skip internal components (le-slot, le-component, le-popover)
1229
+ const isInternal = ['le-slot', 'le-component', 'le-popover'].includes(declaration.tagName);
1230
+ if (isInternal)
1231
+ continue;
1232
+ // If allowedComponents is specified, filter by it
1233
+ if (allowedList.length > 0 && !allowedList.includes(declaration.tagName)) {
1234
+ continue;
1235
+ }
1236
+ components.push({
1237
+ tagName: declaration.tagName,
1238
+ name: this.formatComponentName(declaration.tagName),
1239
+ description: declaration.description || '',
1240
+ });
1241
+ }
1242
+ }
1243
+ }
1244
+ this.availableComponents = components || [];
1245
+ }
1246
+ catch (error) {
1247
+ console.warn('[le-slot] Failed to load component manifest:', error);
1248
+ }
1249
+ }
1250
+ /**
1251
+ * Format a tag name into a display name
1252
+ * e.g., 'le-card' -> 'Card'
1253
+ */
1254
+ formatComponentName(tagName) {
1255
+ return tagName
1256
+ .replace(/^le-/, '')
1257
+ .split('-')
1258
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
1259
+ .join(' ');
1260
+ }
1261
+ /**
1262
+ * Add a new component to the slot
1263
+ */
1264
+ addComponent(tagName) {
1265
+ // Find the host component by traversing up through shadow DOM
1266
+ const rootNode = this.el.getRootNode();
1267
+ if (!(rootNode instanceof ShadowRoot))
1268
+ return;
1269
+ const hostComponent = rootNode.host;
1270
+ if (!hostComponent)
1271
+ return;
1272
+ // Create the new component element
1273
+ const newElement = document.createElement(tagName);
1274
+ // Set the slot attribute if this is a named slot
1275
+ if (this.name) {
1276
+ newElement.setAttribute('slot', this.name);
1277
+ }
1278
+ // Append to the host component's light DOM
1279
+ hostComponent.appendChild(newElement);
1280
+ // Emit change event so the page can save
1281
+ this.leSlotChange.emit({
1282
+ name: this.name,
1283
+ value: hostComponent.innerHTML,
1284
+ isValid: true,
1285
+ });
1286
+ }
1287
+ /**
1288
+ * Handle slot change event to re-read content when nodes are assigned
1289
+ */
1290
+ handleSlotChange = () => {
1291
+ this.readSlottedContent();
1292
+ };
1293
+ render() {
1294
+ const displayLabel = this.label || this.name;
1295
+ // Always render the same structure, CSS handles visibility via .admin-mode class
1296
+ return (h(Host, { key: 'da1fce97fbec16e12affe4d53272f406379c229c', class: {
1297
+ 'admin-mode': this.adminMode,
1298
+ 'invalid-html': !this.isValidHtml,
1299
+ }, 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', {
1300
+ 'le-slot-header-no-label': !displayLabel,
1301
+ 'le-slot-header-text': this.type === 'text',
1302
+ 'le-slot-header-error': !this.isValidHtml,
1303
+ }) }, displayLabel && (h("span", { class: "le-slot-label" }, displayLabel, this.required && h("span", { class: "le-slot-required" }, "*"))), !this.isValidHtml && h("span", { class: "le-slot-invalid" }, "\u26A0 Invalid HTML"), this.type === 'slot' && this.adminMode && (h("le-popover", { mode: "default", showClose: true, align: "start", position: "right", popoverTitle: "Add Component", open: this.pickerOpen, onLePopoverOpen: () => (this.pickerOpen = true), onLePopoverClose: () => (this.pickerOpen = false) }, h("le-button", { type: "button", class: "le-slot-button", slot: "trigger", variant: "clear", size: "small", "aria-label": "Add component", "icon-only": true }, h("span", { class: "le-slot-add-btn", slot: "icon-only" }, "+")), h("div", { class: "le-slot-picker" }, this.availableComponents.length > 0 ? (h("ul", { class: "le-slot-picker-list" }, this.availableComponents.map(component => (h("li", { key: component.tagName }, h("button", { class: "le-slot-picker-item", onClick: () => {
1304
+ this.addComponent(component.tagName);
1305
+ this.pickerOpen = false;
1306
+ } }, h("span", { class: "le-slot-picker-name" }, component.name), component.description && h("span", { class: "le-slot-picker-desc" }, component.description))))))) : (h("div", { class: "le-slot-picker-empty" }, "No components available")))))), this.renderContent())) : (
1307
+ // In default mode, just pass through the slot - slotted content renders naturally
1308
+ // Note: We use unnamed slot here because named slots from parent component
1309
+ // are passed as le-slot's light DOM children
1310
+ h("slot", null))));
1311
+ }
1312
+ renderContent() {
1313
+ // Create the slot element with ref for reading assignedNodes
1314
+ // Wrap in a hidden div since slot elements can't have style prop in Stencil
1315
+ // Note: We use unnamed slot here because named slots from parent component
1316
+ // are passed as le-slot's light DOM children
1317
+ const slotElement = (h("div", { class: "hidden-slot" }, h("slot", { ref: el => (this.slotRef = el), onSlotchange: this.handleSlotChange })));
1318
+ switch (this.type) {
1319
+ case 'text':
1320
+ return (h("div", { class: { 'le-slot-input': true, 'has-error': !this.isValidHtml } }, h("le-string-input", { mode: "default", value: this.textValue, placeholder: this.placeholder || `Enter ${this.label || this.name || 'text'}...`, onChange: this.handleTextInput }), slotElement));
1321
+ case 'textarea':
1322
+ return (h("div", { class: { 'le-slot-input': true, 'has-error': !this.isValidHtml } }, h("textarea", { value: this.textValue, placeholder: this.placeholder || `Enter ${this.label || this.name || 'text'}...`, onInput: this.handleTextInput, required: this.required, rows: 3 }), slotElement));
1323
+ case 'slot':
1324
+ default:
1325
+ // Parse slotStyle string into style object if provided
1326
+ const dropzoneStyle = {};
1327
+ if (this.slotStyle) {
1328
+ this.slotStyle.split(';').forEach(rule => {
1329
+ const [prop, value] = rule.split(':').map(s => s.trim());
1330
+ if (prop && value) {
1331
+ // Convert kebab-case to camelCase for style object
1332
+ const camelProp = prop.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
1333
+ dropzoneStyle[camelProp] = value;
1334
+ }
1335
+ });
1336
+ }
1337
+ return (h("div", { class: "le-slot-dropzone", style: dropzoneStyle }, h("slot", { ref: el => (this.slotRef = el), onSlotchange: this.handleSlotChange })));
1338
+ }
1339
+ }
1340
+ };
1341
+ LeSlot.style = leSlotDefaultCss;
1342
+
1343
+ const leStringInputCss = ":host{display:block;--le-input-bg:var(--le-color-surface, #ffffff);--le-input-color:var(--le-color-text-primary, #333333);--le-input-border:var(--le-border-width, 2px) solid var(--le-color-border-input, #007bff);--le-input-radius:var(--le-radius-sm, 4px);--le-input-padding:2px 6px;--le-input-height:1.5rem;--le-input-label-color:var(--le-color-text-primary, #333333);--le-input-desc-color:var(--le-color-text-secondary, #666666);--le-input-placeholder-color:#999999}.le-input-wrapper{display:flex;flex-direction:column;gap:2px}.le-input-label{display:block;font-size:0.9em;font-weight:500;color:var(--le-input-label-color);margin-bottom:2px}.le-input-container{position:relative;display:flex;align-items:center;background:var(--le-input-bg);border:var(--le-input-border);border-radius:var(--le-input-radius);transition:border-color 0.2s}.le-input-container:focus-within{outline:2px solid var(--le-color-focus);outline-offset:2px}:host([disabled]) .le-input-container{opacity:0.6;background-color:rgba(0,0,0,0.05);cursor:not-allowed}input{flex:1;min-height:var(--le-input-height);padding:var(--le-input-padding);border:none;background:transparent;color:var(--le-input-color);font-family:inherit;font-size:inherit;outline:none;width:100%}input::placeholder{color:var(--le-input-placeholder-color)}.icon-start,.icon-end{display:flex;align-items:center;justify-content:center;padding:0 8px;color:var(--le-input-desc-color)}.le-input-description{font-size:0.85em;color:var(--le-input-desc-color);margin-top:2px}.le-input-description::has(le-slot>slot[name=description]:empty){display:none}";
1344
+
1345
+ const LeStringInput = class {
1346
+ constructor(hostRef) {
1347
+ registerInstance(this, hostRef);
1348
+ this.leChange = createEvent(this, "change");
1349
+ this.leInput = createEvent(this, "input");
1350
+ }
1351
+ get el() { return getElement(this); }
1352
+ /**
1353
+ * Pass the ref of the input element to the parent component
1354
+ */
1355
+ inputRef;
1356
+ /**
1357
+ * Mode of the popover should be 'default' for internal use
1358
+ */
1359
+ mode;
1360
+ /**
1361
+ * The value of the input
1362
+ */
1363
+ value;
1364
+ /**
1365
+ * The name of the input
1366
+ */
1367
+ name;
1368
+ /**
1369
+ * The type of the input (text, email, password, etc.)
1370
+ */
1371
+ type = 'text';
1372
+ /**
1373
+ * Label for the input
1374
+ */
1375
+ label;
1376
+ /**
1377
+ * Icon for the start icon
1378
+ */
1379
+ iconStart;
1380
+ /**
1381
+ * Icon for the end icon
1382
+ */
1383
+ iconEnd;
1384
+ /**
1385
+ * Placeholder text
1386
+ */
1387
+ placeholder;
1388
+ /**
1389
+ * Hide description slot
1390
+ */
1391
+ hideDescription = false;
1392
+ /**
1393
+ * Whether the input is disabled
1394
+ */
1395
+ disabled = false;
1396
+ /**
1397
+ * Whether the input is read-only
1398
+ */
1399
+ readonly = false;
1400
+ /**
1401
+ * External ID for linking with external systems
1402
+ */
1403
+ externalId;
1404
+ /**
1405
+ * Emitted when the value changes (on blur or Enter)
1406
+ */
1407
+ leChange;
1408
+ /**
1409
+ * Emitted when the input value changes (on keystroke)
1410
+ */
1411
+ leInput;
1412
+ handleInput = (ev) => {
1413
+ const input = ev.target;
1414
+ this.value = input.value;
1415
+ this.leInput.emit({
1416
+ value: this.value,
1417
+ name: this.name,
1418
+ externalId: this.externalId,
1419
+ });
1420
+ };
1421
+ handleChange = (ev) => {
1422
+ const input = ev.target;
1423
+ this.value = input.value;
1424
+ this.leChange.emit({
1425
+ value: this.value,
1426
+ name: this.name,
1427
+ externalId: this.externalId,
1428
+ });
1429
+ };
1430
+ handleClick = (ev) => {
1431
+ ev.stopPropagation();
1432
+ };
1433
+ render() {
1434
+ return (h("le-component", { key: '51f1342de987ff5431a982f472106e1e34868b3a', component: "le-string-input", hostClass: classnames({ disabled: this.disabled }) }, h("div", { key: '2c5ad62aff36c5af5a3a5f1eab2038ba15210f89', class: "le-input-wrapper" }, this.label && (h("label", { key: 'bdcd6967df6fef291d5938c04f2fa4bd4a8f3925', class: "le-input-label", htmlFor: this.name }, this.label)), h("div", { key: '9bf86514adc36c1f2a112ff981befbd1d95b1d0c', class: "le-input-container", part: "container" }, this.iconStart && h("span", { key: '8d5d2221f4361f164df89e34579997f3c99bb9f8', class: "icon-start" }, this.iconStart), h("input", { key: '9cad21ae3f64608754c1f147b61bd1db42fd850c', ref: el => {
1435
+ if (this.inputRef) {
1436
+ this.inputRef(el);
1437
+ }
1438
+ }, id: this.name, type: this.type, name: this.name, value: this.value, placeholder: this.placeholder, disabled: this.disabled, readOnly: this.readonly, onInput: this.handleInput, onChange: this.handleChange, onClick: this.handleClick }), this.iconEnd && h("span", { key: '39598782f14338e64567227f4df177af6092827c', class: "icon-end" }, this.iconEnd)), !this.hideDescription && (h("div", { key: '2ad752082be8c3aba9cc611eb93eeb41c3bfa994', class: "le-input-description" }, h("le-slot", { key: 'd42c8a263f3b0542b0a14860ad2f49b2ee4954a5', name: "description", type: "text", tag: "p", label: "Description" }, h("slot", { key: '4b689e56d07f003f38d28201b0dee597dbc2f955', name: "description" })))))));
1439
+ }
1440
+ };
1441
+ LeStringInput.style = leStringInputCss;
1442
+
1443
+ export { LeButton as le_button, LeCheckbox as le_checkbox, LeComponent as le_component, LePopover as le_popover, LePopup as le_popup, LeSlot as le_slot, LeStringInput as le_string_input };
1444
+ //# sourceMappingURL=le-button.le-checkbox.le-component.le-popover.le-popup.le-slot.le-string-input.entry.js.map