@keenthemes/ktui 1.1.6 → 1.2.1

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 (492) hide show
  1. package/README.md +24 -0
  2. package/dist/ktui.js +4321 -2055
  3. package/dist/ktui.min.js +1 -1
  4. package/dist/ktui.min.js.map +1 -1
  5. package/dist/styles.css +108 -6
  6. package/lib/cjs/components/accordion/accordion.d.ts +32 -0
  7. package/lib/cjs/components/accordion/accordion.d.ts.map +1 -0
  8. package/lib/cjs/components/accordion/index.d.ts +7 -0
  9. package/lib/cjs/components/accordion/index.d.ts.map +1 -0
  10. package/lib/cjs/components/accordion/types.d.ts +15 -0
  11. package/lib/cjs/components/accordion/types.d.ts.map +1 -0
  12. package/lib/cjs/components/clipboard/clipboard.d.ts +37 -0
  13. package/lib/cjs/components/clipboard/clipboard.d.ts.map +1 -0
  14. package/lib/cjs/components/clipboard/clipboard.js +402 -0
  15. package/lib/cjs/components/clipboard/clipboard.js.map +1 -0
  16. package/lib/cjs/components/clipboard/index.d.ts +3 -0
  17. package/lib/cjs/components/clipboard/index.d.ts.map +1 -0
  18. package/lib/cjs/components/clipboard/index.js +6 -0
  19. package/lib/cjs/components/clipboard/index.js.map +1 -0
  20. package/lib/cjs/components/clipboard/types.d.ts +44 -0
  21. package/lib/cjs/components/clipboard/types.d.ts.map +1 -0
  22. package/lib/cjs/components/clipboard/types.js +7 -0
  23. package/lib/cjs/components/clipboard/types.js.map +1 -0
  24. package/lib/cjs/components/collapse/collapse.d.ts +28 -0
  25. package/lib/cjs/components/collapse/collapse.d.ts.map +1 -0
  26. package/lib/cjs/components/collapse/index.d.ts +7 -0
  27. package/lib/cjs/components/collapse/index.d.ts.map +1 -0
  28. package/lib/cjs/components/collapse/types.d.ts +15 -0
  29. package/lib/cjs/components/collapse/types.d.ts.map +1 -0
  30. package/lib/cjs/components/component.d.ts +44 -0
  31. package/lib/cjs/components/component.d.ts.map +1 -0
  32. package/lib/cjs/components/constants.d.ts +6 -0
  33. package/lib/cjs/components/constants.d.ts.map +1 -0
  34. package/lib/cjs/components/datatable/datatable-checkbox.d.ts +16 -0
  35. package/lib/cjs/components/datatable/datatable-checkbox.d.ts.map +1 -0
  36. package/lib/cjs/components/datatable/datatable-sort.d.ts +16 -0
  37. package/lib/cjs/components/datatable/datatable-sort.d.ts.map +1 -0
  38. package/lib/cjs/components/datatable/datatable.d.ts +339 -0
  39. package/lib/cjs/components/datatable/datatable.d.ts.map +1 -0
  40. package/lib/cjs/components/datatable/datatable.js.map +1 -1
  41. package/lib/cjs/components/datatable/index.d.ts +7 -0
  42. package/lib/cjs/components/datatable/index.d.ts.map +1 -0
  43. package/lib/cjs/components/datatable/types.d.ts +166 -0
  44. package/lib/cjs/components/datatable/types.d.ts.map +1 -0
  45. package/lib/cjs/components/dismiss/dismiss.d.ts +30 -0
  46. package/lib/cjs/components/dismiss/dismiss.d.ts.map +1 -0
  47. package/lib/cjs/components/dismiss/index.d.ts +7 -0
  48. package/lib/cjs/components/dismiss/index.d.ts.map +1 -0
  49. package/lib/cjs/components/dismiss/types.d.ts +15 -0
  50. package/lib/cjs/components/dismiss/types.d.ts.map +1 -0
  51. package/lib/cjs/components/drawer/drawer.d.ts +63 -0
  52. package/lib/cjs/components/drawer/drawer.d.ts.map +1 -0
  53. package/lib/cjs/components/drawer/index.d.ts +7 -0
  54. package/lib/cjs/components/drawer/index.d.ts.map +1 -0
  55. package/lib/cjs/components/drawer/types.d.ts +27 -0
  56. package/lib/cjs/components/drawer/types.d.ts.map +1 -0
  57. package/lib/cjs/components/dropdown/dropdown.d.ts +71 -0
  58. package/lib/cjs/components/dropdown/dropdown.d.ts.map +1 -0
  59. package/lib/cjs/components/dropdown/index.d.ts +7 -0
  60. package/lib/cjs/components/dropdown/index.d.ts.map +1 -0
  61. package/lib/cjs/components/dropdown/types.d.ts +27 -0
  62. package/lib/cjs/components/dropdown/types.d.ts.map +1 -0
  63. package/lib/cjs/components/image-input/image-input.d.ts +42 -0
  64. package/lib/cjs/components/image-input/image-input.d.ts.map +1 -0
  65. package/lib/cjs/components/image-input/index.d.ts +7 -0
  66. package/lib/cjs/components/image-input/index.d.ts.map +1 -0
  67. package/lib/cjs/components/image-input/types.d.ts +12 -0
  68. package/lib/cjs/components/image-input/types.d.ts.map +1 -0
  69. package/lib/cjs/components/modal/index.d.ts +7 -0
  70. package/lib/cjs/components/modal/index.d.ts.map +1 -0
  71. package/lib/cjs/components/modal/modal.d.ts +45 -0
  72. package/lib/cjs/components/modal/modal.d.ts.map +1 -0
  73. package/lib/cjs/components/modal/types.d.ts +21 -0
  74. package/lib/cjs/components/modal/types.d.ts.map +1 -0
  75. package/lib/cjs/components/range-slider/index.d.ts +7 -0
  76. package/lib/cjs/components/range-slider/index.d.ts.map +1 -0
  77. package/lib/cjs/components/range-slider/index.js +10 -0
  78. package/lib/cjs/components/range-slider/index.js.map +1 -0
  79. package/lib/cjs/components/range-slider/range-slider.d.ts +42 -0
  80. package/lib/cjs/components/range-slider/range-slider.d.ts.map +1 -0
  81. package/lib/cjs/components/range-slider/range-slider.js +254 -0
  82. package/lib/cjs/components/range-slider/range-slider.js.map +1 -0
  83. package/lib/cjs/components/range-slider/types.d.ts +33 -0
  84. package/lib/cjs/components/range-slider/types.d.ts.map +1 -0
  85. package/lib/cjs/components/range-slider/types.js +7 -0
  86. package/lib/cjs/components/range-slider/types.js.map +1 -0
  87. package/lib/cjs/components/rating/index.d.ts +7 -0
  88. package/lib/cjs/components/rating/index.d.ts.map +1 -0
  89. package/lib/cjs/components/rating/index.js +10 -0
  90. package/lib/cjs/components/rating/index.js.map +1 -0
  91. package/lib/cjs/components/rating/rating.d.ts +31 -0
  92. package/lib/cjs/components/rating/rating.d.ts.map +1 -0
  93. package/lib/cjs/components/rating/rating.js +244 -0
  94. package/lib/cjs/components/rating/rating.js.map +1 -0
  95. package/lib/cjs/components/rating/types.d.ts +25 -0
  96. package/lib/cjs/components/rating/types.d.ts.map +1 -0
  97. package/lib/cjs/components/rating/types.js +7 -0
  98. package/lib/cjs/components/rating/types.js.map +1 -0
  99. package/lib/cjs/components/reparent/index.d.ts +7 -0
  100. package/lib/cjs/components/reparent/index.d.ts.map +1 -0
  101. package/lib/cjs/components/reparent/reparent.d.ts +25 -0
  102. package/lib/cjs/components/reparent/reparent.d.ts.map +1 -0
  103. package/lib/cjs/components/reparent/types.d.ts +13 -0
  104. package/lib/cjs/components/reparent/types.d.ts.map +1 -0
  105. package/lib/cjs/components/repeater/index.d.ts +7 -0
  106. package/lib/cjs/components/repeater/index.d.ts.map +1 -0
  107. package/lib/cjs/components/repeater/index.js +10 -0
  108. package/lib/cjs/components/repeater/index.js.map +1 -0
  109. package/lib/cjs/components/repeater/repeater.d.ts +33 -0
  110. package/lib/cjs/components/repeater/repeater.d.ts.map +1 -0
  111. package/lib/cjs/components/repeater/repeater.js +174 -0
  112. package/lib/cjs/components/repeater/repeater.js.map +1 -0
  113. package/lib/cjs/components/repeater/types.d.ts +18 -0
  114. package/lib/cjs/components/repeater/types.d.ts.map +1 -0
  115. package/lib/cjs/components/repeater/types.js +7 -0
  116. package/lib/cjs/components/repeater/types.js.map +1 -0
  117. package/lib/cjs/components/scrollable/index.d.ts +7 -0
  118. package/lib/cjs/components/scrollable/index.d.ts.map +1 -0
  119. package/lib/cjs/components/scrollable/scrollable.d.ts +37 -0
  120. package/lib/cjs/components/scrollable/scrollable.d.ts.map +1 -0
  121. package/lib/cjs/components/scrollable/types.d.ts +15 -0
  122. package/lib/cjs/components/scrollable/types.d.ts.map +1 -0
  123. package/lib/cjs/components/scrollspy/index.d.ts +7 -0
  124. package/lib/cjs/components/scrollspy/index.d.ts.map +1 -0
  125. package/lib/cjs/components/scrollspy/scrollspy.d.ts +35 -0
  126. package/lib/cjs/components/scrollspy/scrollspy.d.ts.map +1 -0
  127. package/lib/cjs/components/scrollspy/types.d.ts +14 -0
  128. package/lib/cjs/components/scrollspy/types.d.ts.map +1 -0
  129. package/lib/cjs/components/scrollto/index.d.ts +7 -0
  130. package/lib/cjs/components/scrollto/index.d.ts.map +1 -0
  131. package/lib/cjs/components/scrollto/scrollto.d.ts +28 -0
  132. package/lib/cjs/components/scrollto/scrollto.d.ts.map +1 -0
  133. package/lib/cjs/components/scrollto/types.d.ts +14 -0
  134. package/lib/cjs/components/scrollto/types.d.ts.map +1 -0
  135. package/lib/cjs/components/select/combobox.d.ts +52 -0
  136. package/lib/cjs/components/select/combobox.d.ts.map +1 -0
  137. package/lib/cjs/components/select/config.d.ts +105 -0
  138. package/lib/cjs/components/select/config.d.ts.map +1 -0
  139. package/lib/cjs/components/select/dropdown.d.ts +101 -0
  140. package/lib/cjs/components/select/dropdown.d.ts.map +1 -0
  141. package/lib/cjs/components/select/index.d.ts +13 -0
  142. package/lib/cjs/components/select/index.d.ts.map +1 -0
  143. package/lib/cjs/components/select/option.d.ts +23 -0
  144. package/lib/cjs/components/select/option.d.ts.map +1 -0
  145. package/lib/cjs/components/select/remote.d.ts +91 -0
  146. package/lib/cjs/components/select/remote.d.ts.map +1 -0
  147. package/lib/cjs/components/select/search.d.ts +67 -0
  148. package/lib/cjs/components/select/search.d.ts.map +1 -0
  149. package/lib/cjs/components/select/select.d.ts +427 -0
  150. package/lib/cjs/components/select/select.d.ts.map +1 -0
  151. package/lib/cjs/components/select/select.js +3 -0
  152. package/lib/cjs/components/select/select.js.map +1 -1
  153. package/lib/cjs/components/select/tags.d.ts +32 -0
  154. package/lib/cjs/components/select/tags.d.ts.map +1 -0
  155. package/lib/cjs/components/select/templates.d.ts +79 -0
  156. package/lib/cjs/components/select/templates.d.ts.map +1 -0
  157. package/lib/cjs/components/select/types.d.ts +23 -0
  158. package/lib/cjs/components/select/types.d.ts.map +1 -0
  159. package/lib/cjs/components/select/utils.d.ts +130 -0
  160. package/lib/cjs/components/select/utils.d.ts.map +1 -0
  161. package/lib/cjs/components/select/utils.js +3 -1
  162. package/lib/cjs/components/select/utils.js.map +1 -1
  163. package/lib/cjs/components/stepper/index.d.ts +7 -0
  164. package/lib/cjs/components/stepper/index.d.ts.map +1 -0
  165. package/lib/cjs/components/stepper/stepper.d.ts +53 -0
  166. package/lib/cjs/components/stepper/stepper.d.ts.map +1 -0
  167. package/lib/cjs/components/stepper/types.d.ts +12 -0
  168. package/lib/cjs/components/stepper/types.d.ts.map +1 -0
  169. package/lib/cjs/components/sticky/index.d.ts +7 -0
  170. package/lib/cjs/components/sticky/index.d.ts.map +1 -0
  171. package/lib/cjs/components/sticky/sticky.d.ts +51 -0
  172. package/lib/cjs/components/sticky/sticky.d.ts.map +1 -0
  173. package/lib/cjs/components/sticky/sticky.js +3 -1
  174. package/lib/cjs/components/sticky/sticky.js.map +1 -1
  175. package/lib/cjs/components/sticky/types.d.ts +28 -0
  176. package/lib/cjs/components/sticky/types.d.ts.map +1 -0
  177. package/lib/cjs/components/tabs/index.d.ts +7 -0
  178. package/lib/cjs/components/tabs/index.d.ts.map +1 -0
  179. package/lib/cjs/components/tabs/tabs.d.ts +38 -0
  180. package/lib/cjs/components/tabs/tabs.d.ts.map +1 -0
  181. package/lib/cjs/components/tabs/types.d.ts +12 -0
  182. package/lib/cjs/components/tabs/types.d.ts.map +1 -0
  183. package/lib/cjs/components/theme-switch/index.d.ts +7 -0
  184. package/lib/cjs/components/theme-switch/index.d.ts.map +1 -0
  185. package/lib/cjs/components/theme-switch/theme-switch.d.ts +33 -0
  186. package/lib/cjs/components/theme-switch/theme-switch.d.ts.map +1 -0
  187. package/lib/cjs/components/theme-switch/types.d.ts +13 -0
  188. package/lib/cjs/components/theme-switch/types.d.ts.map +1 -0
  189. package/lib/cjs/components/toast/index.d.ts +7 -0
  190. package/lib/cjs/components/toast/index.d.ts.map +1 -0
  191. package/lib/cjs/components/toast/toast.d.ts +76 -0
  192. package/lib/cjs/components/toast/toast.d.ts.map +1 -0
  193. package/lib/cjs/components/toast/types.d.ts +146 -0
  194. package/lib/cjs/components/toast/types.d.ts.map +1 -0
  195. package/lib/cjs/components/toggle/index.d.ts +7 -0
  196. package/lib/cjs/components/toggle/index.d.ts.map +1 -0
  197. package/lib/cjs/components/toggle/toggle.d.ts +31 -0
  198. package/lib/cjs/components/toggle/toggle.d.ts.map +1 -0
  199. package/lib/cjs/components/toggle/types.d.ts +17 -0
  200. package/lib/cjs/components/toggle/types.d.ts.map +1 -0
  201. package/lib/cjs/components/toggle-password/index.d.ts +7 -0
  202. package/lib/cjs/components/toggle-password/index.d.ts.map +1 -0
  203. package/lib/cjs/components/toggle-password/toggle-password.d.ts +32 -0
  204. package/lib/cjs/components/toggle-password/toggle-password.d.ts.map +1 -0
  205. package/lib/cjs/components/toggle-password/types.d.ts +12 -0
  206. package/lib/cjs/components/toggle-password/types.d.ts.map +1 -0
  207. package/lib/cjs/components/tooltip/index.d.ts +7 -0
  208. package/lib/cjs/components/tooltip/index.d.ts.map +1 -0
  209. package/lib/cjs/components/tooltip/tooltip.d.ts +46 -0
  210. package/lib/cjs/components/tooltip/tooltip.d.ts.map +1 -0
  211. package/lib/cjs/components/tooltip/types.d.ts +26 -0
  212. package/lib/cjs/components/tooltip/types.d.ts.map +1 -0
  213. package/lib/cjs/helpers/data.d.ts +13 -0
  214. package/lib/cjs/helpers/data.d.ts.map +1 -0
  215. package/lib/cjs/helpers/dom.d.ts +42 -0
  216. package/lib/cjs/helpers/dom.d.ts.map +1 -0
  217. package/lib/cjs/helpers/event-handler.d.ts +14 -0
  218. package/lib/cjs/helpers/event-handler.d.ts.map +1 -0
  219. package/lib/cjs/helpers/utils.d.ts +25 -0
  220. package/lib/cjs/helpers/utils.d.ts.map +1 -0
  221. package/lib/cjs/index.d.ts +122 -0
  222. package/lib/cjs/index.d.ts.map +1 -0
  223. package/lib/cjs/index.js +17 -1
  224. package/lib/cjs/index.js.map +1 -1
  225. package/lib/cjs/types.d.ts +17 -0
  226. package/lib/cjs/types.d.ts.map +1 -0
  227. package/lib/esm/components/accordion/accordion.d.ts +32 -0
  228. package/lib/esm/components/accordion/accordion.d.ts.map +1 -0
  229. package/lib/esm/components/accordion/index.d.ts +7 -0
  230. package/lib/esm/components/accordion/index.d.ts.map +1 -0
  231. package/lib/esm/components/accordion/types.d.ts +15 -0
  232. package/lib/esm/components/accordion/types.d.ts.map +1 -0
  233. package/lib/esm/components/clipboard/clipboard.d.ts +37 -0
  234. package/lib/esm/components/clipboard/clipboard.d.ts.map +1 -0
  235. package/lib/esm/components/clipboard/clipboard.js +399 -0
  236. package/lib/esm/components/clipboard/clipboard.js.map +1 -0
  237. package/lib/esm/components/clipboard/index.d.ts +3 -0
  238. package/lib/esm/components/clipboard/index.d.ts.map +1 -0
  239. package/lib/esm/components/clipboard/index.js +2 -0
  240. package/lib/esm/components/clipboard/index.js.map +1 -0
  241. package/lib/esm/components/clipboard/types.d.ts +44 -0
  242. package/lib/esm/components/clipboard/types.d.ts.map +1 -0
  243. package/lib/esm/components/clipboard/types.js +6 -0
  244. package/lib/esm/components/clipboard/types.js.map +1 -0
  245. package/lib/esm/components/collapse/collapse.d.ts +28 -0
  246. package/lib/esm/components/collapse/collapse.d.ts.map +1 -0
  247. package/lib/esm/components/collapse/index.d.ts +7 -0
  248. package/lib/esm/components/collapse/index.d.ts.map +1 -0
  249. package/lib/esm/components/collapse/types.d.ts +15 -0
  250. package/lib/esm/components/collapse/types.d.ts.map +1 -0
  251. package/lib/esm/components/component.d.ts +44 -0
  252. package/lib/esm/components/component.d.ts.map +1 -0
  253. package/lib/esm/components/constants.d.ts +6 -0
  254. package/lib/esm/components/constants.d.ts.map +1 -0
  255. package/lib/esm/components/datatable/datatable-checkbox.d.ts +16 -0
  256. package/lib/esm/components/datatable/datatable-checkbox.d.ts.map +1 -0
  257. package/lib/esm/components/datatable/datatable-sort.d.ts +16 -0
  258. package/lib/esm/components/datatable/datatable-sort.d.ts.map +1 -0
  259. package/lib/esm/components/datatable/datatable.d.ts +339 -0
  260. package/lib/esm/components/datatable/datatable.d.ts.map +1 -0
  261. package/lib/esm/components/datatable/datatable.js.map +1 -1
  262. package/lib/esm/components/datatable/index.d.ts +7 -0
  263. package/lib/esm/components/datatable/index.d.ts.map +1 -0
  264. package/lib/esm/components/datatable/types.d.ts +166 -0
  265. package/lib/esm/components/datatable/types.d.ts.map +1 -0
  266. package/lib/esm/components/dismiss/dismiss.d.ts +30 -0
  267. package/lib/esm/components/dismiss/dismiss.d.ts.map +1 -0
  268. package/lib/esm/components/dismiss/index.d.ts +7 -0
  269. package/lib/esm/components/dismiss/index.d.ts.map +1 -0
  270. package/lib/esm/components/dismiss/types.d.ts +15 -0
  271. package/lib/esm/components/dismiss/types.d.ts.map +1 -0
  272. package/lib/esm/components/drawer/drawer.d.ts +63 -0
  273. package/lib/esm/components/drawer/drawer.d.ts.map +1 -0
  274. package/lib/esm/components/drawer/index.d.ts +7 -0
  275. package/lib/esm/components/drawer/index.d.ts.map +1 -0
  276. package/lib/esm/components/drawer/types.d.ts +27 -0
  277. package/lib/esm/components/drawer/types.d.ts.map +1 -0
  278. package/lib/esm/components/dropdown/dropdown.d.ts +71 -0
  279. package/lib/esm/components/dropdown/dropdown.d.ts.map +1 -0
  280. package/lib/esm/components/dropdown/index.d.ts +7 -0
  281. package/lib/esm/components/dropdown/index.d.ts.map +1 -0
  282. package/lib/esm/components/dropdown/types.d.ts +27 -0
  283. package/lib/esm/components/dropdown/types.d.ts.map +1 -0
  284. package/lib/esm/components/image-input/image-input.d.ts +42 -0
  285. package/lib/esm/components/image-input/image-input.d.ts.map +1 -0
  286. package/lib/esm/components/image-input/index.d.ts +7 -0
  287. package/lib/esm/components/image-input/index.d.ts.map +1 -0
  288. package/lib/esm/components/image-input/types.d.ts +12 -0
  289. package/lib/esm/components/image-input/types.d.ts.map +1 -0
  290. package/lib/esm/components/modal/index.d.ts +7 -0
  291. package/lib/esm/components/modal/index.d.ts.map +1 -0
  292. package/lib/esm/components/modal/modal.d.ts +45 -0
  293. package/lib/esm/components/modal/modal.d.ts.map +1 -0
  294. package/lib/esm/components/modal/types.d.ts +21 -0
  295. package/lib/esm/components/modal/types.d.ts.map +1 -0
  296. package/lib/esm/components/range-slider/index.d.ts +7 -0
  297. package/lib/esm/components/range-slider/index.d.ts.map +1 -0
  298. package/lib/esm/components/range-slider/index.js +6 -0
  299. package/lib/esm/components/range-slider/index.js.map +1 -0
  300. package/lib/esm/components/range-slider/range-slider.d.ts +42 -0
  301. package/lib/esm/components/range-slider/range-slider.d.ts.map +1 -0
  302. package/lib/esm/components/range-slider/range-slider.js +251 -0
  303. package/lib/esm/components/range-slider/range-slider.js.map +1 -0
  304. package/lib/esm/components/range-slider/types.d.ts +33 -0
  305. package/lib/esm/components/range-slider/types.d.ts.map +1 -0
  306. package/lib/esm/components/range-slider/types.js +6 -0
  307. package/lib/esm/components/range-slider/types.js.map +1 -0
  308. package/lib/esm/components/rating/index.d.ts +7 -0
  309. package/lib/esm/components/rating/index.d.ts.map +1 -0
  310. package/lib/esm/components/rating/index.js +6 -0
  311. package/lib/esm/components/rating/index.js.map +1 -0
  312. package/lib/esm/components/rating/rating.d.ts +31 -0
  313. package/lib/esm/components/rating/rating.d.ts.map +1 -0
  314. package/lib/esm/components/rating/rating.js +241 -0
  315. package/lib/esm/components/rating/rating.js.map +1 -0
  316. package/lib/esm/components/rating/types.d.ts +25 -0
  317. package/lib/esm/components/rating/types.d.ts.map +1 -0
  318. package/lib/esm/components/rating/types.js +6 -0
  319. package/lib/esm/components/rating/types.js.map +1 -0
  320. package/lib/esm/components/reparent/index.d.ts +7 -0
  321. package/lib/esm/components/reparent/index.d.ts.map +1 -0
  322. package/lib/esm/components/reparent/reparent.d.ts +25 -0
  323. package/lib/esm/components/reparent/reparent.d.ts.map +1 -0
  324. package/lib/esm/components/reparent/types.d.ts +13 -0
  325. package/lib/esm/components/reparent/types.d.ts.map +1 -0
  326. package/lib/esm/components/repeater/index.d.ts +7 -0
  327. package/lib/esm/components/repeater/index.d.ts.map +1 -0
  328. package/lib/esm/components/repeater/index.js +6 -0
  329. package/lib/esm/components/repeater/index.js.map +1 -0
  330. package/lib/esm/components/repeater/repeater.d.ts +33 -0
  331. package/lib/esm/components/repeater/repeater.d.ts.map +1 -0
  332. package/lib/esm/components/repeater/repeater.js +171 -0
  333. package/lib/esm/components/repeater/repeater.js.map +1 -0
  334. package/lib/esm/components/repeater/types.d.ts +18 -0
  335. package/lib/esm/components/repeater/types.d.ts.map +1 -0
  336. package/lib/esm/components/repeater/types.js +6 -0
  337. package/lib/esm/components/repeater/types.js.map +1 -0
  338. package/lib/esm/components/scrollable/index.d.ts +7 -0
  339. package/lib/esm/components/scrollable/index.d.ts.map +1 -0
  340. package/lib/esm/components/scrollable/scrollable.d.ts +37 -0
  341. package/lib/esm/components/scrollable/scrollable.d.ts.map +1 -0
  342. package/lib/esm/components/scrollable/types.d.ts +15 -0
  343. package/lib/esm/components/scrollable/types.d.ts.map +1 -0
  344. package/lib/esm/components/scrollspy/index.d.ts +7 -0
  345. package/lib/esm/components/scrollspy/index.d.ts.map +1 -0
  346. package/lib/esm/components/scrollspy/scrollspy.d.ts +35 -0
  347. package/lib/esm/components/scrollspy/scrollspy.d.ts.map +1 -0
  348. package/lib/esm/components/scrollspy/types.d.ts +14 -0
  349. package/lib/esm/components/scrollspy/types.d.ts.map +1 -0
  350. package/lib/esm/components/scrollto/index.d.ts +7 -0
  351. package/lib/esm/components/scrollto/index.d.ts.map +1 -0
  352. package/lib/esm/components/scrollto/scrollto.d.ts +28 -0
  353. package/lib/esm/components/scrollto/scrollto.d.ts.map +1 -0
  354. package/lib/esm/components/scrollto/types.d.ts +14 -0
  355. package/lib/esm/components/scrollto/types.d.ts.map +1 -0
  356. package/lib/esm/components/select/combobox.d.ts +52 -0
  357. package/lib/esm/components/select/combobox.d.ts.map +1 -0
  358. package/lib/esm/components/select/config.d.ts +105 -0
  359. package/lib/esm/components/select/config.d.ts.map +1 -0
  360. package/lib/esm/components/select/dropdown.d.ts +101 -0
  361. package/lib/esm/components/select/dropdown.d.ts.map +1 -0
  362. package/lib/esm/components/select/index.d.ts +13 -0
  363. package/lib/esm/components/select/index.d.ts.map +1 -0
  364. package/lib/esm/components/select/option.d.ts +23 -0
  365. package/lib/esm/components/select/option.d.ts.map +1 -0
  366. package/lib/esm/components/select/remote.d.ts +91 -0
  367. package/lib/esm/components/select/remote.d.ts.map +1 -0
  368. package/lib/esm/components/select/search.d.ts +67 -0
  369. package/lib/esm/components/select/search.d.ts.map +1 -0
  370. package/lib/esm/components/select/select.d.ts +427 -0
  371. package/lib/esm/components/select/select.d.ts.map +1 -0
  372. package/lib/esm/components/select/select.js +3 -0
  373. package/lib/esm/components/select/select.js.map +1 -1
  374. package/lib/esm/components/select/tags.d.ts +32 -0
  375. package/lib/esm/components/select/tags.d.ts.map +1 -0
  376. package/lib/esm/components/select/templates.d.ts +79 -0
  377. package/lib/esm/components/select/templates.d.ts.map +1 -0
  378. package/lib/esm/components/select/types.d.ts +23 -0
  379. package/lib/esm/components/select/types.d.ts.map +1 -0
  380. package/lib/esm/components/select/utils.d.ts +130 -0
  381. package/lib/esm/components/select/utils.d.ts.map +1 -0
  382. package/lib/esm/components/select/utils.js +3 -1
  383. package/lib/esm/components/select/utils.js.map +1 -1
  384. package/lib/esm/components/stepper/index.d.ts +7 -0
  385. package/lib/esm/components/stepper/index.d.ts.map +1 -0
  386. package/lib/esm/components/stepper/stepper.d.ts +53 -0
  387. package/lib/esm/components/stepper/stepper.d.ts.map +1 -0
  388. package/lib/esm/components/stepper/types.d.ts +12 -0
  389. package/lib/esm/components/stepper/types.d.ts.map +1 -0
  390. package/lib/esm/components/sticky/index.d.ts +7 -0
  391. package/lib/esm/components/sticky/index.d.ts.map +1 -0
  392. package/lib/esm/components/sticky/sticky.d.ts +51 -0
  393. package/lib/esm/components/sticky/sticky.d.ts.map +1 -0
  394. package/lib/esm/components/sticky/sticky.js +3 -1
  395. package/lib/esm/components/sticky/sticky.js.map +1 -1
  396. package/lib/esm/components/sticky/types.d.ts +28 -0
  397. package/lib/esm/components/sticky/types.d.ts.map +1 -0
  398. package/lib/esm/components/tabs/index.d.ts +7 -0
  399. package/lib/esm/components/tabs/index.d.ts.map +1 -0
  400. package/lib/esm/components/tabs/tabs.d.ts +38 -0
  401. package/lib/esm/components/tabs/tabs.d.ts.map +1 -0
  402. package/lib/esm/components/tabs/types.d.ts +12 -0
  403. package/lib/esm/components/tabs/types.d.ts.map +1 -0
  404. package/lib/esm/components/theme-switch/index.d.ts +7 -0
  405. package/lib/esm/components/theme-switch/index.d.ts.map +1 -0
  406. package/lib/esm/components/theme-switch/theme-switch.d.ts +33 -0
  407. package/lib/esm/components/theme-switch/theme-switch.d.ts.map +1 -0
  408. package/lib/esm/components/theme-switch/types.d.ts +13 -0
  409. package/lib/esm/components/theme-switch/types.d.ts.map +1 -0
  410. package/lib/esm/components/toast/index.d.ts +7 -0
  411. package/lib/esm/components/toast/index.d.ts.map +1 -0
  412. package/lib/esm/components/toast/toast.d.ts +76 -0
  413. package/lib/esm/components/toast/toast.d.ts.map +1 -0
  414. package/lib/esm/components/toast/types.d.ts +146 -0
  415. package/lib/esm/components/toast/types.d.ts.map +1 -0
  416. package/lib/esm/components/toggle/index.d.ts +7 -0
  417. package/lib/esm/components/toggle/index.d.ts.map +1 -0
  418. package/lib/esm/components/toggle/toggle.d.ts +31 -0
  419. package/lib/esm/components/toggle/toggle.d.ts.map +1 -0
  420. package/lib/esm/components/toggle/types.d.ts +17 -0
  421. package/lib/esm/components/toggle/types.d.ts.map +1 -0
  422. package/lib/esm/components/toggle-password/index.d.ts +7 -0
  423. package/lib/esm/components/toggle-password/index.d.ts.map +1 -0
  424. package/lib/esm/components/toggle-password/toggle-password.d.ts +32 -0
  425. package/lib/esm/components/toggle-password/toggle-password.d.ts.map +1 -0
  426. package/lib/esm/components/toggle-password/types.d.ts +12 -0
  427. package/lib/esm/components/toggle-password/types.d.ts.map +1 -0
  428. package/lib/esm/components/tooltip/index.d.ts +7 -0
  429. package/lib/esm/components/tooltip/index.d.ts.map +1 -0
  430. package/lib/esm/components/tooltip/tooltip.d.ts +46 -0
  431. package/lib/esm/components/tooltip/tooltip.d.ts.map +1 -0
  432. package/lib/esm/components/tooltip/types.d.ts +26 -0
  433. package/lib/esm/components/tooltip/types.d.ts.map +1 -0
  434. package/lib/esm/helpers/data.d.ts +13 -0
  435. package/lib/esm/helpers/data.d.ts.map +1 -0
  436. package/lib/esm/helpers/dom.d.ts +42 -0
  437. package/lib/esm/helpers/dom.d.ts.map +1 -0
  438. package/lib/esm/helpers/event-handler.d.ts +14 -0
  439. package/lib/esm/helpers/event-handler.d.ts.map +1 -0
  440. package/lib/esm/helpers/utils.d.ts +25 -0
  441. package/lib/esm/helpers/utils.d.ts.map +1 -0
  442. package/lib/esm/index.d.ts +122 -0
  443. package/lib/esm/index.d.ts.map +1 -0
  444. package/lib/esm/index.js +12 -0
  445. package/lib/esm/index.js.map +1 -1
  446. package/lib/esm/types.d.ts +17 -0
  447. package/lib/esm/types.d.ts.map +1 -0
  448. package/package.json +4 -4
  449. package/skills/ktui-components/SKILL.md +41 -0
  450. package/skills/ktui-theming/SKILL.md +50 -0
  451. package/src/components/clipboard/__tests__/clipboard.test.ts +438 -0
  452. package/src/components/clipboard/clipboard.ts +416 -0
  453. package/src/components/clipboard/index.ts +2 -0
  454. package/src/components/clipboard/types.ts +51 -0
  455. package/src/components/datatable/__tests__/currency-sort.test.ts +2 -10
  456. package/src/components/datatable/__tests__/multi-row-headers.test.ts +2 -2
  457. package/src/components/datatable/__tests__/race-conditions.test.ts +11 -14
  458. package/src/components/datatable/datatable.ts +3 -5
  459. package/src/components/input/input-group.css +15 -5
  460. package/src/components/range-slider/__tests__/range-slider.test.ts +659 -0
  461. package/src/components/range-slider/index.ts +11 -0
  462. package/src/components/range-slider/range-slider.ts +276 -0
  463. package/src/components/range-slider/types.ts +36 -0
  464. package/src/components/rating/__tests__/rating.test.ts +241 -0
  465. package/src/components/rating/index.ts +11 -0
  466. package/src/components/rating/rating.css +11 -0
  467. package/src/components/rating/rating.ts +245 -0
  468. package/src/components/rating/types.ts +27 -0
  469. package/src/components/repeater/__tests__/repeater.test.ts +321 -0
  470. package/src/components/repeater/index.ts +7 -0
  471. package/src/components/repeater/repeater.ts +181 -0
  472. package/src/components/repeater/types.ts +19 -0
  473. package/src/components/select/__tests__/ux-behaviors.test.ts +21 -3
  474. package/src/components/select/select.ts +4 -0
  475. package/src/components/select/utils.ts +5 -1
  476. package/src/components/sticky/__tests__/sticky.test.ts +10 -3
  477. package/src/components/sticky/sticky.ts +14 -24
  478. package/src/components/sticky/types.ts +3 -3
  479. package/src/index.ts +125 -0
  480. package/styles.css +1 -0
  481. package/lib/cjs/components/datatable/__tests__/pagination-reset.test.js +0 -596
  482. package/lib/cjs/components/datatable/__tests__/pagination-reset.test.js.map +0 -1
  483. package/lib/cjs/components/datatable/__tests__/race-conditions.test.js +0 -548
  484. package/lib/cjs/components/datatable/__tests__/race-conditions.test.js.map +0 -1
  485. package/lib/cjs/components/datatable/__tests__/setup.js +0 -63
  486. package/lib/cjs/components/datatable/__tests__/setup.js.map +0 -1
  487. package/lib/esm/components/datatable/__tests__/pagination-reset.test.js +0 -594
  488. package/lib/esm/components/datatable/__tests__/pagination-reset.test.js.map +0 -1
  489. package/lib/esm/components/datatable/__tests__/race-conditions.test.js +0 -546
  490. package/lib/esm/components/datatable/__tests__/race-conditions.test.js.map +0 -1
  491. package/lib/esm/components/datatable/__tests__/setup.js +0 -58
  492. package/lib/esm/components/datatable/__tests__/setup.js.map +0 -1
