@keenthemes/ktui 1.1.5 → 1.2.0

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 (505) hide show
  1. package/README.md +24 -0
  2. package/dist/ktui.js +11639 -11035
  3. package/dist/ktui.min.js +1 -1
  4. package/dist/ktui.min.js.map +1 -1
  5. package/dist/styles.css +140 -32
  6. package/lib/cjs/components/accordion/accordion.d.ts +32 -0
  7. package/lib/cjs/components/accordion/accordion.d.ts.map +1 -0
  8. package/lib/cjs/components/accordion/index.d.ts +7 -0
  9. package/lib/cjs/components/accordion/index.d.ts.map +1 -0
  10. package/lib/cjs/components/accordion/types.d.ts +15 -0
  11. package/lib/cjs/components/accordion/types.d.ts.map +1 -0
  12. package/lib/cjs/components/collapse/collapse.d.ts +28 -0
  13. package/lib/cjs/components/collapse/collapse.d.ts.map +1 -0
  14. package/lib/cjs/components/collapse/collapse.js +0 -2
  15. package/lib/cjs/components/collapse/collapse.js.map +1 -1
  16. package/lib/cjs/components/collapse/index.d.ts +7 -0
  17. package/lib/cjs/components/collapse/index.d.ts.map +1 -0
  18. package/lib/cjs/components/collapse/types.d.ts +15 -0
  19. package/lib/cjs/components/collapse/types.d.ts.map +1 -0
  20. package/lib/cjs/components/component.d.ts +44 -0
  21. package/lib/cjs/components/component.d.ts.map +1 -0
  22. package/lib/cjs/components/component.js +3 -1
  23. package/lib/cjs/components/component.js.map +1 -1
  24. package/lib/cjs/components/constants.d.ts +6 -0
  25. package/lib/cjs/components/constants.d.ts.map +1 -0
  26. package/lib/cjs/components/datatable/datatable-checkbox.d.ts +16 -0
  27. package/lib/cjs/components/datatable/datatable-checkbox.d.ts.map +1 -0
  28. package/lib/cjs/components/datatable/datatable-sort.d.ts +16 -0
  29. package/lib/cjs/components/datatable/datatable-sort.d.ts.map +1 -0
  30. package/lib/cjs/components/datatable/datatable-sort.js +1 -2
  31. package/lib/cjs/components/datatable/datatable-sort.js.map +1 -1
  32. package/lib/cjs/components/datatable/datatable.d.ts +339 -0
  33. package/lib/cjs/components/datatable/datatable.d.ts.map +1 -0
  34. package/lib/cjs/components/datatable/datatable.js +45 -23
  35. package/lib/cjs/components/datatable/datatable.js.map +1 -1
  36. package/lib/cjs/components/datatable/index.d.ts +7 -0
  37. package/lib/cjs/components/datatable/index.d.ts.map +1 -0
  38. package/lib/cjs/components/datatable/types.d.ts +166 -0
  39. package/lib/cjs/components/datatable/types.d.ts.map +1 -0
  40. package/lib/cjs/components/dismiss/dismiss.d.ts +30 -0
  41. package/lib/cjs/components/dismiss/dismiss.d.ts.map +1 -0
  42. package/lib/cjs/components/dismiss/index.d.ts +7 -0
  43. package/lib/cjs/components/dismiss/index.d.ts.map +1 -0
  44. package/lib/cjs/components/dismiss/types.d.ts +15 -0
  45. package/lib/cjs/components/dismiss/types.d.ts.map +1 -0
  46. package/lib/cjs/components/drawer/drawer.d.ts +63 -0
  47. package/lib/cjs/components/drawer/drawer.d.ts.map +1 -0
  48. package/lib/cjs/components/drawer/drawer.js +21 -9
  49. package/lib/cjs/components/drawer/drawer.js.map +1 -1
  50. package/lib/cjs/components/drawer/index.d.ts +7 -0
  51. package/lib/cjs/components/drawer/index.d.ts.map +1 -0
  52. package/lib/cjs/components/drawer/types.d.ts +27 -0
  53. package/lib/cjs/components/drawer/types.d.ts.map +1 -0
  54. package/lib/cjs/components/dropdown/dropdown.d.ts +71 -0
  55. package/lib/cjs/components/dropdown/dropdown.d.ts.map +1 -0
  56. package/lib/cjs/components/dropdown/dropdown.js.map +1 -1
  57. package/lib/cjs/components/dropdown/index.d.ts +7 -0
  58. package/lib/cjs/components/dropdown/index.d.ts.map +1 -0
  59. package/lib/cjs/components/dropdown/types.d.ts +27 -0
  60. package/lib/cjs/components/dropdown/types.d.ts.map +1 -0
  61. package/lib/cjs/components/image-input/image-input.d.ts +42 -0
  62. package/lib/cjs/components/image-input/image-input.d.ts.map +1 -0
  63. package/lib/cjs/components/image-input/index.d.ts +7 -0
  64. package/lib/cjs/components/image-input/index.d.ts.map +1 -0
  65. package/lib/cjs/components/image-input/types.d.ts +12 -0
  66. package/lib/cjs/components/image-input/types.d.ts.map +1 -0
  67. package/lib/cjs/components/modal/index.d.ts +7 -0
  68. package/lib/cjs/components/modal/index.d.ts.map +1 -0
  69. package/lib/cjs/components/modal/modal.d.ts +45 -0
  70. package/lib/cjs/components/modal/modal.d.ts.map +1 -0
  71. package/lib/cjs/components/modal/types.d.ts +21 -0
  72. package/lib/cjs/components/modal/types.d.ts.map +1 -0
  73. package/lib/cjs/components/rating/index.d.ts +7 -0
  74. package/lib/cjs/components/rating/index.d.ts.map +1 -0
  75. package/lib/cjs/components/rating/index.js +10 -0
  76. package/lib/cjs/components/rating/index.js.map +1 -0
  77. package/lib/cjs/components/rating/rating.d.ts +31 -0
  78. package/lib/cjs/components/rating/rating.d.ts.map +1 -0
  79. package/lib/cjs/components/rating/rating.js +239 -0
  80. package/lib/cjs/components/rating/rating.js.map +1 -0
  81. package/lib/cjs/components/rating/types.d.ts +25 -0
  82. package/lib/cjs/components/rating/types.d.ts.map +1 -0
  83. package/lib/cjs/components/rating/types.js +7 -0
  84. package/lib/cjs/components/rating/types.js.map +1 -0
  85. package/lib/cjs/components/reparent/index.d.ts +7 -0
  86. package/lib/cjs/components/reparent/index.d.ts.map +1 -0
  87. package/lib/cjs/components/reparent/reparent.d.ts +25 -0
  88. package/lib/cjs/components/reparent/reparent.d.ts.map +1 -0
  89. package/lib/cjs/components/reparent/types.d.ts +13 -0
  90. package/lib/cjs/components/reparent/types.d.ts.map +1 -0
  91. package/lib/cjs/components/repeater/index.d.ts +7 -0
  92. package/lib/cjs/components/repeater/index.d.ts.map +1 -0
  93. package/lib/cjs/components/repeater/index.js +10 -0
  94. package/lib/cjs/components/repeater/index.js.map +1 -0
  95. package/lib/cjs/components/repeater/repeater.d.ts +33 -0
  96. package/lib/cjs/components/repeater/repeater.d.ts.map +1 -0
  97. package/lib/cjs/components/repeater/repeater.js +173 -0
  98. package/lib/cjs/components/repeater/repeater.js.map +1 -0
  99. package/lib/cjs/components/repeater/types.d.ts +18 -0
  100. package/lib/cjs/components/repeater/types.d.ts.map +1 -0
  101. package/lib/cjs/components/repeater/types.js +7 -0
  102. package/lib/cjs/components/repeater/types.js.map +1 -0
  103. package/lib/cjs/components/scrollable/index.d.ts +7 -0
  104. package/lib/cjs/components/scrollable/index.d.ts.map +1 -0
  105. package/lib/cjs/components/scrollable/scrollable.d.ts +37 -0
  106. package/lib/cjs/components/scrollable/scrollable.d.ts.map +1 -0
  107. package/lib/cjs/components/scrollable/types.d.ts +15 -0
  108. package/lib/cjs/components/scrollable/types.d.ts.map +1 -0
  109. package/lib/cjs/components/scrollspy/index.d.ts +7 -0
  110. package/lib/cjs/components/scrollspy/index.d.ts.map +1 -0
  111. package/lib/cjs/components/scrollspy/scrollspy.d.ts +35 -0
  112. package/lib/cjs/components/scrollspy/scrollspy.d.ts.map +1 -0
  113. package/lib/cjs/components/scrollspy/types.d.ts +14 -0
  114. package/lib/cjs/components/scrollspy/types.d.ts.map +1 -0
  115. package/lib/cjs/components/scrollto/index.d.ts +7 -0
  116. package/lib/cjs/components/scrollto/index.d.ts.map +1 -0
  117. package/lib/cjs/components/scrollto/scrollto.d.ts +28 -0
  118. package/lib/cjs/components/scrollto/scrollto.d.ts.map +1 -0
  119. package/lib/cjs/components/scrollto/scrollto.js +0 -2
  120. package/lib/cjs/components/scrollto/scrollto.js.map +1 -1
  121. package/lib/cjs/components/scrollto/types.d.ts +14 -0
  122. package/lib/cjs/components/scrollto/types.d.ts.map +1 -0
  123. package/lib/cjs/components/select/combobox.d.ts +52 -0
  124. package/lib/cjs/components/select/combobox.d.ts.map +1 -0
  125. package/lib/cjs/components/select/combobox.js.map +1 -1
  126. package/lib/cjs/components/select/config.d.ts +105 -0
  127. package/lib/cjs/components/select/config.d.ts.map +1 -0
  128. package/lib/cjs/components/select/dropdown.d.ts +101 -0
  129. package/lib/cjs/components/select/dropdown.d.ts.map +1 -0
  130. package/lib/cjs/components/select/dropdown.js.map +1 -1
  131. package/lib/cjs/components/select/index.d.ts +13 -0
  132. package/lib/cjs/components/select/index.d.ts.map +1 -0
  133. package/lib/cjs/components/select/option.d.ts +23 -0
  134. package/lib/cjs/components/select/option.d.ts.map +1 -0
  135. package/lib/cjs/components/select/remote.d.ts +91 -0
  136. package/lib/cjs/components/select/remote.d.ts.map +1 -0
  137. package/lib/cjs/components/select/remote.js.map +1 -1
  138. package/lib/cjs/components/select/search.d.ts +67 -0
  139. package/lib/cjs/components/select/search.d.ts.map +1 -0
  140. package/lib/cjs/components/select/search.js +9 -5
  141. package/lib/cjs/components/select/search.js.map +1 -1
  142. package/lib/cjs/components/select/select.d.ts +427 -0
  143. package/lib/cjs/components/select/select.d.ts.map +1 -0
  144. package/lib/cjs/components/select/select.js +25 -5
  145. package/lib/cjs/components/select/select.js.map +1 -1
  146. package/lib/cjs/components/select/tags.d.ts +32 -0
  147. package/lib/cjs/components/select/tags.d.ts.map +1 -0
  148. package/lib/cjs/components/select/tags.js.map +1 -1
  149. package/lib/cjs/components/select/templates.d.ts +79 -0
  150. package/lib/cjs/components/select/templates.d.ts.map +1 -0
  151. package/lib/cjs/components/select/templates.js.map +1 -1
  152. package/lib/cjs/components/select/types.d.ts +23 -0
  153. package/lib/cjs/components/select/types.d.ts.map +1 -0
  154. package/lib/cjs/components/select/utils.d.ts +130 -0
  155. package/lib/cjs/components/select/utils.d.ts.map +1 -0
  156. package/lib/cjs/components/select/utils.js +10 -0
  157. package/lib/cjs/components/select/utils.js.map +1 -1
  158. package/lib/cjs/components/stepper/index.d.ts +7 -0
  159. package/lib/cjs/components/stepper/index.d.ts.map +1 -0
  160. package/lib/cjs/components/stepper/stepper.d.ts +53 -0
  161. package/lib/cjs/components/stepper/stepper.d.ts.map +1 -0
  162. package/lib/cjs/components/stepper/types.d.ts +12 -0
  163. package/lib/cjs/components/stepper/types.d.ts.map +1 -0
  164. package/lib/cjs/components/sticky/index.d.ts +7 -0
  165. package/lib/cjs/components/sticky/index.d.ts.map +1 -0
  166. package/lib/cjs/components/sticky/sticky.d.ts +51 -0
  167. package/lib/cjs/components/sticky/sticky.d.ts.map +1 -0
  168. package/lib/cjs/components/sticky/sticky.js +104 -24
  169. package/lib/cjs/components/sticky/sticky.js.map +1 -1
  170. package/lib/cjs/components/sticky/types.d.ts +28 -0
  171. package/lib/cjs/components/sticky/types.d.ts.map +1 -0
  172. package/lib/cjs/components/tabs/index.d.ts +7 -0
  173. package/lib/cjs/components/tabs/index.d.ts.map +1 -0
  174. package/lib/cjs/components/tabs/tabs.d.ts +38 -0
  175. package/lib/cjs/components/tabs/tabs.d.ts.map +1 -0
  176. package/lib/cjs/components/tabs/types.d.ts +12 -0
  177. package/lib/cjs/components/tabs/types.d.ts.map +1 -0
  178. package/lib/cjs/components/theme-switch/index.d.ts +7 -0
  179. package/lib/cjs/components/theme-switch/index.d.ts.map +1 -0
  180. package/lib/cjs/components/theme-switch/theme-switch.d.ts +33 -0
  181. package/lib/cjs/components/theme-switch/theme-switch.d.ts.map +1 -0
  182. package/lib/cjs/components/theme-switch/theme-switch.js +0 -2
  183. package/lib/cjs/components/theme-switch/theme-switch.js.map +1 -1
  184. package/lib/cjs/components/theme-switch/types.d.ts +13 -0
  185. package/lib/cjs/components/theme-switch/types.d.ts.map +1 -0
  186. package/lib/cjs/components/toast/index.d.ts +7 -0
  187. package/lib/cjs/components/toast/index.d.ts.map +1 -0
  188. package/lib/cjs/components/toast/toast.d.ts +76 -0
  189. package/lib/cjs/components/toast/toast.d.ts.map +1 -0
  190. package/lib/cjs/components/toast/toast.js +1 -2
  191. package/lib/cjs/components/toast/toast.js.map +1 -1
  192. package/lib/cjs/components/toast/types.d.ts +146 -0
  193. package/lib/cjs/components/toast/types.d.ts.map +1 -0
  194. package/lib/cjs/components/toggle/index.d.ts +7 -0
  195. package/lib/cjs/components/toggle/index.d.ts.map +1 -0
  196. package/lib/cjs/components/toggle/toggle.d.ts +31 -0
  197. package/lib/cjs/components/toggle/toggle.d.ts.map +1 -0
  198. package/lib/cjs/components/toggle/types.d.ts +17 -0
  199. package/lib/cjs/components/toggle/types.d.ts.map +1 -0
  200. package/lib/cjs/components/toggle-password/index.d.ts +7 -0
  201. package/lib/cjs/components/toggle-password/index.d.ts.map +1 -0
  202. package/lib/cjs/components/toggle-password/toggle-password.d.ts +32 -0
  203. package/lib/cjs/components/toggle-password/toggle-password.d.ts.map +1 -0
  204. package/lib/cjs/components/toggle-password/types.d.ts +12 -0
  205. package/lib/cjs/components/toggle-password/types.d.ts.map +1 -0
  206. package/lib/cjs/components/tooltip/index.d.ts +7 -0
  207. package/lib/cjs/components/tooltip/index.d.ts.map +1 -0
  208. package/lib/cjs/components/tooltip/tooltip.d.ts +46 -0
  209. package/lib/cjs/components/tooltip/tooltip.d.ts.map +1 -0
  210. package/lib/cjs/components/tooltip/types.d.ts +26 -0
  211. package/lib/cjs/components/tooltip/types.d.ts.map +1 -0
  212. package/lib/cjs/helpers/data.d.ts +13 -0
  213. package/lib/cjs/helpers/data.d.ts.map +1 -0
  214. package/lib/cjs/helpers/dom.d.ts +42 -0
  215. package/lib/cjs/helpers/dom.d.ts.map +1 -0
  216. package/lib/cjs/helpers/dom.js +0 -2
  217. package/lib/cjs/helpers/dom.js.map +1 -1
  218. package/lib/cjs/helpers/event-handler.d.ts +14 -0
  219. package/lib/cjs/helpers/event-handler.d.ts.map +1 -0
  220. package/lib/cjs/helpers/utils.d.ts +25 -0
  221. package/lib/cjs/helpers/utils.d.ts.map +1 -0
  222. package/lib/cjs/index.d.ts +114 -0
  223. package/lib/cjs/index.d.ts.map +1 -0
  224. package/lib/cjs/index.js +9 -1
  225. package/lib/cjs/index.js.map +1 -1
  226. package/lib/cjs/types.d.ts +17 -0
  227. package/lib/cjs/types.d.ts.map +1 -0
  228. package/lib/esm/components/accordion/accordion.d.ts +32 -0
  229. package/lib/esm/components/accordion/accordion.d.ts.map +1 -0
  230. package/lib/esm/components/accordion/index.d.ts +7 -0
  231. package/lib/esm/components/accordion/index.d.ts.map +1 -0
  232. package/lib/esm/components/accordion/types.d.ts +15 -0
  233. package/lib/esm/components/accordion/types.d.ts.map +1 -0
  234. package/lib/esm/components/collapse/collapse.d.ts +28 -0
  235. package/lib/esm/components/collapse/collapse.d.ts.map +1 -0
  236. package/lib/esm/components/collapse/collapse.js +0 -2
  237. package/lib/esm/components/collapse/collapse.js.map +1 -1
  238. package/lib/esm/components/collapse/index.d.ts +7 -0
  239. package/lib/esm/components/collapse/index.d.ts.map +1 -0
  240. package/lib/esm/components/collapse/types.d.ts +15 -0
  241. package/lib/esm/components/collapse/types.d.ts.map +1 -0
  242. package/lib/esm/components/component.d.ts +44 -0
  243. package/lib/esm/components/component.d.ts.map +1 -0
  244. package/lib/esm/components/component.js +3 -1
  245. package/lib/esm/components/component.js.map +1 -1
  246. package/lib/esm/components/constants.d.ts +6 -0
  247. package/lib/esm/components/constants.d.ts.map +1 -0
  248. package/lib/esm/components/datatable/datatable-checkbox.d.ts +16 -0
  249. package/lib/esm/components/datatable/datatable-checkbox.d.ts.map +1 -0
  250. package/lib/esm/components/datatable/datatable-sort.d.ts +16 -0
  251. package/lib/esm/components/datatable/datatable-sort.d.ts.map +1 -0
  252. package/lib/esm/components/datatable/datatable-sort.js +1 -2
  253. package/lib/esm/components/datatable/datatable-sort.js.map +1 -1
  254. package/lib/esm/components/datatable/datatable.d.ts +339 -0
  255. package/lib/esm/components/datatable/datatable.d.ts.map +1 -0
  256. package/lib/esm/components/datatable/datatable.js +45 -23
  257. package/lib/esm/components/datatable/datatable.js.map +1 -1
  258. package/lib/esm/components/datatable/index.d.ts +7 -0
  259. package/lib/esm/components/datatable/index.d.ts.map +1 -0
  260. package/lib/esm/components/datatable/types.d.ts +166 -0
  261. package/lib/esm/components/datatable/types.d.ts.map +1 -0
  262. package/lib/esm/components/dismiss/dismiss.d.ts +30 -0
  263. package/lib/esm/components/dismiss/dismiss.d.ts.map +1 -0
  264. package/lib/esm/components/dismiss/index.d.ts +7 -0
  265. package/lib/esm/components/dismiss/index.d.ts.map +1 -0
  266. package/lib/esm/components/dismiss/types.d.ts +15 -0
  267. package/lib/esm/components/dismiss/types.d.ts.map +1 -0
  268. package/lib/esm/components/drawer/drawer.d.ts +63 -0
  269. package/lib/esm/components/drawer/drawer.d.ts.map +1 -0
  270. package/lib/esm/components/drawer/drawer.js +21 -9
  271. package/lib/esm/components/drawer/drawer.js.map +1 -1
  272. package/lib/esm/components/drawer/index.d.ts +7 -0
  273. package/lib/esm/components/drawer/index.d.ts.map +1 -0
  274. package/lib/esm/components/drawer/types.d.ts +27 -0
  275. package/lib/esm/components/drawer/types.d.ts.map +1 -0
  276. package/lib/esm/components/dropdown/dropdown.d.ts +71 -0
  277. package/lib/esm/components/dropdown/dropdown.d.ts.map +1 -0
  278. package/lib/esm/components/dropdown/dropdown.js.map +1 -1
  279. package/lib/esm/components/dropdown/index.d.ts +7 -0
  280. package/lib/esm/components/dropdown/index.d.ts.map +1 -0
  281. package/lib/esm/components/dropdown/types.d.ts +27 -0
  282. package/lib/esm/components/dropdown/types.d.ts.map +1 -0
  283. package/lib/esm/components/image-input/image-input.d.ts +42 -0
  284. package/lib/esm/components/image-input/image-input.d.ts.map +1 -0
  285. package/lib/esm/components/image-input/index.d.ts +7 -0
  286. package/lib/esm/components/image-input/index.d.ts.map +1 -0
  287. package/lib/esm/components/image-input/types.d.ts +12 -0
  288. package/lib/esm/components/image-input/types.d.ts.map +1 -0
  289. package/lib/esm/components/modal/index.d.ts +7 -0
  290. package/lib/esm/components/modal/index.d.ts.map +1 -0
  291. package/lib/esm/components/modal/modal.d.ts +45 -0
  292. package/lib/esm/components/modal/modal.d.ts.map +1 -0
  293. package/lib/esm/components/modal/types.d.ts +21 -0
  294. package/lib/esm/components/modal/types.d.ts.map +1 -0
  295. package/lib/esm/components/rating/index.d.ts +7 -0
  296. package/lib/esm/components/rating/index.d.ts.map +1 -0
  297. package/lib/esm/components/rating/index.js +6 -0
  298. package/lib/esm/components/rating/index.js.map +1 -0
  299. package/lib/esm/components/rating/rating.d.ts +31 -0
  300. package/lib/esm/components/rating/rating.d.ts.map +1 -0
  301. package/lib/esm/components/rating/rating.js +236 -0
  302. package/lib/esm/components/rating/rating.js.map +1 -0
  303. package/lib/esm/components/rating/types.d.ts +25 -0
  304. package/lib/esm/components/rating/types.d.ts.map +1 -0
  305. package/lib/esm/components/rating/types.js +6 -0
  306. package/lib/esm/components/rating/types.js.map +1 -0
  307. package/lib/esm/components/reparent/index.d.ts +7 -0
  308. package/lib/esm/components/reparent/index.d.ts.map +1 -0
  309. package/lib/esm/components/reparent/reparent.d.ts +25 -0
  310. package/lib/esm/components/reparent/reparent.d.ts.map +1 -0
  311. package/lib/esm/components/reparent/types.d.ts +13 -0
  312. package/lib/esm/components/reparent/types.d.ts.map +1 -0
  313. package/lib/esm/components/repeater/index.d.ts +7 -0
  314. package/lib/esm/components/repeater/index.d.ts.map +1 -0
  315. package/lib/esm/components/repeater/index.js +6 -0
  316. package/lib/esm/components/repeater/index.js.map +1 -0
  317. package/lib/esm/components/repeater/repeater.d.ts +33 -0
  318. package/lib/esm/components/repeater/repeater.d.ts.map +1 -0
  319. package/lib/esm/components/repeater/repeater.js +170 -0
  320. package/lib/esm/components/repeater/repeater.js.map +1 -0
  321. package/lib/esm/components/repeater/types.d.ts +18 -0
  322. package/lib/esm/components/repeater/types.d.ts.map +1 -0
  323. package/lib/esm/components/repeater/types.js +6 -0
  324. package/lib/esm/components/repeater/types.js.map +1 -0
  325. package/lib/esm/components/scrollable/index.d.ts +7 -0
  326. package/lib/esm/components/scrollable/index.d.ts.map +1 -0
  327. package/lib/esm/components/scrollable/scrollable.d.ts +37 -0
  328. package/lib/esm/components/scrollable/scrollable.d.ts.map +1 -0
  329. package/lib/esm/components/scrollable/types.d.ts +15 -0
  330. package/lib/esm/components/scrollable/types.d.ts.map +1 -0
  331. package/lib/esm/components/scrollspy/index.d.ts +7 -0
  332. package/lib/esm/components/scrollspy/index.d.ts.map +1 -0
  333. package/lib/esm/components/scrollspy/scrollspy.d.ts +35 -0
  334. package/lib/esm/components/scrollspy/scrollspy.d.ts.map +1 -0
  335. package/lib/esm/components/scrollspy/types.d.ts +14 -0
  336. package/lib/esm/components/scrollspy/types.d.ts.map +1 -0
  337. package/lib/esm/components/scrollto/index.d.ts +7 -0
  338. package/lib/esm/components/scrollto/index.d.ts.map +1 -0
  339. package/lib/esm/components/scrollto/scrollto.d.ts +28 -0
  340. package/lib/esm/components/scrollto/scrollto.d.ts.map +1 -0
  341. package/lib/esm/components/scrollto/scrollto.js +0 -2
  342. package/lib/esm/components/scrollto/scrollto.js.map +1 -1
  343. package/lib/esm/components/scrollto/types.d.ts +14 -0
  344. package/lib/esm/components/scrollto/types.d.ts.map +1 -0
  345. package/lib/esm/components/select/combobox.d.ts +52 -0
  346. package/lib/esm/components/select/combobox.d.ts.map +1 -0
  347. package/lib/esm/components/select/combobox.js.map +1 -1
  348. package/lib/esm/components/select/config.d.ts +105 -0
  349. package/lib/esm/components/select/config.d.ts.map +1 -0
  350. package/lib/esm/components/select/dropdown.d.ts +101 -0
  351. package/lib/esm/components/select/dropdown.d.ts.map +1 -0
  352. package/lib/esm/components/select/dropdown.js.map +1 -1
  353. package/lib/esm/components/select/index.d.ts +13 -0
  354. package/lib/esm/components/select/index.d.ts.map +1 -0
  355. package/lib/esm/components/select/option.d.ts +23 -0
  356. package/lib/esm/components/select/option.d.ts.map +1 -0
  357. package/lib/esm/components/select/remote.d.ts +91 -0
  358. package/lib/esm/components/select/remote.d.ts.map +1 -0
  359. package/lib/esm/components/select/remote.js.map +1 -1
  360. package/lib/esm/components/select/search.d.ts +67 -0
  361. package/lib/esm/components/select/search.d.ts.map +1 -0
  362. package/lib/esm/components/select/search.js +9 -5
  363. package/lib/esm/components/select/search.js.map +1 -1
  364. package/lib/esm/components/select/select.d.ts +427 -0
  365. package/lib/esm/components/select/select.d.ts.map +1 -0
  366. package/lib/esm/components/select/select.js +25 -5
  367. package/lib/esm/components/select/select.js.map +1 -1
  368. package/lib/esm/components/select/tags.d.ts +32 -0
  369. package/lib/esm/components/select/tags.d.ts.map +1 -0
  370. package/lib/esm/components/select/tags.js.map +1 -1
  371. package/lib/esm/components/select/templates.d.ts +79 -0
  372. package/lib/esm/components/select/templates.d.ts.map +1 -0
  373. package/lib/esm/components/select/templates.js.map +1 -1
  374. package/lib/esm/components/select/types.d.ts +23 -0
  375. package/lib/esm/components/select/types.d.ts.map +1 -0
  376. package/lib/esm/components/select/utils.d.ts +130 -0
  377. package/lib/esm/components/select/utils.d.ts.map +1 -0
  378. package/lib/esm/components/select/utils.js +10 -0
  379. package/lib/esm/components/select/utils.js.map +1 -1
  380. package/lib/esm/components/stepper/index.d.ts +7 -0
  381. package/lib/esm/components/stepper/index.d.ts.map +1 -0
  382. package/lib/esm/components/stepper/stepper.d.ts +53 -0
  383. package/lib/esm/components/stepper/stepper.d.ts.map +1 -0
  384. package/lib/esm/components/stepper/types.d.ts +12 -0
  385. package/lib/esm/components/stepper/types.d.ts.map +1 -0
  386. package/lib/esm/components/sticky/index.d.ts +7 -0
  387. package/lib/esm/components/sticky/index.d.ts.map +1 -0
  388. package/lib/esm/components/sticky/sticky.d.ts +51 -0
  389. package/lib/esm/components/sticky/sticky.d.ts.map +1 -0
  390. package/lib/esm/components/sticky/sticky.js +104 -24
  391. package/lib/esm/components/sticky/sticky.js.map +1 -1
  392. package/lib/esm/components/sticky/types.d.ts +28 -0
  393. package/lib/esm/components/sticky/types.d.ts.map +1 -0
  394. package/lib/esm/components/tabs/index.d.ts +7 -0
  395. package/lib/esm/components/tabs/index.d.ts.map +1 -0
  396. package/lib/esm/components/tabs/tabs.d.ts +38 -0
  397. package/lib/esm/components/tabs/tabs.d.ts.map +1 -0
  398. package/lib/esm/components/tabs/types.d.ts +12 -0
  399. package/lib/esm/components/tabs/types.d.ts.map +1 -0
  400. package/lib/esm/components/theme-switch/index.d.ts +7 -0
  401. package/lib/esm/components/theme-switch/index.d.ts.map +1 -0
  402. package/lib/esm/components/theme-switch/theme-switch.d.ts +33 -0
  403. package/lib/esm/components/theme-switch/theme-switch.d.ts.map +1 -0
  404. package/lib/esm/components/theme-switch/theme-switch.js +0 -2
  405. package/lib/esm/components/theme-switch/theme-switch.js.map +1 -1
  406. package/lib/esm/components/theme-switch/types.d.ts +13 -0
  407. package/lib/esm/components/theme-switch/types.d.ts.map +1 -0
  408. package/lib/esm/components/toast/index.d.ts +7 -0
  409. package/lib/esm/components/toast/index.d.ts.map +1 -0
  410. package/lib/esm/components/toast/toast.d.ts +76 -0
  411. package/lib/esm/components/toast/toast.d.ts.map +1 -0
  412. package/lib/esm/components/toast/toast.js +1 -2
  413. package/lib/esm/components/toast/toast.js.map +1 -1
  414. package/lib/esm/components/toast/types.d.ts +146 -0
  415. package/lib/esm/components/toast/types.d.ts.map +1 -0
  416. package/lib/esm/components/toggle/index.d.ts +7 -0
  417. package/lib/esm/components/toggle/index.d.ts.map +1 -0
  418. package/lib/esm/components/toggle/toggle.d.ts +31 -0
  419. package/lib/esm/components/toggle/toggle.d.ts.map +1 -0
  420. package/lib/esm/components/toggle/types.d.ts +17 -0
  421. package/lib/esm/components/toggle/types.d.ts.map +1 -0
  422. package/lib/esm/components/toggle-password/index.d.ts +7 -0
  423. package/lib/esm/components/toggle-password/index.d.ts.map +1 -0
  424. package/lib/esm/components/toggle-password/toggle-password.d.ts +32 -0
  425. package/lib/esm/components/toggle-password/toggle-password.d.ts.map +1 -0
  426. package/lib/esm/components/toggle-password/types.d.ts +12 -0
  427. package/lib/esm/components/toggle-password/types.d.ts.map +1 -0
  428. package/lib/esm/components/tooltip/index.d.ts +7 -0
  429. package/lib/esm/components/tooltip/index.d.ts.map +1 -0
  430. package/lib/esm/components/tooltip/tooltip.d.ts +46 -0
  431. package/lib/esm/components/tooltip/tooltip.d.ts.map +1 -0
  432. package/lib/esm/components/tooltip/types.d.ts +26 -0
  433. package/lib/esm/components/tooltip/types.d.ts.map +1 -0
  434. package/lib/esm/helpers/data.d.ts +13 -0
  435. package/lib/esm/helpers/data.d.ts.map +1 -0
  436. package/lib/esm/helpers/dom.d.ts +42 -0
  437. package/lib/esm/helpers/dom.d.ts.map +1 -0
  438. package/lib/esm/helpers/dom.js +0 -2
  439. package/lib/esm/helpers/dom.js.map +1 -1
  440. package/lib/esm/helpers/event-handler.d.ts +14 -0
  441. package/lib/esm/helpers/event-handler.d.ts.map +1 -0
  442. package/lib/esm/helpers/utils.d.ts +25 -0
  443. package/lib/esm/helpers/utils.d.ts.map +1 -0
  444. package/lib/esm/index.d.ts +114 -0
  445. package/lib/esm/index.d.ts.map +1 -0
  446. package/lib/esm/index.js +6 -0
  447. package/lib/esm/index.js.map +1 -1
  448. package/lib/esm/types.d.ts +17 -0
  449. package/lib/esm/types.d.ts.map +1 -0
  450. package/package.json +17 -9
  451. package/skills/ktui-components/SKILL.md +41 -0
  452. package/skills/ktui-theming/SKILL.md +50 -0
  453. package/src/components/collapse/collapse.ts +0 -3
  454. package/src/components/component.ts +5 -5
  455. package/src/components/datatable/__tests__/currency-sort.test.ts +108 -0
  456. package/src/components/datatable/__tests__/multi-row-headers.test.ts +121 -0
  457. package/src/components/datatable/__tests__/pagination-reset.test.ts +13 -5
  458. package/src/components/datatable/__tests__/race-conditions.test.ts +138 -78
  459. package/src/components/datatable/__tests__/setup.ts +9 -4
  460. package/src/components/datatable/datatable-sort.ts +12 -16
  461. package/src/components/datatable/datatable.css +4 -4
  462. package/src/components/datatable/datatable.ts +56 -26
  463. package/src/components/datatable/types.ts +3 -1
  464. package/src/components/drawer/drawer.ts +61 -24
  465. package/src/components/dropdown/dropdown.ts +3 -1
  466. package/src/components/input/input-group.css +15 -5
  467. package/src/components/rating/__tests__/rating.test.ts +234 -0
  468. package/src/components/rating/index.ts +11 -0
  469. package/src/components/rating/rating.css +11 -0
  470. package/src/components/rating/rating.ts +234 -0
  471. package/src/components/rating/types.ts +27 -0
  472. package/src/components/repeater/__tests__/repeater.test.ts +308 -0
  473. package/src/components/repeater/index.ts +7 -0
  474. package/src/components/repeater/repeater.ts +179 -0
  475. package/src/components/repeater/types.ts +19 -0
  476. package/src/components/scrollto/scrollto.ts +0 -3
  477. package/src/components/select/__tests__/ux-behaviors.test.ts +274 -8
  478. package/src/components/select/combobox.ts +0 -1
  479. package/src/components/select/dropdown.ts +0 -2
  480. package/src/components/select/remote.ts +1 -6
  481. package/src/components/select/search.ts +14 -7
  482. package/src/components/select/select.ts +33 -29
  483. package/src/components/select/tags.ts +0 -1
  484. package/src/components/select/templates.ts +8 -8
  485. package/src/components/select/utils.ts +15 -2
  486. package/src/components/sticky/__tests__/sticky.test.ts +205 -0
  487. package/src/components/sticky/sticky.ts +119 -21
  488. package/src/components/sticky/types.ts +3 -0
  489. package/src/components/theme-switch/theme-switch.ts +0 -3
  490. package/src/components/toast/toast.ts +3 -2
  491. package/src/helpers/dom.ts +0 -3
  492. package/src/index.ts +108 -0
  493. package/styles.css +1 -0
  494. package/lib/cjs/components/datatable/__tests__/pagination-reset.test.js +0 -596
  495. package/lib/cjs/components/datatable/__tests__/pagination-reset.test.js.map +0 -1
  496. package/lib/cjs/components/datatable/__tests__/race-conditions.test.js +0 -548
  497. package/lib/cjs/components/datatable/__tests__/race-conditions.test.js.map +0 -1
  498. package/lib/cjs/components/datatable/__tests__/setup.js +0 -63
  499. package/lib/cjs/components/datatable/__tests__/setup.js.map +0 -1
  500. package/lib/esm/components/datatable/__tests__/pagination-reset.test.js +0 -594
  501. package/lib/esm/components/datatable/__tests__/pagination-reset.test.js.map +0 -1
  502. package/lib/esm/components/datatable/__tests__/race-conditions.test.js +0 -546
  503. package/lib/esm/components/datatable/__tests__/race-conditions.test.js.map +0 -1
  504. package/lib/esm/components/datatable/__tests__/setup.js +0 -58
  505. package/lib/esm/components/datatable/__tests__/setup.js.map +0 -1
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Tests for KTRating component
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import { KTRating } from '../rating';
7
+
8
+ describe('KTRating', () => {
9
+ let container: HTMLElement;
10
+ let ratingEl: HTMLElement;
11
+
12
+ beforeEach(() => {
13
+ document.body.innerHTML = '';
14
+ container = document.createElement('div');
15
+ container.id = 'test-container';
16
+ ratingEl = document.createElement('div');
17
+ ratingEl.setAttribute('data-kt-rating', 'true');
18
+ container.appendChild(ratingEl);
19
+ document.body.appendChild(container);
20
+ });
21
+
22
+ afterEach(() => {
23
+ document.body.innerHTML = '';
24
+ });
25
+
26
+ describe('initialization', () => {
27
+ it('initializes on element with data-kt-rating', () => {
28
+ const instance = new KTRating(ratingEl);
29
+ expect(instance).toBeInstanceOf(KTRating);
30
+ expect(instance.getElement()).toBe(ratingEl);
31
+ expect(ratingEl.querySelector('.kt-rating')).not.toBeNull();
32
+ instance.dispose();
33
+ });
34
+
35
+ it('reads value and max from data attributes', () => {
36
+ ratingEl.setAttribute('data-kt-rating-value', '3');
37
+ ratingEl.setAttribute('data-kt-rating-max', '10');
38
+ const instance = new KTRating(ratingEl);
39
+ expect(instance.getOption('value')).toBe(3);
40
+ expect(instance.getOption('max')).toBe(10);
41
+ instance.dispose();
42
+ });
43
+
44
+ it('does not double-initialize when constructor called twice on same element', () => {
45
+ new KTRating(ratingEl);
46
+ new KTRating(ratingEl);
47
+ expect(ratingEl.querySelectorAll('.kt-rating').length).toBe(1);
48
+ const instance = KTRating.getInstance(ratingEl);
49
+ expect(instance).not.toBeNull();
50
+ instance!.dispose();
51
+ });
52
+ });
53
+
54
+ describe('readonly mode', () => {
55
+ it('renders filled and unfilled symbols for value 3 of 5', () => {
56
+ ratingEl.setAttribute('data-kt-rating-value', '3');
57
+ ratingEl.setAttribute('data-kt-rating-readonly', 'true');
58
+ const instance = new KTRating(ratingEl);
59
+ const wrapper = ratingEl.querySelector('.kt-rating');
60
+ expect(wrapper).not.toBeNull();
61
+ expect(wrapper?.getAttribute('role')).toBe('img');
62
+ expect(wrapper?.getAttribute('aria-valuenow')).toBe('3');
63
+ expect(wrapper?.getAttribute('aria-valuemax')).toBe('5');
64
+ expect(wrapper?.querySelectorAll('span').length).toBe(5);
65
+ expect(wrapper?.querySelectorAll('input[type="radio"]').length).toBe(0);
66
+ instance.dispose();
67
+ });
68
+
69
+ it('getValue returns config value in readonly mode', () => {
70
+ ratingEl.setAttribute('data-kt-rating-value', '4');
71
+ ratingEl.setAttribute('data-kt-rating-readonly', 'true');
72
+ const instance = new KTRating(ratingEl);
73
+ expect(instance.getValue()).toBe(4);
74
+ instance.dispose();
75
+ });
76
+
77
+ it('getValue returns null when readonly value is 0', () => {
78
+ ratingEl.setAttribute('data-kt-rating-value', '0');
79
+ ratingEl.setAttribute('data-kt-rating-readonly', 'true');
80
+ const instance = new KTRating(ratingEl);
81
+ expect(instance.getValue()).toBeNull();
82
+ instance.dispose();
83
+ });
84
+ });
85
+
86
+ describe('interactive mode', () => {
87
+ it('renders radio inputs for each value 1..max', () => {
88
+ const instance = new KTRating(ratingEl);
89
+ const wrapper = ratingEl.querySelector('.kt-rating');
90
+ const radios = wrapper?.querySelectorAll('input[type="radio"]') ?? [];
91
+ expect(radios.length).toBe(5);
92
+ expect(radios[0].getAttribute('value')).toBe('5');
93
+ expect(radios[4].getAttribute('value')).toBe('1');
94
+ instance.dispose();
95
+ });
96
+
97
+ it('getValue returns null when no selection', () => {
98
+ const instance = new KTRating(ratingEl);
99
+ expect(instance.getValue()).toBeNull();
100
+ instance.dispose();
101
+ });
102
+
103
+ it('setValue updates checked radio and getValue', () => {
104
+ const instance = new KTRating(ratingEl);
105
+ instance.setValue(3);
106
+ expect(instance.getValue()).toBe(3);
107
+ const checked = ratingEl.querySelector<HTMLInputElement>('input[type="radio"]:checked');
108
+ expect(checked?.value).toBe('3');
109
+ instance.dispose();
110
+ });
111
+
112
+ it('setValue(null) clears selection', () => {
113
+ const instance = new KTRating(ratingEl);
114
+ instance.setValue(4);
115
+ instance.setValue(null);
116
+ expect(instance.getValue()).toBeNull();
117
+ expect(ratingEl.querySelector('input[type="radio"]:checked')).toBeNull();
118
+ instance.dispose();
119
+ });
120
+
121
+ it('dispatches kt.rating.change when user selects a value', () => {
122
+ const instance = new KTRating(ratingEl);
123
+ 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
+ expect(radio3).not.toBeNull();
127
+ radio3!.checked = true;
128
+ radio3!.dispatchEvent(new Event('change', { bubbles: true }));
129
+ expect(events.length).toBe(1);
130
+ expect(events[0].detail?.payload?.value).toBe(3);
131
+ instance.dispose();
132
+ });
133
+ });
134
+
135
+ describe('configurable max', () => {
136
+ it('renders max symbols when max is 10', () => {
137
+ ratingEl.setAttribute('data-kt-rating-max', '10');
138
+ ratingEl.setAttribute('data-kt-rating-readonly', 'true');
139
+ ratingEl.setAttribute('data-kt-rating-value', '7');
140
+ const instance = new KTRating(ratingEl);
141
+ const wrapper = ratingEl.querySelector('.kt-rating');
142
+ expect(wrapper?.querySelectorAll('span').length).toBe(10);
143
+ expect(wrapper?.getAttribute('aria-valuemax')).toBe('10');
144
+ instance.dispose();
145
+ });
146
+
147
+ it('interactive mode renders 10 radios when max is 10', () => {
148
+ ratingEl.setAttribute('data-kt-rating-max', '10');
149
+ const instance = new KTRating(ratingEl);
150
+ const radios = ratingEl.querySelectorAll('input[type="radio"]');
151
+ expect(radios.length).toBe(10);
152
+ instance.setValue(8);
153
+ expect(instance.getValue()).toBe(8);
154
+ instance.dispose();
155
+ });
156
+ });
157
+
158
+ describe('getInstance and static methods', () => {
159
+ it('getInstance returns null for element without data-kt-rating', () => {
160
+ ratingEl.removeAttribute('data-kt-rating');
161
+ expect(KTRating.getInstance(ratingEl)).toBeNull();
162
+ });
163
+
164
+ it('getInstance returns instance for initialized element', () => {
165
+ const instance = new KTRating(ratingEl);
166
+ expect(KTRating.getInstance(ratingEl)).toBe(instance);
167
+ instance.dispose();
168
+ });
169
+
170
+ it('createInstances initializes all data-kt-rating elements', () => {
171
+ const el2 = document.createElement('div');
172
+ el2.setAttribute('data-kt-rating', 'true');
173
+ container.appendChild(el2);
174
+ KTRating.createInstances();
175
+ expect(KTRating.getInstance(ratingEl)).not.toBeNull();
176
+ expect(KTRating.getInstance(el2)).not.toBeNull();
177
+ KTRating.getInstance(ratingEl)?.dispose();
178
+ KTRating.getInstance(el2)?.dispose();
179
+ });
180
+
181
+ it('createInstances skips elements with data-kt-rating-lazy="true"', () => {
182
+ ratingEl.setAttribute('data-kt-rating-lazy', 'true');
183
+ KTRating.createInstances();
184
+ // Lazy elements are not auto-initialized, so no .kt-rating container yet
185
+ expect(ratingEl.querySelector('.kt-rating')).toBeNull();
186
+ });
187
+ });
188
+
189
+ describe('dispose', () => {
190
+ it('removes change listener and allows re-initialization', () => {
191
+ const instance = new KTRating(ratingEl);
192
+ instance.dispose();
193
+ // getInstance creates on demand, so assert re-init works instead
194
+ const instance2 = new KTRating(ratingEl);
195
+ expect(instance2).toBeInstanceOf(KTRating);
196
+ expect(instance2.getValue()).toBeNull();
197
+ instance2.setValue(2);
198
+ expect(instance2.getValue()).toBe(2);
199
+ instance2.dispose();
200
+ });
201
+
202
+ it('dispose is idempotent', () => {
203
+ const instance = new KTRating(ratingEl);
204
+ instance.dispose();
205
+ expect(() => instance.dispose()).not.toThrow();
206
+ });
207
+ });
208
+
209
+ describe('custom symbol', () => {
210
+ it('renders heart symbol when data-kt-rating-symbol="heart"', () => {
211
+ ratingEl.setAttribute('data-kt-rating-symbol', 'heart');
212
+ ratingEl.setAttribute('data-kt-rating-readonly', 'true');
213
+ ratingEl.setAttribute('data-kt-rating-value', '2');
214
+ const instance = new KTRating(ratingEl);
215
+ const wrapper = ratingEl.querySelector('.kt-rating');
216
+ expect(wrapper).not.toBeNull();
217
+ // Heart uses red fill path
218
+ const path = wrapper?.querySelector('path[fill-rule="evenodd"]');
219
+ expect(path).not.toBeNull();
220
+ instance.dispose();
221
+ });
222
+ });
223
+
224
+ describe('initial value in interactive mode', () => {
225
+ it('pre-selects radio when value is set via config', () => {
226
+ ratingEl.setAttribute('data-kt-rating-value', '2');
227
+ const instance = new KTRating(ratingEl);
228
+ expect(instance.getValue()).toBe(2);
229
+ const checked = ratingEl.querySelector<HTMLInputElement>('input[type="radio"]:checked');
230
+ expect(checked?.value).toBe('2');
231
+ instance.dispose();
232
+ });
233
+ });
234
+ });
@@ -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 { KTRating } from './rating';
7
+ export type {
8
+ KTRatingConfigInterface,
9
+ KTRatingInterface,
10
+ KTRatingSymbolType,
11
+ } from './types';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * KTUI Rating component
3
+ * Layout and symbol styling; colors use Tailwind utilities (filled/unfilled, dark mode).
4
+ */
5
+ .kt-rating {
6
+ display: flex;
7
+ align-items: center;
8
+ }
9
+ .kt-rating-label {
10
+ pointer-events: auto;
11
+ }
@@ -0,0 +1,234 @@
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 KTDom from '../../helpers/dom';
8
+ import KTComponent from '../component';
9
+ import { KTRatingConfigInterface, KTRatingInterface } from './types';
10
+
11
+ declare global {
12
+ interface Window {
13
+ KTRating: typeof KTRating;
14
+ }
15
+ }
16
+
17
+ const STAR_SVG =
18
+ '<path d="M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.282.95l-3.522 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z"/>';
19
+ const HEART_SVG =
20
+ '<path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z"/>';
21
+
22
+ export class KTRating extends KTComponent implements KTRatingInterface {
23
+ protected override _name: string = 'rating';
24
+ protected override _defaultConfig: KTRatingConfigInterface = {
25
+ value: 0,
26
+ max: 5,
27
+ readonly: false,
28
+ name: 'rating',
29
+ symbol: 'star',
30
+ lazy: false,
31
+ };
32
+ protected override _config: KTRatingConfigInterface = this._defaultConfig;
33
+ protected _container: HTMLElement | null = null;
34
+ protected _changeListener: ((e: Event) => void) | null = null;
35
+
36
+ constructor(
37
+ element: HTMLElement,
38
+ config: KTRatingConfigInterface | null = null,
39
+ ) {
40
+ super();
41
+
42
+ if (KTData.has(element as HTMLElement, this._name)) return;
43
+
44
+ this._init(element);
45
+ this._buildConfig(config);
46
+
47
+ this._render();
48
+ if (!this._config.readonly) {
49
+ this._handlers();
50
+ }
51
+ }
52
+
53
+ protected _getMax(): number {
54
+ const max = Number(this._getOption('max'));
55
+ return Number.isFinite(max) && max >= 1 ? Math.floor(max) : 5;
56
+ }
57
+
58
+ protected _getValue(): number {
59
+ const v = Number(this._getOption('value'));
60
+ const max = this._getMax();
61
+ return Number.isFinite(v) && v >= 0 && v <= max ? Math.floor(v) : 0;
62
+ }
63
+
64
+ protected _render(): void {
65
+ if (!this._element) return;
66
+ const max = this._getMax();
67
+ const value = this._getValue();
68
+ const readonly = this._config.readonly === true;
69
+ const symbol = (this._config.symbol as string) || 'star';
70
+ const name = (this._config.name as string) || 'rating';
71
+
72
+ const isStar = symbol !== 'heart';
73
+ const filledClass = isStar
74
+ ? 'text-yellow-400 dark:text-yellow-600'
75
+ : 'text-red-500 dark:text-red-500';
76
+ const unfilledClass =
77
+ 'text-muted-foreground/50 dark:text-muted-foreground/50';
78
+ const path = isStar ? STAR_SVG : HEART_SVG;
79
+ 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
+
81
+ const container = document.createElement('div');
82
+ container.className = 'kt-rating flex flex-row-reverse justify-end items-center gap-0';
83
+ container.setAttribute('role', readonly ? 'img' : 'group');
84
+ container.setAttribute('aria-label', `Rating: ${value} of ${max}`);
85
+ if (readonly) {
86
+ container.setAttribute('aria-valuenow', String(value));
87
+ container.setAttribute('aria-valuemin', '0');
88
+ container.setAttribute('aria-valuemax', String(max));
89
+ }
90
+
91
+ if (readonly) {
92
+ for (let i = max; i >= 1; i--) {
93
+ const filled = i <= value;
94
+ const span = document.createElement('span');
95
+ span.className = filled ? filledClass : unfilledClass;
96
+ span.innerHTML = svg;
97
+ container.appendChild(span);
98
+ }
99
+ } else {
100
+ container.setAttribute('aria-valuenow', String(value));
101
+ container.setAttribute('aria-valuemin', '1');
102
+ container.setAttribute('aria-valuemax', String(max));
103
+ for (let i = max; i >= 1; i--) {
104
+ const id = `kt-rating-${this._uid}-${i}`;
105
+ const radio = document.createElement('input');
106
+ radio.type = 'radio';
107
+ radio.name = name;
108
+ radio.value = String(i);
109
+ radio.id = id;
110
+ radio.className =
111
+ 'peer -ms-5 size-5 bg-transparent border-0 text-transparent cursor-pointer appearance-none checked:bg-none focus:bg-none focus:ring-0 focus:ring-offset-0';
112
+ radio.setAttribute('aria-label', `Rate ${i} of ${max}`);
113
+ if (i === value) radio.checked = true;
114
+
115
+ const label = document.createElement('label');
116
+ label.htmlFor = id;
117
+ label.setAttribute('data-kt-rating-value', String(i));
118
+ label.className = `cursor-pointer kt-rating-label ${i <= value ? filledClass : unfilledClass}`;
119
+ label.innerHTML = svg;
120
+
121
+ container.appendChild(radio);
122
+ container.appendChild(label);
123
+ }
124
+ this._updateInteractiveDisplay();
125
+ }
126
+
127
+ this._element.innerHTML = '';
128
+ this._element.appendChild(container);
129
+ this._container = container;
130
+ }
131
+
132
+ protected _updateInteractiveDisplay(): void {
133
+ if (!this._container || this._config.readonly) return;
134
+ const val = this.getValue();
135
+ const max = this._getMax();
136
+ const isStar = (this._config.symbol as string) !== 'heart';
137
+ const filledClass = isStar
138
+ ? 'text-yellow-400 dark:text-yellow-600'
139
+ : 'text-red-500 dark:text-red-500';
140
+ const unfilledClass =
141
+ 'text-muted-foreground/50 dark:text-muted-foreground/50';
142
+ const filledTokens = filledClass.split(' ');
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');
151
+ this._container.setAttribute('aria-label', `Rating: ${val ?? 0} of ${max}`);
152
+ }
153
+
154
+ protected _handlers(): void {
155
+ if (!this._container) return;
156
+ this._changeListener = () => {
157
+ this._updateInteractiveDisplay();
158
+ const val = this.getValue();
159
+ this._fireEvent('change', { value: val });
160
+ this._dispatchEvent('kt.rating.change', { value: val });
161
+ };
162
+ this._container.addEventListener('change', this._changeListener);
163
+ }
164
+
165
+ public getValue(): number | null {
166
+ if (!this._element) return null;
167
+ if (this._config.readonly) {
168
+ const v = this._getValue();
169
+ return v > 0 ? v : null;
170
+ }
171
+ const radio = this._container?.querySelector<HTMLInputElement>(
172
+ 'input[type="radio"]:checked',
173
+ );
174
+ if (!radio) return null;
175
+ const n = parseInt(radio.value, 10);
176
+ return Number.isFinite(n) ? n : null;
177
+ }
178
+
179
+ public setValue(value: number | null): void {
180
+ if (!this._container) return;
181
+ const max = this._getMax();
182
+ if (this._config.readonly) return;
183
+ if (value !== null && value >= 1 && value <= max) {
184
+ const radio = this._container.querySelector<HTMLInputElement>(
185
+ `input[type="radio"][value="${value}"]`,
186
+ );
187
+ if (radio) {
188
+ radio.checked = true;
189
+ this._updateInteractiveDisplay();
190
+ }
191
+ } else {
192
+ this._container.querySelectorAll<HTMLInputElement>('input[type="radio"]').forEach((r) => {
193
+ r.checked = false;
194
+ });
195
+ this._updateInteractiveDisplay();
196
+ }
197
+ }
198
+
199
+ public override dispose(): void {
200
+ if (this._container && this._changeListener) {
201
+ this._container.removeEventListener('change', this._changeListener);
202
+ this._changeListener = null;
203
+ }
204
+ this._container = null;
205
+ super.dispose();
206
+ }
207
+
208
+ public static getInstance(element: HTMLElement): KTRating | null {
209
+ if (!element) return null;
210
+ if (KTData.has(element, 'rating')) {
211
+ return KTData.get(element, 'rating') as KTRating;
212
+ }
213
+ if (element.getAttribute('data-kt-rating') !== null) {
214
+ return new KTRating(element);
215
+ }
216
+ return null;
217
+ }
218
+
219
+ public static createInstances(): void {
220
+ const elements = document.querySelectorAll<HTMLElement>('[data-kt-rating]');
221
+ elements.forEach((el) => {
222
+ if (el.getAttribute('data-kt-rating-lazy') === 'true') return;
223
+ new KTRating(el);
224
+ });
225
+ }
226
+
227
+ public static init(): void {
228
+ KTRating.createInstances();
229
+ }
230
+ }
231
+
232
+ if (typeof window !== 'undefined') {
233
+ window.KTRating = KTRating;
234
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ */
5
+
6
+ export type KTRatingSymbolType = 'star' | 'heart';
7
+
8
+ export interface KTRatingConfigInterface {
9
+ /** Current rating value (1 to max). Omit or 0 for no selection. */
10
+ value?: number;
11
+ /** Maximum rating (default 5). */
12
+ max?: number;
13
+ /** If true, only display the rating; no user input. */
14
+ readonly?: boolean;
15
+ /** Form field name for interactive mode (for form submission). */
16
+ name?: string;
17
+ /** Symbol to display: 'star' (default) or 'heart'. */
18
+ symbol?: KTRatingSymbolType;
19
+ /** If true, do not auto-initialize; init() must be called programmatically. */
20
+ lazy?: boolean;
21
+ }
22
+
23
+ export interface KTRatingInterface {
24
+ getValue(): number | null;
25
+ setValue(value: number | null): void;
26
+ dispose(): void;
27
+ }