@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,659 @@
1
+ /**
2
+ * Tests for KTRangeSlider component
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
6
+ import { KTRangeSlider } from '../range-slider';
7
+
8
+ describe('KTRangeSlider', () => {
9
+ let container: HTMLElement;
10
+
11
+ beforeEach(() => {
12
+ document.body.innerHTML = '';
13
+ container = document.createElement('div');
14
+ container.id = 'test-container';
15
+ document.body.appendChild(container);
16
+ });
17
+
18
+ afterEach(() => {
19
+ document.body.innerHTML = '';
20
+ });
21
+
22
+ describe('initialization', () => {
23
+ it('initializes on wrapper with nested range input', () => {
24
+ const wrap = document.createElement('div');
25
+ wrap.setAttribute('data-kt-range-slider', 'true');
26
+ const input = document.createElement('input');
27
+ input.type = 'range';
28
+ input.min = '0';
29
+ input.max = '100';
30
+ input.value = '40';
31
+ wrap.appendChild(input);
32
+ container.appendChild(wrap);
33
+
34
+ const instance = new KTRangeSlider(wrap);
35
+ expect(instance.getElement()).toBe(wrap);
36
+ expect(instance.getRangeInput()).toBe(input);
37
+ expect(instance.getValue()).toBe(40);
38
+ instance.dispose();
39
+ });
40
+
41
+ it('initializes on the range input root', () => {
42
+ const input = document.createElement('input');
43
+ input.type = 'range';
44
+ input.setAttribute('data-kt-range-slider', 'true');
45
+ input.min = '0';
46
+ input.max = '50';
47
+ input.value = '25';
48
+ container.appendChild(input);
49
+
50
+ const instance = new KTRangeSlider(input);
51
+ expect(instance.getElement()).toBe(input);
52
+ expect(instance.getRangeInput()).toBe(input);
53
+ instance.dispose();
54
+ });
55
+
56
+ it('binds to the first range input when multiple exist', () => {
57
+ const wrap = document.createElement('div');
58
+ wrap.setAttribute('data-kt-range-slider', 'true');
59
+ const a = document.createElement('input');
60
+ a.type = 'range';
61
+ a.value = '10';
62
+ const b = document.createElement('input');
63
+ b.type = 'range';
64
+ b.value = '20';
65
+ wrap.appendChild(a);
66
+ wrap.appendChild(b);
67
+ container.appendChild(wrap);
68
+
69
+ const instance = new KTRangeSlider(wrap);
70
+ expect(instance.getRangeInput()).toBe(a);
71
+ instance.dispose();
72
+ });
73
+
74
+ it('does not initialize without a range input', () => {
75
+ const wrap = document.createElement('div');
76
+ wrap.setAttribute('data-kt-range-slider', 'true');
77
+ container.appendChild(wrap);
78
+ const instance = new KTRangeSlider(wrap);
79
+ expect(instance.getElement()).toBeNull();
80
+ expect(instance.getRangeInput()).toBeNull();
81
+ });
82
+ });
83
+
84
+ describe('output binding', () => {
85
+ it('updates output element text on input', () => {
86
+ const wrap = document.createElement('div');
87
+ wrap.setAttribute('data-kt-range-slider', 'true');
88
+ wrap.setAttribute('data-kt-range-slider-output', '.rs-out');
89
+ const out = document.createElement('span');
90
+ out.className = 'rs-out';
91
+ wrap.appendChild(out);
92
+ const input = document.createElement('input');
93
+ input.type = 'range';
94
+ input.min = '0';
95
+ input.max = '100';
96
+ input.value = '30';
97
+ wrap.appendChild(input);
98
+ container.appendChild(wrap);
99
+
100
+ const instance = new KTRangeSlider(wrap);
101
+ expect(out.textContent).toBe('30');
102
+
103
+ input.value = '72';
104
+ input.dispatchEvent(new Event('input', { bubbles: true }));
105
+ expect(out.textContent).toBe('72');
106
+ instance.dispose();
107
+ });
108
+
109
+ it('still updates output if the native range input is replaced', () => {
110
+ const wrap = document.createElement('div');
111
+ wrap.setAttribute('data-kt-range-slider', 'true');
112
+ wrap.setAttribute('data-kt-range-slider-output', '.rs-out');
113
+
114
+ const out = document.createElement('span');
115
+ out.className = 'rs-out';
116
+ wrap.appendChild(out);
117
+
118
+ const input1 = document.createElement('input');
119
+ input1.type = 'range';
120
+ input1.min = '0';
121
+ input1.max = '100';
122
+ input1.value = '30';
123
+ wrap.appendChild(input1);
124
+ container.appendChild(wrap);
125
+
126
+ const instance = new KTRangeSlider(wrap);
127
+ expect(out.textContent).toBe('30');
128
+
129
+ // Simulate a preview re-render replacing the native input.
130
+ wrap.removeChild(input1);
131
+ const input2 = document.createElement('input');
132
+ input2.type = 'range';
133
+ input2.min = '0';
134
+ input2.max = '100';
135
+ input2.value = '45';
136
+ wrap.appendChild(input2);
137
+
138
+ input2.value = '55';
139
+ input2.dispatchEvent(new Event('input', { bubbles: true }));
140
+ expect(out.textContent).toBe('55');
141
+
142
+ instance.dispose();
143
+ });
144
+
145
+ it('trims and binds output selector within the root', () => {
146
+ const wrap = document.createElement('div');
147
+ wrap.setAttribute('data-kt-range-slider', 'true');
148
+ wrap.setAttribute('data-kt-range-slider-output', ' .rs-out ');
149
+
150
+ const out = document.createElement('span');
151
+ out.className = 'rs-out';
152
+ wrap.appendChild(out);
153
+
154
+ const input = document.createElement('input');
155
+ input.type = 'range';
156
+ input.min = '0';
157
+ input.max = '100';
158
+ input.value = '20';
159
+ wrap.appendChild(input);
160
+ container.appendChild(wrap);
161
+
162
+ const instance = new KTRangeSlider(wrap);
163
+ expect(out.textContent).toBe('20');
164
+
165
+ input.value = '33';
166
+ input.dispatchEvent(new Event('input', { bubbles: true }));
167
+ expect(out.textContent).toBe('33');
168
+
169
+ instance.dispose();
170
+ });
171
+
172
+ it('falls back to document query for the output selector', () => {
173
+ const wrap = document.createElement('div');
174
+ wrap.setAttribute('data-kt-range-slider', 'true');
175
+ wrap.setAttribute('data-kt-range-slider-output', '.rs-doc-out');
176
+
177
+ // Not inside the wrapper; should be resolved via document.querySelector.
178
+ const out = document.createElement('span');
179
+ out.className = 'rs-doc-out';
180
+ document.body.appendChild(out);
181
+
182
+ const input = document.createElement('input');
183
+ input.type = 'range';
184
+ input.min = '0';
185
+ input.max = '100';
186
+ input.value = '30';
187
+ wrap.appendChild(input);
188
+ container.appendChild(wrap);
189
+
190
+ const instance = new KTRangeSlider(wrap);
191
+ expect(out.textContent).toBe('30');
192
+
193
+ input.value = '90';
194
+ input.dispatchEvent(new Event('input', { bubbles: true }));
195
+ expect(out.textContent).toBe('90');
196
+
197
+ instance.dispose();
198
+ });
199
+
200
+ it('still updates track fill even when output selector does not resolve', () => {
201
+ const wrap = document.createElement('div');
202
+ wrap.setAttribute('data-kt-range-slider', 'true');
203
+ wrap.setAttribute('data-kt-range-slider-output', '.does-not-exist');
204
+
205
+ const input = document.createElement('input');
206
+ input.type = 'range';
207
+ input.min = '0';
208
+ input.max = '100';
209
+ input.value = '40';
210
+ wrap.appendChild(input);
211
+ container.appendChild(wrap);
212
+
213
+ const instance = new KTRangeSlider(wrap);
214
+ expect(wrap.style.getPropertyValue('--kt-range-fill').trim()).toBe('0.4');
215
+
216
+ input.value = '100';
217
+ input.dispatchEvent(new Event('input', { bubbles: true }));
218
+ expect(wrap.style.getPropertyValue('--kt-range-fill').trim()).toBe('1');
219
+
220
+ instance.dispose();
221
+ });
222
+
223
+ it('ignores bubbled input events coming from non-range inputs', () => {
224
+ const wrap = document.createElement('div');
225
+ wrap.setAttribute('data-kt-range-slider', 'true');
226
+ wrap.setAttribute('data-kt-range-slider-output', '.rs-out');
227
+
228
+ const out = document.createElement('span');
229
+ out.className = 'rs-out';
230
+ wrap.appendChild(out);
231
+
232
+ const range = document.createElement('input');
233
+ range.type = 'range';
234
+ range.min = '0';
235
+ range.max = '100';
236
+ range.value = '25';
237
+ wrap.appendChild(range);
238
+
239
+ const text = document.createElement('input');
240
+ text.type = 'text';
241
+ text.value = 'hello';
242
+ wrap.appendChild(text);
243
+
244
+ container.appendChild(wrap);
245
+
246
+ const instance = new KTRangeSlider(wrap);
247
+ expect(out.textContent).toBe('25');
248
+
249
+ // Event bubbles to wrapper, but should be ignored by handler because target isn't range.
250
+ text.dispatchEvent(new Event('input', { bubbles: true }));
251
+ expect(out.textContent).toBe('25');
252
+
253
+ instance.dispose();
254
+ });
255
+ });
256
+
257
+ describe('events', () => {
258
+ it('includes native step in kt.range-slider.input detail when step is numeric', () => {
259
+ const wrap = document.createElement('div');
260
+ wrap.setAttribute('data-kt-range-slider', 'true');
261
+ const input = document.createElement('input');
262
+ input.type = 'range';
263
+ input.min = '0';
264
+ input.max = '100';
265
+ input.step = '5';
266
+ input.value = '40';
267
+ wrap.appendChild(input);
268
+ container.appendChild(wrap);
269
+
270
+ const instance = new KTRangeSlider(wrap);
271
+ const spy = vi.fn();
272
+ wrap.addEventListener('kt.range-slider.input', spy);
273
+
274
+ input.dispatchEvent(new Event('input', { bubbles: true }));
275
+ expect(spy).toHaveBeenCalledTimes(1);
276
+ expect(spy.mock.calls[0][0].detail.payload).toMatchObject({
277
+ value: 40,
278
+ min: 0,
279
+ max: 100,
280
+ step: 5,
281
+ });
282
+
283
+ instance.dispose();
284
+ });
285
+
286
+ it('omits step in kt.range-slider.input payload when step="any"', () => {
287
+ const wrap = document.createElement('div');
288
+ wrap.setAttribute('data-kt-range-slider', 'true');
289
+
290
+ const input = document.createElement('input');
291
+ input.type = 'range';
292
+ input.min = '0';
293
+ input.max = '100';
294
+ input.step = 'any';
295
+ input.value = '40';
296
+ wrap.appendChild(input);
297
+ container.appendChild(wrap);
298
+
299
+ new KTRangeSlider(wrap);
300
+ const spy = vi.fn();
301
+ wrap.addEventListener('kt.range-slider.input', spy);
302
+
303
+ input.dispatchEvent(new Event('input', { bubbles: true }));
304
+ const payload = spy.mock.calls[0][0].detail.payload as Record<
305
+ string,
306
+ unknown
307
+ >;
308
+
309
+ expect(payload).toMatchObject({ value: 40, min: 0, max: 100 });
310
+ expect(payload).not.toHaveProperty('step');
311
+ });
312
+
313
+ it('defaults step to 1 when step attribute is empty', () => {
314
+ const wrap = document.createElement('div');
315
+ wrap.setAttribute('data-kt-range-slider', 'true');
316
+
317
+ const input = document.createElement('input');
318
+ input.type = 'range';
319
+ input.min = '0';
320
+ input.max = '100';
321
+ input.setAttribute('step', '');
322
+ input.value = '40';
323
+ wrap.appendChild(input);
324
+ container.appendChild(wrap);
325
+
326
+ new KTRangeSlider(wrap);
327
+ const spy = vi.fn();
328
+ wrap.addEventListener('kt.range-slider.input', spy);
329
+
330
+ input.dispatchEvent(new Event('input', { bubbles: true }));
331
+ expect(spy.mock.calls[0][0].detail.payload).toMatchObject({
332
+ value: 40,
333
+ min: 0,
334
+ max: 100,
335
+ step: 1,
336
+ });
337
+ });
338
+
339
+ it('defaults step to 1 when step attribute is invalid', () => {
340
+ const wrap = document.createElement('div');
341
+ wrap.setAttribute('data-kt-range-slider', 'true');
342
+
343
+ const input = document.createElement('input');
344
+ input.type = 'range';
345
+ input.min = '0';
346
+ input.max = '100';
347
+ input.step = '-2';
348
+ input.value = '40';
349
+ wrap.appendChild(input);
350
+ container.appendChild(wrap);
351
+
352
+ new KTRangeSlider(wrap);
353
+ const spy = vi.fn();
354
+ wrap.addEventListener('kt.range-slider.input', spy);
355
+
356
+ input.dispatchEvent(new Event('input', { bubbles: true }));
357
+ expect(spy.mock.calls[0][0].detail.payload).toMatchObject({
358
+ step: 1,
359
+ });
360
+ });
361
+
362
+ it('dispatches kt.range-slider.change on native change', () => {
363
+ const wrap = document.createElement('div');
364
+ wrap.setAttribute('data-kt-range-slider', 'true');
365
+
366
+ const input = document.createElement('input');
367
+ input.type = 'range';
368
+ input.min = '0';
369
+ input.max = '100';
370
+ input.value = '10';
371
+ wrap.appendChild(input);
372
+ container.appendChild(wrap);
373
+
374
+ new KTRangeSlider(wrap);
375
+ const spy = vi.fn();
376
+ wrap.addEventListener('kt.range-slider.change', spy);
377
+
378
+ input.value = '55';
379
+ input.dispatchEvent(new Event('change', { bubbles: true }));
380
+ expect(spy).toHaveBeenCalledTimes(1);
381
+ expect(spy.mock.calls[0][0].detail.payload).toMatchObject({
382
+ value: 55,
383
+ });
384
+ });
385
+ });
386
+
387
+ describe('fill CSS variable', () => {
388
+ it('sets --kt-range-fill on the root from value', () => {
389
+ const wrap = document.createElement('div');
390
+ wrap.setAttribute('data-kt-range-slider', 'true');
391
+ const input = document.createElement('input');
392
+ input.type = 'range';
393
+ input.min = '0';
394
+ input.max = '100';
395
+ input.value = '25';
396
+ wrap.appendChild(input);
397
+ container.appendChild(wrap);
398
+
399
+ const instance = new KTRangeSlider(wrap);
400
+ expect(wrap.style.getPropertyValue('--kt-range-fill').trim()).toBe(
401
+ '0.25',
402
+ );
403
+
404
+ input.value = '100';
405
+ input.dispatchEvent(new Event('input', { bubbles: true }));
406
+ expect(wrap.style.getPropertyValue('--kt-range-fill').trim()).toBe('1');
407
+ instance.dispose();
408
+ });
409
+
410
+ it('defaults numeric min/max when attributes are invalid', () => {
411
+ const wrap = document.createElement('div');
412
+ wrap.setAttribute('data-kt-range-slider', 'true');
413
+
414
+ const input = document.createElement('input');
415
+ input.type = 'range';
416
+ input.min = 'not-a-number';
417
+ input.max = 'also-not-a-number';
418
+ input.value = '30';
419
+ wrap.appendChild(input);
420
+ container.appendChild(wrap);
421
+
422
+ new KTRangeSlider(wrap);
423
+ // ratio = (30 - 0) / (100 - 0) = 0.3
424
+ expect(wrap.style.getPropertyValue('--kt-range-fill').trim()).toBe('0.3');
425
+ });
426
+
427
+ it('sets fill ratio to 0 when max equals min', () => {
428
+ const wrap = document.createElement('div');
429
+ wrap.setAttribute('data-kt-range-slider', 'true');
430
+
431
+ const input = document.createElement('input');
432
+ input.type = 'range';
433
+ input.min = '50';
434
+ input.max = '50';
435
+ input.value = '50';
436
+ wrap.appendChild(input);
437
+ container.appendChild(wrap);
438
+
439
+ new KTRangeSlider(wrap);
440
+ expect(wrap.style.getPropertyValue('--kt-range-fill').trim()).toBe('0');
441
+ });
442
+
443
+ it('handles max<min path via _clamp branch', () => {
444
+ const wrap = document.createElement('div');
445
+ wrap.setAttribute('data-kt-range-slider', 'true');
446
+
447
+ const input = document.createElement('input');
448
+ input.type = 'range';
449
+ input.min = '10';
450
+ input.max = '0';
451
+ input.value = '5';
452
+ wrap.appendChild(input);
453
+ container.appendChild(wrap);
454
+
455
+ const instance = new KTRangeSlider(wrap);
456
+
457
+ const min = parseFloat(input.min);
458
+ const max = parseFloat(input.max);
459
+ const value = instance.getValue();
460
+
461
+ const clamped = max < min ? value : Math.min(max, Math.max(min, value));
462
+ const ratio = max === min ? 0 : (clamped - min) / (max - min);
463
+
464
+ expect(wrap.style.getPropertyValue('--kt-range-fill').trim()).toBe(
465
+ String(ratio),
466
+ );
467
+ });
468
+ });
469
+
470
+ describe('dispose', () => {
471
+ it('removes listeners and clears data', () => {
472
+ const wrap = document.createElement('div');
473
+ wrap.setAttribute('data-kt-range-slider', 'true');
474
+ const input = document.createElement('input');
475
+ input.type = 'range';
476
+ input.min = '0';
477
+ input.max = '100';
478
+ input.value = '50';
479
+ wrap.appendChild(input);
480
+ container.appendChild(wrap);
481
+
482
+ const instance = new KTRangeSlider(wrap);
483
+ const spy = vi.fn();
484
+ wrap.addEventListener('kt.range-slider.input', spy);
485
+
486
+ instance.dispose();
487
+ expect(KTRangeSlider.getInstance(wrap)).toBeNull();
488
+
489
+ input.value = '80';
490
+ input.dispatchEvent(new Event('input', { bubbles: true }));
491
+ expect(spy).not.toHaveBeenCalled();
492
+ });
493
+ });
494
+
495
+ describe('createInstances', () => {
496
+ it('respects data-kt-range-slider-lazy', () => {
497
+ const wrap = document.createElement('div');
498
+ wrap.setAttribute('data-kt-range-slider', 'true');
499
+ wrap.setAttribute('data-kt-range-slider-lazy', 'true');
500
+
501
+ const input = document.createElement('input');
502
+ input.type = 'range';
503
+ input.min = '0';
504
+ input.max = '100';
505
+ input.value = '20';
506
+ wrap.appendChild(input);
507
+ container.appendChild(wrap);
508
+
509
+ KTRangeSlider.createInstances();
510
+ expect(KTRangeSlider.getInstance(wrap)).toBeNull();
511
+ });
512
+
513
+ it('is idempotent for the same root', () => {
514
+ const wrap = document.createElement('div');
515
+ wrap.setAttribute('data-kt-range-slider', 'true');
516
+ const input = document.createElement('input');
517
+ input.type = 'range';
518
+ wrap.appendChild(input);
519
+ container.appendChild(wrap);
520
+
521
+ KTRangeSlider.createInstances();
522
+ const a = KTRangeSlider.getInstance(wrap);
523
+ KTRangeSlider.createInstances();
524
+ const b = KTRangeSlider.getInstance(wrap);
525
+ expect(a).toBe(b);
526
+ a?.dispose();
527
+ });
528
+
529
+ it('constructor does not re-init an already-connected instance', () => {
530
+ const wrap = document.createElement('div');
531
+ wrap.setAttribute('data-kt-range-slider', 'true');
532
+
533
+ const input = document.createElement('input');
534
+ input.type = 'range';
535
+ input.min = '0';
536
+ input.max = '100';
537
+ input.value = '20';
538
+ wrap.appendChild(input);
539
+ container.appendChild(wrap);
540
+
541
+ const instance1 = new KTRangeSlider(wrap);
542
+ const a = KTRangeSlider.getInstance(wrap);
543
+ // Second constructor call should not create a second instance.
544
+ new KTRangeSlider(wrap);
545
+ const b = KTRangeSlider.getInstance(wrap);
546
+
547
+ expect(a).toBe(b);
548
+ expect(a).not.toBeNull();
549
+
550
+ instance1?.dispose?.();
551
+ });
552
+ });
553
+
554
+ describe('static helpers', () => {
555
+ it('getInstance returns null for empty element input', () => {
556
+ expect(
557
+ KTRangeSlider.getInstance(null as unknown as HTMLElement),
558
+ ).toBeNull();
559
+ });
560
+
561
+ it('getOrCreateInstance returns null when no range input exists', () => {
562
+ const wrap = document.createElement('div');
563
+ wrap.setAttribute('data-kt-range-slider', 'true');
564
+ container.appendChild(wrap);
565
+
566
+ expect(KTRangeSlider.getOrCreateInstance(wrap)).toBeNull();
567
+ });
568
+
569
+ it('getOrCreateInstance creates when range input exists and no instance yet', () => {
570
+ const wrap = document.createElement('div');
571
+ wrap.setAttribute('data-kt-range-slider', 'true');
572
+ container.appendChild(wrap);
573
+
574
+ const input = document.createElement('input');
575
+ input.type = 'range';
576
+ input.min = '0';
577
+ input.max = '100';
578
+ input.value = '20';
579
+ wrap.appendChild(input);
580
+
581
+ const instance = KTRangeSlider.getOrCreateInstance(wrap);
582
+ expect(instance).not.toBeNull();
583
+ expect(KTRangeSlider.getInstance(wrap)).toBe(instance);
584
+
585
+ instance?.dispose();
586
+ });
587
+
588
+ it('getOrCreateInstance returns existing instance when already initialized', () => {
589
+ const wrap = document.createElement('div');
590
+ wrap.setAttribute('data-kt-range-slider', 'true');
591
+ container.appendChild(wrap);
592
+
593
+ const input = document.createElement('input');
594
+ input.type = 'range';
595
+ wrap.appendChild(input);
596
+
597
+ const first = new KTRangeSlider(wrap);
598
+ const second = KTRangeSlider.getOrCreateInstance(wrap);
599
+ expect(second).toBe(first);
600
+ first.dispose();
601
+ });
602
+ });
603
+
604
+ describe('config + init', () => {
605
+ it('supports output selector from config object', () => {
606
+ const wrap = document.createElement('div');
607
+ const out = document.createElement('span');
608
+ out.className = 'cfg-out';
609
+ wrap.appendChild(out);
610
+
611
+ const input = document.createElement('input');
612
+ input.type = 'range';
613
+ input.min = '0';
614
+ input.max = '100';
615
+ input.value = '25';
616
+ wrap.appendChild(input);
617
+ container.appendChild(wrap);
618
+
619
+ const instance = new KTRangeSlider(wrap, { output: '.cfg-out' });
620
+ expect(out.textContent).toBe('25');
621
+
622
+ input.value = '60';
623
+ input.dispatchEvent(new Event('input', { bubbles: true }));
624
+ expect(out.textContent).toBe('60');
625
+ instance.dispose();
626
+ });
627
+
628
+ it('init() initializes eligible slider roots', () => {
629
+ const wrap = document.createElement('div');
630
+ wrap.setAttribute('data-kt-range-slider', 'true');
631
+ const input = document.createElement('input');
632
+ input.type = 'range';
633
+ wrap.appendChild(input);
634
+ container.appendChild(wrap);
635
+
636
+ KTRangeSlider.init();
637
+ expect(KTRangeSlider.getInstance(wrap)).not.toBeNull();
638
+ });
639
+
640
+ it('reinitializes after element is disconnected then reattached', () => {
641
+ const wrap = document.createElement('div');
642
+ wrap.setAttribute('data-kt-range-slider', 'true');
643
+ const input = document.createElement('input');
644
+ input.type = 'range';
645
+ wrap.appendChild(input);
646
+ container.appendChild(wrap);
647
+
648
+ const first = new KTRangeSlider(wrap);
649
+ container.removeChild(wrap);
650
+ // disconnected element with previous instance should not be skipped
651
+ const second = new KTRangeSlider(wrap);
652
+ container.appendChild(wrap);
653
+
654
+ expect(second.getElement()).toBe(wrap);
655
+ expect(second).not.toBe(first);
656
+ second.dispose();
657
+ });
658
+ });
659
+ });
@@ -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 { KTRangeSlider } from './range-slider';
7
+ export type {
8
+ KTRangeSliderConfigInterface,
9
+ KTRangeSliderEventPayloadInterface,
10
+ KTRangeSliderInterface,
11
+ } from './types';