le-kit 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/LLM_CONTEXT.md +22 -0
  2. package/dist/cjs/le-bar_16.cjs.entry.js +945 -1257
  3. package/dist/cjs/le-box.cjs.entry.js +40 -88
  4. package/dist/cjs/le-breadcrumbs.cjs.entry.js +223 -0
  5. package/dist/cjs/le-card.cjs.entry.js +11 -11
  6. package/dist/cjs/le-code-input.cjs.entry.js +76 -110
  7. package/dist/cjs/le-combobox.cjs.entry.js +126 -153
  8. package/dist/cjs/le-header-placeholder.cjs.entry.js +1 -1
  9. package/dist/cjs/le-kit.cjs.js +1 -1
  10. package/dist/cjs/le-multiselect.cjs.entry.js +149 -171
  11. package/dist/cjs/le-number-input.cjs.entry.js +89 -129
  12. package/dist/cjs/le-round-progress.cjs.entry.js +6 -11
  13. package/dist/cjs/le-segmented-control.cjs.entry.js +77 -87
  14. package/dist/cjs/le-side-panel-toggle.cjs.entry.js +59 -75
  15. package/dist/cjs/le-side-panel.cjs.entry.js +130 -137
  16. package/dist/cjs/le-stack.cjs.entry.js +38 -51
  17. package/dist/cjs/le-tab-bar.cjs.entry.js +80 -89
  18. package/dist/cjs/le-tab-panel.cjs.entry.js +21 -39
  19. package/dist/cjs/le-tab.cjs.entry.js +53 -91
  20. package/dist/cjs/le-tabs.cjs.entry.js +112 -122
  21. package/dist/cjs/le-tag.cjs.entry.js +23 -40
  22. package/dist/cjs/le-text.cjs.entry.js +131 -148
  23. package/dist/cjs/le-turntable.cjs.entry.js +17 -25
  24. package/dist/cjs/loader.cjs.js +1 -1
  25. package/dist/collection/collection-manifest.json +1 -0
  26. package/dist/collection/components/le-bar/le-bar.js +132 -139
  27. package/dist/collection/components/le-bar/le-bar.js.map +1 -1
  28. package/dist/collection/components/le-box/le-box.js +41 -88
  29. package/dist/collection/components/le-box/le-box.js.map +1 -1
  30. package/dist/collection/components/le-breadcrumbs/le-breadcrumbs.css +72 -0
  31. package/dist/collection/components/le-breadcrumbs/le-breadcrumbs.js +372 -0
  32. package/dist/collection/components/le-breadcrumbs/le-breadcrumbs.js.map +1 -0
  33. package/dist/collection/components/le-button/le-button.js +50 -79
  34. package/dist/collection/components/le-button/le-button.js.map +1 -1
  35. package/dist/collection/components/le-card/le-card.js +12 -11
  36. package/dist/collection/components/le-card/le-card.js.map +1 -1
  37. package/dist/collection/components/le-checkbox/le-checkbox.js +27 -42
  38. package/dist/collection/components/le-checkbox/le-checkbox.js.map +1 -1
  39. package/dist/collection/components/le-code-input/le-code-input.js +77 -110
  40. package/dist/collection/components/le-code-input/le-code-input.js.map +1 -1
  41. package/dist/collection/components/le-collapse/le-collapse.js +15 -14
  42. package/dist/collection/components/le-collapse/le-collapse.js.map +1 -1
  43. package/dist/collection/components/le-combobox/le-combobox.js +127 -153
  44. package/dist/collection/components/le-combobox/le-combobox.js.map +1 -1
  45. package/dist/collection/components/le-component/le-component.js +14 -38
  46. package/dist/collection/components/le-component/le-component.js.map +1 -1
  47. package/dist/collection/components/le-current-heading/le-current-heading.js +6 -5
  48. package/dist/collection/components/le-current-heading/le-current-heading.js.map +1 -1
  49. package/dist/collection/components/le-dropdown-base/le-dropdown-base.js +139 -165
  50. package/dist/collection/components/le-dropdown-base/le-dropdown-base.js.map +1 -1
  51. package/dist/collection/components/le-header/le-header.js +22 -45
  52. package/dist/collection/components/le-header/le-header.js.map +1 -1
  53. package/dist/collection/components/le-header-placeholder/le-header-placeholder.js +1 -1
  54. package/dist/collection/components/le-icon/le-icon.js +14 -14
  55. package/dist/collection/components/le-icon/le-icon.js.map +1 -1
  56. package/dist/collection/components/le-multiselect/le-multiselect.js +150 -171
  57. package/dist/collection/components/le-multiselect/le-multiselect.js.map +1 -1
  58. package/dist/collection/components/le-navigation/le-navigation.js +118 -128
  59. package/dist/collection/components/le-navigation/le-navigation.js.map +1 -1
  60. package/dist/collection/components/le-number-input/le-number-input.js +90 -129
  61. package/dist/collection/components/le-number-input/le-number-input.js.map +1 -1
  62. package/dist/collection/components/le-popover/le-popover.css +2 -1
  63. package/dist/collection/components/le-popover/le-popover.js +101 -126
  64. package/dist/collection/components/le-popover/le-popover.js.map +1 -1
  65. package/dist/collection/components/le-popup/le-popup.js +89 -115
  66. package/dist/collection/components/le-popup/le-popup.js.map +1 -1
  67. package/dist/collection/components/le-round-progress/le-round-progress.js +7 -12
  68. package/dist/collection/components/le-round-progress/le-round-progress.js.map +1 -1
  69. package/dist/collection/components/le-scroll-progress/le-scroll-progress.js +6 -7
  70. package/dist/collection/components/le-scroll-progress/le-scroll-progress.js.map +1 -1
  71. package/dist/collection/components/le-segmented-control/le-segmented-control.js +78 -87
  72. package/dist/collection/components/le-segmented-control/le-segmented-control.js.map +1 -1
  73. package/dist/collection/components/le-select/le-select.js +88 -110
  74. package/dist/collection/components/le-select/le-select.js.map +1 -1
  75. package/dist/collection/components/le-side-panel/le-side-panel.css +10 -1
  76. package/dist/collection/components/le-side-panel/le-side-panel.js +131 -136
  77. package/dist/collection/components/le-side-panel/le-side-panel.js.map +1 -1
  78. package/dist/collection/components/le-side-panel-toggle/le-side-panel-toggle.js +60 -75
  79. package/dist/collection/components/le-side-panel-toggle/le-side-panel-toggle.js.map +1 -1
  80. package/dist/collection/components/le-slot/le-slot.js +96 -144
  81. package/dist/collection/components/le-slot/le-slot.js.map +1 -1
  82. package/dist/collection/components/le-stack/le-stack.js +39 -51
  83. package/dist/collection/components/le-stack/le-stack.js.map +1 -1
  84. package/dist/collection/components/le-string-input/le-string-input.js +41 -84
  85. package/dist/collection/components/le-string-input/le-string-input.js.map +1 -1
  86. package/dist/collection/components/le-tab/le-tab.js +54 -91
  87. package/dist/collection/components/le-tab/le-tab.js.map +1 -1
  88. package/dist/collection/components/le-tab-bar/le-tab-bar.js +81 -89
  89. package/dist/collection/components/le-tab-bar/le-tab-bar.js.map +1 -1
  90. package/dist/collection/components/le-tab-panel/le-tab-panel.js +22 -39
  91. package/dist/collection/components/le-tab-panel/le-tab-panel.js.map +1 -1
  92. package/dist/collection/components/le-tabs/le-tabs.js +113 -122
  93. package/dist/collection/components/le-tabs/le-tabs.js.map +1 -1
  94. package/dist/collection/components/le-tag/le-tag.js +25 -40
  95. package/dist/collection/components/le-tag/le-tag.js.map +1 -1
  96. package/dist/collection/components/le-text/le-text.js +132 -148
  97. package/dist/collection/components/le-text/le-text.js.map +1 -1
  98. package/dist/collection/components/le-turntable/le-turntable.js +18 -26
  99. package/dist/collection/components/le-turntable/le-turntable.js.map +1 -1
  100. package/dist/collection/dist/components/assets/custom-elements.json +973 -645
  101. package/dist/collection/dist/components/assets/icons/arrow-left.json +21 -0
  102. package/dist/collection/dist/components/assets/icons/arrow-right.json +21 -0
  103. package/dist/collection/dist/components/assets/icons/check.json +12 -0
  104. package/dist/collection/dist/components/assets/icons/chevron-down.json +1 -2
  105. package/dist/collection/dist/components/assets/icons/chevron-left.json +12 -0
  106. package/dist/collection/dist/components/assets/icons/chevron-right.json +12 -0
  107. package/dist/collection/dist/components/assets/icons/chevron-up.json +12 -0
  108. package/dist/components/assets/custom-elements.json +973 -645
  109. package/dist/components/assets/icons/arrow-left.json +21 -0
  110. package/dist/components/assets/icons/arrow-right.json +21 -0
  111. package/dist/components/assets/icons/check.json +12 -0
  112. package/dist/components/assets/icons/chevron-down.json +1 -2
  113. package/dist/components/assets/icons/chevron-left.json +12 -0
  114. package/dist/components/assets/icons/chevron-right.json +12 -0
  115. package/dist/components/assets/icons/chevron-up.json +12 -0
  116. package/dist/components/le-bar2.js +132 -140
  117. package/dist/components/le-bar2.js.map +1 -1
  118. package/dist/components/le-box.js +41 -89
  119. package/dist/components/le-box.js.map +1 -1
  120. package/dist/components/le-breadcrumbs.d.ts +11 -0
  121. package/dist/components/le-breadcrumbs.js +327 -0
  122. package/dist/components/le-breadcrumbs.js.map +1 -0
  123. package/dist/components/le-button2.js +405 -619
  124. package/dist/components/le-button2.js.map +1 -1
  125. package/dist/components/le-card.js +12 -12
  126. package/dist/components/le-card.js.map +1 -1
  127. package/dist/components/le-code-input.js +77 -111
  128. package/dist/components/le-code-input.js.map +1 -1
  129. package/dist/components/le-collapse2.js +15 -15
  130. package/dist/components/le-collapse2.js.map +1 -1
  131. package/dist/components/le-combobox.js +127 -154
  132. package/dist/components/le-combobox.js.map +1 -1
  133. package/dist/components/le-current-heading.js +6 -6
  134. package/dist/components/le-current-heading.js.map +1 -1
  135. package/dist/components/le-dropdown-base2.js +139 -166
  136. package/dist/components/le-dropdown-base2.js.map +1 -1
  137. package/dist/components/le-header-placeholder.js +1 -1
  138. package/dist/components/le-header.js +22 -46
  139. package/dist/components/le-header.js.map +1 -1
  140. package/dist/components/le-icon2.js +14 -15
  141. package/dist/components/le-icon2.js.map +1 -1
  142. package/dist/components/le-multiselect.js +150 -172
  143. package/dist/components/le-multiselect.js.map +1 -1
  144. package/dist/components/le-navigation.js +1 -494
  145. package/dist/components/le-navigation.js.map +1 -1
  146. package/dist/components/le-navigation2.js +488 -0
  147. package/dist/components/le-navigation2.js.map +1 -0
  148. package/dist/components/le-number-input.js +90 -130
  149. package/dist/components/le-number-input.js.map +1 -1
  150. package/dist/components/le-popover2.js +103 -128
  151. package/dist/components/le-popover2.js.map +1 -1
  152. package/dist/components/le-round-progress.js +7 -12
  153. package/dist/components/le-round-progress.js.map +1 -1
  154. package/dist/components/le-scroll-progress.js +6 -8
  155. package/dist/components/le-scroll-progress.js.map +1 -1
  156. package/dist/components/le-segmented-control.js +78 -88
  157. package/dist/components/le-segmented-control.js.map +1 -1
  158. package/dist/components/le-side-panel-toggle2.js +60 -76
  159. package/dist/components/le-side-panel-toggle2.js.map +1 -1
  160. package/dist/components/le-side-panel.js +133 -139
  161. package/dist/components/le-side-panel.js.map +1 -1
  162. package/dist/components/le-stack.js +39 -52
  163. package/dist/components/le-stack.js.map +1 -1
  164. package/dist/components/le-tab-bar.js +81 -90
  165. package/dist/components/le-tab-bar.js.map +1 -1
  166. package/dist/components/le-tab-panel.js +22 -40
  167. package/dist/components/le-tab-panel.js.map +1 -1
  168. package/dist/components/le-tab2.js +54 -92
  169. package/dist/components/le-tab2.js.map +1 -1
  170. package/dist/components/le-tabs.js +113 -123
  171. package/dist/components/le-tabs.js.map +1 -1
  172. package/dist/components/le-tag2.js +24 -41
  173. package/dist/components/le-tag2.js.map +1 -1
  174. package/dist/components/le-text.js +132 -149
  175. package/dist/components/le-text.js.map +1 -1
  176. package/dist/components/le-turntable.js +18 -26
  177. package/dist/components/le-turntable.js.map +1 -1
  178. package/dist/docs.json +294 -2
  179. package/dist/esm/le-bar_16.entry.js +946 -1258
  180. package/dist/esm/le-box.entry.js +41 -89
  181. package/dist/esm/le-box.entry.js.map +1 -1
  182. package/dist/esm/le-breadcrumbs.entry.js +221 -0
  183. package/dist/esm/le-breadcrumbs.entry.js.map +1 -0
  184. package/dist/esm/le-card.entry.js +12 -12
  185. package/dist/esm/le-card.entry.js.map +1 -1
  186. package/dist/esm/le-code-input.entry.js +77 -111
  187. package/dist/esm/le-code-input.entry.js.map +1 -1
  188. package/dist/esm/le-combobox.entry.js +127 -154
  189. package/dist/esm/le-combobox.entry.js.map +1 -1
  190. package/dist/esm/le-header-placeholder.entry.js +1 -1
  191. package/dist/esm/le-kit.js +1 -1
  192. package/dist/esm/le-multiselect.entry.js +150 -172
  193. package/dist/esm/le-multiselect.entry.js.map +1 -1
  194. package/dist/esm/le-number-input.entry.js +90 -130
  195. package/dist/esm/le-number-input.entry.js.map +1 -1
  196. package/dist/esm/le-round-progress.entry.js +7 -12
  197. package/dist/esm/le-round-progress.entry.js.map +1 -1
  198. package/dist/esm/le-segmented-control.entry.js +78 -88
  199. package/dist/esm/le-segmented-control.entry.js.map +1 -1
  200. package/dist/esm/le-side-panel-toggle.entry.js +60 -76
  201. package/dist/esm/le-side-panel-toggle.entry.js.map +1 -1
  202. package/dist/esm/le-side-panel.entry.js +131 -138
  203. package/dist/esm/le-side-panel.entry.js.map +1 -1
  204. package/dist/esm/le-stack.entry.js +39 -52
  205. package/dist/esm/le-stack.entry.js.map +1 -1
  206. package/dist/esm/le-tab-bar.entry.js +81 -90
  207. package/dist/esm/le-tab-bar.entry.js.map +1 -1
  208. package/dist/esm/le-tab-panel.entry.js +22 -40
  209. package/dist/esm/le-tab-panel.entry.js.map +1 -1
  210. package/dist/esm/le-tab.entry.js +54 -92
  211. package/dist/esm/le-tab.entry.js.map +1 -1
  212. package/dist/esm/le-tabs.entry.js +113 -123
  213. package/dist/esm/le-tabs.entry.js.map +1 -1
  214. package/dist/esm/le-tag.entry.js +23 -40
  215. package/dist/esm/le-tag.entry.js.map +1 -1
  216. package/dist/esm/le-text.entry.js +132 -149
  217. package/dist/esm/le-text.entry.js.map +1 -1
  218. package/dist/esm/le-turntable.entry.js +18 -26
  219. package/dist/esm/le-turntable.entry.js.map +1 -1
  220. package/dist/esm/loader.js +1 -1
  221. package/dist/le-kit/dist/components/assets/custom-elements.json +973 -645
  222. package/dist/le-kit/dist/components/assets/icons/arrow-left.json +21 -0
  223. package/dist/le-kit/dist/components/assets/icons/arrow-right.json +21 -0
  224. package/dist/le-kit/dist/components/assets/icons/check.json +12 -0
  225. package/dist/le-kit/dist/components/assets/icons/chevron-down.json +1 -2
  226. package/dist/le-kit/dist/components/assets/icons/chevron-left.json +12 -0
  227. package/dist/le-kit/dist/components/assets/icons/chevron-right.json +12 -0
  228. package/dist/le-kit/dist/components/assets/icons/chevron-up.json +12 -0
  229. package/dist/le-kit/le-kit.esm.js +1 -1
  230. package/dist/le-kit/p-3067b18f.entry.js +2 -0
  231. package/dist/le-kit/p-3067b18f.entry.js.map +1 -0
  232. package/dist/le-kit/p-34c4d97d.entry.js +2 -0
  233. package/dist/le-kit/p-34c4d97d.entry.js.map +1 -0
  234. package/dist/le-kit/p-45182541.entry.js +2 -0
  235. package/dist/le-kit/p-45182541.entry.js.map +1 -0
  236. package/dist/le-kit/p-52a41c96.entry.js +2 -0
  237. package/dist/le-kit/p-52a41c96.entry.js.map +1 -0
  238. package/dist/le-kit/p-55fb5dd2.entry.js +2 -0
  239. package/dist/le-kit/p-55fb5dd2.entry.js.map +1 -0
  240. package/dist/le-kit/{p-ab6c1def.entry.js → p-649025f4.entry.js} +2 -2
  241. package/dist/le-kit/p-649025f4.entry.js.map +1 -0
  242. package/dist/le-kit/p-67930309.entry.js +2 -0
  243. package/dist/le-kit/p-67930309.entry.js.map +1 -0
  244. package/dist/le-kit/p-6d222705.entry.js +2 -0
  245. package/dist/le-kit/p-6d222705.entry.js.map +1 -0
  246. package/dist/le-kit/p-8049e0c2.entry.js +2 -0
  247. package/dist/le-kit/p-8049e0c2.entry.js.map +1 -0
  248. package/dist/le-kit/p-884f57bd.entry.js +2 -0
  249. package/dist/le-kit/p-88c70f9d.entry.js +2 -0
  250. package/dist/le-kit/p-88c70f9d.entry.js.map +1 -0
  251. package/dist/le-kit/p-96610729.entry.js +2 -0
  252. package/dist/le-kit/p-96610729.entry.js.map +1 -0
  253. package/dist/le-kit/p-a34054e0.entry.js +2 -0
  254. package/dist/le-kit/p-a34054e0.entry.js.map +1 -0
  255. package/dist/le-kit/p-a388e46a.entry.js +2 -0
  256. package/dist/le-kit/p-a388e46a.entry.js.map +1 -0
  257. package/dist/le-kit/p-c0c53650.entry.js +2 -0
  258. package/dist/le-kit/p-c0c53650.entry.js.map +1 -0
  259. package/dist/le-kit/p-cbf17514.entry.js +2 -0
  260. package/dist/le-kit/p-cbf17514.entry.js.map +1 -0
  261. package/dist/le-kit/p-d934de74.entry.js +2 -0
  262. package/dist/le-kit/p-d934de74.entry.js.map +1 -0
  263. package/dist/le-kit/p-de72c8b5.entry.js +2 -0
  264. package/dist/le-kit/p-de72c8b5.entry.js.map +1 -0
  265. package/dist/le-kit/p-e3dd0f2a.entry.js +2 -0
  266. package/dist/le-kit/p-e3dd0f2a.entry.js.map +1 -0
  267. package/dist/le-kit/p-ee170967.entry.js +2 -0
  268. package/dist/le-kit/p-ee170967.entry.js.map +1 -0
  269. package/dist/le-kit/p-eedb2f75.entry.js +2 -0
  270. package/dist/le-kit/p-eedb2f75.entry.js.map +1 -0
  271. package/dist/types/components/le-breadcrumbs/le-breadcrumbs.d.ts +57 -0
  272. package/dist/types/components/le-side-panel/le-side-panel.d.ts +2 -0
  273. package/dist/types/components.d.ts +84 -0
  274. package/package.json +1 -1
  275. package/dist/collection/assets/icons/chevron-down.svg +0 -3
  276. package/dist/collection/dist/components/assets/icons/chevron-down.svg +0 -3
  277. package/dist/components/assets/icons/chevron-down.svg +0 -3
  278. package/dist/le-kit/dist/components/assets/icons/chevron-down.svg +0 -3
  279. package/dist/le-kit/p-221d379a.entry.js +0 -2
  280. package/dist/le-kit/p-221d379a.entry.js.map +0 -1
  281. package/dist/le-kit/p-24112ca3.entry.js +0 -2
  282. package/dist/le-kit/p-24112ca3.entry.js.map +0 -1
  283. package/dist/le-kit/p-2c6d080d.entry.js +0 -2
  284. package/dist/le-kit/p-2c6d080d.entry.js.map +0 -1
  285. package/dist/le-kit/p-46276e77.entry.js +0 -2
  286. package/dist/le-kit/p-46276e77.entry.js.map +0 -1
  287. package/dist/le-kit/p-516c8531.entry.js +0 -2
  288. package/dist/le-kit/p-6ae60ba5.entry.js +0 -2
  289. package/dist/le-kit/p-6ae60ba5.entry.js.map +0 -1
  290. package/dist/le-kit/p-6b69f9a2.entry.js +0 -2
  291. package/dist/le-kit/p-6b69f9a2.entry.js.map +0 -1
  292. package/dist/le-kit/p-6d14306f.entry.js +0 -2
  293. package/dist/le-kit/p-6d14306f.entry.js.map +0 -1
  294. package/dist/le-kit/p-7bcdf2d4.entry.js +0 -2
  295. package/dist/le-kit/p-7bcdf2d4.entry.js.map +0 -1
  296. package/dist/le-kit/p-7cf1e23c.entry.js +0 -2
  297. package/dist/le-kit/p-7cf1e23c.entry.js.map +0 -1
  298. package/dist/le-kit/p-85f2fd4d.entry.js +0 -2
  299. package/dist/le-kit/p-85f2fd4d.entry.js.map +0 -1
  300. package/dist/le-kit/p-98242429.entry.js +0 -2
  301. package/dist/le-kit/p-98242429.entry.js.map +0 -1
  302. package/dist/le-kit/p-ab6c1def.entry.js.map +0 -1
  303. package/dist/le-kit/p-ae4ead64.entry.js +0 -2
  304. package/dist/le-kit/p-ae4ead64.entry.js.map +0 -1
  305. package/dist/le-kit/p-b05d4511.entry.js +0 -2
  306. package/dist/le-kit/p-b05d4511.entry.js.map +0 -1
  307. package/dist/le-kit/p-b6ac02ff.entry.js +0 -2
  308. package/dist/le-kit/p-b6ac02ff.entry.js.map +0 -1
  309. package/dist/le-kit/p-c24769e2.entry.js +0 -2
  310. package/dist/le-kit/p-c24769e2.entry.js.map +0 -1
  311. package/dist/le-kit/p-dc0445ad.entry.js +0 -2
  312. package/dist/le-kit/p-dc0445ad.entry.js.map +0 -1
  313. package/dist/le-kit/p-eb5286f2.entry.js +0 -2
  314. package/dist/le-kit/p-eb5286f2.entry.js.map +0 -1
  315. package/dist/le-kit/p-f78b1ee6.entry.js +0 -2
  316. package/dist/le-kit/p-f78b1ee6.entry.js.map +0 -1
  317. /package/dist/le-kit/{p-516c8531.entry.js.map → p-884f57bd.entry.js.map} +0 -0
