@keenthemes/ktui 1.2.0 → 1.2.2

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 (348) hide show
  1. package/dist/ktui.js +8355 -5213
  2. package/dist/ktui.min.js +1 -1
  3. package/dist/ktui.min.js.map +1 -1
  4. package/dist/styles.css +24 -1
  5. package/lib/cjs/components/carousel/carousel.d.ts +102 -0
  6. package/lib/cjs/components/carousel/carousel.d.ts.map +1 -0
  7. package/lib/cjs/components/carousel/carousel.js +769 -0
  8. package/lib/cjs/components/carousel/carousel.js.map +1 -0
  9. package/lib/cjs/components/carousel/index.d.ts +7 -0
  10. package/lib/cjs/components/carousel/index.d.ts.map +1 -0
  11. package/lib/cjs/components/carousel/index.js +10 -0
  12. package/lib/cjs/components/carousel/index.js.map +1 -0
  13. package/lib/cjs/components/carousel/types.d.ts +36 -0
  14. package/lib/cjs/components/carousel/types.d.ts.map +1 -0
  15. package/lib/cjs/components/carousel/types.js +7 -0
  16. package/lib/cjs/components/carousel/types.js.map +1 -0
  17. package/lib/cjs/components/clipboard/clipboard.d.ts +37 -0
  18. package/lib/cjs/components/clipboard/clipboard.d.ts.map +1 -0
  19. package/lib/cjs/components/clipboard/clipboard.js +402 -0
  20. package/lib/cjs/components/clipboard/clipboard.js.map +1 -0
  21. package/lib/cjs/components/clipboard/index.d.ts +3 -0
  22. package/lib/cjs/components/clipboard/index.d.ts.map +1 -0
  23. package/lib/cjs/components/clipboard/index.js +6 -0
  24. package/lib/cjs/components/clipboard/index.js.map +1 -0
  25. package/lib/cjs/components/clipboard/types.d.ts +44 -0
  26. package/lib/cjs/components/clipboard/types.d.ts.map +1 -0
  27. package/lib/cjs/components/clipboard/types.js +7 -0
  28. package/lib/cjs/components/clipboard/types.js.map +1 -0
  29. package/lib/cjs/components/component.d.ts +3 -3
  30. package/lib/cjs/components/component.d.ts.map +1 -1
  31. package/lib/cjs/components/component.js +9 -1
  32. package/lib/cjs/components/component.js.map +1 -1
  33. package/lib/cjs/components/datatable/datatable-checkbox.d.ts +1 -1
  34. package/lib/cjs/components/datatable/datatable-checkbox.d.ts.map +1 -1
  35. package/lib/cjs/components/datatable/datatable-checkbox.js +1 -1
  36. package/lib/cjs/components/datatable/datatable-checkbox.js.map +1 -1
  37. package/lib/cjs/components/datatable/datatable-sort.d.ts +1 -1
  38. package/lib/cjs/components/datatable/datatable-sort.d.ts.map +1 -1
  39. package/lib/cjs/components/datatable/datatable-sort.js.map +1 -1
  40. package/lib/cjs/components/datatable/datatable.d.ts +2 -0
  41. package/lib/cjs/components/datatable/datatable.d.ts.map +1 -1
  42. package/lib/cjs/components/datatable/datatable.js +29 -16
  43. package/lib/cjs/components/datatable/datatable.js.map +1 -1
  44. package/lib/cjs/components/datatable/types.d.ts +2 -1
  45. package/lib/cjs/components/datatable/types.d.ts.map +1 -1
  46. package/lib/cjs/components/drawer/drawer.d.ts.map +1 -1
  47. package/lib/cjs/components/drawer/drawer.js +3 -16
  48. package/lib/cjs/components/drawer/drawer.js.map +1 -1
  49. package/lib/cjs/components/dropdown/dropdown.d.ts +1 -1
  50. package/lib/cjs/components/dropdown/dropdown.d.ts.map +1 -1
  51. package/lib/cjs/components/dropdown/dropdown.js +2 -3
  52. package/lib/cjs/components/dropdown/dropdown.js.map +1 -1
  53. package/lib/cjs/components/pin-input/index.d.ts +3 -0
  54. package/lib/cjs/components/pin-input/index.d.ts.map +1 -0
  55. package/lib/cjs/components/pin-input/index.js +6 -0
  56. package/lib/cjs/components/pin-input/index.js.map +1 -0
  57. package/lib/cjs/components/pin-input/pin-input.d.ts +56 -0
  58. package/lib/cjs/components/pin-input/pin-input.d.ts.map +1 -0
  59. package/lib/cjs/components/pin-input/pin-input.js +455 -0
  60. package/lib/cjs/components/pin-input/pin-input.js.map +1 -0
  61. package/lib/cjs/components/pin-input/types.d.ts +41 -0
  62. package/lib/cjs/components/pin-input/types.d.ts.map +1 -0
  63. package/lib/cjs/components/pin-input/types.js +6 -0
  64. package/lib/cjs/components/pin-input/types.js.map +1 -0
  65. package/lib/cjs/components/range-slider/index.d.ts +7 -0
  66. package/lib/cjs/components/range-slider/index.d.ts.map +1 -0
  67. package/lib/cjs/components/range-slider/index.js +10 -0
  68. package/lib/cjs/components/range-slider/index.js.map +1 -0
  69. package/lib/cjs/components/range-slider/range-slider.d.ts +42 -0
  70. package/lib/cjs/components/range-slider/range-slider.d.ts.map +1 -0
  71. package/lib/cjs/components/range-slider/range-slider.js +254 -0
  72. package/lib/cjs/components/range-slider/range-slider.js.map +1 -0
  73. package/lib/cjs/components/range-slider/types.d.ts +33 -0
  74. package/lib/cjs/components/range-slider/types.d.ts.map +1 -0
  75. package/lib/cjs/components/range-slider/types.js +7 -0
  76. package/lib/cjs/components/range-slider/types.js.map +1 -0
  77. package/lib/cjs/components/rating/rating.d.ts.map +1 -1
  78. package/lib/cjs/components/rating/rating.js +8 -3
  79. package/lib/cjs/components/rating/rating.js.map +1 -1
  80. package/lib/cjs/components/repeater/repeater.d.ts.map +1 -1
  81. package/lib/cjs/components/repeater/repeater.js +3 -2
  82. package/lib/cjs/components/repeater/repeater.js.map +1 -1
  83. package/lib/cjs/components/select/combobox.d.ts.map +1 -1
  84. package/lib/cjs/components/select/combobox.js +25 -15
  85. package/lib/cjs/components/select/combobox.js.map +1 -1
  86. package/lib/cjs/components/select/config.d.ts +2 -2
  87. package/lib/cjs/components/select/config.d.ts.map +1 -1
  88. package/lib/cjs/components/select/config.js +10 -9
  89. package/lib/cjs/components/select/config.js.map +1 -1
  90. package/lib/cjs/components/select/dropdown.js.map +1 -1
  91. package/lib/cjs/components/select/option.d.ts +2 -1
  92. package/lib/cjs/components/select/option.d.ts.map +1 -1
  93. package/lib/cjs/components/select/option.js +9 -3
  94. package/lib/cjs/components/select/option.js.map +1 -1
  95. package/lib/cjs/components/select/remote.d.ts +1 -0
  96. package/lib/cjs/components/select/remote.d.ts.map +1 -1
  97. package/lib/cjs/components/select/remote.js +21 -14
  98. package/lib/cjs/components/select/remote.js.map +1 -1
  99. package/lib/cjs/components/select/search.d.ts +1 -1
  100. package/lib/cjs/components/select/search.d.ts.map +1 -1
  101. package/lib/cjs/components/select/search.js +34 -25
  102. package/lib/cjs/components/select/search.js.map +1 -1
  103. package/lib/cjs/components/select/select.d.ts +5 -3
  104. package/lib/cjs/components/select/select.d.ts.map +1 -1
  105. package/lib/cjs/components/select/select.js +31 -31
  106. package/lib/cjs/components/select/select.js.map +1 -1
  107. package/lib/cjs/components/select/tags.d.ts.map +1 -1
  108. package/lib/cjs/components/select/tags.js +22 -13
  109. package/lib/cjs/components/select/tags.js.map +1 -1
  110. package/lib/cjs/components/select/templates.d.ts.map +1 -1
  111. package/lib/cjs/components/select/templates.js +4 -4
  112. package/lib/cjs/components/select/templates.js.map +1 -1
  113. package/lib/cjs/components/select/types.d.ts +1 -1
  114. package/lib/cjs/components/select/types.d.ts.map +1 -1
  115. package/lib/cjs/components/select/utils.d.ts +4 -4
  116. package/lib/cjs/components/select/utils.d.ts.map +1 -1
  117. package/lib/cjs/components/select/utils.js +5 -4
  118. package/lib/cjs/components/select/utils.js.map +1 -1
  119. package/lib/cjs/components/sticky/sticky.d.ts +1 -1
  120. package/lib/cjs/components/sticky/sticky.d.ts.map +1 -1
  121. package/lib/cjs/components/sticky/sticky.js +16 -14
  122. package/lib/cjs/components/sticky/sticky.js.map +1 -1
  123. package/lib/cjs/components/toast/toast.d.ts.map +1 -1
  124. package/lib/cjs/components/toast/toast.js +17 -9
  125. package/lib/cjs/components/toast/toast.js.map +1 -1
  126. package/lib/cjs/components/toast/types.d.ts +3 -0
  127. package/lib/cjs/components/toast/types.d.ts.map +1 -1
  128. package/lib/cjs/components/toggle-password/toggle-password.d.ts.map +1 -1
  129. package/lib/cjs/components/toggle-password/toggle-password.js.map +1 -1
  130. package/lib/cjs/helpers/dom.d.ts +4 -4
  131. package/lib/cjs/helpers/dom.d.ts.map +1 -1
  132. package/lib/cjs/helpers/dom.js +8 -10
  133. package/lib/cjs/helpers/dom.js.map +1 -1
  134. package/lib/cjs/helpers/event-handler.d.ts +1 -1
  135. package/lib/cjs/helpers/event-handler.d.ts.map +1 -1
  136. package/lib/cjs/helpers/event-handler.js +3 -1
  137. package/lib/cjs/helpers/event-handler.js.map +1 -1
  138. package/lib/cjs/helpers/utils.d.ts +1 -1
  139. package/lib/cjs/helpers/utils.d.ts.map +1 -1
  140. package/lib/cjs/helpers/utils.js +4 -1
  141. package/lib/cjs/helpers/utils.js.map +1 -1
  142. package/lib/cjs/index.d.ts +16 -0
  143. package/lib/cjs/index.d.ts.map +1 -1
  144. package/lib/cjs/index.js +17 -1
  145. package/lib/cjs/index.js.map +1 -1
  146. package/lib/cjs/types.d.ts +1 -1
  147. package/lib/cjs/types.d.ts.map +1 -1
  148. package/lib/esm/components/carousel/carousel.d.ts +102 -0
  149. package/lib/esm/components/carousel/carousel.d.ts.map +1 -0
  150. package/lib/esm/components/carousel/carousel.js +766 -0
  151. package/lib/esm/components/carousel/carousel.js.map +1 -0
  152. package/lib/esm/components/carousel/index.d.ts +7 -0
  153. package/lib/esm/components/carousel/index.d.ts.map +1 -0
  154. package/lib/esm/components/carousel/index.js +6 -0
  155. package/lib/esm/components/carousel/index.js.map +1 -0
  156. package/lib/esm/components/carousel/types.d.ts +36 -0
  157. package/lib/esm/components/carousel/types.d.ts.map +1 -0
  158. package/lib/esm/components/carousel/types.js +6 -0
  159. package/lib/esm/components/carousel/types.js.map +1 -0
  160. package/lib/esm/components/clipboard/clipboard.d.ts +37 -0
  161. package/lib/esm/components/clipboard/clipboard.d.ts.map +1 -0
  162. package/lib/esm/components/clipboard/clipboard.js +399 -0
  163. package/lib/esm/components/clipboard/clipboard.js.map +1 -0
  164. package/lib/esm/components/clipboard/index.d.ts +3 -0
  165. package/lib/esm/components/clipboard/index.d.ts.map +1 -0
  166. package/lib/esm/components/clipboard/index.js +2 -0
  167. package/lib/esm/components/clipboard/index.js.map +1 -0
  168. package/lib/esm/components/clipboard/types.d.ts +44 -0
  169. package/lib/esm/components/clipboard/types.d.ts.map +1 -0
  170. package/lib/esm/components/clipboard/types.js +6 -0
  171. package/lib/esm/components/clipboard/types.js.map +1 -0
  172. package/lib/esm/components/component.d.ts +3 -3
  173. package/lib/esm/components/component.d.ts.map +1 -1
  174. package/lib/esm/components/component.js +9 -1
  175. package/lib/esm/components/component.js.map +1 -1
  176. package/lib/esm/components/datatable/datatable-checkbox.d.ts +1 -1
  177. package/lib/esm/components/datatable/datatable-checkbox.d.ts.map +1 -1
  178. package/lib/esm/components/datatable/datatable-checkbox.js +1 -1
  179. package/lib/esm/components/datatable/datatable-checkbox.js.map +1 -1
  180. package/lib/esm/components/datatable/datatable-sort.d.ts +1 -1
  181. package/lib/esm/components/datatable/datatable-sort.d.ts.map +1 -1
  182. package/lib/esm/components/datatable/datatable-sort.js.map +1 -1
  183. package/lib/esm/components/datatable/datatable.d.ts +2 -0
  184. package/lib/esm/components/datatable/datatable.d.ts.map +1 -1
  185. package/lib/esm/components/datatable/datatable.js +29 -16
  186. package/lib/esm/components/datatable/datatable.js.map +1 -1
  187. package/lib/esm/components/datatable/types.d.ts +2 -1
  188. package/lib/esm/components/datatable/types.d.ts.map +1 -1
  189. package/lib/esm/components/drawer/drawer.d.ts.map +1 -1
  190. package/lib/esm/components/drawer/drawer.js +3 -16
  191. package/lib/esm/components/drawer/drawer.js.map +1 -1
  192. package/lib/esm/components/dropdown/dropdown.d.ts +1 -1
  193. package/lib/esm/components/dropdown/dropdown.d.ts.map +1 -1
  194. package/lib/esm/components/dropdown/dropdown.js +2 -3
  195. package/lib/esm/components/dropdown/dropdown.js.map +1 -1
  196. package/lib/esm/components/pin-input/index.d.ts +3 -0
  197. package/lib/esm/components/pin-input/index.d.ts.map +1 -0
  198. package/lib/esm/components/pin-input/index.js +2 -0
  199. package/lib/esm/components/pin-input/index.js.map +1 -0
  200. package/lib/esm/components/pin-input/pin-input.d.ts +56 -0
  201. package/lib/esm/components/pin-input/pin-input.d.ts.map +1 -0
  202. package/lib/esm/components/pin-input/pin-input.js +452 -0
  203. package/lib/esm/components/pin-input/pin-input.js.map +1 -0
  204. package/lib/esm/components/pin-input/types.d.ts +41 -0
  205. package/lib/esm/components/pin-input/types.d.ts.map +1 -0
  206. package/lib/esm/components/pin-input/types.js +5 -0
  207. package/lib/esm/components/pin-input/types.js.map +1 -0
  208. package/lib/esm/components/range-slider/index.d.ts +7 -0
  209. package/lib/esm/components/range-slider/index.d.ts.map +1 -0
  210. package/lib/esm/components/range-slider/index.js +6 -0
  211. package/lib/esm/components/range-slider/index.js.map +1 -0
  212. package/lib/esm/components/range-slider/range-slider.d.ts +42 -0
  213. package/lib/esm/components/range-slider/range-slider.d.ts.map +1 -0
  214. package/lib/esm/components/range-slider/range-slider.js +251 -0
  215. package/lib/esm/components/range-slider/range-slider.js.map +1 -0
  216. package/lib/esm/components/range-slider/types.d.ts +33 -0
  217. package/lib/esm/components/range-slider/types.d.ts.map +1 -0
  218. package/lib/esm/components/range-slider/types.js +6 -0
  219. package/lib/esm/components/range-slider/types.js.map +1 -0
  220. package/lib/esm/components/rating/rating.d.ts.map +1 -1
  221. package/lib/esm/components/rating/rating.js +8 -3
  222. package/lib/esm/components/rating/rating.js.map +1 -1
  223. package/lib/esm/components/repeater/repeater.d.ts.map +1 -1
  224. package/lib/esm/components/repeater/repeater.js +3 -2
  225. package/lib/esm/components/repeater/repeater.js.map +1 -1
  226. package/lib/esm/components/select/combobox.d.ts.map +1 -1
  227. package/lib/esm/components/select/combobox.js +25 -15
  228. package/lib/esm/components/select/combobox.js.map +1 -1
  229. package/lib/esm/components/select/config.d.ts +2 -2
  230. package/lib/esm/components/select/config.d.ts.map +1 -1
  231. package/lib/esm/components/select/config.js +10 -9
  232. package/lib/esm/components/select/config.js.map +1 -1
  233. package/lib/esm/components/select/dropdown.js.map +1 -1
  234. package/lib/esm/components/select/option.d.ts +2 -1
  235. package/lib/esm/components/select/option.d.ts.map +1 -1
  236. package/lib/esm/components/select/option.js +9 -3
  237. package/lib/esm/components/select/option.js.map +1 -1
  238. package/lib/esm/components/select/remote.d.ts +1 -0
  239. package/lib/esm/components/select/remote.d.ts.map +1 -1
  240. package/lib/esm/components/select/remote.js +21 -14
  241. package/lib/esm/components/select/remote.js.map +1 -1
  242. package/lib/esm/components/select/search.d.ts +1 -1
  243. package/lib/esm/components/select/search.d.ts.map +1 -1
  244. package/lib/esm/components/select/search.js +34 -25
  245. package/lib/esm/components/select/search.js.map +1 -1
  246. package/lib/esm/components/select/select.d.ts +5 -3
  247. package/lib/esm/components/select/select.d.ts.map +1 -1
  248. package/lib/esm/components/select/select.js +31 -31
  249. package/lib/esm/components/select/select.js.map +1 -1
  250. package/lib/esm/components/select/tags.d.ts.map +1 -1
  251. package/lib/esm/components/select/tags.js +22 -13
  252. package/lib/esm/components/select/tags.js.map +1 -1
  253. package/lib/esm/components/select/templates.d.ts.map +1 -1
  254. package/lib/esm/components/select/templates.js +4 -4
  255. package/lib/esm/components/select/templates.js.map +1 -1
  256. package/lib/esm/components/select/types.d.ts +1 -1
  257. package/lib/esm/components/select/types.d.ts.map +1 -1
  258. package/lib/esm/components/select/utils.d.ts +4 -4
  259. package/lib/esm/components/select/utils.d.ts.map +1 -1
  260. package/lib/esm/components/select/utils.js +5 -4
  261. package/lib/esm/components/select/utils.js.map +1 -1
  262. package/lib/esm/components/sticky/sticky.d.ts +1 -1
  263. package/lib/esm/components/sticky/sticky.d.ts.map +1 -1
  264. package/lib/esm/components/sticky/sticky.js +16 -14
  265. package/lib/esm/components/sticky/sticky.js.map +1 -1
  266. package/lib/esm/components/toast/toast.d.ts.map +1 -1
  267. package/lib/esm/components/toast/toast.js +17 -9
  268. package/lib/esm/components/toast/toast.js.map +1 -1
  269. package/lib/esm/components/toast/types.d.ts +3 -0
  270. package/lib/esm/components/toast/types.d.ts.map +1 -1
  271. package/lib/esm/components/toggle-password/toggle-password.d.ts.map +1 -1
  272. package/lib/esm/components/toggle-password/toggle-password.js.map +1 -1
  273. package/lib/esm/helpers/dom.d.ts +4 -4
  274. package/lib/esm/helpers/dom.d.ts.map +1 -1
  275. package/lib/esm/helpers/dom.js +8 -10
  276. package/lib/esm/helpers/dom.js.map +1 -1
  277. package/lib/esm/helpers/event-handler.d.ts +1 -1
  278. package/lib/esm/helpers/event-handler.d.ts.map +1 -1
  279. package/lib/esm/helpers/event-handler.js +3 -1
  280. package/lib/esm/helpers/event-handler.js.map +1 -1
  281. package/lib/esm/helpers/utils.d.ts +1 -1
  282. package/lib/esm/helpers/utils.d.ts.map +1 -1
  283. package/lib/esm/helpers/utils.js +4 -1
  284. package/lib/esm/helpers/utils.js.map +1 -1
  285. package/lib/esm/index.d.ts +16 -0
  286. package/lib/esm/index.d.ts.map +1 -1
  287. package/lib/esm/index.js +12 -0
  288. package/lib/esm/index.js.map +1 -1
  289. package/lib/esm/types.d.ts +1 -1
  290. package/lib/esm/types.d.ts.map +1 -1
  291. package/package.json +5 -3
  292. package/src/components/carousel/__tests__/carousel.test.ts +326 -0
  293. package/src/components/carousel/carousel.css +42 -0
  294. package/src/components/carousel/carousel.ts +847 -0
  295. package/src/components/carousel/index.ts +11 -0
  296. package/src/components/carousel/types.ts +38 -0
  297. package/src/components/clipboard/__tests__/clipboard.test.ts +438 -0
  298. package/src/components/clipboard/clipboard.ts +416 -0
  299. package/src/components/clipboard/index.ts +2 -0
  300. package/src/components/clipboard/types.ts +51 -0
  301. package/src/components/component.ts +15 -5
  302. package/src/components/datatable/__tests__/currency-sort.test.ts +6 -13
  303. package/src/components/datatable/__tests__/multi-row-headers.test.ts +2 -2
  304. package/src/components/datatable/__tests__/pagination-reset.test.ts +7 -4
  305. package/src/components/datatable/__tests__/race-conditions.test.ts +11 -14
  306. package/src/components/datatable/__tests__/setup.ts +1 -1
  307. package/src/components/datatable/datatable-checkbox.ts +6 -4
  308. package/src/components/datatable/datatable-sort.ts +27 -7
  309. package/src/components/datatable/datatable.ts +67 -42
  310. package/src/components/datatable/types.ts +3 -1
  311. package/src/components/drawer/drawer.ts +3 -18
  312. package/src/components/dropdown/dropdown.ts +2 -3
  313. package/src/components/pin-input/__tests__/pin-input.test.ts +928 -0
  314. package/src/components/pin-input/index.ts +6 -0
  315. package/src/components/pin-input/pin-input.ts +499 -0
  316. package/src/components/pin-input/types.ts +45 -0
  317. package/src/components/range-slider/__tests__/range-slider.test.ts +659 -0
  318. package/src/components/range-slider/index.ts +11 -0
  319. package/src/components/range-slider/range-slider.ts +276 -0
  320. package/src/components/range-slider/types.ts +36 -0
  321. package/src/components/rating/__tests__/rating.test.ts +11 -4
  322. package/src/components/rating/rating.ts +22 -12
  323. package/src/components/repeater/__tests__/repeater.test.ts +24 -11
  324. package/src/components/repeater/repeater.ts +5 -3
  325. package/src/components/select/__tests__/ux-behaviors.test.ts +25 -6
  326. package/src/components/select/combobox.ts +23 -16
  327. package/src/components/select/config.ts +15 -14
  328. package/src/components/select/dropdown.ts +1 -1
  329. package/src/components/select/option.ts +14 -4
  330. package/src/components/select/remote.ts +68 -56
  331. package/src/components/select/search.ts +30 -27
  332. package/src/components/select/select.ts +41 -37
  333. package/src/components/select/tags.ts +14 -8
  334. package/src/components/select/templates.ts +11 -6
  335. package/src/components/select/types.ts +1 -1
  336. package/src/components/select/utils.ts +12 -10
  337. package/src/components/sticky/__tests__/sticky.test.ts +10 -3
  338. package/src/components/sticky/sticky.ts +16 -26
  339. package/src/components/sticky/types.ts +3 -3
  340. package/src/components/toast/toast.ts +34 -21
  341. package/src/components/toast/types.ts +5 -1
  342. package/src/components/toggle-password/toggle-password.ts +0 -1
  343. package/src/helpers/dom.ts +14 -17
  344. package/src/helpers/event-handler.ts +5 -6
  345. package/src/helpers/utils.ts +5 -2
  346. package/src/index.ts +35 -0
  347. package/src/types.ts +1 -1
  348. package/styles.css +1 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ */
