@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,510 @@
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 {
7
+ Instance as PopperInstance,
8
+ createPopper,
9
+ Placement,
10
+ VirtualElement,
11
+ } from '@popperjs/core';
12
+ import KTDom from '../../helpers/dom';
13
+ import KTData from '../../helpers/data';
14
+ import KTEventHandler from '../../helpers/event-handler';
15
+ import KTComponent from '../component';
16
+ import { KTSelectConfigInterface } from './config';
17
+ import { FocusManager, EventManager } from './utils';
18
+
19
+ /**
20
+ * KTSelectDropdown
21
+ *
22
+ * A specialized dropdown implementation for the KTSelect component.
23
+ * This module handles the dropdown functionality for the select component,
24
+ * including positioning, showing/hiding, and keyboard navigation.
25
+ */
26
+ export class KTSelectDropdown extends KTComponent {
27
+ protected override readonly _name: string = 'select-dropdown';
28
+ protected override readonly _config: KTSelectConfigInterface;
29
+
30
+ // DOM Elements
31
+ protected _element: HTMLElement;
32
+ private _toggleElement: HTMLElement;
33
+ private _dropdownElement: HTMLElement;
34
+
35
+ // State
36
+ private _isOpen: boolean = false;
37
+ private _isTransitioning: boolean = false;
38
+ private _popperInstance: PopperInstance | null = null;
39
+ private _eventManager: EventManager;
40
+ private _focusManager: FocusManager;
41
+
42
+ /**
43
+ * Constructor
44
+ * @param element The parent element (select wrapper)
45
+ * @param toggleElement The element that triggers the dropdown
46
+ * @param dropdownElement The dropdown content element
47
+ * @param config The configuration options
48
+ */
49
+ constructor(
50
+ element: HTMLElement,
51
+ toggleElement: HTMLElement,
52
+ dropdownElement: HTMLElement,
53
+ config: KTSelectConfigInterface,
54
+ ) {
55
+ super();
56
+
57
+ this._element = element;
58
+ this._toggleElement = toggleElement;
59
+ this._dropdownElement = dropdownElement;
60
+ this._config = config;
61
+ this._eventManager = new EventManager();
62
+ this._focusManager = new FocusManager(
63
+ dropdownElement,
64
+ '[data-kt-select-option]',
65
+ config,
66
+ );
67
+
68
+ this._setupEventListeners();
69
+ }
70
+
71
+ /**
72
+ * Set up event listeners for the dropdown
73
+ */
74
+ private _setupEventListeners(): void {
75
+ // Toggle click
76
+ this._eventManager.addListener(
77
+ this._toggleElement,
78
+ 'click',
79
+ this._handleToggleClick.bind(this),
80
+ );
81
+
82
+ // Keyboard navigation
83
+ this._eventManager.addListener(
84
+ this._element,
85
+ 'keydown',
86
+ this._handleKeyDown.bind(this),
87
+ );
88
+
89
+ // Close on outside click
90
+ this._eventManager.addListener(
91
+ document as unknown as HTMLElement,
92
+ 'click',
93
+ this._handleOutsideClick.bind(this),
94
+ );
95
+ }
96
+
97
+ /**
98
+ * Handle toggle element click
99
+ */
100
+ private _handleToggleClick(event: Event): void {
101
+ event.preventDefault();
102
+ event.stopPropagation();
103
+
104
+ this.toggle();
105
+ }
106
+
107
+ /**
108
+ * Handle keyboard events
109
+ */
110
+ private _handleKeyDown(event: KeyboardEvent): void {
111
+ if (!this._isOpen) return;
112
+
113
+ switch (event.key) {
114
+ case 'Escape':
115
+ event.preventDefault();
116
+ this.close();
117
+ this._toggleElement.focus();
118
+ break;
119
+ case 'ArrowDown':
120
+ event.preventDefault();
121
+ this._focusManager.focusNext();
122
+ break;
123
+ case 'ArrowUp':
124
+ event.preventDefault();
125
+ this._focusManager.focusPrevious();
126
+ break;
127
+ case 'Home':
128
+ event.preventDefault();
129
+ // Focus first visible option
130
+ const firstOption = this._focusManager.getVisibleOptions()[0];
131
+ if (firstOption) {
132
+ this._focusManager.applyFocus(firstOption);
133
+ this._focusManager.scrollIntoView(firstOption);
134
+ }
135
+ break;
136
+ case 'End':
137
+ event.preventDefault();
138
+ // Focus last visible option
139
+ const visibleOptions = this._focusManager.getVisibleOptions();
140
+ const lastOption = visibleOptions[visibleOptions.length - 1];
141
+ if (lastOption) {
142
+ this._focusManager.applyFocus(lastOption);
143
+ this._focusManager.scrollIntoView(lastOption);
144
+ }
145
+ break;
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Handle clicks outside the dropdown
151
+ */
152
+ private _handleOutsideClick(event: MouseEvent): void {
153
+ if (!this._isOpen) return;
154
+
155
+ const target = event.target as HTMLElement;
156
+
157
+ if (
158
+ !this._element.contains(target) &&
159
+ !this._dropdownElement.contains(target)
160
+ ) {
161
+ this.close();
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Set width of dropdown based on toggle element
167
+ */
168
+ private _setDropdownWidth(): void {
169
+ if (!this._dropdownElement || !this._toggleElement) return;
170
+
171
+ // Check if width is configured
172
+ if (this._config.dropdownWidth) {
173
+ // If custom width is set, use that
174
+ this._dropdownElement.style.width = this._config.dropdownWidth;
175
+ } else {
176
+ // Otherwise, match toggle element width for a cleaner appearance
177
+ const toggleWidth = this._toggleElement.offsetWidth;
178
+ this._dropdownElement.style.width = `${toggleWidth}px`;
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Initialize the Popper instance for dropdown positioning
184
+ */
185
+ private _initPopper(): void {
186
+ // Destroy existing popper instance if it exists
187
+ this._destroyPopper();
188
+
189
+ // Default offset
190
+ const offsetValue = '0, 5';
191
+
192
+ // Get configuration options
193
+ const placement = this._config.dropdownPlacement || 'bottom-start';
194
+ const strategy = this._config.dropdownStrategy || 'fixed';
195
+ const preventOverflow = this._config.dropdownPreventOverflow !== false;
196
+ const flip = this._config.dropdownFlip !== false;
197
+
198
+ // Create new popper instance
199
+ this._popperInstance = createPopper(
200
+ this._toggleElement,
201
+ this._dropdownElement,
202
+ {
203
+ placement: placement as Placement,
204
+ strategy: strategy as 'fixed' | 'absolute',
205
+ modifiers: [
206
+ {
207
+ name: 'offset',
208
+ options: {
209
+ offset: this._parseOffset(offsetValue),
210
+ },
211
+ },
212
+ {
213
+ name: 'preventOverflow',
214
+ options: {
215
+ boundary: 'viewport',
216
+ altAxis: preventOverflow,
217
+ },
218
+ },
219
+ {
220
+ name: 'flip',
221
+ options: {
222
+ enabled: flip,
223
+ fallbackPlacements: ['top-start', 'bottom-end', 'top-end'],
224
+ },
225
+ },
226
+ {
227
+ name: 'sameWidth',
228
+ enabled: !this._config.dropdownWidth,
229
+ phase: 'beforeWrite',
230
+ requires: ['computeStyles'],
231
+ fn: ({ state }) => {
232
+ state.styles.popper.width = `${state.rects.reference.width}px`;
233
+ },
234
+ effect: ({ state }) => {
235
+ // Add type guard for HTMLElement
236
+ const reference = state.elements.reference as HTMLElement;
237
+ if (reference && 'offsetWidth' in reference) {
238
+ state.elements.popper.style.width = `${reference.offsetWidth}px`;
239
+ }
240
+ },
241
+ },
242
+ ],
243
+ },
244
+ );
245
+ }
246
+
247
+ /**
248
+ * Parse offset string into an array of numbers
249
+ */
250
+ private _parseOffset(offset: string): number[] {
251
+ return offset.split(',').map((value) => parseInt(value.trim(), 10));
252
+ }
253
+
254
+ /**
255
+ * Destroy the Popper instance
256
+ */
257
+ private _destroyPopper(): void {
258
+ if (this._popperInstance) {
259
+ this._popperInstance.destroy();
260
+ this._popperInstance = null;
261
+ }
262
+ }
263
+
264
+ /**
265
+ * Update dropdown position
266
+ */
267
+ public updatePosition(): void {
268
+ if (this._popperInstance) {
269
+ this._popperInstance.update();
270
+ }
271
+ }
272
+
273
+ /**
274
+ * Toggle the dropdown
275
+ */
276
+ public toggle(): void {
277
+ if (this._config.debug)
278
+ console.log('KTSelectDropdown.toggle called - isOpen:', this._isOpen);
279
+
280
+ if (this._isTransitioning) {
281
+ if (this._config.debug)
282
+ console.log('KTSelectDropdown.toggle - ignoring during transition');
283
+ return;
284
+ }
285
+
286
+ if (this._isOpen) {
287
+ this.close();
288
+ } else {
289
+ this.open();
290
+ }
291
+ }
292
+
293
+ /**
294
+ * Open the dropdown
295
+ */
296
+ public open(): void {
297
+ if (this._isOpen || this._isTransitioning) return;
298
+
299
+ // Fire before show event
300
+ const beforeShowEvent = new CustomEvent('kt.select.dropdown.show', {
301
+ bubbles: true,
302
+ cancelable: true,
303
+ });
304
+ this._element.dispatchEvent(beforeShowEvent);
305
+
306
+ if (beforeShowEvent.defaultPrevented) return;
307
+
308
+ // Begin opening transition
309
+ this._isTransitioning = true;
310
+
311
+ // Set initial styles - remove display: block and use class toggling instead
312
+ this._dropdownElement.classList.remove('hidden');
313
+ this._dropdownElement.style.opacity = '0';
314
+
315
+ // Set dropdown width
316
+ this._setDropdownWidth();
317
+
318
+ // Make sure the element is visible for transitioning
319
+ KTDom.reflow(this._dropdownElement);
320
+
321
+ // Apply z-index if configured
322
+ if (this._config.dropdownZindex) {
323
+ this._dropdownElement.style.zIndex =
324
+ this._config.dropdownZindex.toString();
325
+ } else {
326
+ // Auto-calculate z-index
327
+ const parentZindex = KTDom.getHighestZindex(this._element);
328
+ if (parentZindex) {
329
+ this._dropdownElement.style.zIndex = (parentZindex + 1).toString();
330
+ }
331
+ }
332
+
333
+ // Initialize popper for positioning
334
+ this._initPopper();
335
+
336
+ // Add active classes
337
+ this._dropdownElement.classList.add('open');
338
+ this._toggleElement.classList.add('active');
339
+ this._toggleElement.setAttribute('aria-expanded', 'true');
340
+
341
+ // Start transition
342
+ this._dropdownElement.style.opacity = '1';
343
+
344
+ // Handle transition end
345
+ KTDom.transitionEnd(this._dropdownElement, () => {
346
+ this._isTransitioning = false;
347
+ this._isOpen = true;
348
+
349
+ // Focus the first item if search is enabled
350
+ if (this._config.enableSearch) {
351
+ const searchInput = this._dropdownElement.querySelector(
352
+ 'input[type="search"]',
353
+ );
354
+ if (searchInput) {
355
+ (searchInput as HTMLInputElement).focus();
356
+ } else {
357
+ this._focusFirstOption();
358
+ }
359
+ } else {
360
+ this._focusFirstOption();
361
+ }
362
+
363
+ // Fire after show event
364
+ const afterShowEvent = new CustomEvent('kt.select.dropdown.shown', {
365
+ bubbles: true,
366
+ });
367
+ this._element.dispatchEvent(afterShowEvent);
368
+ });
369
+ }
370
+
371
+ /**
372
+ * Focus the first option in the dropdown
373
+ */
374
+ private _focusFirstOption(): void {
375
+ const firstOption = this._focusManager.getVisibleOptions()[0];
376
+ if (firstOption) {
377
+ this._focusManager.applyFocus(firstOption);
378
+ this._focusManager.scrollIntoView(firstOption);
379
+ }
380
+ }
381
+
382
+ /**
383
+ * Close the dropdown
384
+ */
385
+ public close(): void {
386
+ if (this._config.debug)
387
+ console.log(
388
+ 'KTSelectDropdown.close called - isOpen:',
389
+ this._isOpen,
390
+ 'isTransitioning:',
391
+ this._isTransitioning,
392
+ );
393
+
394
+ if (!this._isOpen || this._isTransitioning) {
395
+ if (this._config.debug)
396
+ console.log(
397
+ 'KTSelectDropdown.close - early return: dropdown not open or is transitioning',
398
+ );
399
+ return;
400
+ }
401
+
402
+ // Fire before hide event
403
+ const beforeHideEvent = new CustomEvent('kt.select.dropdown.hide', {
404
+ bubbles: true,
405
+ cancelable: true,
406
+ });
407
+ this._element.dispatchEvent(beforeHideEvent);
408
+
409
+ if (beforeHideEvent.defaultPrevented) {
410
+ if (this._config.debug)
411
+ console.log(
412
+ 'KTSelectDropdown.close - canceling due to defaultPrevented on beforeHideEvent',
413
+ );
414
+ return;
415
+ }
416
+
417
+ if (this._config.debug)
418
+ console.log('KTSelectDropdown.close - starting transition');
419
+ // Begin closing transition
420
+ this._isTransitioning = true;
421
+
422
+ // Start transition
423
+ this._dropdownElement.style.opacity = '0';
424
+
425
+ // Use a combination of transition end and a fallback timer
426
+ let transitionComplete = false;
427
+
428
+ // Set a fixed-duration fallback in case the transition event doesn't fire
429
+ const fallbackTimer = setTimeout(() => {
430
+ if (!transitionComplete) {
431
+ if (this._config.debug)
432
+ console.log('KTSelectDropdown.close - fallback timer triggered');
433
+ completeTransition();
434
+ }
435
+ }, 300); // 300ms should be enough for most transitions
436
+
437
+ // Setup the transition end function
438
+ const completeTransition = () => {
439
+ if (transitionComplete) return;
440
+ transitionComplete = true;
441
+ clearTimeout(fallbackTimer);
442
+
443
+ if (this._config.debug)
444
+ console.log('KTSelectDropdown.close - transition ended');
445
+ // Remove active classes
446
+ this._dropdownElement.classList.add('hidden');
447
+ this._dropdownElement.classList.remove('open');
448
+ this._toggleElement.classList.remove('active');
449
+ this._toggleElement.setAttribute('aria-expanded', 'false');
450
+
451
+ // Reset styles - replace display: none with adding hidden class
452
+ this._dropdownElement.classList.add('hidden');
453
+ this._dropdownElement.style.opacity = '';
454
+ this._dropdownElement.style.zIndex = '';
455
+
456
+ // Destroy popper
457
+ this._destroyPopper();
458
+
459
+ // Update state
460
+ this._isTransitioning = false;
461
+ this._isOpen = false;
462
+
463
+ // Fire after hide event
464
+ const afterHideEvent = new CustomEvent('kt.select.dropdown.hidden', {
465
+ bubbles: true,
466
+ });
467
+ this._element.dispatchEvent(afterHideEvent);
468
+ if (this._config.debug)
469
+ console.log('KTSelectDropdown.close - complete, events fired');
470
+ };
471
+
472
+ // Handle transition end via the utility but also have the fallback
473
+ KTDom.transitionEnd(this._dropdownElement, completeTransition);
474
+ }
475
+
476
+ /**
477
+ * Check if dropdown is open
478
+ */
479
+ public isOpen(): boolean {
480
+ return this._isOpen;
481
+ }
482
+
483
+ /**
484
+ * Clean up component
485
+ */
486
+ public override dispose(): void {
487
+ // Destroy popper
488
+ this._destroyPopper();
489
+
490
+ // Remove event listeners
491
+ this._eventManager.removeAllListeners(this._element);
492
+ this._eventManager.removeAllListeners(this._toggleElement);
493
+ this._eventManager.removeAllListeners(document as unknown as HTMLElement);
494
+
495
+ // Clean up focus manager
496
+ if (
497
+ this._focusManager &&
498
+ typeof this._focusManager.dispose === 'function'
499
+ ) {
500
+ this._focusManager.dispose();
501
+ }
502
+
503
+ // Clean up state
504
+ this._isOpen = false;
505
+ this._isTransitioning = false;
506
+
507
+ // Remove data reference
508
+ KTData.remove(this._element, this._name);
509
+ }
510
+ }
@@ -0,0 +1,13 @@
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 { KTSelect } from './select';
7
+ export { KTSelectRemote } from './remote';
8
+ export { KTSelectCombobox } from './combobox';
9
+ export { KTSelectSearch } from './search';
10
+ export { KTSelectTags } from './tags';
11
+ export { KTSelectDropdown } from './dropdown';
12
+ export { filterOptions, FocusManager, EventManager } from './utils';
13
+ export { KTSelectConfigInterface, KTSelectOption } from './config';
@@ -0,0 +1,43 @@
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 KTComponent from '../component';
7
+ import {
8
+ KTSelectOptionConfigInterface,
9
+ KTSelectConfigInterface,
10
+ } from './config';
11
+ import { defaultTemplates } from './templates';
12
+
13
+ export class KTSelectOption extends KTComponent {
14
+ protected override readonly _name: string = 'select-option';
15
+ protected override readonly _dataOptionPrefix: string = 'kt-'; // Use 'kt-' prefix to support data-kt-select-option attributes
16
+ protected override readonly _config: KTSelectOptionConfigInterface;
17
+ private _globalConfig: KTSelectConfigInterface;
18
+
19
+ constructor(element: HTMLElement, config?: KTSelectConfigInterface) {
20
+ super();
21
+
22
+ // Always initialize a new option instance
23
+ this._init(element);
24
+ this._buildConfig();
25
+ this._globalConfig = config;
26
+
27
+ // Don't store in KTData to avoid Singleton pattern issues
28
+ // Each option should be a unique instance
29
+ (element as any).instance = this;
30
+ }
31
+
32
+ public getHTMLOptionElement(): HTMLOptionElement {
33
+ return this._element as HTMLOptionElement;
34
+ }
35
+
36
+ public render(): HTMLElement {
37
+ const optionElement = this.getHTMLOptionElement();
38
+ // Use the global config if available, or create a minimal valid config
39
+ const config = this._globalConfig || { height: 250 };
40
+ // Create a new option element every time
41
+ return defaultTemplates.option(optionElement, config);
42
+ }
43
+ }