@@ -1,4 +1,4 @@
1
- import { r as registerInstance, c as createEvent, a as getElement, h } from './index-DFTm5BqT.js';
1
+ import { r as registerInstance, c as createEvent, h, a as getElement } from './index-DFTm5BqT.js';
2
2
  import { c as classnames } from './utils-DZYCZLrF.js';
3
3
 
4
4
  const leCodeInputCss = () => `: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-border-focus:2px solid var(--le-color-focus);--le-input-border-focus-offset:2px}.le-code-input-wrapper{position:relative;display:flex;flex-direction:column}.le-input-label{display:block;margin-bottom:var(--le-spacing-2, 0.5rem);color:var(--le-text-color, inherit);font-size:var(--le-font-size-sm, 0.875rem);font-weight:500}.input-group{position:relative;display:inline-flex;width:fit-content}.ghost-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;z-index:10;cursor:text;color:transparent;background:transparent;caret-color:transparent;border:none;outline:none;letter-spacing:1em;}.ghost-input:disabled{cursor:not-allowed}.visual-container{display:flex;gap:var(--le-spacing-2, 8px);pointer-events:none;}.code-box{position:relative;width:var(--le-code-box-size, 32px);height:var(--le-code-box-size, 42px);display:flex;align-items:center;justify-content:center;background:var(--le-input-bg);border:var(--le-input-border);border-radius:var(--le-input-radius);color:var(--le-input-color);font-size:1.2rem;transition:all 0.15s ease-in-out;box-sizing:border-box;user-select:none}.code-box.active{outline:var(--le-input-border-focus);outline-offset:var(--le-input-border-focus-offset);z-index:1}.code-box.selected{background-color:SelectedItem;outline:var(--le-input-border-focus);outline-offset:var(--le-input-border-focus-offset)}.input-group.has-error .code-box{border:var(--le-input-border-error, 1px solid #ef4444)}.input-group.has-error .code-box.active{border-width:2px}:host(.disabled) .code-box{background-color:var(--le-color-disabled-bg, #f3f4f6);color:var(--le-color-disabled-text, #9ca3af);border-color:var(--le-color-disabled-border, #e5e7eb)}.le-input-description,:host(p){margin-top:var(--le-spacing-1, 0.25rem);color:var(--le-text-muted, #6b7280);font-size:var(--le-font-size-sm, 0.875rem)}`;