5
+
6
+ export { KTCarousel } from './carousel';
7
+ export type {
8
+ KTCarouselChangePayloadInterface,
9
+ KTCarouselConfigInterface,
10
+ KTCarouselInterface,
11
+ } from './types';
@@ -0,0 +1,38 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ */
5
+
6
+ export interface KTCarouselConfigInterface {
7
+ autoplay: boolean;
8
+ autoplayInterval: number;
9
+ infiniteLoop: boolean;
10
+ rtl: boolean;
11
+ perView: number;
12
+ centered: boolean;
13
+ draggable: boolean;
14
+ snap: boolean;
15
+ autoHeight: boolean;
16
+ /** When true, native scrollbars stay visible on the viewport and thumbnail strip. */
17
+ showScrollbar: boolean;
18
+ lazy: boolean;
19
+ pauseOnHover: boolean;
20
+ changeEvent: string;
21
+ }
22
+
23
+ export interface KTCarouselChangePayloadInterface {
24
+ index: number;
25
+ prevIndex: number;
26
+ userInitiated: boolean;
27
+ }
28
+
29
+ export interface KTCarouselInterface {
30
+ goTo(index: number, userInitiated?: boolean): void;
31
+ next(userInitiated?: boolean): void;
32
+ prev(userInitiated?: boolean): void;
33
+ getIndex(): number;
34
+ getSlideCount(): number;
35
+ dispose(): void;
36
+ getElement(): HTMLElement;
37
+ getOption(name: string): unknown;
38
+ }
@@ -0,0 +1,438 @@
1
+ /**
2
+ * Tests for KTClipboard component
3
+ */
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
+ import { KTClipboard } from '../clipboard';
6
+
7
+ function flushPromises() {
8
+ return new Promise<void>((resolve) => {
9
+ setTimeout(() => resolve(), 0);
10
+ });
11
+ }
12
+
13
+ function createFixture(options?: {
14
+ withPredefinedText?: boolean;
15
+ predefinedTextValue?: string;
16
+ predefinedTextAttributeEmpty?: boolean;
17
+ action?: 'copy' | 'cut';
18
+ withTarget?: boolean;
19
+ targetExists?: boolean;
20
+ targetType?: 'input' | 'textarea' | 'div';
21
+ targetValue?: string;
22
+ targetTextContent?: string;
23
+ }) {
24
+ document.body.innerHTML = '';
25
+
26
+ const targetType = options?.targetType ?? 'input';
27
+ const targetId = 'kt-clipboard-target';
28
+ const targetExists = options?.targetExists ?? true;
29
+
30
+ const container = document.createElement('div');
31
+
32
+ const trigger = document.createElement('button');
33
+ trigger.type = 'button';
34
+ trigger.setAttribute('data-kt-clipboard', 'true');
35
+
36
+ if (options?.action) {
37
+ trigger.setAttribute('data-kt-clipboard-action', options.action);
38
+ }
39
+
40
+ if (options?.withTarget) {
41
+ trigger.setAttribute('data-kt-clipboard-target', `#${targetId}`);
42
+ }
43
+
44
+ if (options?.withPredefinedText) {
45
+ if (options.predefinedTextAttributeEmpty) {
46
+ trigger.setAttribute('data-kt-clipboard-text', '');
47
+ } else {
48
+ trigger.setAttribute(
49
+ 'data-kt-clipboard-text',
50
+ options.predefinedTextValue ?? '',
51
+ );
52
+ }
53
+ }
54
+
55
+ trigger.textContent = 'Copy';
56
+ container.appendChild(trigger);
57
+
58
+ if (targetExists && options?.withTarget) {
59
+ if (targetType === 'input') {
60
+ const input = document.createElement('input');
61
+ input.id = targetId;
62
+ input.value = options?.targetValue ?? 'input value';
63
+ container.appendChild(input);
64
+ } else if (targetType === 'textarea') {
65
+ const textarea = document.createElement('textarea');
66
+ textarea.id = targetId;
67
+ textarea.value = options?.targetValue ?? 'textarea value';
68
+ container.appendChild(textarea);
69
+ } else {
70
+ const div = document.createElement('div');
71
+ div.id = targetId;
72
+ div.textContent = options?.targetTextContent ?? 'div text';
73
+ container.appendChild(div);
74
+ }
75
+ }
76
+
77
+ document.body.appendChild(container);
78
+
79
+ return { container, trigger };
80
+ }
81
+
82
+ describe('KTClipboard', () => {
83
+ let originalExecCommand: Document['execCommand'];
84
+
85
+ beforeEach(() => {
86
+ // Ensure a clean clipboard state between tests.
87
+ originalExecCommand = document.execCommand;
88
+ });
89
+
90
+ afterEach(() => {
91
+ document.body.innerHTML = '';
92
+ // Restore execCommand (if it was replaced).
93
+ document.execCommand = originalExecCommand;
94
+ });
95
+
96
+ it('copies predefined text (text wins over target)', async () => {
97
+ const writeTextMock = vi.fn().mockResolvedValue(undefined);
98
+ Object.defineProperty(navigator, 'clipboard', {
99
+ value: { writeText: writeTextMock },
100
+ configurable: true,
101
+ });
102
+
103
+ const { trigger } = createFixture({
104
+ withPredefinedText: true,
105
+ predefinedTextValue: 'hello',
106
+ withTarget: true,
107
+ targetExists: false, // target selector is missing; text must still win
108
+ action: 'copy',
109
+ });
110
+
111
+ const successEvents: CustomEvent[] = [];
112
+ trigger.addEventListener('kt.clipboard.success', (e) =>
113
+ successEvents.push(e as CustomEvent),
114
+ );
115
+ const errorEvents: CustomEvent[] = [];
116
+ trigger.addEventListener('kt.clipboard.error', (e) =>
117
+ errorEvents.push(e as CustomEvent),
118
+ );
119
+
120
+ new KTClipboard(trigger);
121
+ trigger.click();
122
+
123
+ await flushPromises();
124
+
125
+ expect(writeTextMock).toHaveBeenCalledTimes(1);
126
+ expect(writeTextMock).toHaveBeenCalledWith('hello');
127
+ expect(successEvents.length).toBe(1);
128
+ expect(errorEvents.length).toBe(0);
129
+ });
130
+
131
+ it('falls back to execCommand when Clipboard API is unavailable', async () => {
132
+ Object.defineProperty(navigator, 'clipboard', {
133
+ value: undefined,
134
+ configurable: true,
135
+ });
136
+
137
+ const execCommandMock = vi.fn().mockReturnValue(true);
138
+ document.execCommand = execCommandMock as Document['execCommand'];
139
+
140
+ const { trigger } = createFixture({
141
+ withPredefinedText: true,
142
+ predefinedTextValue: 'fallback text',
143
+ action: 'copy',
144
+ });
145
+
146
+ const successEvents: CustomEvent[] = [];
147
+ trigger.addEventListener('kt.clipboard.success', (e) =>
148
+ successEvents.push(e as CustomEvent),
149
+ );
150
+
151
+ new KTClipboard(trigger);
152
+ trigger.click();
153
+ await flushPromises();
154
+
155
+ expect(execCommandMock).toHaveBeenCalledWith('copy');
156
+ expect(successEvents.length).toBe(1);
157
+ });
158
+
159
+ it('dispatches error if fallback execCommand fails', async () => {
160
+ Object.defineProperty(navigator, 'clipboard', {
161
+ value: undefined,
162
+ configurable: true,
163
+ });
164
+
165
+ const execCommandMock = vi.fn().mockReturnValue(false);
166
+ document.execCommand = execCommandMock as Document['execCommand'];
167
+
168
+ const { trigger } = createFixture({
169
+ withPredefinedText: true,
170
+ predefinedTextValue: 'will fail',
171
+ action: 'copy',
172
+ });
173
+
174
+ const errorEvents: CustomEvent[] = [];
175
+ trigger.addEventListener('kt.clipboard.error', (e) =>
176
+ errorEvents.push(e as CustomEvent),
177
+ );
178
+
179
+ new KTClipboard(trigger);
180
+ trigger.click();
181
+ await flushPromises();
182
+
183
+ expect(execCommandMock).toHaveBeenCalledWith('copy');
184
+ expect(errorEvents.length).toBe(1);
185
+ });
186
+
187
+ it('dispatches error when data-kt-clipboard-text attribute is present but empty (and ignores target)', async () => {
188
+ const writeTextMock = vi.fn().mockResolvedValue(undefined);
189
+ Object.defineProperty(navigator, 'clipboard', {
190
+ value: { writeText: writeTextMock },
191
+ configurable: true,
192
+ });
193
+
194
+ const { trigger } = createFixture({
195
+ withPredefinedText: true,
196
+ predefinedTextAttributeEmpty: true,
197
+ withTarget: true,
198
+ targetType: 'input',
199
+ targetValue: 'should not be used',
200
+ action: 'copy',
201
+ });
202
+
203
+ const successEvents: CustomEvent[] = [];
204
+ trigger.addEventListener('kt.clipboard.success', (e) =>
205
+ successEvents.push(e as CustomEvent),
206
+ );
207
+ const errorEvents: CustomEvent[] = [];
208
+ trigger.addEventListener('kt.clipboard.error', (e) =>
209
+ errorEvents.push(e as CustomEvent),
210
+ );
211
+
212
+ new KTClipboard(trigger);
213
+ trigger.click();
214
+ await flushPromises();
215
+
216
+ expect(writeTextMock).not.toHaveBeenCalled();
217
+ expect(successEvents.length).toBe(0);
218
+ expect(errorEvents.length).toBe(1);
219
+ });
220
+
221
+ it('dispatches error when Clipboard API writeText rejects', async () => {
222
+ const writeTextMock = vi
223
+ .fn()
224
+ .mockRejectedValue(new Error('NotAllowedError: permission denied'));
225
+ Object.defineProperty(navigator, 'clipboard', {
226
+ value: { writeText: writeTextMock },
227
+ configurable: true,
228
+ });
229
+
230
+ const { trigger } = createFixture({
231
+ withPredefinedText: true,
232
+ predefinedTextValue: 'hello',
233
+ action: 'copy',
234
+ });
235
+
236
+ const errorEvents: CustomEvent[] = [];
237
+ trigger.addEventListener('kt.clipboard.error', (e) =>
238
+ errorEvents.push(e as CustomEvent),
239
+ );
240
+
241
+ new KTClipboard(trigger);
242
+ trigger.click();
243
+ await flushPromises();
244
+
245
+ expect(writeTextMock).toHaveBeenCalledTimes(1);
246
+ expect(errorEvents.length).toBe(1);
247
+ });
248
+
249
+ it('dispatches error for cut with predefined text when target is missing', async () => {
250
+ const writeTextMock = vi.fn().mockResolvedValue(undefined);
251
+ Object.defineProperty(navigator, 'clipboard', {
252
+ value: { writeText: writeTextMock },
253
+ configurable: true,
254
+ });
255
+
256
+ const { trigger } = createFixture({
257
+ withPredefinedText: true,
258
+ predefinedTextValue: 'hello',
259
+ withTarget: false,
260
+ action: 'cut',
261
+ });
262
+
263
+ const errorEvents: CustomEvent[] = [];
264
+ trigger.addEventListener('kt.clipboard.error', (e) =>
265
+ errorEvents.push(e as CustomEvent),
266
+ );
267
+
268
+ new KTClipboard(trigger);
269
+ trigger.click();
270
+ await flushPromises();
271
+
272
+ expect(writeTextMock).not.toHaveBeenCalled();
273
+ expect(errorEvents.length).toBe(1);
274
+ });
275
+
276
+ it('copies from input target value', async () => {
277
+ const writeTextMock = vi.fn().mockResolvedValue(undefined);
278
+ Object.defineProperty(navigator, 'clipboard', {
279
+ value: { writeText: writeTextMock },
280
+ configurable: true,
281
+ });
282
+
283
+ const { trigger } = createFixture({
284
+ withPredefinedText: false,
285
+ withTarget: true,
286
+ targetType: 'input',
287
+ targetValue: 'input value',
288
+ action: 'copy',
289
+ });
290
+
291
+ new KTClipboard(trigger);
292
+ trigger.click();
293
+ await flushPromises();
294
+
295
+ expect(writeTextMock).toHaveBeenCalledTimes(1);
296
+ expect(writeTextMock).toHaveBeenCalledWith('input value');
297
+ });
298
+
299
+ it('copies from non-input target textContent', async () => {
300
+ const writeTextMock = vi.fn().mockResolvedValue(undefined);
301
+ Object.defineProperty(navigator, 'clipboard', {
302
+ value: { writeText: writeTextMock },
303
+ configurable: true,
304
+ });
305
+
306
+ const { trigger } = createFixture({
307
+ withPredefinedText: false,
308
+ withTarget: true,
309
+ targetType: 'div',
310
+ targetTextContent: 'div text content',
311
+ action: 'copy',
312
+ });
313
+
314
+ new KTClipboard(trigger);
315
+ trigger.click();
316
+ await flushPromises();
317
+
318
+ expect(writeTextMock).toHaveBeenCalledTimes(1);
319
+ expect(writeTextMock).toHaveBeenCalledWith('div text content');
320
+ });
321
+
322
+ it('dispatches error when selector misses and no predefined text exists', async () => {
323
+ const writeTextMock = vi.fn().mockResolvedValue(undefined);
324
+ Object.defineProperty(navigator, 'clipboard', {
325
+ value: { writeText: writeTextMock },
326
+ configurable: true,
327
+ });
328
+
329
+ const { trigger } = createFixture({
330
+ withPredefinedText: false,
331
+ withTarget: true,
332
+ targetExists: false,
333
+ action: 'copy',
334
+ });
335
+
336
+ const errorEvents: CustomEvent[] = [];
337
+ trigger.addEventListener('kt.clipboard.error', (e) =>
338
+ errorEvents.push(e as CustomEvent),
339
+ );
340
+
341
+ new KTClipboard(trigger);
342
+ trigger.click();
343
+ await flushPromises();
344
+
345
+ expect(writeTextMock).not.toHaveBeenCalled();
346
+ expect(errorEvents.length).toBe(1);
347
+ });
348
+
349
+ it('dispatches error for cut when target is not input/textarea', async () => {
350
+ const writeTextMock = vi.fn().mockResolvedValue(undefined);
351
+ Object.defineProperty(navigator, 'clipboard', {
352
+ value: { writeText: writeTextMock },
353
+ configurable: true,
354
+ });
355
+
356
+ const { trigger } = createFixture({
357
+ withPredefinedText: false,
358
+ withTarget: true,
359
+ targetType: 'div',
360
+ targetTextContent: 'not cuttable',
361
+ action: 'cut',
362
+ });
363
+
364
+ const errorEvents: CustomEvent[] = [];
365
+ trigger.addEventListener('kt.clipboard.error', (e) =>
366
+ errorEvents.push(e as CustomEvent),
367
+ );
368
+
369
+ new KTClipboard(trigger);
370
+ trigger.click();
371
+ await flushPromises();
372
+
373
+ expect(writeTextMock).not.toHaveBeenCalled();
374
+ expect(errorEvents.length).toBe(1);
375
+ });
376
+
377
+ it('cuts from input target (clears value on success)', async () => {
378
+ const writeTextMock = vi.fn().mockResolvedValue(undefined);
379
+ Object.defineProperty(navigator, 'clipboard', {
380
+ value: { writeText: writeTextMock },
381
+ configurable: true,
382
+ });
383
+
384
+ const { trigger } = createFixture({
385
+ withPredefinedText: false,
386
+ withTarget: true,
387
+ targetType: 'input',
388
+ targetValue: 'cut value',
389
+ action: 'cut',
390
+ });
391
+
392
+ const input = document.getElementById(
393
+ 'kt-clipboard-target',
394
+ ) as HTMLInputElement;
395
+ expect(input.value).toBe('cut value');
396
+
397
+ new KTClipboard(trigger);
398
+ trigger.click();
399
+ await flushPromises();
400
+
401
+ expect(writeTextMock).toHaveBeenCalledWith('cut value');
402
+ expect(input.value).toBe('');
403
+ });
404
+
405
+ it('is idempotent: createInstances does not double bind', async () => {
406
+ const writeTextMock = vi.fn().mockResolvedValue(undefined);
407
+ Object.defineProperty(navigator, 'clipboard', {
408
+ value: { writeText: writeTextMock },
409
+ configurable: true,
410
+ });
411
+
412
+ const { trigger } = createFixture({
413
+ withPredefinedText: true,
414
+ predefinedTextValue: 'once',
415
+ action: 'copy',
416
+ });
417
+
418
+ // Explicit instance creation.
419
+ new KTClipboard(trigger);
420
+
421
+ // Should not create another handler on the same element.
422
+ KTClipboard.createInstances();
423
+
424
+ trigger.click();
425
+ await flushPromises();
426
+
427
+ expect(writeTextMock).toHaveBeenCalledTimes(1);
428
+ });
429
+
430
+ it('returns null for getInstance on non-initialized trigger', () => {
431
+ document.body.innerHTML = '';
432
+ const trigger = document.createElement('button');
433
+ trigger.setAttribute('data-kt-clipboard', 'true');
434
+ document.body.appendChild(trigger);
435
+
436
+ expect(KTClipboard.getInstance(trigger)).toBeNull();
437
+ });
438
+ });