@keenthemes/ktui 1.0.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 (426) hide show
  1. package/CONTRIBUTING.md +88 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +124 -0
  4. package/dist/ktui.js +19201 -0
  5. package/dist/ktui.min.js +2 -0
  6. package/dist/ktui.min.js.map +1 -0
  7. package/lib/cjs/components/accordion/accordion.js +168 -0
  8. package/lib/cjs/components/accordion/accordion.js.map +1 -0
  9. package/lib/cjs/components/accordion/index.js +6 -0
  10. package/lib/cjs/components/accordion/index.js.map +1 -0
  11. package/lib/cjs/components/accordion/types.js +3 -0
  12. package/lib/cjs/components/accordion/types.js.map +1 -0
  13. package/lib/cjs/components/collapse/collapse.js +169 -0
  14. package/lib/cjs/components/collapse/collapse.js.map +1 -0
  15. package/lib/cjs/components/collapse/index.js +6 -0
  16. package/lib/cjs/components/collapse/index.js.map +1 -0
  17. package/lib/cjs/components/collapse/types.js +3 -0
  18. package/lib/cjs/components/collapse/types.js.map +1 -0
  19. package/lib/cjs/components/component.js +135 -0
  20. package/lib/cjs/components/component.js.map +1 -0
  21. package/lib/cjs/components/config.js +26 -0
  22. package/lib/cjs/components/config.js.map +1 -0
  23. package/lib/cjs/components/config.umd.js +23 -0
  24. package/lib/cjs/components/config.umd.js.map +1 -0
  25. package/lib/cjs/components/constants.js +15 -0
  26. package/lib/cjs/components/constants.js.map +1 -0
  27. package/lib/cjs/components/datatable/datatable.js +1464 -0
  28. package/lib/cjs/components/datatable/datatable.js.map +1 -0
  29. package/lib/cjs/components/datatable/index.js +6 -0
  30. package/lib/cjs/components/datatable/index.js.map +1 -0
  31. package/lib/cjs/components/datatable/types.js +3 -0
  32. package/lib/cjs/components/datatable/types.js.map +1 -0
  33. package/lib/cjs/components/dismiss/dismiss.js +131 -0
  34. package/lib/cjs/components/dismiss/dismiss.js.map +1 -0
  35. package/lib/cjs/components/dismiss/index.js +6 -0
  36. package/lib/cjs/components/dismiss/index.js.map +1 -0
  37. package/lib/cjs/components/dismiss/types.js +3 -0
  38. package/lib/cjs/components/dismiss/types.js.map +1 -0
  39. package/lib/cjs/components/drawer/drawer.js +347 -0
  40. package/lib/cjs/components/drawer/drawer.js.map +1 -0
  41. package/lib/cjs/components/drawer/index.js +6 -0
  42. package/lib/cjs/components/drawer/index.js.map +1 -0
  43. package/lib/cjs/components/drawer/types.js +3 -0
  44. package/lib/cjs/components/drawer/types.js.map +1 -0
  45. package/lib/cjs/components/dropdown/dropdown.js +403 -0
  46. package/lib/cjs/components/dropdown/dropdown.js.map +1 -0
  47. package/lib/cjs/components/dropdown/index.js +6 -0
  48. package/lib/cjs/components/dropdown/index.js.map +1 -0
  49. package/lib/cjs/components/dropdown/types.js +3 -0
  50. package/lib/cjs/components/dropdown/types.js.map +1 -0
  51. package/lib/cjs/components/image-input/image-input.js +191 -0
  52. package/lib/cjs/components/image-input/image-input.js.map +1 -0
  53. package/lib/cjs/components/image-input/index.js +6 -0
  54. package/lib/cjs/components/image-input/index.js.map +1 -0
  55. package/lib/cjs/components/image-input/types.js +3 -0
  56. package/lib/cjs/components/image-input/types.js.map +1 -0
  57. package/lib/cjs/components/menu/index.js +6 -0
  58. package/lib/cjs/components/menu/index.js.map +1 -0
  59. package/lib/cjs/components/menu/menu.js +1021 -0
  60. package/lib/cjs/components/menu/menu.js.map +1 -0
  61. package/lib/cjs/components/menu/types.js +3 -0
  62. package/lib/cjs/components/menu/types.js.map +1 -0
  63. package/lib/cjs/components/modal/index.js +6 -0
  64. package/lib/cjs/components/modal/index.js.map +1 -0
  65. package/lib/cjs/components/modal/modal.js +316 -0
  66. package/lib/cjs/components/modal/modal.js.map +1 -0
  67. package/lib/cjs/components/modal/types.js +3 -0
  68. package/lib/cjs/components/modal/types.js.map +1 -0
  69. package/lib/cjs/components/reparent/index.js +6 -0
  70. package/lib/cjs/components/reparent/index.js.map +1 -0
  71. package/lib/cjs/components/reparent/reparent.js +93 -0
  72. package/lib/cjs/components/reparent/reparent.js.map +1 -0
  73. package/lib/cjs/components/reparent/types.js +3 -0
  74. package/lib/cjs/components/reparent/types.js.map +1 -0
  75. package/lib/cjs/components/scrollable/index.js +6 -0
  76. package/lib/cjs/components/scrollable/index.js.map +1 -0
  77. package/lib/cjs/components/scrollable/scrollable.js +259 -0
  78. package/lib/cjs/components/scrollable/scrollable.js.map +1 -0
  79. package/lib/cjs/components/scrollable/types.js +3 -0
  80. package/lib/cjs/components/scrollable/types.js.map +1 -0
  81. package/lib/cjs/components/scrollspy/index.js +6 -0
  82. package/lib/cjs/components/scrollspy/index.js.map +1 -0
  83. package/lib/cjs/components/scrollspy/scrollspy.js +174 -0
  84. package/lib/cjs/components/scrollspy/scrollspy.js.map +1 -0
  85. package/lib/cjs/components/scrollspy/types.js +3 -0
  86. package/lib/cjs/components/scrollspy/types.js.map +1 -0
  87. package/lib/cjs/components/scrollto/index.js +6 -0
  88. package/lib/cjs/components/scrollto/index.js.map +1 -0
  89. package/lib/cjs/components/scrollto/scrollto.js +103 -0
  90. package/lib/cjs/components/scrollto/scrollto.js.map +1 -0
  91. package/lib/cjs/components/scrollto/types.js +3 -0
  92. package/lib/cjs/components/scrollto/types.js.map +1 -0
  93. package/lib/cjs/components/stepper/index.js +6 -0
  94. package/lib/cjs/components/stepper/index.js.map +1 -0
  95. package/lib/cjs/components/stepper/stepper.js +258 -0
  96. package/lib/cjs/components/stepper/stepper.js.map +1 -0
  97. package/lib/cjs/components/stepper/types.js +3 -0
  98. package/lib/cjs/components/stepper/types.js.map +1 -0
  99. package/lib/cjs/components/sticky/index.js +6 -0
  100. package/lib/cjs/components/sticky/index.js.map +1 -0
  101. package/lib/cjs/components/sticky/sticky.js +297 -0
  102. package/lib/cjs/components/sticky/sticky.js.map +1 -0
  103. package/lib/cjs/components/sticky/types.js +3 -0
  104. package/lib/cjs/components/sticky/types.js.map +1 -0
  105. package/lib/cjs/components/tabs/index.js +6 -0
  106. package/lib/cjs/components/tabs/index.js.map +1 -0
  107. package/lib/cjs/components/tabs/tabs.js +146 -0
  108. package/lib/cjs/components/tabs/tabs.js.map +1 -0
  109. package/lib/cjs/components/tabs/types.js +3 -0
  110. package/lib/cjs/components/tabs/types.js.map +1 -0
  111. package/lib/cjs/components/theme/index.js +6 -0
  112. package/lib/cjs/components/theme/index.js.map +1 -0
  113. package/lib/cjs/components/theme/theme.js +147 -0
  114. package/lib/cjs/components/theme/theme.js.map +1 -0
  115. package/lib/cjs/components/theme/types.js +3 -0
  116. package/lib/cjs/components/theme/types.js.map +1 -0
  117. package/lib/cjs/components/toggle/index.js +6 -0
  118. package/lib/cjs/components/toggle/index.js.map +1 -0
  119. package/lib/cjs/components/toggle/toggle.js +139 -0
  120. package/lib/cjs/components/toggle/toggle.js.map +1 -0
  121. package/lib/cjs/components/toggle/types.js +3 -0
  122. package/lib/cjs/components/toggle/types.js.map +1 -0
  123. package/lib/cjs/components/toggle-password/index.js +6 -0
  124. package/lib/cjs/components/toggle-password/index.js.map +1 -0
  125. package/lib/cjs/components/toggle-password/toggle-password.js +131 -0
  126. package/lib/cjs/components/toggle-password/toggle-password.js.map +1 -0
  127. package/lib/cjs/components/toggle-password/types.js +3 -0
  128. package/lib/cjs/components/toggle-password/types.js.map +1 -0
  129. package/lib/cjs/components/tooltip/index.js +6 -0
  130. package/lib/cjs/components/tooltip/index.js.map +1 -0
  131. package/lib/cjs/components/tooltip/tooltip.js +271 -0
  132. package/lib/cjs/components/tooltip/tooltip.js.map +1 -0
  133. package/lib/cjs/components/tooltip/types.js +3 -0
  134. package/lib/cjs/components/tooltip/types.js.map +1 -0
  135. package/lib/cjs/helpers/data.js +33 -0
  136. package/lib/cjs/helpers/data.js.map +1 -0
  137. package/lib/cjs/helpers/dom.js +297 -0
  138. package/lib/cjs/helpers/dom.js.map +1 -0
  139. package/lib/cjs/helpers/event-handler.js +36 -0
  140. package/lib/cjs/helpers/event-handler.js.map +1 -0
  141. package/lib/cjs/helpers/utils.js +94 -0
  142. package/lib/cjs/helpers/utils.js.map +1 -0
  143. package/lib/cjs/index.js +105 -0
  144. package/lib/cjs/index.js.map +1 -0
  145. package/lib/cjs/types.js +3 -0
  146. package/lib/cjs/types.js.map +1 -0
  147. package/lib/esm/components/accordion/accordion.js +165 -0
  148. package/lib/esm/components/accordion/accordion.js.map +1 -0
  149. package/lib/esm/components/accordion/index.js +2 -0
  150. package/lib/esm/components/accordion/index.js.map +1 -0
  151. package/lib/esm/components/accordion/types.js +2 -0
  152. package/lib/esm/components/accordion/types.js.map +1 -0
  153. package/lib/esm/components/collapse/collapse.js +166 -0
  154. package/lib/esm/components/collapse/collapse.js.map +1 -0
  155. package/lib/esm/components/collapse/index.js +2 -0
  156. package/lib/esm/components/collapse/index.js.map +1 -0
  157. package/lib/esm/components/collapse/types.js +2 -0
  158. package/lib/esm/components/collapse/types.js.map +1 -0
  159. package/lib/esm/components/component.js +133 -0
  160. package/lib/esm/components/component.js.map +1 -0
  161. package/lib/esm/components/config.js +24 -0
  162. package/lib/esm/components/config.js.map +1 -0
  163. package/lib/esm/components/config.umd.js +23 -0
  164. package/lib/esm/components/config.umd.js.map +1 -0
  165. package/lib/esm/components/constants.js +12 -0
  166. package/lib/esm/components/constants.js.map +1 -0
  167. package/lib/esm/components/datatable/datatable.js +1461 -0
  168. package/lib/esm/components/datatable/datatable.js.map +1 -0
  169. package/lib/esm/components/datatable/index.js +2 -0
  170. package/lib/esm/components/datatable/index.js.map +1 -0
  171. package/lib/esm/components/datatable/types.js +2 -0
  172. package/lib/esm/components/datatable/types.js.map +1 -0
  173. package/lib/esm/components/dismiss/dismiss.js +128 -0
  174. package/lib/esm/components/dismiss/dismiss.js.map +1 -0
  175. package/lib/esm/components/dismiss/index.js +2 -0
  176. package/lib/esm/components/dismiss/index.js.map +1 -0
  177. package/lib/esm/components/dismiss/types.js +2 -0
  178. package/lib/esm/components/dismiss/types.js.map +1 -0
  179. package/lib/esm/components/drawer/drawer.js +344 -0
  180. package/lib/esm/components/drawer/drawer.js.map +1 -0
  181. package/lib/esm/components/drawer/index.js +2 -0
  182. package/lib/esm/components/drawer/index.js.map +1 -0
  183. package/lib/esm/components/drawer/types.js +2 -0
  184. package/lib/esm/components/drawer/types.js.map +1 -0
  185. package/lib/esm/components/dropdown/dropdown.js +400 -0
  186. package/lib/esm/components/dropdown/dropdown.js.map +1 -0
  187. package/lib/esm/components/dropdown/index.js +2 -0
  188. package/lib/esm/components/dropdown/index.js.map +1 -0
  189. package/lib/esm/components/dropdown/types.js +2 -0
  190. package/lib/esm/components/dropdown/types.js.map +1 -0
  191. package/lib/esm/components/image-input/image-input.js +188 -0
  192. package/lib/esm/components/image-input/image-input.js.map +1 -0
  193. package/lib/esm/components/image-input/index.js +2 -0
  194. package/lib/esm/components/image-input/index.js.map +1 -0
  195. package/lib/esm/components/image-input/types.js +2 -0
  196. package/lib/esm/components/image-input/types.js.map +1 -0
  197. package/lib/esm/components/menu/index.js +2 -0
  198. package/lib/esm/components/menu/index.js.map +1 -0
  199. package/lib/esm/components/menu/menu.js +1018 -0
  200. package/lib/esm/components/menu/menu.js.map +1 -0
  201. package/lib/esm/components/menu/types.js +2 -0
  202. package/lib/esm/components/menu/types.js.map +1 -0
  203. package/lib/esm/components/modal/index.js +2 -0
  204. package/lib/esm/components/modal/index.js.map +1 -0
  205. package/lib/esm/components/modal/modal.js +313 -0
  206. package/lib/esm/components/modal/modal.js.map +1 -0
  207. package/lib/esm/components/modal/types.js +2 -0
  208. package/lib/esm/components/modal/types.js.map +1 -0
  209. package/lib/esm/components/reparent/index.js +2 -0
  210. package/lib/esm/components/reparent/index.js.map +1 -0
  211. package/lib/esm/components/reparent/reparent.js +90 -0
  212. package/lib/esm/components/reparent/reparent.js.map +1 -0
  213. package/lib/esm/components/reparent/types.js +2 -0
  214. package/lib/esm/components/reparent/types.js.map +1 -0
  215. package/lib/esm/components/scrollable/index.js +2 -0
  216. package/lib/esm/components/scrollable/index.js.map +1 -0
  217. package/lib/esm/components/scrollable/scrollable.js +256 -0
  218. package/lib/esm/components/scrollable/scrollable.js.map +1 -0
  219. package/lib/esm/components/scrollable/types.js +2 -0
  220. package/lib/esm/components/scrollable/types.js.map +1 -0
  221. package/lib/esm/components/scrollspy/index.js +2 -0
  222. package/lib/esm/components/scrollspy/index.js.map +1 -0
  223. package/lib/esm/components/scrollspy/scrollspy.js +171 -0
  224. package/lib/esm/components/scrollspy/scrollspy.js.map +1 -0
  225. package/lib/esm/components/scrollspy/types.js +2 -0
  226. package/lib/esm/components/scrollspy/types.js.map +1 -0
  227. package/lib/esm/components/scrollto/index.js +2 -0
  228. package/lib/esm/components/scrollto/index.js.map +1 -0
  229. package/lib/esm/components/scrollto/scrollto.js +100 -0
  230. package/lib/esm/components/scrollto/scrollto.js.map +1 -0
  231. package/lib/esm/components/scrollto/types.js +2 -0
  232. package/lib/esm/components/scrollto/types.js.map +1 -0
  233. package/lib/esm/components/stepper/index.js +2 -0
  234. package/lib/esm/components/stepper/index.js.map +1 -0
  235. package/lib/esm/components/stepper/stepper.js +255 -0
  236. package/lib/esm/components/stepper/stepper.js.map +1 -0
  237. package/lib/esm/components/stepper/types.js +2 -0
  238. package/lib/esm/components/stepper/types.js.map +1 -0
  239. package/lib/esm/components/sticky/index.js +2 -0
  240. package/lib/esm/components/sticky/index.js.map +1 -0
  241. package/lib/esm/components/sticky/sticky.js +294 -0
  242. package/lib/esm/components/sticky/sticky.js.map +1 -0
  243. package/lib/esm/components/sticky/types.js +2 -0
  244. package/lib/esm/components/sticky/types.js.map +1 -0
  245. package/lib/esm/components/tabs/index.js +2 -0
  246. package/lib/esm/components/tabs/index.js.map +1 -0
  247. package/lib/esm/components/tabs/tabs.js +143 -0
  248. package/lib/esm/components/tabs/tabs.js.map +1 -0
  249. package/lib/esm/components/tabs/types.js +2 -0
  250. package/lib/esm/components/tabs/types.js.map +1 -0
  251. package/lib/esm/components/theme/index.js +2 -0
  252. package/lib/esm/components/theme/index.js.map +1 -0
  253. package/lib/esm/components/theme/theme.js +144 -0
  254. package/lib/esm/components/theme/theme.js.map +1 -0
  255. package/lib/esm/components/theme/types.js +2 -0
  256. package/lib/esm/components/theme/types.js.map +1 -0
  257. package/lib/esm/components/toggle/index.js +2 -0
  258. package/lib/esm/components/toggle/index.js.map +1 -0
  259. package/lib/esm/components/toggle/toggle.js +136 -0
  260. package/lib/esm/components/toggle/toggle.js.map +1 -0
  261. package/lib/esm/components/toggle/types.js +2 -0
  262. package/lib/esm/components/toggle/types.js.map +1 -0
  263. package/lib/esm/components/toggle-password/index.js +2 -0
  264. package/lib/esm/components/toggle-password/index.js.map +1 -0
  265. package/lib/esm/components/toggle-password/toggle-password.js +128 -0
  266. package/lib/esm/components/toggle-password/toggle-password.js.map +1 -0
  267. package/lib/esm/components/toggle-password/types.js +2 -0
  268. package/lib/esm/components/toggle-password/types.js.map +1 -0
  269. package/lib/esm/components/tooltip/index.js +2 -0
  270. package/lib/esm/components/tooltip/index.js.map +1 -0
  271. package/lib/esm/components/tooltip/tooltip.js +268 -0
  272. package/lib/esm/components/tooltip/tooltip.js.map +1 -0
  273. package/lib/esm/components/tooltip/types.js +2 -0
  274. package/lib/esm/components/tooltip/types.js.map +1 -0
  275. package/lib/esm/helpers/data.js +31 -0
  276. package/lib/esm/helpers/data.js.map +1 -0
  277. package/lib/esm/helpers/dom.js +295 -0
  278. package/lib/esm/helpers/dom.js.map +1 -0
  279. package/lib/esm/helpers/event-handler.js +34 -0
  280. package/lib/esm/helpers/event-handler.js.map +1 -0
  281. package/lib/esm/helpers/utils.js +92 -0
  282. package/lib/esm/helpers/utils.js.map +1 -0
  283. package/lib/esm/index.js +79 -0
  284. package/lib/esm/index.js.map +1 -0
  285. package/lib/esm/types.js +2 -0
  286. package/lib/esm/types.js.map +1 -0
  287. package/package.json +85 -0
  288. package/prettier.config.js +9 -0
  289. package/src/components/accordion/accordion-menu.css +51 -0
  290. package/src/components/accordion/accordion.css +86 -0
  291. package/src/components/accordion/accordion.ts +221 -0
  292. package/src/components/accordion/index.ts +7 -0
  293. package/src/components/accordion/types.ts +16 -0
  294. package/src/components/alert/alert.css +282 -0
  295. package/src/components/avatar/avatar.css +46 -0
  296. package/src/components/badge/badge.css +176 -0
  297. package/src/components/breadcrumb/breadcrumb.css +38 -0
  298. package/src/components/btn/btn.css +227 -0
  299. package/src/components/card/card.css +158 -0
  300. package/src/components/checkbox/checkbox.css +74 -0
  301. package/src/components/collapse/collapse.css +14 -0
  302. package/src/components/collapse/collapse.ts +200 -0
  303. package/src/components/collapse/index.ts +7 -0
  304. package/src/components/collapse/types.ts +16 -0
  305. package/src/components/component.ts +132 -0
  306. package/src/components/constants.ts +16 -0
  307. package/src/components/datatable/datatable-checkbox.ts +236 -0
  308. package/src/components/datatable/datatable-sort.ts +154 -0
  309. package/src/components/datatable/datatable.css +110 -0
  310. package/src/components/datatable/datatable.ts +1657 -0
  311. package/src/components/datatable/index.ts +19 -0
  312. package/src/components/datatable/types.ts +203 -0
  313. package/src/components/datepicker/calendar.ts +1397 -0
  314. package/src/components/datepicker/config.ts +368 -0
  315. package/src/components/datepicker/datepicker.css +7 -0
  316. package/src/components/datepicker/datepicker.ts +1287 -0
  317. package/src/components/datepicker/dropdown.ts +757 -0
  318. package/src/components/datepicker/events.ts +149 -0
  319. package/src/components/datepicker/index.ts +10 -0
  320. package/src/components/datepicker/keyboard.ts +646 -0
  321. package/src/components/datepicker/locales.ts +80 -0
  322. package/src/components/datepicker/templates.ts +792 -0
  323. package/src/components/datepicker/types.ts +154 -0
  324. package/src/components/datepicker/utils.ts +631 -0
  325. package/src/components/dismiss/dismiss.css +10 -0
  326. package/src/components/dismiss/dismiss.ts +152 -0
  327. package/src/components/dismiss/index.ts +7 -0
  328. package/src/components/dismiss/types.ts +17 -0
  329. package/src/components/drawer/drawer.css +97 -0
  330. package/src/components/drawer/drawer.ts +437 -0
  331. package/src/components/drawer/index.ts +7 -0
  332. package/src/components/drawer/types.ts +25 -0
  333. package/src/components/dropdown/dropdown-menu.css +56 -0
  334. package/src/components/dropdown/dropdown.css +46 -0
  335. package/src/components/dropdown/dropdown.ts +549 -0
  336. package/src/components/dropdown/index.ts +7 -0
  337. package/src/components/dropdown/types.ts +28 -0
  338. package/src/components/form/form.css +54 -0
  339. package/src/components/image-input/image-input.css +56 -0
  340. package/src/components/image-input/image-input.ts +249 -0
  341. package/src/components/image-input/index.ts +10 -0
  342. package/src/components/image-input/types.ts +12 -0
  343. package/src/components/input/input-group.css +42 -0
  344. package/src/components/input/input.css +136 -0
  345. package/src/components/kbd/kbd.css +30 -0
  346. package/src/components/label/label.css +20 -0
  347. package/src/components/link/link.css +81 -0
  348. package/src/components/modal/index.ts +7 -0
  349. package/src/components/modal/modal.css +73 -0
  350. package/src/components/modal/modal.ts +382 -0
  351. package/src/components/modal/types.ts +21 -0
  352. package/src/components/pagination/pagination.css +26 -0
  353. package/src/components/popover/popover.css +22 -0
  354. package/src/components/progress/progress.css +51 -0
  355. package/src/components/radio/radio.css +51 -0
  356. package/src/components/reparent/index.ts +7 -0
  357. package/src/components/reparent/reparent.ts +109 -0
  358. package/src/components/reparent/types.ts +15 -0
  359. package/src/components/scrollable/index.ts +10 -0
  360. package/src/components/scrollable/scrollable.css +29 -0
  361. package/src/components/scrollable/scrollable.ts +297 -0
  362. package/src/components/scrollable/types.ts +16 -0
  363. package/src/components/scrollspy/index.ts +7 -0
  364. package/src/components/scrollspy/scrollspy.css +13 -0
  365. package/src/components/scrollspy/scrollspy.ts +224 -0
  366. package/src/components/scrollspy/types.ts +15 -0
  367. package/src/components/scrollto/index.ts +7 -0
  368. package/src/components/scrollto/scrollto.ts +127 -0
  369. package/src/components/scrollto/types.ts +15 -0
  370. package/src/components/select/combobox.ts +305 -0
  371. package/src/components/select/config.ts +324 -0
  372. package/src/components/select/dropdown.ts +510 -0
  373. package/src/components/select/index.ts +13 -0
  374. package/src/components/select/option.ts +43 -0
  375. package/src/components/select/remote.ts +477 -0
  376. package/src/components/select/search.ts +430 -0
  377. package/src/components/select/select.css +105 -0
  378. package/src/components/select/select.ts +1916 -0
  379. package/src/components/select/tags.ts +123 -0
  380. package/src/components/select/templates.ts +531 -0
  381. package/src/components/select/types.ts +36 -0
  382. package/src/components/select/utils.ts +747 -0
  383. package/src/components/select/variants.css +5 -0
  384. package/src/components/separator/separator.css +14 -0
  385. package/src/components/skeleton/skeleton.css +10 -0
  386. package/src/components/stepper/index.ts +7 -0
  387. package/src/components/stepper/stepper.css +49 -0
  388. package/src/components/stepper/stepper.ts +308 -0
  389. package/src/components/stepper/types.ts +13 -0
  390. package/src/components/sticky/index.ts +7 -0
  391. package/src/components/sticky/sticky.css +22 -0
  392. package/src/components/sticky/sticky.ts +381 -0
  393. package/src/components/sticky/types.ts +23 -0
  394. package/src/components/switch/switch.css +110 -0
  395. package/src/components/table/table.css +168 -0
  396. package/src/components/tabs/index.ts +7 -0
  397. package/src/components/tabs/tabs.css +40 -0
  398. package/src/components/tabs/tabs.ts +190 -0
  399. package/src/components/tabs/types.ts +13 -0
  400. package/src/components/textarea/textarea.css +35 -0
  401. package/src/components/theme-switch/index.ts +10 -0
  402. package/src/components/theme-switch/theme-switch.css +22 -0
  403. package/src/components/theme-switch/theme-switch.ts +176 -0
  404. package/src/components/theme-switch/types.ts +15 -0
  405. package/src/components/toggle/index.ts +7 -0
  406. package/src/components/toggle/toggle.css +13 -0
  407. package/src/components/toggle/toggle.ts +173 -0
  408. package/src/components/toggle/types.ts +18 -0
  409. package/src/components/toggle-group/toggle-group.css +55 -0
  410. package/src/components/toggle-password/index.ts +10 -0
  411. package/src/components/toggle-password/toggle-password.css +13 -0
  412. package/src/components/toggle-password/toggle-password.ts +159 -0
  413. package/src/components/toggle-password/types.ts +13 -0
  414. package/src/components/tooltip/index.ts +7 -0
  415. package/src/components/tooltip/tooltip.css +18 -0
  416. package/src/components/tooltip/tooltip.ts +361 -0
  417. package/src/components/tooltip/types.ts +28 -0
  418. package/src/helpers/data.ts +46 -0
  419. package/src/helpers/dom.ts +405 -0
  420. package/src/helpers/event-handler.ts +61 -0
  421. package/src/helpers/utils.ts +183 -0
  422. package/src/index.ts +113 -0
  423. package/src/types.ts +23 -0
  424. package/styles.css +48 -0
  425. package/tsconfig.json +17 -0
  426. package/webpack.config.js +113 -0