@@ -10,70 +10,80 @@ const LeCodeInput = class {
10
10
  this.leInput = createEvent(this, "leInput");
11
11
  this.leFocus = createEvent(this, "leFocus");
12
12
  this.leBlur = createEvent(this, "leBlur");
13
+ /**
14
+ * The value of the input
15
+ */
16
+ this.value = '';
17
+ /**
18
+ * Length of the code (number of characters)
19
+ */
20
+ this.length = 6;
21
+ /**
22
+ * The type of code (numeric or alphanumeric)
23
+ * This affects the keyboard layout on mobile devices.
24
+ */
25
+ this.type = 'text';
26
+ /**
27
+ * Whether the input is disabled
28
+ */
29
+ this.disabled = false;
30
+ /**
31
+ * Whether the input is read-only
32
+ */
33
+ this.readonly = false;
34
+ /**
35
+ * Internal validation state (can be set externally manually or via simple check)
36
+ */
37
+ this.error = false;
38
+ this.isFocused = false;
39
+ this.selectionStart = 0;
40
+ this.selectionEnd = 0;
41
+ this.handleInput = (ev) => {
42
+ const input = ev.target;
43
+ let val = input.value;
44
+ // Enforce length limit
45
+ if (val.length > this.length) {
46
+ val = val.slice(0, this.length);
47
+ // We need to force update the input value if it exceeded length
48
+ // because Stencil prop update might not happen if value is same as prop but input is different
49
+ input.value = val;
50
+ }
51
+ this.value = val;
52
+ this.updateSelection(input);
53
+ this.leInput.emit({
54
+ value: this.value,
55
+ name: this.name,
56
+ externalId: this.externalId,
57
+ });
58
+ };
59
+ this.handleChange = () => {
60
+ this.leChange.emit({
61
+ value: this.value,
62
+ name: this.name,
63
+ externalId: this.externalId,
64
+ });
65
+ };
66
+ this.handleFocus = (ev) => {
67
+ this.isFocused = true;
68
+ const input = ev.target;
69
+ // Move cursor to the end on focus so typing appends to current value
70
+ window.requestAnimationFrame(() => {
71
+ const len = input.value.length;
72
+ input.setSelectionRange(len, len);
73
+ this.updateSelection(input);
74
+ });
75
+ this.leFocus.emit();
76
+ };
77
+ this.handleBlur = () => {
78
+ this.isFocused = false;
79
+ this.leBlur.emit();
80
+ // Trigger change on blur
81
+ this.handleChange();
82
+ };
83
+ this.handleSelect = (ev) => {
84
+ this.updateSelection(ev.target);
85
+ };
13
86
  }