@@ -0,0 +1,416 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ */
5
+
6
+ import KTComponent from '../component';
7
+ import KTData from '../../helpers/data';
8
+ import KTDom from '../../helpers/dom';
9
+ import {
10
+ KTClipboardActionType,
11
+ KTClipboardConfigInterface,
12
+ KTClipboardInterface,
13
+ } from './types';
14
+
15
+ type KTClipboardEventPayload = {
16
+ action: KTClipboardActionType;
17
+ text: string | null;
18
+ target: string | null;
19
+ error?: string;
20
+ };
21
+
22
+ declare global {
23
+ interface Window {
24
+ KTClipboard: typeof KTClipboard;
25
+ }
26
+ }
27
+
28
+ export class KTClipboard extends KTComponent implements KTClipboardInterface {
29
+ protected override _name: string = 'clipboard';
30
+
31
+ protected override _defaultConfig: KTClipboardConfigInterface = {
32
+ target: '',
33
+ text: '',
34
+ action: 'copy',
35
+ copiedClass: '',
36
+ successEvent: 'kt.clipboard.success',
37
+ errorEvent: 'kt.clipboard.error',
38
+ };
39
+
40
+ protected override _config: KTClipboardConfigInterface = this
41
+ ._defaultConfig as KTClipboardConfigInterface;
42
+
43
+ private _activateHandler: ((event: Event) => void) | null = null;
44
+
45
+ constructor(
46
+ element: HTMLElement,
47
+ config: KTClipboardConfigInterface | null = null,
48
+ ) {
49
+ super();
50
+
51
+ // Ensure we don't double bind handlers on the same trigger.
52
+ if (this._shouldSkipInit(element)) {
53
+ return;
54
+ }
55
+
56
+ this._init(element);
57
+ this._buildConfig(config);
58
+
59
+ if (!this._element) return;
60
+
61
+ this._activateHandler = this._handleActivate.bind(this);
62
+ this._element.addEventListener('click', this._activateHandler);
63
+ }
64
+
65
+ private _getSuccessEventName(): string {
66
+ const eventName = this._getOption('successEvent');
67
+ return typeof eventName === 'string' && eventName.length > 0
68
+ ? eventName
69
+ : 'kt.clipboard.success';
70
+ }
71
+
72
+ private _getErrorEventName(): string {
73
+ const eventName = this._getOption('errorEvent');
74
+ return typeof eventName === 'string' && eventName.length > 0
75
+ ? eventName
76
+ : 'kt.clipboard.error';
77
+ }
78
+
79
+ private _getAction(): KTClipboardActionType {
80
+ const action = this._getOption('action');
81
+ return action === 'cut' ? 'cut' : 'copy';
82
+ }
83
+
84
+ private _getTrimmedString(optionValue: unknown): string {
85
+ return typeof optionValue === 'string' ? optionValue.trim() : '';
86
+ }
87
+
88
+ private _getPredefinedText(): string {
89
+ const text = this._getOption('text');
90
+ return this._getTrimmedString(text);
91
+ }
92
+
93
+ private _getTargetSelector(): string {
94
+ const target = this._getOption('target');
95
+ return this._getTrimmedString(target);
96
+ }
97
+
98
+ private _getCopiedClass(): string {
99
+ const copiedClass = this._getOption('copiedClass');
100
+ return this._getTrimmedString(copiedClass);
101
+ }
102
+
103
+ private _setCopiedClass(shouldSet: boolean): void {
104
+ const copiedClass = this._getCopiedClass();
105
+ if (!copiedClass || !this._element) return;
106
+
107
+ // Keep deterministic behavior: remove any previous state before toggling.
108
+ KTDom.removeClass(this._element, copiedClass);
109
+ if (shouldSet) {
110
+ KTDom.addClass(this._element, copiedClass);
111
+ }
112
+ }
113
+
114
+ private _isInputLike(element: HTMLElement): boolean {
115
+ return element.tagName === 'INPUT' || element.tagName === 'TEXTAREA';
116
+ }
117
+
118
+ private _readTargetValue(target: HTMLElement): string {
119
+ if (this._isInputLike(target)) {
120
+ return (target as HTMLInputElement | HTMLTextAreaElement).value ?? '';
121
+ }
122
+
123
+ return target.textContent ?? '';
124
+ }
125
+
126
+ private _execCommandCopy(text: string): boolean {
127
+ const textarea = document.createElement('textarea');
128
+ textarea.value = text;
129
+
130
+ // Avoid scrolling to bottom on iOS/Safari and keep it out of layout.
131
+ textarea.style.position = 'fixed';
132
+ textarea.style.top = '0';
133
+ textarea.style.left = '0';
134
+ textarea.style.opacity = '0';
135
+ textarea.style.pointerEvents = 'none';
136
+
137
+ document.body.appendChild(textarea);
138
+ textarea.focus();
139
+ textarea.select();
140
+ // Some browsers require explicit range selection.
141
+ textarea.setSelectionRange(0, textarea.value.length);
142
+
143
+ try {
144
+ return document.execCommand('copy');
145
+ } catch {
146
+ return false;
147
+ } finally {
148
+ textarea.remove();
149
+ }
150
+ }
151
+
152
+ private async _writeText(text: string): Promise<boolean> {
153
+ // Native Clipboard API (requires secure context).
154
+ const clipboard =
155
+ typeof navigator !== 'undefined' ? navigator.clipboard : null;
156
+ const writeText =
157
+ clipboard && typeof clipboard.writeText === 'function'
158
+ ? clipboard.writeText.bind(clipboard)
159
+ : null;
160
+
161
+ if (writeText) {
162
+ await writeText(text);
163
+ return true;
164
+ }
165
+
166
+ const ok = this._execCommandCopy(text);
167
+ if (!ok) {
168
+ throw new Error('Clipboard copy failed.');
169
+ }
170
+
171
+ return true;
172
+ }
173
+
174
+ private async _handleActivate(event: Event): Promise<void> {
175
+ event.preventDefault();
176
+
177
+ const action = this._getAction();
178
+ const successEventName = this._getSuccessEventName();
179
+ const errorEventName = this._getErrorEventName();
180
+ const textFromConfig = this._getPredefinedText();
181
+ const targetSelector = this._getTargetSelector();
182
+ const hasPredefinedText = Boolean(
183
+ this._element?.hasAttribute('data-kt-clipboard-text'),
184
+ );
185
+
186
+ // Deterministic precedence:
187
+ // - If `data-kt-clipboard-text` attribute is present, it wins over target.
188
+ if (hasPredefinedText) {
189
+ let targetElForCut: HTMLElement | null = null;
190
+
191
+ // `cut` requires an editable target (input/textarea) even when predefined text is used.
192
+ if (action === 'cut') {
193
+ if (!targetSelector) {
194
+ this._setCopiedClass(false);
195
+
196
+ const payload: KTClipboardEventPayload = {
197
+ action,
198
+ text: null,
199
+ target: null,
200
+ error:
201
+ 'Cut action requires data-kt-clipboard-target pointing to an input/textarea.',
202
+ };
203
+
204
+ this._fireEvent(errorEventName, payload);
205
+ this._dispatchEvent(errorEventName, payload);
206
+ return;
207
+ }
208
+
209
+ targetElForCut = KTDom.getElement(targetSelector) as HTMLElement | null;
210
+
211
+ if (!targetElForCut || !this._isInputLike(targetElForCut)) {
212
+ this._setCopiedClass(false);
213
+
214
+ const payload: KTClipboardEventPayload = {
215
+ action,
216
+ text: null,
217
+ target: targetSelector,
218
+ error: 'Cut action is only supported for input/textarea targets.',
219
+ };
220
+
221
+ this._fireEvent(errorEventName, payload);
222
+ this._dispatchEvent(errorEventName, payload);
223
+ return;
224
+ }
225
+ }
226
+
227
+ // Treat empty/whitespace-only predefined text as invalid.
228
+ if (!textFromConfig) {
229
+ this._setCopiedClass(false);
230
+
231
+ const payload: KTClipboardEventPayload = {
232
+ action,
233
+ text: null,
234
+ target: targetSelector || null,
235
+ error: 'Predefined clipboard text is empty.',
236
+ };
237
+
238
+ this._fireEvent(errorEventName, payload);
239
+ this._dispatchEvent(errorEventName, payload);
240
+ return;
241
+ }
242
+
243
+ try {
244
+ await this._writeText(textFromConfig);
245
+
246
+ // For `cut`, clear the editable target after successful clipboard write.
247
+ if (action === 'cut' && targetElForCut) {
248
+ (targetElForCut as HTMLInputElement | HTMLTextAreaElement).value = '';
249
+ targetElForCut.dispatchEvent(new Event('input', { bubbles: true }));
250
+ }
251
+
252
+ this._setCopiedClass(true);
253
+
254
+ const payload: KTClipboardEventPayload = {
255
+ action,
256
+ text: textFromConfig,
257
+ target: targetSelector || null,
258
+ };
259
+
260
+ this._fireEvent(successEventName, payload);
261
+ this._dispatchEvent(successEventName, payload);
262
+ } catch (error) {
263
+ this._setCopiedClass(false);
264
+
265
+ const payload: KTClipboardEventPayload = {
266
+ action,
267
+ text: textFromConfig,
268
+ target: targetSelector || null,
269
+ error:
270
+ error instanceof Error ? error.message : String(error ?? 'Unknown'),
271
+ };
272
+
273
+ this._fireEvent(errorEventName, payload);
274
+ this._dispatchEvent(errorEventName, payload);
275
+ }
276
+
277
+ return;
278
+ }
279
+
280
+ // No usable predefined text; copy from target.
281
+ if (!targetSelector) {
282
+ this._setCopiedClass(false);
283
+
284
+ const payload: KTClipboardEventPayload = {
285
+ action,
286
+ text: null,
287
+ target: null,
288
+ error:
289
+ 'Missing clipboard source (provide data-kt-clipboard-text or data-kt-clipboard-target).',
290
+ };
291
+
292
+ this._fireEvent(errorEventName, payload);
293
+ this._dispatchEvent(errorEventName, payload);
294
+ return;
295
+ }
296
+
297
+ const targetEl = KTDom.getElement(targetSelector) as HTMLElement | null;
298
+ if (!targetEl) {
299
+ this._setCopiedClass(false);
300
+
301
+ const payload: KTClipboardEventPayload = {
302
+ action,
303
+ text: null,
304
+ target: targetSelector,
305
+ error: `Clipboard target not found: ${targetSelector}`,
306
+ };
307
+
308
+ this._fireEvent(errorEventName, payload);
309
+ this._dispatchEvent(errorEventName, payload);
310
+ return;
311
+ }
312
+
313
+ const value = this._readTargetValue(targetEl).trim();
314
+ if (!value) {
315
+ this._setCopiedClass(false);
316
+
317
+ const payload: KTClipboardEventPayload = {
318
+ action,
319
+ text: null,
320
+ target: targetSelector,
321
+ error: 'Target content is empty.',
322
+ };
323
+
324
+ this._fireEvent(errorEventName, payload);
325
+ this._dispatchEvent(errorEventName, payload);
326
+ return;
327
+ }
328
+
329
+ // Cut action: only allowed for input/textarea.
330
+ if (action === 'cut' && !this._isInputLike(targetEl)) {
331
+ this._setCopiedClass(false);
332
+
333
+ const payload: KTClipboardEventPayload = {
334
+ action,
335
+ text: null,
336
+ target: targetSelector,
337
+ error: 'Cut action is only supported for input/textarea targets.',
338
+ };
339
+
340
+ this._fireEvent(errorEventName, payload);
341
+ this._dispatchEvent(errorEventName, payload);
342
+ return;
343
+ }
344
+
345
+ try {
346
+ await this._writeText(value);
347
+ this._setCopiedClass(true);
348
+
349
+ if (action === 'cut') {
350
+ (targetEl as HTMLInputElement | HTMLTextAreaElement).value = '';
351
+ targetEl.dispatchEvent(new Event('input', { bubbles: true }));
352
+ }
353
+
354
+ const payload: KTClipboardEventPayload = {
355
+ action,
356
+ text: value,
357
+ target: targetSelector,
358
+ };
359
+
360
+ this._fireEvent(successEventName, payload);
361
+ this._dispatchEvent(successEventName, payload);
362
+ } catch (error) {
363
+ this._setCopiedClass(false);
364
+
365
+ const payload: KTClipboardEventPayload = {
366
+ action,
367
+ text: null,
368
+ target: targetSelector,
369
+ error:
370
+ error instanceof Error ? error.message : String(error ?? 'Unknown'),
371
+ };
372
+
373
+ this._fireEvent(errorEventName, payload);
374
+ this._dispatchEvent(errorEventName, payload);
375
+ }
376
+ }
377
+
378
+ public override dispose(): void {
379
+ if (this._element && this._activateHandler) {
380
+ this._element.removeEventListener('click', this._activateHandler);
381
+ }
382
+ this._activateHandler = null;
383
+ super.dispose();
384
+ }
385
+
386
+ public static getInstance(element: HTMLElement): KTClipboard | null {
387
+ if (!element) return null;
388
+ if (KTData.has(element, 'clipboard')) {
389
+ return KTData.get(element, 'clipboard') as KTClipboard;
390
+ }
391
+ return null;
392
+ }
393
+
394
+ public static getOrCreateInstance(
395
+ element: HTMLElement,
396
+ config?: KTClipboardConfigInterface,
397
+ ): KTClipboard {
398
+ return (
399
+ this.getInstance(element) || new KTClipboard(element, config ?? undefined)
400
+ );
401
+ }
402
+
403
+ public static createInstances(): void {
404
+ document.querySelectorAll('[data-kt-clipboard]').forEach((el) => {
405
+ new KTClipboard(el as HTMLElement);
406
+ });
407
+ }
408
+
409
+ public static init(): void {
410
+ KTClipboard.createInstances();
411
+ }
412
+ }
413
+
414
+ if (typeof window !== 'undefined') {
415
+ window.KTClipboard = KTClipboard;
416
+ }
@@ -0,0 +1,2 @@
1
+ export { KTClipboard } from './clipboard';
2
+ export type { KTClipboardConfigInterface, KTClipboardInterface } from './types';
@@ -0,0 +1,51 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ */
5
+
6
+ export type KTClipboardActionType = 'copy' | 'cut';
7
+
8
+ export interface KTClipboardConfigInterface {
9
+ /**
10
+ * CSS selector for the element to read from when copying from target.
11
+ * For `input`/`textarea`, reads `.value`; for other elements, reads `.textContent`.
12
+ */
13
+ target?: string;
14
+
15
+ /**
16
+ * Static string to copy. Takes precedence over `target` when both are present.
17
+ */
18
+ text?: string;
19
+
20
+ /**
21
+ * Clipboard action to perform.
22
+ * - `copy` (default)
23
+ * - `cut` (only valid for `input`/`textarea` targets)
24
+ */
25
+ action?: KTClipboardActionType;
26
+
27
+ /**
28
+ * Optional class toggled on the trigger when copy/cut succeeds.
29
+ */
30
+ copiedClass?: string;
31
+
32
+ /**
33
+ * Optional DOM event name dispatched on success.
34
+ * Defaults to `kt.clipboard.success`.
35
+ */
36
+ successEvent?: string;
37
+
38
+ /**
39
+ * Optional DOM event name dispatched on failure.
40
+ * Defaults to `kt.clipboard.error`.
41
+ */
42
+ errorEvent?: string;
43
+ }
44
+
45
+ export interface KTClipboardInterface {
46
+ getOption(name: string): unknown;
47
+ getElement(): HTMLElement | null;
48
+ on(eventType: string, callback: CallableFunction): string;
49
+ off(eventType: string, eventId: string): void;
50
+ dispose(): void;
51
+ }
@@ -67,11 +67,7 @@ describe('KTDataTable - Currency/numeric sort', () => {
67
67
  noop,
68
68
  );
69
69
 
70
- const data = [
71
- { price: '£5' },
72
- { price: '£20' },
73
- { price: '£123' },
74
- ];
70
+ const data = [{ price: '£5' }, { price: '£20' }, { price: '£123' }];
75
71
  const sorted = handler.sortData(data, 'price', 'desc');
76
72
 
77
73
  const numericOrder = sorted.map((row) =>
@@ -92,11 +88,7 @@ describe('KTDataTable - Currency/numeric sort', () => {
92
88
  noop,
93
89
  );
94
90
 
95
- const data = [
96
- { price: '£123' },
97
- { price: '£20' },
98
- { price: '£5' },
99
- ];
91
+ const data = [{ price: '£123' }, { price: '£20' }, { price: '£5' }];
100
92
  const sorted = handler.sortData(data, 'price', 'asc');
101
93
 
102
94
  // String sort: "£123" < "£20" < "£5" (1 < 2 < 5)
@@ -89,7 +89,7 @@ describe('KTDataTable - Multi-row header column count', () => {
89
89
 
90
90
  it('should render exactly 17 columns when thead has multi-row headers and no data-kt-datatable-column', async () => {
91
91
  createMultiRowHeaderTable(2);
92
- const datatable = new KTDataTable(container, { stateSave: false });
92
+ new KTDataTable(container, { stateSave: false });
93
93
  await vi.runAllTimersAsync();
94
94
 
95
95
  const tbody = tableElement.tBodies[0];
@@ -107,7 +107,7 @@ describe('KTDataTable - Multi-row header column count', () => {
107
107
  createMultiRowHeaderTable(0);
108
108
  const tbody = tableElement.querySelector('tbody');
109
109
  expect(tbody).toBeDefined();
110
- const datatable = new KTDataTable(container, { stateSave: false });
110
+ new KTDataTable(container, { stateSave: false });
111
111
  await vi.runAllTimersAsync();
112
112
 
113
113
  const noticeRow = tableElement.tBodies[0].querySelector('tr');
@@ -43,7 +43,7 @@ describe('KTDataTable Race Condition Fixes', () => {
43
43
 
44
44
  // Mock fetch to track requests and signals
45
45
  abortSignals = [];
46
- mockFetch = vi.fn<typeof fetch>((url, options) => {
46
+ mockFetch = vi.fn<typeof fetch>((_url, options) => {
47
47
  // Store abort signal for verification
48
48
  if (options?.signal) {
49
49
  abortSignals.push(options.signal);
@@ -98,12 +98,9 @@ describe('KTDataTable Race Condition Fixes', () => {
98
98
 
99
99
  describe('AbortController Integration', () => {
100
100
  it('should create AbortController for remote data requests', async () => {
101
- const datatable = new KTDataTable(
102
- container.querySelector('[data-kt-datatable="true"]')!,
103
- {
104
- apiEndpoint: '/api/data',
105
- },
106
- );
101
+ new KTDataTable(container.querySelector('[data-kt-datatable="true"]')!, {
102
+ apiEndpoint: '/api/data',
103
+ });
107
104
 
108
105
  await waitFor(150);
109
106
 
@@ -186,7 +183,7 @@ describe('KTDataTable Race Condition Fixes', () => {
186
183
 
187
184
  // Mock to capture request sequence
188
185
  mockFetch.mockImplementation(
189
- (url: RequestInfo | URL, options?: RequestInit) => {
186
+ (_url: RequestInfo | URL, _options?: RequestInit) => {
190
187
  callCount++;
191
188
  const id = callCount;
192
189
  requestIds.push(id);
@@ -293,7 +290,7 @@ describe('KTDataTable Race Condition Fixes', () => {
293
290
  it('should reset _isFetching flag even after fetch error', async () => {
294
291
  let callCount = 0;
295
292
  mockFetch.mockImplementation(
296
- (url: RequestInfo | URL, options?: RequestInit) => {
293
+ (_url: RequestInfo | URL, _options?: RequestInit) => {
297
294
  callCount++;
298
295
  if (callCount === 1) {
299
296
  // Return invalid JSON to trigger parse error
@@ -333,7 +330,7 @@ describe('KTDataTable Race Condition Fixes', () => {
333
330
  const element = container.querySelector(
334
331
  '[data-kt-datatable="true"]',
335
332
  ) as HTMLElement;
336
- const datatable = new KTDataTable(element, {
333
+ new KTDataTable(element, {
337
334
  apiEndpoint: '/api/data',
338
335
  });
339
336
 
@@ -410,7 +407,7 @@ describe('KTDataTable Race Condition Fixes', () => {
410
407
 
411
408
  describe('Event Handling During Race Conditions', () => {
412
409
  it('should fire fetch event for successful requests', async () => {
413
- const fetchEvents: any[] = [];
410
+ const fetchEvents: Event[] = [];
414
411
 
415
412
  const element = container.querySelector(
416
413
  '[data-kt-datatable="true"]',
@@ -433,7 +430,7 @@ describe('KTDataTable Race Condition Fixes', () => {
433
430
  });
434
431
 
435
432
  it('should fire fetched event after successful data load', async () => {
436
- const fetchedEvents: any[] = [];
433
+ const fetchedEvents: Event[] = [];
437
434
 
438
435
  const element = container.querySelector(
439
436
  '[data-kt-datatable="true"]',
@@ -442,7 +439,7 @@ describe('KTDataTable Race Condition Fixes', () => {
442
439
  fetchedEvents.push(e);
443
440
  });
444
441
 
445
- const datatable = new KTDataTable(element, {
442
+ new KTDataTable(element, {
446
443
  apiEndpoint: '/api/data',
447
444
  });
448
445
 
@@ -453,7 +450,7 @@ describe('KTDataTable Race Condition Fixes', () => {
453
450
  });
454
451
 
455
452
  it('should not fire error events for AbortError', async () => {
456
- const errorEvents: any[] = [];
453
+ const errorEvents: Event[] = [];
457
454
 
458
455
  const element = container.querySelector(
459
456
  '[data-kt-datatable="true"]',
@@ -746,9 +746,8 @@ export class KTDataTable<T extends KTDataTableDataInterface>
746
746
  return Object.keys(originalData[0]).length;
747
747
  }
748
748
  if (this._tbodyElement) {
749
- const firstRow = this._tbodyElement.querySelector<HTMLTableRowElement>(
750
- 'tr',
751
- );
749
+ const firstRow =
750
+ this._tbodyElement.querySelector<HTMLTableRowElement>('tr');
752
751
  if (firstRow) {
753
752
  return firstRow.querySelectorAll<HTMLTableCellElement>('td').length;
754
753
  }
@@ -1052,8 +1051,7 @@ export class KTDataTable<T extends KTDataTableDataInterface>
1052
1051
  th.hasAttribute('data-kt-datatable-column'),
1053
1052
  );
1054
1053
  // When no th has data-kt-datatable-column (e.g. multi-row headers), use logical column count from tbody so we don't overcount thead cells
1055
- const columnsToRender: HTMLTableCellElement[] =
1056
- ths.length > 0 ? ths : [];
1054
+ const columnsToRender: HTMLTableCellElement[] = ths.length > 0 ? ths : [];
1057
1055
  const logicalColumnCount =
1058
1056
  ths.length > 0 ? ths.length : this._getLogicalColumnCount();
1059
1057
 
@@ -8,15 +8,21 @@
8
8
  .kt-input-group {
9
9
  @apply flex items-stretch relative;
10
10
 
11
- .kt-input {
11
+ .kt-input,
12
+ .kt-select,
13
+ [data-kt-select-wrapper] {
12
14
  @apply grow z-1;
13
15
  }
14
16
 
15
- .kt-input-addon:has(+ .kt-input) {
17
+ .kt-input-addon:has(+ .kt-input),
18
+ .kt-input-addon:has(+ .kt-select),
19
+ .kt-input-addon:has(+ select[data-kt-select]) {
16
20
  @apply rounded-e-none! border-e-0!;
17
21
  }
18
22
 
19
- .kt-input + .kt-input-addon {
23
+ .kt-input + .kt-input-addon,
24
+ .kt-select + .kt-input-addon,
25
+ [data-kt-select-wrapper] + .kt-input-addon {
20
26
  @apply rounded-s-none! border-s-0!;
21
27
  }
22
28
 
@@ -33,12 +39,16 @@
33
39
  }
34
40
 
35
41
  .kt-btn + .kt-input,
36
- .kt-input-addon + .kt-input {
42
+ .kt-input-addon + .kt-input,
43
+ .kt-input-addon + .kt-select,
44
+ select[data-kt-select] + [data-kt-select-wrapper] .kt-select {
37
45
  @apply rounded-s-none!;
38
46
  }
39
47
 
40
48
  .kt-input:has(+ .kt-btn),
41
- .kt-input:has(+ .kt-input-addon) {
49
+ .kt-input:has(+ .kt-input-addon),
50
+ .kt-select:has(+ .kt-input-addon),
51
+ [data-kt-select-wrapper]:has(+ .kt-input-addon) .kt-select {
42
52
  @apply rounded-e-none!;
43
53
  }
44
54
  }