@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,276 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ */
5
+
6
+ import KTData from '../../helpers/data';
7
+ import KTComponent from '../component';
8
+ import {
9
+ KTRangeSliderConfigInterface,
10
+ KTRangeSliderEventPayloadInterface,
11
+ KTRangeSliderInterface,
12
+ } from './types';
13
+
14
+ declare global {
15
+ interface Window {
16
+ KTRangeSlider: typeof KTRangeSlider;
17
+ }
18
+ }
19
+
20
+ const FILL_VAR = '--kt-range-fill';
21
+
22
+ export class KTRangeSlider
23
+ extends KTComponent
24
+ implements KTRangeSliderInterface
25
+ {
26
+ protected override _name: string = 'range-slider';
27
+ protected override _defaultConfig: KTRangeSliderConfigInterface = {
28
+ output: '',
29
+ lazy: false,
30
+ };
31
+ protected override _config: KTRangeSliderConfigInterface =
32
+ this._defaultConfig;
33
+ protected _rangeInput: HTMLInputElement | null = null;
34
+ protected _onNativeInput: ((e: Event) => void) | null = null;
35
+ protected _onNativeChange: ((e: Event) => void) | null = null;
36
+
37
+ constructor(
38
+ element: HTMLElement,
39
+ config: KTRangeSliderConfigInterface | null = null,
40
+ ) {
41
+ super();
42
+
43
+ const input = KTRangeSlider.findRangeInput(element);
44
+ if (!input) {
45
+ return;
46
+ }
47
+
48
+ if (this._shouldSkipInit(element)) {
49
+ return;
50
+ }
51
+
52
+ this._rangeInput = input;
53
+ this._init(element);
54
+ this._buildConfig(config);
55
+
56
+ this._onNativeInput = this._handleNativeInput.bind(this);
57
+ this._onNativeChange = this._handleNativeChange.bind(this);
58
+ // Delegate events to the root so we keep working if the preview
59
+ // re-renders and replaces the native range input element.
60
+ this._element?.addEventListener('input', this._onNativeInput);
61
+ this._element?.addEventListener('change', this._onNativeChange);
62
+
63
+ this._syncFromInput();
64
+ }
65
+
66
+ private static findRangeInput(root: HTMLElement): HTMLInputElement | null {
67
+ if (root instanceof HTMLInputElement && root.type === 'range') {
68
+ return root;
69
+ }
70
+ return root.querySelector<HTMLInputElement>('input[type="range"]');
71
+ }
72
+
73
+ protected _getOutputSelector(): string {
74
+ const raw = this._getOption('output');
75
+ return typeof raw === 'string' ? raw.trim() : '';
76
+ }
77
+
78
+ protected _resolveOutputElement(): HTMLElement | null {
79
+ const selector = this._getOutputSelector();
80
+ if (!selector || !this._element) {
81
+ return null;
82
+ }
83
+ const fromRoot = this._element.querySelector<HTMLElement>(selector);
84
+ if (fromRoot) {
85
+ return fromRoot;
86
+ }
87
+ return document.querySelector<HTMLElement>(selector);
88
+ }
89
+
90
+ protected _getNumericMin(): number {
91
+ const input = this._rangeInput;
92
+ if (!input) return 0;
93
+ const n =
94
+ typeof input.min === 'string' && input.min !== ''
95
+ ? parseFloat(input.min)
96
+ : 0;
97
+ return Number.isFinite(n) ? n : 0;
98
+ }
99
+
100
+ protected _getNumericMax(): number {
101
+ const input = this._rangeInput;
102
+ if (!input) return 100;
103
+ if (typeof input.max === 'string' && input.max !== '') {
104
+ const n = parseFloat(input.max);
105
+ if (Number.isFinite(n)) return n;
106
+ }
107
+ return 100;
108
+ }
109
+
110
+ /** Reflects `step` for events; `undefined` when `step="any"`. */
111
+ protected _getStepForPayload(): number | undefined {
112
+ const input = this._rangeInput;
113
+ if (!input) return undefined;
114
+ const raw = input.getAttribute('step');
115
+ if (raw === 'any') return undefined;
116
+ if (raw === null || raw === '') return 1;
117
+ const n = parseFloat(raw);
118
+ return Number.isFinite(n) && n > 0 ? n : 1;
119
+ }
120
+
121
+ protected _getCurrentValue(): number {
122
+ const input = this._rangeInput;
123
+ if (!input) return 0;
124
+ const v =
125
+ typeof input.valueAsNumber === 'number' &&
126
+ !Number.isNaN(input.valueAsNumber)
127
+ ? input.valueAsNumber
128
+ : parseFloat(input.value);
129
+ return Number.isFinite(v) ? v : 0;
130
+ }
131
+
132
+ protected _clamp(value: number, min: number, max: number): number {
133
+ if (max < min) {
134
+ return value;
135
+ }
136
+ return Math.min(max, Math.max(min, value));
137
+ }
138
+
139
+ protected _fillRatio(value: number, min: number, max: number): number {
140
+ if (max === min) {
141
+ return 0;
142
+ }
143
+ return (this._clamp(value, min, max) - min) / (max - min);
144
+ }
145
+
146
+ protected _buildEventPayload(): KTRangeSliderEventPayloadInterface {
147
+ const min = this._getNumericMin();
148
+ const max = this._getNumericMax();
149
+ const value = this._getCurrentValue();
150
+ const step = this._getStepForPayload();
151
+ return {
152
+ value,
153
+ min,
154
+ max,
155
+ ...(step !== undefined ? { step } : {}),
156
+ };
157
+ }
158
+
159
+ protected _syncFromInput(): void {
160
+ if (!this._element || !this._rangeInput) {
161
+ return;
162
+ }
163
+
164
+ const min = this._getNumericMin();
165
+ const max = this._getNumericMax();
166
+ const value = this._getCurrentValue();
167
+ const ratio = this._fillRatio(value, min, max);
168
+
169
+ this._element.style.setProperty(FILL_VAR, String(ratio));
170
+
171
+ const out = this._resolveOutputElement();
172
+ if (out) {
173
+ out.textContent = String(this._rangeInput.value);
174
+ }
175
+ }
176
+
177
+ protected _handleNativeInput(_event: Event): void {
178
+ const event = _event as Event;
179
+ const target = event.target;
180
+ if (!(target instanceof HTMLInputElement) || target.type !== 'range') {
181
+ return;
182
+ }
183
+
184
+ this._rangeInput = target;
185
+ this._syncFromInput();
186
+
187
+ const payload = this._buildEventPayload();
188
+ this._fireEvent('input', payload);
189
+ this._dispatchEvent('kt.range-slider.input', payload);
190
+ }
191
+
192
+ protected _handleNativeChange(_event: Event): void {
193
+ const event = _event as Event;
194
+ const target = event.target;
195
+ if (!(target instanceof HTMLInputElement) || target.type !== 'range') {
196
+ return;
197
+ }
198
+
199
+ this._rangeInput = target;
200
+ this._syncFromInput();
201
+
202
+ const payload = this._buildEventPayload();
203
+ this._fireEvent('change', payload);
204
+ this._dispatchEvent('kt.range-slider.change', payload);
205
+ }
206
+
207
+ public getRangeInput(): HTMLInputElement | null {
208
+ return this._rangeInput;
209
+ }
210
+
211
+ public getValue(): number {
212
+ return this._getCurrentValue();
213
+ }
214
+
215
+ public override dispose(): void {
216
+ if (this._element) {
217
+ if (this._onNativeInput) {
218
+ this._element.removeEventListener('input', this._onNativeInput);
219
+ }
220
+ if (this._onNativeChange) {
221
+ this._element.removeEventListener('change', this._onNativeChange);
222
+ }
223
+ }
224
+ this._onNativeInput = null;
225
+ this._onNativeChange = null;
226
+ this._rangeInput = null;
227
+ if (this._element) {
228
+ this._element.style.removeProperty(FILL_VAR);
229
+ }
230
+ super.dispose();
231
+ }
232
+
233
+ public static getInstance(element: HTMLElement): KTRangeSlider | null {
234
+ if (!element) {
235
+ return null;
236
+ }
237
+ if (KTData.has(element, 'range-slider')) {
238
+ return KTData.get(element, 'range-slider') as KTRangeSlider;
239
+ }
240
+ return null;
241
+ }
242
+
243
+ public static getOrCreateInstance(
244
+ element: HTMLElement,
245
+ config?: KTRangeSliderConfigInterface,
246
+ ): KTRangeSlider | null {
247
+ const existing = this.getInstance(element);
248
+ if (existing) {
249
+ return existing;
250
+ }
251
+ if (!this.findRangeInput(element)) {
252
+ return null;
253
+ }
254
+ new KTRangeSlider(element, config ?? undefined);
255
+ return this.getInstance(element);
256
+ }
257
+
258
+ public static createInstances(): void {
259
+ document
260
+ .querySelectorAll<HTMLElement>('[data-kt-range-slider]')
261
+ .forEach((el) => {
262
+ if (el.getAttribute('data-kt-range-slider-lazy') === 'true') {
263
+ return;
264
+ }
265
+ new KTRangeSlider(el);
266
+ });
267
+ }
268
+
269
+ public static init(): void {
270
+ KTRangeSlider.createInstances();
271
+ }
272
+ }
273
+
274
+ if (typeof window !== 'undefined') {
275
+ window.KTRangeSlider = KTRangeSlider;
276
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ */
5
+
6
+ /**
7
+ * Optional CSS selector (document or root-relative) for an element whose text
8
+ * updates with the current range value. Prefer `data-kt-range-slider-output` on the root.
9
+ */
10
+ export interface KTRangeSliderConfigInterface {
11
+ /** Selector for the output element; also read from `data-kt-range-slider-output`. */
12
+ output?: string;
13
+
14
+ /**
15
+ * When true, skip auto-init; use `getInstance` / `new KTRangeSlider(element)` manually.
16
+ */
17
+ lazy?: boolean;
18
+ }
19
+
20
+ export interface KTRangeSliderEventPayloadInterface {
21
+ value: number;
22
+ min: number;
23
+ max: number;
24
+ /** From the input `step` attribute; omitted when `step="any"`. */
25
+ step?: number;
26
+ }
27
+
28
+ export interface KTRangeSliderInterface {
29
+ getOption(name: string): unknown;
30
+ getElement(): HTMLElement;
31
+ getRangeInput(): HTMLInputElement | null;
32
+ getValue(): number;
33
+ on(eventType: string, callback: CallableFunction): string;
34
+ off(eventType: string, eventId: string): void;
35
+ dispose(): void;
36
+ }
@@ -104,7 +104,9 @@ describe('KTRating', () => {
104
104
  const instance = new KTRating(ratingEl);
105
105
  instance.setValue(3);
106
106
  expect(instance.getValue()).toBe(3);
107
- const checked = ratingEl.querySelector<HTMLInputElement>('input[type="radio"]:checked');
107
+ const checked = ratingEl.querySelector<HTMLInputElement>(
108
+ 'input[type="radio"]:checked',
109
+ );
108
110
  expect(checked?.value).toBe('3');
109
111
  instance.dispose();
110
112
  });
@@ -121,8 +123,11 @@ describe('KTRating', () => {
121
123
  it('dispatches kt.rating.change when user selects a value', () => {
122
124
  const instance = new KTRating(ratingEl);
123
125
  const events: CustomEvent[] = [];
124
- ratingEl.addEventListener('kt.rating.change', ((e: CustomEvent) => events.push(e)) as EventListener);
125
- const radio3 = ratingEl.querySelector<HTMLInputElement>('input[type="radio"][value="3"]');
126
+ ratingEl.addEventListener('kt.rating.change', ((e: CustomEvent) =>
127
+ events.push(e)) as EventListener);
128
+ const radio3 = ratingEl.querySelector<HTMLInputElement>(
129
+ 'input[type="radio"][value="3"]',
130
+ );
126
131
  expect(radio3).not.toBeNull();
127
132
  radio3!.checked = true;
128
133
  radio3!.dispatchEvent(new Event('change', { bubbles: true }));
@@ -226,7 +231,9 @@ describe('KTRating', () => {
226
231
  ratingEl.setAttribute('data-kt-rating-value', '2');
227
232
  const instance = new KTRating(ratingEl);
228
233
  expect(instance.getValue()).toBe(2);
229
- const checked = ratingEl.querySelector<HTMLInputElement>('input[type="radio"]:checked');
234
+ const checked = ratingEl.querySelector<HTMLInputElement>(
235
+ 'input[type="radio"]:checked',
236
+ );
230
237
  expect(checked?.value).toBe('2');
231
238
  instance.dispose();
232
239
  });
@@ -4,7 +4,6 @@
4
4
  */
5
5
 
6
6
  import KTData from '../../helpers/data';
7
- import KTDom from '../../helpers/dom';
8
7
  import KTComponent from '../component';
9
8
  import { KTRatingConfigInterface, KTRatingInterface } from './types';
10
9
 
@@ -79,7 +78,8 @@ export class KTRating extends KTComponent implements KTRatingInterface {
79
78
  const svg = `<svg class="shrink-0 size-5" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">${path}</svg>`;
80
79
 
81
80
  const container = document.createElement('div');
82
- container.className = 'kt-rating flex flex-row-reverse justify-end items-center gap-0';
81
+ container.className =
82
+ 'kt-rating flex flex-row-reverse justify-end items-center gap-0';
83
83
  container.setAttribute('role', readonly ? 'img' : 'group');
84
84
  container.setAttribute('aria-label', `Rating: ${value} of ${max}`);
85
85
  if (readonly) {
@@ -141,13 +141,21 @@ export class KTRating extends KTComponent implements KTRatingInterface {
141
141
  'text-muted-foreground/50 dark:text-muted-foreground/50';
142
142
  const filledTokens = filledClass.split(' ');
143
143
  const unfilledTokens = unfilledClass.split(' ');
144
- this._container.querySelectorAll<HTMLElement>('.kt-rating-label').forEach((label) => {
145
- const v = parseInt(label.getAttribute('data-kt-rating-value') || '0', 10);
146
- const filled = v <= (val ?? 0);
147
- label.classList.remove(...filledTokens, ...unfilledTokens);
148
- label.classList.add(...(filled ? filledTokens : unfilledTokens));
149
- });
150
- this._container.setAttribute('aria-valuenow', val != null ? String(val) : '0');
144
+ this._container
145
+ .querySelectorAll<HTMLElement>('.kt-rating-label')
146
+ .forEach((label) => {
147
+ const v = parseInt(
148
+ label.getAttribute('data-kt-rating-value') || '0',
149
+ 10,
150
+ );
151
+ const filled = v <= (val ?? 0);
152
+ label.classList.remove(...filledTokens, ...unfilledTokens);
153
+ label.classList.add(...(filled ? filledTokens : unfilledTokens));
154
+ });
155
+ this._container.setAttribute(
156
+ 'aria-valuenow',
157
+ val != null ? String(val) : '0',
158
+ );
151
159
  this._container.setAttribute('aria-label', `Rating: ${val ?? 0} of ${max}`);
152
160
  }
153
161
 
@@ -189,9 +197,11 @@ export class KTRating extends KTComponent implements KTRatingInterface {
189
197
  this._updateInteractiveDisplay();
190
198
  }
191
199
  } else {
192
- this._container.querySelectorAll<HTMLInputElement>('input[type="radio"]').forEach((r) => {
193
- r.checked = false;
194
- });
200
+ this._container
201
+ .querySelectorAll<HTMLInputElement>('input[type="radio"]')
202
+ .forEach((r) => {
203
+ r.checked = false;
204
+ });
195
205
  this._updateInteractiveDisplay();
196
206
  }
197
207
  }
@@ -2,7 +2,7 @@
2
2
  * Tests for KTRepeater component
3
3
  */
4
4
 
5
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
+ import { describe, it, expect, afterEach } from 'vitest';
6
6
  import { KTRepeater } from '../repeater';
7
7
 
8
8
  function createFixture(options?: {
@@ -150,7 +150,8 @@ describe('KTRepeater', () => {
150
150
  const { trigger } = createFixture();
151
151
  const instance = new KTRepeater(trigger);
152
152
  const events: CustomEvent[] = [];
153
- trigger.addEventListener('add', ((e: Event) => events.push(e as CustomEvent)) as EventListener);
153
+ trigger.addEventListener('add', ((e: Event) =>
154
+ events.push(e as CustomEvent)) as EventListener);
154
155
  instance.add();
155
156
  expect(events.length).toBe(1);
156
157
  expect(events[0].detail?.payload?.element).toBeInstanceOf(HTMLElement);
@@ -160,7 +161,7 @@ describe('KTRepeater', () => {
160
161
 
161
162
  describe('limit', () => {
162
163
  it('does not add more clones when at limit', () => {
163
- const { wrapper, trigger } = createFixture({ limit: 2 });
164
+ const { trigger, wrapper } = createFixture({ limit: 2 });
164
165
  const instance = new KTRepeater(trigger);
165
166
  expect(wrapper.children.length).toBe(1);
166
167
  instance.add();
@@ -173,7 +174,7 @@ describe('KTRepeater', () => {
173
174
  });
174
175
 
175
176
  it('disables trigger when at limit', () => {
176
- const { wrapper, trigger } = createFixture({ limit: 2 });
177
+ const { trigger } = createFixture({ limit: 2 });
177
178
  const instance = new KTRepeater(trigger);
178
179
  expect(trigger.hasAttribute('disabled')).toBe(false);
179
180
  instance.add();
@@ -182,7 +183,10 @@ describe('KTRepeater', () => {
182
183
  });
183
184
 
184
185
  it('re-enables trigger when a clone is removed (delete) and count drops below limit', () => {
185
- const { wrapper, trigger } = createFixture({ limit: 2, withDeleteInTarget: true });
186
+ const { wrapper, trigger } = createFixture({
187
+ limit: 2,
188
+ withDeleteInTarget: true,
189
+ });
186
190
  const instance = new KTRepeater(trigger);
187
191
  instance.add();
188
192
  expect(wrapper.children.length).toBe(2);
@@ -197,7 +201,7 @@ describe('KTRepeater', () => {
197
201
  });
198
202
 
199
203
  it('allows unlimited clones when limit is 0 or omitted', () => {
200
- const { wrapper, trigger } = createFixture();
204
+ const { trigger, wrapper } = createFixture();
201
205
  trigger.removeAttribute('data-kt-repeater-limit');
202
206
  const instance = new KTRepeater(trigger);
203
207
  for (let i = 0; i < 5; i++) instance.add();
@@ -213,7 +217,9 @@ describe('KTRepeater', () => {
213
217
  instance.add();
214
218
  expect(wrapper.children.length).toBe(2);
215
219
  const firstClone = wrapper.children[1];
216
- const deleteBtn = firstClone.querySelector('[data-kt-repeater-delete]') as HTMLElement;
220
+ const deleteBtn = firstClone.querySelector(
221
+ '[data-kt-repeater-delete]',
222
+ ) as HTMLElement;
217
223
  deleteBtn.click();
218
224
  expect(wrapper.children.length).toBe(1);
219
225
  instance.dispose();
@@ -224,7 +230,9 @@ describe('KTRepeater', () => {
224
230
  const instance = new KTRepeater(trigger);
225
231
  expect(wrapper.children.length).toBe(1);
226
232
  const onlyRow = wrapper.children[0];
227
- const deleteBtn = onlyRow.querySelector('[data-kt-repeater-delete]') as HTMLElement;
233
+ const deleteBtn = onlyRow.querySelector(
234
+ '[data-kt-repeater-delete]',
235
+ ) as HTMLElement;
228
236
  deleteBtn.click();
229
237
  expect(wrapper.children.length).toBe(1);
230
238
  instance.dispose();
@@ -233,12 +241,17 @@ describe('KTRepeater', () => {
233
241
 
234
242
  describe('predefined (hidden) template', () => {
235
243
  it('clones from hidden template and appends to wrapper', () => {
236
- const { wrapper, trigger } = createFixture({ hiddenTemplate: true, withInitialChild: false });
244
+ const { wrapper, trigger } = createFixture({
245
+ hiddenTemplate: true,
246
+ withInitialChild: false,
247
+ });
237
248
  expect(wrapper.children.length).toBe(0);
238
249
  const instance = new KTRepeater(trigger);
239
250
  instance.add();
240
251
  expect(wrapper.children.length).toBe(1);
241
- expect(wrapper.querySelector('input[placeholder="Enter Name"]')).not.toBeNull();
252
+ expect(
253
+ wrapper.querySelector('input[placeholder="Enter Name"]'),
254
+ ).not.toBeNull();
242
255
  instance.dispose();
243
256
  });
244
257
  });
@@ -266,7 +279,7 @@ describe('KTRepeater', () => {
266
279
  });
267
280
 
268
281
  it('createInstances initializes all data-kt-repeater elements', () => {
269
- const { container, wrapper, trigger } = createFixture();
282
+ const { container, trigger } = createFixture();
270
283
  const trigger2 = document.createElement('button');
271
284
  trigger2.setAttribute('data-kt-repeater', '');
272
285
  trigger2.setAttribute('data-kt-repeater-target', '#repeater-target');
@@ -23,8 +23,8 @@ export class KTRepeater extends KTComponent implements KTRepeaterInterface {
23
23
  wrapper: '',
24
24
  limit: 0,
25
25
  };
26
- protected override _config: KTRepeaterConfigInterface =
27
- this._defaultConfig as KTRepeaterConfigInterface;
26
+ protected override _config: KTRepeaterConfigInterface = this
27
+ ._defaultConfig as KTRepeaterConfigInterface;
28
28
  protected _wrapperElement: HTMLElement | null = null;
29
29
  protected _deleteHandler: (e: Event) => void;
30
30
 
@@ -155,7 +155,9 @@ export class KTRepeater extends KTComponent implements KTRepeaterInterface {
155
155
  element: HTMLElement,
156
156
  config?: KTRepeaterConfigInterface,
157
157
  ): KTRepeater {
158
- return this.getInstance(element) || new KTRepeater(element, config ?? undefined);
158
+ return (
159
+ this.getInstance(element) || new KTRepeater(element, config ?? undefined)
160
+ );
159
161
  }
160
162
 
161
163
  public static createInstances(): void {
@@ -34,7 +34,7 @@ describe('KTSelect UX Behaviors', () => {
34
34
  /**
35
35
  * Helper to wait for KTSelect to fully initialize
36
36
  */
37
- const waitForInit = async (select: KTSelect): Promise<void> => {
37
+ const waitForInit = async (_select: KTSelect): Promise<void> => {
38
38
  // Wait for async initialization - KTSelect uses promises for setup
39
39
  await waitFor(200);
40
40
  // Wait for next tick to ensure all modules are initialized
@@ -52,7 +52,8 @@ describe('KTSelect UX Behaviors', () => {
52
52
  // Clean up all KTSelect instances
53
53
  const selects = document.querySelectorAll('.kt-select');
54
54
  selects.forEach((select) => {
55
- const instance = (select as any).instance;
55
+ const instance = (select as HTMLElement & { instance?: KTSelect })
56
+ .instance;
56
57
  if (instance && typeof instance.destroy === 'function') {
57
58
  instance.destroy();
58
59
  }
@@ -60,7 +61,7 @@ describe('KTSelect UX Behaviors', () => {
60
61
 
61
62
  // Clear document body
62
63
  document.body.innerHTML = '';
63
- container = null as any;
64
+ container = null as unknown as HTMLElement;
64
65
 
65
66
  // Clear all event listeners
66
67
  vi.clearAllMocks();
@@ -349,12 +350,30 @@ describe('KTSelect UX Behaviors', () => {
349
350
  await waitFor(50);
350
351
 
351
352
  // ArrowDown focuses first option; ArrowUp from first wraps to last (3). Enter selects focused.
352
- searchInput.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true, cancelable: true }));
353
+ searchInput.dispatchEvent(
354
+ new KeyboardEvent('keydown', {
355
+ key: 'ArrowDown',
356
+ bubbles: true,
357
+ cancelable: true,
358
+ }),
359
+ );
353
360
  await waitFor(20);
354
- searchInput.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true, cancelable: true }));
361
+ searchInput.dispatchEvent(
362
+ new KeyboardEvent('keydown', {
363
+ key: 'ArrowUp',
364
+ bubbles: true,
365
+ cancelable: true,
366
+ }),
367
+ );
355
368
  await waitFor(20);
356
369
 
357
- searchInput.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true }));
370
+ searchInput.dispatchEvent(
371
+ new KeyboardEvent('keydown', {
372
+ key: 'Enter',
373
+ bubbles: true,
374
+ cancelable: true,
375
+ }),
376
+ );
358
377
  await waitFor(150);
359
378
 
360
379
  expect(select.getSelectedOptions()).toContain('3');