14
- get el() { return getElement(this); }
15
- /**
16
- * The value of the input
17
- */
18
- value = '';
19
- /**
20
- * The name of the input
21
- */
22
- name;
23
- /**
24
- * Label for the input
25
- */
26
- label;
27
- /**
28
- * Length of the code (number of characters)
29
- */
30
- length = 6;
31
- /**
32
- * Description text displayed below the input
33
- * in case there is a more complex markup,
34
- * it can be provided via slot as well
35
- */
36
- description;
37
- /**
38
- * The type of code (numeric or alphanumeric)
39
- * This affects the keyboard layout on mobile devices.
40
- */
41
- type = 'text';
42
- /**
43
- * Whether the input is disabled
44
- */
45
- disabled = false;
46
- /**
47
- * Whether the input is read-only
48
- */
49
- readonly = false;
50
- /**
51
- * External ID for linking with external systems
52
- */
53
- externalId;
54
- /**
55
- * Internal validation state (can be set externally manually or via simple check)
56
- */
57
- error = false;
58
- /**
59
- * Emitted when the value changes (on blur or Enter)
60
- */
61
- leChange;
62
- /**
63
- * Emitted when the input value changes (on keystroke)
64
- */
65
- leInput;
66
- /**
67
- * Emitted when the input is focused
68
- */
69
- leFocus;
70
- /**
71
- * Emitted when the input is blurred
72
- */
73
- leBlur;
74
- isFocused = false;
75
- selectionStart = 0;
76
- selectionEnd = 0;
77
87
  valueChanged(newValue) {
78
88
  if (newValue && newValue.length > this.length) {
79
89
  this.value = newValue.slice(0, this.length);
@@ -84,51 +94,6 @@ const LeCodeInput = class {
84
94
  this.value = this.value.slice(0, this.length);
85
95
  }
86
96
  }
87
- handleInput = (ev) => {
88
- const input = ev.target;
89
- let val = input.value;
90
- // Enforce length limit
91
- if (val.length > this.length) {
92
- val = val.slice(0, this.length);
93
- // We need to force update the input value if it exceeded length
94
- // because Stencil prop update might not happen if value is same as prop but input is different
95
- input.value = val;
96
- }
97
- this.value = val;
98
- this.updateSelection(input);
99
- this.leInput.emit({
100
- value: this.value,
101
- name: this.name,
102
- externalId: this.externalId,
103
- });
104
- };
105
- handleChange = () => {
106
- this.leChange.emit({
107
- value: this.value,
108
- name: this.name,
109
- externalId: this.externalId,
110
- });
111
- };
112
- handleFocus = (ev) => {
113
- this.isFocused = true;
114
- const input = ev.target;
115
- // Move cursor to the end on focus so typing appends to current value
116
- window.requestAnimationFrame(() => {
117
- const len = input.value.length;
118
- input.setSelectionRange(len, len);
119
- this.updateSelection(input);
120
- });
121
- this.leFocus.emit();
122
- };
123
- handleBlur = () => {
124
- this.isFocused = false;
125
- this.leBlur.emit();
126
- // Trigger change on blur
127
- this.handleChange();
128
- };
129
- handleSelect = (ev) => {
130
- this.updateSelection(ev.target);
131
- };
132
97
  updateSelection(input) {
133
98
  this.selectionStart = input.selectionStart || 0;
134
99
  this.selectionEnd = input.selectionEnd || 0;
@@ -165,10 +130,11 @@ const LeCodeInput = class {
165
130
  return boxes;
166
131
  }
167
132
  render() {
168
- return (h("le-component", { key: '74615aa06971f7b2883e4a8e6f77b76918722e53', component: "le-code-input", hostClass: classnames({ 'disabled': this.disabled, 'has-error': this.error }) }, h("div", { key: '423a974717f0676b266a362d0151540577ae8845', class: "le-code-input-wrapper" }, this.label && (h("label", { key: 'f2ba7d9c8a8a400ca31adc944919e4750785503d', class: "le-input-label", htmlFor: this.name }, this.label)), h("div", { key: 'f56b80ffc1362c164bdfe473877d934c252c9bd5', class: classnames('input-group', { 'has-error': this.error }) }, h("input", { key: 'a94d422a0884c731ecfc6221133d725057fbb87c', class: "ghost-input", id: this.name, name: this.name, type: "text", inputMode: this.type === 'number' ? 'numeric' : 'text', pattern: this.type === 'number' ? '[0-9]*' : undefined, autocomplete: "one-time-code", value: this.value, maxLength: this.length, disabled: this.disabled, readOnly: this.readonly, onInput: this.handleInput, onFocus: this.handleFocus, onBlur: this.handleBlur, onSelect: this.handleSelect,
133
+ return (h("le-component", { key: 'c9a4a92342645c54aee90091cd860fc439de6334', component: "le-code-input", hostClass: classnames({ 'disabled': this.disabled, 'has-error': this.error }) }, h("div", { key: '50480c7c827ba801421c260c4e6fef88f22dcbd0', class: "le-code-input-wrapper" }, this.label && (h("label", { key: '316653c42c51ea0a443d8401c5adaf3e4821d7c8', class: "le-input-label", htmlFor: this.name }, this.label)), h("div", { key: '803789d07d538e1576dbb0ff7536110ab620632b', class: classnames('input-group', { 'has-error': this.error }) }, h("input", { key: '7bbf221d32aa9363066d799b5b2a4aac2e9ae77f', class: "ghost-input", id: this.name, name: this.name, type: "text", inputMode: this.type === 'number' ? 'numeric' : 'text', pattern: this.type === 'number' ? '[0-9]*' : undefined, autocomplete: "one-time-code", value: this.value, maxLength: this.length, disabled: this.disabled, readOnly: this.readonly, onInput: this.handleInput, onFocus: this.handleFocus, onBlur: this.handleBlur, onSelect: this.handleSelect,
169
134
  // Prevent browser autofill background from messing up visual
170
- spellcheck: false, autoCapitalize: "none", autoCorrect: "off" }), h("div", { key: '9436ca5298d83aae923e762748d634b9517a3b17', class: "visual-container" }, this.renderBoxes())), !this.error && (h("div", { key: '398a377af9c6c26f441e94b3598a1007c64e6ea0', class: "le-input-description" }, h("le-slot", { key: '3d9a8c248efc57ffa026f9ffdf889599b276f344', name: "description", type: "text", tag: "p", label: "Description" }, h("slot", { key: '6873dec4bea990f9fe6de013e8fa729fc385871c', name: "description" }, this.description)))))));
135
+ spellcheck: false, autoCapitalize: "none", autoCorrect: "off" }), h("div", { key: '0ff57ab380039c4bbbbf0e347331eb6885f8ce63', class: "visual-container" }, this.renderBoxes())), !this.error && (h("div", { key: '7da46dfc052457588969a1c9631eb310d80030c4', class: "le-input-description" }, h("le-slot", { key: '7bcfa46fd981286736ea7ec490d65c962ef998d5', name: "description", type: "text", tag: "p", label: "Description" }, h("slot", { key: 'ee810bf920acc45c48b3cbc4ebf9598ac5937923', name: "description" }, this.description)))))));
171
136
  }
137
+ get el() { return getElement(this); }
172
138
  static get watchers() { return {
173
139
  "value": ["valueChanged"]
174
140
  }; }
@@ -1 +1 @@
1
- {"version":3,"file":"le-code-input.entry.js","sources":["src/components/le-code-input/le-code-input.css?tag=le-code-input&encapsulation=shadow","src/components/le-code-input/le-code-input.tsx"],"sourcesContent":[":host {\n display: block;\n\n --le-input-bg: var(--le-color-surface, #ffffff);\n --le-input-color: var(--le-color-text-primary, #333333);\n --le-input-border: var(--le-border-width, 2px) solid var(--le-color-border-input, #007bff);\n --le-input-radius: var(--le-radius-sm, 4px);\n --le-input-border-focus: 2px solid var(--le-color-focus);\n --le-input-border-focus-offset: 2px;\n}\n\n.le-code-input-wrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n.le-input-label {\n display: block;\n margin-bottom: var(--le-spacing-2, 0.5rem);\n color: var(--le-text-color, inherit);\n font-size: var(--le-font-size-sm, 0.875rem);\n font-weight: 500;\n}\n\n.input-group {\n position: relative;\n display: inline-flex;\n width: fit-content;\n}\n\n.ghost-input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n z-index: 10;\n cursor: text;\n color: transparent;\n background: transparent;\n caret-color: transparent;\n border: none;\n outline: none;\n letter-spacing: 1em; /* Try to match boxes? */\n}\n\n.ghost-input:disabled {\n cursor: not-allowed;\n}\n\n.visual-container {\n display: flex;\n gap: var(--le-spacing-2, 8px);\n pointer-events: none; /* Let clicks pass to ghost input */\n}\n\n.code-box {\n position: relative;\n width: var(--le-code-box-size, 32px);\n height: var(--le-code-box-size, 42px);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--le-input-bg);\n border: var(--le-input-border);\n border-radius: var(--le-input-radius);\n color: var(--le-input-color);\n font-size: 1.2rem;\n transition: all 0.15s ease-in-out;\n box-sizing: border-box;\n user-select: none;\n}\n\n.code-box.active {\n outline: var(--le-input-border-focus);\n outline-offset: var(--le-input-border-focus-offset);\n z-index: 1;\n}\n\n.code-box.selected {\n background-color: SelectedItem;\n outline: var(--le-input-border-focus);\n outline-offset: var(--le-input-border-focus-offset);\n}\n\n.input-group.has-error .code-box {\n border: var(--le-input-border-error, 1px solid #ef4444);\n}\n\n.input-group.has-error .code-box.active {\n border-width: 2px;\n}\n\n:host(.disabled) .code-box {\n background-color: var(--le-color-disabled-bg, #f3f4f6);\n color: var(--le-color-disabled-text, #9ca3af);\n border-color: var(--le-color-disabled-border, #e5e7eb);\n}\n\n.le-input-description,\n:host(p) {\n margin-top: var(--le-spacing-1, 0.25rem);\n color: var(--le-text-muted, #6b7280);\n font-size: var(--le-font-size-sm, 0.875rem);\n}\n","import { Component, Prop, Event, EventEmitter, State, h, Element, Watch } from '@stencil/core';\nimport { classnames } from '../../utils/utils';\n\n/**\n * A one-time code input component with individual frames for each character.\n * Supports standard copy/paste and range selection behaviors.\n *\n * @slot description - Additional description text displayed below the input\n *\n * @cssprop --le-code-box-size - Size of each character box (default: 40px width, 48px height)\n * @cssprop --le-input-bg - Input background color\n * @cssprop --le-input-color - Input text color\n * @cssprop --le-input-border - Input border style\n * @cssprop --le-input-border-focus - Input border style when focused\n * @cssprop --le-input-border-error - Input border style when invalid\n * @cssprop --le-input-radius - Input border radius\n */\n@Component({\n tag: 'le-code-input',\n styleUrl: 'le-code-input.css',\n shadow: true,\n})\nexport class LeCodeInput {\n @Element() el: HTMLElement;\n\n /**\n * The value of the input\n */\n @Prop({ mutable: true, reflect: true }) value: string = '';\n\n /**\n * The name of the input\n */\n @Prop() name: string;\n\n /**\n * Label for the input\n */\n @Prop() label: string;\n\n /**\n * Length of the code (number of characters)\n */\n @Prop() length: number = 6;\n\n /**\n * Description text displayed below the input\n * in case there is a more complex markup,\n * it can be provided via slot as well\n */\n @Prop() description?: string;\n\n /**\n * The type of code (numeric or alphanumeric)\n * This affects the keyboard layout on mobile devices.\n */\n @Prop() type: 'text' | 'number' = 'text';\n\n /**\n * Whether the input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the input is read-only\n */\n @Prop() readonly: boolean = false;\n\n /**\n * External ID for linking with external systems\n */\n @Prop() externalId: string;\n\n /**\n * Internal validation state (can be set externally manually or via simple check)\n */\n @Prop() error: boolean = false;\n\n /**\n * Emitted when the value changes (on blur or Enter)\n */\n @Event() leChange: EventEmitter<{ value: string; name: string; externalId: string }>;\n\n /**\n * Emitted when the input value changes (on keystroke)\n */\n @Event() leInput: EventEmitter<{ value: string; name: string; externalId: string }>;\n\n /**\n * Emitted when the input is focused\n */\n @Event() leFocus: EventEmitter<void>;\n\n /**\n * Emitted when the input is blurred\n */\n @Event() leBlur: EventEmitter<void>;\n\n @State() private isFocused: boolean = false;\n @State() private selectionStart: number = 0;\n @State() private selectionEnd: number = 0;\n\n @Watch('value')\n valueChanged(newValue: string) {\n if (newValue && newValue.length > this.length) {\n this.value = newValue.slice(0, this.length);\n }\n }\n\n componentWillLoad() {\n if (this.value && this.value.length > this.length) {\n this.value = this.value.slice(0, this.length);\n }\n }\n\n private handleInput = (ev: Event) => {\n const input = ev.target as HTMLInputElement;\n let val = input.value;\n\n // Enforce length limit\n if (val.length > this.length) {\n val = val.slice(0, this.length);\n // We need to force update the input value if it exceeded length\n // because Stencil prop update might not happen if value is same as prop but input is different\n input.value = val;\n }\n\n this.value = val;\n this.updateSelection(input);\n\n this.leInput.emit({\n value: this.value,\n name: this.name,\n externalId: this.externalId,\n });\n };\n\n private handleChange = () => {\n this.leChange.emit({\n value: this.value,\n name: this.name,\n externalId: this.externalId,\n });\n };\n\n private handleFocus = (ev: Event) => {\n this.isFocused = true;\n const input = ev.target as HTMLInputElement;\n\n // Move cursor to the end on focus so typing appends to current value\n window.requestAnimationFrame(() => {\n const len = input.value.length;\n input.setSelectionRange(len, len);\n this.updateSelection(input);\n });\n\n this.leFocus.emit();\n };\n\n private handleBlur = () => {\n this.isFocused = false;\n this.leBlur.emit();\n // Trigger change on blur\n this.handleChange();\n };\n\n private handleSelect = (ev: Event) => {\n this.updateSelection(ev.target as HTMLInputElement);\n };\n\n private updateSelection(input: HTMLInputElement) {\n this.selectionStart = input.selectionStart || 0;\n this.selectionEnd = input.selectionEnd || 0;\n }\n\n /**\n * Helper to determine active index for focus ring\n */\n private getActiveIndex(): number {\n if (!this.isFocused) return -1;\n\n // If we have a range selection, usually focus ring is not shown or shown around selection?\n // We'll stick to showing it at the cursor end (selectionEnd) or start?\n // If range selected, `selectionStart` is start of range.\n\n // If cursor is at the very end (pos == length), we highlight the last box\n if (this.selectionStart === this.length && this.length > 0) {\n return this.length - 1;\n }\n\n return this.selectionStart;\n }\n\n private renderBoxes() {\n const boxes = [];\n const activeIndex = this.getActiveIndex();\n const isRangeSelection = this.selectionEnd - this.selectionStart > 0;\n\n for (let i = 0; i < this.length; i++) {\n const char = this.value ? this.value[i] : '';\n const isActive = this.isFocused && !isRangeSelection && i === activeIndex;\n const isSelected =\n this.isFocused && isRangeSelection && i >= this.selectionStart && i < this.selectionEnd;\n\n boxes.push(\n <div\n class={classnames('code-box', {\n 'active': isActive,\n 'selected': isSelected,\n 'has-value': !!char,\n })}\n >\n {char}\n </div>,\n );\n }\n return boxes;\n }\n\n render() {\n return (\n <le-component\n component=\"le-code-input\"\n hostClass={classnames({ 'disabled': this.disabled, 'has-error': this.error })}\n >\n <div class=\"le-code-input-wrapper\">\n {this.label && (\n <label class=\"le-input-label\" htmlFor={this.name}>\n {this.label}\n </label>\n )}\n\n <div class={classnames('input-group', { 'has-error': this.error })}>\n <input\n class=\"ghost-input\"\n id={this.name}\n name={this.name}\n type=\"text\"\n inputMode={this.type === 'number' ? 'numeric' : 'text'}\n pattern={this.type === 'number' ? '[0-9]*' : undefined}\n autocomplete=\"one-time-code\"\n value={this.value}\n maxLength={this.length}\n disabled={this.disabled}\n readOnly={this.readonly}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n onSelect={this.handleSelect}\n // Prevent browser autofill background from messing up visual\n spellcheck={false}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n />\n\n <div class=\"visual-container\">{this.renderBoxes()}</div>\n </div>\n\n {!this.error && (\n <div class=\"le-input-description\">\n <le-slot name=\"description\" type=\"text\" tag=\"p\" label=\"Description\">\n <slot name=\"description\">{this.description}</slot>\n </le-slot>\n </div>\n )}\n </div>\n </le-component>\n );\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"le-code-input.entry.js","sources":["src/components/le-code-input/le-code-input.css?tag=le-code-input&encapsulation=shadow","src/components/le-code-input/le-code-input.tsx"],"sourcesContent":[":host {\n display: block;\n\n --le-input-bg: var(--le-color-surface, #ffffff);\n --le-input-color: var(--le-color-text-primary, #333333);\n --le-input-border: var(--le-border-width, 2px) solid var(--le-color-border-input, #007bff);\n --le-input-radius: var(--le-radius-sm, 4px);\n --le-input-border-focus: 2px solid var(--le-color-focus);\n --le-input-border-focus-offset: 2px;\n}\n\n.le-code-input-wrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n.le-input-label {\n display: block;\n margin-bottom: var(--le-spacing-2, 0.5rem);\n color: var(--le-text-color, inherit);\n font-size: var(--le-font-size-sm, 0.875rem);\n font-weight: 500;\n}\n\n.input-group {\n position: relative;\n display: inline-flex;\n width: fit-content;\n}\n\n.ghost-input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n z-index: 10;\n cursor: text;\n color: transparent;\n background: transparent;\n caret-color: transparent;\n border: none;\n outline: none;\n letter-spacing: 1em; /* Try to match boxes? */\n}\n\n.ghost-input:disabled {\n cursor: not-allowed;\n}\n\n.visual-container {\n display: flex;\n gap: var(--le-spacing-2, 8px);\n pointer-events: none; /* Let clicks pass to ghost input */\n}\n\n.code-box {\n position: relative;\n width: var(--le-code-box-size, 32px);\n height: var(--le-code-box-size, 42px);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--le-input-bg);\n border: var(--le-input-border);\n border-radius: var(--le-input-radius);\n color: var(--le-input-color);\n font-size: 1.2rem;\n transition: all 0.15s ease-in-out;\n box-sizing: border-box;\n user-select: none;\n}\n\n.code-box.active {\n outline: var(--le-input-border-focus);\n outline-offset: var(--le-input-border-focus-offset);\n z-index: 1;\n}\n\n.code-box.selected {\n background-color: SelectedItem;\n outline: var(--le-input-border-focus);\n outline-offset: var(--le-input-border-focus-offset);\n}\n\n.input-group.has-error .code-box {\n border: var(--le-input-border-error, 1px solid #ef4444);\n}\n\n.input-group.has-error .code-box.active {\n border-width: 2px;\n}\n\n:host(.disabled) .code-box {\n background-color: var(--le-color-disabled-bg, #f3f4f6);\n color: var(--le-color-disabled-text, #9ca3af);\n border-color: var(--le-color-disabled-border, #e5e7eb);\n}\n\n.le-input-description,\n:host(p) {\n margin-top: var(--le-spacing-1, 0.25rem);\n color: var(--le-text-muted, #6b7280);\n font-size: var(--le-font-size-sm, 0.875rem);\n}\n","import { Component, Prop, Event, EventEmitter, State, h, Element, Watch } from '@stencil/core';\nimport { classnames } from '../../utils/utils';\n\n/**\n * A one-time code input component with individual frames for each character.\n * Supports standard copy/paste and range selection behaviors.\n *\n * @slot description - Additional description text displayed below the input\n *\n * @cssprop --le-code-box-size - Size of each character box (default: 40px width, 48px height)\n * @cssprop --le-input-bg - Input background color\n * @cssprop --le-input-color - Input text color\n * @cssprop --le-input-border - Input border style\n * @cssprop --le-input-border-focus - Input border style when focused\n * @cssprop --le-input-border-error - Input border style when invalid\n * @cssprop --le-input-radius - Input border radius\n */\n@Component({\n tag: 'le-code-input',\n styleUrl: 'le-code-input.css',\n shadow: true,\n})\nexport class LeCodeInput {\n @Element() el: HTMLElement;\n\n /**\n * The value of the input\n */\n @Prop({ mutable: true, reflect: true }) value: string = '';\n\n /**\n * The name of the input\n */\n @Prop() name: string;\n\n /**\n * Label for the input\n */\n @Prop() label: string;\n\n /**\n * Length of the code (number of characters)\n */\n @Prop() length: number = 6;\n\n /**\n * Description text displayed below the input\n * in case there is a more complex markup,\n * it can be provided via slot as well\n */\n @Prop() description?: string;\n\n /**\n * The type of code (numeric or alphanumeric)\n * This affects the keyboard layout on mobile devices.\n */\n @Prop() type: 'text' | 'number' = 'text';\n\n /**\n * Whether the input is disabled\n */\n @Prop() disabled: boolean = false;\n\n /**\n * Whether the input is read-only\n */\n @Prop() readonly: boolean = false;\n\n /**\n * External ID for linking with external systems\n */\n @Prop() externalId: string;\n\n /**\n * Internal validation state (can be set externally manually or via simple check)\n */\n @Prop() error: boolean = false;\n\n /**\n * Emitted when the value changes (on blur or Enter)\n */\n @Event() leChange: EventEmitter<{ value: string; name: string; externalId: string }>;\n\n /**\n * Emitted when the input value changes (on keystroke)\n */\n @Event() leInput: EventEmitter<{ value: string; name: string; externalId: string }>;\n\n /**\n * Emitted when the input is focused\n */\n @Event() leFocus: EventEmitter<void>;\n\n /**\n * Emitted when the input is blurred\n */\n @Event() leBlur: EventEmitter<void>;\n\n @State() private isFocused: boolean = false;\n @State() private selectionStart: number = 0;\n @State() private selectionEnd: number = 0;\n\n @Watch('value')\n valueChanged(newValue: string) {\n if (newValue && newValue.length > this.length) {\n this.value = newValue.slice(0, this.length);\n }\n }\n\n componentWillLoad() {\n if (this.value && this.value.length > this.length) {\n this.value = this.value.slice(0, this.length);\n }\n }\n\n private handleInput = (ev: Event) => {\n const input = ev.target as HTMLInputElement;\n let val = input.value;\n\n // Enforce length limit\n if (val.length > this.length) {\n val = val.slice(0, this.length);\n // We need to force update the input value if it exceeded length\n // because Stencil prop update might not happen if value is same as prop but input is different\n input.value = val;\n }\n\n this.value = val;\n this.updateSelection(input);\n\n this.leInput.emit({\n value: this.value,\n name: this.name,\n externalId: this.externalId,\n });\n };\n\n private handleChange = () => {\n this.leChange.emit({\n value: this.value,\n name: this.name,\n externalId: this.externalId,\n });\n };\n\n private handleFocus = (ev: Event) => {\n this.isFocused = true;\n const input = ev.target as HTMLInputElement;\n\n // Move cursor to the end on focus so typing appends to current value\n window.requestAnimationFrame(() => {\n const len = input.value.length;\n input.setSelectionRange(len, len);\n this.updateSelection(input);\n });\n\n this.leFocus.emit();\n };\n\n private handleBlur = () => {\n this.isFocused = false;\n this.leBlur.emit();\n // Trigger change on blur\n this.handleChange();\n };\n\n private handleSelect = (ev: Event) => {\n this.updateSelection(ev.target as HTMLInputElement);\n };\n\n private updateSelection(input: HTMLInputElement) {\n this.selectionStart = input.selectionStart || 0;\n this.selectionEnd = input.selectionEnd || 0;\n }\n\n /**\n * Helper to determine active index for focus ring\n */\n private getActiveIndex(): number {\n if (!this.isFocused) return -1;\n\n // If we have a range selection, usually focus ring is not shown or shown around selection?\n // We'll stick to showing it at the cursor end (selectionEnd) or start?\n // If range selected, `selectionStart` is start of range.\n\n // If cursor is at the very end (pos == length), we highlight the last box\n if (this.selectionStart === this.length && this.length > 0) {\n return this.length - 1;\n }\n\n return this.selectionStart;\n }\n\n private renderBoxes() {\n const boxes = [];\n const activeIndex = this.getActiveIndex();\n const isRangeSelection = this.selectionEnd - this.selectionStart > 0;\n\n for (let i = 0; i < this.length; i++) {\n const char = this.value ? this.value[i] : '';\n const isActive = this.isFocused && !isRangeSelection && i === activeIndex;\n const isSelected =\n this.isFocused && isRangeSelection && i >= this.selectionStart && i < this.selectionEnd;\n\n boxes.push(\n <div\n class={classnames('code-box', {\n 'active': isActive,\n 'selected': isSelected,\n 'has-value': !!char,\n })}\n >\n {char}\n </div>,\n );\n }\n return boxes;\n }\n\n render() {\n return (\n <le-component\n component=\"le-code-input\"\n hostClass={classnames({ 'disabled': this.disabled, 'has-error': this.error })}\n >\n <div class=\"le-code-input-wrapper\">\n {this.label && (\n <label class=\"le-input-label\" htmlFor={this.name}>\n {this.label}\n </label>\n )}\n\n <div class={classnames('input-group', { 'has-error': this.error })}>\n <input\n class=\"ghost-input\"\n id={this.name}\n name={this.name}\n type=\"text\"\n inputMode={this.type === 'number' ? 'numeric' : 'text'}\n pattern={this.type === 'number' ? '[0-9]*' : undefined}\n autocomplete=\"one-time-code\"\n value={this.value}\n maxLength={this.length}\n disabled={this.disabled}\n readOnly={this.readonly}\n onInput={this.handleInput}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n onSelect={this.handleSelect}\n // Prevent browser autofill background from messing up visual\n spellcheck={false}\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n />\n\n <div class=\"visual-container\">{this.renderBoxes()}</div>\n </div>\n\n {!this.error && (\n <div class=\"le-input-description\">\n <le-slot name=\"description\" type=\"text\" tag=\"p\" label=\"Description\">\n <slot name=\"description\">{this.description}</slot>\n </le-slot>\n </div>\n )}\n </div>\n </le-component>\n );\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { r as registerInstance, c as createEvent, a as getElement, h } from './index-DFTm5BqT.js';
1
+ import { r as registerInstance, c as createEvent, h, a as getElement } from './index-DFTm5BqT.js';
2
2
 
3
3
  const leComboboxCss = () => `:host{display:inline-block;min-width:200px;--le-combobox-border-color:var(--le-color-primary, #3b82f6)}:host([disabled]){opacity:0.5;pointer-events:none}:host([full-width]){width:100%}.combobox-trigger{display:flex;align-items:center;width:100%;background:var(--le-combobox-bg, var(--le-color-surface, #fff));border:1px solid color-mix(in srgb, var(--le-combobox-border-color) 33%, transparent);border-radius:var(--le-combobox-border-radius, 0.375rem);transition:border-color 0.15s ease, box-shadow 0.15s ease}.combobox-trigger:hover:not(.is-disabled),:host(:focus-within) .combobox-trigger:not(.is-disabled){border-color:var(--le-combobox-border-color)}.combobox-trigger:focus-within{outline:2px solid var(--le-color-focus);outline-offset:2px}.combobox-trigger.is-open{border-color:var(--le-color-primary, #3b82f6)}.combobox-input{flex:1;border:none;outline:none}.combobox-input::part(container){border:none}.combobox-input::part(container):focus-within{outline:none !important}.combobox-input::placeholder{color:color-mix(in srgb, var(--le-color-text-secondary) 66%, transparent)}.combobox-trigger.is-disabled{cursor:not-allowed;background:var(--le-color-surface-disabled, #f9fafb)}.combobox-input:disabled{cursor:not-allowed}.combobox-clear{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;margin-right:0.25rem;color:var(--le-color-primary, #3b82f6);background:transparent;border:none;border-radius:0.25rem;cursor:pointer;opacity:0.6;transition:opacity 0.15s ease, background-color 0.15s ease}.combobox-clear:hover{opacity:1;background:var(--le-color-surface-hover, #f3f4f6)}.combobox-clear svg{width:0.875rem;height:0.875rem}.combobox-arrow{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:2rem;height:100%;color:var(--le-color-primary, #3b82f6);transition:transform 0.2s ease}.combobox-arrow svg{width:1rem;height:1rem}.combobox-trigger.is-open .combobox-arrow{transform:rotate(180deg)}:host([size='small']) .combobox-trigger{--le-combobox-height:2rem}:host([size='small']) .combobox-input{--le-combobox-padding-x:0.5rem;--le-combobox-font-size:0.75rem}:host([size='large']) .combobox-trigger{--le-combobox-height:3rem}:host([size='large']) .combobox-input{--le-combobox-padding-x:1rem;--le-combobox-font-size:1rem}`;
4
4
 
@@ -9,81 +9,136 @@ const LeCombobox = class {
9
9
  this.leInput = createEvent(this, "leInput");
10
10
  this.leOpen = createEvent(this, "leOpen");
11
11
  this.leClose = createEvent(this, "leClose");
12
+ /**
13
+ * The options to display in the dropdown.
14
+ */
15
+ this.options = [];
16
+ /**
17
+ * Placeholder text for the input.
18
+ */
19
+ this.placeholder = 'Type to search...';
20
+ /**
21
+ * Whether the combobox is disabled.
22
+ */
23
+ this.disabled = false;
24
+ /**
25
+ * Whether selection is required.
26
+ */
27
+ this.required = false;
28
+ /**
29
+ * Whether the multiselect should take full width of its container.
30
+ */
31
+ this.fullWidth = false;
32
+ /**
33
+ * Size variant of the combobox.
34
+ */
35
+ this.size = 'medium';
36
+ /**
37
+ * Whether to allow custom values not in the options list.
38
+ */
39
+ this.allowCustom = false;
40
+ /**
41
+ * Minimum characters before showing filtered results.
42
+ */
43
+ this.minSearchLength = 0;
44
+ /**
45
+ * Text to show when no options match the search.
46
+ */
47
+ this.emptyText = 'No results found';
48
+ /**
49
+ * Whether the dropdown is currently open.
50
+ */
51
+ this.open = false;
52
+ this.inputValue = '';
53
+ this.filterOption = (option, query) => {
54
+ if (!query || query.length < this.minSearchLength)
55
+ return true;
56
+ const searchLower = query.toLowerCase();
57
+ return (option.label.toLowerCase().includes(searchLower) ||
58
+ (option.description?.toLowerCase().includes(searchLower) ?? false));
59
+ };
60
+ this.handleOptionSelect = (e) => {
61
+ this.value = e.detail.value;
62
+ this.selectedOption = e.detail.option;
63
+ this.inputValue = e.detail.option.label;
64
+ this.leChange.emit(e.detail);
65
+ };
66
+ this.handleDropdownOpen = () => {
67
+ this.open = true;
68
+ this.leOpen.emit();
69
+ };
70
+ this.handleDropdownClose = () => {
71
+ this.open = false;
72
+ this.leClose.emit();
73
+ // If custom values not allowed, reset input to selected option
74
+ if (!this.allowCustom && this.selectedOption) {
75
+ this.inputValue = this.selectedOption.label;
76
+ }
77
+ else if (!this.allowCustom && !this.selectedOption) {
78
+ this.inputValue = '';
79
+ }
80
+ };
81
+ this.handleInputChange = (e) => {
82
+ const target = e.target;
83
+ this.inputValue = target.value;
84
+ // Emit input event for custom values
85
+ if (this.allowCustom) {
86
+ this.leInput.emit({ value: this.inputValue });
87
+ }
88
+ // Open dropdown when typing
89
+ if (!this.open && this.inputValue.length >= this.minSearchLength) {
90
+ this.dropdownEl?.show();
91
+ }
92
+ };
93
+ this.handleInputFocus = () => {
94
+ if (!this.disabled) {
95
+ this.dropdownEl?.show();
96
+ }
97
+ };
98
+ this.handleInputKeyDown = (e) => {
99
+ if (this.disabled)
100
+ return;
101
+ switch (e.key) {
102
+ case 'ArrowDown':
103
+ e.preventDefault();
104
+ if (!this.open) {
105
+ this.dropdownEl?.show();
106
+ }
107
+ break;
108
+ case 'Enter':
109
+ if (this.allowCustom && this.inputValue && !this.open) {
110
+ // Accept custom value
111
+ this.value = this.inputValue;
112
+ this.leChange.emit({
113
+ value: this.inputValue,
114
+ option: { label: this.inputValue, value: this.inputValue },
115
+ });
116
+ }
117
+ break;
118
+ case 'Escape':
119
+ if (this.open) {
120
+ this.dropdownEl?.hide();
121
+ }
122
+ break;
123
+ }
124
+ };
125
+ this.handleClear = (e) => {
126
+ e.stopPropagation();
127
+ this.value = undefined;
128
+ this.selectedOption = undefined;
129
+ this.inputValue = '';
130
+ this.inputEl?.focus();
131
+ this.leChange.emit({
132
+ value: '',
133
+ option: { label: '', value: '' },
134
+ });
135
+ };
12
136
  }
13
- get el() { return getElement(this); }
14
- /**
15
- * The options to display in the dropdown.
16
- */
17
- options = [];
18
- /**
19
- * The currently selected value.
20
- */
21
- value;
22
- /**
23
- * Placeholder text for the input.
24
- */
25
- placeholder = 'Type to search...';
26
- /**
27
- * Whether the combobox is disabled.
28
- */
29
- disabled = false;
30
- /**
31
- * Whether selection is required.
32
- */
33
- required = false;
34
- /**
35
- * Name attribute for form submission.
36
- */
37
- name;
38
- /**
39
- * Whether the multiselect should take full width of its container.
40
- */
41
- fullWidth = false;
42
- /**
43
- * Size variant of the combobox.
44
- */
45
- size = 'medium';
46
- /**
47
- * Whether to allow custom values not in the options list.
48
- */
49
- allowCustom = false;
50
- /**
51
- * Minimum characters before showing filtered results.
52
- */
53
- minSearchLength = 0;
54
- /**
55
- * Text to show when no options match the search.
56
- */
57
- emptyText = 'No results found';
58
- /**
59
- * Whether the dropdown is currently open.
60
- */
61
- open = false;
62
- /**
63
- * Emitted when the selected value changes.
64
- */
65
- leChange;
66
- /**
67
- * Emitted when the input value changes (for custom values).
68
- */
69
- leInput;
70
- /**
71
- * Emitted when the dropdown opens.
72
- */
73
- leOpen;
74
- /**
75
- * Emitted when the dropdown closes.
76
- */
77
- leClose;
78
137
  handleWindowClick(event) {
79
138
  if (!this.el.contains(event.target)) {
80
139
  this.dropdownEl?.hide();
81
140
  }
82
141
  }
83
- inputValue = '';
84
- selectedOption;
85
- dropdownEl;
86
- inputEl;
87
142
  handleValueChange() {
88
143
  this.updateSelectedOption();
89
144
  }
@@ -119,89 +174,6 @@ const LeCombobox = class {
119
174
  this.inputValue = '';
120
175
  }
121
176
  }
122
- filterOption = (option, query) => {
123
- if (!query || query.length < this.minSearchLength)
124
- return true;
125
- const searchLower = query.toLowerCase();
126
- return (option.label.toLowerCase().includes(searchLower) ||
127
- (option.description?.toLowerCase().includes(searchLower) ?? false));
128
- };
129
- handleOptionSelect = (e) => {
130
- this.value = e.detail.value;
131
- this.selectedOption = e.detail.option;
132
- this.inputValue = e.detail.option.label;
133
- this.leChange.emit(e.detail);
134
- };
135
- handleDropdownOpen = () => {
136
- this.open = true;
137
- this.leOpen.emit();
138
- };
139
- handleDropdownClose = () => {
140
- this.open = false;
141
- this.leClose.emit();
142
- // If custom values not allowed, reset input to selected option
143
- if (!this.allowCustom && this.selectedOption) {
144
- this.inputValue = this.selectedOption.label;
145
- }
146
- else if (!this.allowCustom && !this.selectedOption) {
147
- this.inputValue = '';
148
- }
149
- };
150
- handleInputChange = (e) => {
151
- const target = e.target;
152
- this.inputValue = target.value;
153
- // Emit input event for custom values
154
- if (this.allowCustom) {
155
- this.leInput.emit({ value: this.inputValue });
156
- }
157
- // Open dropdown when typing
158
- if (!this.open && this.inputValue.length >= this.minSearchLength) {
159
- this.dropdownEl?.show();
160
- }
161
- };
162
- handleInputFocus = () => {
163
- if (!this.disabled) {
164
- this.dropdownEl?.show();
165
- }
166
- };
167
- handleInputKeyDown = (e) => {
168
- if (this.disabled)
169
- return;
170
- switch (e.key) {
171
- case 'ArrowDown':
172
- e.preventDefault();
173
- if (!this.open) {
174
- this.dropdownEl?.show();
175
- }
176
- break;
177
- case 'Enter':
178
- if (this.allowCustom && this.inputValue && !this.open) {
179
- // Accept custom value
180
- this.value = this.inputValue;
181
- this.leChange.emit({
182
- value: this.inputValue,
183
- option: { label: this.inputValue, value: this.inputValue },
184
- });
185
- }
186
- break;
187
- case 'Escape':
188
- if (this.open) {
189
- this.dropdownEl?.hide();
190
- }
191
- break;
192
- }
193
- };
194
- handleClear = (e) => {
195
- e.stopPropagation();
196
- this.value = undefined;
197
- this.selectedOption = undefined;
198
- this.inputValue = '';
199
- this.inputEl?.focus();
200
- this.leChange.emit({
201
- value: '',
202
- option: { label: '', value: '' },
203
- });
204
- };
205
177
  /**
206
178
  * Opens the dropdown.
207
179
  */
@@ -222,8 +194,9 @@ const LeCombobox = class {
222
194
  }
223
195
  render() {
224
196
  const hasValue = this.inputValue.length > 0;
225
- return (h("le-component", { key: '77660875e900dceb4cca50087a9ea7fad38d0de8', component: "le-combobox" }, h("le-dropdown-base", { key: 'a7d46b3226322945465a8d22c87c3df1939d0c11', ref: el => (this.dropdownEl = el), options: this.parsedOptions, value: this.value, disabled: this.disabled, filterFn: this.filterOption, filterQuery: this.inputValue, emptyText: this.emptyText, fullWidth: this.fullWidth, closeOnClickOutside: false, onLeOptionSelect: this.handleOptionSelect, onLeDropdownOpen: this.handleDropdownOpen, onLeDropdownClose: this.handleDropdownClose }, h("div", { key: 'bc402ba87163d604c49d41acf32a2da7710c12d5', slot: "trigger", class: { 'combobox-trigger': true, 'is-open': this.open } }, h("le-string-input", { key: 'd676bb665963d090e88195b133f7a0f5e379b9e9', mode: "default", hideDescription: true, inputRef: el => (this.inputEl = el), type: "text", class: "combobox-input", value: this.inputValue, placeholder: this.placeholder, disabled: this.disabled, "aria-haspopup": "listbox", "aria-expanded": this.open ? 'true' : 'false', "aria-autocomplete": "list", onInput: this.handleInputChange, onFocus: this.handleInputFocus, onKeyDown: this.handleInputKeyDown }), hasValue && !this.disabled && (h("button", { key: '78446bc41c35fa2815acbfc34ea377dc33a1e55b', type: "button", class: "combobox-clear", onClick: this.handleClear, "aria-label": "Clear", tabIndex: -1 }, h("svg", { key: 'a596191694990ebb2e48d1529da0e0a6eb61e5b9', viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: 'd6503800924e82555571c8955b33bcfddd90c7d0', d: "M4 4l8 8M12 4l-8 8" })))), h("span", { key: 'a032adbc03c135bf0e9c28f7272fa125c22fd37c', class: "combobox-arrow" }, h("svg", { key: '258a8d6a98071654a8bf59ac23dc517a9af19daa', viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: '5960ffe0d91ae52563420fa901653e17d458b522', d: "M4 6l4 4 4-4" }))))), this.name && h("input", { key: '44791ad0af7eae39a3d8b7cabf12a68b11fc20ba', type: "hidden", name: this.name, value: this.value?.toString() ?? '' })));
197
+ return (h("le-component", { key: '2b0d151b589302147ff6a958a1bcbdd9fe973d6e', component: "le-combobox" }, h("le-dropdown-base", { key: '2916e62fe29d92274ec735719675ed4847f19aa9', ref: el => (this.dropdownEl = el), options: this.parsedOptions, value: this.value, disabled: this.disabled, filterFn: this.filterOption, filterQuery: this.inputValue, emptyText: this.emptyText, fullWidth: this.fullWidth, closeOnClickOutside: false, onLeOptionSelect: this.handleOptionSelect, onLeDropdownOpen: this.handleDropdownOpen, onLeDropdownClose: this.handleDropdownClose }, h("div", { key: 'b5ff8b929ce9d204327a11fd191d5c0b4a8bea70', slot: "trigger", class: { 'combobox-trigger': true, 'is-open': this.open } }, h("le-string-input", { key: 'a3cb396b00e753634bd6c132fad9beea9586e0db', mode: "default", hideDescription: true, inputRef: el => (this.inputEl = el), type: "text", class: "combobox-input", value: this.inputValue, placeholder: this.placeholder, disabled: this.disabled, "aria-haspopup": "listbox", "aria-expanded": this.open ? 'true' : 'false', "aria-autocomplete": "list", onInput: this.handleInputChange, onFocus: this.handleInputFocus, onKeyDown: this.handleInputKeyDown }), hasValue && !this.disabled && (h("button", { key: '6f8cf150544c1b33c07acf2bbb51cafb359a9446', type: "button", class: "combobox-clear", onClick: this.handleClear, "aria-label": "Clear", tabIndex: -1 }, h("svg", { key: 'e06af09838a2c451ca322ac5aa1c6360d1b6e527', viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: '1d03c90b883b4a0c35b4fe6a089c95ba210287cf', d: "M4 4l8 8M12 4l-8 8" })))), h("span", { key: '530f07b37ec61faac0eb5ee9bce312a4f056fc70', class: "combobox-arrow" }, h("svg", { key: 'fd6ee2352adb93ee4fed752caba5552c7a20d5bf', viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("path", { key: '4aa7fe6c1aa02681a3fc634124227a1b7263df29', d: "M4 6l4 4 4-4" }))))), this.name && h("input", { key: '388a14c0b95a7a8b5897e684a41c1adbbcd10e46', type: "hidden", name: this.name, value: this.value?.toString() ?? '' })));
226
198
  }
199
+ get el() { return getElement(this); }
227
200
  static get watchers() { return {
228
201
  "value": ["handleValueChange"],
229
202
  "options": ["handleOptionsChange"]