@keenthemes/ktui 1.2.1 → 1.2.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 (304) hide show
  1. package/dist/ktui.js +2216 -845
  2. package/dist/ktui.min.js +1 -1
  3. package/dist/ktui.min.js.map +1 -1
  4. package/dist/styles.css +24 -197
  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/component.d.ts +3 -3
  18. package/lib/cjs/components/component.d.ts.map +1 -1
  19. package/lib/cjs/components/component.js +9 -1
  20. package/lib/cjs/components/component.js.map +1 -1
  21. package/lib/cjs/components/datatable/datatable-checkbox.d.ts +1 -1
  22. package/lib/cjs/components/datatable/datatable-checkbox.d.ts.map +1 -1
  23. package/lib/cjs/components/datatable/datatable-checkbox.js +1 -1
  24. package/lib/cjs/components/datatable/datatable-checkbox.js.map +1 -1
  25. package/lib/cjs/components/datatable/datatable-sort.d.ts +1 -1
  26. package/lib/cjs/components/datatable/datatable-sort.d.ts.map +1 -1
  27. package/lib/cjs/components/datatable/datatable-sort.js.map +1 -1
  28. package/lib/cjs/components/datatable/datatable.d.ts +2 -0
  29. package/lib/cjs/components/datatable/datatable.d.ts.map +1 -1
  30. package/lib/cjs/components/datatable/datatable.js +30 -17
  31. package/lib/cjs/components/datatable/datatable.js.map +1 -1
  32. package/lib/cjs/components/datatable/types.d.ts +2 -1
  33. package/lib/cjs/components/datatable/types.d.ts.map +1 -1
  34. package/lib/cjs/components/drawer/drawer.d.ts.map +1 -1
  35. package/lib/cjs/components/drawer/drawer.js +3 -16
  36. package/lib/cjs/components/drawer/drawer.js.map +1 -1
  37. package/lib/cjs/components/dropdown/dropdown.d.ts +1 -1
  38. package/lib/cjs/components/dropdown/dropdown.d.ts.map +1 -1
  39. package/lib/cjs/components/dropdown/dropdown.js +2 -3
  40. package/lib/cjs/components/dropdown/dropdown.js.map +1 -1
  41. package/lib/cjs/components/modal/modal.d.ts.map +1 -1
  42. package/lib/cjs/components/modal/modal.js +19 -13
  43. package/lib/cjs/components/modal/modal.js.map +1 -1
  44. package/lib/cjs/components/pin-input/index.d.ts +3 -0
  45. package/lib/cjs/components/pin-input/index.d.ts.map +1 -0
  46. package/lib/cjs/components/pin-input/index.js +6 -0
  47. package/lib/cjs/components/pin-input/index.js.map +1 -0
  48. package/lib/cjs/components/pin-input/pin-input.d.ts +56 -0
  49. package/lib/cjs/components/pin-input/pin-input.d.ts.map +1 -0
  50. package/lib/cjs/components/pin-input/pin-input.js +455 -0
  51. package/lib/cjs/components/pin-input/pin-input.js.map +1 -0
  52. package/lib/cjs/components/pin-input/types.d.ts +41 -0
  53. package/lib/cjs/components/pin-input/types.d.ts.map +1 -0
  54. package/lib/cjs/components/pin-input/types.js +6 -0
  55. package/lib/cjs/components/pin-input/types.js.map +1 -0
  56. package/lib/cjs/components/rating/rating.d.ts.map +1 -1
  57. package/lib/cjs/components/rating/rating.js.map +1 -1
  58. package/lib/cjs/components/select/combobox.d.ts.map +1 -1
  59. package/lib/cjs/components/select/combobox.js +25 -15
  60. package/lib/cjs/components/select/combobox.js.map +1 -1
  61. package/lib/cjs/components/select/config.d.ts +2 -2
  62. package/lib/cjs/components/select/config.d.ts.map +1 -1
  63. package/lib/cjs/components/select/config.js +10 -9
  64. package/lib/cjs/components/select/config.js.map +1 -1
  65. package/lib/cjs/components/select/dropdown.js.map +1 -1
  66. package/lib/cjs/components/select/option.d.ts +2 -1
  67. package/lib/cjs/components/select/option.d.ts.map +1 -1
  68. package/lib/cjs/components/select/option.js +9 -3
  69. package/lib/cjs/components/select/option.js.map +1 -1
  70. package/lib/cjs/components/select/remote.d.ts +1 -0
  71. package/lib/cjs/components/select/remote.d.ts.map +1 -1
  72. package/lib/cjs/components/select/remote.js +21 -14
  73. package/lib/cjs/components/select/remote.js.map +1 -1
  74. package/lib/cjs/components/select/search.d.ts +1 -1
  75. package/lib/cjs/components/select/search.d.ts.map +1 -1
  76. package/lib/cjs/components/select/search.js +34 -25
  77. package/lib/cjs/components/select/search.js.map +1 -1
  78. package/lib/cjs/components/select/select.d.ts +5 -3
  79. package/lib/cjs/components/select/select.d.ts.map +1 -1
  80. package/lib/cjs/components/select/select.js +31 -31
  81. package/lib/cjs/components/select/select.js.map +1 -1
  82. package/lib/cjs/components/select/tags.d.ts.map +1 -1
  83. package/lib/cjs/components/select/tags.js +22 -13
  84. package/lib/cjs/components/select/tags.js.map +1 -1
  85. package/lib/cjs/components/select/templates.d.ts.map +1 -1
  86. package/lib/cjs/components/select/templates.js +4 -4
  87. package/lib/cjs/components/select/templates.js.map +1 -1
  88. package/lib/cjs/components/select/types.d.ts +1 -1
  89. package/lib/cjs/components/select/types.d.ts.map +1 -1
  90. package/lib/cjs/components/select/utils.d.ts +4 -4
  91. package/lib/cjs/components/select/utils.d.ts.map +1 -1
  92. package/lib/cjs/components/select/utils.js +2 -3
  93. package/lib/cjs/components/select/utils.js.map +1 -1
  94. package/lib/cjs/components/sticky/sticky.d.ts +1 -1
  95. package/lib/cjs/components/sticky/sticky.d.ts.map +1 -1
  96. package/lib/cjs/components/sticky/sticky.js +13 -13
  97. package/lib/cjs/components/sticky/sticky.js.map +1 -1
  98. package/lib/cjs/components/theme-switch/theme-switch.d.ts +3 -0
  99. package/lib/cjs/components/theme-switch/theme-switch.d.ts.map +1 -1
  100. package/lib/cjs/components/theme-switch/theme-switch.js +17 -4
  101. package/lib/cjs/components/theme-switch/theme-switch.js.map +1 -1
  102. package/lib/cjs/components/toast/toast.d.ts.map +1 -1
  103. package/lib/cjs/components/toast/toast.js +17 -9
  104. package/lib/cjs/components/toast/toast.js.map +1 -1
  105. package/lib/cjs/components/toast/types.d.ts +3 -0
  106. package/lib/cjs/components/toast/types.d.ts.map +1 -1
  107. package/lib/cjs/components/toggle/toggle.d.ts +2 -0
  108. package/lib/cjs/components/toggle/toggle.d.ts.map +1 -1
  109. package/lib/cjs/components/toggle/toggle.js +11 -2
  110. package/lib/cjs/components/toggle/toggle.js.map +1 -1
  111. package/lib/cjs/components/toggle-password/toggle-password.d.ts.map +1 -1
  112. package/lib/cjs/components/toggle-password/toggle-password.js.map +1 -1
  113. package/lib/cjs/helpers/dom.d.ts +4 -4
  114. package/lib/cjs/helpers/dom.d.ts.map +1 -1
  115. package/lib/cjs/helpers/dom.js +8 -10
  116. package/lib/cjs/helpers/dom.js.map +1 -1
  117. package/lib/cjs/helpers/event-handler.d.ts +1 -1
  118. package/lib/cjs/helpers/event-handler.d.ts.map +1 -1
  119. package/lib/cjs/helpers/event-handler.js +3 -1
  120. package/lib/cjs/helpers/event-handler.js.map +1 -1
  121. package/lib/cjs/helpers/utils.d.ts +1 -1
  122. package/lib/cjs/helpers/utils.d.ts.map +1 -1
  123. package/lib/cjs/helpers/utils.js +4 -1
  124. package/lib/cjs/helpers/utils.js.map +1 -1
  125. package/lib/cjs/index.d.ts +8 -0
  126. package/lib/cjs/index.d.ts.map +1 -1
  127. package/lib/cjs/index.js +9 -1
  128. package/lib/cjs/index.js.map +1 -1
  129. package/lib/cjs/types.d.ts +1 -1
  130. package/lib/cjs/types.d.ts.map +1 -1
  131. package/lib/esm/components/carousel/carousel.d.ts +102 -0
  132. package/lib/esm/components/carousel/carousel.d.ts.map +1 -0
  133. package/lib/esm/components/carousel/carousel.js +766 -0
  134. package/lib/esm/components/carousel/carousel.js.map +1 -0
  135. package/lib/esm/components/carousel/index.d.ts +7 -0
  136. package/lib/esm/components/carousel/index.d.ts.map +1 -0
  137. package/lib/esm/components/carousel/index.js +6 -0
  138. package/lib/esm/components/carousel/index.js.map +1 -0
  139. package/lib/esm/components/carousel/types.d.ts +36 -0
  140. package/lib/esm/components/carousel/types.d.ts.map +1 -0
  141. package/lib/esm/components/carousel/types.js +6 -0
  142. package/lib/esm/components/carousel/types.js.map +1 -0
  143. package/lib/esm/components/component.d.ts +3 -3
  144. package/lib/esm/components/component.d.ts.map +1 -1
  145. package/lib/esm/components/component.js +9 -1
  146. package/lib/esm/components/component.js.map +1 -1
  147. package/lib/esm/components/datatable/datatable-checkbox.d.ts +1 -1
  148. package/lib/esm/components/datatable/datatable-checkbox.d.ts.map +1 -1
  149. package/lib/esm/components/datatable/datatable-checkbox.js +1 -1
  150. package/lib/esm/components/datatable/datatable-checkbox.js.map +1 -1
  151. package/lib/esm/components/datatable/datatable-sort.d.ts +1 -1
  152. package/lib/esm/components/datatable/datatable-sort.d.ts.map +1 -1
  153. package/lib/esm/components/datatable/datatable-sort.js.map +1 -1
  154. package/lib/esm/components/datatable/datatable.d.ts +2 -0
  155. package/lib/esm/components/datatable/datatable.d.ts.map +1 -1
  156. package/lib/esm/components/datatable/datatable.js +30 -17
  157. package/lib/esm/components/datatable/datatable.js.map +1 -1
  158. package/lib/esm/components/datatable/types.d.ts +2 -1
  159. package/lib/esm/components/datatable/types.d.ts.map +1 -1
  160. package/lib/esm/components/drawer/drawer.d.ts.map +1 -1
  161. package/lib/esm/components/drawer/drawer.js +3 -16
  162. package/lib/esm/components/drawer/drawer.js.map +1 -1
  163. package/lib/esm/components/dropdown/dropdown.d.ts +1 -1
  164. package/lib/esm/components/dropdown/dropdown.d.ts.map +1 -1
  165. package/lib/esm/components/dropdown/dropdown.js +2 -3
  166. package/lib/esm/components/dropdown/dropdown.js.map +1 -1
  167. package/lib/esm/components/modal/modal.d.ts.map +1 -1
  168. package/lib/esm/components/modal/modal.js +19 -13
  169. package/lib/esm/components/modal/modal.js.map +1 -1
  170. package/lib/esm/components/pin-input/index.d.ts +3 -0
  171. package/lib/esm/components/pin-input/index.d.ts.map +1 -0
  172. package/lib/esm/components/pin-input/index.js +2 -0
  173. package/lib/esm/components/pin-input/index.js.map +1 -0
  174. package/lib/esm/components/pin-input/pin-input.d.ts +56 -0
  175. package/lib/esm/components/pin-input/pin-input.d.ts.map +1 -0
  176. package/lib/esm/components/pin-input/pin-input.js +452 -0
  177. package/lib/esm/components/pin-input/pin-input.js.map +1 -0
  178. package/lib/esm/components/pin-input/types.d.ts +41 -0
  179. package/lib/esm/components/pin-input/types.d.ts.map +1 -0
  180. package/lib/esm/components/pin-input/types.js +5 -0
  181. package/lib/esm/components/pin-input/types.js.map +1 -0
  182. package/lib/esm/components/rating/rating.d.ts.map +1 -1
  183. package/lib/esm/components/rating/rating.js.map +1 -1
  184. package/lib/esm/components/select/combobox.d.ts.map +1 -1
  185. package/lib/esm/components/select/combobox.js +25 -15
  186. package/lib/esm/components/select/combobox.js.map +1 -1
  187. package/lib/esm/components/select/config.d.ts +2 -2
  188. package/lib/esm/components/select/config.d.ts.map +1 -1
  189. package/lib/esm/components/select/config.js +10 -9
  190. package/lib/esm/components/select/config.js.map +1 -1
  191. package/lib/esm/components/select/dropdown.js.map +1 -1
  192. package/lib/esm/components/select/option.d.ts +2 -1
  193. package/lib/esm/components/select/option.d.ts.map +1 -1
  194. package/lib/esm/components/select/option.js +9 -3
  195. package/lib/esm/components/select/option.js.map +1 -1
  196. package/lib/esm/components/select/remote.d.ts +1 -0
  197. package/lib/esm/components/select/remote.d.ts.map +1 -1
  198. package/lib/esm/components/select/remote.js +21 -14
  199. package/lib/esm/components/select/remote.js.map +1 -1
  200. package/lib/esm/components/select/search.d.ts +1 -1
  201. package/lib/esm/components/select/search.d.ts.map +1 -1
  202. package/lib/esm/components/select/search.js +34 -25
  203. package/lib/esm/components/select/search.js.map +1 -1
  204. package/lib/esm/components/select/select.d.ts +5 -3
  205. package/lib/esm/components/select/select.d.ts.map +1 -1
  206. package/lib/esm/components/select/select.js +31 -31
  207. package/lib/esm/components/select/select.js.map +1 -1
  208. package/lib/esm/components/select/tags.d.ts.map +1 -1
  209. package/lib/esm/components/select/tags.js +22 -13
  210. package/lib/esm/components/select/tags.js.map +1 -1
  211. package/lib/esm/components/select/templates.d.ts.map +1 -1
  212. package/lib/esm/components/select/templates.js +4 -4
  213. package/lib/esm/components/select/templates.js.map +1 -1
  214. package/lib/esm/components/select/types.d.ts +1 -1
  215. package/lib/esm/components/select/types.d.ts.map +1 -1
  216. package/lib/esm/components/select/utils.d.ts +4 -4
  217. package/lib/esm/components/select/utils.d.ts.map +1 -1
  218. package/lib/esm/components/select/utils.js +2 -3
  219. package/lib/esm/components/select/utils.js.map +1 -1
  220. package/lib/esm/components/sticky/sticky.d.ts +1 -1
  221. package/lib/esm/components/sticky/sticky.d.ts.map +1 -1
  222. package/lib/esm/components/sticky/sticky.js +13 -13
  223. package/lib/esm/components/sticky/sticky.js.map +1 -1
  224. package/lib/esm/components/theme-switch/theme-switch.d.ts +3 -0
  225. package/lib/esm/components/theme-switch/theme-switch.d.ts.map +1 -1
  226. package/lib/esm/components/theme-switch/theme-switch.js +17 -4
  227. package/lib/esm/components/theme-switch/theme-switch.js.map +1 -1
  228. package/lib/esm/components/toast/toast.d.ts.map +1 -1
  229. package/lib/esm/components/toast/toast.js +17 -9
  230. package/lib/esm/components/toast/toast.js.map +1 -1
  231. package/lib/esm/components/toast/types.d.ts +3 -0
  232. package/lib/esm/components/toast/types.d.ts.map +1 -1
  233. package/lib/esm/components/toggle/toggle.d.ts +2 -0
  234. package/lib/esm/components/toggle/toggle.d.ts.map +1 -1
  235. package/lib/esm/components/toggle/toggle.js +11 -2
  236. package/lib/esm/components/toggle/toggle.js.map +1 -1
  237. package/lib/esm/components/toggle-password/toggle-password.d.ts.map +1 -1
  238. package/lib/esm/components/toggle-password/toggle-password.js.map +1 -1
  239. package/lib/esm/helpers/dom.d.ts +4 -4
  240. package/lib/esm/helpers/dom.d.ts.map +1 -1
  241. package/lib/esm/helpers/dom.js +8 -10
  242. package/lib/esm/helpers/dom.js.map +1 -1
  243. package/lib/esm/helpers/event-handler.d.ts +1 -1
  244. package/lib/esm/helpers/event-handler.d.ts.map +1 -1
  245. package/lib/esm/helpers/event-handler.js +3 -1
  246. package/lib/esm/helpers/event-handler.js.map +1 -1
  247. package/lib/esm/helpers/utils.d.ts +1 -1
  248. package/lib/esm/helpers/utils.d.ts.map +1 -1
  249. package/lib/esm/helpers/utils.js +4 -1
  250. package/lib/esm/helpers/utils.js.map +1 -1
  251. package/lib/esm/index.d.ts +8 -0
  252. package/lib/esm/index.d.ts.map +1 -1
  253. package/lib/esm/index.js +6 -0
  254. package/lib/esm/index.js.map +1 -1
  255. package/lib/esm/types.d.ts +1 -1
  256. package/lib/esm/types.d.ts.map +1 -1
  257. package/package.json +5 -2
  258. package/src/components/carousel/__tests__/carousel.test.ts +326 -0
  259. package/src/components/carousel/carousel.css +42 -0
  260. package/src/components/carousel/carousel.ts +847 -0
  261. package/src/components/carousel/index.ts +11 -0
  262. package/src/components/carousel/types.ts +38 -0
  263. package/src/components/clipboard/__tests__/clipboard.test.ts +4 -4
  264. package/src/components/component.ts +15 -5
  265. package/src/components/datatable/__tests__/currency-sort.test.ts +4 -3
  266. package/src/components/datatable/__tests__/pagination-reset.test.ts +7 -4
  267. package/src/components/datatable/__tests__/setup.ts +1 -1
  268. package/src/components/datatable/datatable-checkbox.ts +6 -4
  269. package/src/components/datatable/datatable-sort.ts +27 -7
  270. package/src/components/datatable/datatable.ts +64 -37
  271. package/src/components/datatable/types.ts +3 -1
  272. package/src/components/drawer/drawer.ts +3 -18
  273. package/src/components/dropdown/dropdown.ts +2 -3
  274. package/src/components/modal/modal.ts +22 -14
  275. package/src/components/pin-input/__tests__/pin-input.test.ts +928 -0
  276. package/src/components/pin-input/index.ts +6 -0
  277. package/src/components/pin-input/pin-input.ts +499 -0
  278. package/src/components/pin-input/types.ts +45 -0
  279. package/src/components/rating/rating.ts +0 -1
  280. package/src/components/repeater/__tests__/repeater.test.ts +5 -5
  281. package/src/components/select/__tests__/ux-behaviors.test.ts +4 -3
  282. package/src/components/select/combobox.ts +23 -16
  283. package/src/components/select/config.ts +15 -14
  284. package/src/components/select/dropdown.ts +1 -1
  285. package/src/components/select/option.ts +14 -4
  286. package/src/components/select/remote.ts +68 -56
  287. package/src/components/select/search.ts +30 -27
  288. package/src/components/select/select.ts +41 -37
  289. package/src/components/select/tags.ts +14 -8
  290. package/src/components/select/templates.ts +11 -6
  291. package/src/components/select/types.ts +1 -1
  292. package/src/components/select/utils.ts +7 -9
  293. package/src/components/sticky/sticky.ts +2 -2
  294. package/src/components/theme-switch/theme-switch.ts +22 -4
  295. package/src/components/toast/toast.ts +34 -21
  296. package/src/components/toast/types.ts +5 -1
  297. package/src/components/toggle/toggle.ts +12 -2
  298. package/src/components/toggle-password/toggle-password.ts +0 -1
  299. package/src/helpers/dom.ts +14 -17
  300. package/src/helpers/event-handler.ts +5 -6
  301. package/src/helpers/utils.ts +5 -2
  302. package/src/index.ts +18 -0
  303. package/src/types.ts +1 -1
  304. 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
