@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,430 @@
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 { KTSelect } from './select';
7
+ import { defaultTemplates } from './templates';
8
+ import {
9
+ handleDropdownKeyNavigation,
10
+ filterOptions,
11
+ FocusManager,
12
+ EventManager,
13
+ } from './utils';
14
+
15
+ export class KTSelectSearch {
16
+ private _select: KTSelect;
17
+ private _searchInput: HTMLInputElement;
18
+ private _noResultsElement: HTMLElement | null = null;
19
+ private _originalOptionContents = new Map<string, string>();
20
+ private _boundKeyNavHandler: (event: KeyboardEvent) => void;
21
+ private _eventManager: EventManager;
22
+ private _focusManager: FocusManager;
23
+ private _config: import('./config').KTSelectConfigInterface;
24
+
25
+ // Public handler for search input (made public for event binding)
26
+ public handleSearchInput: (...args: any[]) => void;
27
+
28
+ constructor(select: KTSelect) {
29
+ this._select = select;
30
+ this._searchInput = select.getSearchInput();
31
+ this._eventManager = new EventManager();
32
+ this._focusManager = new FocusManager(
33
+ this._select.getDropdownElement(),
34
+ '[data-kt-select-option]',
35
+ select.getConfig(),
36
+ );
37
+ this._boundKeyNavHandler = this._handleKeyboardNavigation.bind(this);
38
+ this.handleSearchInput = this._handleSearchInput.bind(this);
39
+ this._config = select.getConfig();
40
+ this._cacheOriginalOptionContents();
41
+ }
42
+
43
+ init() {
44
+ if (this._select.getConfig().enableSearch) {
45
+ this._searchInput = this._select.getSearchInput();
46
+
47
+ if (this._searchInput) {
48
+ if (this._config.debug)
49
+ console.log(
50
+ 'Initializing search module with input:',
51
+ this._searchInput,
52
+ );
53
+
54
+ // First remove any existing listeners to prevent duplicates
55
+ this._removeEventListeners();
56
+
57
+ // Add the event listener
58
+ this._eventManager.addListener(
59
+ this._searchInput,
60
+ 'input',
61
+ this.handleSearchInput,
62
+ );
63
+
64
+ // Add blur event listener to ensure highlights are cleared when focus is lost
65
+ this._eventManager.addListener(this._searchInput, 'blur', () => {
66
+ // Small delay to prevent race conditions with selection
67
+ setTimeout(() => {
68
+ if (!this._searchInput.value) {
69
+ this._resetAllOptions();
70
+ this.clearSearchHighlights();
71
+ }
72
+ }, 100);
73
+ });
74
+
75
+ // Listen for remote search events to coordinate with remote search functionality
76
+ if (
77
+ this._select.getConfig().remote &&
78
+ this._select.getConfig().searchParam
79
+ ) {
80
+ this._select
81
+ .getElement()
82
+ .addEventListener('remoteSearchStart', () => {
83
+ // Reset focused option when remote search starts
84
+ this._focusManager.resetFocus();
85
+ });
86
+
87
+ this._select.getElement().addEventListener('remoteSearchEnd', () => {
88
+ // After remote search completes, refresh our option cache
89
+ this.refreshOptionCache();
90
+ });
91
+ }
92
+
93
+ // Add keyboard navigation for search results
94
+ // This is stopping event propagation to prevent conflicts
95
+ this._eventManager.addListener(
96
+ this._searchInput,
97
+ 'keydown',
98
+ this._boundKeyNavHandler,
99
+ );
100
+
101
+ // Listen for dropdown close to reset options if search is empty
102
+ this._select.getElement().addEventListener('dropdown.close', () => {
103
+ this._focusManager.resetFocus();
104
+ // Always clear highlights when dropdown closes
105
+ this.clearSearchHighlights();
106
+ if (!this._searchInput.value) {
107
+ this._resetAllOptions();
108
+ }
109
+ // Clear the search input when dropdown closes if configured
110
+ if (this._select.getConfig().clearSearchOnClose) {
111
+ this._searchInput.value = '';
112
+ }
113
+ });
114
+
115
+ // Clear highlights when an option is selected
116
+ this._select.getElement().addEventListener('change', () => {
117
+ this.clearSearchHighlights();
118
+
119
+ // Close dropdown if configured to do so
120
+ if (
121
+ this._select.getConfig().closeOnSelect &&
122
+ !this._select.getConfig().multiple
123
+ ) {
124
+ this._select.closeDropdown();
125
+ }
126
+ });
127
+
128
+ // Autofocus on search input
129
+ if (this._select.getConfig().searchAutofocus) {
130
+ this._select.getElement().addEventListener('dropdown.show', () => {
131
+ setTimeout(() => {
132
+ // Add slight delay to ensure the dropdown and search input are visible
133
+ this._searchInput?.focus();
134
+ }, 50);
135
+ });
136
+ }
137
+
138
+ // Listen for explicit dropdown open event to clear highlights if needed
139
+ this._select.getElement().addEventListener('dropdown.show', () => {
140
+ // If search input is empty, ensure highlights are cleared on open
141
+ if (!this._searchInput?.value) {
142
+ this.clearSearchHighlights();
143
+ }
144
+ });
145
+ }
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Remove event listeners to prevent memory leaks or duplicates
151
+ */
152
+ private _removeEventListeners(): void {
153
+ if (this._searchInput) {
154
+ this._eventManager.removeAllListeners(this._searchInput);
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Handle keyboard navigation for search results
160
+ */
161
+ private _handleKeyboardNavigation(event: KeyboardEvent) {
162
+ // Stop propagation to prevent multiple handlers from firing
163
+ event.stopPropagation();
164
+
165
+ if (this._config.debug) console.log('Search module keydown:', event.key);
166
+
167
+ const visibleOptions = this._focusManager.getVisibleOptions();
168
+ if (visibleOptions.length === 0) return;
169
+
170
+ // Use the shared keyboard navigation handler with custom callbacks
171
+ handleDropdownKeyNavigation(
172
+ event,
173
+ this._select,
174
+ {
175
+ multiple: this._select.getConfig().multiple,
176
+ closeOnSelect: this._select.getConfig().closeOnSelect,
177
+ },
178
+ {
179
+ onArrowDown: () => this._focusManager.focusNext(),
180
+ onArrowUp: () => this._focusManager.focusPrevious(),
181
+ onEnter: () => this._selectFocusedOption(),
182
+ onClose: () => {
183
+ if (event.key === 'Escape') {
184
+ this.clearSearchHighlights();
185
+ }
186
+ },
187
+ },
188
+ );
189
+ }
190
+
191
+ /**
192
+ * Select the currently focused option
193
+ */
194
+ private _selectFocusedOption() {
195
+ const focusedOption = this._focusManager.getFocusedOption();
196
+
197
+ if (focusedOption) {
198
+ const optionValue = focusedOption.getAttribute('data-value');
199
+
200
+ if (optionValue) {
201
+ // Ensure highlights are cleared before selection
202
+ this.clearSearchHighlights();
203
+
204
+ // Trigger the selection in the main select component
205
+ this._select['_selectOption'](optionValue);
206
+ }
207
+ }
208
+ }
209
+
210
+ /**
211
+ * Store original HTML content of all options for later restoration
212
+ * This prevents losing formatting when clearing search
213
+ */
214
+ private _cacheOriginalOptionContents() {
215
+ // Wait for options to be initialized
216
+ setTimeout(() => {
217
+ const options = Array.from(this._select.getOptionsElement());
218
+ options.forEach((option) => {
219
+ const value = option.getAttribute('data-value');
220
+ if (value) {
221
+ this._originalOptionContents.set(value, option.innerHTML);
222
+ }
223
+ });
224
+ }, 0);
225
+ }
226
+
227
+ private _handleSearchInput(event: Event) {
228
+ const query = (event.target as HTMLInputElement).value.toLowerCase();
229
+ const config = this._select.getConfig();
230
+
231
+ // Reset focused option when search changes
232
+ this._focusManager.resetFocus();
233
+
234
+ // If search query is empty, clear all highlights
235
+ if (query.trim() === '') {
236
+ this.clearSearchHighlights();
237
+ }
238
+
239
+ // For remote search, we don't filter locally
240
+ // The KTSelect component will handle the remote search
241
+ if (config.remote && config.searchParam) {
242
+ // If query is too short, reset all options to visible state
243
+ if (query.length < config.searchMinLength) {
244
+ this._resetAllOptions();
245
+ this._clearNoResultsMessage();
246
+ }
247
+ // Otherwise, let KTSelect handle remote search
248
+ return;
249
+ }
250
+
251
+ // For local search
252
+ if (query.length >= config.searchMinLength) {
253
+ this._filterOptions(query);
254
+ } else {
255
+ this._resetAllOptions();
256
+ this._clearNoResultsMessage();
257
+ }
258
+ }
259
+
260
+ private _filterOptions(query: string) {
261
+ const options = Array.from(
262
+ this._select.getOptionsElement(),
263
+ ) as HTMLElement[];
264
+ const config = this._select.getConfig();
265
+ const dropdownElement = this._select.getDropdownElement();
266
+
267
+ // Cache original option HTML if not already cached
268
+ if (this._originalOptionContents.size === 0) {
269
+ this._cacheOriginalOptionContents();
270
+ }
271
+
272
+ // Use the shared filterOptions utility
273
+ filterOptions(options, query, config, dropdownElement, (visibleCount) =>
274
+ this._handleNoResults(visibleCount),
275
+ );
276
+
277
+ // Apply specialized text highlighting if needed
278
+ if (config.searchHighlight && query.trim() !== '') {
279
+ this._applyHighlightToDisplay(query);
280
+ }
281
+ }
282
+
283
+ /**
284
+ * Apply highlighting to the display element for multi-select
285
+ */
286
+ private _applyHighlightToDisplay(query: string) {
287
+ // Implementation for display highlighting
288
+ }
289
+
290
+ /**
291
+ * Reset all options to their original state
292
+ */
293
+ private _resetAllOptions() {
294
+ // Show all options
295
+ const options = Array.from(
296
+ this._select.getOptionsElement(),
297
+ ) as HTMLElement[];
298
+
299
+ // Cache original option HTML if not already cached
300
+ if (this._originalOptionContents.size === 0) {
301
+ this._cacheOriginalOptionContents();
302
+ }
303
+
304
+ options.forEach((option) => {
305
+ // Remove the hidden class
306
+ option.classList.remove('hidden');
307
+
308
+ // Restore original HTML content (remove highlights)
309
+ const value = option.getAttribute('data-value');
310
+ if (value && this._originalOptionContents.has(value)) {
311
+ option.innerHTML = this._originalOptionContents.get(value);
312
+ }
313
+
314
+ // Remove any display styling
315
+ if (
316
+ option.hasAttribute('style') &&
317
+ option.getAttribute('style').includes('display:')
318
+ ) {
319
+ const styleAttr = option.getAttribute('style');
320
+ if (
321
+ styleAttr.trim() === 'display: none;' ||
322
+ styleAttr.trim() === 'display: block;'
323
+ ) {
324
+ option.removeAttribute('style');
325
+ } else {
326
+ option.setAttribute(
327
+ 'style',
328
+ styleAttr.replace(/display:\s*[^;]+;?/gi, '').trim(),
329
+ );
330
+ }
331
+ }
332
+ });
333
+ }
334
+
335
+ private _handleNoResults(visibleOptionsCount: number) {
336
+ if (visibleOptionsCount === 0 && this._searchInput.value.trim() !== '') {
337
+ this._showNoResultsMessage();
338
+ } else {
339
+ this._clearNoResultsMessage();
340
+ }
341
+ }
342
+
343
+ private _showNoResultsMessage() {
344
+ this._clearNoResultsMessage();
345
+
346
+ const config = this._select.getConfig();
347
+ this._noResultsElement = defaultTemplates.noResults(config);
348
+
349
+ const dropdownElement = this._select.getDropdownElement();
350
+ const optionsContainer = dropdownElement.querySelector(
351
+ '[data-kt-select-options-container]',
352
+ );
353
+ if (optionsContainer) {
354
+ optionsContainer.appendChild(this._noResultsElement);
355
+ } else {
356
+ dropdownElement.appendChild(this._noResultsElement);
357
+ }
358
+ }
359
+
360
+ private _clearNoResultsMessage() {
361
+ if (this._noResultsElement && this._noResultsElement.parentNode) {
362
+ this._noResultsElement.parentNode.removeChild(this._noResultsElement);
363
+ this._noResultsElement = null;
364
+ }
365
+ }
366
+
367
+ /**
368
+ * Public method to explicitly clear all search highlights
369
+ * This is called when search is reset or selection changes
370
+ */
371
+ public clearSearchHighlights() {
372
+ // Restore original option content (removes highlighting)
373
+ const options = Array.from(
374
+ this._select.getOptionsElement(),
375
+ ) as HTMLElement[];
376
+
377
+ options.forEach((option) => {
378
+ const value = option.getAttribute('data-value');
379
+ if (value && this._originalOptionContents.has(value)) {
380
+ option.innerHTML = this._originalOptionContents.get(value);
381
+ }
382
+ });
383
+
384
+ // Also clear highlights from the display element
385
+ this._clearDisplayHighlights();
386
+ }
387
+
388
+ /**
389
+ * Clear any highlights from the display element (selected values)
390
+ */
391
+ private _clearDisplayHighlights() {
392
+ // Implementation for clearing display highlights
393
+ }
394
+
395
+ /**
396
+ * This ensures that search highlighting works correctly with new options
397
+ */
398
+ public refreshOptionCache(): void {
399
+ // Re-cache all option contents
400
+ this._originalOptionContents.clear();
401
+ const options = Array.from(
402
+ this._select.getOptionsElement(),
403
+ ) as HTMLElement[];
404
+
405
+ options.forEach((option) => {
406
+ const value = option.getAttribute('data-value');
407
+ if (value) {
408
+ this._originalOptionContents.set(value, option.innerHTML);
409
+ }
410
+ });
411
+ }
412
+
413
+ /**
414
+ * Clean up all resources used by the search module
415
+ */
416
+ public destroy(): void {
417
+ // Remove all event listeners
418
+ this._removeEventListeners();
419
+
420
+ // Clear all references
421
+ this._focusManager.dispose();
422
+ this._eventManager.removeAllListeners(null);
423
+
424
+ // Clear cached content
425
+ this._originalOptionContents.clear();
426
+
427
+ // Clear highlight elements
428
+ this.clearSearchHighlights();
429
+ }
430
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ * @version: 1.0.0
5
+ */
6
+ /* Base Styles */
7
+ @layer components {
8
+ .kt-select {
9
+ @apply py-0 appearance-none flex items-center gap-2 w-full bg-background border border-input shadow-xs shadow-[rgba(0,0,0,0.05)] transition-[color,box-shadow] text-foreground placeholder:text-muted-foreground/80;
10
+ @apply focus-visible:ring-ring/30 focus-visible:border-ring focus-visible:outline-none focus-visible:ring-[3px];
11
+ @apply disabled:cursor-not-allowed disabled:opacity-50 [&[readonly]]:opacity-70 file:h-full [&[type=file]]:py-0;
12
+ @apply aria-invalid:border-destructive/60 aria-invalid:ring-destructive/10;
13
+
14
+ background-repeat: no-repeat;
15
+ background-position: right 0.65rem center;
16
+ background-size: 14px 11px;
17
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%239f9fa9' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E");
18
+
19
+ .dark & {
20
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%239f9fa9' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E");
21
+ }
22
+
23
+ &[multiple],
24
+ &[size]:not([size='1']) {
25
+ padding-inline-end: var(--btn-default-px);
26
+ background-image: none;
27
+ }
28
+
29
+ &:-moz-focusring {
30
+ color: transparent;
31
+ text-shadow: none;
32
+ }
33
+
34
+ [dir='rtl'] & {
35
+ background-position: left 0.5rem center;
36
+ }
37
+
38
+ &.active {
39
+ @apply ring-ring/30 border-ring outline-none ring-[3px];
40
+ }
41
+
42
+ &.disabled {
43
+ @apply cursor-not-allowed opacity-50;
44
+ }
45
+ }
46
+
47
+ .kt-select-arrow {
48
+ @apply ms-auto;
49
+
50
+ svg {
51
+ @apply size-4 text-muted-foreground;
52
+ }
53
+ }
54
+
55
+ .kt-select-dropdown {
56
+ @apply rounded-md shadow-md shadow-[rgba(0,0,0,0.05)] border border-border bg-popover text-popover-foreground;
57
+ }
58
+
59
+ .kt-select-option {
60
+ @apply w-full flex items-center gap-x-2.5 py-2 px-2.5 rounded-md font-medium text-sm text-start cursor-pointer disabled:opacity-50 disabled:pointer-events-none;
61
+ @apply hover:bg-accent hover:text-accent-foreground;
62
+
63
+ &.disabled {
64
+ @apply opacity-50 pointer-events-none;
65
+ }
66
+
67
+ &.selected {
68
+ @apply bg-accent text-accent-foreground;
69
+ }
70
+
71
+ &.highlighted {
72
+ @apply bg-accent text-accent-foreground;
73
+ }
74
+ }
75
+
76
+ .kt-select-group {
77
+ @apply py-1;
78
+ }
79
+
80
+ .kt-select-group-header {
81
+ @apply px-3 py-1 text-xs font-semibold text-muted-foreground uppercase;
82
+ }
83
+ }
84
+
85
+ /* Sizes */
86
+ @layer components {
87
+ .kt-select {
88
+ @apply h-8.5 gap-1 px-3 text-[0.8125rem] leading-(--text-sm--line-height) rounded-md;
89
+ }
90
+
91
+ .kt-select-lg {
92
+ @apply h-10 gap-1.5 px-4 text-sm rounded-md;
93
+ }
94
+
95
+ .kt-select-sm {
96
+ @apply h-7 gap-1 px-2.5 text-xs rounded-md;
97
+ }
98
+ }
99
+
100
+ /* Dark Mode Styles */
101
+ @layer components {
102
+ .dark .kt-input {
103
+ @apply aria-invalid:border-destructive aria-invalid:ring-destructive/20;
104
+ }
105
+ }