@@ -0,0 +1,224 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ * @version: 1.0.0
5
+ */
6
+ import KTData from '../../helpers/data';
7
+ import KTDom from '../../helpers/dom';
8
+ import KTEventHandler from '../../helpers/event-handler';
9
+ import KTComponent from '../component';
10
+ import { KTScrollspyInterface, KTScrollspyConfigInterface } from './types';
11
+
12
+ declare global {
13
+ interface Window {
14
+ KT_SCROLLSPY_INITIALIZED: boolean;
15
+ KTScrollspy: typeof KTScrollspy;
16
+ }
17
+ }
18
+
19
+ export class KTScrollspy extends KTComponent implements KTScrollspyInterface {
20
+ protected override _name: string = 'scrollspy';
21
+ protected override _defaultConfig: KTScrollspyConfigInterface = {
22
+ target: 'body',
23
+ offset: 0,
24
+ smooth: true,
25
+ };
26
+ protected override _config: KTScrollspyConfigInterface = this._defaultConfig;
27
+ protected _targetElement: HTMLElement | Document | null = null;
28
+ protected _anchorElements: NodeListOf<HTMLElement> | null = null;
29
+
30
+ constructor(element: HTMLElement, config?: KTScrollspyConfigInterface) {
31
+ super();
32
+
33
+ if (KTData.has(element as HTMLElement, this._name)) return;
34
+
35
+ this._init(element);
36
+ this._buildConfig(config);
37
+
38
+ if (!this._element) return;
39
+
40
+ const targetElement =
41
+ this._getTarget() === 'body'
42
+ ? document
43
+ : KTDom.getElement(this._getTarget());
44
+ if (!targetElement) return;
45
+
46
+ this._targetElement = targetElement;
47
+
48
+ this._anchorElements = this._element.querySelectorAll(
49
+ '[data-kt-scrollspy-anchor]',
50
+ );
51
+
52
+ if (!this._anchorElements) return;
53
+
54
+ this._handlers();
55
+ this._update();
56
+ }
57
+
58
+ private _getTarget(): string {
59
+ return (
60
+ (this._element.getAttribute('data-kt-scrollspy-target') as string) ||
61
+ (this._getOption('target') as string)
62
+ );
63
+ }
64
+
65
+ protected _handlers(): void {
66
+ if (!this._anchorElements) return;
67
+
68
+ this._targetElement.addEventListener('scroll', () => {
69
+ this._anchorElements.forEach((anchorElement) => {
70
+ this._updateAnchor(anchorElement);
71
+ });
72
+ });
73
+
74
+ KTEventHandler.on(
75
+ this._element,
76
+ '[data-kt-scrollspy-anchor]',
77
+ 'click',
78
+ (event: Event, target: HTMLElement) => {
79
+ event.preventDefault();
80
+ this._scrollTo(target);
81
+ },
82
+ );
83
+ }
84
+
85
+ protected _scrollTo(anchorElement: HTMLElement): void {
86
+ if (!anchorElement) return;
87
+
88
+ const sectionElement = KTDom.getElement(anchorElement.getAttribute('href'));
89
+ if (!sectionElement) return;
90
+
91
+ const targetElement =
92
+ this._targetElement === document ? window : this._targetElement;
93
+ if (!targetElement) return;
94
+
95
+ let offset = parseInt(this._getOption('offset') as string);
96
+ if (anchorElement.getAttribute('data-kt-scrollspy-anchor-offset')) {
97
+ offset = parseInt(
98
+ anchorElement.getAttribute('data-kt-scrollspy-anchor-offset') as string,
99
+ );
100
+ }
101
+
102
+ const scrollTop = sectionElement.offsetTop - offset;
103
+
104
+ if ('scrollTo' in targetElement) {
105
+ targetElement.scrollTo({
106
+ top: scrollTop,
107
+ left: 0,
108
+ behavior: this._getOption('smooth') ? 'smooth' : 'instant',
109
+ });
110
+ }
111
+ }
112
+
113
+ protected _updateAnchor(anchorElement: HTMLElement): void {
114
+ const sectionElement = KTDom.getElement(anchorElement.getAttribute('href'));
115
+ if (!sectionElement) return;
116
+
117
+ if (!KTDom.isVisible(anchorElement)) return;
118
+
119
+ if (!this._anchorElements) return;
120
+
121
+ const scrollPosition =
122
+ this._targetElement === document
123
+ ? document.documentElement.scrollTop || document.body.scrollTop
124
+ : (this._targetElement as HTMLElement).scrollTop;
125
+
126
+ let offset = parseInt(this._getOption('offset') as string);
127
+ if (anchorElement.getAttribute('data-kt-scrollspy-anchor-offset')) {
128
+ offset = parseInt(
129
+ anchorElement.getAttribute('data-kt-scrollspy-anchor-offset') as string,
130
+ );
131
+ }
132
+
133
+ const offsetTop = sectionElement.offsetTop;
134
+
135
+ if (scrollPosition + offset >= offsetTop) {
136
+ this._anchorElements.forEach((anchorElement) => {
137
+ anchorElement.classList.remove('active');
138
+ });
139
+
140
+ const payload = { element: anchorElement };
141
+ this._fireEvent('activate', payload);
142
+ this._dispatchEvent('activate', payload);
143
+
144
+ anchorElement.classList.add('active');
145
+
146
+ const parentAnchorElements = KTDom.parents(
147
+ anchorElement,
148
+ '[data-kt-scrollspy-group]',
149
+ );
150
+ if (parentAnchorElements) {
151
+ parentAnchorElements.forEach((parentAnchorElement) => {
152
+ parentAnchorElement
153
+ .querySelector('[data-kt-scrollspy-anchor]')
154
+ ?.classList.add('active');
155
+ });
156
+ }
157
+ }
158
+ }
159
+
160
+ protected _update() {
161
+ if (!this._anchorElements) return;
162
+
163
+ this._anchorElements.forEach((anchorElement) => {
164
+ this._updateAnchor(anchorElement);
165
+ });
166
+ }
167
+
168
+ protected _isActive(anchorElement: HTMLElement): boolean {
169
+ return anchorElement.classList.contains('active');
170
+ }
171
+
172
+ public updateAnchor(anchorElement: HTMLElement): void {
173
+ this._updateAnchor(anchorElement);
174
+ }
175
+
176
+ public isActive(anchorElement: HTMLElement): boolean {
177
+ return this._isActive(anchorElement);
178
+ }
179
+
180
+ public update(): void {
181
+ this.update();
182
+ }
183
+
184
+ public scrollTo(anchorElement: HTMLElement): void {
185
+ this._scrollTo(anchorElement);
186
+ }
187
+
188
+ public static getInstance(element: HTMLElement): KTScrollspy {
189
+ if (!element) return null;
190
+
191
+ if (KTData.has(element, 'scrollspy')) {
192
+ return KTData.get(element, 'scrollspy') as KTScrollspy;
193
+ }
194
+
195
+ if (element.getAttribute('data-kt-scrollspy')) {
196
+ return new KTScrollspy(element);
197
+ }
198
+
199
+ return null;
200
+ }
201
+
202
+ public static getOrCreateInstance(
203
+ element: HTMLElement,
204
+ config?: KTScrollspyConfigInterface,
205
+ ): KTScrollspy {
206
+ return this.getInstance(element) || new KTScrollspy(element, config);
207
+ }
208
+
209
+ public static createInstances(): void {
210
+ const elements = document.querySelectorAll('[data-kt-scrollspy]');
211
+
212
+ elements.forEach((element) => {
213
+ new KTScrollspy(element as HTMLElement);
214
+ });
215
+ }
216
+
217
+ public static init(): void {
218
+ KTScrollspy.createInstances();
219
+ }
220
+ }
221
+
222
+ if (typeof window !== 'undefined') {
223
+ window.KTScrollspy = KTScrollspy;
224
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ * @version: 1.0.0
5
+ */
6
+ export interface KTScrollspyConfigInterface {
7
+ target: string;
8
+ smooth: boolean;
9
+ offset: number;
10
+ }
11
+
12
+ export interface KTScrollspyInterface {
13
+ update(anchorElement: HTMLElement, event: Event): void;
14
+ scrollTo(anchorElement: HTMLElement): void;
15
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ * @version: 1.0.0
5
+ */
6
+ export { KTScrollto } from './scrollto';
7
+ export type { KTScrolltoConfigInterface, KTScrolltoInterface } from './types';
@@ -0,0 +1,127 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ * @version: 1.0.0
5
+ */
6
+ /* eslint-disable max-len */
7
+ /* eslint-disable require-jsdoc */
8
+
9
+ import KTData from '../../helpers/data';
10
+ import KTDom from '../../helpers/dom';
11
+ import KTComponent from '../component';
12
+ import { KTScrolltoInterface, KTScrolltoConfigInterface } from './types';
13
+
14
+ declare global {
15
+ interface Window {
16
+ KT_SCROLLTO_INITIALIZED: boolean;
17
+ KTScrollto: typeof KTScrollto;
18
+ }
19
+ }
20
+
21
+ export class KTScrollto extends KTComponent implements KTScrolltoInterface {
22
+ protected override _name: string = 'scrollto';
23
+ protected override _defaultConfig: KTScrolltoConfigInterface = {
24
+ smooth: true,
25
+ parent: 'body',
26
+ target: '',
27
+ offset: 0,
28
+ };
29
+ protected override _config: KTScrolltoConfigInterface = this._defaultConfig;
30
+ protected _targetElement: HTMLElement;
31
+
32
+ constructor(element: HTMLElement, config?: KTScrolltoConfigInterface) {
33
+ super();
34
+
35
+ if (KTData.has(element as HTMLElement, this._name)) return;
36
+
37
+ this._init(element);
38
+ this._buildConfig(config);
39
+
40
+ if (!this._element) return;
41
+
42
+ this._targetElement = this._getTargetElement();
43
+
44
+ if (!this._targetElement) {
45
+ return;
46
+ }
47
+
48
+ this._handlers();
49
+ }
50
+
51
+ private _getTargetElement(): HTMLElement | null {
52
+ return (
53
+ KTDom.getElement(
54
+ this._element.getAttribute('data-kt-scrollto') as string,
55
+ ) || KTDom.getElement(this._getOption('target') as string)
56
+ );
57
+ }
58
+
59
+ protected _handlers(): void {
60
+ if (!this._element) return;
61
+
62
+ this._element.addEventListener('click', (event: Event) => {
63
+ event.preventDefault();
64
+ this._scroll();
65
+ });
66
+ }
67
+
68
+ protected _scroll(): void {
69
+ const pos =
70
+ this._targetElement.offsetTop +
71
+ parseInt(this._getOption('offset') as string);
72
+
73
+ let parent: HTMLElement | Window = KTDom.getElement(
74
+ this._getOption('parent') as string,
75
+ );
76
+
77
+ if (!parent || parent === document.body) {
78
+ parent = window;
79
+ }
80
+
81
+ parent.scrollTo({
82
+ top: pos,
83
+ behavior: (this._getOption('smooth') as boolean) ? 'smooth' : 'instant',
84
+ });
85
+ }
86
+
87
+ public scroll(): void {
88
+ this._scroll();
89
+ }
90
+
91
+ public static getInstance(element: HTMLElement): KTScrollto {
92
+ if (!element) return null;
93
+
94
+ if (KTData.has(element, 'scrollto')) {
95
+ return KTData.get(element, 'scrollto') as KTScrollto;
96
+ }
97
+
98
+ if (element.getAttribute('data-kt-scrollto')) {
99
+ return new KTScrollto(element);
100
+ }
101
+
102
+ return null;
103
+ }
104
+
105
+ public static getOrCreateInstance(
106
+ element: HTMLElement,
107
+ config?: KTScrolltoConfigInterface,
108
+ ): KTScrollto {
109
+ return this.getInstance(element) || new KTScrollto(element, config);
110
+ }
111
+
112
+ public static createInstances(): void {
113
+ const elements = document.querySelectorAll('[data-kt-scrollto]');
114
+
115
+ elements.forEach((element) => {
116
+ new KTScrollto(element as HTMLElement);
117
+ });
118
+ }
119
+
120
+ public static init(): void {
121
+ KTScrollto.createInstances();
122
+ }
123
+ }
124
+
125
+ if (typeof window !== 'undefined') {
126
+ window.KTScrollto = KTScrollto;
127
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ * @version: 1.0.0
5
+ */
6
+ export interface KTScrolltoConfigInterface {
7
+ smooth: boolean;
8
+ parent: string;
9
+ target: string;
10
+ offset: number;
11
+ }
12
+
13
+ export interface KTScrolltoInterface {
14
+ scroll(): void;
15
+ }
@@ -0,0 +1,305 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ * @version: 1.0.0
5
+ */
6
+ import { KTSelectConfigInterface } from './config';
7
+ import { KTSelect } from './select';
8
+ import { handleDropdownKeyNavigation } from './utils';
9
+ import { SelectMode } from './types';
10
+
11
+ /**
12
+ * KTSelectCombobox - Handles combobox-specific functionality for KTSelect
13
+ */
14
+ export class KTSelectCombobox {
15
+ private _select: KTSelect;
16
+ private _config: KTSelectConfigInterface;
17
+ private _searchInputElement: HTMLInputElement;
18
+ private _clearButtonElement: HTMLElement | null;
19
+ private _boundKeyNavHandler: (event: KeyboardEvent) => void;
20
+ private _boundInputHandler: (event: Event) => void;
21
+ private _boundClearHandler: (event: MouseEvent) => void;
22
+
23
+ constructor(select: KTSelect) {
24
+ this._select = select;
25
+ this._config = select.getConfig();
26
+
27
+ // Get the display element (could be the input directly or a parent div)
28
+ const displayElement = select.getValueDisplayElement();
29
+
30
+ // Find the input element - either it's the display element itself or a child
31
+ this._searchInputElement =
32
+ displayElement.tagName === 'INPUT'
33
+ ? (displayElement as HTMLInputElement)
34
+ : displayElement.querySelector('input[data-kt-select-search]');
35
+
36
+ // Find the clear button
37
+ this._clearButtonElement =
38
+ displayElement.tagName === 'DIV'
39
+ ? displayElement.querySelector('[data-kt-select-clear-button]')
40
+ : null;
41
+
42
+ // Create bound handler references to allow proper cleanup
43
+ this._boundKeyNavHandler = this._handleComboboxKeyNav.bind(this);
44
+ this._boundInputHandler = this._handleComboboxInput.bind(this);
45
+ this._boundClearHandler = this._handleClearButtonClick.bind(this);
46
+
47
+ // Attach event listeners
48
+ this._attachEventListeners();
49
+
50
+ if (this._config.debug) console.log('KTSelectCombobox initialized');
51
+ }
52
+
53
+ /**
54
+ * Attach event listeners specific to combobox
55
+ */
56
+ private _attachEventListeners(): void {
57
+ // First remove any existing listeners to prevent duplicates
58
+ this._removeEventListeners();
59
+
60
+ // Add input event handler to filter options as user types
61
+ this._searchInputElement.addEventListener('input', this._boundInputHandler);
62
+
63
+ // Add keyboard navigation for the combobox
64
+ this._searchInputElement.addEventListener(
65
+ 'keydown',
66
+ this._boundKeyNavHandler,
67
+ );
68
+
69
+ // Add clear button click event listener
70
+ if (this._clearButtonElement) {
71
+ this._clearButtonElement.addEventListener(
72
+ 'click',
73
+ this._boundClearHandler,
74
+ );
75
+ }
76
+
77
+ if (this._config.debug)
78
+ console.log(
79
+ 'Combobox event listeners attached to:',
80
+ this._searchInputElement,
81
+ );
82
+ }
83
+
84
+ /**
85
+ * Remove event listeners to prevent memory leaks or duplicates
86
+ */
87
+ private _removeEventListeners(): void {
88
+ if (this._searchInputElement) {
89
+ this._searchInputElement.removeEventListener(
90
+ 'input',
91
+ this._boundInputHandler,
92
+ );
93
+ this._searchInputElement.removeEventListener(
94
+ 'keydown',
95
+ this._boundKeyNavHandler,
96
+ );
97
+ }
98
+
99
+ if (this._clearButtonElement) {
100
+ this._clearButtonElement.removeEventListener(
101
+ 'click',
102
+ this._boundClearHandler,
103
+ );
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Handle combobox input events
109
+ */
110
+ private _handleComboboxInput(event: Event): void {
111
+ const inputElement = event.target as HTMLInputElement;
112
+ const query = inputElement.value.toLowerCase();
113
+
114
+ if (this._config.debug) console.log('Combobox input event, query:', query);
115
+
116
+ // Toggle clear button visibility based on input value
117
+ this._toggleClearButtonVisibility(query);
118
+
119
+ // If dropdown isn't open, open it when user starts typing
120
+ if (!(this._select as any)._dropdownIsOpen) {
121
+ this._select.openDropdown();
122
+ }
123
+
124
+ // Filter options based on input
125
+ this._filterOptionsForCombobox(query);
126
+ }
127
+
128
+ /**
129
+ * Handle clear button click
130
+ */
131
+ private _handleClearButtonClick(event: MouseEvent): void {
132
+ event.preventDefault();
133
+ event.stopPropagation();
134
+
135
+ // Clear the input
136
+ this._searchInputElement.value = '';
137
+
138
+ // Hide the clear button
139
+ this._toggleClearButtonVisibility('');
140
+
141
+ // Show all options and open dropdown
142
+ this._select.showAllOptions();
143
+ this._select.openDropdown();
144
+
145
+ // Clear the current selection
146
+ this._select.clearSelection();
147
+
148
+ // Focus on the input
149
+ this._searchInputElement.focus();
150
+ }
151
+
152
+ /**
153
+ * Toggle clear button visibility based on input value
154
+ */
155
+ private _toggleClearButtonVisibility(value: string): void {
156
+ if (!this._clearButtonElement) return;
157
+
158
+ if (value.length > 0) {
159
+ this._clearButtonElement.classList.remove('hidden');
160
+ } else {
161
+ this._clearButtonElement.classList.add('hidden');
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Filter options for combobox based on input query
167
+ */
168
+ private _filterOptionsForCombobox(query: string): void {
169
+ // Access the private method through type assertion
170
+ (this._select as any)._filterOptionsForCombobox(query);
171
+ }
172
+
173
+ /**
174
+ * Handle keyboard navigation in combobox mode
175
+ */
176
+ private _handleComboboxKeyNav(event: KeyboardEvent): void {
177
+ if (this._config.debug) console.log('Combobox keydown event:', event.key);
178
+
179
+ // Prevent event propagation to stop bubbling to other handlers
180
+ event.stopPropagation();
181
+
182
+ // Handle clear with Escape when dropdown is closed
183
+ if (
184
+ event.key === 'Escape' &&
185
+ !(this._select as any)._dropdownIsOpen &&
186
+ this._searchInputElement.value !== ''
187
+ ) {
188
+ event.preventDefault();
189
+ this._searchInputElement.value = '';
190
+ this._toggleClearButtonVisibility('');
191
+ this._select.clearSelection();
192
+ return;
193
+ }
194
+
195
+ // Handle dropdown visibility with special keys
196
+ if (
197
+ !(this._select as any)._dropdownIsOpen &&
198
+ (event.key === 'ArrowDown' ||
199
+ event.key === 'ArrowUp' ||
200
+ event.key === 'Enter')
201
+ ) {
202
+ if (this._config.debug)
203
+ console.log('Opening dropdown from keyboard in combobox');
204
+ this._select.openDropdown();
205
+ event.preventDefault();
206
+
207
+ // If it's arrow keys, also move focus
208
+ if (event.key === 'ArrowDown') {
209
+ (this._select as any)._focusNextOption();
210
+ } else if (event.key === 'ArrowUp') {
211
+ (this._select as any)._focusPreviousOption();
212
+ }
213
+ return;
214
+ }
215
+
216
+ // Use the shared keyboard navigation handler
217
+ handleDropdownKeyNavigation(event, this._select, {
218
+ multiple: this._config.multiple,
219
+ closeOnSelect: this._config.closeOnSelect,
220
+ });
221
+ }
222
+
223
+ /**
224
+ * Update the combobox input value when an option is selected
225
+ */
226
+ public updateSelectedValue(selectedText: string): void {
227
+ if (this._searchInputElement) {
228
+ // Extract just the text content if it contains HTML
229
+ let cleanText = selectedText;
230
+
231
+ // If the text might contain HTML (when description is present)
232
+ if (selectedText.includes('<') || selectedText.includes('>')) {
233
+ // Create a temporary element to extract just the text
234
+ const tempDiv = document.createElement('div');
235
+ tempDiv.innerHTML = selectedText;
236
+
237
+ // Find and use only the option-title text if available
238
+ const titleElement = tempDiv.querySelector('[data-kt-option-title]');
239
+ if (titleElement) {
240
+ cleanText = titleElement.textContent || selectedText;
241
+ } else {
242
+ // Fallback to all text content if option-title not found
243
+ cleanText = tempDiv.textContent || selectedText;
244
+ }
245
+ }
246
+
247
+ // Set the input value directly for immediate feedback
248
+ this._searchInputElement.value = cleanText;
249
+
250
+ // Show the clear button if there's a value
251
+ this._toggleClearButtonVisibility(cleanText);
252
+
253
+ // Trigger an input event to ensure any input-based listeners are notified
254
+ const inputEvent = new Event('input', { bubbles: true });
255
+ this._searchInputElement.dispatchEvent(inputEvent);
256
+
257
+ if (this._config.debug)
258
+ console.log('Combobox value updated to:', cleanText);
259
+ }
260
+ }
261
+
262
+ /**
263
+ * Reset the input value to match the current selection
264
+ * This can be called to sync the input with the current state
265
+ */
266
+ public resetInputValueToSelection(): void {
267
+ const selectedOptions = this._select.getSelectedOptions();
268
+ if (selectedOptions.length > 0) {
269
+ const selectedOption = Array.from(this._select.getOptionsElement()).find(
270
+ (opt) => opt.dataset.value === selectedOptions[0],
271
+ ) as HTMLElement;
272
+
273
+ if (selectedOption) {
274
+ // Find the option-title element to get just the title text
275
+ const titleElement = selectedOption.querySelector(
276
+ '[data-kt-option-title]',
277
+ );
278
+ let selectedText = '';
279
+
280
+ if (titleElement) {
281
+ // If it has a structured content with a title element
282
+ selectedText = titleElement.textContent?.trim() || '';
283
+ } else {
284
+ // Fallback to the whole text content
285
+ selectedText = selectedOption.textContent?.trim() || '';
286
+ }
287
+
288
+ this.updateSelectedValue(selectedText);
289
+ }
290
+ } else {
291
+ // No selection, clear the input
292
+ if (this._searchInputElement) {
293
+ this._searchInputElement.value = '';
294
+ this._toggleClearButtonVisibility('');
295
+ }
296
+ }
297
+ }
298
+
299
+ /**
300
+ * Destroy the combobox component and clean up event listeners
301
+ */
302
+ public destroy(): void {
303
+ this._removeEventListeners();
304
+ }
305
+ }