+ }
@@ -80,7 +80,7 @@ function createFixture(options?: {
80
80
  }
81
81
 
82
82
  describe('KTClipboard', () => {
83
- let originalExecCommand: any;
83
+ let originalExecCommand: Document['execCommand'];
84
84
 
85
85
  beforeEach(() => {
86
86
  // Ensure a clean clipboard state between tests.
@@ -90,7 +90,7 @@ describe('KTClipboard', () => {
90
90
  afterEach(() => {
91
91
  document.body.innerHTML = '';
92
92
  // Restore execCommand (if it was replaced).
93
- document.execCommand = originalExecCommand as any;
93
+ document.execCommand = originalExecCommand;
94
94
  });
95
95
 
96
96
  it('copies predefined text (text wins over target)', async () => {
@@ -135,7 +135,7 @@ describe('KTClipboard', () => {
135
135
  });
136
136
 
137
137
  const execCommandMock = vi.fn().mockReturnValue(true);
138
- document.execCommand = execCommandMock as any;
138
+ document.execCommand = execCommandMock as Document['execCommand'];
139
139
 
140
140
  const { trigger } = createFixture({
141
141
  withPredefinedText: true,
@@ -163,7 +163,7 @@ describe('KTClipboard', () => {
163
163
  });
164
164
 
165
165
  const execCommandMock = vi.fn().mockReturnValue(false);
166
- document.execCommand = execCommandMock as any;
166
+ document.execCommand = execCommandMock as Document['execCommand'];
167
167
 
168
168
  const { trigger } = createFixture({
169
169
  withPredefinedText: true,
@@ -19,7 +19,7 @@ export default class KTComponent {
19
19
  protected _name: string;
20
20
  protected _defaultConfig: object;
21
21
  protected _config: object;
22
- protected _events: Map<string, Map<string, CallableFunction>>;
22
+ protected _events: Map<string, Map<string, CallableFunction>> = new Map();
23
23
  protected _uid: string | null = null;
24
24
  protected _element: HTMLElement | null = null;
25
25
 
@@ -67,7 +67,7 @@ export default class KTComponent {
67
67
 
68
68
  protected async _fireEvent(
69
69
  eventType: string,
70
- payload: object = null,
70
+ payload: object | null = null,
71
71
  ): Promise<void> {
72
72
  const callbacks = this._events.get(eventType);
73
73
 
@@ -86,7 +86,10 @@ export default class KTComponent {
86
86
  );
87
87
  }
88
88
 
89
- protected _dispatchEvent(eventType: string, payload: object = null): void {
89
+ protected _dispatchEvent(
90
+ eventType: string,
91
+ payload: object | null = null,
92
+ ): void {
90
93
  const event = new CustomEvent(eventType, {
91
94
  detail: { payload },
92
95
  bubbles: true,
@@ -100,6 +103,9 @@ export default class KTComponent {
100
103
 
101
104
  protected _getOption(name: string): KTOptionType {
102
105
  const value = this._config[name as keyof object];
106
+ if (!this._element) {
107
+ return value as KTOptionType;
108
+ }
103
109
  const reponsiveValue = KTDom.getCssProp(
104
110
  this._element,
105
111
  `--kt-${this._name}-${KTUtils.camelReverseCase(name)}`,
@@ -163,7 +169,11 @@ export default class KTComponent {
163
169
  this._events.set(eventType, new Map());
164
170
  }
165
171
 
166
- this._events.get(eventType).set(eventId, callback);
172
+ const eventMap = this._events.get(eventType);
173
+ if (!eventMap) {
174
+ return eventId;
175
+ }
176
+ eventMap.set(eventId, callback);
167
177
 
168
178
  return eventId;
169
179
  }
@@ -176,7 +186,7 @@ export default class KTComponent {
176
186
  return this._getOption(name as keyof object);
177
187
  }
178
188
 
179
- public getElement(): HTMLElement {
189
+ public getElement(): HTMLElement | null {
180
190
  if (!this._element) return null;
181
191
  return this._element;
182
192
  }
@@ -8,6 +8,7 @@
8
8
 
9
9
  import { describe, it, expect, beforeEach, vi } from 'vitest';
10
10
  import { createSortHandler } from '../datatable-sort';
11
+ import { KTDataTableConfigInterface } from '../types';
11
12
 
12
13
  describe('KTDataTable - Currency/numeric sort', () => {
13
14
  let thead: HTMLTableSectionElement;
@@ -29,7 +30,7 @@ describe('KTDataTable - Currency/numeric sort', () => {
29
30
  },
30
31
  };
31
32
  const handler = createSortHandler(
32
- config as any,
33
+ config as KTDataTableConfigInterface,
33
34
  thead,
34
35
  () => ({ sortField: null, sortOrder: '' }),
35
36
  noop,
@@ -58,7 +59,7 @@ describe('KTDataTable - Currency/numeric sort', () => {
58
59
  },
59
60
  };
60
61
  const handler = createSortHandler(
61
- config as any,
62
+ config as KTDataTableConfigInterface,
62
63
  thead,
63
64
  () => ({ sortField: null, sortOrder: '' }),
64
65
  noop,
@@ -79,7 +80,7 @@ describe('KTDataTable - Currency/numeric sort', () => {
79
80
  it('without sortType numeric, sorts lexicographically (e.g. £123 before £20)', () => {
80
81
  const config = { columns: {} };
81
82
  const handler = createSortHandler(
82
- config as any,
83
+ config as KTDataTableConfigInterface,
83
84
  thead,
84
85
  () => ({ sortField: null, sortOrder: '' }),
85
86
  noop,
@@ -13,7 +13,7 @@ import { KTDataTableColumnFilterInterface } from '../types';
13
13
  describe('KTDataTable - Pagination Reset', () => {
14
14
  let container: HTMLElement;
15
15
  let tableElement: HTMLTableElement;
16
- let datatable: KTDataTable<any>;
16
+ let datatable: KTDataTable<Record<string, unknown>>;
17
17
 
18
18
  /**
19
19
  * Helper: Create a mock datatable with sample data
@@ -177,13 +177,16 @@ describe('KTDataTable - Pagination Reset', () => {
177
177
  // Provide custom search callback that handles objects
178
178
  search: {
179
179
  delay: 500,
180
- callback: (data: any[], search: string | object) => {
180
+ callback: (
181
+ data: Record<string, unknown>[],
182
+ search: string | object,
183
+ ) => {
181
184
  if (!search) return data;
182
185
  // For object search, just return all data (simplified for test)
183
186
  if (typeof search === 'object') return data;
184
187
  // String search
185
- return data.filter((item: any) =>
186
- Object.values(item).some((value: any) =>
188
+ return data.filter((item: Record<string, unknown>) =>
189
+ Object.values(item).some((value: unknown) =>
187
190
  String(value)
188
191
  .toLowerCase()
189
192
  .includes((search as string).toLowerCase()),
@@ -46,7 +46,7 @@ Object.defineProperty(window, 'matchMedia', {
46
46
  matches: false,
47
47
  media: query,
48
48
  onchange: null as
49
- | ((this: MediaQueryList, ev: MediaQueryListEvent) => any)
49
+ | ((this: MediaQueryList, ev: MediaQueryListEvent) => unknown)
50
50
  | null,
51
51
  addListener: () => {}, // deprecated
52
52
  removeListener: () => {}, // deprecated
@@ -25,7 +25,7 @@ export interface KTDataTableCheckboxAPI {
25
25
  export function createCheckboxHandler(
26
26
  element: HTMLElement,
27
27
  config: KTDataTableConfigInterface,
28
- fireEvent: (eventName: string, eventData?: any) => void,
28
+ fireEvent: (eventName: string, eventData?: object) => void,
29
29
  ): KTDataTableCheckboxAPI {
30
30
  let headerChecked = false;
31
31
  let headerCheckElement: HTMLInputElement | null = null;
@@ -36,7 +36,8 @@ export function createCheckboxHandler(
36
36
 
37
37
  // Helper: get selectedRows from state, always as string[]
38
38
  function getSelectedRows(): string[] {
39
- if (!config._state) config._state = {} as any;
39
+ if (!config._state)
40
+ config._state = {} as unknown as KTDataTableConfigInterface['_state'];
40
41
  if (!Array.isArray(config._state.selectedRows))
41
42
  config._state.selectedRows = [];
42
43
  return config._state.selectedRows.map(String);
@@ -44,7 +45,8 @@ export function createCheckboxHandler(
44
45
 
45
46
  // Helper: set selectedRows in state
46
47
  function setSelectedRows(rows: string[]) {
47
- if (!config._state) config._state = {} as any;
48
+ if (!config._state)
49
+ config._state = {} as unknown as KTDataTableConfigInterface['_state'];
48
50
  config._state.selectedRows = Array.from(new Set(rows.map(String)));
49
51
  }
50
52
 
@@ -118,7 +120,7 @@ export function createCheckboxHandler(
118
120
  }
119
121
 
120
122
  // When the header checkbox is toggled
121
- function checkboxToggle(event?: Event) {
123
+ function checkboxToggle(_event?: Event) {
122
124
  const checked = !isChecked();
123
125
  // Update state first, then fire events
124
126
  change(checked);
@@ -40,8 +40,8 @@ export function createSortHandler<T = KTDataTableDataInterface>(
40
40
  field: keyof T | number,
41
41
  order: KTDataTableSortOrderInterface,
42
42
  ) => void,
43
- fireEvent: (eventName: string, eventData?: any) => void,
44
- dispatchEvent: (eventName: string, eventData?: any) => void,
43
+ fireEvent: (eventName: string, eventData?: object) => void,
44
+ dispatchEvent: (eventName: string, eventData?: object) => void,
45
45
  updateData: () => void,
46
46
  ): KTDataTableSortAPI<T> {
47
47
  // Helper to compare values for sorting (string)
@@ -93,7 +93,9 @@ export function createSortHandler<T = KTDataTableDataInterface>(
93
93
  | {
94
94
  sortType?: 'string' | 'numeric';
95
95
  sortValue?: (
96
- cellValue: unknown,
96
+ cellValue:
97
+ | KTDataTableDataInterface[keyof KTDataTableDataInterface]
98
+ | string,
97
99
  rowData: KTDataTableDataInterface,
98
100
  ) => number | string;
99
101
  }
@@ -121,8 +123,18 @@ export function createSortHandler<T = KTDataTableDataInterface>(
121
123
  const bRaw = b[sortField as keyof T] as unknown;
122
124
 
123
125
  if (typeof sortValueFn === 'function') {
124
- const aVal = sortValueFn(aRaw, a as KTDataTableDataInterface);
125
- const bVal = sortValueFn(bRaw, b as KTDataTableDataInterface);
126
+ const aVal = sortValueFn(
127
+ aRaw as
128
+ | KTDataTableDataInterface[keyof KTDataTableDataInterface]
129
+ | string,
130
+ a as KTDataTableDataInterface,
131
+ );
132
+ const bVal = sortValueFn(
133
+ bRaw as
134
+ | KTDataTableDataInterface[keyof KTDataTableDataInterface]
135
+ | string,
136
+ b as KTDataTableDataInterface,
137
+ );
126
138
  const aNum = typeof aVal === 'number' ? aVal : parseNumeric(aVal);
127
139
  const bNum = typeof bVal === 'number' ? bVal : parseNumeric(bVal);
128
140
  if (typeof aVal === 'number' && typeof bVal === 'number') {
@@ -131,8 +143,16 @@ export function createSortHandler<T = KTDataTableDataInterface>(
131
143
  return compareValues(aVal, bVal, sortOrder);
132
144
  }
133
145
  if (useNumeric) {
134
- const aNum = parseNumeric(aRaw);
135
- const bNum = parseNumeric(bRaw);
146
+ const aNum = parseNumeric(
147
+ aRaw as
148
+ | KTDataTableDataInterface[keyof KTDataTableDataInterface]
149
+ | string,
150
+ );
151
+ const bNum = parseNumeric(
152
+ bRaw as
153
+ | KTDataTableDataInterface[keyof KTDataTableDataInterface]
154
+ | string,
155
+ );
136
156
  return compareNumeric(aNum, bNum, sortOrder);
137
157
  }
138
158
  return compareValues(aRaw, bRaw, sortOrder);
@@ -13,6 +13,7 @@ import {
13
13
  KTDataTableColumnFilterInterface,
14
14
  KTDataTableAttributeInterface,
15
15
  } from './types';
16
+ import { KTOptionType } from '../../types';
16
17
  import KTUtils from '../../helpers/utils';
17
18
  import KTComponents from '../../index';
18
19
  import KTData from '../../helpers/data';
@@ -35,6 +36,20 @@ export class KTDataTable<T extends KTDataTableDataInterface>
35
36
  extends KTComponent
36
37
  implements KTDataTableInterface
37
38
  {
39
+ private static asElementWithInstance(element: HTMLElement): HTMLElement & {
40
+ instance?: KTDataTable<KTDataTableDataInterface>;
41
+ } {
42
+ return element as HTMLElement & {
43
+ instance?: KTDataTable<KTDataTableDataInterface>;
44
+ };
45
+ }
46
+
47
+ private static asSearchElementWithDebounce(
48
+ element: HTMLInputElement,
49
+ ): HTMLInputElement & { _debouncedSearch?: EventListener } {
50
+ return element as HTMLInputElement & { _debouncedSearch?: EventListener };
51
+ }
52
+
38
53
  protected override _name: string = 'datatable';
39
54
  protected override _config: KTDataTableConfigInterface;
40
55
  protected override _defaultConfig: KTDataTableConfigInterface;
@@ -88,7 +103,7 @@ export class KTDataTable<T extends KTDataTableDataInterface>
88
103
  this._buildConfig();
89
104
 
90
105
  // Store the instance directly on the element
91
- (element as any).instance = this;
106
+ KTDataTable.asElementWithInstance(element).instance = this;
92
107
 
93
108
  this._initElements();
94
109
 
@@ -96,7 +111,7 @@ export class KTDataTable<T extends KTDataTableDataInterface>
96
111
  this._checkbox = createCheckboxHandler(
97
112
  this._element,
98
113
  this._config,
99
- (eventName: string, eventData?: any) => {
114
+ (eventName: string, eventData?: object) => {
100
115
  this._fireEvent(eventName, eventData);
101
116
  this._dispatchEvent(eventName, eventData);
102
117
  },
@@ -284,22 +299,20 @@ export class KTDataTable<T extends KTDataTableDataInterface>
284
299
  return false;
285
300
  }
286
301
 
287
- return Object.values(item).some(
288
- (value: string | number | boolean) => {
289
- if (
290
- typeof value !== 'string' &&
291
- typeof value !== 'number' &&
292
- typeof value !== 'boolean'
293
- ) {
294
- return false;
295
- }
296
-
297
- const valueText = String(value)
298
- .replace(/<[^>]*>|&nbsp;/g, '')
299
- .toLowerCase();
300
- return valueText.includes(search.toLowerCase());
301
- },
302
- );
302
+ return Object.values(item).some((value: KTOptionType) => {
303
+ if (
304
+ typeof value !== 'string' &&
305
+ typeof value !== 'number' &&
306
+ typeof value !== 'boolean'
307
+ ) {
308
+ return false;
309
+ }
310
+
311
+ const valueText = String(value)
312
+ .replace(/<|>|&nbsp;/g, '')
313
+ .toLowerCase();
314
+ return valueText.includes(search.toLowerCase());
315
+ });
303
316
  });
304
317
  },
305
318
  },
@@ -533,11 +546,13 @@ export class KTDataTable<T extends KTDataTableDataInterface>
533
546
 
534
547
  if (searchElement) {
535
548
  // Check if a debounced search function already exists
536
- if ((searchElement as any)._debouncedSearch) {
549
+ const searchWithDebounce =
550
+ KTDataTable.asSearchElementWithDebounce(searchElement);
551
+ if (searchWithDebounce._debouncedSearch) {
537
552
  // Remove the existing debounced event listener
538
553
  searchElement.removeEventListener(
539
554
  'keyup',
540
- (searchElement as any)._debouncedSearch,
555
+ searchWithDebounce._debouncedSearch,
541
556
  );
542
557
  }
543
558
 
@@ -547,7 +562,7 @@ export class KTDataTable<T extends KTDataTableDataInterface>
547
562
  }, this._config.search.delay);
548
563
 
549
564
  // Store the new debounced function as a property of the element
550
- (searchElement as any)._debouncedSearch = debouncedSearch;
565
+ searchWithDebounce._debouncedSearch = debouncedSearch;
551
566
 
552
567
  // Add the new debounced event listener
553
568
  searchElement.addEventListener('keyup', debouncedSearch);
@@ -590,10 +605,11 @@ export class KTDataTable<T extends KTDataTableDataInterface>
590
605
  let _temp = (this._data = [...originalData] as T[]);
591
606
 
592
607
  if (search) {
608
+ const searchTerm = typeof search === 'string' ? search : '';
593
609
  _temp = this._data = this._config.search.callback.call(
594
610
  this,
595
611
  this._data,
596
- search,
612
+ searchTerm,
597
613
  ) as T[];
598
614
  }
599
615
 
@@ -651,7 +667,7 @@ export class KTDataTable<T extends KTDataTableDataInterface>
651
667
 
652
668
  private _tableConfigInvalidate(): boolean {
653
669
  // Remove _data and _state from config
654
- const { _data, _state, ...restConfig } = this._config;
670
+ const { _state, ...restConfig } = this._config;
655
671
  const checksum: string = KTUtils.checksum(JSON.stringify(restConfig));
656
672
  if (_state._configChecksum !== checksum) {
657
673
  this._config._state._configChecksum = checksum;
@@ -1072,7 +1088,7 @@ export class KTDataTable<T extends KTDataTableDataInterface>
1072
1088
  const th = columnsToRender[colIndex];
1073
1089
  const colName = th?.getAttribute('data-kt-datatable-column');
1074
1090
  const td = document.createElement('td');
1075
- let value: any;
1091
+ let value: KTOptionType | '';
1076
1092
  if (colName && Object.prototype.hasOwnProperty.call(item, colName)) {
1077
1093
  value = item[colName as keyof T];
1078
1094
  } else if (Object.prototype.hasOwnProperty.call(item, colIndex)) {
@@ -1564,12 +1580,17 @@ export class KTDataTable<T extends KTDataTableDataInterface>
1564
1580
  document.querySelector<HTMLInputElement>(
1565
1581
  `[data-kt-datatable-search="#${tableId}"]`,
1566
1582
  );
1567
- if (searchElement && (searchElement as any)._debouncedSearch) {
1583
+ if (searchElement) {
1584
+ const searchWithDebounce =
1585
+ KTDataTable.asSearchElementWithDebounce(searchElement);
1586
+ if (!searchWithDebounce._debouncedSearch) {
1587
+ return;
1588
+ }
1568
1589
  searchElement.removeEventListener(
1569
1590
  'keyup',
1570
- (searchElement as any)._debouncedSearch,
1591
+ searchWithDebounce._debouncedSearch,
1571
1592
  );
1572
- delete (searchElement as any)._debouncedSearch;
1593
+ delete searchWithDebounce._debouncedSearch;
1573
1594
  }
1574
1595
 
1575
1596
  // --- 2. Remove page size dropdown event listener ---
@@ -1587,11 +1608,11 @@ export class KTDataTable<T extends KTDataTableDataInterface>
1587
1608
 
1588
1609
  // --- 4. Dispose of handler objects (checkbox, sort) ---
1589
1610
  // KTDataTableCheckboxAPI does not have a dispose method, but we can remove header checkbox listener
1590
- if (
1591
- this._checkbox &&
1592
- typeof (this._checkbox as any).dispose === 'function'
1593
- ) {
1594
- (this._checkbox as any).dispose();
1611
+ const checkboxWithDispose = this._checkbox as KTDataTableCheckboxAPI & {
1612
+ dispose?: () => void;
1613
+ };
1614
+ if (this._checkbox && typeof checkboxWithDispose.dispose === 'function') {
1615
+ checkboxWithDispose.dispose();
1595
1616
  } else {
1596
1617
  // Remove header checkbox event listener if possible
1597
1618
  const headerCheckElement = this._element.querySelector<HTMLInputElement>(
@@ -1619,8 +1640,11 @@ export class KTDataTable<T extends KTDataTableDataInterface>
1619
1640
  this._element.classList.remove(this._config.loadingClass);
1620
1641
 
1621
1642
  // --- 6. Remove instance reference from the DOM element ---
1622
- if ((this._element as any).instance) {
1623
- delete (this._element as any).instance;
1643
+ const elementWithInstance = KTDataTable.asElementWithInstance(
1644
+ this._element,
1645
+ );
1646
+ if (elementWithInstance.instance) {
1647
+ delete elementWithInstance.instance;
1624
1648
  }
1625
1649
 
1626
1650
  // --- 7. (Optional) Clear localStorage state ---
@@ -1628,9 +1652,12 @@ export class KTDataTable<T extends KTDataTableDataInterface>
1628
1652
  // this._deleteState();
1629
1653
  }
1630
1654
 
1631
- private _debounce(func: Function, wait: number) {
1655
+ private _debounce<TArgs extends unknown[]>(
1656
+ func: (...args: TArgs) => void,
1657
+ wait: number,
1658
+ ): (...args: TArgs) => void {
1632
1659
  let timeout: number | undefined;
1633
- return function (...args: any[]) {
1660
+ return function (...args: TArgs) {
1634
1661
  const later = () => {
1635
1662
  clearTimeout(timeout);
1636
1663
  func(...args);
@@ -1837,7 +1864,7 @@ export class KTDataTable<T extends KTDataTableDataInterface>
1837
1864
  }
1838
1865
 
1839
1866
  // Fallback to element's instance property (for manually created instances)
1840
- return (element as any).instance;
1867
+ return KTDataTable.asElementWithInstance(element).instance;
1841
1868
  }
1842
1869
 
1843
1870
  /**
@@ -3,11 +3,13 @@
3
3
  * Copyright 2025 by Keenthemes Inc
4
4
  */
5
5
 
6
+ import { KTOptionType } from '../../types';
7
+
6
8
  // Define the sort order and filter criteria types
7
9
  export type KTDataTableSortOrderInterface = 'asc' | 'desc' | '';
8
10
 
9
11
  export interface KTDataTableDataInterface {
10
- [key: string]: string | number | boolean | object;
12
+ [key: string]: KTOptionType;
11
13
  }
12
14
 
13
15
  export interface KTDataTableAttributeInterface {
@@ -448,8 +448,6 @@ export class KTDrawer extends KTComponent implements KTDrawerInterface {
448
448
  if (!drawerElement) {
449
449
  // If element is a toggle button and drawer element wasn't found, return null
450
450
  // The handleToggle() will handle waiting for the element to appear
451
- if (element.hasAttribute('data-kt-drawer-toggle')) {
452
- }
453
451
  return null;
454
452
  }
455
453
 
@@ -485,10 +483,8 @@ export class KTDrawer extends KTComponent implements KTDrawerInterface {
485
483
 
486
484
  public static handleResize(): void {
487
485
  window.addEventListener('resize', () => {
488
- let timer;
489
-
490
486
  KTUtils.throttle(
491
- timer,
487
+ undefined,
492
488
  () => {
493
489
  document
494
490
  .querySelectorAll('[data-kt-drawer-initialized]')
@@ -512,8 +508,7 @@ export class KTDrawer extends KTComponent implements KTDrawerInterface {
512
508
  'click',
513
509
  (rawEvent: MouseEvent) => {
514
510
  const target = rawEvent.target as HTMLElement;
515
- if (target && target.hasAttribute('data-kt-drawer-toggle')) {
516
- }
511
+ void (target && target.hasAttribute('data-kt-drawer-toggle'));
517
512
  },
518
513
  true,
519
514
  ); // Use capture phase to catch before any stopPropagation
@@ -534,15 +529,6 @@ export class KTDrawer extends KTComponent implements KTDrawerInterface {
534
529
  if (drawer) {
535
530
  drawer.toggle(target);
536
531
  } else {
537
- // Drawer element not found - wait for it to appear (handles persisted Livewire components)
538
- // Check if drawer exists in persisted components (might be in header that's persisted)
539
- const persistedHeader =
540
- document.querySelector('[wire\\:id]')?.closest('[wire\\:id]') ||
541
- document.querySelector('header#header');
542
- const drawerInPersisted = persistedHeader
543
- ? persistedHeader.querySelector(selector)
544
- : null;
545
-
546
532
  // Wait longer for persisted components that may take time to render
547
533
  // Also check if drawer exists in persisted header component
548
534
  KTDrawer.waitForElement(selector, 5000).then((drawerElement) => {
@@ -706,11 +692,10 @@ export class KTDrawer extends KTComponent implements KTDrawerInterface {
706
692
  instance.hide(); // This will clean up backdrop and state
707
693
  }
708
694
  // Clear KTData entries
709
- const hadDrawer = KTData.has(element as HTMLElement, 'drawer');
710
695
  KTData.remove(element as HTMLElement, 'drawer');
711
696
  // Remove initialization attribute to allow fresh initialization
712
697
  element.removeAttribute('data-kt-drawer-initialized');
713
- } catch (e) {
698
+ } catch {
714
699
  // Ignore errors for individual elements
715
700
  }
716
701
  });
@@ -120,7 +120,7 @@ export class KTDropdown extends KTComponent implements KTDropdownInterface {
120
120
  this._toggle();
121
121
  }
122
122
 
123
- protected _mouseover(event: MouseEvent): void {
123
+ protected _mouseover(_event: MouseEvent): void {
124
124
  if (this._disabled) return;
125
125
 
126
126
  if (this._getOption('trigger') !== 'hover') return;
@@ -244,7 +244,6 @@ export class KTDropdown extends KTComponent implements KTDropdownInterface {
244
244
  }
245
245
 
246
246
  protected _initPopper(): void {
247
- const isRtl = KTDom.isRTL();
248
247
  let reference: HTMLElement;
249
248
  const attach = this._getOption('attach') as string;
250
249
 
@@ -607,7 +606,7 @@ export class KTDropdown extends KTComponent implements KTDropdownInterface {
607
606
  if (menu) {
608
607
  KTData.remove(menu as HTMLElement, 'dropdownElement');
609
608
  }
610
- } catch (e) {
609
+ } catch {
611
610
  // Ignore errors for individual elements
612
611
  }
613
612
  });