@keenthemes/ktui 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/CONTRIBUTING.md +88 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +124 -0
  4. package/dist/ktui.js +19201 -0
  5. package/dist/ktui.min.js +2 -0
  6. package/dist/ktui.min.js.map +1 -0
  7. package/lib/cjs/components/accordion/accordion.js +168 -0
  8. package/lib/cjs/components/accordion/accordion.js.map +1 -0
  9. package/lib/cjs/components/accordion/index.js +6 -0
  10. package/lib/cjs/components/accordion/index.js.map +1 -0
  11. package/lib/cjs/components/accordion/types.js +3 -0
  12. package/lib/cjs/components/accordion/types.js.map +1 -0
  13. package/lib/cjs/components/collapse/collapse.js +169 -0
  14. package/lib/cjs/components/collapse/collapse.js.map +1 -0
  15. package/lib/cjs/components/collapse/index.js +6 -0
  16. package/lib/cjs/components/collapse/index.js.map +1 -0
  17. package/lib/cjs/components/collapse/types.js +3 -0
  18. package/lib/cjs/components/collapse/types.js.map +1 -0
  19. package/lib/cjs/components/component.js +135 -0
  20. package/lib/cjs/components/component.js.map +1 -0
  21. package/lib/cjs/components/config.js +26 -0
  22. package/lib/cjs/components/config.js.map +1 -0
  23. package/lib/cjs/components/config.umd.js +23 -0
  24. package/lib/cjs/components/config.umd.js.map +1 -0
  25. package/lib/cjs/components/constants.js +15 -0
  26. package/lib/cjs/components/constants.js.map +1 -0
  27. package/lib/cjs/components/datatable/datatable.js +1464 -0
  28. package/lib/cjs/components/datatable/datatable.js.map +1 -0
  29. package/lib/cjs/components/datatable/index.js +6 -0
  30. package/lib/cjs/components/datatable/index.js.map +1 -0
  31. package/lib/cjs/components/datatable/types.js +3 -0
  32. package/lib/cjs/components/datatable/types.js.map +1 -0
  33. package/lib/cjs/components/dismiss/dismiss.js +131 -0
  34. package/lib/cjs/components/dismiss/dismiss.js.map +1 -0
  35. package/lib/cjs/components/dismiss/index.js +6 -0
  36. package/lib/cjs/components/dismiss/index.js.map +1 -0
  37. package/lib/cjs/components/dismiss/types.js +3 -0
  38. package/lib/cjs/components/dismiss/types.js.map +1 -0
  39. package/lib/cjs/components/drawer/drawer.js +347 -0
  40. package/lib/cjs/components/drawer/drawer.js.map +1 -0
  41. package/lib/cjs/components/drawer/index.js +6 -0
  42. package/lib/cjs/components/drawer/index.js.map +1 -0
  43. package/lib/cjs/components/drawer/types.js +3 -0
  44. package/lib/cjs/components/drawer/types.js.map +1 -0
  45. package/lib/cjs/components/dropdown/dropdown.js +403 -0
  46. package/lib/cjs/components/dropdown/dropdown.js.map +1 -0
  47. package/lib/cjs/components/dropdown/index.js +6 -0
  48. package/lib/cjs/components/dropdown/index.js.map +1 -0
  49. package/lib/cjs/components/dropdown/types.js +3 -0
  50. package/lib/cjs/components/dropdown/types.js.map +1 -0
  51. package/lib/cjs/components/image-input/image-input.js +191 -0
  52. package/lib/cjs/components/image-input/image-input.js.map +1 -0
  53. package/lib/cjs/components/image-input/index.js +6 -0
  54. package/lib/cjs/components/image-input/index.js.map +1 -0
  55. package/lib/cjs/components/image-input/types.js +3 -0
  56. package/lib/cjs/components/image-input/types.js.map +1 -0
  57. package/lib/cjs/components/menu/index.js +6 -0
  58. package/lib/cjs/components/menu/index.js.map +1 -0
  59. package/lib/cjs/components/menu/menu.js +1021 -0
  60. package/lib/cjs/components/menu/menu.js.map +1 -0
  61. package/lib/cjs/components/menu/types.js +3 -0
  62. package/lib/cjs/components/menu/types.js.map +1 -0
  63. package/lib/cjs/components/modal/index.js +6 -0
  64. package/lib/cjs/components/modal/index.js.map +1 -0
  65. package/lib/cjs/components/modal/modal.js +316 -0
  66. package/lib/cjs/components/modal/modal.js.map +1 -0
  67. package/lib/cjs/components/modal/types.js +3 -0
  68. package/lib/cjs/components/modal/types.js.map +1 -0
  69. package/lib/cjs/components/reparent/index.js +6 -0
  70. package/lib/cjs/components/reparent/index.js.map +1 -0
  71. package/lib/cjs/components/reparent/reparent.js +93 -0
  72. package/lib/cjs/components/reparent/reparent.js.map +1 -0
  73. package/lib/cjs/components/reparent/types.js +3 -0
  74. package/lib/cjs/components/reparent/types.js.map +1 -0
  75. package/lib/cjs/components/scrollable/index.js +6 -0
  76. package/lib/cjs/components/scrollable/index.js.map +1 -0
  77. package/lib/cjs/components/scrollable/scrollable.js +259 -0
  78. package/lib/cjs/components/scrollable/scrollable.js.map +1 -0
  79. package/lib/cjs/components/scrollable/types.js +3 -0
  80. package/lib/cjs/components/scrollable/types.js.map +1 -0
  81. package/lib/cjs/components/scrollspy/index.js +6 -0
  82. package/lib/cjs/components/scrollspy/index.js.map +1 -0
  83. package/lib/cjs/components/scrollspy/scrollspy.js +174 -0
  84. package/lib/cjs/components/scrollspy/scrollspy.js.map +1 -0
  85. package/lib/cjs/components/scrollspy/types.js +3 -0
  86. package/lib/cjs/components/scrollspy/types.js.map +1 -0
  87. package/lib/cjs/components/scrollto/index.js +6 -0
  88. package/lib/cjs/components/scrollto/index.js.map +1 -0
  89. package/lib/cjs/components/scrollto/scrollto.js +103 -0
  90. package/lib/cjs/components/scrollto/scrollto.js.map +1 -0
  91. package/lib/cjs/components/scrollto/types.js +3 -0
  92. package/lib/cjs/components/scrollto/types.js.map +1 -0
  93. package/lib/cjs/components/stepper/index.js +6 -0
  94. package/lib/cjs/components/stepper/index.js.map +1 -0
  95. package/lib/cjs/components/stepper/stepper.js +258 -0
  96. package/lib/cjs/components/stepper/stepper.js.map +1 -0
  97. package/lib/cjs/components/stepper/types.js +3 -0
  98. package/lib/cjs/components/stepper/types.js.map +1 -0
  99. package/lib/cjs/components/sticky/index.js +6 -0
  100. package/lib/cjs/components/sticky/index.js.map +1 -0
  101. package/lib/cjs/components/sticky/sticky.js +297 -0
  102. package/lib/cjs/components/sticky/sticky.js.map +1 -0
  103. package/lib/cjs/components/sticky/types.js +3 -0
  104. package/lib/cjs/components/sticky/types.js.map +1 -0
  105. package/lib/cjs/components/tabs/index.js +6 -0
  106. package/lib/cjs/components/tabs/index.js.map +1 -0
  107. package/lib/cjs/components/tabs/tabs.js +146 -0
  108. package/lib/cjs/components/tabs/tabs.js.map +1 -0
  109. package/lib/cjs/components/tabs/types.js +3 -0
  110. package/lib/cjs/components/tabs/types.js.map +1 -0
  111. package/lib/cjs/components/theme/index.js +6 -0
  112. package/lib/cjs/components/theme/index.js.map +1 -0
  113. package/lib/cjs/components/theme/theme.js +147 -0
  114. package/lib/cjs/components/theme/theme.js.map +1 -0
  115. package/lib/cjs/components/theme/types.js +3 -0
  116. package/lib/cjs/components/theme/types.js.map +1 -0
  117. package/lib/cjs/components/toggle/index.js +6 -0
  118. package/lib/cjs/components/toggle/index.js.map +1 -0
  119. package/lib/cjs/components/toggle/toggle.js +139 -0
  120. package/lib/cjs/components/toggle/toggle.js.map +1 -0
  121. package/lib/cjs/components/toggle/types.js +3 -0
  122. package/lib/cjs/components/toggle/types.js.map +1 -0
  123. package/lib/cjs/components/toggle-password/index.js +6 -0
  124. package/lib/cjs/components/toggle-password/index.js.map +1 -0
  125. package/lib/cjs/components/toggle-password/toggle-password.js +131 -0
  126. package/lib/cjs/components/toggle-password/toggle-password.js.map +1 -0
  127. package/lib/cjs/components/toggle-password/types.js +3 -0
  128. package/lib/cjs/components/toggle-password/types.js.map +1 -0
  129. package/lib/cjs/components/tooltip/index.js +6 -0
  130. package/lib/cjs/components/tooltip/index.js.map +1 -0
  131. package/lib/cjs/components/tooltip/tooltip.js +271 -0
  132. package/lib/cjs/components/tooltip/tooltip.js.map +1 -0
  133. package/lib/cjs/components/tooltip/types.js +3 -0
  134. package/lib/cjs/components/tooltip/types.js.map +1 -0
  135. package/lib/cjs/helpers/data.js +33 -0
  136. package/lib/cjs/helpers/data.js.map +1 -0
  137. package/lib/cjs/helpers/dom.js +297 -0
  138. package/lib/cjs/helpers/dom.js.map +1 -0
  139. package/lib/cjs/helpers/event-handler.js +36 -0
  140. package/lib/cjs/helpers/event-handler.js.map +1 -0
  141. package/lib/cjs/helpers/utils.js +94 -0
  142. package/lib/cjs/helpers/utils.js.map +1 -0
  143. package/lib/cjs/index.js +105 -0
  144. package/lib/cjs/index.js.map +1 -0
  145. package/lib/cjs/types.js +3 -0
  146. package/lib/cjs/types.js.map +1 -0
  147. package/lib/esm/components/accordion/accordion.js +165 -0
  148. package/lib/esm/components/accordion/accordion.js.map +1 -0
  149. package/lib/esm/components/accordion/index.js +2 -0
  150. package/lib/esm/components/accordion/index.js.map +1 -0
  151. package/lib/esm/components/accordion/types.js +2 -0
  152. package/lib/esm/components/accordion/types.js.map +1 -0
  153. package/lib/esm/components/collapse/collapse.js +166 -0
  154. package/lib/esm/components/collapse/collapse.js.map +1 -0
  155. package/lib/esm/components/collapse/index.js +2 -0
  156. package/lib/esm/components/collapse/index.js.map +1 -0
  157. package/lib/esm/components/collapse/types.js +2 -0
  158. package/lib/esm/components/collapse/types.js.map +1 -0
  159. package/lib/esm/components/component.js +133 -0
  160. package/lib/esm/components/component.js.map +1 -0
  161. package/lib/esm/components/config.js +24 -0
  162. package/lib/esm/components/config.js.map +1 -0
  163. package/lib/esm/components/config.umd.js +23 -0
  164. package/lib/esm/components/config.umd.js.map +1 -0
  165. package/lib/esm/components/constants.js +12 -0
  166. package/lib/esm/components/constants.js.map +1 -0
  167. package/lib/esm/components/datatable/datatable.js +1461 -0
  168. package/lib/esm/components/datatable/datatable.js.map +1 -0
  169. package/lib/esm/components/datatable/index.js +2 -0
  170. package/lib/esm/components/datatable/index.js.map +1 -0
  171. package/lib/esm/components/datatable/types.js +2 -0
  172. package/lib/esm/components/datatable/types.js.map +1 -0
  173. package/lib/esm/components/dismiss/dismiss.js +128 -0
  174. package/lib/esm/components/dismiss/dismiss.js.map +1 -0
  175. package/lib/esm/components/dismiss/index.js +2 -0
  176. package/lib/esm/components/dismiss/index.js.map +1 -0
  177. package/lib/esm/components/dismiss/types.js +2 -0
  178. package/lib/esm/components/dismiss/types.js.map +1 -0
  179. package/lib/esm/components/drawer/drawer.js +344 -0
  180. package/lib/esm/components/drawer/drawer.js.map +1 -0
  181. package/lib/esm/components/drawer/index.js +2 -0
  182. package/lib/esm/components/drawer/index.js.map +1 -0
  183. package/lib/esm/components/drawer/types.js +2 -0
  184. package/lib/esm/components/drawer/types.js.map +1 -0
  185. package/lib/esm/components/dropdown/dropdown.js +400 -0
  186. package/lib/esm/components/dropdown/dropdown.js.map +1 -0
  187. package/lib/esm/components/dropdown/index.js +2 -0
  188. package/lib/esm/components/dropdown/index.js.map +1 -0
  189. package/lib/esm/components/dropdown/types.js +2 -0
  190. package/lib/esm/components/dropdown/types.js.map +1 -0
  191. package/lib/esm/components/image-input/image-input.js +188 -0
  192. package/lib/esm/components/image-input/image-input.js.map +1 -0
  193. package/lib/esm/components/image-input/index.js +2 -0
  194. package/lib/esm/components/image-input/index.js.map +1 -0
  195. package/lib/esm/components/image-input/types.js +2 -0
  196. package/lib/esm/components/image-input/types.js.map +1 -0
  197. package/lib/esm/components/menu/index.js +2 -0
  198. package/lib/esm/components/menu/index.js.map +1 -0
  199. package/lib/esm/components/menu/menu.js +1018 -0
  200. package/lib/esm/components/menu/menu.js.map +1 -0
  201. package/lib/esm/components/menu/types.js +2 -0
  202. package/lib/esm/components/menu/types.js.map +1 -0
  203. package/lib/esm/components/modal/index.js +2 -0
  204. package/lib/esm/components/modal/index.js.map +1 -0
  205. package/lib/esm/components/modal/modal.js +313 -0
  206. package/lib/esm/components/modal/modal.js.map +1 -0
  207. package/lib/esm/components/modal/types.js +2 -0
  208. package/lib/esm/components/modal/types.js.map +1 -0
  209. package/lib/esm/components/reparent/index.js +2 -0
  210. package/lib/esm/components/reparent/index.js.map +1 -0
  211. package/lib/esm/components/reparent/reparent.js +90 -0
  212. package/lib/esm/components/reparent/reparent.js.map +1 -0
  213. package/lib/esm/components/reparent/types.js +2 -0
  214. package/lib/esm/components/reparent/types.js.map +1 -0
  215. package/lib/esm/components/scrollable/index.js +2 -0
  216. package/lib/esm/components/scrollable/index.js.map +1 -0
  217. package/lib/esm/components/scrollable/scrollable.js +256 -0
  218. package/lib/esm/components/scrollable/scrollable.js.map +1 -0
  219. package/lib/esm/components/scrollable/types.js +2 -0
  220. package/lib/esm/components/scrollable/types.js.map +1 -0
  221. package/lib/esm/components/scrollspy/index.js +2 -0
  222. package/lib/esm/components/scrollspy/index.js.map +1 -0
  223. package/lib/esm/components/scrollspy/scrollspy.js +171 -0
  224. package/lib/esm/components/scrollspy/scrollspy.js.map +1 -0
  225. package/lib/esm/components/scrollspy/types.js +2 -0
  226. package/lib/esm/components/scrollspy/types.js.map +1 -0
  227. package/lib/esm/components/scrollto/index.js +2 -0
  228. package/lib/esm/components/scrollto/index.js.map +1 -0
  229. package/lib/esm/components/scrollto/scrollto.js +100 -0
  230. package/lib/esm/components/scrollto/scrollto.js.map +1 -0
  231. package/lib/esm/components/scrollto/types.js +2 -0
  232. package/lib/esm/components/scrollto/types.js.map +1 -0
  233. package/lib/esm/components/stepper/index.js +2 -0
  234. package/lib/esm/components/stepper/index.js.map +1 -0
  235. package/lib/esm/components/stepper/stepper.js +255 -0
  236. package/lib/esm/components/stepper/stepper.js.map +1 -0
  237. package/lib/esm/components/stepper/types.js +2 -0
  238. package/lib/esm/components/stepper/types.js.map +1 -0
  239. package/lib/esm/components/sticky/index.js +2 -0
  240. package/lib/esm/components/sticky/index.js.map +1 -0
  241. package/lib/esm/components/sticky/sticky.js +294 -0
  242. package/lib/esm/components/sticky/sticky.js.map +1 -0
  243. package/lib/esm/components/sticky/types.js +2 -0
  244. package/lib/esm/components/sticky/types.js.map +1 -0
  245. package/lib/esm/components/tabs/index.js +2 -0
  246. package/lib/esm/components/tabs/index.js.map +1 -0
  247. package/lib/esm/components/tabs/tabs.js +143 -0
  248. package/lib/esm/components/tabs/tabs.js.map +1 -0
  249. package/lib/esm/components/tabs/types.js +2 -0
  250. package/lib/esm/components/tabs/types.js.map +1 -0
  251. package/lib/esm/components/theme/index.js +2 -0
  252. package/lib/esm/components/theme/index.js.map +1 -0
  253. package/lib/esm/components/theme/theme.js +144 -0
  254. package/lib/esm/components/theme/theme.js.map +1 -0
  255. package/lib/esm/components/theme/types.js +2 -0
  256. package/lib/esm/components/theme/types.js.map +1 -0
  257. package/lib/esm/components/toggle/index.js +2 -0
  258. package/lib/esm/components/toggle/index.js.map +1 -0
  259. package/lib/esm/components/toggle/toggle.js +136 -0
  260. package/lib/esm/components/toggle/toggle.js.map +1 -0
  261. package/lib/esm/components/toggle/types.js +2 -0
  262. package/lib/esm/components/toggle/types.js.map +1 -0
  263. package/lib/esm/components/toggle-password/index.js +2 -0
  264. package/lib/esm/components/toggle-password/index.js.map +1 -0
  265. package/lib/esm/components/toggle-password/toggle-password.js +128 -0
  266. package/lib/esm/components/toggle-password/toggle-password.js.map +1 -0
  267. package/lib/esm/components/toggle-password/types.js +2 -0
  268. package/lib/esm/components/toggle-password/types.js.map +1 -0
  269. package/lib/esm/components/tooltip/index.js +2 -0
  270. package/lib/esm/components/tooltip/index.js.map +1 -0
  271. package/lib/esm/components/tooltip/tooltip.js +268 -0
  272. package/lib/esm/components/tooltip/tooltip.js.map +1 -0
  273. package/lib/esm/components/tooltip/types.js +2 -0
  274. package/lib/esm/components/tooltip/types.js.map +1 -0
  275. package/lib/esm/helpers/data.js +31 -0
  276. package/lib/esm/helpers/data.js.map +1 -0
  277. package/lib/esm/helpers/dom.js +295 -0
  278. package/lib/esm/helpers/dom.js.map +1 -0
  279. package/lib/esm/helpers/event-handler.js +34 -0
  280. package/lib/esm/helpers/event-handler.js.map +1 -0
  281. package/lib/esm/helpers/utils.js +92 -0
  282. package/lib/esm/helpers/utils.js.map +1 -0
  283. package/lib/esm/index.js +79 -0
  284. package/lib/esm/index.js.map +1 -0
  285. package/lib/esm/types.js +2 -0
  286. package/lib/esm/types.js.map +1 -0
  287. package/package.json +85 -0
  288. package/prettier.config.js +9 -0
  289. package/src/components/accordion/accordion-menu.css +51 -0
  290. package/src/components/accordion/accordion.css +86 -0
  291. package/src/components/accordion/accordion.ts +221 -0
  292. package/src/components/accordion/index.ts +7 -0
  293. package/src/components/accordion/types.ts +16 -0
  294. package/src/components/alert/alert.css +282 -0
  295. package/src/components/avatar/avatar.css +46 -0
  296. package/src/components/badge/badge.css +176 -0
  297. package/src/components/breadcrumb/breadcrumb.css +38 -0
  298. package/src/components/btn/btn.css +227 -0
  299. package/src/components/card/card.css +158 -0
  300. package/src/components/checkbox/checkbox.css +74 -0
  301. package/src/components/collapse/collapse.css +14 -0
  302. package/src/components/collapse/collapse.ts +200 -0
  303. package/src/components/collapse/index.ts +7 -0
  304. package/src/components/collapse/types.ts +16 -0
  305. package/src/components/component.ts +132 -0
  306. package/src/components/constants.ts +16 -0
  307. package/src/components/datatable/datatable-checkbox.ts +236 -0
  308. package/src/components/datatable/datatable-sort.ts +154 -0
  309. package/src/components/datatable/datatable.css +110 -0
  310. package/src/components/datatable/datatable.ts +1657 -0
  311. package/src/components/datatable/index.ts +19 -0
  312. package/src/components/datatable/types.ts +203 -0
  313. package/src/components/datepicker/calendar.ts +1397 -0
  314. package/src/components/datepicker/config.ts +368 -0
  315. package/src/components/datepicker/datepicker.css +7 -0
  316. package/src/components/datepicker/datepicker.ts +1287 -0
  317. package/src/components/datepicker/dropdown.ts +757 -0
  318. package/src/components/datepicker/events.ts +149 -0
  319. package/src/components/datepicker/index.ts +10 -0
  320. package/src/components/datepicker/keyboard.ts +646 -0
  321. package/src/components/datepicker/locales.ts +80 -0
  322. package/src/components/datepicker/templates.ts +792 -0
  323. package/src/components/datepicker/types.ts +154 -0
  324. package/src/components/datepicker/utils.ts +631 -0
  325. package/src/components/dismiss/dismiss.css +10 -0
  326. package/src/components/dismiss/dismiss.ts +152 -0
  327. package/src/components/dismiss/index.ts +7 -0
  328. package/src/components/dismiss/types.ts +17 -0
  329. package/src/components/drawer/drawer.css +97 -0
  330. package/src/components/drawer/drawer.ts +437 -0
  331. package/src/components/drawer/index.ts +7 -0
  332. package/src/components/drawer/types.ts +25 -0
  333. package/src/components/dropdown/dropdown-menu.css +56 -0
  334. package/src/components/dropdown/dropdown.css +46 -0
  335. package/src/components/dropdown/dropdown.ts +549 -0
  336. package/src/components/dropdown/index.ts +7 -0
  337. package/src/components/dropdown/types.ts +28 -0
  338. package/src/components/form/form.css +54 -0
  339. package/src/components/image-input/image-input.css +56 -0
  340. package/src/components/image-input/image-input.ts +249 -0
  341. package/src/components/image-input/index.ts +10 -0
  342. package/src/components/image-input/types.ts +12 -0
  343. package/src/components/input/input-group.css +42 -0
  344. package/src/components/input/input.css +136 -0
  345. package/src/components/kbd/kbd.css +30 -0
  346. package/src/components/label/label.css +20 -0
  347. package/src/components/link/link.css +81 -0
  348. package/src/components/modal/index.ts +7 -0
  349. package/src/components/modal/modal.css +73 -0
  350. package/src/components/modal/modal.ts +382 -0
  351. package/src/components/modal/types.ts +21 -0
  352. package/src/components/pagination/pagination.css +26 -0
  353. package/src/components/popover/popover.css +22 -0
  354. package/src/components/progress/progress.css +51 -0
  355. package/src/components/radio/radio.css +51 -0
  356. package/src/components/reparent/index.ts +7 -0
  357. package/src/components/reparent/reparent.ts +109 -0
  358. package/src/components/reparent/types.ts +15 -0
  359. package/src/components/scrollable/index.ts +10 -0
  360. package/src/components/scrollable/scrollable.css +29 -0
  361. package/src/components/scrollable/scrollable.ts +297 -0
  362. package/src/components/scrollable/types.ts +16 -0
  363. package/src/components/scrollspy/index.ts +7 -0
  364. package/src/components/scrollspy/scrollspy.css +13 -0
  365. package/src/components/scrollspy/scrollspy.ts +224 -0
  366. package/src/components/scrollspy/types.ts +15 -0
  367. package/src/components/scrollto/index.ts +7 -0
  368. package/src/components/scrollto/scrollto.ts +127 -0
  369. package/src/components/scrollto/types.ts +15 -0
  370. package/src/components/select/combobox.ts +305 -0
  371. package/src/components/select/config.ts +324 -0
  372. package/src/components/select/dropdown.ts +510 -0
  373. package/src/components/select/index.ts +13 -0
  374. package/src/components/select/option.ts +43 -0
  375. package/src/components/select/remote.ts +477 -0
  376. package/src/components/select/search.ts +430 -0
  377. package/src/components/select/select.css +105 -0
  378. package/src/components/select/select.ts +1916 -0
  379. package/src/components/select/tags.ts +123 -0
  380. package/src/components/select/templates.ts +531 -0
  381. package/src/components/select/types.ts +36 -0
  382. package/src/components/select/utils.ts +747 -0
  383. package/src/components/select/variants.css +5 -0
  384. package/src/components/separator/separator.css +14 -0
  385. package/src/components/skeleton/skeleton.css +10 -0
  386. package/src/components/stepper/index.ts +7 -0
  387. package/src/components/stepper/stepper.css +49 -0
  388. package/src/components/stepper/stepper.ts +308 -0
  389. package/src/components/stepper/types.ts +13 -0
  390. package/src/components/sticky/index.ts +7 -0
  391. package/src/components/sticky/sticky.css +22 -0
  392. package/src/components/sticky/sticky.ts +381 -0
  393. package/src/components/sticky/types.ts +23 -0
  394. package/src/components/switch/switch.css +110 -0
  395. package/src/components/table/table.css +168 -0
  396. package/src/components/tabs/index.ts +7 -0
  397. package/src/components/tabs/tabs.css +40 -0
  398. package/src/components/tabs/tabs.ts +190 -0
  399. package/src/components/tabs/types.ts +13 -0
  400. package/src/components/textarea/textarea.css +35 -0
  401. package/src/components/theme-switch/index.ts +10 -0
  402. package/src/components/theme-switch/theme-switch.css +22 -0
  403. package/src/components/theme-switch/theme-switch.ts +176 -0
  404. package/src/components/theme-switch/types.ts +15 -0
  405. package/src/components/toggle/index.ts +7 -0
  406. package/src/components/toggle/toggle.css +13 -0
  407. package/src/components/toggle/toggle.ts +173 -0
  408. package/src/components/toggle/types.ts +18 -0
  409. package/src/components/toggle-group/toggle-group.css +55 -0
  410. package/src/components/toggle-password/index.ts +10 -0
  411. package/src/components/toggle-password/toggle-password.css +13 -0
  412. package/src/components/toggle-password/toggle-password.ts +159 -0
  413. package/src/components/toggle-password/types.ts +13 -0
  414. package/src/components/tooltip/index.ts +7 -0
  415. package/src/components/tooltip/tooltip.css +18 -0
  416. package/src/components/tooltip/tooltip.ts +361 -0
  417. package/src/components/tooltip/types.ts +28 -0
  418. package/src/helpers/data.ts +46 -0
  419. package/src/helpers/dom.ts +405 -0
  420. package/src/helpers/event-handler.ts +61 -0
  421. package/src/helpers/utils.ts +183 -0
  422. package/src/index.ts +113 -0
  423. package/src/types.ts +23 -0
  424. package/styles.css +48 -0
  425. package/tsconfig.json +17 -0
  426. package/webpack.config.js +113 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ktui.min.js","mappings":"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","sources":["webpack://@keenthemes/ktui/webpack/universalModuleDefinition","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/createPopper.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/enums.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/popper.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/math.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/within.js","webpack://@keenthemes/ktui/./src/components/accordion/accordion.ts","webpack://@keenthemes/ktui/./src/components/accordion/index.ts","webpack://@keenthemes/ktui/./src/components/collapse/collapse.ts","webpack://@keenthemes/ktui/./src/components/collapse/index.ts","webpack://@keenthemes/ktui/./src/components/component.ts","webpack://@keenthemes/ktui/./src/components/datatable/datatable-checkbox.ts","webpack://@keenthemes/ktui/./src/components/datatable/datatable-sort.ts","webpack://@keenthemes/ktui/./src/components/datatable/datatable.ts","webpack://@keenthemes/ktui/./src/components/datatable/index.ts","webpack://@keenthemes/ktui/./src/components/datepicker/calendar.ts","webpack://@keenthemes/ktui/./src/components/datepicker/config.ts","webpack://@keenthemes/ktui/./src/components/datepicker/datepicker.ts","webpack://@keenthemes/ktui/./src/components/datepicker/dropdown.ts","webpack://@keenthemes/ktui/./src/components/datepicker/events.ts","webpack://@keenthemes/ktui/./src/components/datepicker/index.ts","webpack://@keenthemes/ktui/./src/components/datepicker/keyboard.ts","webpack://@keenthemes/ktui/./src/components/datepicker/locales.ts","webpack://@keenthemes/ktui/./src/components/datepicker/templates.ts","webpack://@keenthemes/ktui/./src/components/datepicker/types.ts","webpack://@keenthemes/ktui/./src/components/datepicker/utils.ts","webpack://@keenthemes/ktui/./src/components/dismiss/dismiss.ts","webpack://@keenthemes/ktui/./src/components/dismiss/index.ts","webpack://@keenthemes/ktui/./src/components/drawer/drawer.ts","webpack://@keenthemes/ktui/./src/components/drawer/index.ts","webpack://@keenthemes/ktui/./src/components/dropdown/dropdown.ts","webpack://@keenthemes/ktui/./src/components/dropdown/index.ts","webpack://@keenthemes/ktui/./src/components/image-input/image-input.ts","webpack://@keenthemes/ktui/./src/components/image-input/index.ts","webpack://@keenthemes/ktui/./src/components/modal/index.ts","webpack://@keenthemes/ktui/./src/components/modal/modal.ts","webpack://@keenthemes/ktui/./src/components/reparent/index.ts","webpack://@keenthemes/ktui/./src/components/reparent/reparent.ts","webpack://@keenthemes/ktui/./src/components/scrollable/index.ts","webpack://@keenthemes/ktui/./src/components/scrollable/scrollable.ts","webpack://@keenthemes/ktui/./src/components/scrollspy/index.ts","webpack://@keenthemes/ktui/./src/components/scrollspy/scrollspy.ts","webpack://@keenthemes/ktui/./src/components/scrollto/index.ts","webpack://@keenthemes/ktui/./src/components/scrollto/scrollto.ts","webpack://@keenthemes/ktui/./src/components/select/combobox.ts","webpack://@keenthemes/ktui/./src/components/select/config.ts","webpack://@keenthemes/ktui/./src/components/select/dropdown.ts","webpack://@keenthemes/ktui/./src/components/select/index.ts","webpack://@keenthemes/ktui/./src/components/select/option.ts","webpack://@keenthemes/ktui/./src/components/select/remote.ts","webpack://@keenthemes/ktui/./src/components/select/search.ts","webpack://@keenthemes/ktui/./src/components/select/select.ts","webpack://@keenthemes/ktui/./src/components/select/tags.ts","webpack://@keenthemes/ktui/./src/components/select/templates.ts","webpack://@keenthemes/ktui/./src/components/select/types.ts","webpack://@keenthemes/ktui/./src/components/select/utils.ts","webpack://@keenthemes/ktui/./src/components/stepper/index.ts","webpack://@keenthemes/ktui/./src/components/stepper/stepper.ts","webpack://@keenthemes/ktui/./src/components/sticky/index.ts","webpack://@keenthemes/ktui/./src/components/sticky/sticky.ts","webpack://@keenthemes/ktui/./src/components/tabs/index.ts","webpack://@keenthemes/ktui/./src/components/tabs/tabs.ts","webpack://@keenthemes/ktui/./src/components/theme-switch/index.ts","webpack://@keenthemes/ktui/./src/components/theme-switch/theme-switch.ts","webpack://@keenthemes/ktui/./src/components/toggle-password/index.ts","webpack://@keenthemes/ktui/./src/components/toggle-password/toggle-password.ts","webpack://@keenthemes/ktui/./src/components/toggle/index.ts","webpack://@keenthemes/ktui/./src/components/toggle/toggle.ts","webpack://@keenthemes/ktui/./src/components/tooltip/index.ts","webpack://@keenthemes/ktui/./src/components/tooltip/tooltip.ts","webpack://@keenthemes/ktui/./src/helpers/data.ts","webpack://@keenthemes/ktui/./src/helpers/dom.ts","webpack://@keenthemes/ktui/./src/helpers/event-handler.ts","webpack://@keenthemes/ktui/./src/helpers/utils.ts","webpack://@keenthemes/ktui/./src/index.ts","webpack://@keenthemes/ktui/webpack/bootstrap","webpack://@keenthemes/ktui/webpack/runtime/define property getters","webpack://@keenthemes/ktui/webpack/runtime/hasOwnProperty shorthand","webpack://@keenthemes/ktui/webpack/runtime/make namespace object","webpack://@keenthemes/ktui/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTAccordionInterface, KTAccordionConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_ACCORDION_INITIALIZED: boolean;\n\t\tKTAccordion: typeof KTAccordion;\n\t}\n}\n\nexport class KTAccordion extends KTComponent implements KTAccordionInterface {\n\tprotected override _name: string = 'accordion';\n\tprotected override _defaultConfig: KTAccordionConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tactiveClass: 'active',\n\t\texpandAll: false,\n\t};\n\tprotected override _config: KTAccordionConfigInterface = this._defaultConfig;\n\tprotected _accordionElements: NodeListOf<HTMLElement>;\n\n\tconstructor(element: HTMLElement, config?: KTAccordionConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-accordion-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst accordionElement = target.closest(\n\t\t\t\t\t'[data-kt-accordion-item]',\n\t\t\t\t) as HTMLElement;\n\n\t\t\t\tif (accordionElement) this._toggle(accordionElement);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _toggle(accordionElement: HTMLElement): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (accordionElement.classList.contains('active')) {\n\t\t\tthis._hide(accordionElement);\n\t\t} else {\n\t\t\tthis._show(accordionElement);\n\t\t}\n\t}\n\n\tprotected _show(accordionElement: HTMLElement): void {\n\t\tif (\n\t\t\taccordionElement.hasAttribute('animating') ||\n\t\t\taccordionElement.classList.contains(\n\t\t\t\tthis._getOption('activeClass') as string,\n\t\t\t)\n\t\t)\n\t\t\treturn;\n\n\t\tconst toggleElement = KTDom.child(\n\t\t\taccordionElement,\n\t\t\t'[data-kt-accordion-toggle]',\n\t\t);\n\t\tif (!toggleElement) return;\n\n\t\tconst contentElement = KTDom.getElement(\n\t\t\t`#${toggleElement.getAttribute('aria-controls')}`,\n\t\t);\n\t\tif (!contentElement) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ((this._getOption('expandAll') as boolean) === false) {\n\t\t\tthis._hideSiblings(accordionElement);\n\t\t}\n\n\t\taccordionElement.setAttribute('aria-expanded', 'true');\n\t\taccordionElement.classList.add(this._getOption('activeClass') as string);\n\n\t\taccordionElement.setAttribute('animating', 'true');\n\t\tcontentElement.classList.remove(this._getOption('hiddenClass') as string);\n\t\tcontentElement.style.height = `0px`;\n\t\tKTDom.reflow(contentElement);\n\t\tcontentElement.style.height = `${contentElement.scrollHeight}px`;\n\n\t\tKTDom.transitionEnd(contentElement, () => {\n\t\t\taccordionElement.removeAttribute('animating');\n\t\t\tcontentElement.style.height = '';\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(accordionElement: HTMLElement): void {\n\t\tif (\n\t\t\taccordionElement.hasAttribute('animating') ||\n\t\t\t!accordionElement.classList.contains(\n\t\t\t\tthis._getOption('activeClass') as string,\n\t\t\t)\n\t\t)\n\t\t\treturn;\n\n\t\tconst toggleElement = KTDom.child(\n\t\t\taccordionElement,\n\t\t\t'[data-kt-accordion-toggle]',\n\t\t);\n\t\tif (!toggleElement) return;\n\n\t\tconst contentElement = KTDom.getElement(\n\t\t\t`#${toggleElement.getAttribute('aria-controls')}`,\n\t\t);\n\t\tif (!contentElement) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\taccordionElement.setAttribute('aria-expanded', 'false');\n\n\t\tcontentElement.style.height = `${contentElement.scrollHeight}px`;\n\t\tKTDom.reflow(contentElement);\n\t\tcontentElement.style.height = '0px';\n\t\taccordionElement.setAttribute('animating', 'true');\n\n\t\tKTDom.transitionEnd(contentElement, () => {\n\t\t\taccordionElement.removeAttribute('animating');\n\t\t\taccordionElement.classList.remove(\n\t\t\t\tthis._getOption('activeClass') as string,\n\t\t\t);\n\t\t\tcontentElement.classList.add(this._getOption('hiddenClass') as string);\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _hideSiblings(accordionElement: HTMLElement): void {\n\t\tconst siblings = KTDom.siblings(accordionElement);\n\n\t\tsiblings?.forEach((sibling) => {\n\t\t\tthis._hide(sibling as HTMLElement);\n\t\t});\n\t}\n\n\tpublic show(accordionElement: HTMLElement): void {\n\t\tthis._show(accordionElement);\n\t}\n\n\tpublic hide(accordionElement: HTMLElement): void {\n\t\tthis._hide(accordionElement);\n\t}\n\n\tpublic toggle(accordionElement: HTMLElement): void {\n\t\tthis._toggle(accordionElement);\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTAccordion {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'accordion')) {\n\t\t\treturn KTData.get(element, 'accordion') as KTAccordion;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-accordion-initialized') === 'true') {\n\t\t\treturn new KTAccordion(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTAccordionConfigInterface,\n\t): KTAccordion {\n\t\treturn this.getInstance(element) || new KTAccordion(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-accordion]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTAccordion(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTAccordion.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTAccordion = KTAccordion;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTAccordion } from './accordion';\nexport type { KTAccordionConfigInterface, KTAccordionInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTCollapseInterface, KTCollapseConfigInterface } from './types';\n\nexport class KTCollapse extends KTComponent implements KTCollapseInterface {\n\tprotected override _name: string = 'collapse';\n\tprotected override _defaultConfig: KTCollapseConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tactiveClass: 'active',\n\t\ttarget: '',\n\t};\n\tprotected override _config: KTCollapseConfigInterface = this._defaultConfig;\n\tprotected _isAnimating: boolean = false;\n\tprotected _targetElement: HTMLElement;\n\n\tconstructor(element: HTMLElement, config?: KTCollapseConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-collapse') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _isOpen(): boolean {\n\t\treturn this._targetElement.classList.contains(\n\t\t\tthis._getOption('activeClass') as string,\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tthis._toggle();\n\t\t});\n\t}\n\n\tprotected _expand(): void {\n\t\tif (this._isAnimating || this._isOpen()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('expand', payload);\n\t\tthis._dispatchEvent('expand', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._element) {\n\t\t\tthis._element.setAttribute('aria-expanded', 'true');\n\t\t\tthis._element.classList.add(this._getOption('activeClass') as string);\n\t\t}\n\t\tthis._targetElement.classList.remove(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._targetElement.classList.add(this._getOption('activeClass') as string);\n\n\t\tthis._targetElement.style.height = '0px';\n\t\tthis._targetElement.style.overflow = 'hidden';\n\t\tKTDom.reflow(this._targetElement);\n\t\tthis._targetElement.style.height = `${this._targetElement.scrollHeight}px`;\n\t\tthis._isAnimating = true;\n\n\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\tthis._isAnimating = false;\n\t\t\tthis._targetElement.style.height = '';\n\t\t\tthis._targetElement.style.overflow = '';\n\n\t\t\tthis._fireEvent('expanded');\n\t\t\tthis._dispatchEvent('expanded');\n\t\t});\n\t}\n\n\tprotected _collapse(): void {\n\t\tif (this._isAnimating || !this._isOpen()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('collapse', payload);\n\t\tthis._dispatchEvent('collapse', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._element) return;\n\t\tthis._element.setAttribute('aria-expanded', 'false');\n\t\tthis._element.classList.remove(this._getOption('activeClass') as string);\n\t\tthis._targetElement.classList.remove(\n\t\t\tthis._getOption('activeClass') as string,\n\t\t);\n\n\t\tthis._targetElement.style.height = `${this._targetElement.scrollHeight}px`;\n\t\tKTDom.reflow(this._targetElement);\n\t\tthis._targetElement.style.height = `0px`;\n\t\tthis._targetElement.style.overflow = 'hidden';\n\t\tthis._isAnimating = true;\n\n\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\tthis._isAnimating = false;\n\t\t\tthis._targetElement.classList.add(\n\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t);\n\t\t\tthis._targetElement.style.overflow = '';\n\n\t\t\tthis._fireEvent('collapsed');\n\t\t\tthis._dispatchEvent('collapsed');\n\t\t});\n\t}\n\n\tprotected _toggle(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen()) {\n\t\t\tthis._collapse();\n\t\t} else {\n\t\t\tthis._expand();\n\t\t}\n\t}\n\n\tpublic expand(): void {\n\t\treturn this._expand();\n\t}\n\n\tpublic collapse(): void {\n\t\treturn this._collapse();\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTCollapse {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'collapse')) {\n\t\t\treturn KTData.get(element, 'collapse') as KTCollapse;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-collapse')) {\n\t\t\treturn new KTCollapse(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTCollapseConfigInterface,\n\t): KTCollapse {\n\t\treturn this.getInstance(element) || new KTCollapse(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-collapse]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTCollapse(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTCollapse.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTCollapse = KTCollapse;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTCollapse } from './collapse';\nexport type { KTCollapseConfigInterface, KTCollapseInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n/* eslint-disable guard-for-in */\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\ndeclare global {\n\tinterface Window {\n\t\tKTGlobalComponentsConfig: object;\n\t}\n}\n\nimport KTData from '../helpers/data';\nimport KTDom from '../helpers/dom';\nimport KTUtils from '../helpers/utils';\nimport { KTOptionType } from '../types';\n\nexport default class KTComponent {\n\tprotected _dataOptionPrefix: string = 'kt-';\n\tprotected _name: string;\n\tprotected _defaultConfig: object;\n\tprotected _config: object;\n\tprotected _events: Map<string, Map<string, CallableFunction>>;\n\tprotected _uid: string | null = null;\n\tprotected _element: HTMLElement | null = null;\n\n\tprotected _init(element: HTMLElement | null) {\n\t\telement = KTDom.getElement(element);\n\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element = element;\n\t\tthis._events = new Map();\n\t\tthis._uid = KTUtils.geUID(this._name);\n\n\t\tthis._element.setAttribute(`data-kt-${this._name}-initialized`, 'true');\n\n\t\tKTData.set(this._element, this._name, this);\n\t}\n\n\tprotected _fireEvent(eventType: string, payload: object = null): void {\n\t\tthis._events.get(eventType)?.forEach((callable) => {\n\t\t\tcallable(payload);\n\t\t});\n\t}\n\n\tprotected _dispatchEvent(eventType: string, payload: object = null): void {\n\t\tconst event = new CustomEvent(eventType, {\n\t\t\tdetail: { payload },\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t\tcomposed: false,\n\t\t});\n\n\t\tif (!this._element) return;\n\t\tthis._element.dispatchEvent(event);\n\t}\n\n\tprotected _getOption(name: string): KTOptionType {\n\t\tconst value = this._config[name as keyof object];\n\t\tconst reponsiveValue = KTDom.getCssProp(\n\t\t\tthis._element,\n\t\t\t`--kt-${this._name}-${KTUtils.camelReverseCase(name)}`,\n\t\t);\n\n\t\treturn reponsiveValue || value;\n\t}\n\n\tprotected _getGlobalConfig(): object {\n\t\tif (\n\t\t\twindow.KTGlobalComponentsConfig &&\n\t\t\t(window.KTGlobalComponentsConfig as object)[this._name as keyof object]\n\t\t) {\n\t\t\treturn (window.KTGlobalComponentsConfig as object)[\n\t\t\t\tthis._name as keyof object\n\t\t\t] as object;\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t}\n\n\tprotected _buildConfig(config: object = {}): void {\n\t\tif (!this._element) return;\n\n\t\tthis._config = {\n\t\t\t...this._defaultConfig,\n\t\t\t...this._getGlobalConfig(),\n\t\t\t...KTDom.getDataAttributes(\n\t\t\t\tthis._element,\n\t\t\t\tthis._dataOptionPrefix + this._name,\n\t\t\t),\n\t\t\t...config,\n\t\t};\n\t}\n\n\tpublic dispose(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.removeAttribute(`data-kt-${this._name}-initialized`);\n\t\tKTData.remove(this._element, this._name);\n\t}\n\n\tpublic on(eventType: string, callback: CallableFunction): string {\n\t\tconst eventId = KTUtils.geUID();\n\n\t\tif (!this._events.get(eventType)) {\n\t\t\tthis._events.set(eventType, new Map());\n\t\t}\n\n\t\tthis._events.get(eventType).set(eventId, callback);\n\n\t\treturn eventId;\n\t}\n\n\tpublic off(eventType: string, eventId: string): void {\n\t\tthis._events.get(eventType)?.delete(eventId);\n\t}\n\n\tpublic getOption(name: string): KTOptionType {\n\t\treturn this._getOption(name as keyof object);\n\t}\n\n\tpublic getElement(): HTMLElement {\n\t\tif (!this._element) return null;\n\t\treturn this._element;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n// Checkbox logic for KTDataTable\n\nimport {\n\tKTDataTableConfigInterface,\n\tKTDataTableCheckChangePayloadInterface,\n} from './types';\nimport KTEventHandler from '../../helpers/event-handler';\n\nexport interface KTDataTableCheckboxAPI {\n\tinit(): void;\n\tcheck(): void;\n\tuncheck(): void;\n\ttoggle(): void;\n\tisChecked(): boolean;\n\tgetChecked(): string[];\n\tupdateState(): void;\n}\n\n// Main function to create checkbox logic for a datatable instance\nexport function createCheckboxHandler(\n\telement: HTMLElement,\n\tconfig: KTDataTableConfigInterface,\n\tfireEvent: (eventName: string, eventData?: any) => void,\n): KTDataTableCheckboxAPI {\n\tlet headerChecked = false;\n\tlet headerCheckElement: HTMLInputElement | null = null;\n\tlet targetElements: NodeListOf<HTMLInputElement> = null;\n\n\t// Default: preserve selection across all pages\n\tconst preserveSelection = config.checkbox?.preserveSelection !== false;\n\n\t// Helper: get selectedRows from state, always as string[]\n\tfunction getSelectedRows(): string[] {\n\t\tif (!config._state) config._state = {} as any;\n\t\tif (!Array.isArray(config._state.selectedRows))\n\t\t\tconfig._state.selectedRows = [];\n\t\treturn config._state.selectedRows.map(String);\n\t}\n\n\t// Helper: set selectedRows in state\n\tfunction setSelectedRows(rows: string[]) {\n\t\tif (!config._state) config._state = {} as any;\n\t\tconfig._state.selectedRows = Array.from(new Set(rows.map(String)));\n\t}\n\n\t// Helper: get all visible row IDs (values)\n\tfunction getVisibleRowIds(): string[] {\n\t\tif (!targetElements) return [];\n\t\treturn Array.from(targetElements)\n\t\t\t.map((el) => el.value)\n\t\t\t.filter((v) => v != null && v !== '');\n\t}\n\n\t// Listener for header checkbox\n\tconst checkboxListener = (event: MouseEvent) => {\n\t\tcheckboxToggle(event);\n\t};\n\n\tfunction init() {\n\t\theaderCheckElement = element.querySelector<HTMLInputElement>(\n\t\t\tconfig.attributes.check,\n\t\t);\n\t\tif (!headerCheckElement) return;\n\t\theaderChecked = headerCheckElement.checked;\n\t\ttargetElements = element.querySelectorAll(\n\t\t\tconfig.attributes.checkbox,\n\t\t) as NodeListOf<HTMLInputElement>;\n\t\tcheckboxHandler();\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction checkboxHandler() {\n\t\tif (!headerCheckElement) return;\n\t\theaderCheckElement.addEventListener('click', checkboxListener);\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\tconfig.attributes.checkbox,\n\t\t\t'input',\n\t\t\t(event: Event) => {\n\t\t\t\thandleRowCheckboxChange(event as InputEvent);\n\t\t\t},\n\t\t);\n\t}\n\n\t// When a row checkbox is changed\n\tfunction handleRowCheckboxChange(event: Event) {\n\t\tconst input = event.target as HTMLInputElement;\n\t\tif (!input) return;\n\t\tconst value = input.value;\n\t\tlet selectedRows = getSelectedRows();\n\t\tif (input.checked) {\n\t\t\tif (!selectedRows.includes(value)) selectedRows.push(value);\n\t\t} else {\n\t\t\tselectedRows = selectedRows.filter((v) => v !== value);\n\t\t}\n\t\tsetSelectedRows(selectedRows);\n\t\tupdateHeaderCheckboxState();\n\t\tfireEvent('changed');\n\t}\n\n\t// When the header checkbox is toggled\n\tfunction checkboxToggle(event?: Event) {\n\t\tconst checked = !isChecked();\n\t\tconst eventType = checked ? 'checked' : 'unchecked';\n\t\tfireEvent(eventType);\n\t\tchange(checked);\n\t}\n\n\t// Change all visible checkboxes and update selectedRows\n\tfunction change(checked: boolean) {\n\t\tconst payload: KTDataTableCheckChangePayloadInterface = { cancel: false };\n\t\tfireEvent('change', payload);\n\t\tif (payload.cancel === true) return;\n\t\theaderChecked = checked;\n\t\tif (headerCheckElement) headerCheckElement.checked = checked;\n\t\tif (targetElements) {\n\t\t\tconst visibleIds = getVisibleRowIds();\n\t\t\tlet selectedRows = getSelectedRows();\n\t\t\tif (checked) {\n\t\t\t\t// Add all visible IDs to selectedRows\n\t\t\t\tselectedRows = preserveSelection\n\t\t\t\t\t? Array.from(new Set([...selectedRows, ...visibleIds]))\n\t\t\t\t\t: visibleIds;\n\t\t\t} else {\n\t\t\t\t// Remove all visible IDs from selectedRows\n\t\t\t\tselectedRows = preserveSelection\n\t\t\t\t\t? selectedRows.filter((v) => !visibleIds.includes(v))\n\t\t\t\t\t: [];\n\t\t\t}\n\t\t\tsetSelectedRows(selectedRows);\n\t\t\t// Update visible checkboxes\n\t\t\ttargetElements.forEach((element: HTMLInputElement) => {\n\t\t\t\tif (element) {\n\t\t\t\t\telement.checked = checked;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tupdateHeaderCheckboxState();\n\t\tfireEvent('changed');\n\t}\n\n\t// Reapply checked state to visible checkboxes based on selectedRows\n\tfunction reapplyCheckedStates() {\n\t\tconst selectedRows = getSelectedRows();\n\t\tif (!targetElements) return;\n\t\ttargetElements.forEach((element: HTMLInputElement) => {\n\t\t\tif (!element) return;\n\t\t\tconst value = element.value;\n\t\t\telement.checked = selectedRows.includes(value);\n\t\t\t// Update row class\n\t\t\tconst row = element.closest('tr');\n\t\t\tif (row && config.checkbox?.checkedClass) {\n\t\t\t\tif (element.checked) {\n\t\t\t\t\trow.classList.add(config.checkbox.checkedClass);\n\t\t\t\t} else {\n\t\t\t\t\trow.classList.remove(config.checkbox.checkedClass);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t// Update header checkbox state (checked/indeterminate/unchecked)\n\tfunction updateHeaderCheckboxState() {\n\t\tif (!headerCheckElement || !targetElements) return;\n\t\tconst total = targetElements.length;\n\t\tlet checked = 0;\n\t\tfor (let i = 0; i < total; i++) {\n\t\t\tif (targetElements[i].checked) checked++;\n\t\t}\n\t\tif (checked === 0) {\n\t\t\theaderCheckElement.indeterminate = false;\n\t\t\theaderCheckElement.checked = false;\n\t\t\theaderChecked = false;\n\t\t} else if (checked > 0 && checked < total) {\n\t\t\theaderCheckElement.indeterminate = true;\n\t\t\theaderCheckElement.checked = false;\n\t\t\theaderChecked = false;\n\t\t} else if (checked === total) {\n\t\t\theaderCheckElement.indeterminate = false;\n\t\t\theaderCheckElement.checked = true;\n\t\t\theaderChecked = true;\n\t\t}\n\t}\n\n\t// Fix: isChecked() implementation\n\tfunction isChecked(): boolean {\n\t\treturn headerChecked;\n\t}\n\n\tfunction getChecked(): string[] {\n\t\treturn getSelectedRows();\n\t}\n\n\tfunction check() {\n\t\tchange(true);\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction uncheck() {\n\t\tchange(false);\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction toggle() {\n\t\tcheckboxToggle();\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction updateState() {\n\t\t// Called after redraw/pagination\n\t\ttargetElements = element.querySelectorAll(\n\t\t\tconfig.attributes.checkbox,\n\t\t) as NodeListOf<HTMLInputElement>;\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\treturn {\n\t\tinit,\n\t\tcheck,\n\t\tuncheck,\n\t\ttoggle,\n\t\tisChecked,\n\t\tgetChecked,\n\t\tupdateState,\n\t};\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n// Sorting logic for KTDataTable\n\nimport {\n\tKTDataTableConfigInterface,\n\tKTDataTableSortOrderInterface,\n\tKTDataTableDataInterface,\n} from './types';\n\nexport interface KTDataTableSortAPI<T = KTDataTableDataInterface> {\n\tinitSort(): void;\n\tsortData(\n\t\tdata: T[],\n\t\tsortField: keyof T | number,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): T[];\n\ttoggleSortOrder(\n\t\tcurrentField: keyof T | number,\n\t\tcurrentOrder: KTDataTableSortOrderInterface,\n\t\tnewField: keyof T | number,\n\t): KTDataTableSortOrderInterface;\n\tsetSortIcon(\n\t\tsortField: keyof T,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): void;\n}\n\nexport function createSortHandler<T = KTDataTableDataInterface>(\n\tconfig: KTDataTableConfigInterface,\n\ttheadElement: HTMLTableSectionElement,\n\tgetState: () => {\n\t\tsortField: keyof T | number;\n\t\tsortOrder: KTDataTableSortOrderInterface;\n\t},\n\tsetState: (\n\t\tfield: keyof T | number,\n\t\torder: KTDataTableSortOrderInterface,\n\t) => void,\n\tfireEvent: (eventName: string, eventData?: any) => void,\n\tdispatchEvent: (eventName: string, eventData?: any) => void,\n\tupdateData: () => void,\n): KTDataTableSortAPI<T> {\n\t// Helper to compare values for sorting\n\tfunction compareValues(\n\t\ta: unknown,\n\t\tb: unknown,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): number {\n\t\tconst aText = String(a).replace(/<[^>]*>|&nbsp;/g, '');\n\t\tconst bText = String(b).replace(/<[^>]*>|&nbsp;/g, '');\n\t\treturn aText > bText\n\t\t\t? sortOrder === 'asc'\n\t\t\t\t? 1\n\t\t\t\t: -1\n\t\t\t: aText < bText\n\t\t\t\t? sortOrder === 'asc'\n\t\t\t\t\t? -1\n\t\t\t\t\t: 1\n\t\t\t\t: 0;\n\t}\n\n\tfunction sortData(\n\t\tdata: T[],\n\t\tsortField: keyof T | number,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): T[] {\n\t\treturn data.sort((a, b) => {\n\t\t\tconst aValue = a[sortField as keyof T] as unknown;\n\t\t\tconst bValue = b[sortField as keyof T] as unknown;\n\t\t\treturn compareValues(aValue, bValue, sortOrder);\n\t\t});\n\t}\n\n\tfunction toggleSortOrder(\n\t\tcurrentField: keyof T | number,\n\t\tcurrentOrder: KTDataTableSortOrderInterface,\n\t\tnewField: keyof T | number,\n\t): KTDataTableSortOrderInterface {\n\t\tif (currentField === newField) {\n\t\t\tswitch (currentOrder) {\n\t\t\t\tcase 'asc':\n\t\t\t\t\treturn 'desc';\n\t\t\t\tcase 'desc':\n\t\t\t\t\treturn '';\n\t\t\t\tdefault:\n\t\t\t\t\treturn 'asc';\n\t\t\t}\n\t\t}\n\t\treturn 'asc';\n\t}\n\n\tfunction setSortIcon(\n\t\tsortField: keyof T,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): void {\n\t\tconst sortClass = sortOrder\n\t\t\t? sortOrder === 'asc'\n\t\t\t\t? config.sort?.classes?.asc || ''\n\t\t\t\t: config.sort?.classes?.desc || ''\n\t\t\t: '';\n\t\tconst th =\n\t\t\ttypeof sortField === 'number'\n\t\t\t\t? theadElement.querySelectorAll('th')[sortField]\n\t\t\t\t: (theadElement.querySelector(\n\t\t\t\t\t\t`th[data-kt-datatable-column=\"${String(sortField)}\"], th[data-kt-datatable-column-sort=\"${String(sortField)}\"]`,\n\t\t\t\t\t) as HTMLElement);\n\t\tif (th) {\n\t\t\tconst sortElement = th.querySelector(\n\t\t\t\t`.${config.sort?.classes?.base}`,\n\t\t\t) as HTMLElement;\n\t\t\tif (sortElement) {\n\t\t\t\tsortElement.className =\n\t\t\t\t\t`${config.sort?.classes?.base} ${sortClass}`.trim();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction initSort(): void {\n\t\tif (!theadElement) return;\n\t\t// Set the initial sort icon\n\t\tsetSortIcon(getState().sortField as keyof T, getState().sortOrder);\n\t\t// Get all the table headers\n\t\tconst headers = Array.from(theadElement.querySelectorAll('th'));\n\t\theaders.forEach((header) => {\n\t\t\t// If the sort class is not found, it's not a sortable column\n\t\t\tif (!header.querySelector(`.${config.sort?.classes?.base}`)) return;\n\t\t\tconst sortAttribute =\n\t\t\t\theader.getAttribute('data-kt-datatable-column-sort') ||\n\t\t\t\theader.getAttribute('data-kt-datatable-column');\n\t\t\tconst sortField = sortAttribute\n\t\t\t\t? (sortAttribute as keyof T)\n\t\t\t\t: (header.cellIndex as keyof T);\n\t\t\theader.addEventListener('click', () => {\n\t\t\t\tconst state = getState();\n\t\t\t\tconst sortOrder = toggleSortOrder(\n\t\t\t\t\tstate.sortField,\n\t\t\t\t\tstate.sortOrder,\n\t\t\t\t\tsortField,\n\t\t\t\t);\n\t\t\t\tsetSortIcon(sortField, sortOrder);\n\t\t\t\tsetState(sortField, sortOrder);\n\t\t\t\tfireEvent('sort', { field: sortField, order: sortOrder });\n\t\t\t\tdispatchEvent('sort', { field: sortField, order: sortOrder });\n\t\t\t\tupdateData();\n\t\t\t});\n\t\t});\n\t}\n\n\treturn { initSort, sortData, toggleSortOrder, setSortIcon };\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTComponent from '../component';\nimport {\n\tKTDataTableDataInterface,\n\tKTDataTableInterface,\n\tKTDataTableConfigInterface as KTDataTableConfigInterface,\n\tKTDataTableSortOrderInterface,\n\tKTDataTableStateInterface,\n\tKTDataTableColumnFilterInterface,\n\tKTDataTableAttributeInterface,\n} from './types';\nimport KTUtils from '../../helpers/utils';\nimport KTComponents from '../../index';\nimport KTData from '../../helpers/data';\nimport {\n\tcreateCheckboxHandler,\n\tKTDataTableCheckboxAPI,\n} from './datatable-checkbox';\nimport { createSortHandler, KTDataTableSortAPI } from './datatable-sort';\n\n/**\n * Custom DataTable plugin class with server-side API, pagination, and sorting\n * @classdesc A custom KTComponent class that integrates server-side API, pagination, and sorting functionality into a table.\n * It supports fetching data from a server-side API, pagination, and sorting of the fetched data.\n * @class\n * @extends {KTComponent}\n * @param {HTMLElement} element The table element\n * @param {KTDataTableConfigInterface} [config] Additional configuration options\n */\nexport class KTDataTable<T extends KTDataTableDataInterface>\n\textends KTComponent\n\timplements KTDataTableInterface\n{\n\tprotected override _name: string = 'datatable';\n\tprotected override _config: KTDataTableConfigInterface;\n\tprotected override _defaultConfig: KTDataTableConfigInterface;\n\n\tprivate _tableElement: HTMLTableElement;\n\tprivate _tbodyElement: HTMLTableSectionElement;\n\tprivate _theadElement: HTMLTableSectionElement;\n\tprivate _originalTbodyClass: string = ''; // Store original tbody class\n\tprivate _originalTrClasses: string[] = []; // Store original tr classes\n\tprivate _originalTheadClass: string = ''; // Store original thead class\n\tprivate _originalTdClasses: string[][] = []; // Store original td classes as a 2D array [row][col]\n\tprivate _originalThClasses: string[] = []; // Store original th classes\n\n\tprivate _infoElement: HTMLElement;\n\tprivate _sizeElement: HTMLSelectElement;\n\tprivate _paginationElement: HTMLElement;\n\n\tprivate _checkbox: KTDataTableCheckboxAPI;\n\tprivate _sortHandler: KTDataTableSortAPI<T>;\n\n\tprivate _data: T[] = [];\n\n\tconstructor(element: HTMLElement, config?: KTDataTableConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._defaultConfig = this._initDefaultConfig(config);\n\n\t\tthis._init(element);\n\t\tthis._buildConfig();\n\n\t\t// Store the instance directly on the element\n\t\t(element as any).instance = this;\n\n\t\tthis._initElements();\n\n\t\t// Initialize checkbox handler\n\t\tthis._checkbox = createCheckboxHandler(\n\t\t\tthis._element,\n\t\t\tthis._config,\n\t\t\t(eventName: string, eventData?: any) => {\n\t\t\t\tthis._fireEvent(eventName, eventData);\n\t\t\t\tthis._dispatchEvent(eventName, eventData);\n\t\t\t},\n\t\t);\n\n\t\t// Initialize sort handler\n\t\tthis._sortHandler = createSortHandler(\n\t\t\tthis._config,\n\t\t\tthis._theadElement,\n\t\t\t() => ({\n\t\t\t\tsortField: this.getState().sortField,\n\t\t\t\tsortOrder: this.getState().sortOrder,\n\t\t\t}),\n\t\t\t(field, order) => {\n\t\t\t\tthis._config._state.sortField = field as never;\n\t\t\t\tthis._config._state.sortOrder = order;\n\t\t\t},\n\t\t\tthis._fireEvent.bind(this),\n\t\t\tthis._dispatchEvent.bind(this),\n\t\t\tthis._updateData.bind(this),\n\t\t);\n\n\t\tthis._sortHandler.initSort();\n\n\t\tif (this._config.stateSave === false) {\n\t\t\tthis._deleteState();\n\t\t}\n\n\t\tif (this._config.stateSave) {\n\t\t\tthis._loadState();\n\t\t}\n\n\t\tthis._updateData();\n\n\t\tthis._fireEvent('init');\n\t\tthis._dispatchEvent('init');\n\t}\n\n\t/**\n\t * Initialize default configuration for the datatable\n\t * @param config User-provided configuration options\n\t * @returns Default configuration merged with user-provided options\n\t */\n\tprivate _initDefaultConfig(\n\t\tconfig?: KTDataTableConfigInterface,\n\t): KTDataTableConfigInterface {\n\t\treturn {\n\t\t\t/**\n\t\t\t * HTTP method for server-side API call\n\t\t\t */\n\t\t\trequestMethod: 'GET',\n\t\t\t/**\n\t\t\t * Custom HTTP headers for the API request\n\t\t\t */\n\t\t\trequestHeaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Pagination info template\n\t\t\t */\n\t\t\tinfo: '{start}-{end} of {total}',\n\t\t\t/**\n\t\t\t * Info text when there is no data\n\t\t\t */\n\t\t\tinfoEmpty: 'No records found',\n\t\t\t/**\n\t\t\t * Available page sizes\n\t\t\t */\n\t\t\tpageSizes: [5, 10, 20, 30, 50],\n\t\t\t/**\n\t\t\t * Default page size\n\t\t\t */\n\t\t\tpageSize: 10,\n\t\t\t/**\n\t\t\t * Enable or disable pagination more button\n\t\t\t */\n\t\t\tpageMore: true,\n\t\t\t/**\n\t\t\t * Maximum number of pages before enabling pagination more button\n\t\t\t */\n\t\t\tpageMoreLimit: 3,\n\t\t\t/**\n\t\t\t * Pagination button templates\n\t\t\t */\n\t\t\tpagination: {\n\t\t\t\tnumber: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the pagination button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the pagination button\n\t\t\t\t\t */\n\t\t\t\t\ttext: '{page}',\n\t\t\t\t},\n\t\t\t\tprevious: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the previous pagination button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button kt-datatable-pagination-prev',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the previous pagination button\n\t\t\t\t\t */\n\t\t\t\t\ttext: `\n\t\t\t\t\t\t<svg class=\"rtl:transform rtl:rotate-180 size-3.5 shrink-0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t\t<path d=\"M8.86501 16.7882V12.8481H21.1459C21.3724 12.8481 21.5897 12.7581 21.7498 12.5979C21.91 12.4378 22 12.2205 22 11.994C22 11.7675 21.91 11.5503 21.7498 11.3901C21.5897 11.2299 21.3724 11.1399 21.1459 11.1399H8.86501V7.2112C8.86628 7.10375 8.83517 6.9984 8.77573 6.90887C8.7163 6.81934 8.63129 6.74978 8.53177 6.70923C8.43225 6.66869 8.32283 6.65904 8.21775 6.68155C8.11267 6.70405 8.0168 6.75766 7.94262 6.83541L2.15981 11.6182C2.1092 11.668 2.06901 11.7274 2.04157 11.7929C2.01413 11.8584 2 11.9287 2 11.9997C2 12.0707 2.01413 12.141 2.04157 12.2065C2.06901 12.272 2.1092 12.3314 2.15981 12.3812L7.94262 17.164C8.0168 17.2417 8.11267 17.2953 8.21775 17.3178C8.32283 17.3403 8.43225 17.3307 8.53177 17.2902C8.63129 17.2496 8.7163 17.18 8.77573 17.0905C8.83517 17.001 8.86628 16.8956 8.86501 16.7882Z\" fill=\"currentColor\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t},\n\t\t\t\tnext: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the next pagination button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button kt-datatable-pagination-next',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the next pagination button\n\t\t\t\t\t */\n\t\t\t\t\ttext: `\n\t\t\t\t\t\t<svg class=\"rtl:transform rtl:rotate-180 size-3.5 shrink-0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t\t<path d=\"M15.135 7.21144V11.1516H2.85407C2.62756 11.1516 2.41032 11.2415 2.25015 11.4017C2.08998 11.5619 2 11.7791 2 12.0056C2 12.2321 2.08998 12.4494 2.25015 12.6096C2.41032 12.7697 2.62756 12.8597 2.85407 12.8597H15.135V16.7884C15.1337 16.8959 15.1648 17.0012 15.2243 17.0908C15.2837 17.1803 15.3687 17.2499 15.4682 17.2904C15.5677 17.3309 15.6772 17.3406 15.7822 17.3181C15.8873 17.2956 15.9832 17.242 16.0574 17.1642L21.8402 12.3814C21.8908 12.3316 21.931 12.2722 21.9584 12.2067C21.9859 12.1412 22 12.0709 22 11.9999C22 11.9289 21.9859 11.8586 21.9584 11.7931C21.931 11.7276 21.8908 11.6683 21.8402 11.6185L16.0574 6.83565C15.9832 6.75791 15.8873 6.70429 15.7822 6.68179C15.6772 6.65929 15.5677 6.66893 15.4682 6.70948C15.3687 6.75002 15.2837 6.81959 15.2243 6.90911C15.1648 6.99864 15.1337 7.10399 15.135 7.21144Z\" fill=\"currentColor\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t},\n\t\t\t\tmore: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the pagination more button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button kt-datatable-pagination-more',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the pagination more button\n\t\t\t\t\t */\n\t\t\t\t\ttext: '...',\n\t\t\t\t},\n\t\t\t},\n\t\t\t/**\n\t\t\t * Sorting options\n\t\t\t */\n\t\t\tsort: {\n\t\t\t\t/**\n\t\t\t\t * CSS classes to be added to the sortable headers\n\t\t\t\t */\n\t\t\t\tclasses: {\n\t\t\t\t\tbase: 'kt-table-col',\n\t\t\t\t\tasc: 'asc',\n\t\t\t\t\tdesc: 'desc',\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * Local sorting callback function\n\t\t\t\t * Sorts the data array based on the sort field and order\n\t\t\t\t * @param data Data array to be sorted\n\t\t\t\t * @param sortField Property name of the data object to be sorted by\n\t\t\t\t * @param sortOrder Sorting order (ascending or descending)\n\t\t\t\t * @returns Sorted data array\n\t\t\t\t */\n\t\t\t\tcallback: (\n\t\t\t\t\tdata: T[],\n\t\t\t\t\tsortField: keyof T | number,\n\t\t\t\t\tsortOrder: KTDataTableSortOrderInterface,\n\t\t\t\t): T[] => {\n\t\t\t\t\treturn this._sortHandler\n\t\t\t\t\t\t? this._sortHandler.sortData(data, sortField, sortOrder)\n\t\t\t\t\t\t: data;\n\t\t\t\t},\n\t\t\t},\n\t\t\tsearch: {\n\t\t\t\t/**\n\t\t\t\t * Delay in milliseconds before the search function is applied to the data array\n\t\t\t\t * @default 500\n\t\t\t\t */\n\t\t\t\tdelay: 500, // ms\n\t\t\t\t/**\n\t\t\t\t * Local search callback function\n\t\t\t\t * Filters the data array based on the search string\n\t\t\t\t * @param data Data array to be filtered\n\t\t\t\t * @param search Search string used to filter the data array\n\t\t\t\t * @returns Filtered data array\n\t\t\t\t */\n\t\t\t\tcallback: (data: T[], search: string): T[] => {\n\t\t\t\t\tif (!data || !search) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\treturn data.filter((item: T) => {\n\t\t\t\t\t\tif (!item) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn Object.values(item).some(\n\t\t\t\t\t\t\t(value: string | number | boolean) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\ttypeof value !== 'string' &&\n\t\t\t\t\t\t\t\t\ttypeof value !== 'number' &&\n\t\t\t\t\t\t\t\t\ttypeof value !== 'boolean'\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst valueText = String(value)\n\t\t\t\t\t\t\t\t\t.replace(/<[^>]*>|&nbsp;/g, '')\n\t\t\t\t\t\t\t\t\t.toLowerCase();\n\t\t\t\t\t\t\t\treturn valueText.includes(search.toLowerCase());\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t/**\n\t\t\t * Loading spinner options\n\t\t\t */\n\t\t\tloading: {\n\t\t\t\t/**\n\t\t\t\t * Template to be displayed during data fetching process\n\t\t\t\t */\n\t\t\t\ttemplate: `\n\t\t\t\t\t<div class=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\">\n\t\t\t\t\t\t<div class=\"kt-datatable-loading\">\n\t\t\t\t\t\t\t<svg class=\"animate-spin -ml-1 h-5 w-5 text-gray-600\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t\t<circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"3\"></circle>\n\t\t\t\t\t\t\t\t<path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t\t/**\n\t\t\t\t * Loading text to be displayed in the template\n\t\t\t\t */\n\t\t\t\tcontent: 'Loading...',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Selectors of the elements to be targeted\n\t\t\t */\n\t\t\tattributes: {\n\t\t\t\t/**\n\t\t\t\t * Data table element\n\t\t\t\t */\n\t\t\t\ttable: 'table[data-kt-datatable-table=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Pagination info element\n\t\t\t\t */\n\t\t\t\tinfo: '[data-kt-datatable-info=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Page size dropdown element\n\t\t\t\t */\n\t\t\t\tsize: '[data-kt-datatable-size=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Pagination element\n\t\t\t\t */\n\t\t\t\tpagination: '[data-kt-datatable-pagination=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Spinner element\n\t\t\t\t */\n\t\t\t\tspinner: '[data-kt-datatable-spinner=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Checkbox element\n\t\t\t\t */\n\t\t\t\tcheck: '[data-kt-datatable-check=\"true\"]',\n\t\t\t\tcheckbox: '[data-kt-datatable-row-check=\"true\"]',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Enable or disable state saving\n\t\t\t */\n\t\t\tstateSave: true,\n\t\t\tcheckbox: {\n\t\t\t\tcheckedClass: 'checked',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Private properties\n\t\t\t */\n\t\t\t_state: {} as KTDataTableStateInterface,\n\t\t\tloadingClass: 'loading',\n\t\t\t...config,\n\t\t} as KTDataTableConfigInterface;\n\t}\n\n\t/**\n\t * Initialize table, tbody, thead, info, size, and pagination elements\n\t * @returns {void}\n\t */\n\tprivate _initElements(): void {\n\t\t/**\n\t\t * Data table element\n\t\t */\n\t\tthis._tableElement = this._element.querySelector<HTMLTableElement>(\n\t\t\tthis._config.attributes.table,\n\t\t)!;\n\t\t/**\n\t\t * Table body element\n\t\t */\n\t\tthis._tbodyElement =\n\t\t\tthis._tableElement.tBodies[0] || this._tableElement.createTBody();\n\t\t/**\n\t\t * Table head element\n\t\t */\n\t\tthis._theadElement = this._tableElement.tHead!;\n\n\t\t// Store original classes\n\t\tthis._storeOriginalClasses();\n\n\t\t/**\n\t\t * Pagination info element\n\t\t */\n\t\tthis._infoElement = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.info,\n\t\t)!;\n\t\t/**\n\t\t * Page size dropdown element\n\t\t */\n\t\tthis._sizeElement = this._element.querySelector<HTMLSelectElement>(\n\t\t\tthis._config.attributes.size,\n\t\t)!;\n\t\t/**\n\t\t * Pagination element\n\t\t */\n\t\tthis._paginationElement = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.pagination,\n\t\t)!;\n\t}\n\n\t/**\n\t * Store original classes from table elements\n\t * @returns {void}\n\t */\n\tprivate _storeOriginalClasses(): void {\n\t\t// Store tbody class\n\t\tif (this._tbodyElement) {\n\t\t\tthis._originalTbodyClass = this._tbodyElement.className || '';\n\t\t}\n\n\t\t// Store thead class and th classes\n\t\tif (this._theadElement) {\n\t\t\tthis._originalTheadClass = this._theadElement.className || '';\n\n\t\t\t// Store th classes\n\t\t\tconst thElements =\n\t\t\t\tthis._theadElement.querySelectorAll<HTMLTableCellElement>('th');\n\t\t\tthis._originalThClasses = Array.from(thElements).map(\n\t\t\t\t(th) => th.className || '',\n\t\t\t);\n\t\t}\n\n\t\t// Store tr and td classes\n\t\tif (this._tbodyElement) {\n\t\t\tconst originalRows =\n\t\t\t\tthis._tbodyElement.querySelectorAll<HTMLTableRowElement>('tr');\n\t\t\tthis._originalTrClasses = Array.from(originalRows).map(\n\t\t\t\t(row) => row.className || '',\n\t\t\t);\n\n\t\t\t// Store td classes as a 2D array\n\t\t\tthis._originalTdClasses = [];\n\t\t\tArray.from(originalRows).forEach((row, rowIndex) => {\n\t\t\t\tconst tdElements = row.querySelectorAll<HTMLTableCellElement>('td');\n\t\t\t\tthis._originalTdClasses[rowIndex] = Array.from(tdElements).map(\n\t\t\t\t\t(td) => td.className || '',\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Fetch data from the server or from the DOM if `apiEndpoint` is not defined.\n\t * @returns {Promise<void>} Promise which is resolved after data has been fetched and checkbox plugin initialized.\n\t */\n\tprivate async _updateData(): Promise<void> {\n\t\tthis._showSpinner(); // Show spinner before fetching data\n\n\t\t// Fetch data from the DOM and initialize the checkbox plugin\n\t\treturn typeof this._config.apiEndpoint === 'undefined'\n\t\t\t? this._fetchDataFromLocal().then(\n\t\t\t\t\tthis._finalize.bind(this) as () => Promise<void>,\n\t\t\t\t)\n\t\t\t: this._fetchDataFromServer().then(\n\t\t\t\t\tthis._finalize.bind(this) as () => Promise<void>,\n\t\t\t\t);\n\t}\n\n\t/**\n\t * Finalize data table after data has been fetched\n\t * @returns {void}\n\t */\n\tprivate _finalize(): void {\n\t\tthis._element.classList.add('datatable-initialized');\n\n\t\t// Initialize checkbox logic\n\t\tthis._checkbox.init();\n\n\t\tthis._attachSearchEvent();\n\n\t\tif (typeof KTComponents !== 'undefined') {\n\t\t\tKTComponents.init();\n\t\t}\n\n\t\t/**\n\t\t * Hide spinner\n\t\t */\n\t\tthis._hideSpinner();\n\t}\n\n\t/**\n\t * Attach search event to the search input element\n\t * @returns {void}\n\t */\n\tprivate _attachSearchEvent(): void {\n\t\tconst tableId: string = this._tableId();\n\t\tconst searchElement: HTMLInputElement | null =\n\t\t\tdocument.querySelector<HTMLInputElement>(\n\t\t\t\t`[data-kt-datatable-search=\"#${tableId}\"]`,\n\t\t\t);\n\n\t\t// Get search state\n\t\tconst { search } = this.getState();\n\t\t// Set search value\n\t\tif (searchElement) {\n\t\t\tsearchElement.value =\n\t\t\t\ttypeof search === 'string' ? search : String(search);\n\t\t}\n\n\t\tif (searchElement) {\n\t\t\t// Check if a debounced search function already exists\n\t\t\tif ((searchElement as any)._debouncedSearch) {\n\t\t\t\t// Remove the existing debounced event listener\n\t\t\t\tsearchElement.removeEventListener(\n\t\t\t\t\t'keyup',\n\t\t\t\t\t(searchElement as any)._debouncedSearch,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Create a new debounced search function\n\t\t\tconst debouncedSearch = this._debounce(() => {\n\t\t\t\tthis.search(searchElement.value);\n\t\t\t}, this._config.search.delay);\n\n\t\t\t// Store the new debounced function as a property of the element\n\t\t\t(searchElement as any)._debouncedSearch = debouncedSearch;\n\n\t\t\t// Add the new debounced event listener\n\t\t\tsearchElement.addEventListener('keyup', debouncedSearch);\n\t\t}\n\t}\n\n\t/**\n\t * Fetch data from the DOM\n\t * Fetch data from the table element and save it to the `originalData` state property.\n\t * This method is used when the data is not fetched from the server via an API endpoint.\n\t */\n\tprivate async _fetchDataFromLocal(): Promise<void> {\n\t\tthis._fireEvent('fetch');\n\t\tthis._dispatchEvent('fetch');\n\n\t\tconst { sortField, sortOrder, page, pageSize, search } = this.getState();\n\t\tlet { originalData } = this.getState();\n\n\t\t// If the table element or the original data is not defined, bail\n\t\tif (\n\t\t\t!this._tableElement ||\n\t\t\toriginalData === undefined ||\n\t\t\tthis._tableConfigInvalidate() ||\n\t\t\tthis._localTableHeaderInvalidate() ||\n\t\t\tthis._localTableContentInvalidate()\n\t\t) {\n\t\t\tthis._deleteState();\n\n\t\t\tconst { originalData, originalDataAttributes } =\n\t\t\t\tthis._localExtractTableContent();\n\n\t\t\tthis._config._state.originalData = originalData;\n\t\t\tthis._config._state.originalDataAttributes = originalDataAttributes;\n\t\t}\n\n\t\t// Update the original data variable\n\t\toriginalData = this.getState().originalData;\n\n\t\t// Clone the original data\n\t\tlet _temp = (this._data = [...originalData] as T[]);\n\n\t\tif (search) {\n\t\t\t_temp = this._data = this._config.search.callback.call(\n\t\t\t\tthis,\n\t\t\t\tthis._data,\n\t\t\t\tsearch,\n\t\t\t) as T[];\n\t\t}\n\n\t\t// If sorting is defined, sort the data\n\t\tif (\n\t\t\tsortField !== undefined &&\n\t\t\tsortOrder !== undefined &&\n\t\t\tsortOrder !== ''\n\t\t) {\n\t\t\tif (typeof this._config.sort.callback === 'function') {\n\t\t\t\tthis._data = this._config.sort.callback.call(\n\t\t\t\t\tthis,\n\t\t\t\t\tthis._data,\n\t\t\t\t\tsortField as string,\n\t\t\t\t\tsortOrder,\n\t\t\t\t) as T[];\n\t\t\t}\n\t\t}\n\n\t\t// If there is data, slice it to the current page size\n\t\tif (this._data?.length > 0) {\n\t\t\t// Calculate the start and end indices for the current page\n\t\t\tconst startIndex = (page - 1) * pageSize;\n\t\t\tconst endIndex = startIndex + pageSize;\n\n\t\t\tthis._data = this._data.slice(startIndex, endIndex) as T[];\n\t\t}\n\n\t\t// Determine number of total rows\n\t\tthis._config._state.totalItems = _temp.length;\n\n\t\t// Draw the data\n\t\tawait this._draw();\n\t\tthis._fireEvent('fetched');\n\t\tthis._dispatchEvent('fetched');\n\t}\n\n\t/**\n\t * Checks if the table content has been invalidated by comparing the current checksum of the table body\n\t * with the stored checksum in the state. If the checksums are different, the state is updated with the\n\t * new checksum and `true` is returned. Otherwise, `false` is returned.\n\t *\n\t * @returns {boolean} `true` if the table content has been invalidated, `false` otherwise.\n\t */\n\tprivate _localTableContentInvalidate(): boolean {\n\t\tconst checksum: string = KTUtils.checksum(\n\t\t\tJSON.stringify(this._tbodyElement.innerHTML),\n\t\t);\n\t\tif (this.getState()._contentChecksum !== checksum) {\n\t\t\tthis._config._state._contentChecksum = checksum;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate _tableConfigInvalidate(): boolean {\n\t\t// Remove _data and _state from config\n\t\tconst { _data, _state, ...restConfig } = this._config;\n\t\tconst checksum: string = KTUtils.checksum(JSON.stringify(restConfig));\n\t\tif (_state._configChecksum !== checksum) {\n\t\t\tthis._config._state._configChecksum = checksum;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extract the table content and returns it as an object containing an array of original data and an array of original data attributes.\n\t *\n\t * @returns {{originalData: T[], originalDataAttributes: KTDataTableAttributeInterface[]}} - An object containing an array of original data and an array of original data attributes.\n\t */\n\tprivate _localExtractTableContent(): {\n\t\toriginalData: T[];\n\t\toriginalDataAttributes: KTDataTableAttributeInterface[];\n\t} {\n\t\tconst originalData: T[] = [];\n\t\tconst originalDataAttributes: KTDataTableAttributeInterface[] = [];\n\n\t\tthis._storeOriginalClasses();\n\n\t\tconst rows = this._tbodyElement.querySelectorAll<HTMLTableRowElement>('tr');\n\t\tconst ths: NodeListOf<HTMLTableCellElement> = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th')\n\t\t\t: ([] as unknown as NodeListOf<HTMLTableCellElement>);\n\n\t\trows.forEach((row: HTMLTableRowElement) => {\n\t\t\tconst dataRow: T = {} as T;\n\t\t\tconst dataRowAttribute: KTDataTableAttributeInterface =\n\t\t\t\t{} as KTDataTableAttributeInterface;\n\n\t\t\trow.querySelectorAll<HTMLTableCellElement>('td').forEach((td, index) => {\n\t\t\t\tconst colName = ths[index]?.getAttribute('data-kt-datatable-column');\n\t\t\t\tif (colName) {\n\t\t\t\t\tdataRow[colName as keyof T] = td.innerHTML?.trim() as T[keyof T];\n\t\t\t\t} else {\n\t\t\t\t\t// Store the original HTML for fallback\n\t\t\t\t\tdataRow[index as keyof T] = td.innerHTML?.trim() as T[keyof T];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (Object.keys(dataRow).length > 0) {\n\t\t\t\toriginalData.push(dataRow);\n\t\t\t\toriginalDataAttributes.push(dataRowAttribute);\n\t\t\t}\n\t\t});\n\n\t\treturn { originalData, originalDataAttributes };\n\t}\n\n\t/**\n\t * Check if the table header is invalidated\n\t * @returns {boolean} - Returns true if the table header is invalidated, false otherwise\n\t */\n\tprivate _localTableHeaderInvalidate(): boolean {\n\t\tconst { originalData } = this.getState();\n\t\tconst currentTableHeaders = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th').length\n\t\t\t: 0;\n\t\tconst totalColumns = originalData.length\n\t\t\t? Object.keys(originalData[0]).length\n\t\t\t: 0;\n\n\t\treturn currentTableHeaders !== totalColumns;\n\t}\n\n\t/**\n\t * Fetch data from the server\n\t */\n\tprivate async _fetchDataFromServer(): Promise<void> {\n\t\tthis._fireEvent('fetch');\n\t\tthis._dispatchEvent('fetch');\n\n\t\tconst queryParams = this._getQueryParamsForFetchRequest();\n\t\tconst response = await this._performFetchRequest(queryParams);\n\n\t\tlet responseData = null;\n\n\t\ttry {\n\t\t\tresponseData = await response.json();\n\t\t} catch (error) {\n\t\t\tthis._noticeOnTable(\n\t\t\t\t'Error parsing API response as JSON: ' + String(error),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._fireEvent('fetched', { response: responseData });\n\t\tthis._dispatchEvent('fetched', { response: responseData });\n\n\t\t// Use the mapResponse function to transform the data if provided\n\t\tif (typeof this._config.mapResponse === 'function') {\n\t\t\tresponseData = this._config.mapResponse.call(this, responseData);\n\t\t}\n\n\t\tthis._data = responseData.data;\n\n\t\tthis._config._state.totalItems = responseData.totalCount;\n\n\t\tawait this._draw();\n\t\tthis._fireEvent('fetched');\n\t\tthis._dispatchEvent('fetched');\n\t}\n\n\t/**\n\t * Get the query params for a fetch request\n\t * @returns The query params for the fetch request\n\t */\n\tprivate _getQueryParamsForFetchRequest(): URLSearchParams {\n\t\t// Get the current state of the datatable\n\t\tconst { page, pageSize, sortField, sortOrder, filters, search } =\n\t\t\tthis.getState();\n\n\t\t// Create a new URLSearchParams object to store the query params\n\t\tlet queryParams = new URLSearchParams();\n\n\t\t// Add the current page number and page size to the query params\n\t\tqueryParams.set('page', String(page));\n\t\tqueryParams.set('size', String(pageSize));\n\n\t\t// If there is a sort order and field set, add them to the query params\n\t\tif (sortOrder !== undefined) {\n\t\t\tqueryParams.set('sortOrder', String(sortOrder));\n\t\t}\n\n\t\tif (sortField !== undefined) {\n\t\t\tqueryParams.set('sortField', String(sortField));\n\t\t}\n\n\t\t// If there are any filters set, add them to the query params\n\t\tif (Array.isArray(filters) && filters.length) {\n\t\t\tqueryParams.set(\n\t\t\t\t'filters',\n\t\t\t\tJSON.stringify(\n\t\t\t\t\tfilters.map((filter: KTDataTableColumnFilterInterface) => ({\n\t\t\t\t\t\t// Map the filter object to a simpler object with just the necessary properties\n\t\t\t\t\t\tcolumn: filter.column,\n\t\t\t\t\t\ttype: filter.type,\n\t\t\t\t\t\tvalue: filter.value,\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (search) {\n\t\t\tqueryParams.set(\n\t\t\t\t'search',\n\t\t\t\ttypeof search === 'object' ? JSON.stringify(search) : search,\n\t\t\t);\n\t\t}\n\n\t\t// If a mapRequest function is provided, call it with the query params object\n\t\tif (typeof this._config.mapRequest === 'function') {\n\t\t\tqueryParams = this._config.mapRequest.call(this, queryParams);\n\t\t}\n\n\t\t// Return the query params object\n\t\treturn queryParams;\n\t}\n\n\tprivate async _performFetchRequest(\n\t\tqueryParams: URLSearchParams,\n\t): Promise<Response> {\n\t\tlet requestMethod: RequestInit['method'] = this._config.requestMethod;\n\t\tlet requestBody: RequestInit['body'] | undefined = undefined;\n\n\t\t// If the request method is POST, send the query params as the request body\n\t\tif (requestMethod === 'POST') {\n\t\t\trequestBody = queryParams;\n\t\t} else if (requestMethod === 'GET') {\n\t\t\t// If the request method is GET, append the query params to the API endpoint\n\t\t\tconst apiEndpointWithQueryParams = new URL(this._config.apiEndpoint);\n\t\t\tapiEndpointWithQueryParams.search = queryParams.toString();\n\t\t\tthis._config.apiEndpoint = apiEndpointWithQueryParams.toString();\n\t\t}\n\n\t\treturn fetch(this._config.apiEndpoint, {\n\t\t\tmethod: requestMethod,\n\t\t\tbody: requestBody,\n\t\t\theaders: this._config.requestHeaders,\n\t\t}).catch((error) => {\n\t\t\t// Trigger an error event\n\t\t\tthis._fireEvent('error', { error });\n\t\t\tthis._dispatchEvent('error', { error });\n\n\t\t\tthis._noticeOnTable('Error performing fetch request: ' + String(error));\n\t\t\tthrow error;\n\t\t});\n\t}\n\n\t/**\n\t * Update the table and pagination controls with new data\n\t * @returns {Promise<void>} A promise that resolves when the table and pagination controls are updated\n\t */\n\tprivate async _draw(): Promise<void> {\n\t\tthis._config._state.totalPages =\n\t\t\tMath.ceil(this.getState().totalItems / this.getState().pageSize) || 0;\n\n\t\tthis._fireEvent('draw');\n\t\tthis._dispatchEvent('draw');\n\n\t\tthis._dispose();\n\n\t\t// Update the table and pagination controls\n\t\tif (this._theadElement && this._tbodyElement) {\n\t\t\tthis._updateTable();\n\t\t}\n\n\t\tif (this._infoElement && this._paginationElement) {\n\t\t\tthis._updatePagination();\n\t\t}\n\n\t\tthis._fireEvent('drew');\n\t\tthis._dispatchEvent('drew');\n\n\t\tthis._hideSpinner(); // Hide spinner after data is fetched\n\n\t\tif (this._config.stateSave) {\n\t\t\tthis._saveState();\n\t\t}\n\t}\n\n\t/**\n\t * Update the HTML table with new data\n\t * @returns {HTMLTableSectionElement} The new table body element\n\t */\n\tprivate _updateTable(): HTMLTableSectionElement {\n\t\t// Clear the existing table contents using a more efficient method\n\t\twhile (this._tableElement.tBodies.length) {\n\t\t\tthis._tableElement.removeChild(this._tableElement.tBodies[0]);\n\t\t}\n\n\t\t// Create the table body with the new data\n\t\tconst tbodyElement =\n\t\t\tthis._tableElement.createTBody() as HTMLTableSectionElement;\n\n\t\t// Apply the original class to the new tbody element\n\t\tif (this._originalTbodyClass) {\n\t\t\ttbodyElement.className = this._originalTbodyClass;\n\t\t}\n\n\t\tthis._updateTableContent(tbodyElement);\n\n\t\treturn tbodyElement;\n\t}\n\n\t/**\n\t * Update the table content\n\t * @param tbodyElement The table body element\n\t * @returns {HTMLTableSectionElement} The updated table body element\n\t */\n\tprivate _updateTableContent(\n\t\ttbodyElement: HTMLTableSectionElement,\n\t): HTMLTableSectionElement {\n\t\tconst fragment = document.createDocumentFragment();\n\n\t\ttbodyElement.textContent = ''; // Clear the tbody element\n\n\t\tif (this._data.length === 0) {\n\t\t\tthis._noticeOnTable(this._config.infoEmpty || '');\n\t\t\treturn tbodyElement;\n\t\t}\n\n\t\tconst ths: NodeListOf<HTMLTableCellElement> = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th')\n\t\t\t: ([] as unknown as NodeListOf<HTMLTableCellElement>);\n\n\t\tthis._data.forEach((item: T, rowIndex: number) => {\n\t\t\tconst row = document.createElement('tr');\n\n\t\t\t// Apply original tr class if available\n\t\t\tif (this._originalTrClasses && this._originalTrClasses[rowIndex]) {\n\t\t\t\trow.className = this._originalTrClasses[rowIndex];\n\t\t\t}\n\n\t\t\tif (!this._config.columns) {\n\t\t\t\tconst dataRowAttributes = this.getState().originalDataAttributes\n\t\t\t\t\t? this.getState().originalDataAttributes[rowIndex]\n\t\t\t\t\t: null;\n\n\t\t\t\t// Use the order of <th> elements to render <td>s in the correct order\n\t\t\t\tths.forEach((th, colIndex) => {\n\t\t\t\t\tconst colName = th.getAttribute('data-kt-datatable-column');\n\t\t\t\t\tconst td = document.createElement('td');\n\t\t\t\t\tlet value: any;\n\t\t\t\t\tif (colName && Object.prototype.hasOwnProperty.call(item, colName)) {\n\t\t\t\t\t\tvalue = item[colName as keyof T];\n\t\t\t\t\t} else if (Object.prototype.hasOwnProperty.call(item, colIndex)) {\n\t\t\t\t\t\tvalue = item[colIndex as keyof T];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = '';\n\t\t\t\t\t}\n\t\t\t\t\ttd.innerHTML = value as string;\n\n\t\t\t\t\t// Apply original td class if available\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis._originalTdClasses &&\n\t\t\t\t\t\tthis._originalTdClasses[rowIndex] &&\n\t\t\t\t\t\tthis._originalTdClasses[rowIndex][colIndex]\n\t\t\t\t\t) {\n\t\t\t\t\t\ttd.className = this._originalTdClasses[rowIndex][colIndex];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dataRowAttributes && dataRowAttributes[colIndex]) {\n\t\t\t\t\t\tfor (const attr in dataRowAttributes[colIndex]) {\n\t\t\t\t\t\t\ttd.setAttribute(attr, dataRowAttributes[colIndex][attr]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\trow.appendChild(td);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tObject.keys(this._config.columns).forEach(\n\t\t\t\t\t(key: keyof T, colIndex: number) => {\n\t\t\t\t\t\tconst td = document.createElement('td');\n\t\t\t\t\t\tconst columnDef = this._config.columns[key as string];\n\n\t\t\t\t\t\t// Apply original td class if available\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis._originalTdClasses &&\n\t\t\t\t\t\t\tthis._originalTdClasses[rowIndex] &&\n\t\t\t\t\t\t\tthis._originalTdClasses[rowIndex][colIndex]\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttd.className = this._originalTdClasses[rowIndex][colIndex];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof columnDef.render === 'function') {\n\t\t\t\t\t\t\ttd.innerHTML = columnDef.render.call(\n\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\titem[key] as string,\n\t\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t) as string;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttd.textContent = item[key] as string;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof columnDef.createdCell === 'function') {\n\t\t\t\t\t\t\tcolumnDef.createdCell.call(this, td, item[key], item, row);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trow.appendChild(td);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfragment.appendChild(row);\n\t\t});\n\n\t\ttbodyElement.appendChild(fragment);\n\t\treturn tbodyElement;\n\t}\n\n\t/**\n\t * Show a notice on the table\n\t * @param message The message to show. If empty, the message will be removed\n\t * @returns {void}\n\t */\n\tprivate _noticeOnTable(message: string = ''): void {\n\t\tconst row = this._tableElement.tBodies[0].insertRow();\n\t\tconst cell = row.insertCell();\n\t\tcell.colSpan = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th').length\n\t\t\t: 0;\n\t\tcell.innerHTML = message;\n\t}\n\n\tprivate _updatePagination(): void {\n\t\tthis._removeChildElements(this._sizeElement);\n\t\tthis._createPageSizeControls(this._sizeElement);\n\n\t\tthis._removeChildElements(this._paginationElement);\n\t\tthis._createPaginationControls(this._infoElement, this._paginationElement);\n\t}\n\n\t/**\n\t * Removes all child elements from the given container element.\n\t * @param container The container element to remove the child elements from.\n\t */\n\tprivate _removeChildElements(container: HTMLElement): void {\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Loop through all child elements of the container and remove them one by one\n\t\twhile (container.firstChild) {\n\t\t\t// Remove the first child element (which is the first element in the list of child elements)\n\t\t\tcontainer.removeChild(container.firstChild);\n\t\t}\n\t}\n\n\t/**\n\t * Creates a container element for the items per page selector.\n\t * @param _sizeElement The element to create the page size controls in.\n\t * @returns The container element.\n\t */\n\tprivate _createPageSizeControls(\n\t\t_sizeElement: HTMLSelectElement,\n\t): HTMLSelectElement {\n\t\t// If no element is provided, return early\n\t\tif (!_sizeElement) {\n\t\t\treturn _sizeElement;\n\t\t}\n\n\t\t// Create <option> elements for each page size option\n\t\tconst options = this._config.pageSizes.map((size: number) => {\n\t\t\tconst option = document.createElement('option') as HTMLOptionElement;\n\t\t\toption.value = String(size);\n\t\t\toption.text = String(size);\n\t\t\toption.selected = this.getState().pageSize === size;\n\t\t\treturn option;\n\t\t});\n\n\t\t// Add the <option> elements to the provided element\n\t\t_sizeElement.append(...options);\n\n\t\t// Create an event listener for the \"change\" event on the element\n\t\tconst _pageSizeControlsEvent = (event: Event) => {\n\t\t\t// When the element changes, reload the page with the new page size and page number 1\n\t\t\tthis._reloadPageSize(\n\t\t\t\tNumber((event.target as HTMLSelectElement).value),\n\t\t\t\t1,\n\t\t\t);\n\t\t};\n\n\t\t// Bind the event listener to the component instance\n\t\t_sizeElement.onchange = _pageSizeControlsEvent.bind(this);\n\n\t\t// Return the element\n\t\treturn _sizeElement;\n\t}\n\n\t/**\n\t * Reloads the data with the specified page size and optional page number.\n\t * @param pageSize The new page size.\n\t * @param page The new page number (optional, defaults to 1).\n\t */\n\tprivate _reloadPageSize(pageSize: number, page: number = 1): void {\n\t\t// Update the page size and page number in the state\n\t\tthis._config._state.pageSize = pageSize;\n\t\tthis._config._state.page = page;\n\n\t\t// Update the data with the new page size and page number\n\t\tthis._updateData();\n\t}\n\n\t/**\n\t * Creates the pagination controls for the component.\n\t * @param _infoElement The element to set the info text in.\n\t * @param _paginationElement The element to create the pagination controls in.\n\t * @return {HTMLElement} The element containing the pagination controls.\n\t */\n\tprivate _createPaginationControls(\n\t\t_infoElement: HTMLElement,\n\t\t_paginationElement: HTMLElement,\n\t): HTMLElement {\n\t\tif (!_infoElement || !_paginationElement || this._data.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tthis._setPaginationInfoText(_infoElement);\n\t\tconst paginationContainer =\n\t\t\tthis._createPaginationContainer(_paginationElement);\n\n\t\tif (paginationContainer) {\n\t\t\tthis._createPaginationButtons(paginationContainer);\n\t\t}\n\n\t\treturn paginationContainer;\n\t}\n\n\t/**\n\t * Sets the info text for the pagination controls.\n\t * @param _infoElement The element to set the info text in.\n\t */\n\tprivate _setPaginationInfoText(_infoElement: HTMLElement): void {\n\t\t_infoElement.textContent = this._config.info\n\t\t\t.replace(\n\t\t\t\t'{start}',\n\t\t\t\t(this.getState().page - 1) * this.getState().pageSize + 1 + '',\n\t\t\t)\n\t\t\t.replace(\n\t\t\t\t'{end}',\n\t\t\t\tMath.min(\n\t\t\t\t\tthis.getState().page * this.getState().pageSize,\n\t\t\t\t\tthis.getState().totalItems,\n\t\t\t\t) + '',\n\t\t\t)\n\t\t\t.replace('{total}', this.getState().totalItems + '');\n\t}\n\n\t/**\n\t * Creates the container element for the pagination controls.\n\t * @param _paginationElement The element to create the pagination controls in.\n\t * @return {HTMLElement} The container element.\n\t */\n\tprivate _createPaginationContainer(\n\t\t_paginationElement: HTMLElement,\n\t): HTMLElement {\n\t\t// No longer create a wrapping div. Just return the pagination element itself.\n\t\treturn _paginationElement;\n\t}\n\n\t/**\n\t * Creates the pagination buttons for the component.\n\t * @param paginationContainer The container element for the pagination controls.\n\t */\n\tprivate _createPaginationButtons(paginationContainer: HTMLElement): void {\n\t\tconst { page: currentPage, totalPages } = this.getState();\n\t\tconst { previous, next, number, more } = this._config.pagination;\n\n\t\t// Helper function to create a button\n\t\tconst createButton = (\n\t\t\ttext: string,\n\t\t\tclassName: string,\n\t\t\tdisabled: boolean,\n\t\t\thandleClick: () => void,\n\t\t): HTMLButtonElement => {\n\t\t\tconst button = document.createElement('button') as HTMLButtonElement;\n\t\t\tbutton.className = className;\n\t\t\tbutton.innerHTML = text;\n\t\t\tbutton.disabled = disabled;\n\t\t\tbutton.onclick = handleClick;\n\t\t\treturn button;\n\t\t};\n\n\t\t// Add Previous Button\n\t\tpaginationContainer.appendChild(\n\t\t\tcreateButton(\n\t\t\t\tprevious.text,\n\t\t\t\t`${previous.class}${currentPage === 1 ? ' disabled' : ''}`,\n\t\t\t\tcurrentPage === 1,\n\t\t\t\t() => this._paginateData(currentPage - 1),\n\t\t\t),\n\t\t);\n\n\t\t// Calculate range of pages\n\t\tconst pageMoreEnabled = this._config.pageMore;\n\n\t\tif (pageMoreEnabled) {\n\t\t\tconst maxButtons = this._config.pageMoreLimit;\n\t\t\tconst range = this._calculatePageRange(\n\t\t\t\tcurrentPage,\n\t\t\t\ttotalPages,\n\t\t\t\tmaxButtons,\n\t\t\t);\n\n\t\t\t// Add start ellipsis\n\t\t\tif (range.start > 1) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(more.text, more.class, false, () =>\n\t\t\t\t\t\tthis._paginateData(Math.max(1, range.start - 1)),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Add page buttons\n\t\t\tfor (let i = range.start; i <= range.end; i++) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(\n\t\t\t\t\t\tnumber.text.replace('{page}', i.toString()),\n\t\t\t\t\t\t`${number.class}${currentPage === i ? ' active disabled' : ''}`,\n\t\t\t\t\t\tcurrentPage === i,\n\t\t\t\t\t\t() => this._paginateData(i),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Add end ellipsis\n\t\t\tif (pageMoreEnabled && range.end < totalPages) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(more.text, more.class, false, () =>\n\t\t\t\t\t\tthis._paginateData(Math.min(totalPages, range.end + 1)),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// Add page buttons\n\t\t\tfor (let i = 1; i <= totalPages; i++) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(\n\t\t\t\t\t\tnumber.text.replace('{page}', i.toString()),\n\t\t\t\t\t\t`${number.class}${currentPage === i ? ' active disabled' : ''}`,\n\t\t\t\t\t\tcurrentPage === i,\n\t\t\t\t\t\t() => this._paginateData(i),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Add Next Button\n\t\tpaginationContainer.appendChild(\n\t\t\tcreateButton(\n\t\t\t\tnext.text,\n\t\t\t\t`${next.class}${currentPage === totalPages ? ' disabled' : ''}`,\n\t\t\t\tcurrentPage === totalPages,\n\t\t\t\t() => this._paginateData(currentPage + 1),\n\t\t\t),\n\t\t);\n\t}\n\n\t// New helper method to calculate page range\n\tprivate _calculatePageRange(\n\t\tcurrentPage: number,\n\t\ttotalPages: number,\n\t\tmaxButtons: number,\n\t): { start: number; end: number } {\n\t\tlet startPage: number, endPage: number;\n\t\tconst halfMaxButtons = Math.floor(maxButtons / 2);\n\n\t\tif (totalPages <= maxButtons) {\n\t\t\tstartPage = 1;\n\t\t\tendPage = totalPages;\n\t\t} else {\n\t\t\tstartPage = Math.max(currentPage - halfMaxButtons, 1);\n\t\t\tendPage = Math.min(startPage + maxButtons - 1, totalPages);\n\t\t\tif (endPage - startPage < maxButtons - 1) {\n\t\t\t\tstartPage = Math.max(endPage - maxButtons + 1, 1);\n\t\t\t}\n\t\t}\n\n\t\treturn { start: startPage, end: endPage };\n\t}\n\n\t/**\n\t * Method for handling pagination\n\t * @param page - The page number to navigate to\n\t */\n\tprivate _paginateData(page: number): void {\n\t\tif (page < 1 || !Number.isInteger(page)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._fireEvent('pagination', { page: page });\n\t\tthis._dispatchEvent('pagination', { page: page });\n\n\t\tif (page >= 1 && page <= this.getState().totalPages) {\n\t\t\tthis._config._state.page = page;\n\t\t\tthis._updateData();\n\t\t}\n\t}\n\n\t// Method to show the loading spinner\n\tprivate _showSpinner(): void {\n\t\tconst spinner =\n\t\t\tthis._element.querySelector<HTMLElement>(\n\t\t\t\tthis._config.attributes.spinner,\n\t\t\t) || this._createSpinner();\n\t\tif (spinner) {\n\t\t\tspinner.style.display = 'block';\n\t\t}\n\t\tthis._element.classList.add(this._config.loadingClass);\n\t}\n\n\t// Method to hide the loading spinner\n\tprivate _hideSpinner(): void {\n\t\tconst spinner = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.spinner,\n\t\t);\n\t\tif (spinner) {\n\t\t\tspinner.style.display = 'none';\n\t\t}\n\t\tthis._element.classList.remove(this._config.loadingClass);\n\t}\n\n\t// Method to create a spinner element if it doesn't exist\n\tprivate _createSpinner(): HTMLElement {\n\t\tif (typeof this._config.loading === 'undefined') {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst template = document.createElement('template');\n\t\ttemplate.innerHTML = this._config.loading.template\n\t\t\t.trim()\n\t\t\t.replace('{content}', this._config.loading.content);\n\t\tconst spinner = template.content.firstChild as HTMLElement;\n\t\tspinner.setAttribute('data-kt-datatable-spinner', 'true');\n\n\t\tthis._tableElement.appendChild(spinner);\n\n\t\treturn spinner;\n\t}\n\n\t/**\n\t * Saves the current state of the table to local storage.\n\t * @returns {void}\n\t */\n\tprivate _saveState(): void {\n\t\tthis._fireEvent('stateSave');\n\t\tthis._dispatchEvent('stateSave');\n\n\t\tconst ns: string = this._tableNamespace();\n\n\t\tif (ns) {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tns,\n\t\t\t\tJSON.stringify(this.getState() as KTDataTableStateInterface),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Loads the saved state of the table from local storage, if it exists.\n\t * @returns {Object} The saved state of the table, or null if no saved state exists.\n\t */\n\tprivate _loadState(): KTDataTableStateInterface | null {\n\t\tconst stateString = localStorage.getItem(this._tableNamespace());\n\t\tif (!stateString) return null;\n\n\t\ttry {\n\t\t\tconst state = JSON.parse(stateString) as KTDataTableStateInterface;\n\t\t\tif (state) this._config._state = state;\n\t\t\treturn state;\n\t\t} catch {} // eslint-disable-line no-empty\n\n\t\treturn null;\n\t}\n\n\tprivate _deleteState(): void {\n\t\tconst ns = this._tableNamespace();\n\n\t\tif (ns) {\n\t\t\tlocalStorage.removeItem(ns);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the namespace for the table's state.\n\t * If a namespace is specified in the config, it is used.\n\t * Otherwise, if the table element has an ID, it is used.\n\t * Otherwise, if the component element has an ID, it is used.\n\t * Finally, the component's UID is used.\n\t * @returns {string} The namespace for the table's state.\n\t */\n\tprivate _tableNamespace(): string {\n\t\t// Use the specified namespace, if one is given\n\t\tif (this._config.stateNamespace) {\n\t\t\treturn this._config.stateNamespace;\n\t\t}\n\n\t\t// Fallback to the component's UID\n\t\treturn this._tableId() ?? this._name;\n\t}\n\n\tprivate _tableId(): string {\n\t\tlet id: string = null;\n\t\t// If the table element has an ID, use that\n\t\tif (this._tableElement?.getAttribute('id')) {\n\t\t\tid = this._tableElement.getAttribute('id') as string;\n\t\t}\n\n\t\t// If the component element has an ID, use that\n\t\tif (this._element?.getAttribute('id')) {\n\t\t\tid = this._element.getAttribute('id') as string;\n\t\t}\n\n\t\treturn id;\n\t}\n\n\tprivate _dispose() {\n\t\t// Remove all event listeners and clean up resources\n\t}\n\n\tprivate _debounce(func: Function, wait: number) {\n\t\tlet timeout: number | undefined;\n\t\treturn function (...args: any[]) {\n\t\t\tconst later = () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tfunc(...args);\n\t\t\t};\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = window.setTimeout(later, wait);\n\t\t};\n\t}\n\n\t/**\n\t * Gets the current state of the table.\n\t * @returns {KTDataTableStateInterface} The current state of the table.\n\t */\n\tpublic getState(): KTDataTableStateInterface {\n\t\treturn {\n\t\t\t/**\n\t\t\t * The current page number.\n\t\t\t */\n\t\t\tpage: 1,\n\t\t\t/**\n\t\t\t * The field that the data is sorted by.\n\t\t\t */\n\t\t\tsortField: null,\n\t\t\t/**\n\t\t\t * The sort order (ascending or descending).\n\t\t\t */\n\t\t\tsortOrder: '',\n\t\t\t/**\n\t\t\t * The number of rows to display per page.\n\t\t\t */\n\t\t\tpageSize: this._config.pageSize,\n\n\t\t\tfilters: [],\n\n\t\t\t/**\n\t\t\t * Any additional state that may have been stored in the config.\n\t\t\t */\n\t\t\t...this._config._state,\n\t\t};\n\t}\n\n\t/**\n\t * Sorts the data in the table by the specified field.\n\t * @param field The field to sort by.\n\t */\n\tpublic sort(field: keyof T | number): void {\n\t\t// Use the sort handler to update state and trigger sorting\n\t\tconst state = this.getState();\n\t\tconst sortOrder = this._sortHandler.toggleSortOrder(\n\t\t\tstate.sortField,\n\t\t\tstate.sortOrder,\n\t\t\tfield,\n\t\t);\n\t\tthis._sortHandler.setSortIcon(field as keyof T, sortOrder);\n\t\tthis._config._state.sortField = field as never;\n\t\tthis._config._state.sortOrder = sortOrder;\n\t\tthis._fireEvent('sort', { field, order: sortOrder });\n\t\tthis._dispatchEvent('sort', { field, order: sortOrder });\n\t\tthis._updateData();\n\t}\n\n\t/**\n\t * Navigates to the specified page in the data table.\n\t * @param page The page number to navigate to.\n\t */\n\tpublic goPage(page: number): void {\n\t\tif (page < 1 || !Number.isInteger(page)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Navigate to the specified page\n\t\tthis._paginateData(page);\n\t}\n\n\t/**\n\t * Set the page size of the data table.\n\t * @param pageSize The new page size.\n\t */\n\tpublic setPageSize(pageSize: number): void {\n\t\tif (!Number.isInteger(pageSize)) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Reload the page size of the data table.\n\t\t * @param pageSize The new page size.\n\t\t */\n\t\tthis._reloadPageSize(pageSize);\n\t}\n\n\t/**\n\t * Reloads the data from the server and updates the table.\n\t * Triggers the 'reload' event and the 'kt.datatable.reload' custom event.\n\t */\n\tpublic reload(): void {\n\t\tthis._fireEvent('reload');\n\t\tthis._dispatchEvent('reload');\n\n\t\t// Fetch the data from the server using the current sort and filter settings\n\t\tthis._updateData();\n\t}\n\n\tpublic redraw(page: number = 1): void {\n\t\tthis._fireEvent('redraw');\n\t\tthis._dispatchEvent('redraw');\n\n\t\tthis._paginateData(page);\n\t}\n\n\t/**\n\t * Show the loading spinner of the data table.\n\t */\n\tpublic showSpinner(): void {\n\t\t/**\n\t\t * Show the loading spinner of the data table.\n\t\t */\n\t\tthis._showSpinner();\n\t}\n\n\t/**\n\t * Hide the loading spinner of the data table.\n\t */\n\tpublic hideSpinner(): void {\n\t\t/**\n\t\t * Hide the loading spinner of the data table.\n\t\t */\n\t\tthis._hideSpinner();\n\t}\n\n\t/**\n\t * Filter data using the specified filter object.\n\t * Replaces the existing filter object for the column with the new one.\n\t * @param filter Filter object containing the column name and its value.\n\t * @returns The KTDataTable instance.\n\t * @throws Error if the filter object is null or undefined.\n\t */\n\tpublic setFilter(filter: KTDataTableColumnFilterInterface): KTDataTable<T> {\n\t\tthis._config._state.filters = [\n\t\t\t...(this.getState().filters || []).filter(\n\t\t\t\t(f) => f.column !== filter.column,\n\t\t\t),\n\t\t\tfilter,\n\t\t];\n\t\treturn this;\n\t}\n\n\tpublic override dispose(): void {\n\t\tthis._dispose();\n\t}\n\n\tpublic search(query: string | object): void {\n\t\tthis._config._state.search = query;\n\t\tthis.reload();\n\t}\n\n\t/**\n\t * Static variables\n\t */\n\tprivate static _instances = new Map<\n\t\tHTMLElement,\n\t\tKTDataTable<KTDataTableDataInterface>\n\t>();\n\n\t/**\n\t * Create KTDataTable instances for all elements with a data-kt-datatable=\"true\" attribute.\n\t *\n\t * This function should be called after the control(s) have been\n\t * loaded and parsed by the browser. It will create instances of\n\t * KTDataTable for all elements with a data-kt-datatable=\"true\" attribute.\n\t */\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll<HTMLElement>(\n\t\t\t'[data-kt-datatable=\"true\"]',\n\t\t);\n\n\t\telements.forEach((element) => {\n\t\t\tif (\n\t\t\t\telement.hasAttribute('data-kt-datatable') &&\n\t\t\t\t!element.classList.contains('datatable-initialized')\n\t\t\t) {\n\t\t\t\t/**\n\t\t\t\t * Create an instance of KTDataTable for the given element\n\t\t\t\t * @param element The element to create an instance for\n\t\t\t\t */\n\t\t\t\tconst instance = new KTDataTable(element);\n\t\t\t\tthis._instances.set(element, instance);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Get the KTDataTable instance for a given element.\n\t *\n\t * @param element The element to retrieve the instance for\n\t * @returns The KTDataTable instance or undefined if not found\n\t */\n\tpublic static getInstance(\n\t\telement: HTMLElement,\n\t): KTDataTable<KTDataTableDataInterface> | undefined {\n\t\treturn this._instances.get(element);\n\t}\n\n\t/**\n\t * Initializes all KTDataTable instances on the page.\n\t *\n\t * This function should be called after the control(s) have been\n\t * loaded and parsed by the browser.\n\t */\n\tpublic static init(): void {\n\t\t// Create instances of KTDataTable for all elements with a\n\t\t// data-kt-datatable=\"true\" attribute\n\t\tKTDataTable.createInstances();\n\t}\n\n\t/**\n\t * Check if all visible rows are checked (header checkbox state)\n\t * @returns {boolean}\n\t */\n\tpublic isChecked(): boolean {\n\t\treturn this._checkbox.isChecked();\n\t}\n\n\t/**\n\t * Toggle all visible row checkboxes (header checkbox)\n\t * @returns {void}\n\t */\n\tpublic toggle(): void {\n\t\tthis._checkbox.toggle();\n\t}\n\n\t/**\n\t * Check all visible row checkboxes\n\t * @returns {void}\n\t */\n\tpublic check(): void {\n\t\tthis._checkbox.check();\n\t\tthis._fireEvent('checked');\n\t\tthis._dispatchEvent('checked');\n\t}\n\n\t/**\n\t * Uncheck all visible row checkboxes\n\t * @returns {void}\n\t */\n\tpublic uncheck(): void {\n\t\tthis._checkbox.uncheck();\n\t\tthis._fireEvent('unchecked');\n\t\tthis._dispatchEvent('unchecked');\n\t}\n\n\t/**\n\t * Get all checked row IDs (across all pages if preserveSelection is true)\n\t * @returns {string[]}\n\t */\n\tpublic getChecked(): string[] {\n\t\treturn this._checkbox.getChecked();\n\t}\n\n\t/**\n\t * Reapply checked state to visible checkboxes (after redraw/pagination)\n\t * @returns {void}\n\t */\n\tpublic update(): void {\n\t\tthis._checkbox.updateState();\n\t}\n\n\t// Other plugin methods can be added here\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTDataTable = KTDataTable;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTDataTable } from './datatable';\nexport type {\n\tKTDataTableSortOrderInterface,\n\tKTDataTableDataInterface,\n\tKTDataTableStateInterface as KTDataTableState,\n\tKTDataTableInterface,\n\tKTDataTableResponseDataInterface,\n\tKTDataTableConfigInterface,\n\tKTDataTableColumnFilterTypeInterface,\n\tKTDataTableColumnFilterInterface,\n\tKTDataTableCheckConfigInterface,\n\tKTDataTableCheckInterface,\n\tKTDataTableCheckChangePayloadInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { KTDatepickerStateManager } from './config';\nimport {\n\tcalendarGridTemplate,\n\tdayTemplate,\n\tdatepickerContainerTemplate,\n\tmonthYearSelectTemplate,\n\tmonthSelectionTemplate,\n\tyearSelectionTemplate,\n} from './templates';\nimport {\n\tgenerateCalendarMonth,\n\tgetLocaleConfig,\n\tisSameDay,\n\tisDateDisabled,\n\tisDateBetween,\n\tisWeekend,\n\tformatDate,\n\tparseDate,\n\tisValidDate,\n\tgetDaysInMonth,\n\tisDateEqual,\n\tisDateInRange,\n} from './utils';\nimport {\n\tCalendarDayCellInterface,\n\tDateRangeInterface,\n\tKTDatepickerEvents,\n} from './types';\nimport { KTDatepickerDropdown } from './dropdown';\nimport { KTDatepickerEventManager, KTDatepickerEventName } from './events';\n\n/**\n * Calendar component for the KTDatepicker\n * Handles rendering and interactions with the calendar\n */\nexport class KTDatepickerCalendar {\n\tprivate _element: HTMLElement;\n\tprivate _stateManager: KTDatepickerStateManager;\n\tprivate _eventManager: KTDatepickerEventManager;\n\tprivate _calendarContainer: HTMLElement | null = null;\n\tprivate _dropdownElement: HTMLElement | null = null;\n\tprivate _dropdownManager: KTDatepickerDropdown | null = null;\n\tprivate _isVisible: boolean = false;\n\tprivate _currentViewMonth: number;\n\tprivate _currentViewYear: number;\n\n\t/**\n\t * Constructor for the KTDatepickerCalendar class\n\t *\n\t * @param element - The datepicker element\n\t * @param stateManager - State manager for the datepicker\n\t */\n\tconstructor(element: HTMLElement, stateManager: KTDatepickerStateManager) {\n\t\tthis._element = element;\n\t\tthis._stateManager = stateManager;\n\t\tthis._eventManager = stateManager.getEventManager();\n\n\t\t// Get current date/time\n\t\tconst now = new Date();\n\t\tthis._currentViewMonth = now.getMonth();\n\t\tthis._currentViewYear = now.getFullYear();\n\n\t\tthis._initializeCalendar();\n\t\tthis._setupEventListeners();\n\t}\n\n\t/**\n\t * Initialize the calendar\n\t */\n\tprivate _initializeCalendar(): void {\n\t\tconst config = this._stateManager.getConfig();\n\t\tconst locale = getLocaleConfig(config);\n\n\t\t// Create calendar container\n\t\tthis._dropdownElement = document.createElement('div');\n\t\tthis._dropdownElement.className = 'kt-datepicker-dropdown';\n\t\tthis._dropdownElement.setAttribute('role', 'dialog');\n\t\tthis._dropdownElement.setAttribute('aria-modal', 'true');\n\t\tthis._dropdownElement.setAttribute('aria-label', 'Calendar');\n\n\t\t// Hidden by default\n\t\tthis._dropdownElement.classList.add('hidden');\n\t\tthis._dropdownElement.setAttribute('aria-hidden', 'true');\n\n\t\t// Create header for navigation\n\t\tconst headerElement = document.createElement('div');\n\t\theaderElement.className = 'kt-datepicker-calendar-header';\n\n\t\t// Left navigation button\n\t\tconst leftNavButton = document.createElement('button');\n\t\tleftNavButton.type = 'button';\n\t\tleftNavButton.className = 'kt-datepicker-calendar-left-nav-btn';\n\t\tleftNavButton.setAttribute('aria-label', 'Previous month');\n\t\tleftNavButton.innerHTML =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z\" clip-rule=\"evenodd\" /></svg>';\n\t\tleftNavButton.addEventListener('click', () => this._navigateMonth(-1));\n\n\t\t// Month and Year selector (center)\n\t\tconst headerCenter = document.createElement('div');\n\t\theaderCenter.className = 'kt-datepicker-datepicker-header-middle';\n\n\t\t// Right navigation button\n\t\tconst rightNavButton = document.createElement('button');\n\t\trightNavButton.type = 'button';\n\t\trightNavButton.className = 'kt-dropdown-calendar-right-nav-btn';\n\t\trightNavButton.setAttribute('aria-label', 'Next month');\n\t\trightNavButton.innerHTML =\n\t\t\t'<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\" clip-rule=\"evenodd\" /></svg>';\n\t\trightNavButton.addEventListener('click', () => this._navigateMonth(1));\n\n\t\t// Assemble header\n\t\theaderElement.appendChild(leftNavButton);\n\t\theaderElement.appendChild(headerCenter);\n\t\theaderElement.appendChild(rightNavButton);\n\t\tthis._dropdownElement.appendChild(headerElement);\n\n\t\t// Create calendar content container\n\t\tthis._calendarContainer = document.createElement('div');\n\t\tthis._calendarContainer.className = 'kt-datepicker-calendar-container';\n\t\tthis._dropdownElement.appendChild(this._calendarContainer);\n\n\t\t// Add calendar footer with action buttons\n\t\tconst footerElement = document.createElement('div');\n\t\tfooterElement.className = 'kt-datepicker-calendar-footer';\n\n\t\t// Today button\n\t\tconst todayButton = document.createElement('button');\n\t\ttodayButton.type = 'button';\n\t\ttodayButton.className = 'kt-datepicker-calendar-today-btn';\n\t\ttodayButton.textContent = 'Today';\n\t\ttodayButton.addEventListener('click', () => this._goToToday());\n\n\t\t// Clear button\n\t\tconst clearButton = document.createElement('button');\n\t\tclearButton.type = 'button';\n\t\tclearButton.className = 'kt-datepicker-calendar-clear-btn';\n\t\tclearButton.textContent = 'Clear';\n\t\tclearButton.addEventListener('click', () => this._clearSelection());\n\n\t\t// Apply button\n\t\tconst applyButton = document.createElement('button');\n\t\tapplyButton.type = 'button';\n\t\tapplyButton.className = 'kt-datepicker-calendar-clear-btn';\n\t\tapplyButton.textContent = 'Apply';\n\t\tapplyButton.addEventListener('click', () => this._applySelection());\n\n\t\t// Assemble footer\n\t\tfooterElement.appendChild(todayButton);\n\n\t\tconst rightFooter = document.createElement('div');\n\t\trightFooter.className = 'kt-datepicker-calendar-footer-right';\n\t\trightFooter.appendChild(clearButton);\n\t\trightFooter.appendChild(applyButton);\n\t\tfooterElement.appendChild(rightFooter);\n\n\t\tthis._dropdownElement.appendChild(footerElement);\n\n\t\t// Add to document\n\t\tthis._element.appendChild(this._dropdownElement);\n\n\t\t// Initialize dropdown manager\n\t\tthis._initDropdownManager();\n\n\t\t// Initialize calendar view\n\t\tthis._renderCalendarView();\n\t}\n\n\t/**\n\t * Initialize the dropdown manager\n\t */\n\tprivate _initDropdownManager(): void {\n\t\tconst config = this._stateManager.getConfig();\n\n\t\t// Use the display element rather than the input element\n\t\tconst displayElement = this._element.querySelector(\n\t\t\t'[data-kt-datepicker-display]',\n\t\t) as HTMLElement;\n\t\tconst inputElement = this._element.querySelector(\n\t\t\t'[data-kt-datepicker-input]',\n\t\t) as HTMLElement;\n\t\tconst triggerElement = displayElement || inputElement;\n\n\t\tif (triggerElement && this._dropdownElement) {\n\t\t\tthis._dropdownManager = new KTDatepickerDropdown(\n\t\t\t\tthis._element,\n\t\t\t\ttriggerElement,\n\t\t\t\tthis._dropdownElement,\n\t\t\t\tconfig,\n\t\t\t);\n\n\t\t\t// Add keyboard event listener to the trigger element\n\t\t\ttriggerElement.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tif (!this._isVisible) {\n\t\t\t\t\t\t// Open the dropdown\n\t\t\t\t\t\tthis._stateManager.setOpen(true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set up event listeners for calendar interactions\n\t */\n\tprivate _setupEventListeners(): void {\n\t\tif (!this._dropdownElement) return;\n\n\t\t// Get elements\n\t\tconst prevMonthBtn = this._dropdownElement.querySelector(\n\t\t\t'button[aria-label=\"Previous Month\"]',\n\t\t);\n\t\tconst nextMonthBtn = this._dropdownElement.querySelector(\n\t\t\t'button[aria-label=\"Next Month\"]',\n\t\t);\n\n\t\t// Find buttons by text content instead of using jQuery-style selectors\n\t\tconst buttons = this._dropdownElement.querySelectorAll('button');\n\t\tlet todayBtn: HTMLButtonElement | null = null;\n\t\tlet clearBtn: HTMLButtonElement | null = null;\n\t\tlet applyBtn: HTMLButtonElement | null = null;\n\n\t\tbuttons.forEach((btn) => {\n\t\t\tconst btnText = btn.textContent?.trim();\n\t\t\tif (btnText === 'Today') todayBtn = btn as HTMLButtonElement;\n\t\t\telse if (btnText === 'Clear') clearBtn = btn as HTMLButtonElement;\n\t\t\telse if (btnText === 'Apply') applyBtn = btn as HTMLButtonElement;\n\t\t});\n\n\t\tconst monthYearText = this._dropdownElement.querySelector(\n\t\t\t'.kt-datepicker-calendar-monthyear-text',\n\t\t);\n\n\t\t// Month navigation\n\t\tif (prevMonthBtn) {\n\t\t\tprevMonthBtn.addEventListener('click', () => this._navigateMonth(-1));\n\t\t}\n\n\t\tif (nextMonthBtn) {\n\t\t\tnextMonthBtn.addEventListener('click', () => this._navigateMonth(1));\n\t\t}\n\n\t\t// Month/year view toggle\n\t\tif (monthYearText) {\n\t\t\tmonthYearText.addEventListener('click', () =>\n\t\t\t\tthis._toggleMonthYearView(),\n\t\t\t);\n\t\t}\n\n\t\t// Today, Clear, Apply buttons\n\t\tif (todayBtn) {\n\t\t\ttodayBtn.addEventListener('click', () => this._goToToday());\n\t\t}\n\n\t\tif (clearBtn) {\n\t\t\tclearBtn.addEventListener('click', () => this._clearSelection());\n\t\t}\n\n\t\tif (applyBtn) {\n\t\t\tapplyBtn.addEventListener('click', () => this._applySelection());\n\t\t}\n\n\t\t// Handle day selection through event delegation\n\t\tif (this._calendarContainer) {\n\t\t\tthis._calendarContainer.addEventListener('click', (e) => {\n\t\t\t\tconst target = e.target as HTMLElement;\n\t\t\t\tconst dayButton = target.closest('button[data-date]') as HTMLElement;\n\n\t\t\t\tif (dayButton && !dayButton.hasAttribute('disabled')) {\n\t\t\t\t\t// Get the date ID directly from the clicked button (YYYY-MM-DD format)\n\t\t\t\t\tconst dateIdAttr = dayButton.getAttribute('data-date-id');\n\n\t\t\t\t\tif (dateIdAttr) {\n\t\t\t\t\t\t// Parse the ISO date string to get exact year, month, day\n\t\t\t\t\t\tconst [year, month, day] = dateIdAttr\n\t\t\t\t\t\t\t.split('-')\n\t\t\t\t\t\t\t.map((part) => parseInt(part, 10));\n\n\t\t\t\t\t\t// Create the date object from the parsed components\n\t\t\t\t\t\tconst clickedDate = new Date(year, month - 1, day); // Month is 0-indexed in JS\n\t\t\t\t\t\tclickedDate.setHours(0, 0, 0, 0); // Set to midnight\n\n\t\t\t\t\t\t// Handle this date directly instead of using day number\n\t\t\t\t\t\tthis._handleDateSelection(clickedDate, dayButton);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fallback to old method using day number if date-id is not present\n\t\t\t\t\t\tconst dateAttr = dayButton.getAttribute('data-date');\n\t\t\t\t\t\tif (dateAttr) {\n\t\t\t\t\t\t\tconst day = parseInt(dateAttr, 10);\n\t\t\t\t\t\t\tthis._handleDaySelection(day);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Add hover effect for range selection\n\t\t\tthis._calendarContainer.addEventListener('mouseover', (e) => {\n\t\t\t\tconst state = this._stateManager.getState();\n\t\t\t\tconst config = this._stateManager.getConfig();\n\n\t\t\t\t// Only apply hover effect in range mode when start date is selected but end date is not\n\t\t\t\tif (\n\t\t\t\t\t!config.range ||\n\t\t\t\t\t!state.selectedDateRange ||\n\t\t\t\t\t!state.selectedDateRange.startDate ||\n\t\t\t\t\tstate.selectedDateRange.endDate\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst target = e.target as HTMLElement;\n\t\t\t\tconst dayButton = target.closest('button[data-date]');\n\n\t\t\t\tif (dayButton && !dayButton.hasAttribute('disabled')) {\n\t\t\t\t\t// Clear any existing hover classes\n\t\t\t\t\tthis._clearRangeHoverClasses();\n\n\t\t\t\t\t// Get the proper date from the data-date-id attribute\n\t\t\t\t\tconst dateIdAttr = dayButton.getAttribute('data-date-id');\n\n\t\t\t\t\tif (dateIdAttr) {\n\t\t\t\t\t\t// Parse the ISO date string (YYYY-MM-DD)\n\t\t\t\t\t\tconst [year, month, day] = dateIdAttr\n\t\t\t\t\t\t\t.split('-')\n\t\t\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\t\t\tconst hoverDate = new Date(year, month - 1, day); // Month is 0-indexed in JS Date\n\n\t\t\t\t\t\t// Apply hover effect between start date and current hover date\n\t\t\t\t\t\tthis._applyRangeHoverEffect(\n\t\t\t\t\t\t\tstate.selectedDateRange.startDate,\n\t\t\t\t\t\t\thoverDate,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fallback to old method if data-date-id is not present\n\t\t\t\t\t\tconst dateAttr = dayButton.getAttribute('data-date');\n\t\t\t\t\t\tif (dateAttr) {\n\t\t\t\t\t\t\tconst day = parseInt(dateAttr, 10);\n\t\t\t\t\t\t\tconst hoverDate = new Date(state.currentDate);\n\t\t\t\t\t\t\thoverDate.setDate(day);\n\n\t\t\t\t\t\t\t// Apply hover effect between start date and current hover date\n\t\t\t\t\t\t\tthis._applyRangeHoverEffect(\n\t\t\t\t\t\t\t\tstate.selectedDateRange.startDate,\n\t\t\t\t\t\t\t\thoverDate,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Clear hover effect when mouse leaves the calendar\n\t\t\tthis._calendarContainer.addEventListener('mouseleave', () => {\n\t\t\t\tthis._clearRangeHoverClasses();\n\t\t\t});\n\t\t}\n\n\t\t// Listen for state changes\n\t\tthis._eventManager.addEventListener(\n\t\t\tKTDatepickerEventName.STATE_CHANGE,\n\t\t\t(e: CustomEvent) => {\n\t\t\t\tconst detail = e.detail?.payload;\n\t\t\t\tconst config = this._stateManager.getConfig();\n\n\t\t\t\t// For range selection, check if we need to keep the dropdown open\n\t\t\t\tif (config.range && detail && detail.selectedDateRange) {\n\t\t\t\t\tconst { startDate, endDate } = detail.selectedDateRange;\n\n\t\t\t\t\t// If start date is set but no end date, keep dropdown open\n\t\t\t\t\tif (startDate && !endDate) {\n\t\t\t\t\t\tthis._stateManager.getState().isRangeSelectionInProgress = true;\n\t\t\t\t\t} else if (startDate && endDate) {\n\t\t\t\t\t\tthis._stateManager.getState().isRangeSelectionInProgress = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update calendar view\n\t\t\t\tthis._updateCalendarView();\n\t\t\t},\n\t\t);\n\n\t\t// Listen for other state changes\n\t\tthis._eventManager.addEventListener(KTDatepickerEventName.VIEW_CHANGE, () =>\n\t\t\tthis._updateViewMode(),\n\t\t);\n\t\tthis._eventManager.addEventListener(KTDatepickerEventName.OPEN, () =>\n\t\t\tthis.show(),\n\t\t);\n\t\tthis._eventManager.addEventListener(KTDatepickerEventName.CLOSE, () =>\n\t\t\tthis.hide(),\n\t\t);\n\t\tthis._eventManager.addEventListener(KTDatepickerEventName.UPDATE, () =>\n\t\t\tthis._updateCalendarView(),\n\t\t);\n\n\t\t// Time inputs\n\t\tconst timeContainer = this._dropdownElement.querySelector(\n\t\t\t'.kt-datepicker-calendar-time-container',\n\t\t);\n\t\tif (timeContainer) {\n\t\t\tconst hourInput = timeContainer.querySelector(\n\t\t\t\t'input[aria-label=\"Hour\"]',\n\t\t\t) as HTMLInputElement;\n\t\t\tconst minuteInput = timeContainer.querySelector(\n\t\t\t\t'input[aria-label=\"Minute\"]',\n\t\t\t) as HTMLInputElement;\n\t\t\tconst secondInput = timeContainer.querySelector(\n\t\t\t\t'input[aria-label=\"Second\"]',\n\t\t\t) as HTMLInputElement;\n\t\t\tconst amButton = timeContainer.querySelector(\n\t\t\t\t'button[aria-label=\"AM\"]',\n\t\t\t) as HTMLButtonElement;\n\t\t\tconst pmButton = timeContainer.querySelector(\n\t\t\t\t'button[aria-label=\"PM\"]',\n\t\t\t) as HTMLButtonElement;\n\n\t\t\t// Update AM/PM button texts\n\t\t\tconst config = this._stateManager.getConfig();\n\t\t\tif (amButton) amButton.textContent = config.am;\n\t\t\tif (pmButton) pmButton.textContent = config.pm;\n\n\t\t\t// Time input listeners\n\t\t\tif (hourInput) {\n\t\t\t\thourInput.addEventListener('change', () => this._handleTimeChange());\n\t\t\t}\n\n\t\t\tif (minuteInput) {\n\t\t\t\tminuteInput.addEventListener('change', () => this._handleTimeChange());\n\t\t\t}\n\n\t\t\tif (secondInput) {\n\t\t\t\tsecondInput.addEventListener('change', () => this._handleTimeChange());\n\t\t\t}\n\n\t\t\t// AM/PM selection\n\t\t\tif (amButton) {\n\t\t\t\tamButton.addEventListener('click', () => this._setAmPm('AM'));\n\t\t\t}\n\n\t\t\tif (pmButton) {\n\t\t\t\tpmButton.addEventListener('click', () => this._setAmPm('PM'));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Render the calendar view based on current state\n\t */\n\tprivate _renderCalendarView(): void {\n\t\tif (!this._calendarContainer) return;\n\n\t\tconst state = this._stateManager.getState();\n\t\tconst config = this._stateManager.getConfig();\n\t\tconst locale = getLocaleConfig(config);\n\n\t\t// Clear existing content\n\t\tthis._calendarContainer.innerHTML = '';\n\n\t\t// Set up proper container classes for multiple months view\n\t\tif (config.visibleMonths > 1) {\n\t\t\t// For multiple months, use a flex container with no wrapping\n\t\t\tthis._calendarContainer.className = 'kt-datepicker-calendar-container-mt';\n\t\t} else {\n\t\t\tthis._calendarContainer.className = 'kt-datepicker-calendar-container';\n\t\t}\n\n\t\t// Render based on view mode\n\t\tswitch (state.viewMode) {\n\t\t\tcase 'days':\n\t\t\t\t// For each visible month, create a calendar\n\t\t\t\tfor (let i = 0; i < config.visibleMonths; i++) {\n\t\t\t\t\t// Calculate the month to display\n\t\t\t\t\tconst tempDate = new Date(state.currentDate);\n\t\t\t\t\ttempDate.setMonth(state.currentDate.getMonth() + i);\n\n\t\t\t\t\tconst month = tempDate.getMonth();\n\t\t\t\t\tconst year = tempDate.getFullYear();\n\n\t\t\t\t\t// Create month container\n\t\t\t\t\tconst monthContainer = document.createElement('div');\n\n\t\t\t\t\t// Set appropriate class based on number of months\n\t\t\t\t\tif (config.visibleMonths > 1) {\n\t\t\t\t\t\t// For multiple months, use fixed width and properly spaced\n\t\t\t\t\t\tmonthContainer.className = 'kt-datepicker-calendar-month-mt';\n\t\t\t\t\t\tmonthContainer.setAttribute('data-month-id', `${month}-${year}`);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmonthContainer.className = 'kt-datepicker-calendar-month';\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add month header\n\t\t\t\t\tconst monthHeader = document.createElement('div');\n\t\t\t\t\tmonthHeader.className = 'kt-datepicker-calendar-month-header';\n\t\t\t\t\tmonthHeader.textContent = `${locale.monthNames[month]} ${year}`;\n\t\t\t\t\tmonthContainer.appendChild(monthHeader);\n\n\t\t\t\t\t// Generate calendar grid\n\t\t\t\t\tmonthContainer.innerHTML += calendarGridTemplate(\n\t\t\t\t\t\tlocale,\n\t\t\t\t\t\tconfig.weekDays,\n\t\t\t\t\t);\n\n\t\t\t\t\t// Get days for the month\n\t\t\t\t\tconst calendarMatrix = generateCalendarMonth(year, month, config);\n\n\t\t\t\t\t// Render days\n\t\t\t\t\tconst daysBody = monthContainer.querySelector('tbody');\n\t\t\t\t\tif (daysBody) {\n\t\t\t\t\t\tdaysBody.innerHTML = this._renderDays(calendarMatrix, month, year);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add to container\n\t\t\t\t\tthis._calendarContainer.appendChild(monthContainer);\n\t\t\t\t}\n\n\t\t\t\t// Update the month/year display in header\n\t\t\t\tthis._updateMonthYearDisplay();\n\t\t\t\tbreak;\n\n\t\t\tcase 'months':\n\t\t\t\t// Render month selection view with current month\n\t\t\t\tconst currentMonth = state.currentDate.getMonth();\n\t\t\t\tthis._calendarContainer.innerHTML = monthSelectionTemplate(\n\t\t\t\t\tlocale,\n\t\t\t\t\tcurrentMonth,\n\t\t\t\t);\n\n\t\t\t\t// Add click events to month buttons\n\t\t\t\tconst monthButtons =\n\t\t\t\t\tthis._calendarContainer.querySelectorAll('button[data-month]');\n\t\t\t\tmonthButtons.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\t\t\tconst target = e.target as HTMLElement;\n\t\t\t\t\t\tconst monthIdx = target.getAttribute('data-month');\n\t\t\t\t\t\tif (monthIdx) {\n\t\t\t\t\t\t\tthis._selectMonth(parseInt(monthIdx, 10));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase 'years':\n\t\t\t\t// Get current year and calculate year range\n\t\t\t\tconst currentYear = state.currentDate.getFullYear();\n\t\t\t\tconst startYear = currentYear - Math.floor(config.visibleYears / 2);\n\t\t\t\tconst endYear = startYear + config.visibleYears - 1;\n\n\t\t\t\t// Render year selection view\n\t\t\t\tthis._calendarContainer.innerHTML = yearSelectionTemplate(\n\t\t\t\t\tstartYear,\n\t\t\t\t\tendYear,\n\t\t\t\t\tcurrentYear,\n\t\t\t\t);\n\n\t\t\t\t// Add click events to year buttons\n\t\t\t\tconst yearButtons =\n\t\t\t\t\tthis._calendarContainer.querySelectorAll('button[data-year]');\n\t\t\t\tyearButtons.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\t\t\tconst target = e.target as HTMLElement;\n\t\t\t\t\t\tconst year = target.getAttribute('data-year');\n\t\t\t\t\t\tif (year) {\n\t\t\t\t\t\t\tthis._selectYear(parseInt(year, 10));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\t// Add navigation for year ranges\n\t\t\t\tconst prevYearsBtn = this._calendarContainer.querySelector(\n\t\t\t\t\t'button[data-year-nav=\"prev\"]',\n\t\t\t\t);\n\t\t\t\tif (prevYearsBtn) {\n\t\t\t\t\tprevYearsBtn.addEventListener('click', () => {\n\t\t\t\t\t\tconst newYear = startYear - config.visibleYears;\n\t\t\t\t\t\tconst newDate = new Date(state.currentDate);\n\t\t\t\t\t\tnewDate.setFullYear(newYear);\n\t\t\t\t\t\tthis._stateManager.setCurrentDate(newDate);\n\t\t\t\t\t\tthis._renderCalendarView();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst nextYearsBtn = this._calendarContainer.querySelector(\n\t\t\t\t\t'button[data-year-nav=\"next\"]',\n\t\t\t\t);\n\t\t\t\tif (nextYearsBtn) {\n\t\t\t\t\tnextYearsBtn.addEventListener('click', () => {\n\t\t\t\t\t\tconst newYear = endYear + 1;\n\t\t\t\t\t\tconst newDate = new Date(state.currentDate);\n\t\t\t\t\t\tnewDate.setFullYear(newYear);\n\t\t\t\t\t\tthis._stateManager.setCurrentDate(newDate);\n\t\t\t\t\t\tthis._renderCalendarView();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Render days for a calendar month\n\t *\n\t * @param calendarMatrix - Matrix of dates for the month\n\t * @param currentMonth - Current month\n\t * @param currentYear - Current year\n\t * @returns HTML string for the days\n\t */\n\tprivate _renderDays(\n\t\tcalendarMatrix: Date[][],\n\t\tcurrentMonth: number,\n\t\tcurrentYear: number,\n\t): string {\n\t\tconst state = this._stateManager.getState();\n\t\tconst config = this._stateManager.getConfig();\n\t\tconst today = new Date();\n\t\ttoday.setHours(0, 0, 0, 0);\n\n\t\tlet html = '';\n\n\t\t// Loop through each week\n\t\tfor (const week of calendarMatrix) {\n\t\t\thtml += '<tr>';\n\n\t\t\t// Loop through each day in the week\n\t\t\tfor (const date of week) {\n\t\t\t\t// Determine cell properties\n\t\t\t\tconst isCurrentMonth = date.getMonth() === currentMonth;\n\t\t\t\tconst isToday = isSameDay(date, today);\n\t\t\t\tlet isSelected = false;\n\t\t\t\tlet isRangeStart = false;\n\t\t\t\tlet isRangeEnd = false;\n\t\t\t\tlet isInRange = false;\n\n\t\t\t\t// Check if date is selected\n\t\t\t\tif (state.selectedDate && isSameDay(date, state.selectedDate)) {\n\t\t\t\t\tisSelected = true;\n\t\t\t\t}\n\n\t\t\t\t// Check if date is in range for range selection\n\t\t\t\tif (config.range && state.selectedDateRange) {\n\t\t\t\t\tconst { startDate, endDate } = state.selectedDateRange;\n\n\t\t\t\t\tif (startDate && isSameDay(date, startDate)) {\n\t\t\t\t\t\tisRangeStart = true;\n\t\t\t\t\t\tisSelected = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (endDate && isSameDay(date, endDate)) {\n\t\t\t\t\t\tisRangeEnd = true;\n\t\t\t\t\t\tisSelected = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (startDate && endDate && isDateBetween(date, startDate, endDate)) {\n\t\t\t\t\t\tisInRange = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Check if date is in multi-date selection\n\t\t\t\tif (config.multiDateSelection && state.selectedDates.length > 0) {\n\t\t\t\t\tisSelected = state.selectedDates.some((d) => isSameDay(date, d));\n\t\t\t\t}\n\n\t\t\t\t// Check if date is disabled\n\t\t\t\tconst isDisabled = isDateDisabled(date, config);\n\n\t\t\t\t// Check if weekend\n\t\t\t\tconst isWeekendDay = isWeekend(date);\n\n\t\t\t\t// Get the actual month and year of this date (may differ from currentMonth/currentYear for adjacent months)\n\t\t\t\tconst actualMonth = date.getMonth();\n\t\t\t\tconst actualYear = date.getFullYear();\n\n\t\t\t\t// Generate day cell\n\t\t\t\thtml += dayTemplate(\n\t\t\t\t\tdate.getDate(),\n\t\t\t\t\tactualMonth,\n\t\t\t\t\tactualYear,\n\t\t\t\t\tisCurrentMonth,\n\t\t\t\t\tisToday,\n\t\t\t\t\tisSelected,\n\t\t\t\t\tisDisabled,\n\t\t\t\t\tisRangeStart,\n\t\t\t\t\tisRangeEnd,\n\t\t\t\t\tisInRange,\n\t\t\t\t\tisWeekendDay,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\thtml += '</tr>';\n\t\t}\n\n\t\treturn html;\n\t}\n\n\t/**\n\t * Update the month and year display in the header\n\t */\n\tprivate _updateMonthYearDisplay(): void {\n\t\tif (!this._dropdownElement) return;\n\n\t\tconst state = this._stateManager.getState();\n\t\tconst config = this._stateManager.getConfig();\n\t\tconst locale = getLocaleConfig(config);\n\n\t\t// Find the calendar header\n\t\tconst calendarHeader = this._dropdownElement.querySelector(\n\t\t\t'.kt-datepicker-calendar-header',\n\t\t);\n\t\tif (!calendarHeader) return;\n\n\t\tconst currentMonth = state.currentDate.getMonth();\n\t\tconst currentYear = state.currentDate.getFullYear();\n\n\t\t// Update the header with month/year selectors\n\t\tcalendarHeader.innerHTML = monthYearSelectTemplate(\n\t\t\tlocale,\n\t\t\tcurrentMonth,\n\t\t\tcurrentYear,\n\t\t);\n\n\t\t// Add event listeners to the month and year selectors\n\t\tconst monthSelector = calendarHeader.querySelector(\n\t\t\t'.kt-datepicker-calendar-month-selector',\n\t\t);\n\t\tconst yearSelector = calendarHeader.querySelector(\n\t\t\t'.kt-datepicker-calendar-year-selector',\n\t\t);\n\n\t\tif (monthSelector) {\n\t\t\tmonthSelector.addEventListener('click', () => {\n\t\t\t\t// Switch to months view\n\t\t\t\tthis._stateManager.setViewMode('months');\n\t\t\t\tthis._renderCalendarView();\n\t\t\t});\n\t\t}\n\n\t\tif (yearSelector) {\n\t\t\tyearSelector.addEventListener('click', () => {\n\t\t\t\t// Switch to years view\n\t\t\t\tthis._stateManager.setViewMode('years');\n\t\t\t\tthis._renderCalendarView();\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Navigate to a different month\n\t *\n\t * @param offset - Number of months to offset by\n\t */\n\tprivate _navigateMonth(offset: number): void {\n\t\tconst state = this._stateManager.getState();\n\t\tconst newDate = new Date(state.currentDate);\n\t\tnewDate.setMonth(newDate.getMonth() + offset);\n\n\t\tthis._stateManager.setCurrentDate(newDate);\n\t\tthis._renderCalendarView();\n\t}\n\n\t/**\n\t * Handle direct date selection (new method that takes the actual date object)\n\t *\n\t * @param selectedDate - The exact date that was selected\n\t * @param clickedButton - The button element that was clicked\n\t */\n\tprivate _handleDateSelection(\n\t\tselectedDate: Date,\n\t\tclickedButton: HTMLElement,\n\t): void {\n\t\tconst state = this._stateManager.getState();\n\t\tconst config = this._stateManager.getConfig();\n\n\t\t// Check if the date is disabled (outside min/max range or explicitly disabled)\n\t\tif (isDateDisabled(selectedDate, config)) {\n\t\t\tconsole.log(\n\t\t\t\t'Date is disabled, ignoring selection:',\n\t\t\t\tselectedDate.toISOString(),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Create a new date object set to noon of the selected date in local timezone\n\t\t// This prevents timezone shifts causing the wrong date to be selected\n\t\tconst localSelectedDate = new Date(selectedDate);\n\t\tlocalSelectedDate.setHours(12, 0, 0, 0);\n\n\t\t// Set time if enabled\n\t\tif (config.enableTime && state.selectedTime) {\n\t\t\tlocalSelectedDate.setHours(\n\t\t\t\tstate.selectedTime.hours,\n\t\t\t\tstate.selectedTime.minutes,\n\t\t\t\tstate.selectedTime.seconds,\n\t\t\t\t0,\n\t\t\t);\n\t\t}\n\n\t\t// Get the current range state before updating\n\t\tconst currentRange = state.selectedDateRange;\n\t\tconst isStartingNewRange =\n\t\t\t!currentRange ||\n\t\t\t!currentRange.startDate ||\n\t\t\t(currentRange.startDate && currentRange.endDate);\n\n\t\t// Determine if we're in a month different from the currently displayed one\n\t\tconst selectedMonth = localSelectedDate.getMonth();\n\t\tconst currentViewMonth = state.currentDate.getMonth();\n\t\tconst isInDifferentMonth = selectedMonth !== currentViewMonth;\n\n\t\tconsole.log(\n\t\t\t'Selected date:',\n\t\t\tlocalSelectedDate.toISOString(),\n\t\t\t'Month:',\n\t\t\tselectedMonth,\n\t\t\t'Current view month:',\n\t\t\tcurrentViewMonth,\n\t\t\t'Day of month:',\n\t\t\tlocalSelectedDate.getDate(),\n\t\t);\n\n\t\t// Call the state manager's setSelectedDate method\n\t\tthis._stateManager.setSelectedDate(localSelectedDate);\n\n\t\t// After setting the date, get the updated range state\n\t\tconst updatedRange = state.selectedDateRange;\n\n\t\t// If we're in range mode, handle specific range selection behavior\n\t\tif (config.range) {\n\t\t\tif (isStartingNewRange) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t'Starting new range selection with date:',\n\t\t\t\t\tlocalSelectedDate.toISOString(),\n\t\t\t\t);\n\n\t\t\t\t// If starting a range with a date in a different month, update the view\n\t\t\t\tif (isInDifferentMonth) {\n\t\t\t\t\tthis._stateManager.setCurrentDate(localSelectedDate);\n\t\t\t\t}\n\n\t\t\t\t// Explicitly clear any hover effects when starting a new range\n\t\t\t\tthis._clearRangeHoverClasses();\n\t\t\t} else {\n\t\t\t\t// This is the second click to complete a range\n\t\t\t\tconsole.log(\n\t\t\t\t\t'Completing range selection with date:',\n\t\t\t\t\tlocalSelectedDate.toISOString(),\n\t\t\t\t);\n\n\t\t\t\t// If the selected range spans different months and we have multiple visible months\n\t\t\t\tif (\n\t\t\t\t\tupdatedRange &&\n\t\t\t\t\tupdatedRange.startDate &&\n\t\t\t\t\tupdatedRange.endDate &&\n\t\t\t\t\tconfig.visibleMonths > 1\n\t\t\t\t) {\n\t\t\t\t\t// Determine range start and end months\n\t\t\t\t\tconst startMonth = updatedRange.startDate.getMonth();\n\t\t\t\t\tconst endMonth = updatedRange.endDate.getMonth();\n\n\t\t\t\t\t// If range spans multiple months, update view to show the earlier month\n\t\t\t\t\tif (startMonth !== endMonth) {\n\t\t\t\t\t\t// Show the earlier month as the first visible month\n\t\t\t\t\t\tconst earlierDate =\n\t\t\t\t\t\t\tupdatedRange.startDate < updatedRange.endDate\n\t\t\t\t\t\t\t\t? updatedRange.startDate\n\t\t\t\t\t\t\t\t: updatedRange.endDate;\n\t\t\t\t\t\tthis._stateManager.setCurrentDate(earlierDate);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Close dropdown only if range selection is complete\n\t\t\tif (updatedRange && updatedRange.startDate && updatedRange.endDate) {\n\t\t\t\tthis._stateManager.setOpen(false);\n\t\t\t}\n\t\t} else {\n\t\t\t// For single date selection, close the dropdown\n\t\t\tthis._stateManager.setOpen(false);\n\t\t}\n\n\t\t// Update calendar view to reflect changes\n\t\tthis._updateCalendarView();\n\t}\n\n\t/**\n\t * Handle day selection (legacy method, kept for backward compatibility)\n\t *\n\t * @param day - Day number\n\t */\n\tprivate _handleDaySelection(day: number): void {\n\t\tconst state = this._stateManager.getState();\n\t\tconst config = this._stateManager.getConfig();\n\n\t\t// Find the clicked button element using data-date attribute\n\t\tconst dayButtons = this._calendarContainer?.querySelectorAll(\n\t\t\t`button[data-date=\"${day}\"]`,\n\t\t);\n\t\tif (!dayButtons || dayButtons.length === 0) return;\n\n\t\t// First look for the button that matches the clicked target in the current month\n\t\tlet clickedButton: HTMLElement | null = null;\n\n\t\t// Find the actual button that was likely clicked (prefer current month days)\n\t\tfor (let i = 0; i < dayButtons.length; i++) {\n\t\t\tconst button = dayButtons[i] as HTMLElement;\n\t\t\tconst parentCell = button.closest('td');\n\n\t\t\t// Check if the day is in the current month (not faded)\n\t\t\tconst isCurrentMonth =\n\t\t\t\t!button.classList.contains('current') &&\n\t\t\t\t(!parentCell || !parentCell.classList.contains('current'));\n\n\t\t\tif (isCurrentMonth) {\n\t\t\t\tclickedButton = button;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// If no current month button found, use the first one\n\t\tif (!clickedButton && dayButtons.length > 0) {\n\t\t\tclickedButton = dayButtons[0] as HTMLElement;\n\t\t}\n\n\t\tif (!clickedButton) return;\n\n\t\t// Get the proper date from the data-date-id attribute which contains YYYY-MM-DD\n\t\tconst dateIdAttr = clickedButton.getAttribute('data-date-id');\n\t\tif (!dateIdAttr) return;\n\n\t\t// Parse the ISO date string\n\t\tconst [year, month, dayOfMonth] = dateIdAttr\n\t\t\t.split('-')\n\t\t\t.map((part) => parseInt(part, 10));\n\n\t\t// Create the date object with the proper timezone handling\n\t\t// We'll set it to noon in local time to avoid timezone issues\n\t\tconst selectedDate = new Date(year, month - 1, dayOfMonth, 12, 0, 0, 0); // Month is 0-indexed in JS Date, and setting time to noon\n\n\t\t// First check if this date is disabled (outside min/max range)\n\t\tif (isDateDisabled(selectedDate, config)) {\n\t\t\tconsole.log(\n\t\t\t\t'Date is disabled, ignoring selection:',\n\t\t\t\tselectedDate.toISOString(),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Use the new direct date selection method\n\t\tthis._handleDateSelection(selectedDate, clickedButton);\n\t}\n\n\t/**\n\t * Toggle between days, months, and years view\n\t */\n\tprivate _toggleMonthYearView(): void {\n\t\tconst state = this._stateManager.getState();\n\t\tlet newMode: 'days' | 'months' | 'years';\n\n\t\tswitch (state.viewMode) {\n\t\t\tcase 'days':\n\t\t\t\tnewMode = 'months';\n\t\t\t\tbreak;\n\t\t\tcase 'months':\n\t\t\t\tnewMode = 'years';\n\t\t\t\tbreak;\n\t\t\tcase 'years':\n\t\t\t\tnewMode = 'days';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tnewMode = 'days';\n\t\t}\n\n\t\tthis._stateManager.setViewMode(newMode);\n\t\tthis._renderCalendarView();\n\t}\n\n\t/**\n\t * Update view mode based on state change\n\t */\n\tprivate _updateViewMode(): void {\n\t\tthis._renderCalendarView();\n\t}\n\n\t/**\n\t * Go to today's date\n\t */\n\tprivate _goToToday(): void {\n\t\tconst today = new Date();\n\t\tthis._stateManager.setCurrentDate(today);\n\t\tthis._renderCalendarView();\n\t}\n\n\t/**\n\t * Clear date selection\n\t */\n\tprivate _clearSelection(): void {\n\t\tthis._stateManager.setSelectedDate(null);\n\t\tthis._updateCalendarView();\n\t}\n\n\t/**\n\t * Apply current selection and close dropdown\n\t */\n\tprivate _applySelection(): void {\n\t\tconst state = this._stateManager.getState();\n\t\tconst config = this._stateManager.getConfig();\n\n\t\t// For range selection, check if range selection is in progress\n\t\tif (config.range && state.isRangeSelectionInProgress) {\n\t\t\tconsole.log(\n\t\t\t\t'Apply button clicked, but range selection in progress - keeping dropdown open',\n\t\t\t);\n\t\t\t// Don't close when range selection is in progress\n\t\t\treturn;\n\t\t}\n\n\t\t// Close dropdown for other cases\n\t\tthis._stateManager.setOpen(false);\n\t}\n\n\t/**\n\t * Handle time input changes\n\t */\n\tprivate _handleTimeChange(): void {\n\t\tif (!this._dropdownElement) return;\n\n\t\tconst timeContainer = this._dropdownElement.querySelector(\n\t\t\t'.kt-datepicker-calendar-time-container',\n\t\t);\n\t\tif (!timeContainer) return;\n\n\t\tconst hourInput = timeContainer.querySelector(\n\t\t\t'input[aria-label=\"Hour\"]',\n\t\t) as HTMLInputElement;\n\t\tconst minuteInput = timeContainer.querySelector(\n\t\t\t'input[aria-label=\"Minute\"]',\n\t\t) as HTMLInputElement;\n\t\tconst secondInput = timeContainer.querySelector(\n\t\t\t'input[aria-label=\"Second\"]',\n\t\t) as HTMLInputElement;\n\t\tconst amButton = timeContainer.querySelector(\n\t\t\t'button[aria-label=\"AM\"]',\n\t\t) as HTMLButtonElement;\n\t\tconst pmButton = timeContainer.querySelector(\n\t\t\t'button[aria-label=\"PM\"]',\n\t\t) as HTMLButtonElement;\n\n\t\tif (!hourInput || !minuteInput || !secondInput) return;\n\n\t\t// Get input values\n\t\tlet hours = parseInt(hourInput.value, 10);\n\t\tconst minutes = parseInt(minuteInput.value, 10);\n\t\tconst seconds = parseInt(secondInput.value, 10);\n\n\t\t// Validate values\n\t\tconst isValidHours = !isNaN(hours) && hours >= 0 && hours <= 23;\n\t\tconst isValidMinutes = !isNaN(minutes) && minutes >= 0 && minutes <= 59;\n\t\tconst isValidSeconds = !isNaN(seconds) && seconds >= 0 && seconds <= 59;\n\n\t\tif (!isValidHours || !isValidMinutes || !isValidSeconds) return;\n\n\t\t// Check if using 12-hour format and adjust for AM/PM\n\t\tconst isPM = amButton && amButton.classList.contains('bg-blue-500');\n\t\tif (isPM && hours < 12) {\n\t\t\thours += 12;\n\t\t} else if (!isPM && hours === 12) {\n\t\t\thours = 0;\n\t\t}\n\n\t\t// Update time in state\n\t\tthis._stateManager.setSelectedTime({\n\t\t\thours,\n\t\t\tminutes,\n\t\t\tseconds,\n\t\t\tampm: isPM ? 'PM' : 'AM',\n\t\t});\n\n\t\t// Update selected date with new time if a date is selected\n\t\tconst state = this._stateManager.getState();\n\t\tif (state.selectedDate) {\n\t\t\tconst updatedDate = new Date(state.selectedDate);\n\t\t\tupdatedDate.setHours(hours, minutes, seconds, 0);\n\t\t\tthis._stateManager.setSelectedDate(updatedDate);\n\t\t}\n\t}\n\n\t/**\n\t * Set AM/PM selection\n\t *\n\t * @param period - 'AM' or 'PM'\n\t */\n\tprivate _setAmPm(period: 'AM' | 'PM'): void {\n\t\tif (!this._dropdownElement) return;\n\n\t\tconst timeContainer = this._dropdownElement.querySelector('.py-3.border-t');\n\t\tif (!timeContainer) return;\n\n\t\tconst amButton = timeContainer.querySelector(\n\t\t\t'button[aria-label=\"AM\"]',\n\t\t) as HTMLButtonElement;\n\t\tconst pmButton = timeContainer.querySelector(\n\t\t\t'button[aria-label=\"PM\"]',\n\t\t) as HTMLButtonElement;\n\n\t\tif (!amButton || !pmButton) return;\n\n\t\t// Update button states\n\t\tif (period === 'AM') {\n\t\t\tamButton.classList.add('bg-blue-500', 'text-white', 'border-blue-500');\n\t\t\tamButton.classList.remove('bg-gray-50', 'hover:bg-gray-100');\n\t\t\tpmButton.classList.remove('bg-blue-500', 'text-white', 'border-blue-500');\n\t\t\tpmButton.classList.add('bg-gray-50', 'hover:bg-gray-100');\n\t\t} else {\n\t\t\tamButton.classList.remove('bg-blue-500', 'text-white', 'border-blue-500');\n\t\t\tamButton.classList.add('bg-gray-50', 'hover:bg-gray-100');\n\t\t\tpmButton.classList.add('bg-blue-500', 'text-white', 'border-blue-500');\n\t\t\tpmButton.classList.remove('bg-gray-50', 'hover:bg-gray-100');\n\t\t}\n\n\t\t// Update time\n\t\tthis._handleTimeChange();\n\t}\n\n\t/**\n\t * Select a month\n\t *\n\t * @param month - Month index (0-11)\n\t */\n\tprivate _selectMonth(month: number): void {\n\t\tconst state = this._stateManager.getState();\n\t\tconst config = this._stateManager.getConfig();\n\t\tconst newDate = new Date(state.currentDate);\n\t\tnewDate.setMonth(month);\n\n\t\tthis._stateManager.setCurrentDate(newDate);\n\n\t\t// Only change view mode if keepViewModeOnSelection is false\n\t\tif (!config.keepViewModeOnSelection) {\n\t\t\tthis._stateManager.setViewMode('days');\n\t\t}\n\n\t\tthis._renderCalendarView();\n\t}\n\n\t/**\n\t * Select a year\n\t *\n\t * @param year - Year value\n\t */\n\tprivate _selectYear(year: number): void {\n\t\tconst state = this._stateManager.getState();\n\t\tconst config = this._stateManager.getConfig();\n\t\tconst newDate = new Date(state.currentDate);\n\t\tnewDate.setFullYear(year);\n\n\t\tthis._stateManager.setCurrentDate(newDate);\n\n\t\t// Only change view mode if keepViewModeOnSelection is false\n\t\tif (!config.keepViewModeOnSelection) {\n\t\t\tthis._stateManager.setViewMode('months');\n\t\t}\n\n\t\tthis._renderCalendarView();\n\t}\n\n\t/**\n\t * Update calendar view to reflect state changes\n\t */\n\tprivate _updateCalendarView(): void {\n\t\tthis._renderCalendarView();\n\t\tthis._updateTimeDisplay();\n\t}\n\n\t/**\n\t * Update time inputs to reflect current time selection\n\t */\n\tprivate _updateTimeDisplay(): void {\n\t\tif (!this._dropdownElement) return;\n\n\t\tconst state = this._stateManager.getState();\n\t\tconst config = this._stateManager.getConfig();\n\n\t\t// Skip if time is not enabled\n\t\tif (!config.enableTime) return;\n\n\t\tconst timeContainer = this._dropdownElement.querySelector('.py-3.border-t');\n\t\tif (!timeContainer) return;\n\n\t\tconst hourInput = timeContainer.querySelector(\n\t\t\t'input[aria-label=\"Hour\"]',\n\t\t) as HTMLInputElement;\n\t\tconst minuteInput = timeContainer.querySelector(\n\t\t\t'input[aria-label=\"Minute\"]',\n\t\t) as HTMLInputElement;\n\t\tconst secondInput = timeContainer.querySelector(\n\t\t\t'input[aria-label=\"Second\"]',\n\t\t) as HTMLInputElement;\n\t\tconst amButton = timeContainer.querySelector(\n\t\t\t'button[aria-label=\"AM\"]',\n\t\t) as HTMLButtonElement;\n\t\tconst pmButton = timeContainer.querySelector(\n\t\t\t'button[aria-label=\"PM\"]',\n\t\t) as HTMLButtonElement;\n\n\t\t// Get time from selected date or default to current time\n\t\tlet hours = 0;\n\t\tlet minutes = 0;\n\t\tlet seconds = 0;\n\t\tlet isAM = true;\n\n\t\tif (state.selectedTime) {\n\t\t\thours = state.selectedTime.hours;\n\t\t\tminutes = state.selectedTime.minutes;\n\t\t\tseconds = state.selectedTime.seconds;\n\t\t\tisAM = state.selectedTime.ampm === 'AM';\n\t\t} else if (state.selectedDate) {\n\t\t\thours = state.selectedDate.getHours();\n\t\t\tminutes = state.selectedDate.getMinutes();\n\t\t\tseconds = state.selectedDate.getSeconds();\n\t\t\tisAM = hours < 12;\n\t\t} else {\n\t\t\tconst now = new Date();\n\t\t\thours = now.getHours();\n\t\t\tminutes = now.getMinutes();\n\t\t\tseconds = now.getSeconds();\n\t\t\tisAM = hours < 12;\n\t\t}\n\n\t\t// Adjust for 12-hour display if needed\n\t\tlet displayHours = hours;\n\t\tif (hourInput && config.timeFormat.includes('h')) {\n\t\t\tdisplayHours = hours % 12;\n\t\t\tif (displayHours === 0) displayHours = 12;\n\t\t}\n\n\t\t// Update input values\n\t\tif (hourInput)\n\t\t\thourInput.value =\n\t\t\t\tconfig.forceLeadingZero && displayHours < 10\n\t\t\t\t\t? `0${displayHours}`\n\t\t\t\t\t: `${displayHours}`;\n\t\tif (minuteInput)\n\t\t\tminuteInput.value =\n\t\t\t\tconfig.forceLeadingZero && minutes < 10 ? `0${minutes}` : `${minutes}`;\n\t\tif (secondInput)\n\t\t\tsecondInput.value =\n\t\t\t\tconfig.forceLeadingZero && seconds < 10 ? `0${seconds}` : `${seconds}`;\n\n\t\t// Update AM/PM buttons\n\t\tif (amButton && pmButton) {\n\t\t\tif (isAM) {\n\t\t\t\tamButton.classList.add('bg-blue-500', 'text-white', 'border-blue-500');\n\t\t\t\tamButton.classList.remove('bg-gray-50', 'hover:bg-gray-100');\n\t\t\t\tpmButton.classList.remove(\n\t\t\t\t\t'bg-blue-500',\n\t\t\t\t\t'text-white',\n\t\t\t\t\t'border-blue-500',\n\t\t\t\t);\n\t\t\t\tpmButton.classList.add('bg-gray-50', 'hover:bg-gray-100');\n\t\t\t} else {\n\t\t\t\tamButton.classList.remove(\n\t\t\t\t\t'bg-blue-500',\n\t\t\t\t\t'text-white',\n\t\t\t\t\t'border-blue-500',\n\t\t\t\t);\n\t\t\t\tamButton.classList.add('bg-gray-50', 'hover:bg-gray-100');\n\t\t\t\tpmButton.classList.add('bg-blue-500', 'text-white', 'border-blue-500');\n\t\t\t\tpmButton.classList.remove('bg-gray-50', 'hover:bg-gray-100');\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Show the calendar dropdown\n\t */\n\tpublic show(): void {\n\t\tif (!this._dropdownElement || this._isVisible) return;\n\n\t\t// Ensure we're in days view\n\t\tconst state = this._stateManager.getState();\n\t\tif (state.viewMode !== 'days') {\n\t\t\tthis._stateManager.setViewMode('days');\n\t\t}\n\n\t\t// Render calendar before showing\n\t\tthis._renderCalendarView();\n\t\tthis._updateTimeDisplay();\n\n\t\t// Show dropdown using dropdown manager\n\t\tif (this._dropdownManager) {\n\t\t\tthis._dropdownManager.open();\n\t\t\tthis._isVisible = true;\n\t\t}\n\t}\n\n\t/**\n\t * Hide the calendar dropdown\n\t */\n\tpublic hide(): void {\n\t\tif (!this._dropdownElement || !this._isVisible) return;\n\n\t\t// Hide dropdown using dropdown manager\n\t\tif (this._dropdownManager) {\n\t\t\tthis._dropdownManager.close();\n\t\t\tthis._isVisible = false;\n\t\t}\n\t}\n\n\t/**\n\t * Update dropdown position\n\t */\n\tpublic updatePosition(): void {\n\t\tif (this._dropdownManager) {\n\t\t\tthis._dropdownManager.updatePosition();\n\t\t}\n\t}\n\n\t/**\n\t * Clear range hover classes from all day cells\n\t */\n\tprivate _clearRangeHoverClasses(): void {\n\t\tif (!this._calendarContainer) return;\n\n\t\t// Find all day cells with hover classes across all month containers\n\t\tconst hoverCells = this._calendarContainer.querySelectorAll(\n\t\t\t'.bg-blue-50, .text-blue-600, button[data-hover-date=\"true\"]',\n\t\t);\n\n\t\thoverCells.forEach((cell) => {\n\t\t\tcell.classList.remove('bg-blue-50', 'text-blue-600');\n\t\t});\n\t}\n\n\t/**\n\t * Apply hover effect to show potential range selection\n\t *\n\t * @param startDate - Start date of the range\n\t * @param hoverDate - Current date being hovered\n\t */\n\tprivate _applyRangeHoverEffect(startDate: Date, hoverDate: Date): void {\n\t\tif (!this._calendarContainer) return;\n\n\t\t// Clear any existing hover effects first\n\t\tthis._clearRangeHoverClasses();\n\n\t\t// Normalize dates to midnight for comparison\n\t\tconst startDateMidnight = new Date(startDate);\n\t\tstartDateMidnight.setHours(0, 0, 0, 0);\n\n\t\tconst hoverDateMidnight = new Date(hoverDate);\n\t\thoverDateMidnight.setHours(0, 0, 0, 0);\n\n\t\t// Ensure proper order for comparison (start date <= end date)\n\t\tconst rangeStart =\n\t\t\tstartDateMidnight <= hoverDateMidnight\n\t\t\t\t? startDateMidnight\n\t\t\t\t: hoverDateMidnight;\n\t\tconst rangeEnd =\n\t\t\tstartDateMidnight <= hoverDateMidnight\n\t\t\t\t? hoverDateMidnight\n\t\t\t\t: startDateMidnight;\n\n\t\t// Generate all dates in the range as ISO strings (YYYY-MM-DD)\n\t\tconst dateRangeISOStrings: string[] = [];\n\t\tconst currentDate = new Date(rangeStart);\n\n\t\twhile (currentDate <= rangeEnd) {\n\t\t\t// Format as YYYY-MM-DD\n\t\t\tconst year = currentDate.getFullYear();\n\t\t\tconst month = String(currentDate.getMonth() + 1).padStart(2, '0');\n\t\t\tconst day = String(currentDate.getDate()).padStart(2, '0');\n\n\t\t\tdateRangeISOStrings.push(`${year}-${month}-${day}`);\n\n\t\t\t// Move to the next day\n\t\t\tcurrentDate.setDate(currentDate.getDate() + 1);\n\t\t}\n\n\t\t// Apply hover effect to all day cells in the range using the date-id attribute\n\t\tdateRangeISOStrings.forEach((dateStr) => {\n\t\t\t// Find the day cell with matching date-id\n\t\t\tconst dayCells = this._calendarContainer.querySelectorAll(\n\t\t\t\t`button[data-date-id=\"${dateStr}\"]`,\n\t\t\t);\n\n\t\t\tdayCells.forEach((cell) => {\n\t\t\t\t// Skip if this is already a selected date (has blue background)\n\t\t\t\tif (cell.classList.contains('bg-blue-600')) return;\n\n\t\t\t\t// Apply hover effect\n\t\t\t\tcell.classList.add('bg-blue-50', 'text-blue-600');\n\t\t\t});\n\t\t});\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { DefaultLocales } from './locales';\nimport {\n\tKTDatepickerConfigInterface,\n\tKTDatepickerStateInterface,\n\tDateRangeInterface,\n\tTimeConfigInterface,\n} from './types';\nimport { isSameDay, isDateDisabled } from './utils';\nimport { KTDatepickerEventManager, KTDatepickerEventName } from './events';\n\nexport const DefaultConfig: KTDatepickerConfigInterface = {\n\tlocale: 'en-US',\n\tlocales: DefaultLocales, // all locales\n\n\tweekDays: 'min',\n\tforceLeadingZero: true,\n\n\t// 0-indexed month\n\t// minDate: new Date(2024, 7, 20),\n\t// maxDate: new Date(2024, 8, 10),\n\n\t// supported formats: refer to dateFormat\n\t// minDate: '20/08/2024',\n\t// maxDate: '10/09/2024',\n\n\t// Calendar\n\tvisibleMonths: 1, // visible months calendar to show\n\tvisibleYears: 10, // visible years span to show on year selection\n\tkeepViewModeOnSelection: false, // automatically switch view modes when selecting month/year\n\n\t// Date\n\tformat: 'dd/MM/yyyy',\n\n\t// Time\n\tenableTime: false,\n\ttimeFormat: 'hh:mm:ss A ZZZ', // 12-hours time format\n\t// timeFormat: 'HH:mm:ss ZZZ', // 24-hours time format\n\tam: 'AM',\n\tpm: 'PM',\n\thourStep: 1,\n\t// minuteStep: 5,\n\t// secondStep: 10,\n\t// disabledHours: [0, 1, 2, 3, 4, 5, 6, 22, 23],\n\t// disabledMinutes: [0, 1, 2, 3],\n\n\t// Date range\n\trange: false,\n\trangeSeparator: ' - ',\n\n\t// Multi-date selection\n\tmultiDateSelection: false,\n\tmaxDates: 0, // 0 means unlimited\n\n\t// Date blocking patterns\n\tdisabledDates: [],\n\tenableNaturalLanguage: true,\n\n\t// Animation settings\n\tanimationDuration: 250,\n\tanimationEasing: '',\n\tanimationEnterClass: '',\n\tanimationExitClass: '',\n};\n\n/**\n * State manager class for KTDatepicker\n * Handles state management and configuration\n */\nexport class KTDatepickerStateManager {\n\tprivate _element: HTMLElement;\n\tprivate _config: KTDatepickerConfigInterface;\n\tprivate _state: KTDatepickerStateInterface;\n\tprivate _events: KTDatepickerEventManager;\n\n\t/**\n\t * Constructor for the KTDatepickerStateManager class\n\t *\n\t * @param element - The datepicker element\n\t * @param config - Configuration object\n\t */\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig?: Partial<KTDatepickerConfigInterface>,\n\t) {\n\t\tthis._element = element;\n\t\tthis._config = this._mergeConfig(config || {});\n\t\tthis._state = this._initializeState();\n\t\tthis._events = new KTDatepickerEventManager(element);\n\t}\n\n\t/**\n\t * Merge provided configuration with default configuration\n\t *\n\t * @param config - User provided configuration\n\t * @returns Merged configuration\n\t */\n\tprivate _mergeConfig(\n\t\tconfig: Partial<KTDatepickerConfigInterface>,\n\t): KTDatepickerConfigInterface {\n\t\treturn { ...DefaultConfig, ...config };\n\t}\n\n\t/**\n\t * Initialize the state object with default values\n\t */\n\tprivate _initializeState(): KTDatepickerStateInterface {\n\t\tconst now = new Date();\n\t\tconst state: KTDatepickerStateInterface = {\n\t\t\tcurrentDate: now,\n\t\t\tselectedDate: null,\n\t\t\tselectedDateRange: null,\n\t\t\tselectedDates: [],\n\t\t\tviewMode: 'days',\n\t\t\tisOpen: false,\n\t\t\tisFocused: false,\n\t\t\tisRangeSelectionStart: true,\n\t\t\tisRangeSelectionInProgress: false,\n\t\t\tselectedTime: null,\n\t\t\tprevIsOpen: false,\n\t\t};\n\n\t\treturn state;\n\t}\n\n\t/**\n\t * Get the current configuration\n\t *\n\t * @returns Current configuration\n\t */\n\tpublic getConfig(): KTDatepickerConfigInterface {\n\t\treturn this._config;\n\t}\n\n\t/**\n\t * Get the current state\n\t *\n\t * @returns Current state\n\t */\n\tpublic getState(): KTDatepickerStateInterface {\n\t\treturn this._state;\n\t}\n\n\t/**\n\t * Set the selected date\n\t *\n\t * @param date - Date to select\n\t */\n\tpublic setSelectedDate(date: Date | null): void {\n\t\tconst state = this._state;\n\t\tconst config = this._config;\n\n\t\tif (date === null) {\n\t\t\t// Clear selection\n\t\t\tstate.selectedDate = null;\n\t\t\tstate.selectedDateRange = null;\n\t\t\tstate.isRangeSelectionInProgress = false;\n\t\t\tthis._dispatchChangeEvent();\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if the date is disabled (outside min/max range or explicitly disabled)\n\t\t// We add this check here as a second defense layer beyond the UI checks\n\t\tif (isDateDisabled(date, config)) {\n\t\t\tconsole.log(\n\t\t\t\t'Date is disabled in setSelectedDate, ignoring selection:',\n\t\t\t\tdate.toISOString(),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (config.range) {\n\t\t\t// Handle range selection\n\t\t\tif (!state.selectedDateRange) {\n\t\t\t\t// Initialize range object if it doesn't exist\n\t\t\t\tstate.selectedDateRange = { startDate: null, endDate: null };\n\t\t\t}\n\n\t\t\t// If start date isn't set or if we're resetting the range, set the start date\n\t\t\tif (\n\t\t\t\t!state.selectedDateRange.startDate ||\n\t\t\t\tstate.isRangeSelectionStart ||\n\t\t\t\tstate.selectedDateRange.endDate\n\t\t\t) {\n\t\t\t\t// Reset the range with a new start date\n\t\t\t\tstate.selectedDateRange.startDate = date;\n\t\t\t\tstate.selectedDateRange.endDate = null;\n\t\t\t\tstate.isRangeSelectionStart = false; // We've selected the start, next will be end\n\n\t\t\t\t// Set the flag to keep dropdown open during range selection\n\t\t\t\tstate.isRangeSelectionInProgress = true;\n\t\t\t\tconsole.log(\n\t\t\t\t\t'Range start selected - setting isRangeSelectionInProgress to true',\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Set the end date if the start date is already set\n\t\t\t\t// Ensure that start is before end (swap if needed)\n\t\t\t\tif (date < state.selectedDateRange.startDate) {\n\t\t\t\t\t// Swap dates if the selected date is before the start date\n\t\t\t\t\tstate.selectedDateRange.endDate = state.selectedDateRange.startDate;\n\t\t\t\t\tstate.selectedDateRange.startDate = date;\n\t\t\t\t} else {\n\t\t\t\t\tstate.selectedDateRange.endDate = date;\n\t\t\t\t}\n\t\t\t\tstate.isRangeSelectionStart = true; // Reset for next range selection\n\n\t\t\t\t// Clear the flag as range selection is complete\n\t\t\t\tstate.isRangeSelectionInProgress = false;\n\t\t\t\tconsole.log(\n\t\t\t\t\t'Range end selected - setting isRangeSelectionInProgress to false',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// For date range, we still set selectedDate for current focus\n\t\t\tstate.selectedDate = date;\n\n\t\t\t// Trigger event with range data\n\t\t\tthis._dispatchChangeEvent();\n\t\t} else {\n\t\t\t// Single date selection\n\t\t\tstate.selectedDate = date;\n\n\t\t\t// Multi-date selection\n\t\t\tif (config.multiDateSelection) {\n\t\t\t\t// Add or remove the date from the array\n\t\t\t\tconst existingIndex = state.selectedDates.findIndex((d) =>\n\t\t\t\t\tisSameDay(d, date),\n\t\t\t\t);\n\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t// Remove if already selected\n\t\t\t\t\tstate.selectedDates.splice(existingIndex, 1);\n\t\t\t\t} else if (state.selectedDates.length < config.maxDates) {\n\t\t\t\t\t// Add if not exceeding max\n\t\t\t\t\tstate.selectedDates.push(date);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Trigger event with single date data\n\t\t\tthis._dispatchChangeEvent();\n\t\t}\n\t}\n\n\t/**\n\t * Set the current view date (month/year being viewed)\n\t *\n\t * @param date - Date to set as current view\n\t */\n\tpublic setCurrentDate(date: Date): void {\n\t\tthis._state.currentDate = date;\n\t\tthis._dispatchEvent('month-change', {\n\t\t\tmonth: date.getMonth(),\n\t\t\tyear: date.getFullYear(),\n\t\t});\n\t}\n\n\t/**\n\t * Set the selected time\n\t *\n\t * @param time - Time configuration to set\n\t */\n\tpublic setSelectedTime(time: TimeConfigInterface | null): void {\n\t\tthis._state.selectedTime = time;\n\t\tthis._dispatchChangeEvent();\n\t}\n\n\t/**\n\t * Set the view mode (days, months, years)\n\t *\n\t * @param mode - View mode to set\n\t */\n\tpublic setViewMode(mode: 'days' | 'months' | 'years'): void {\n\t\tthis._state.viewMode = mode;\n\t\tthis._dispatchEvent('view-mode-change', { mode });\n\t}\n\n\t/**\n\t * Set the open state of the datepicker\n\t *\n\t * @param isOpen - Whether the datepicker is open\n\t */\n\tpublic setOpen(isOpen: boolean): void {\n\t\tthis._state.isOpen = isOpen;\n\t\tthis._dispatchEvent(isOpen ? 'open' : 'close');\n\n\t\t// Call callback if defined\n\t\tif (isOpen && this._config.onOpen) {\n\t\t\tthis._config.onOpen();\n\t\t} else if (!isOpen && this._config.onClose) {\n\t\t\tthis._config.onClose();\n\t\t}\n\t}\n\n\t/**\n\t * Set the focus state of the datepicker\n\t *\n\t * @param isFocused - Whether the datepicker is focused\n\t */\n\tpublic setFocused(isFocused: boolean): void {\n\t\tthis._state.isFocused = isFocused;\n\t\tthis._dispatchEvent(isFocused ? 'focus' : 'blur');\n\t}\n\n\t/**\n\t * Reset the state to initial values\n\t */\n\tpublic resetState(): void {\n\t\tthis._state = this._initializeState();\n\t\tthis._dispatchEvent('reset');\n\t}\n\n\t/**\n\t * Dispatch change event with current date/time selection\n\t */\n\tprivate _dispatchChangeEvent(): void {\n\t\tlet payload: any = {};\n\n\t\tif (this._config.range && this._state.selectedDateRange) {\n\t\t\tpayload.selectedDateRange = this._state.selectedDateRange;\n\t\t} else if (this._config.multiDateSelection) {\n\t\t\tpayload.selectedDates = [...this._state.selectedDates];\n\t\t} else {\n\t\t\tpayload.selectedDate = this._state.selectedDate;\n\t\t}\n\n\t\tif (this._config.enableTime && this._state.selectedTime) {\n\t\t\tpayload.selectedTime = { ...this._state.selectedTime };\n\t\t}\n\n\t\tthis._events.dispatchDateChangeEvent(payload);\n\n\t\t// Call onChange callback if defined\n\t\tif (this._config.onChange) {\n\t\t\tlet value: Date | null | DateRangeInterface;\n\n\t\t\tif (this._config.range) {\n\t\t\t\tvalue = this._state.selectedDateRange || {\n\t\t\t\t\tstartDate: null,\n\t\t\t\t\tendDate: null,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tvalue = this._state.selectedDate;\n\t\t\t}\n\n\t\t\tthis._config.onChange(value);\n\t\t}\n\t}\n\n\t/**\n\t * Dispatch custom event\n\t *\n\t * @param eventName - Name of the event\n\t * @param payload - Optional payload data\n\t */\n\tprivate _dispatchEvent(eventName: string, payload?: any): void {\n\t\tthis._events.dispatchEvent(eventName, payload);\n\t}\n\n\t/**\n\t * Get the event manager instance\n\t */\n\tpublic getEventManager(): KTDatepickerEventManager {\n\t\treturn this._events;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTComponent from '../component';\nimport { KTDatepickerCalendar } from './calendar';\nimport { KTDatepickerStateManager } from './config';\nimport { KTDatepickerKeyboard } from './keyboard';\nimport { DateRangeInterface, KTDatepickerConfigInterface } from './types';\nimport { formatDate, parseDate, isValidDate, isDateDisabled } from './utils';\nimport {\n\tdatepickerContainerTemplate,\n\tinputWrapperTemplate,\n\tsegmentedDateInputTemplate,\n\tsegmentedDateRangeInputTemplate,\n\tplaceholderTemplate,\n} from './templates';\nimport { KTDatepickerEventManager, KTDatepickerEventName } from './events';\n\n// Helper function to replace stringToElement\nfunction createElement(html: string): HTMLElement {\n\tconst template = document.createElement('template');\n\ttemplate.innerHTML = html.trim();\n\treturn template.content.firstChild as HTMLElement;\n}\n\n/**\n * KTDatepicker - Main datepicker component class\n * Manages the datepicker functionality and integration with input elements\n */\nexport class KTDatepicker extends KTComponent {\n\tprotected override readonly _name: string = 'datepicker';\n\tprotected override readonly _config: KTDatepickerConfigInterface;\n\n\tprivate _state: KTDatepickerStateManager;\n\tprivate _calendar: KTDatepickerCalendar;\n\tprivate _keyboard: KTDatepickerKeyboard;\n\tprivate _eventManager: KTDatepickerEventManager;\n\n\tprivate _dateInputElement: HTMLInputElement | null = null;\n\tprivate _startDateInputElement: HTMLInputElement | null = null;\n\tprivate _endDateInputElement: HTMLInputElement | null = null;\n\tprivate _displayElement: HTMLElement | null = null;\n\tprivate _useSegmentedDisplay = false;\n\tprivate _displayWrapper: HTMLElement | null = null;\n\tprivate _displayText: HTMLElement | null = null;\n\n\tprivate _currentDate: Date | null = null;\n\tprivate _currentRange: DateRangeInterface | null = null;\n\tprivate _segmentFocused:\n\t\t| 'day'\n\t\t| 'month'\n\t\t| 'year'\n\t\t| 'start-day'\n\t\t| 'start-month'\n\t\t| 'start-year'\n\t\t| 'end-day'\n\t\t| 'end-month'\n\t\t| 'end-year'\n\t\t| null = null;\n\n\t/**\n\t * Constructor for the KTDatepicker class.\n\t */\n\tconstructor(element: HTMLElement, config?: KTDatepickerConfigInterface) {\n\t\tsuper();\n\n\t\t// Check if the element already has a datepicker instance attached to it\n\t\tif (element.getAttribute('data-kt-datepicker-initialized') === 'true') {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initialize the datepicker with the provided element\n\t\tthis._init(element);\n\n\t\t// Build the configuration object by merging the default config with the provided config\n\t\tthis._buildConfig(config);\n\n\t\t// Store the instance of the datepicker directly on the element\n\t\t(element as any).instance = this;\n\n\t\t// Ensure the element is focusable\n\t\tthis._element.setAttribute('tabindex', '0');\n\t\tthis._element.classList.add(\n\t\t\t'kt-datepicker',\n\t\t\t'relative',\n\t\t\t'focus:outline-none',\n\t\t);\n\n\t\t// Mark as initialized\n\t\tthis._element.setAttribute('data-kt-datepicker-initialized', 'true');\n\n\t\t// Find input elements\n\t\tthis._initializeInputElements();\n\n\t\t// Create display element if needed\n\t\tthis._createDisplayElement();\n\n\t\t// Create state manager first\n\t\tthis._state = new KTDatepickerStateManager(this._element, this._config);\n\t\tthis._config = this._state.getConfig();\n\n\t\t// Initialize the calendar and keyboard after creating the state manager\n\t\tthis._calendar = new KTDatepickerCalendar(this._element, this._state);\n\t\tthis._keyboard = new KTDatepickerKeyboard(this._element, this._state);\n\n\t\t// Initialize event manager\n\t\tthis._eventManager = this._state.getEventManager();\n\n\t\t// Set up event listeners\n\t\tthis._setupEventListeners();\n\n\t\t// Initialize with any default values\n\t\tthis._initializeDefaultValues();\n\t}\n\n\t/**\n\t * Initialize input elements\n\t */\n\tprivate _initializeInputElements(): void {\n\t\t// Get main input element - will be hidden\n\t\tthis._dateInputElement = this._element.querySelector(\n\t\t\t'[data-kt-datepicker-input]',\n\t\t);\n\n\t\t// Hide the input element and make it only for data storage\n\t\tif (this._dateInputElement) {\n\t\t\tthis._dateInputElement.classList.add('hidden', 'sr-only');\n\t\t\tthis._dateInputElement.setAttribute('aria-hidden', 'true');\n\t\t\tthis._dateInputElement.tabIndex = -1;\n\t\t}\n\n\t\t// Get range input elements if applicable\n\t\tthis._startDateInputElement = this._element.querySelector(\n\t\t\t'[data-kt-datepicker-start]',\n\t\t);\n\t\tthis._endDateInputElement = this._element.querySelector(\n\t\t\t'[data-kt-datepicker-end]',\n\t\t);\n\n\t\t// Get display element if exists\n\t\tthis._displayElement = this._element.querySelector(\n\t\t\t'[data-kt-datepicker-display]',\n\t\t);\n\n\t\t// Check if we should use segmented display\n\t\tthis._useSegmentedDisplay =\n\t\t\tthis._element.hasAttribute('data-kt-datepicker-segmented') ||\n\t\t\tthis._element.hasAttribute('data-kt-datepicker-segmented-input');\n\t}\n\n\t/**\n\t * Create display element for datepicker\n\t */\n\tprivate _createDisplayElement(): void {\n\t\t// Skip if already created\n\t\tif (this._displayElement) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get format from config or use default\n\t\tconst format = this._config.format || 'mm/dd/yyyy';\n\t\tconst placeholder =\n\t\t\tthis._dateInputElement?.getAttribute('placeholder') || format;\n\n\t\t// Create wrapper for display element\n\t\tthis._displayWrapper = document.createElement('div');\n\t\tthis._displayWrapper.className =\n\t\t\t'kt-datepicker-display-wrapper kt-datepicker-display-segment';\n\t\tthis._displayWrapper.setAttribute('role', 'combobox');\n\t\tthis._displayWrapper.setAttribute('aria-haspopup', 'dialog');\n\t\tthis._displayWrapper.setAttribute('aria-expanded', 'false');\n\t\tthis._element.appendChild(this._displayWrapper);\n\n\t\tif (this._useSegmentedDisplay) {\n\t\t\t// Create segmented display for better date part selection\n\t\t\tconst displayContainer = document.createElement('div');\n\t\t\tdisplayContainer.className = 'kt-datepicker-display-element';\n\t\t\tdisplayContainer.setAttribute('tabindex', '0');\n\t\t\tdisplayContainer.setAttribute('role', 'textbox');\n\t\t\tdisplayContainer.setAttribute('aria-label', placeholder);\n\t\t\tdisplayContainer.setAttribute('data-kt-datepicker-display', '');\n\n\t\t\t// Add segmented template based on range mode\n\t\t\tif (this._config.range) {\n\t\t\t\tdisplayContainer.innerHTML = segmentedDateRangeInputTemplate(\n\t\t\t\t\tthis._config.format || 'mm/dd/yyyy',\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tdisplayContainer.innerHTML = segmentedDateInputTemplate(\n\t\t\t\t\tthis._config.format || 'mm/dd/yyyy',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis._displayElement = displayContainer;\n\t\t\tthis._displayWrapper.appendChild(this._displayElement);\n\n\t\t\t// Add click handlers for segments\n\t\t\tconst segments = this._displayElement.querySelectorAll('[data-segment]');\n\t\t\tsegments.forEach((segment) => {\n\t\t\t\tsegment.addEventListener('click', (e) => {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tconst segmentType = segment.getAttribute('data-segment');\n\t\t\t\t\tthis._handleSegmentClick(segmentType);\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\t// Create simple display element\n\t\t\tthis._displayElement = document.createElement('div');\n\t\t\tthis._displayElement.className = 'kt-datepicker-display-element';\n\t\t\tthis._displayElement.setAttribute('tabindex', '0');\n\t\t\tthis._displayElement.setAttribute('role', 'textbox');\n\t\t\tthis._displayElement.setAttribute('aria-label', placeholder);\n\t\t\tthis._displayElement.setAttribute('data-placeholder', placeholder);\n\t\t\tthis._displayElement.setAttribute('data-kt-datepicker-display', '');\n\n\t\t\t// Create display text element\n\t\t\tthis._displayText = document.createElement('span');\n\t\t\tthis._displayText.className = 'kt-datepicker-display-text';\n\t\t\tthis._displayText.textContent = placeholder;\n\t\t\tthis._displayText.classList.add('text-gray-400');\n\n\t\t\tthis._displayElement.appendChild(this._displayText);\n\t\t\tthis._displayWrapper.appendChild(this._displayElement);\n\t\t}\n\n\t\t// Add click event to display element\n\t\tthis._displayElement.addEventListener('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (!this._state.getState().isOpen) {\n\t\t\t\tthis._state.setOpen(true);\n\t\t\t}\n\t\t});\n\n\t\t// Enhanced keyboard event handling for display element\n\t\tthis._displayElement.addEventListener('keydown', (e) => {\n\t\t\tif (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\n\t\t\t\t// If not already open, open the dropdown\n\t\t\t\tif (!this._state.getState().isOpen) {\n\t\t\t\t\tthis._state.setOpen(true);\n\n\t\t\t\t\t// Dispatch a custom event to notify about the keyboard open\n\t\t\t\t\tthis._eventManager.dispatchKeyboardOpenEvent();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Handle segment click to focus and open appropriate view\n\t *\n\t * @param segmentType - Type of segment clicked\n\t */\n\tprivate _handleSegmentClick(segmentType: string | null): void {\n\t\tif (!segmentType) return;\n\n\t\t// Store the focused segment\n\t\tthis._segmentFocused = segmentType as any;\n\n\t\t// Remove highlight from all segments\n\t\tthis._removeSegmentHighlights();\n\n\t\t// Add highlight to clicked segment\n\t\tif (this._displayElement) {\n\t\t\tconst segment = this._displayElement.querySelector(\n\t\t\t\t`[data-segment=\"${segmentType}\"]`,\n\t\t\t);\n\t\t\tif (segment) {\n\t\t\t\tsegment.classList.add('kt-datepicker-segment-focused');\n\t\t\t}\n\t\t}\n\n\t\t// Set the appropriate view mode based on segment type\n\t\tif (segmentType.includes('day')) {\n\t\t\t// Day segment - open in days view (default)\n\t\t\tthis._state.setViewMode('days');\n\t\t\tthis._state.setOpen(true);\n\t\t} else if (segmentType.includes('month')) {\n\t\t\t// Month segment - open in months view\n\t\t\tthis._state.setViewMode('months');\n\t\t\tthis._state.setOpen(true);\n\t\t} else if (segmentType.includes('year')) {\n\t\t\t// Year segment - open in years view\n\t\t\tthis._state.setViewMode('years');\n\t\t\tthis._state.setOpen(true);\n\t\t}\n\t}\n\n\t/**\n\t * Set up event listeners\n\t */\n\tprivate _setupEventListeners(): void {\n\t\t// Listen for state changes\n\t\tthis._eventManager.addEventListener(\n\t\t\tKTDatepickerEventName.STATE_CHANGE,\n\t\t\t(e: CustomEvent) => {\n\t\t\t\tconst { state } = e.detail;\n\n\t\t\t\t// Update ARIA attributes based on open state\n\t\t\t\tif (this._displayWrapper) {\n\t\t\t\t\tthis._displayWrapper.setAttribute(\n\t\t\t\t\t\t'aria-expanded',\n\t\t\t\t\t\tstate.isOpen.toString(),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Update display when closing\n\t\t\t\tif (!state.isOpen && state.prevIsOpen) {\n\t\t\t\t\tthis._syncDisplayWithSelectedDate();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\t// Set up change event listener to update input values\n\t\tthis._eventManager.addEventListener(\n\t\t\tKTDatepickerEventName.DATE_CHANGE,\n\t\t\tthis._handleDateChange.bind(this),\n\t\t);\n\n\t\t// Add keyboard events to the root element\n\t\tthis._element.addEventListener('keydown', (e) => {\n\t\t\tif (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n\t\t\t\tconst state = this._state.getState();\n\t\t\t\tif (!state.isOpen) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis._state.setOpen(true);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Add keyboard navigation for segments\n\t\tif (this._displayElement && this._useSegmentedDisplay) {\n\t\t\tthis._displayElement.addEventListener(\n\t\t\t\t'keydown',\n\t\t\t\tthis._handleSegmentKeydown.bind(this),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handle keyboard navigation between segments\n\t *\n\t * @param e - Keyboard event\n\t */\n\tprivate _handleSegmentKeydown(e: KeyboardEvent): void {\n\t\t// Only handle if we have a focused segment\n\t\tif (!this._segmentFocused) return;\n\n\t\tconst target = e.target as HTMLElement;\n\t\tconst segmentType = target.getAttribute('data-segment');\n\t\tif (!segmentType) return;\n\n\t\t// Handle keyboard navigation\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowLeft':\n\t\t\t\te.preventDefault();\n\t\t\t\tthis._navigateSegments('prev', segmentType);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowRight':\n\t\t\t\te.preventDefault();\n\t\t\t\tthis._navigateSegments('next', segmentType);\n\t\t\t\tbreak;\n\t\t\tcase 'Tab':\n\t\t\t\t// Let default tab behavior work, but update focus segment when tabbing\n\t\t\t\tthis._segmentFocused = segmentType as any;\n\t\t\t\t// Remove highlight from all segments\n\t\t\t\tthis._removeSegmentHighlights();\n\t\t\t\t// Add highlight to current segment\n\t\t\t\ttarget.classList.add('segment-focused');\n\t\t\t\tbreak;\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\te.preventDefault();\n\t\t\t\tthis._handleSegmentClick(segmentType);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Navigate between segments with keyboard\n\t *\n\t * @param direction - 'prev' or 'next'\n\t * @param currentSegment - Current segment identifier\n\t */\n\tprivate _navigateSegments(\n\t\tdirection: 'prev' | 'next',\n\t\tcurrentSegment: string,\n\t): void {\n\t\tif (!this._displayElement) return;\n\n\t\t// Define segment order\n\t\tlet segments: string[];\n\t\tif (this._config.range) {\n\t\t\tsegments = [\n\t\t\t\t'start-month',\n\t\t\t\t'start-day',\n\t\t\t\t'start-year',\n\t\t\t\t'end-month',\n\t\t\t\t'end-day',\n\t\t\t\t'end-year',\n\t\t\t];\n\t\t} else {\n\t\t\tsegments = ['month', 'day', 'year'];\n\t\t}\n\n\t\t// Find current index\n\t\tconst currentIndex = segments.indexOf(currentSegment);\n\t\tif (currentIndex === -1) return;\n\n\t\t// Calculate new index\n\t\tlet newIndex;\n\t\tif (direction === 'prev') {\n\t\t\tnewIndex = currentIndex === 0 ? segments.length - 1 : currentIndex - 1;\n\t\t} else {\n\t\t\tnewIndex = currentIndex === segments.length - 1 ? 0 : currentIndex + 1;\n\t\t}\n\n\t\t// Find new segment element\n\t\tconst newSegment = this._displayElement.querySelector(\n\t\t\t`[data-segment=\"${segments[newIndex]}\"]`,\n\t\t) as HTMLElement;\n\t\tif (!newSegment) return;\n\n\t\t// Update focus\n\t\tnewSegment.focus();\n\t\tthis._segmentFocused = segments[newIndex] as any;\n\n\t\t// Remove highlight from all segments\n\t\tthis._removeSegmentHighlights();\n\n\t\t// Add highlight to new segment\n\t\tnewSegment.classList.add('segment-focused');\n\t}\n\n\t/**\n\t * Remove highlight from all segments\n\t */\n\tprivate _removeSegmentHighlights(): void {\n\t\tif (!this._displayElement) return;\n\n\t\tconst segments = this._displayElement.querySelectorAll('.segment-part');\n\t\tsegments.forEach((segment) => {\n\t\t\tsegment.classList.remove('segment-focused');\n\t\t});\n\t}\n\n\t/**\n\t * Sync display element with the selected date\n\t */\n\tprivate _syncDisplayWithSelectedDate(): void {\n\t\tif (!this._displayElement) return;\n\n\t\tconst state = this._state.getState();\n\t\tconst selectedDate = state.selectedDate;\n\t\tconst selectedDateRange = state.selectedDateRange;\n\n\t\tif (this._useSegmentedDisplay) {\n\t\t\t// Update segmented display elements\n\t\t\tif (selectedDate) {\n\t\t\t\t// Single date\n\t\t\t\tconst daySegment = this._displayElement.querySelector(\n\t\t\t\t\t'[data-segment=\"day\"]',\n\t\t\t\t);\n\t\t\t\tconst monthSegment = this._displayElement.querySelector(\n\t\t\t\t\t'[data-segment=\"month\"]',\n\t\t\t\t);\n\t\t\t\tconst yearSegment = this._displayElement.querySelector(\n\t\t\t\t\t'[data-segment=\"year\"]',\n\t\t\t\t);\n\n\t\t\t\tif (daySegment) {\n\t\t\t\t\tdaySegment.textContent = selectedDate\n\t\t\t\t\t\t.getDate()\n\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t.padStart(2, '0');\n\t\t\t\t}\n\t\t\t\tif (monthSegment) {\n\t\t\t\t\tmonthSegment.textContent = (selectedDate.getMonth() + 1)\n\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t.padStart(2, '0');\n\t\t\t\t}\n\t\t\t\tif (yearSegment) {\n\t\t\t\t\tyearSegment.textContent = selectedDate.getFullYear().toString();\n\t\t\t\t}\n\t\t\t} else if (selectedDateRange && selectedDateRange.startDate) {\n\t\t\t\t// Range selection\n\t\t\t\tconst startDay = this._displayElement.querySelector(\n\t\t\t\t\t'[data-segment=\"start-day\"]',\n\t\t\t\t);\n\t\t\t\tconst startMonth = this._displayElement.querySelector(\n\t\t\t\t\t'[data-segment=\"start-month\"]',\n\t\t\t\t);\n\t\t\t\tconst startYear = this._displayElement.querySelector(\n\t\t\t\t\t'[data-segment=\"start-year\"]',\n\t\t\t\t);\n\n\t\t\t\tif (startDay) {\n\t\t\t\t\tstartDay.textContent = selectedDateRange.startDate\n\t\t\t\t\t\t.getDate()\n\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t.padStart(2, '0');\n\t\t\t\t}\n\t\t\t\tif (startMonth) {\n\t\t\t\t\tstartMonth.textContent = (selectedDateRange.startDate.getMonth() + 1)\n\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t.padStart(2, '0');\n\t\t\t\t}\n\t\t\t\tif (startYear) {\n\t\t\t\t\tstartYear.textContent = selectedDateRange.startDate\n\t\t\t\t\t\t.getFullYear()\n\t\t\t\t\t\t.toString();\n\t\t\t\t}\n\n\t\t\t\tif (selectedDateRange.endDate) {\n\t\t\t\t\tconst endDay = this._displayElement.querySelector(\n\t\t\t\t\t\t'[data-segment=\"end-day\"]',\n\t\t\t\t\t);\n\t\t\t\t\tconst endMonth = this._displayElement.querySelector(\n\t\t\t\t\t\t'[data-segment=\"end-month\"]',\n\t\t\t\t\t);\n\t\t\t\t\tconst endYear = this._displayElement.querySelector(\n\t\t\t\t\t\t'[data-segment=\"end-year\"]',\n\t\t\t\t\t);\n\n\t\t\t\t\tif (endDay) {\n\t\t\t\t\t\tendDay.textContent = selectedDateRange.endDate\n\t\t\t\t\t\t\t.getDate()\n\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t.padStart(2, '0');\n\t\t\t\t\t}\n\t\t\t\t\tif (endMonth) {\n\t\t\t\t\t\tendMonth.textContent = (selectedDateRange.endDate.getMonth() + 1)\n\t\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t\t.padStart(2, '0');\n\t\t\t\t\t}\n\t\t\t\t\tif (endYear) {\n\t\t\t\t\t\tendYear.textContent = selectedDateRange.endDate\n\t\t\t\t\t\t\t.getFullYear()\n\t\t\t\t\t\t\t.toString();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this._displayText) {\n\t\t\t// Simple display\n\t\t\tif (selectedDate) {\n\t\t\t\t// Clear placeholder styling\n\t\t\t\tthis._displayText.classList.remove('placeholder');\n\n\t\t\t\t// Format date(s) based on config\n\t\t\t\tif (\n\t\t\t\t\tthis._config.range &&\n\t\t\t\t\tselectedDateRange &&\n\t\t\t\t\tselectedDateRange.startDate &&\n\t\t\t\t\tselectedDateRange.endDate\n\t\t\t\t) {\n\t\t\t\t\tthis._displayText.textContent = `${formatDate(\n\t\t\t\t\t\tselectedDateRange.startDate,\n\t\t\t\t\t\tthis._config.format,\n\t\t\t\t\t\tthis._config,\n\t\t\t\t\t)} - ${formatDate(\n\t\t\t\t\t\tselectedDateRange.endDate,\n\t\t\t\t\t\tthis._config.format,\n\t\t\t\t\t\tthis._config,\n\t\t\t\t\t)}`;\n\t\t\t\t} else {\n\t\t\t\t\tthis._displayText.textContent = formatDate(\n\t\t\t\t\t\tselectedDate,\n\t\t\t\t\t\tthis._config.format,\n\t\t\t\t\t\tthis._config,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// No date selected, show format as placeholder\n\t\t\t\tconst placeholder =\n\t\t\t\t\tthis._displayElement?.getAttribute('data-placeholder') ||\n\t\t\t\t\tthis._config.format;\n\t\t\t\tthis._displayText.textContent = placeholder;\n\t\t\t\tthis._displayText.classList.add('placeholder');\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handle date change events\n\t *\n\t * @param e - Custom event with date change details\n\t */\n\tprivate _handleDateChange(e: CustomEvent): void {\n\t\tconst detail = e.detail?.payload;\n\t\tif (!detail) return;\n\n\t\t// Handle single date selection\n\t\tif (detail.selectedDate) {\n\t\t\tconst formattedDate = formatDate(\n\t\t\t\tdetail.selectedDate,\n\t\t\t\tthis._config.format,\n\t\t\t\tthis._config,\n\t\t\t);\n\n\t\t\t// Update hidden input value\n\t\t\tif (this._dateInputElement) {\n\t\t\t\tthis._dateInputElement.value = formattedDate;\n\t\t\t\t// Dispatch change event on input to trigger form validation\n\t\t\t\tthis._dateInputElement.dispatchEvent(\n\t\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Update display element\n\t\t\tthis._updateDisplayElement(detail.selectedDate);\n\t\t}\n\n\t\t// Handle date range selection\n\t\tif (detail.selectedDateRange && this._config.range) {\n\t\t\tconst { startDate, endDate } = detail.selectedDateRange;\n\n\t\t\t// Format the range for the hidden input\n\t\t\tif (this._dateInputElement) {\n\t\t\t\tlet displayValue = '';\n\n\t\t\t\tif (startDate) {\n\t\t\t\t\tdisplayValue = formatDate(\n\t\t\t\t\t\tstartDate,\n\t\t\t\t\t\tthis._config.format,\n\t\t\t\t\t\tthis._config,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (endDate) {\n\t\t\t\t\t\tconst endFormatted = formatDate(\n\t\t\t\t\t\t\tendDate,\n\t\t\t\t\t\t\tthis._config.format,\n\t\t\t\t\t\t\tthis._config,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdisplayValue += `${this._config.rangeSeparator}${endFormatted}`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._dateInputElement.value = displayValue;\n\t\t\t\t// Dispatch change event on input\n\t\t\t\tthis._dateInputElement.dispatchEvent(\n\t\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Update individual start/end inputs if they exist\n\t\t\tif (this._startDateInputElement && startDate) {\n\t\t\t\tthis._startDateInputElement.value = formatDate(\n\t\t\t\t\tstartDate,\n\t\t\t\t\tthis._config.format,\n\t\t\t\t\tthis._config,\n\t\t\t\t);\n\t\t\t\tthis._startDateInputElement.dispatchEvent(\n\t\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (this._endDateInputElement && endDate) {\n\t\t\t\tthis._endDateInputElement.value = formatDate(\n\t\t\t\t\tendDate,\n\t\t\t\t\tthis._config.format,\n\t\t\t\t\tthis._config,\n\t\t\t\t);\n\t\t\t\tthis._endDateInputElement.dispatchEvent(\n\t\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Update display element for range\n\t\t\tthis._updateRangeDisplayElement(startDate, endDate);\n\t\t}\n\t}\n\n\t/**\n\t * Update the display element for a single date\n\t *\n\t * @param date - The date to display\n\t */\n\tprivate _updateDisplayElement(date: Date | null): void {\n\t\tif (!this._displayElement) return;\n\n\t\tif (!date) {\n\t\t\t// If no date, show placeholder\n\t\t\tconst placeholder =\n\t\t\t\tthis._dateInputElement?.getAttribute('placeholder') || 'Select date';\n\t\t\tthis._displayElement.innerHTML = placeholderTemplate(placeholder);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._useSegmentedDisplay) {\n\t\t\t// Update segmented display\n\t\t\tconst day = date.getDate();\n\t\t\tconst month = date.getMonth() + 1;\n\t\t\tconst year = date.getFullYear();\n\n\t\t\tconst daySegment = this._displayElement.querySelector(\n\t\t\t\t'[data-segment=\"day\"]',\n\t\t\t);\n\t\t\tconst monthSegment = this._displayElement.querySelector(\n\t\t\t\t'[data-segment=\"month\"]',\n\t\t\t);\n\t\t\tconst yearSegment = this._displayElement.querySelector(\n\t\t\t\t'[data-segment=\"year\"]',\n\t\t\t);\n\n\t\t\tif (daySegment) daySegment.textContent = day < 10 ? `0${day}` : `${day}`;\n\t\t\tif (monthSegment)\n\t\t\t\tmonthSegment.textContent = month < 10 ? `0${month}` : `${month}`;\n\t\t\tif (yearSegment) yearSegment.textContent = `${year}`;\n\t\t} else {\n\t\t\t// Simple display\n\t\t\tthis._displayElement.textContent = formatDate(\n\t\t\t\tdate,\n\t\t\t\tthis._config.format,\n\t\t\t\tthis._config,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Update the display element for a date range\n\t *\n\t * @param startDate - The start date of the range\n\t * @param endDate - The end date of the range\n\t */\n\tprivate _updateRangeDisplayElement(\n\t\tstartDate: Date | null,\n\t\tendDate: Date | null,\n\t): void {\n\t\tif (!this._displayElement) return;\n\n\t\tif (!startDate) {\n\t\t\t// If no date, show placeholder\n\t\t\tconst placeholder =\n\t\t\t\tthis._dateInputElement?.getAttribute('placeholder') ||\n\t\t\t\t'Select date range';\n\t\t\tthis._displayElement.innerHTML = placeholderTemplate(placeholder);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._useSegmentedDisplay) {\n\t\t\t// Update segmented range display\n\t\t\t// Start date segments\n\t\t\tconst startDay = this._displayElement.querySelector(\n\t\t\t\t'[data-segment=\"start-day\"]',\n\t\t\t);\n\t\t\tconst startMonth = this._displayElement.querySelector(\n\t\t\t\t'[data-segment=\"start-month\"]',\n\t\t\t);\n\t\t\tconst startYear = this._displayElement.querySelector(\n\t\t\t\t'[data-segment=\"start-year\"]',\n\t\t\t);\n\n\t\t\tif (startDay)\n\t\t\t\tstartDay.textContent =\n\t\t\t\t\tstartDate.getDate() < 10\n\t\t\t\t\t\t? `0${startDate.getDate()}`\n\t\t\t\t\t\t: `${startDate.getDate()}`;\n\t\t\tif (startMonth)\n\t\t\t\tstartMonth.textContent =\n\t\t\t\t\tstartDate.getMonth() + 1 < 10\n\t\t\t\t\t\t? `0${startDate.getMonth() + 1}`\n\t\t\t\t\t\t: `${startDate.getMonth() + 1}`;\n\t\t\tif (startYear) startYear.textContent = `${startDate.getFullYear()}`;\n\n\t\t\t// End date segments\n\t\t\tif (endDate) {\n\t\t\t\tconst endDay = this._displayElement.querySelector(\n\t\t\t\t\t'[data-segment=\"end-day\"]',\n\t\t\t\t);\n\t\t\t\tconst endMonth = this._displayElement.querySelector(\n\t\t\t\t\t'[data-segment=\"end-month\"]',\n\t\t\t\t);\n\t\t\t\tconst endYear = this._displayElement.querySelector(\n\t\t\t\t\t'[data-segment=\"end-year\"]',\n\t\t\t\t);\n\n\t\t\t\tif (endDay)\n\t\t\t\t\tendDay.textContent =\n\t\t\t\t\t\tendDate.getDate() < 10\n\t\t\t\t\t\t\t? `0${endDate.getDate()}`\n\t\t\t\t\t\t\t: `${endDate.getDate()}`;\n\t\t\t\tif (endMonth)\n\t\t\t\t\tendMonth.textContent =\n\t\t\t\t\t\tendDate.getMonth() + 1 < 10\n\t\t\t\t\t\t\t? `0${endDate.getMonth() + 1}`\n\t\t\t\t\t\t\t: `${endDate.getMonth() + 1}`;\n\t\t\t\tif (endYear) endYear.textContent = `${endDate.getFullYear()}`;\n\t\t\t}\n\t\t} else {\n\t\t\t// Simple display\n\t\t\tlet displayText = formatDate(\n\t\t\t\tstartDate,\n\t\t\t\tthis._config.format,\n\t\t\t\tthis._config,\n\t\t\t);\n\n\t\t\tif (endDate) {\n\t\t\t\tconst endFormatted = formatDate(\n\t\t\t\t\tendDate,\n\t\t\t\t\tthis._config.format,\n\t\t\t\t\tthis._config,\n\t\t\t\t);\n\t\t\t\tdisplayText += `${this._config.rangeSeparator}${endFormatted}`;\n\t\t\t}\n\n\t\t\tthis._displayElement.textContent = displayText;\n\t\t}\n\t}\n\n\t/**\n\t * Handle input change events\n\t *\n\t * @param e - Input change event\n\t */\n\tprivate _handleInputChange(e: Event): void {\n\t\tconst input = e.target as HTMLInputElement;\n\t\tconst inputValue = input.value.trim();\n\n\t\tif (!inputValue) {\n\t\t\t// Clear selection if input is empty\n\t\t\tthis._state.setSelectedDate(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._config.range) {\n\t\t\t// Handle range input\n\t\t\tconst rangeParts = inputValue.split(this._config.rangeSeparator);\n\n\t\t\tif (rangeParts.length === 2) {\n\t\t\t\tconst startDate = parseDate(\n\t\t\t\t\trangeParts[0].trim(),\n\t\t\t\t\tthis._config.format,\n\t\t\t\t\tthis._config,\n\t\t\t\t);\n\t\t\t\tconst endDate = parseDate(\n\t\t\t\t\trangeParts[1].trim(),\n\t\t\t\t\tthis._config.format,\n\t\t\t\t\tthis._config,\n\t\t\t\t);\n\n\t\t\t\t// Validate dates are within min/max constraints\n\t\t\t\tif (startDate && isDateDisabled(startDate, this._config)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'Start date from input is outside allowed range:',\n\t\t\t\t\t\tstartDate.toISOString(),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (endDate && isDateDisabled(endDate, this._config)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'End date from input is outside allowed range:',\n\t\t\t\t\t\tendDate.toISOString(),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (startDate && endDate) {\n\t\t\t\t\tthis.setDateRange(startDate, endDate);\n\t\t\t\t}\n\t\t\t} else if (rangeParts.length === 1) {\n\t\t\t\tconst singleDate = parseDate(\n\t\t\t\t\trangeParts[0].trim(),\n\t\t\t\t\tthis._config.format,\n\t\t\t\t\tthis._config,\n\t\t\t\t);\n\n\t\t\t\t// Validate date is within min/max constraints\n\t\t\t\tif (singleDate && isDateDisabled(singleDate, this._config)) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'Date from input is outside allowed range:',\n\t\t\t\t\t\tsingleDate.toISOString(),\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (singleDate) {\n\t\t\t\t\tthis.setDateRange(singleDate, null);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Handle single date input\n\t\t\tconst parsedDate = parseDate(\n\t\t\t\tinputValue,\n\t\t\t\tthis._config.format,\n\t\t\t\tthis._config,\n\t\t\t);\n\n\t\t\t// Validate date is within min/max constraints\n\t\t\tif (parsedDate && isDateDisabled(parsedDate, this._config)) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t'Date from input is outside allowed range:',\n\t\t\t\t\tparsedDate.toISOString(),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (parsedDate) {\n\t\t\t\tthis.setDate(parsedDate);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Initialize with default values from input\n\t */\n\tprivate _initializeDefaultValues(): void {\n\t\t// Set min and max dates from attributes if they exist\n\t\tconst minDateAttr = this._element.getAttribute(\n\t\t\t'data-kt-datepicker-min-date',\n\t\t);\n\t\tconst maxDateAttr = this._element.getAttribute(\n\t\t\t'data-kt-datepicker-max-date',\n\t\t);\n\n\t\tif (minDateAttr) {\n\t\t\tconst minDate = parseDate(minDateAttr, this._config.format, this._config);\n\t\t\tif (minDate) {\n\t\t\t\tthis.setMinDate(minDate);\n\t\t\t}\n\t\t}\n\n\t\tif (maxDateAttr) {\n\t\t\tconst maxDate = parseDate(maxDateAttr, this._config.format, this._config);\n\t\t\tif (maxDate) {\n\t\t\t\tthis.setMaxDate(maxDate);\n\t\t\t}\n\t\t}\n\n\t\t// Check for default value in main input\n\t\tif (this._dateInputElement && this._dateInputElement.value) {\n\t\t\tthis._handleInputChange({\n\t\t\t\ttarget: this._dateInputElement,\n\t\t\t} as unknown as Event);\n\t\t}\n\t\t// Check for default values in range inputs\n\t\telse if (\n\t\t\tthis._config.range &&\n\t\t\tthis._startDateInputElement &&\n\t\t\tthis._startDateInputElement.value\n\t\t) {\n\t\t\tconst startDate = parseDate(\n\t\t\t\tthis._startDateInputElement.value,\n\t\t\t\tthis._config.format,\n\t\t\t\tthis._config,\n\t\t\t);\n\t\t\tlet endDate = null;\n\n\t\t\tif (this._endDateInputElement && this._endDateInputElement.value) {\n\t\t\t\tendDate = parseDate(\n\t\t\t\t\tthis._endDateInputElement.value,\n\t\t\t\t\tthis._config.format,\n\t\t\t\t\tthis._config,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (startDate) {\n\t\t\t\tthis.setDateRange(startDate, endDate);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * Public API\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Get the currently selected date\n\t *\n\t * @returns Selected date, null if no selection, or date range object\n\t */\n\tpublic getDate(): Date | null | DateRangeInterface {\n\t\tconst state = this._state.getState();\n\t\tconst config = this._state.getConfig();\n\n\t\tif (config.range) {\n\t\t\treturn state.selectedDateRange || { startDate: null, endDate: null };\n\t\t} else {\n\t\t\treturn state.selectedDate;\n\t\t}\n\t}\n\n\t/**\n\t * Set the selected date\n\t *\n\t * @param date - Date to select or null to clear selection\n\t */\n\tpublic setDate(date: Date | null): void {\n\t\t// Skip if the date is disabled (outside min/max range)\n\t\tif (date && isDateDisabled(date, this._config)) {\n\t\t\tconsole.log(\n\t\t\t\t'Date is disabled in setDate, ignoring selection:',\n\t\t\t\tdate.toISOString(),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._state.setSelectedDate(date);\n\n\t\tif (date) {\n\t\t\tthis._state.setCurrentDate(date);\n\t\t}\n\n\t\t// Update the display\n\t\tthis._updateDisplayElement(date);\n\n\t\t// Update hidden input\n\t\tif (this._dateInputElement && date) {\n\t\t\tthis._dateInputElement.value = formatDate(\n\t\t\t\tdate,\n\t\t\t\tthis._config.format,\n\t\t\t\tthis._config,\n\t\t\t);\n\t\t\tthis._dateInputElement.dispatchEvent(\n\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t);\n\t\t} else if (this._dateInputElement) {\n\t\t\tthis._dateInputElement.value = '';\n\t\t\tthis._dateInputElement.dispatchEvent(\n\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get the currently selected date range\n\t *\n\t * @returns Selected date range or null if no selection\n\t */\n\tpublic getDateRange(): DateRangeInterface | null {\n\t\tconst state = this._state.getState();\n\t\treturn state.selectedDateRange;\n\t}\n\n\t/**\n\t * Set the selected date range\n\t *\n\t * @param start - Start date of the range\n\t * @param end - End date of the range\n\t */\n\tpublic setDateRange(start: Date | null, end: Date | null): void {\n\t\tconst state = this._state.getState();\n\n\t\t// Ensure we're in range mode\n\t\tif (!this._config.range) {\n\t\t\tconsole.warn('Cannot set date range when range mode is disabled');\n\t\t\treturn;\n\t\t}\n\n\t\t// Validate start and end dates are within min/max range\n\t\tif (start && isDateDisabled(start, this._config)) {\n\t\t\tconsole.log(\n\t\t\t\t'Start date is disabled in setDateRange, ignoring selection:',\n\t\t\t\tstart.toISOString(),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (end && isDateDisabled(end, this._config)) {\n\t\t\tconsole.log(\n\t\t\t\t'End date is disabled in setDateRange, ignoring selection:',\n\t\t\t\tend.toISOString(),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Reset range selection state\n\t\tthis._state.getState().isRangeSelectionStart = true;\n\n\t\t// Set start date\n\t\tif (start) {\n\t\t\tif (!state.selectedDateRange) {\n\t\t\t\tstate.selectedDateRange = { startDate: null, endDate: null };\n\t\t\t}\n\n\t\t\tstate.selectedDateRange.startDate = start;\n\t\t\tthis._state.setCurrentDate(start);\n\n\t\t\t// Set end date if provided\n\t\t\tif (end) {\n\t\t\t\tstate.selectedDateRange.endDate = end;\n\t\t\t} else {\n\t\t\t\tstate.selectedDateRange.endDate = null;\n\t\t\t}\n\n\t\t\t// Update display element\n\t\t\tthis._updateRangeDisplayElement(start, end);\n\n\t\t\t// Update hidden inputs\n\t\t\tif (this._dateInputElement) {\n\t\t\t\tlet inputValue = formatDate(start, this._config.format, this._config);\n\t\t\t\tif (end) {\n\t\t\t\t\tinputValue += `${this._config.rangeSeparator}${formatDate(\n\t\t\t\t\t\tend,\n\t\t\t\t\t\tthis._config.format,\n\t\t\t\t\t\tthis._config,\n\t\t\t\t\t)}`;\n\t\t\t\t}\n\t\t\t\tthis._dateInputElement.value = inputValue;\n\t\t\t\tthis._dateInputElement.dispatchEvent(\n\t\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (this._startDateInputElement) {\n\t\t\t\tthis._startDateInputElement.value = formatDate(\n\t\t\t\t\tstart,\n\t\t\t\t\tthis._config.format,\n\t\t\t\t\tthis._config,\n\t\t\t\t);\n\t\t\t\tthis._startDateInputElement.dispatchEvent(\n\t\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (this._endDateInputElement && end) {\n\t\t\t\tthis._endDateInputElement.value = formatDate(\n\t\t\t\t\tend,\n\t\t\t\t\tthis._config.format,\n\t\t\t\t\tthis._config,\n\t\t\t\t);\n\t\t\t\tthis._endDateInputElement.dispatchEvent(\n\t\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t\t);\n\t\t\t} else if (this._endDateInputElement) {\n\t\t\t\tthis._endDateInputElement.value = '';\n\t\t\t}\n\n\t\t\t// Dispatch change event\n\t\t\tthis._eventManager.dispatchEvent(KTDatepickerEventName.DATE_CHANGE, {\n\t\t\t\tselectedDateRange: state.selectedDateRange,\n\t\t\t});\n\t\t} else {\n\t\t\t// Clear selection\n\t\t\tthis._state.getState().selectedDateRange = null;\n\n\t\t\t// Clear display\n\t\t\tif (this._displayElement) {\n\t\t\t\tconst placeholder =\n\t\t\t\t\tthis._dateInputElement?.getAttribute('placeholder') ||\n\t\t\t\t\t'Select date range';\n\t\t\t\tthis._displayElement.innerHTML = placeholderTemplate(placeholder);\n\t\t\t}\n\n\t\t\t// Clear inputs\n\t\t\tif (this._dateInputElement) {\n\t\t\t\tthis._dateInputElement.value = '';\n\t\t\t\tthis._dateInputElement.dispatchEvent(\n\t\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (this._startDateInputElement) {\n\t\t\t\tthis._startDateInputElement.value = '';\n\t\t\t\tthis._startDateInputElement.dispatchEvent(\n\t\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (this._endDateInputElement) {\n\t\t\t\tthis._endDateInputElement.value = '';\n\t\t\t\tthis._endDateInputElement.dispatchEvent(\n\t\t\t\t\tnew Event('change', { bubbles: true }),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis._eventManager.dispatchEvent(KTDatepickerEventName.DATE_CHANGE, {\n\t\t\t\tselectedDateRange: null,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set the minimum selectable date\n\t *\n\t * @param minDate - Minimum date or null to remove constraint\n\t */\n\tpublic setMinDate(minDate: Date | null): void {\n\t\tthis._config.minDate = minDate;\n\n\t\t// Refresh calendar view to apply new constraints\n\t\tthis._eventManager.dispatchEvent(KTDatepickerEventName.UPDATE);\n\t}\n\n\t/**\n\t * Set the maximum selectable date\n\t *\n\t * @param maxDate - Maximum date or null to remove constraint\n\t */\n\tpublic setMaxDate(maxDate: Date | null): void {\n\t\tthis._config.maxDate = maxDate;\n\n\t\t// Refresh calendar view to apply new constraints\n\t\tthis._eventManager.dispatchEvent(KTDatepickerEventName.UPDATE);\n\t}\n\n\t/**\n\t * Update the datepicker (refresh view)\n\t */\n\tpublic update(): void {\n\t\t// Trigger calendar update through events\n\t\tthis._eventManager.dispatchEvent(KTDatepickerEventName.UPDATE);\n\t}\n\n\t/**\n\t * Destroy the datepicker instance and clean up\n\t */\n\tpublic destroy(): void {\n\t\t// Remove event listeners\n\t\tthis._eventManager.removeEventListener(\n\t\t\tKTDatepickerEventName.DATE_CHANGE,\n\t\t\tthis._handleDateChange.bind(this),\n\t\t);\n\n\t\tif (this._dateInputElement) {\n\t\t\tthis._dateInputElement.removeEventListener(\n\t\t\t\t'change',\n\t\t\t\tthis._handleInputChange.bind(this),\n\t\t\t);\n\t\t}\n\n\t\tif (this._displayElement) {\n\t\t\tthis._displayElement.remove();\n\t\t}\n\n\t\t// Remove instance from element\n\t\tthis._element.removeAttribute('data-kt-datepicker-initialized');\n\t\tdelete (this._element as any).instance;\n\n\t\t// Remove initialized class\n\t\tthis._element.classList.remove('relative');\n\n\t\t// Remove from instances map\n\t\tKTDatepicker._instances.delete(this._element);\n\t}\n\n\t/**\n\t * Dispatch a custom event\n\t *\n\t * @param eventName - Name of the event\n\t * @param payload - Optional event payload\n\t */\n\tprotected _dispatchEvent(eventName: string, payload?: any): void {\n\t\tthis._eventManager.dispatchEvent(eventName, payload);\n\t}\n\n\t/**\n\t * ========================================================================\n\t * Static instances\n\t * ========================================================================\n\t */\n\n\tprivate static readonly _instances = new Map<HTMLElement, KTDatepicker>();\n\n\t/**\n\t * Create instances for all datepicker elements on the page\n\t */\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll<HTMLElement>(\n\t\t\t'[data-kt-datepicker]',\n\t\t);\n\n\t\telements.forEach((element) => {\n\t\t\tif (\n\t\t\t\telement.hasAttribute('data-kt-datepicker') &&\n\t\t\t\t!element.getAttribute('data-kt-datepicker-initialized')\n\t\t\t) {\n\t\t\t\t// Create instance\n\t\t\t\tconst instance = new KTDatepicker(element);\n\t\t\t\tthis._instances.set(element, instance);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Initialize all datepickers on the page\n\t */\n\tpublic static init(): void {\n\t\tKTDatepicker.createInstances();\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport {\n\tInstance as PopperInstance,\n\tcreatePopper,\n\tPlacement,\n} from '@popperjs/core';\nimport KTDom from '../../helpers/dom';\nimport KTData from '../../helpers/data';\nimport KTComponent from '../component';\nimport { KTDatepickerConfigInterface } from './types';\nimport { KTDatepickerStateManager } from './config';\nimport { KTDatepickerEvents } from './types';\n\n/**\n * Class to manage focus within the dropdown\n */\nclass FocusManager {\n\tprivate _element: HTMLElement;\n\tprivate _focusableSelector: string =\n\t\t'button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n\tconstructor(element: HTMLElement) {\n\t\tthis._element = element;\n\t}\n\n\t/**\n\t * Get all visible focusable options\n\t */\n\tpublic getVisibleOptions(): HTMLElement[] {\n\t\treturn Array.from(\n\t\t\tthis._element.querySelectorAll(this._focusableSelector),\n\t\t).filter((el) => {\n\t\t\tconst element = el as HTMLElement;\n\t\t\treturn element.offsetParent !== null; // Only visible elements\n\t\t}) as HTMLElement[];\n\t}\n\n\t/**\n\t * Apply focus to an element\n\t */\n\tpublic applyFocus(element: HTMLElement): void {\n\t\tif (element && typeof element.focus === 'function') {\n\t\t\telement.focus();\n\t\t}\n\t}\n\n\t/**\n\t * Focus next element\n\t */\n\tpublic focusNext(): void {\n\t\tconst options = this.getVisibleOptions();\n\t\tconst currentFocused = document.activeElement;\n\n\t\tlet nextIndex = 0;\n\t\tif (currentFocused) {\n\t\t\tconst currentIndex = options.indexOf(currentFocused as HTMLElement);\n\t\t\tnextIndex = currentIndex >= 0 ? (currentIndex + 1) % options.length : 0;\n\t\t}\n\n\t\tif (options.length > 0) {\n\t\t\tthis.applyFocus(options[nextIndex]);\n\t\t}\n\t}\n\n\t/**\n\t * Focus previous element\n\t */\n\tpublic focusPrevious(): void {\n\t\tconst options = this.getVisibleOptions();\n\t\tconst currentFocused = document.activeElement;\n\n\t\tlet prevIndex = options.length - 1;\n\t\tif (currentFocused) {\n\t\t\tconst currentIndex = options.indexOf(currentFocused as HTMLElement);\n\t\t\tprevIndex =\n\t\t\t\tcurrentIndex >= 0\n\t\t\t\t\t? (currentIndex - 1 + options.length) % options.length\n\t\t\t\t\t: prevIndex;\n\t\t}\n\n\t\tif (options.length > 0) {\n\t\t\tthis.applyFocus(options[prevIndex]);\n\t\t}\n\t}\n\n\t/**\n\t * Scroll element into view\n\t */\n\tpublic scrollIntoView(element: HTMLElement): void {\n\t\tif (element && typeof element.scrollIntoView === 'function') {\n\t\t\telement.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n\t\t}\n\t}\n\n\t/**\n\t * Clean up resources\n\t */\n\tpublic dispose(): void {\n\t\t// Nothing to clean up yet\n\t}\n}\n\n/**\n * Class to manage event listeners\n */\nclass EventManager {\n\tprivate _listeners: Map<HTMLElement, Map<string, Function[]>> = new Map();\n\n\t/**\n\t * Add event listener and track it\n\t */\n\tpublic addListener(\n\t\telement: HTMLElement,\n\t\teventType: string,\n\t\thandler: Function,\n\t): void {\n\t\tif (!this._listeners.has(element)) {\n\t\t\tthis._listeners.set(element, new Map());\n\t\t}\n\n\t\tconst elementListeners = this._listeners.get(element)!;\n\t\tif (!elementListeners.has(eventType)) {\n\t\t\telementListeners.set(eventType, []);\n\t\t}\n\n\t\tconst handlers = elementListeners.get(eventType)!;\n\t\telement.addEventListener(eventType, handler as EventListener);\n\t\thandlers.push(handler);\n\t}\n\n\t/**\n\t * Remove all listeners for an element\n\t */\n\tpublic removeAllListeners(element: HTMLElement): void {\n\t\tif (this._listeners.has(element)) {\n\t\t\tconst elementListeners = this._listeners.get(element)!;\n\n\t\t\telementListeners.forEach((handlers, eventType) => {\n\t\t\t\thandlers.forEach((handler) => {\n\t\t\t\t\telement.removeEventListener(eventType, handler as EventListener);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tthis._listeners.delete(element);\n\t\t}\n\t}\n}\n\n/**\n * Focus trap class to manage keyboard focus within the dropdown\n */\nclass FocusTrap {\n\tprivate _element: HTMLElement;\n\tprivate _focusableElements: HTMLElement[] = [];\n\tprivate _firstFocusableElement: HTMLElement | null = null;\n\tprivate _lastFocusableElement: HTMLElement | null = null;\n\n\t/**\n\t * Constructor\n\t *\n\t * @param element - Element to trap focus within\n\t */\n\tconstructor(element: HTMLElement) {\n\t\tthis._element = element;\n\t\tthis._update();\n\t}\n\n\t/**\n\t * Update the focusable elements\n\t */\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\t/**\n\t * Update the list of focusable elements\n\t */\n\tprivate _update(): void {\n\t\t// Get all focusable elements\n\t\tconst focusableElements = this._element.querySelectorAll(\n\t\t\t'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n\t\t);\n\n\t\t// Convert to array and filter out disabled elements\n\t\tthis._focusableElements = Array.from(focusableElements).filter(\n\t\t\t(el) => !el.hasAttribute('disabled'),\n\t\t) as HTMLElement[];\n\n\t\t// Get first and last focusable elements\n\t\tthis._firstFocusableElement = this._focusableElements[0] || null;\n\t\tthis._lastFocusableElement =\n\t\t\tthis._focusableElements[this._focusableElements.length - 1] || null;\n\t}\n\n\t/**\n\t * Handle tab key press to trap focus\n\t *\n\t * @param event - Keyboard event\n\t */\n\tpublic handleTab(event: KeyboardEvent): void {\n\t\t// If no focusable elements, do nothing\n\t\tif (!this._firstFocusableElement || !this._lastFocusableElement) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tconst isTabPressed = event.key === 'Tab' || event.keyCode === 9;\n\n\t\tif (!isTabPressed) return;\n\n\t\t// Handle Shift+Tab to focus last element when on first\n\t\tif (event.shiftKey) {\n\t\t\tif (document.activeElement === this._firstFocusableElement) {\n\t\t\t\tthis._lastFocusableElement.focus();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} else {\n\t\t\t// Handle Tab to focus first element when on last\n\t\t\tif (document.activeElement === this._lastFocusableElement) {\n\t\t\t\tthis._firstFocusableElement.focus();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Focus the first interactive element\n\t */\n\tpublic focusFirstElement(): void {\n\t\tif (this._firstFocusableElement) {\n\t\t\tthis._firstFocusableElement.focus();\n\t\t}\n\t}\n}\n\n/**\n * KTDatepickerDropdown\n *\n * A specialized dropdown implementation for the KTDatepicker component.\n * This module handles the dropdown functionality for the datepicker component,\n * including positioning, showing/hiding, and keyboard navigation.\n */\nexport class KTDatepickerDropdown extends KTComponent {\n\tprotected override readonly _name: string = 'datepicker-dropdown';\n\tprotected override readonly _config: KTDatepickerConfigInterface;\n\n\t// DOM Elements\n\tprotected _element: HTMLElement;\n\tprivate _toggleElement: HTMLElement;\n\tprivate _dropdownElement: HTMLElement;\n\n\t// State\n\tprivate _isOpen: boolean = false;\n\tprivate _isTransitioning: boolean = false;\n\tprivate _popperInstance: PopperInstance | null = null;\n\tprivate _eventManager: EventManager;\n\tprivate _focusManager: FocusManager;\n\tprivate _focusTrap: FocusTrap | null = null;\n\tprivate _activeElement: Element | null = null;\n\n\t/**\n\t * Constructor\n\t * @param element The parent element (datepicker wrapper)\n\t * @param toggleElement The element that triggers the dropdown\n\t * @param dropdownElement The dropdown content element\n\t * @param config The configuration options\n\t */\n\tconstructor(\n\t\telement: HTMLElement,\n\t\ttoggleElement: HTMLElement,\n\t\tdropdownElement: HTMLElement,\n\t\tconfig: KTDatepickerConfigInterface,\n\t) {\n\t\tsuper();\n\n\t\tthis._element = element;\n\t\tthis._toggleElement = toggleElement;\n\t\tthis._dropdownElement = dropdownElement;\n\t\tthis._config = config;\n\t\tthis._eventManager = new EventManager();\n\t\tthis._focusManager = new FocusManager(dropdownElement);\n\n\t\tthis._setupEventListeners();\n\t}\n\n\t/**\n\t * Set up event listeners for the dropdown\n\t */\n\tprivate _setupEventListeners(): void {\n\t\t// Toggle click\n\t\tthis._eventManager.addListener(\n\t\t\tthis._toggleElement,\n\t\t\t'click',\n\t\t\tthis._handleToggleClick.bind(this),\n\t\t);\n\n\t\t// Keyboard navigation\n\t\tthis._eventManager.addListener(\n\t\t\tthis._element,\n\t\t\t'keydown',\n\t\t\tthis._handleKeyDown.bind(this),\n\t\t);\n\n\t\t// Close on outside click\n\t\tthis._eventManager.addListener(\n\t\t\tdocument as unknown as HTMLElement,\n\t\t\t'click',\n\t\t\tthis._handleOutsideClick.bind(this),\n\t\t);\n\t}\n\n\t/**\n\t * Handle toggle element click\n\t */\n\tprivate _handleToggleClick(event: Event): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tthis.toggle();\n\t}\n\n\t/**\n\t * Handle keyboard events\n\t */\n\tprivate _handleKeyDown(event: KeyboardEvent): void {\n\t\tif (!this._isOpen) return;\n\n\t\tswitch (event.key) {\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.close();\n\t\t\t\tthis._toggleElement.focus();\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._focusManager.focusNext();\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._focusManager.focusPrevious();\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// Focus first visible option\n\t\t\t\tconst firstOption = this._focusManager.getVisibleOptions()[0];\n\t\t\t\tif (firstOption) {\n\t\t\t\t\tthis._focusManager.applyFocus(firstOption);\n\t\t\t\t\tthis._focusManager.scrollIntoView(firstOption);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// Focus last visible option\n\t\t\t\tconst visibleOptions = this._focusManager.getVisibleOptions();\n\t\t\t\tconst lastOption = visibleOptions[visibleOptions.length - 1];\n\t\t\t\tif (lastOption) {\n\t\t\t\t\tthis._focusManager.applyFocus(lastOption);\n\t\t\t\t\tthis._focusManager.scrollIntoView(lastOption);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Handle clicks outside the dropdown\n\t */\n\tprivate _handleOutsideClick(event: MouseEvent): void {\n\t\tif (!this._isOpen) return;\n\n\t\tconst target = event.target as HTMLElement;\n\n\t\tif (\n\t\t\t!this._element.contains(target) &&\n\t\t\t!this._dropdownElement.contains(target)\n\t\t) {\n\t\t\t// Before closing, check if a range selection is in progress\n\t\t\tconst datepickerElement = this._element.closest('[data-kt-datepicker]');\n\t\t\tif (datepickerElement) {\n\t\t\t\t// Get the state manager through the calendar instance or directly\n\t\t\t\tconst stateManager = (datepickerElement as any).instance?._state;\n\n\t\t\t\tif (stateManager) {\n\t\t\t\t\tconst state = stateManager.getState();\n\t\t\t\t\tconst config = stateManager.getConfig();\n\n\t\t\t\t\t// If we're in range mode and range selection is in progress, don't close\n\t\t\t\t\tif (config.range && state.isRangeSelectionInProgress) {\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t'Outside click detected but range selection in progress - keeping dropdown open',\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t/**\n\t * Set width of dropdown based on toggle element\n\t */\n\tprivate _setDropdownWidth(): void {\n\t\tif (!this._dropdownElement || !this._toggleElement) return;\n\n\t\t// Get the datepicker configuration\n\t\tconst datepickerElement = this._element.closest('[data-kt-datepicker]');\n\t\tlet visibleMonths = 1;\n\n\t\tif (datepickerElement) {\n\t\t\t// Get visible months from config\n\t\t\tconst instance = (datepickerElement as any).instance;\n\t\t\tif (instance && instance._config) {\n\t\t\t\tvisibleMonths = instance._config.visibleMonths || 1;\n\t\t\t}\n\t\t}\n\n\t\t// Calculate appropriate width based on number of visible months\n\t\tif (visibleMonths > 1) {\n\t\t\t// For multiple months, calculate a fixed width per month plus padding and gaps\n\t\t\tconst monthWidth = 280; // Fixed width for each month\n\t\t\tconst padding = 24; // Left/right padding (p-3 = 0.75rem × 2 × 16px = 24px)\n\t\t\tconst spacing = 16 * (visibleMonths - 1); // Gap between months (gap-4 = 1rem × 16px)\n\n\t\t\t// Limit to showing max 3 months at once for UX (user can scroll to see more)\n\t\t\tconst visibleWidth = Math.min(visibleMonths, 3);\n\n\t\t\tconst totalWidth = monthWidth * visibleWidth + spacing + padding;\n\n\t\t\t// Set fixed width for the dropdown\n\t\t\tthis._dropdownElement.style.width = `${totalWidth}px`;\n\t\t\tthis._dropdownElement.style.minWidth = `${totalWidth}px`;\n\t\t} else {\n\t\t\t// For single month, use a fixed width that works well for most calendars\n\t\t\tthis._dropdownElement.style.width = '332px'; // 280px calendar width + 24px padding + border\n\t\t\tthis._dropdownElement.style.minWidth = '332px';\n\t\t}\n\t}\n\n\t/**\n\t * Initialize the Popper instance for dropdown positioning\n\t */\n\tprivate _initPopper(): void {\n\t\t// Destroy existing popper instance if it exists\n\t\tthis._destroyPopper();\n\n\t\t// Default offset\n\t\tconst offsetValue = '0, 5';\n\n\t\t// Get configuration options\n\t\tconst placement = 'bottom-start';\n\t\tconst strategy = 'absolute';\n\t\tconst preventOverflow = true;\n\t\tconst flip = true;\n\n\t\t// Create new popper instance\n\t\tthis._popperInstance = createPopper(\n\t\t\tthis._toggleElement,\n\t\t\tthis._dropdownElement,\n\t\t\t{\n\t\t\t\tplacement: placement as Placement,\n\t\t\t\tstrategy: strategy as 'fixed' | 'absolute',\n\t\t\t\tmodifiers: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'offset',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\toffset: this._parseOffset(offsetValue),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'preventOverflow',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tboundary: 'viewport',\n\t\t\t\t\t\t\taltAxis: preventOverflow,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'flip',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tenabled: flip,\n\t\t\t\t\t\t\tfallbackPlacements: ['top-start', 'bottom-end', 'top-end'],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Parse offset string into an array of numbers\n\t */\n\tprivate _parseOffset(offset: string): number[] {\n\t\treturn offset.split(',').map((value) => parseInt(value.trim(), 10));\n\t}\n\n\t/**\n\t * Destroy the Popper instance\n\t */\n\tprivate _destroyPopper(): void {\n\t\tif (this._popperInstance) {\n\t\t\tthis._popperInstance.destroy();\n\t\t\tthis._popperInstance = null;\n\t\t}\n\t}\n\n\t/**\n\t * Update dropdown position\n\t */\n\tpublic updatePosition(): void {\n\t\t// Look for the display element rather than using the input directly\n\t\tconst displayElement = this._element.querySelector(\n\t\t\t'[data-kt-datepicker-display]',\n\t\t) as HTMLElement;\n\t\tconst triggerElement = displayElement || this._toggleElement;\n\n\t\tif (!triggerElement || !this._dropdownElement) return;\n\n\t\t// Reset position styles\n\t\tthis._dropdownElement.style.top = '';\n\t\tthis._dropdownElement.style.bottom = '';\n\t\tthis._dropdownElement.style.left = '';\n\t\tthis._dropdownElement.style.right = '';\n\n\t\t// Set width before positioning\n\t\tthis._setDropdownWidth();\n\n\t\t// Get position information\n\t\tconst triggerRect = triggerElement.getBoundingClientRect();\n\t\tconst containerRect = this._element.getBoundingClientRect();\n\t\tconst dropdownRect = this._dropdownElement.getBoundingClientRect();\n\t\tconst viewportHeight = window.innerHeight;\n\t\tconst viewportWidth = window.innerWidth;\n\n\t\t// Calculate available space below and above the trigger\n\t\tconst spaceBelow = viewportHeight - triggerRect.bottom;\n\t\tconst spaceAbove = triggerRect.top;\n\n\t\t// Calculate if dropdown would overflow horizontally\n\t\tconst overflowRight = triggerRect.left + dropdownRect.width > viewportWidth;\n\n\t\t// Position dropdown\n\t\tthis._dropdownElement.style.position = 'absolute';\n\n\t\t// Determine vertical position\n\t\tif (spaceBelow >= dropdownRect.height || spaceBelow >= spaceAbove) {\n\t\t\t// Position below the trigger\n\t\t\tthis._dropdownElement.style.top = `${triggerRect.height + 5}px`;\n\t\t} else {\n\t\t\t// Position above the trigger\n\t\t\tthis._dropdownElement.style.bottom = `${triggerRect.height + 5}px`;\n\t\t}\n\n\t\t// Determine horizontal position - handle potential overflow\n\t\tif (overflowRight) {\n\t\t\t// Align with right edge of trigger to prevent overflow\n\t\t\tconst rightOffset = Math.max(0, dropdownRect.width - triggerRect.width);\n\t\t\tthis._dropdownElement.style.right = `0px`;\n\t\t} else {\n\t\t\t// Align with left edge of trigger\n\t\t\tthis._dropdownElement.style.left = `0px`;\n\t\t}\n\t}\n\n\t/**\n\t * Toggle the dropdown\n\t */\n\tpublic toggle(): void {\n\t\tif (this._isOpen) {\n\t\t\tthis.close();\n\t\t} else {\n\t\t\tthis.open();\n\t\t}\n\t}\n\n\t/**\n\t * Open the dropdown\n\t */\n\tpublic open(): void {\n\t\tif (this._isOpen || this._isTransitioning) return;\n\n\t\t// Fire before show event\n\t\tconst beforeShowEvent = new CustomEvent('kt.datepicker.dropdown.show', {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t});\n\t\tthis._element.dispatchEvent(beforeShowEvent);\n\n\t\tif (beforeShowEvent.defaultPrevented) return;\n\n\t\t// Begin opening transition\n\t\tthis._isTransitioning = true;\n\n\t\t// Set dropdown visibility\n\t\tthis._dropdownElement.classList.remove('hidden');\n\t\tthis._dropdownElement.setAttribute('aria-hidden', 'false');\n\n\t\t// Set dropdown width\n\t\tthis._setDropdownWidth();\n\n\t\t// Make sure the element is visible for transitioning\n\t\tKTDom.reflow(this._dropdownElement);\n\n\t\t// Apply z-index\n\t\tthis._dropdownElement.style.zIndex = '1000';\n\n\t\t// Initialize popper for positioning\n\t\tthis._initPopper();\n\n\t\t// Add active classes\n\t\tthis._toggleElement.classList.add('ring', 'ring-blue-300');\n\t\tthis._toggleElement.setAttribute('aria-expanded', 'true');\n\n\t\t// Start transition\n\t\tthis._dropdownElement.classList.remove('opacity-0', 'translate-y-2');\n\t\tthis._dropdownElement.classList.add('opacity-100', 'translate-y-0');\n\n\t\t// Handle transition end\n\t\tKTDom.transitionEnd(this._dropdownElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\t// Focus the first interactive element\n\t\t\tthis._focusFirstInteractiveElement();\n\n\t\t\t// Fire after show event\n\t\t\tconst afterShowEvent = new CustomEvent('kt.datepicker.dropdown.shown', {\n\t\t\t\tbubbles: true,\n\t\t\t});\n\t\t\tthis._element.dispatchEvent(afterShowEvent);\n\t\t});\n\t}\n\n\t/**\n\t * Focus the first interactive element in the dropdown\n\t */\n\tprivate _focusFirstInteractiveElement(): void {\n\t\t// Priority of elements to focus:\n\t\t// 1. A \"Today\" button if available\n\t\t// 2. The first day in the current month\n\t\t// 3. Any other focusable element\n\n\t\t// Find the Today button using standard DOM selectors\n\t\tlet todayBtn: HTMLElement | null = null;\n\t\tconst buttons = this._dropdownElement.querySelectorAll('button');\n\t\tfor (let i = 0; i < buttons.length; i++) {\n\t\t\tif (buttons[i].textContent && buttons[i].textContent.trim() === 'Today') {\n\t\t\t\ttodayBtn = buttons[i] as HTMLElement;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (todayBtn) {\n\t\t\ttodayBtn.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentMonthDay = this._dropdownElement.querySelector(\n\t\t\t'button[data-date]:not(.text-gray-400)',\n\t\t) as HTMLElement;\n\t\tif (currentMonthDay) {\n\t\t\tcurrentMonthDay.focus();\n\t\t\treturn;\n\t\t}\n\n\t\tconst firstOption = this._focusManager.getVisibleOptions()[0];\n\t\tif (firstOption) {\n\t\t\tthis._focusManager.applyFocus(firstOption);\n\t\t}\n\t}\n\n\t/**\n\t * Close the dropdown\n\t */\n\tpublic close(): void {\n\t\tif (!this._isOpen || this._isTransitioning) return;\n\n\t\t// Fire before hide event\n\t\tconst beforeHideEvent = new CustomEvent('kt.datepicker.dropdown.hide', {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t});\n\t\tthis._element.dispatchEvent(beforeHideEvent);\n\n\t\tif (beforeHideEvent.defaultPrevented) return;\n\n\t\t// Begin closing transition\n\t\tthis._isTransitioning = true;\n\n\t\t// Start transition\n\t\tthis._dropdownElement.classList.add('opacity-0', 'translate-y-2');\n\t\tthis._dropdownElement.classList.remove('opacity-100', 'translate-y-0');\n\n\t\t// Handle transition end\n\t\tKTDom.transitionEnd(this._dropdownElement, () => {\n\t\t\t// Remove active classes\n\t\t\tthis._dropdownElement.classList.add('hidden');\n\t\t\tthis._dropdownElement.setAttribute('aria-hidden', 'true');\n\n\t\t\t// Reset styles\n\t\t\tthis._dropdownElement.style.opacity = '';\n\t\t\tthis._dropdownElement.style.transform = '';\n\t\t\tthis._dropdownElement.style.zIndex = '';\n\n\t\t\t// Destroy popper\n\t\t\tthis._destroyPopper();\n\n\t\t\t// Update state\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\n\t\t\t// Fire after hide event\n\t\t\tconst afterHideEvent = new CustomEvent('kt.datepicker.dropdown.hidden', {\n\t\t\t\tbubbles: true,\n\t\t\t});\n\t\t\tthis._element.dispatchEvent(afterHideEvent);\n\t\t});\n\t}\n\n\t/**\n\t * Check if dropdown is open\n\t */\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\t/**\n\t * Clean up component\n\t */\n\tpublic override dispose(): void {\n\t\t// Destroy popper\n\t\tthis._destroyPopper();\n\n\t\t// Remove event listeners\n\t\tthis._eventManager.removeAllListeners(this._element);\n\t\tthis._eventManager.removeAllListeners(this._toggleElement);\n\t\tthis._eventManager.removeAllListeners(document as unknown as HTMLElement);\n\n\t\t// Clean up focus manager\n\t\tif (\n\t\t\tthis._focusManager &&\n\t\t\ttypeof this._focusManager.dispose === 'function'\n\t\t) {\n\t\t\tthis._focusManager.dispose();\n\t\t}\n\n\t\t// Clean up state\n\t\tthis._isOpen = false;\n\t\tthis._isTransitioning = false;\n\n\t\t// Remove data reference\n\t\tKTData.remove(this._element, this._name);\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n/**\n * Event names used by the datepicker component\n */\nexport enum KTDatepickerEventName {\n\tDATE_CHANGE = 'date-change',\n\tSTATE_CHANGE = 'stateChange',\n\tOPEN = 'open',\n\tCLOSE = 'close',\n\tUPDATE = 'update',\n\tKEYBOARD_OPEN = 'keyboard-open',\n\tVIEW_CHANGE = 'view-change',\n\tTIME_CHANGE = 'time-change',\n}\n\n/**\n * Centralized event manager for the datepicker component\n * Handles all event dispatching and listening\n */\nexport class KTDatepickerEventManager {\n\tprivate _element: HTMLElement;\n\n\t/**\n\t * Constructor\n\t *\n\t * @param element - The root element to attach events to\n\t */\n\tconstructor(element: HTMLElement) {\n\t\tthis._element = element;\n\t}\n\n\t/**\n\t * Dispatch a custom event on the datepicker element\n\t *\n\t * @param eventName - Name of the event to dispatch\n\t * @param payload - Optional payload data\n\t */\n\tpublic dispatchEvent(\n\t\teventName: KTDatepickerEventName | string,\n\t\tpayload?: any,\n\t): void {\n\t\tconst event = new CustomEvent(eventName, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { payload },\n\t\t});\n\n\t\tthis._element.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Add an event listener to the datepicker element\n\t *\n\t * @param eventName - Name of the event to listen for\n\t * @param listener - Callback function\n\t * @param options - Event listener options\n\t */\n\tpublic addEventListener(\n\t\teventName: KTDatepickerEventName | string,\n\t\tlistener: EventListenerOrEventListenerObject,\n\t\toptions?: boolean | AddEventListenerOptions,\n\t): void {\n\t\tthis._element.addEventListener(eventName, listener, options);\n\t}\n\n\t/**\n\t * Remove an event listener from the datepicker element\n\t *\n\t * @param eventName - Name of the event to remove listener for\n\t * @param listener - Callback function to remove\n\t * @param options - Event listener options\n\t */\n\tpublic removeEventListener(\n\t\teventName: KTDatepickerEventName | string,\n\t\tlistener: EventListenerOrEventListenerObject,\n\t\toptions?: boolean | EventListenerOptions,\n\t): void {\n\t\tthis._element.removeEventListener(eventName, listener, options);\n\t}\n\n\t/**\n\t * Dispatch the date change event with the current selection\n\t *\n\t * @param payload - Object containing date selection information\n\t */\n\tpublic dispatchDateChangeEvent(payload: any): void {\n\t\tthis.dispatchEvent(KTDatepickerEventName.DATE_CHANGE, payload);\n\t}\n\n\t/**\n\t * Dispatch the open event when the datepicker opens\n\t */\n\tpublic dispatchOpenEvent(): void {\n\t\tthis.dispatchEvent(KTDatepickerEventName.OPEN);\n\t}\n\n\t/**\n\t * Dispatch the close event when the datepicker closes\n\t */\n\tpublic dispatchCloseEvent(): void {\n\t\tthis.dispatchEvent(KTDatepickerEventName.CLOSE);\n\t}\n\n\t/**\n\t * Dispatch the update event to refresh the datepicker\n\t */\n\tpublic dispatchUpdateEvent(): void {\n\t\tthis.dispatchEvent(KTDatepickerEventName.UPDATE);\n\t}\n\n\t/**\n\t * Dispatch the keyboard open event when datepicker is opened via keyboard\n\t */\n\tpublic dispatchKeyboardOpenEvent(): void {\n\t\tthis.dispatchEvent(KTDatepickerEventName.KEYBOARD_OPEN);\n\t}\n\n\t/**\n\t * Dispatch the view change event when the datepicker view changes\n\t *\n\t * @param viewMode - The new view mode (days, months, years)\n\t */\n\tpublic dispatchViewChangeEvent(viewMode: string): void {\n\t\tthis.dispatchEvent(KTDatepickerEventName.VIEW_CHANGE, { viewMode });\n\t}\n\n\t/**\n\t * Dispatch the time change event when the time selection changes\n\t *\n\t * @param timeData - Object containing time selection information\n\t */\n\tpublic dispatchTimeChangeEvent(timeData: any): void {\n\t\tthis.dispatchEvent(KTDatepickerEventName.TIME_CHANGE, timeData);\n\t}\n\n\t/**\n\t * Dispatch a change event on the given input element\n\t *\n\t * @param inputElement - The input element to dispatch change event on\n\t */\n\tpublic dispatchInputChangeEvent(inputElement: HTMLInputElement): void {\n\t\tif (inputElement) {\n\t\t\tinputElement.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t}\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { KTDatepicker } from './datepicker';\nimport * as DatepickerTypes from './types';\n\nexport { KTDatepicker, DatepickerTypes };\nexport default KTDatepicker;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { KTDatepickerStateManager } from './config';\nimport { KTDatepickerEventManager, KTDatepickerEventName } from './events';\n\n/**\n * Keyboard navigation handler for KTDatepicker\n */\nexport class KTDatepickerKeyboard {\n\tprivate _element: HTMLElement;\n\tprivate _stateManager: KTDatepickerStateManager;\n\tprivate _eventManager: KTDatepickerEventManager;\n\tprivate _focusedDay: number | null = null;\n\tprivate _isListening = false;\n\n\t/**\n\t * Constructor for the KTDatepickerKeyboard class\n\t *\n\t * @param element - The datepicker element\n\t * @param stateManager - State manager for the datepicker\n\t */\n\tconstructor(element: HTMLElement, stateManager: KTDatepickerStateManager) {\n\t\tthis._element = element;\n\t\tthis._stateManager = stateManager;\n\t\tthis._eventManager = stateManager.getEventManager();\n\n\t\t// Set up listeners\n\t\tthis._setupEventListeners();\n\t}\n\n\t/**\n\t * Set up event listeners for keyboard navigation\n\t */\n\tprivate _setupEventListeners(): void {\n\t\t// Listen for open/close events to activate/deactivate keyboard navigation\n\t\tthis._eventManager.addEventListener(KTDatepickerEventName.OPEN, () =>\n\t\t\tthis._activateKeyboardNavigation(),\n\t\t);\n\t\tthis._eventManager.addEventListener(KTDatepickerEventName.CLOSE, () =>\n\t\t\tthis._deactivateKeyboardNavigation(),\n\t\t);\n\n\t\t// Listen for custom keyboard-open event\n\t\tthis._eventManager.addEventListener(\n\t\t\tKTDatepickerEventName.KEYBOARD_OPEN,\n\t\t\t() => {\n\t\t\t\t// Ensure we activate keyboard navigation\n\t\t\t\tthis._activateKeyboardNavigation();\n\n\t\t\t\t// Set initial focus day with a slight delay to allow the dropdown to render\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t// Initialize focused day if needed\n\t\t\t\t\tif (this._focusedDay === null) {\n\t\t\t\t\t\tconst state = this._stateManager.getState();\n\t\t\t\t\t\tif (state.selectedDate) {\n\t\t\t\t\t\t\tthis._focusedDay = state.selectedDate.getDate();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._focusedDay = new Date().getDate();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Focus the day\n\t\t\t\t\tthis._focusDay();\n\t\t\t\t}, 150);\n\t\t\t},\n\t\t);\n\n\t\t// Handle focus events\n\t\tthis._element.addEventListener('focusin', (e) => {\n\t\t\tif (this._stateManager.getState().isOpen && !this._isListening) {\n\t\t\t\tthis._activateKeyboardNavigation();\n\t\t\t}\n\t\t});\n\n\t\t// Add keydown event to the element itself to open dropdown with Enter key\n\t\tthis._element.addEventListener('keydown', (e) => {\n\t\t\tconst state = this._stateManager.getState();\n\n\t\t\t// If not open yet, handle keys that should open the dropdown\n\t\t\tif (!state.isOpen) {\n\t\t\t\tif (\n\t\t\t\t\te.key === 'Enter' ||\n\t\t\t\t\te.key === ' ' ||\n\t\t\t\t\te.key === 'ArrowDown' ||\n\t\t\t\t\te.key === 'ArrowUp'\n\t\t\t\t) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation(); // Prevent other handlers from capturing this event\n\t\t\t\t\tthis._stateManager.setOpen(true);\n\n\t\t\t\t\t// Set initial focus day if none\n\t\t\t\t\tif (this._focusedDay === null) {\n\t\t\t\t\t\tif (state.selectedDate) {\n\t\t\t\t\t\t\tthis._focusedDay = state.selectedDate.getDate();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._focusedDay = new Date().getDate();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Focus the day after dropdown opens\n\t\t\t\t\t\tsetTimeout(() => this._focusDay(), 150);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Add an additional event listener to the input field specifically\n\t\tconst inputs = this._element.querySelectorAll('input');\n\t\tinputs.forEach((input) => {\n\t\t\tinput.addEventListener('keydown', (e) => {\n\t\t\t\tconst state = this._stateManager.getState();\n\t\t\t\tif (!state.isOpen) {\n\t\t\t\t\tif (\n\t\t\t\t\t\te.key === 'Enter' ||\n\t\t\t\t\t\te.key === ' ' ||\n\t\t\t\t\t\te.key === 'ArrowDown' ||\n\t\t\t\t\t\te.key === 'ArrowUp'\n\t\t\t\t\t) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tthis._stateManager.setOpen(true);\n\n\t\t\t\t\t\t// Set initial focus day\n\t\t\t\t\t\tif (this._focusedDay === null) {\n\t\t\t\t\t\t\tif (state.selectedDate) {\n\t\t\t\t\t\t\t\tthis._focusedDay = state.selectedDate.getDate();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._focusedDay = new Date().getDate();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Focus the day after dropdown opens\n\t\t\t\t\t\t\tsetTimeout(() => this._focusDay(), 150);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// Add an even more specific listener for Enter key on the display element\n\t\tconst displayElement = this._element.querySelector(\n\t\t\t'[data-kt-datepicker-display]',\n\t\t);\n\t\tif (displayElement) {\n\t\t\tdisplayElement.addEventListener(\n\t\t\t\t'keydown',\n\t\t\t\t(e: KeyboardEvent) => {\n\t\t\t\t\tif (e.key === 'Enter') {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\tconst state = this._stateManager.getState();\n\t\t\t\t\t\tif (!state.isOpen) {\n\t\t\t\t\t\t\tthis._stateManager.setOpen(true);\n\n\t\t\t\t\t\t\t// Focus the current day with a slightly longer delay\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tif (this._focusedDay === null) {\n\t\t\t\t\t\t\t\t\tif (state.selectedDate) {\n\t\t\t\t\t\t\t\t\t\tthis._focusedDay = state.selectedDate.getDate();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tthis._focusedDay = new Date().getDate();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis._focusDay();\n\t\t\t\t\t\t\t}, 200);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t); // Use capture phase to ensure this runs first\n\t\t}\n\t}\n\n\t/**\n\t * Activate keyboard navigation\n\t */\n\tprivate _activateKeyboardNavigation(): void {\n\t\tif (this._isListening) return;\n\n\t\t// Add global keydown listener\n\t\tdocument.addEventListener('keydown', this._handleKeyDown);\n\t\tthis._isListening = true;\n\n\t\t// Set initial focus day if none\n\t\tif (this._focusedDay === null) {\n\t\t\tconst state = this._stateManager.getState();\n\t\t\tif (state.selectedDate) {\n\t\t\t\tthis._focusedDay = state.selectedDate.getDate();\n\t\t\t} else {\n\t\t\t\tthis._focusedDay = new Date().getDate();\n\t\t\t}\n\n\t\t\t// Focus the day\n\t\t\tsetTimeout(() => this._focusDay(), 100);\n\t\t}\n\t}\n\n\t/**\n\t * Deactivate keyboard navigation\n\t */\n\tprivate _deactivateKeyboardNavigation(): void {\n\t\tif (!this._isListening) return;\n\n\t\t// Remove global keydown listener\n\t\tdocument.removeEventListener('keydown', this._handleKeyDown);\n\t\tthis._isListening = false;\n\t}\n\n\t/**\n\t * Handle keydown events\n\t */\n\tprivate _handleKeyDown = (e: KeyboardEvent): void => {\n\t\tconst state = this._stateManager.getState();\n\t\tconst viewMode = state.viewMode;\n\n\t\t// ESC key closes the dropdown\n\t\tif (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tthis._stateManager.setOpen(false);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle different view modes differently\n\t\tswitch (viewMode) {\n\t\t\tcase 'days':\n\t\t\t\tthis._handleDaysViewKeyNavigation(e);\n\t\t\t\tbreak;\n\t\t\tcase 'months':\n\t\t\t\tthis._handleMonthsViewKeyNavigation(e);\n\t\t\t\tbreak;\n\t\t\tcase 'years':\n\t\t\t\tthis._handleYearsViewKeyNavigation(e);\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\t/**\n\t * Handle key navigation in days view\n\t */\n\tprivate _handleDaysViewKeyNavigation(e: KeyboardEvent): void {\n\t\tconst state = this._stateManager.getState();\n\t\tconst config = this._stateManager.getConfig();\n\t\tconst currentDate = new Date(state.currentDate);\n\t\tconst daysInMonth = new Date(\n\t\t\tcurrentDate.getFullYear(),\n\t\t\tcurrentDate.getMonth() + 1,\n\t\t\t0,\n\t\t).getDate();\n\n\t\t// Get the day of week for the first day of the month to calculate grid positions\n\t\tconst firstDayOfMonth = new Date(\n\t\t\tcurrentDate.getFullYear(),\n\t\t\tcurrentDate.getMonth(),\n\t\t\t1,\n\t\t).getDay();\n\t\t// Adjust for first day of week setting\n\t\tconst firstDayOffset =\n\t\t\t(firstDayOfMonth - config.locales[config.locale].firstDayOfWeek + 7) % 7;\n\n\t\t// Ensure we have a focused day\n\t\tif (this._focusedDay === null) {\n\t\t\tif (state.selectedDate) {\n\t\t\t\tthis._focusedDay = state.selectedDate.getDate();\n\t\t\t} else {\n\t\t\t\tthis._focusedDay = new Date().getDate();\n\t\t\t}\n\t\t}\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowLeft':\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation(); // Stop event propagation\n\t\t\t\tif (this._focusedDay === 1) {\n\t\t\t\t\t// Move to previous month\n\t\t\t\t\tconst newDate = new Date(currentDate);\n\t\t\t\t\tnewDate.setMonth(newDate.getMonth() - 1);\n\t\t\t\t\tthis._stateManager.setCurrentDate(newDate);\n\n\t\t\t\t\t// Set focus to last day of previous month\n\t\t\t\t\tconst lastDayPrevMonth = new Date(\n\t\t\t\t\t\tcurrentDate.getFullYear(),\n\t\t\t\t\t\tcurrentDate.getMonth(),\n\t\t\t\t\t\t0,\n\t\t\t\t\t).getDate();\n\t\t\t\t\tthis._focusedDay = lastDayPrevMonth;\n\t\t\t\t} else {\n\t\t\t\t\tthis._focusedDay = Math.max(1, (this._focusedDay || 1) - 1);\n\t\t\t\t}\n\t\t\t\tthis._focusDay();\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowRight':\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation(); // Stop event propagation\n\t\t\t\tif (this._focusedDay === daysInMonth) {\n\t\t\t\t\t// Move to next month\n\t\t\t\t\tconst newDate = new Date(currentDate);\n\t\t\t\t\tnewDate.setMonth(newDate.getMonth() + 1);\n\t\t\t\t\tthis._stateManager.setCurrentDate(newDate);\n\n\t\t\t\t\t// Set focus to first day of next month\n\t\t\t\t\tthis._focusedDay = 1;\n\t\t\t\t} else {\n\t\t\t\t\tthis._focusedDay = Math.min(daysInMonth, (this._focusedDay || 1) + 1);\n\t\t\t\t}\n\t\t\t\tthis._focusDay();\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowUp':\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation(); // Stop event propagation\n\t\t\t\tif (this._focusedDay && this._focusedDay <= 7) {\n\t\t\t\t\t// We're in the first row of the current month\n\t\t\t\t\t// Calculate the row position in the grid\n\t\t\t\t\tconst dayPosition = (this._focusedDay - 1 + firstDayOffset) % 7;\n\n\t\t\t\t\t// Move to previous month\n\t\t\t\t\tconst newDate = new Date(currentDate);\n\t\t\t\t\tnewDate.setMonth(newDate.getMonth() - 1);\n\t\t\t\t\tthis._stateManager.setCurrentDate(newDate);\n\n\t\t\t\t\t// Get days in previous month\n\t\t\t\t\tconst lastDayPrevMonth = new Date(\n\t\t\t\t\t\tcurrentDate.getFullYear(),\n\t\t\t\t\t\tcurrentDate.getMonth(),\n\t\t\t\t\t\t0,\n\t\t\t\t\t).getDate();\n\n\t\t\t\t\t// Calculate the corresponding day in the previous month's last row\n\t\t\t\t\t// Start with the last day of previous month\n\t\t\t\t\tthis._focusedDay = lastDayPrevMonth - (6 - dayPosition);\n\t\t\t\t} else {\n\t\t\t\t\t// Move up one week (7 days)\n\t\t\t\t\tthis._focusedDay = (this._focusedDay || 1) - 7;\n\t\t\t\t}\n\t\t\t\tthis._focusDay();\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowDown':\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation(); // Stop event propagation\n\t\t\t\tconst lastRowStart = daysInMonth - ((daysInMonth + firstDayOffset) % 7);\n\n\t\t\t\tif (this._focusedDay && this._focusedDay > lastRowStart) {\n\t\t\t\t\t// We're in the last row of the current month\n\t\t\t\t\t// Calculate position in last row (0-6)\n\t\t\t\t\tconst dayPosition = (this._focusedDay - 1 + firstDayOffset) % 7;\n\n\t\t\t\t\t// Move to next month\n\t\t\t\t\tconst newDate = new Date(currentDate);\n\t\t\t\t\tnewDate.setMonth(newDate.getMonth() + 1);\n\t\t\t\t\tthis._stateManager.setCurrentDate(newDate);\n\n\t\t\t\t\t// Calculate the corresponding day in next month's first row\n\t\t\t\t\tthis._focusedDay =\n\t\t\t\t\t\tdayPosition + 1 - ((dayPosition + firstDayOffset) % 7);\n\t\t\t\t\t// Ensure we're in bounds for next month\n\t\t\t\t\tconst nextMonthDays = new Date(\n\t\t\t\t\t\tnewDate.getFullYear(),\n\t\t\t\t\t\tnewDate.getMonth() + 1,\n\t\t\t\t\t\t0,\n\t\t\t\t\t).getDate();\n\t\t\t\t\tthis._focusedDay = Math.min(this._focusedDay, nextMonthDays);\n\t\t\t\t} else {\n\t\t\t\t\t// Move down one week (7 days)\n\t\t\t\t\tthis._focusedDay = Math.min(daysInMonth, (this._focusedDay || 1) + 7);\n\t\t\t\t}\n\t\t\t\tthis._focusDay();\n\t\t\t\tbreak;\n\n\t\t\tcase 'Home':\n\t\t\t\te.preventDefault();\n\t\t\t\t// Move to first day of the month\n\t\t\t\tthis._focusedDay = 1;\n\t\t\t\tthis._focusDay();\n\t\t\t\tbreak;\n\n\t\t\tcase 'End':\n\t\t\t\te.preventDefault();\n\t\t\t\t// Move to last day of the month\n\t\t\t\tthis._focusedDay = daysInMonth;\n\t\t\t\tthis._focusDay();\n\t\t\t\tbreak;\n\n\t\t\tcase 'PageUp':\n\t\t\t\te.preventDefault();\n\t\t\t\t// Move to previous month\n\t\t\t\tconst prevMonthDate = new Date(currentDate);\n\t\t\t\tprevMonthDate.setMonth(prevMonthDate.getMonth() - 1);\n\t\t\t\tthis._stateManager.setCurrentDate(prevMonthDate);\n\n\t\t\t\t// Adjust focused day if needed\n\t\t\t\tconst prevMonthDays = new Date(\n\t\t\t\t\tprevMonthDate.getFullYear(),\n\t\t\t\t\tprevMonthDate.getMonth() + 1,\n\t\t\t\t\t0,\n\t\t\t\t).getDate();\n\t\t\t\tif (this._focusedDay > prevMonthDays) {\n\t\t\t\t\tthis._focusedDay = prevMonthDays;\n\t\t\t\t}\n\t\t\t\tthis._focusDay();\n\t\t\t\tbreak;\n\n\t\t\tcase 'PageDown':\n\t\t\t\te.preventDefault();\n\t\t\t\t// Move to next month\n\t\t\t\tconst nextMonthDate = new Date(currentDate);\n\t\t\t\tnextMonthDate.setMonth(nextMonthDate.getMonth() + 1);\n\t\t\t\tthis._stateManager.setCurrentDate(nextMonthDate);\n\n\t\t\t\t// Adjust focused day if needed\n\t\t\t\tconst nextMonthDays = new Date(\n\t\t\t\t\tnextMonthDate.getFullYear(),\n\t\t\t\t\tnextMonthDate.getMonth() + 1,\n\t\t\t\t\t0,\n\t\t\t\t).getDate();\n\t\t\t\tif (this._focusedDay > nextMonthDays) {\n\t\t\t\t\tthis._focusedDay = nextMonthDays;\n\t\t\t\t}\n\t\t\t\tthis._focusDay();\n\t\t\t\tbreak;\n\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\te.preventDefault();\n\t\t\t\tif (this._focusedDay) {\n\t\t\t\t\t// Select the focused day\n\t\t\t\t\tconst selectedDate = new Date(currentDate);\n\t\t\t\t\tselectedDate.setDate(this._focusedDay);\n\n\t\t\t\t\tif (config.enableTime && state.selectedTime) {\n\t\t\t\t\t\tselectedDate.setHours(\n\t\t\t\t\t\t\tstate.selectedTime.hours,\n\t\t\t\t\t\t\tstate.selectedTime.minutes,\n\t\t\t\t\t\t\tstate.selectedTime.seconds,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselectedDate.setHours(0, 0, 0, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._stateManager.setSelectedDate(selectedDate);\n\n\t\t\t\t\t// Close the dropdown if not range selection or if range is complete\n\t\t\t\t\tif (\n\t\t\t\t\t\t!config.range ||\n\t\t\t\t\t\t(state.selectedDateRange &&\n\t\t\t\t\t\t\tstate.selectedDateRange.startDate &&\n\t\t\t\t\t\t\tstate.selectedDateRange.endDate)\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis._stateManager.setOpen(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Handle key navigation in months view\n\t */\n\tprivate _handleMonthsViewKeyNavigation(e: KeyboardEvent): void {\n\t\tconst state = this._stateManager.getState();\n\t\tconst currentDate = new Date(state.currentDate);\n\t\tconst currentMonth = currentDate.getMonth();\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowLeft':\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentDate.setMonth((currentMonth - 1 + 12) % 12);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowRight':\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentDate.setMonth((currentMonth + 1) % 12);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowUp':\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentDate.setMonth((currentMonth - 3 + 12) % 12);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowDown':\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentDate.setMonth((currentMonth + 3) % 12);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'Home':\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentDate.setMonth(0);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'End':\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentDate.setMonth(11);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\te.preventDefault();\n\t\t\t\tthis._stateManager.setViewMode('days');\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Handle key navigation in years view\n\t */\n\tprivate _handleYearsViewKeyNavigation(e: KeyboardEvent): void {\n\t\tconst state = this._stateManager.getState();\n\t\tconst currentDate = new Date(state.currentDate);\n\t\tconst currentYear = currentDate.getFullYear();\n\n\t\tswitch (e.key) {\n\t\t\tcase 'ArrowLeft':\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentDate.setFullYear(currentYear - 1);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowRight':\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentDate.setFullYear(currentYear + 1);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowUp':\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentDate.setFullYear(currentYear - 4);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowDown':\n\t\t\t\te.preventDefault();\n\t\t\t\tcurrentDate.setFullYear(currentYear + 4);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'Home':\n\t\t\t\te.preventDefault();\n\t\t\t\tconst yearsPerView = this._stateManager.getConfig().visibleYears;\n\t\t\t\tconst startYear = currentYear - (currentYear % yearsPerView);\n\t\t\t\tcurrentDate.setFullYear(startYear);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'End':\n\t\t\t\te.preventDefault();\n\t\t\t\tconst yearsPerPage = this._stateManager.getConfig().visibleYears;\n\t\t\t\tconst startYearEnd = currentYear - (currentYear % yearsPerPage);\n\t\t\t\tconst endYear = startYearEnd + yearsPerPage - 1;\n\t\t\t\tcurrentDate.setFullYear(endYear);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PageUp':\n\t\t\t\te.preventDefault();\n\t\t\t\tconst yearsPerPageUp = this._stateManager.getConfig().visibleYears;\n\t\t\t\tcurrentDate.setFullYear(currentYear - yearsPerPageUp);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PageDown':\n\t\t\t\te.preventDefault();\n\t\t\t\tconst yearsPerPageDown = this._stateManager.getConfig().visibleYears;\n\t\t\t\tcurrentDate.setFullYear(currentYear + yearsPerPageDown);\n\t\t\t\tthis._stateManager.setCurrentDate(currentDate);\n\t\t\t\tbreak;\n\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\te.preventDefault();\n\t\t\t\tthis._stateManager.setViewMode('months');\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Focus the currently focused day in the calendar\n\t */\n\tprivate _focusDay(): void {\n\t\tif (!this._focusedDay) return;\n\n\t\tconst state = this._stateManager.getState();\n\n\t\t// Try different selectors for the dropdown\n\t\tconst selectors = [\n\t\t\t'.absolute.bg-white.shadow-lg.rounded-lg',\n\t\t\t'.kt-datepicker-dropdown',\n\t\t\t'.calendar-container',\n\t\t];\n\n\t\tlet dropdown = null;\n\t\tfor (const selector of selectors) {\n\t\t\tdropdown = this._element.querySelector(selector);\n\t\t\tif (dropdown) break;\n\t\t}\n\n\t\tif (!dropdown) {\n\t\t\t// If no dropdown found, try getting any element with calendar buttons\n\t\t\tdropdown =\n\t\t\t\tthis._element.querySelector('.multiple-months') ||\n\t\t\t\tthis._element.querySelector('[data-kt-datepicker-container]') ||\n\t\t\t\tthis._element;\n\t\t}\n\n\t\tconst currentDay = this._focusedDay;\n\t\tconst currentMonth = state.currentDate.getMonth();\n\t\tconst currentYear = state.currentDate.getFullYear();\n\n\t\t// First try to find the day in the current month\n\t\tlet dayButton = dropdown.querySelector(\n\t\t\t`button[data-date=\"${currentDay}\"]:not(.text-gray-400)`,\n\t\t);\n\n\t\t// If not found, try to find any button with the day number\n\t\tif (!dayButton) {\n\t\t\tdayButton = dropdown.querySelector(`button[data-date=\"${currentDay}\"]`);\n\t\t}\n\n\t\t// If still not found, try to find by date-id\n\t\tif (!dayButton) {\n\t\t\tconst dateId = `${currentYear}-${String(currentMonth + 1).padStart(2, '0')}-${String(currentDay).padStart(2, '0')}`;\n\t\t\tdayButton = dropdown.querySelector(`button[data-date-id=\"${dateId}\"]`);\n\t\t}\n\n\t\t// As a last resort, find any day button\n\t\tif (!dayButton) {\n\t\t\tdayButton = dropdown.querySelector('button[data-date]');\n\t\t}\n\n\t\t// Focus the day button if found\n\t\tif (dayButton) {\n\t\t\t(dayButton as HTMLElement).focus();\n\n\t\t\t// Scroll into view if needed\n\t\t\tif (dayButton.scrollIntoView) {\n\t\t\t\tdayButton.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { LocaleConfigInterface } from './types';\n\n/**\n * Generates a locale configuration object based on the given locale and first day of the week.\n *\n * @param {string} locale - The locale code to generate the configuration for.\n * @param {number} firstDayOfWeek - The first day of the week, where 0 represents Sunday.\n * @return {LocaleConfigInterface} The generated locale configuration object.\n */\nexport const generateLocaleConfig = (\n\tlocale: string,\n\tfirstDayOfWeek: number,\n): LocaleConfigInterface => ({\n\t// Names of months (e.g., January, February, ...)\n\tmonthNames: Array.from({ length: 12 }, (_, month) =>\n\t\tnew Date(0, month).toLocaleString(locale, { month: 'long' }),\n\t),\n\t// Shortened names of months (e.g., Jan, Feb, ...)\n\tmonthNamesShort: Array.from({ length: 12 }, (_, month) =>\n\t\tnew Date(0, month).toLocaleString(locale, { month: 'short' }),\n\t),\n\t// Names of days of the week (e.g., Sunday, Monday, ...)\n\tdayNames: Array.from({ length: 7 }, (_, day) =>\n\t\tnew Date(0, 0, day + 1).toLocaleString(locale, { weekday: 'long' }),\n\t),\n\t// Shortened names of days of the week (e.g., Sun, Mon, ...)\n\tdayNamesShort: Array.from({ length: 7 }, (_, day) =>\n\t\tnew Date(0, 0, day + 1).toLocaleString(locale, { weekday: 'short' }),\n\t),\n\t// The first day of the week is the first day of the week in the selected locale\n\tfirstDayOfWeek,\n\t// Names of days of the week, abbreviated (e.g., S, M, ...)\n\tdayNamesMin: Array.from({ length: 7 }, (_, day) =>\n\t\tnew Date(0, 0, day + 1).toLocaleString(locale, { weekday: 'narrow' }),\n\t),\n});\n\nexport const DefaultLocales: { [key: string]: LocaleConfigInterface } = {\n\t// English (United States)\n\t'en-US': generateLocaleConfig('en-US', 0),\n\t// Chinese (China)\n\t'zh-CN': generateLocaleConfig('zh-CN', 0),\n\t// Spanish (Spain)\n\t'es-ES': generateLocaleConfig('es-ES', 1),\n\t// French (France)\n\t'fr-FR': generateLocaleConfig('fr-FR', 1),\n\t// Russian (Russia)\n\t'ru-RU': generateLocaleConfig('ru-RU', 1),\n\t// Japanese (Japan)\n\t'ja-JP': generateLocaleConfig('ja-JP', 0),\n\t// Korean (South Korea)\n\t'ko-KR': generateLocaleConfig('ko-KR', 0),\n\t// Indonesian (Indonesia)\n\t'id-ID': generateLocaleConfig('id-ID', 0),\n\t// Malay (Malaysia)\n\t'ms-MY': generateLocaleConfig('ms-MY', 1),\n\t// Italian (Italy)\n\t'it-IT': generateLocaleConfig('it-IT', 1),\n\t// Portuguese (Portugal)\n\t'pt-PT': generateLocaleConfig('pt-PT', 1),\n\t// German (Germany)\n\t'de-DE': generateLocaleConfig('de-DE', 1),\n\t// Chinese (Hong Kong)\n\t'zh-HK': generateLocaleConfig('zh-HK', 0),\n\t// Chinese (Taiwan)\n\t'zh-TW': generateLocaleConfig('zh-TW', 0),\n\t// Vietnamese (Vietnam)\n\t'vi-VN': generateLocaleConfig('vi-VN', 0),\n\t// Turkish (Turkey)\n\t'tr-TR': generateLocaleConfig('tr-TR', 1),\n\t// Thai (Thailand)\n\t'th-TH': generateLocaleConfig('th-TH', 0),\n\t// Arabic (Egypt)\n\t'ar-EG': generateLocaleConfig('ar-EG', 0),\n};\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { LocaleConfigInterface } from './types';\n\n/**\n * Main container template for the datepicker dropdown\n */\nexport const datepickerContainerTemplate = `\n <div class=\"bg-white rounded-lg shadow-lg border border-gray-200 overflow-hidden\">\n <div class=\"border-b border-gray-200 pb-3 mb-3\">\n <div class=\"flex items-center justify-between px-3 pt-3\">\n <button type=\"button\" class=\"p-1 rounded hover:bg-gray-100 text-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500\" aria-label=\"Previous Month\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\"></polyline>\n </svg>\n </button>\n <div class=\"flex items-center justify-center\">\n <select class=\"bg-transparent border border-gray-200 rounded px-2 py-1 mr-1 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\" aria-label=\"Select Month\"></select>\n <select class=\"bg-transparent border border-gray-200 rounded px-2 py-1 ml-1 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\" aria-label=\"Select Year\"></select>\n <span class=\"font-medium px-2 py-1 rounded hover:bg-gray-100 cursor-pointer\"></span>\n </div>\n <button type=\"button\" class=\"p-1 rounded hover:bg-gray-100 text-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500\" aria-label=\"Next Month\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\"></polyline>\n </svg>\n </button>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-4\"></div>\n <div class=\"py-3 border-t border-gray-200 mt-3 hidden\">\n <div class=\"text-sm font-medium text-gray-600 mb-2 text-center\">Time</div>\n <div class=\"flex items-center justify-center gap-2\">\n <div class=\"relative w-12\">\n <input type=\"text\" class=\"w-full py-1.5 px-1.5 text-center border border-gray-300 rounded text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\" min=\"0\" max=\"23\" aria-label=\"Hour\">\n </div>\n <span class=\"text-xl font-medium text-gray-500 leading-none\">:</span>\n <div class=\"relative w-12\">\n <input type=\"text\" class=\"w-full py-1.5 px-1.5 text-center border border-gray-300 rounded text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\" min=\"0\" max=\"59\" aria-label=\"Minute\">\n </div>\n <span class=\"text-xl font-medium text-gray-500 leading-none\">:</span>\n <div class=\"relative w-12\">\n <input type=\"text\" class=\"w-full py-1.5 px-1.5 text-center border border-gray-300 rounded text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\" min=\"0\" max=\"59\" aria-label=\"Second\">\n </div>\n <div class=\"flex flex-col gap-1\">\n <button type=\"button\" class=\"px-2 py-1 text-xs border border-gray-300 rounded-t bg-gray-50 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 text-center\" aria-label=\"AM\"></button>\n <button type=\"button\" class=\"px-2 py-1 text-xs border border-gray-300 rounded-b bg-gray-50 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 text-center\" aria-label=\"PM\"></button>\n </div>\n </div>\n </div>\n <div class=\"flex justify-between pt-3 border-t border-gray-200 mt-3 px-3 pb-3\">\n <button type=\"button\" class=\"px-3 py-1.5 text-sm border border-gray-300 rounded bg-gray-50 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500\">Today</button>\n <button type=\"button\" class=\"px-3 py-1.5 text-sm border border-gray-300 rounded bg-gray-50 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500\">Clear</button>\n <button type=\"button\" class=\"px-3 py-1.5 text-sm border border-blue-500 rounded bg-blue-500 text-white hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500\">Apply</button>\n </div>\n </div>\n`;\n\n/**\n * Input wrapper template with calendar icon\n */\nexport const inputWrapperTemplate = `\n <div class=\"relative flex items-center\">\n <div class=\"flex-grow segmented-input-container\"></div>\n <button type=\"button\" class=\"absolute right-2 p-1 text-gray-400 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-blue-500 calendar-toggle-btn\" aria-label=\"Toggle Calendar\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line>\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\n </svg>\n </button>\n </div>\n`;\n\n/**\n * Template for segmented date input\n *\n * @param format - Date format string (e.g., 'dd/MM/yyyy')\n * @returns HTML for segmented input\n */\nexport function segmentedDateInputTemplate(format: string): string {\n\t// Parse the format to determine the order of segments and separators\n\tconst formatSegments = parseFormatString(format);\n\tconst segments = [];\n\tconst separators = [];\n\n\t// Extract segments and separators\n\tfor (let i = 0; i < formatSegments.length; i++) {\n\t\tconst seg = formatSegments[i];\n\t\tif (seg.type === 'separator') {\n\t\t\tseparators.push(seg.value);\n\t\t} else {\n\t\t\tsegments.push(seg);\n\t\t}\n\t}\n\n\t// Ensure we have exactly 3 segments (day, month, year) and 2 separators\n\tif (segments.length !== 3 || separators.length !== 2) {\n\t\tconsole.warn('Invalid date format for segmented input:', format);\n\t\t// Fall back to default MM/dd/yyyy\n\t\treturn getDefaultSegmentedTemplate();\n\t}\n\n\t// Create the template based on the parsed format\n\treturn `\n <div class=\"flex items-center bg-transparent text-sm\">\n <div\n class=\"${getSegmentWidthClass(\n\t\t\t\t\tsegments[0].type,\n\t\t\t\t)} bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"${getSegmentName(segments[0].type)}\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"${getSegmentLabel(segments[0].type)}\">${\n\t\t\t\t\tsegments[0].placeholder\n\t\t\t\t}</div>\n <span class=\"text-gray-500 mx-0.5\">${separators[0]}</span>\n <div\n class=\"${getSegmentWidthClass(\n\t\t\t\t\tsegments[1].type,\n\t\t\t\t)} bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"${getSegmentName(segments[1].type)}\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"${getSegmentLabel(segments[1].type)}\">${\n\t\t\t\t\tsegments[1].placeholder\n\t\t\t\t}</div>\n <span class=\"text-gray-500 mx-0.5\">${separators[1]}</span>\n <div\n class=\"${getSegmentWidthClass(\n\t\t\t\t\tsegments[2].type,\n\t\t\t\t)} bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"${getSegmentName(segments[2].type)}\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"${getSegmentLabel(segments[2].type)}\">${\n\t\t\t\t\tsegments[2].placeholder\n\t\t\t\t}</div>\n </div>\n `;\n}\n\n/**\n * Template for segmented date range input\n *\n * @param format - Date format string (e.g., 'dd/MM/yyyy')\n * @param rangeSeparator - Separator between start and end dates\n * @returns HTML for segmented range input\n */\nexport function segmentedDateRangeInputTemplate(\n\tformat: string,\n\trangeSeparator: string = ' - ',\n): string {\n\t// Parse the format to determine the order of segments and separators\n\tconst formatSegments = parseFormatString(format);\n\tconst segments = [];\n\tconst separators = [];\n\n\t// Extract segments and separators\n\tfor (let i = 0; i < formatSegments.length; i++) {\n\t\tconst seg = formatSegments[i];\n\t\tif (seg.type === 'separator') {\n\t\t\tseparators.push(seg.value);\n\t\t} else {\n\t\t\tsegments.push(seg);\n\t\t}\n\t}\n\n\t// Ensure we have exactly 3 segments (day, month, year) and 2 separators\n\tif (segments.length !== 3 || separators.length !== 2) {\n\t\tconsole.warn('Invalid date format for segmented range input:', format);\n\t\t// Fall back to default MM/dd/yyyy\n\t\treturn getDefaultSegmentedRangeTemplate(rangeSeparator);\n\t}\n\n\t// Create the template based on the parsed format\n\treturn `\n <div class=\"flex items-center w-full\">\n <div class=\"flex items-center bg-transparent text-sm\">\n <div\n class=\"${getSegmentWidthClass(\n\t\t\t\t\t\tsegments[0].type,\n\t\t\t\t\t)} bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"start-${getSegmentName(segments[0].type)}\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Start ${getSegmentLabel(segments[0].type)}\">${\n\t\t\t\t\t\tsegments[0].placeholder\n\t\t\t\t\t}</div>\n <span class=\"text-gray-500 mx-0.5\">${separators[0]}</span>\n <div\n class=\"${getSegmentWidthClass(\n\t\t\t\t\t\tsegments[1].type,\n\t\t\t\t\t)} bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"start-${getSegmentName(segments[1].type)}\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Start ${getSegmentLabel(segments[1].type)}\">${\n\t\t\t\t\t\tsegments[1].placeholder\n\t\t\t\t\t}</div>\n <span class=\"text-gray-500 mx-0.5\">${separators[1]}</span>\n <div\n class=\"${getSegmentWidthClass(\n\t\t\t\t\t\tsegments[2].type,\n\t\t\t\t\t)} bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"start-${getSegmentName(segments[2].type)}\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Start ${getSegmentLabel(segments[2].type)}\">${\n\t\t\t\t\t\tsegments[2].placeholder\n\t\t\t\t\t}</div>\n </div>\n <span class=\"mx-1 text-gray-500\">${rangeSeparator}</span>\n <div class=\"flex items-center bg-transparent text-sm\">\n <div\n class=\"${getSegmentWidthClass(\n\t\t\t\t\t\tsegments[0].type,\n\t\t\t\t\t)} bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"end-${getSegmentName(segments[0].type)}\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"End ${getSegmentLabel(segments[0].type)}\">${\n\t\t\t\t\t\tsegments[0].placeholder\n\t\t\t\t\t}</div>\n <span class=\"text-gray-500 mx-0.5\">${separators[0]}</span>\n <div\n class=\"${getSegmentWidthClass(\n\t\t\t\t\t\tsegments[1].type,\n\t\t\t\t\t)} bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"end-${getSegmentName(segments[1].type)}\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"End ${getSegmentLabel(segments[1].type)}\">${\n\t\t\t\t\t\tsegments[1].placeholder\n\t\t\t\t\t}</div>\n <span class=\"text-gray-500 mx-0.5\">${separators[1]}</span>\n <div\n class=\"${getSegmentWidthClass(\n\t\t\t\t\t\tsegments[2].type,\n\t\t\t\t\t)} bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"end-${getSegmentName(segments[2].type)}\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"End ${getSegmentLabel(segments[2].type)}\">${\n\t\t\t\t\t\tsegments[2].placeholder\n\t\t\t\t\t}</div>\n </div>\n </div>\n `;\n}\n\n/**\n * Parse a date format string into segments and separators\n *\n * @param format - Date format string (e.g., 'dd/MM/yyyy')\n * @returns Array of parsed segments with type, placeholder and value\n */\nfunction parseFormatString(\n\tformat: string,\n): Array<{ type: string; value?: string; placeholder?: string }> {\n\tconst result: Array<{ type: string; value?: string; placeholder?: string }> =\n\t\t[];\n\tlet currentType = '';\n\tlet currentValue = '';\n\n\t// Helper to add a segment to the result\n\tconst addSegment = () => {\n\t\tif (!currentValue) return;\n\n\t\tif (/^d+$/.test(currentValue)) {\n\t\t\tresult.push({\n\t\t\t\ttype: 'day',\n\t\t\t\tvalue: currentValue,\n\t\t\t\tplaceholder: currentValue.length === 1 ? 'd' : 'dd',\n\t\t\t});\n\t\t} else if (/^M+$/.test(currentValue)) {\n\t\t\tresult.push({\n\t\t\t\ttype: 'month',\n\t\t\t\tvalue: currentValue,\n\t\t\t\tplaceholder: currentValue.length === 1 ? 'M' : 'MM',\n\t\t\t});\n\t\t} else if (/^y+$/.test(currentValue)) {\n\t\t\tresult.push({\n\t\t\t\ttype: 'year',\n\t\t\t\tvalue: currentValue,\n\t\t\t\tplaceholder: currentValue.length <= 2 ? 'yy' : 'yyyy',\n\t\t\t});\n\t\t} else {\n\t\t\t// This is a separator\n\t\t\tresult.push({\n\t\t\t\ttype: 'separator',\n\t\t\t\tvalue: currentValue,\n\t\t\t});\n\t\t}\n\n\t\tcurrentValue = '';\n\t};\n\n\t// Process each character in the format string\n\tfor (let i = 0; i < format.length; i++) {\n\t\tconst char = format[i];\n\n\t\tif (/[dMy]/.test(char)) {\n\t\t\t// Date part characters\n\t\t\tif (currentType === char) {\n\t\t\t\t// Continue the current segment\n\t\t\t\tcurrentValue += char;\n\t\t\t} else {\n\t\t\t\t// Start a new segment\n\t\t\t\taddSegment();\n\t\t\t\tcurrentType = char;\n\t\t\t\tcurrentValue = char;\n\t\t\t}\n\t\t} else {\n\t\t\t// Separator character\n\t\t\tif (currentValue) {\n\t\t\t\taddSegment();\n\t\t\t}\n\t\t\tcurrentType = '';\n\t\t\tcurrentValue = char;\n\t\t\taddSegment();\n\t\t}\n\t}\n\n\t// Add the last segment\n\taddSegment();\n\n\treturn result;\n}\n\n/**\n * Get a suitable CSS width class based on segment type\n *\n * @param type - Segment type (day, month, year)\n * @returns CSS class for width\n */\nfunction getSegmentWidthClass(type: string): string {\n\tswitch (type) {\n\t\tcase 'day':\n\t\t\treturn 'w-7';\n\t\tcase 'month':\n\t\t\treturn 'w-7';\n\t\tcase 'year':\n\t\t\treturn 'w-12';\n\t\tdefault:\n\t\t\treturn 'w-7';\n\t}\n}\n\n/**\n * Get the segment name to be used in data-segment attribute\n *\n * @param type - Segment type (day, month, year)\n * @returns Segment name\n */\nfunction getSegmentName(type: string): string {\n\treturn type;\n}\n\n/**\n * Get a human-readable label for the segment\n *\n * @param type - Segment type (day, month, year)\n * @returns Human-readable label\n */\nfunction getSegmentLabel(type: string): string {\n\treturn type.charAt(0).toUpperCase() + type.slice(1);\n}\n\n/**\n * Get the default segmented date input template (MM/dd/yyyy)\n *\n * @returns Default template HTML\n */\nfunction getDefaultSegmentedTemplate(): string {\n\treturn `\n <div class=\"flex items-center bg-transparent text-sm\">\n <div\n class=\"w-7 bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"month\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Month\">MM</div>\n <span class=\"text-gray-500 mx-0.5\">/</span>\n <div\n class=\"w-7 bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"day\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Day\">dd</div>\n <span class=\"text-gray-500 mx-0.5\">/</span>\n <div\n class=\"w-12 bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"year\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Year\">yyyy</div>\n </div>\n `;\n}\n\n/**\n * Get the default segmented date range input template (MM/dd/yyyy)\n *\n * @param rangeSeparator - Separator between start and end dates\n * @returns Default range template HTML\n */\nfunction getDefaultSegmentedRangeTemplate(\n\trangeSeparator: string = ' - ',\n): string {\n\treturn `\n <div class=\"flex items-center w-full\">\n <div class=\"flex items-center bg-transparent text-sm\">\n <div\n class=\"w-7 bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"start-month\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Start Month\">MM</div>\n <span class=\"text-gray-500 mx-0.5\">/</span>\n <div\n class=\"w-7 bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"start-day\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Start Day\">dd</div>\n <span class=\"text-gray-500 mx-0.5\">/</span>\n <div\n class=\"w-12 bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"start-year\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Start Year\">yyyy</div>\n </div>\n <span class=\"mx-1 text-gray-500\">${rangeSeparator}</span>\n <div class=\"flex items-center bg-transparent text-sm\">\n <div\n class=\"w-7 bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"end-month\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"End Month\">MM</div>\n <span class=\"text-gray-500 mx-0.5\">/</span>\n <div\n class=\"w-7 bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"end-day\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"End Day\">dd</div>\n <span class=\"text-gray-500 mx-0.5\">/</span>\n <div\n class=\"w-12 bg-transparent text-center text-gray-900 cursor-pointer segment-part hover:bg-gray-100 rounded-sm px-1 py-0.5\"\n data-segment=\"end-year\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"End Year\">yyyy</div>\n </div>\n </div>\n `;\n}\n\n/**\n * Get an array of day names based on locale and format\n *\n * @param locale - Locale configuration\n * @param format - Format for day names ('long', 'short', or 'min')\n * @returns Array of day names\n */\nfunction getDayNames(\n\tlocale: LocaleConfigInterface,\n\tformat: 'long' | 'short' | 'min',\n): string[] {\n\tif (format === 'long') {\n\t\treturn locale.dayNames;\n\t} else if (format === 'short') {\n\t\treturn locale.dayNamesShort;\n\t} else {\n\t\treturn locale.dayNamesMin;\n\t}\n}\n\n/**\n * Calendar grid template\n *\n * @param locale - Locale configuration for the datepicker\n * @param weekDayFormat - Format for the week day names ('long', 'short', or 'min')\n * @returns Calendar grid template HTML\n */\nexport function calendarGridTemplate(\n\tlocale: LocaleConfigInterface,\n\tweekDayFormat: 'long' | 'short' | 'min',\n): string {\n\t// Get the day names based on the locale and format\n\tconst dayNames = getDayNames(locale, weekDayFormat);\n\n\t// Start from the first day of the week based on locale\n\tconst firstDay = locale.firstDayOfWeek;\n\tconst orderedDayNames = [\n\t\t...dayNames.slice(firstDay),\n\t\t...dayNames.slice(0, firstDay),\n\t];\n\n\t// Create the header with day names\n\tconst headerCells = orderedDayNames\n\t\t.map(\n\t\t\t(day) =>\n\t\t\t\t`<th class=\"py-2 text-center text-xs font-medium text-gray-500 uppercase w-10\">${day}</th>`,\n\t\t)\n\t\t.join('');\n\n\treturn `\n <div class=\"calendar-month-container\">\n <table class=\"w-full border-collapse calendar-grid\" role=\"grid\" aria-labelledby=\"datepicker-month\">\n <thead>\n <tr class=\"border-b border-gray-200\">\n ${headerCells}\n </tr>\n </thead>\n <tbody class=\"border-none\"></tbody>\n </table>\n </div>\n `;\n}\n\n/**\n * Calendar day cell template\n *\n * @param day - Day number\n * @param month - Month number (0-11)\n * @param year - Year (4 digits)\n * @param isCurrentMonth - Whether the day is in the current month\n * @param isToday - Whether the day is today\n * @param isSelected - Whether the day is selected\n * @param isDisabled - Whether the day is disabled\n * @param isRangeStart - Whether the day is the start of a range\n * @param isRangeEnd - Whether the day is the end of a range\n * @param isInRange - Whether the day is within a selected range\n * @param isWeekend - Whether the day is a weekend\n * @returns Day cell HTML\n */\nexport function dayTemplate(\n\tday: number,\n\tmonth: number = 0,\n\tyear: number = 0,\n\tisCurrentMonth: boolean = true,\n\tisToday: boolean = false,\n\tisSelected: boolean = false,\n\tisDisabled: boolean = false,\n\tisRangeStart: boolean = false,\n\tisRangeEnd: boolean = false,\n\tisInRange: boolean = false,\n\tisWeekend: boolean = false,\n): string {\n\t// Base classes for day button\n\tlet classes =\n\t\t'w-full h-8 rounded-full flex items-center justify-center text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 ';\n\n\t// Apply conditional classes\n\tif (!isCurrentMonth) {\n\t\tclasses += 'current';\n\t} else if (isDisabled) {\n\t\tclasses += 'text-gray-300 cursor-not-allowed ';\n\t} else if (isSelected || isRangeStart || isRangeEnd) {\n\t\tclasses += 'bg-blue-600 text-white hover:bg-blue-700 ';\n\t} else if (isInRange) {\n\t\tclasses += 'bg-blue-100 text-blue-800 hover:bg-blue-200 ';\n\t} else if (isToday) {\n\t\tclasses += 'border border-blue-500 text-blue-600 hover:bg-blue-50 ';\n\t} else {\n\t\tclasses +=\n\t\t\t'text-gray-700 hover:bg-gray-100 hover:bg-blue-50 hover:text-blue-600 ';\n\t}\n\n\t// Add weekend-specific styling\n\tif (isWeekend && !isSelected && !isRangeStart && !isRangeEnd && !isInRange) {\n\t\tclasses += 'text-gray-500 ';\n\t}\n\n\t// Add attributes for hover states in range selection\n\tconst hoverAttributes =\n\t\tisCurrentMonth && !isDisabled ? 'data-hover-date=\"true\"' : '';\n\n\t// Create a date ID if month and year are provided\n\tlet dateIdAttr = '';\n\tif (year > 0) {\n\t\t// Format: YYYY-MM-DD (ensures leading zeros for month and day)\n\t\tconst monthStr = String(month + 1).padStart(2, '0'); // Add 1 since month is 0-indexed\n\t\tconst dayStr = String(day).padStart(2, '0');\n\t\tconst dateId = `${year}-${monthStr}-${dayStr}`;\n\t\tdateIdAttr = `data-date-id=\"${dateId}\"`;\n\t}\n\n\treturn `\n <td class=\"p-0.5\">\n <button\n type=\"button\"\n class=\"${classes.trim()}\"\n data-date=\"${day}\"\n ${dateIdAttr}\n ${isDisabled ? 'disabled' : ''}\n ${!isCurrentMonth ? 'tabindex=\"-1\"' : ''}\n ${hoverAttributes}\n aria-selected=\"${isSelected}\"\n aria-current=\"${isToday ? 'date' : 'false'}\"\n >\n ${day}\n </button>\n </td>\n `;\n}\n\n/**\n * Month and year header template with buttons for toggling month/year view\n *\n * @param locale - Locale configuration\n * @param currentMonth - Current month (0-11)\n * @param currentYear - Current year\n * @returns Month and year header HTML\n */\nexport function monthYearSelectTemplate(\n\tlocale: LocaleConfigInterface,\n\tcurrentMonth: number,\n\tcurrentYear: number,\n): string {\n\treturn `\n <div class=\"flex items-center justify-center space-x-2\">\n <button type=\"button\"\n class=\"month-selector px-2 py-1 rounded hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 text-gray-800 font-medium\"\n aria-label=\"Select Month\">\n ${locale.monthNames[currentMonth]}\n </button>\n <button type=\"button\"\n class=\"year-selector px-2 py-1 rounded hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 text-gray-800 font-medium\"\n aria-label=\"Select Year\">\n ${currentYear}\n </button>\n </div>\n `;\n}\n\n/**\n * Template for month selection view\n *\n * @param locale - Locale configuration\n * @param currentMonth - Current selected month (0-11)\n * @returns Month selection HTML\n */\nexport function monthSelectionTemplate(\n\tlocale: LocaleConfigInterface,\n\tcurrentMonth: number,\n): string {\n\tconst months = locale.monthNamesShort.map((month, idx) => {\n\t\tconst isCurrentMonth = idx === currentMonth;\n\t\tconst buttonClass = isCurrentMonth\n\t\t\t? 'py-3 px-2 text-sm rounded-md bg-blue-500 text-white font-medium hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500'\n\t\t\t: 'py-3 px-2 text-sm rounded-md bg-transparent hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 text-gray-800';\n\n\t\treturn `\n <button\n type=\"button\"\n class=\"${buttonClass}\"\n data-month=\"${idx}\"\n aria-selected=\"${isCurrentMonth}\"\n aria-label=\"${locale.monthNames[idx]}\"\n >\n ${month}\n </button>\n `;\n\t});\n\n\treturn `\n <div class=\"month-grid grid grid-cols-3 gap-2 p-2\">\n ${months.join('')}\n </div>\n `;\n}\n\n/**\n * Template for year selection view\n *\n * @param startYear - Start year\n * @param endYear - End year\n * @param currentYear - Current selected year\n * @returns Year selection HTML\n */\nexport function yearSelectionTemplate(\n\tstartYear: number,\n\tendYear: number,\n\tcurrentYear: number,\n): string {\n\tconst years = [];\n\n\tfor (let year = startYear; year <= endYear; year++) {\n\t\tconst isCurrentYear = year === currentYear;\n\t\tconst yearClass = isCurrentYear\n\t\t\t? 'py-3 px-2 text-center text-sm rounded-md bg-blue-500 text-white font-medium hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500'\n\t\t\t: 'py-3 px-2 text-center text-sm rounded-md bg-transparent hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 text-gray-800';\n\n\t\tyears.push(`\n <button\n type=\"button\"\n class=\"${yearClass}\"\n data-year=\"${year}\"\n aria-selected=\"${isCurrentYear}\"\n >\n ${year}\n </button>\n `);\n\t}\n\n\t// Navigation to previous/next year ranges\n\tconst prevYearsBtn = `\n <button\n type=\"button\"\n class=\"py-2 px-2 text-center text-sm rounded-md bg-gray-100 text-gray-600 hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n data-year-nav=\"prev\"\n aria-label=\"Previous years\"\n >\n ${startYear - 1}...\n </button>\n `;\n\n\tconst nextYearsBtn = `\n <button\n type=\"button\"\n class=\"py-2 px-2 text-center text-sm rounded-md bg-gray-100 text-gray-600 hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n data-year-nav=\"next\"\n aria-label=\"Next years\"\n >\n ...${endYear + 1}\n </button>\n `;\n\n\treturn `\n <div class=\"year-selection\">\n <div class=\"year-navigation flex justify-between mb-2 px-2\">\n ${prevYearsBtn}\n <span class=\"text-gray-700 font-medium\">${startYear}-${endYear}</span>\n ${nextYearsBtn}\n </div>\n <div class=\"year-grid grid grid-cols-4 gap-2 p-2\">\n ${years.join('')}\n </div>\n </div>\n `;\n}\n\n/**\n * Create placeholder template with placeholder text\n *\n * @param placeholder - Placeholder text to display\n * @returns HTML string for the placeholder\n */\nexport const placeholderTemplate = (placeholder: string): string => {\n\treturn `<span class=\"text-gray-500\">${placeholder}</span>`;\n};\n\n/**\n * Create a template for the display wrapper\n */\nexport function displayWrapperTemplate(classes: string = ''): string {\n\treturn `\n <div class=\"kt-datepicker-display-wrapper relative w-full ${classes}\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n aria-expanded=\"false\"\n >\n </div>\n `;\n}\n\n/**\n * Create a template for the display element\n */\nexport function displayElementTemplate(\n\tplaceholder: string,\n\tclasses: string = '',\n): string {\n\treturn `\n <div class=\"kt-datepicker-display-element py-2 px-3 border rounded cursor-pointer ${classes}\"\n tabindex=\"0\"\n role=\"textbox\"\n aria-label=\"${placeholder}\"\n data-placeholder=\"${placeholder}\"\n >\n <span class=\"kt-datepicker-display-text\"></span>\n </div>\n `;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n/**\n * Interface for locale configuration\n */\nexport interface LocaleConfigInterface {\n\tmonthNames: string[];\n\tmonthNamesShort: string[];\n\tdayNames: string[];\n\tdayNamesShort: string[];\n\tdayNamesMin: string[];\n\tfirstDayOfWeek: number;\n}\n\n/**\n * Interface for date range selection\n */\nexport interface DateRangeInterface {\n\tstartDate: Date | null;\n\tendDate: Date | null;\n}\n\n/**\n * Interface for time configuration\n */\nexport interface TimeConfigInterface {\n\thours: number;\n\tminutes: number;\n\tseconds: number;\n\tampm?: 'AM' | 'PM';\n}\n\n/**\n * Datepicker configuration interface\n */\nexport interface KTDatepickerConfigInterface {\n\t// Locale settings\n\tlocale: string;\n\tlocales: { [key: string]: LocaleConfigInterface };\n\n\t// Calendar display\n\tweekDays: 'long' | 'short' | 'min';\n\tforceLeadingZero: boolean;\n\n\t// Date boundaries\n\tminDate?: Date | string;\n\tmaxDate?: Date | string;\n\n\t// Calendar options\n\tvisibleMonths: number;\n\tvisibleYears: number;\n\tkeepViewModeOnSelection?: boolean; // If true, don't automatically switch view modes when selecting month/year\n\n\t// Date formatting\n\tformat: string;\n\n\t// Time options\n\tenableTime: boolean;\n\ttimeFormat: string;\n\tam: string;\n\tpm: string;\n\thourStep: number;\n\tminuteStep?: number;\n\tsecondStep?: number;\n\tdisabledHours?: number[];\n\tdisabledMinutes?: number[];\n\n\t// Date range options\n\trange: boolean;\n\trangeSeparator: string;\n\n\t// Multi-date selection\n\tmultiDateSelection: boolean;\n\tmaxDates: number;\n\n\t// Date constraints\n\tdisabledDates: (Date | string)[];\n\tenableNaturalLanguage: boolean;\n\n\t// Animation settings\n\tanimationDuration: number;\n\tanimationEasing: string;\n\tanimationEnterClass: string;\n\tanimationExitClass: string;\n\n\t// Custom callbacks\n\tonOpen?: () => void;\n\tonClose?: () => void;\n\tonChange?: (date: Date | null | DateRangeInterface) => void;\n\tonMonthChange?: (month: number, year: number) => void;\n\tonYearChange?: (year: number) => void;\n}\n\n/**\n * Datepicker state interface\n */\nexport interface KTDatepickerStateInterface {\n\tcurrentDate: Date;\n\tselectedDate: Date | null;\n\tselectedDateRange: DateRangeInterface | null;\n\tselectedDates: Date[];\n\tviewMode: 'days' | 'months' | 'years';\n\tisOpen: boolean;\n\tisFocused: boolean;\n\tisRangeSelectionStart: boolean;\n\tisRangeSelectionInProgress: boolean;\n\tselectedTime: TimeConfigInterface | null;\n\tprevIsOpen?: boolean; // Used to track previous open state\n}\n\n/**\n * Calendar day cell interface\n */\nexport interface CalendarDayCellInterface {\n\tdate: Date;\n\tdayNumber: number;\n\tisCurrentMonth: boolean;\n\tisPreviousMonth: boolean;\n\tisNextMonth: boolean;\n\tisToday: boolean;\n\tisSelected: boolean;\n\tisDisabled: boolean;\n\tisRangeStart: boolean;\n\tisRangeEnd: boolean;\n\tisInRange: boolean;\n\tisWeekend: boolean;\n}\n\n/**\n * Calendar month interface\n */\nexport interface CalendarMonthInterface {\n\tmonth: number;\n\tyear: number;\n\tdays: CalendarDayCellInterface[][];\n}\n\n/**\n * KTDatepicker events enum\n */\nexport enum KTDatepickerEvents {\n\tCALENDAR_UPDATE = 'kt.datepicker.calendar.update',\n\tDAY_SELECT = 'kt.datepicker.day.select',\n\tMONTH_CHANGE = 'kt.datepicker.month.change',\n\tDROPDOWN_SHOW = 'kt.datepicker.dropdown.show',\n\tDROPDOWN_HIDE = 'kt.datepicker.dropdown.hide',\n\tCHANGE = 'kt.datepicker.change',\n\tOPEN = 'kt.datepicker.open',\n\tCLOSE = 'kt.datepicker.close',\n\tGET_RANGE = 'kt.datepicker.getRange',\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { KTDatepickerConfigInterface, LocaleConfigInterface } from './types';\n\n/**\n * Format a date according to the provided format string\n *\n * @param date - Date to format\n * @param format - Format string\n * @param config - Datepicker configuration\n * @returns Formatted date string\n */\nexport function formatDate(\n\tdate: Date,\n\tformat: string,\n\tconfig: KTDatepickerConfigInterface,\n): string {\n\tif (!date || !(date instanceof Date) || isNaN(date.getTime())) {\n\t\treturn '';\n\t}\n\n\tconst locale = getLocaleConfig(config);\n\tconst isLeadingZero = config.forceLeadingZero;\n\n\t// Replace year tokens\n\tconst year = date.getFullYear();\n\tformat = format.replace(/yyyy/g, year.toString());\n\tformat = format.replace(/yy/g, year.toString().slice(-2));\n\n\t// Replace month tokens\n\tconst month = date.getMonth();\n\tconst monthNum = month + 1;\n\tformat = format.replace(/MMMM/g, locale.monthNames[month]);\n\tformat = format.replace(/MMM/g, locale.monthNamesShort[month]);\n\tformat = format.replace(\n\t\t/MM/g,\n\t\tisLeadingZero ? padZero(monthNum) : monthNum.toString(),\n\t);\n\tformat = format.replace(/M/g, monthNum.toString());\n\n\t// Replace day tokens\n\tconst day = date.getDate();\n\tformat = format.replace(/dd/g, isLeadingZero ? padZero(day) : day.toString());\n\tformat = format.replace(/d/g, day.toString());\n\n\t// Replace day of week tokens\n\tconst dayOfWeek = date.getDay();\n\tformat = format.replace(/EEEE/g, locale.dayNames[dayOfWeek]);\n\tformat = format.replace(/EEE/g, locale.dayNamesShort[dayOfWeek]);\n\tformat = format.replace(/E/g, locale.dayNamesMin[dayOfWeek]);\n\n\t// Replace time tokens if time is enabled\n\tif (config.enableTime) {\n\t\tconst hours = date.getHours();\n\t\tconst minutes = date.getMinutes();\n\t\tconst seconds = date.getSeconds();\n\n\t\t// 24-hour format\n\t\tformat = format.replace(\n\t\t\t/HH/g,\n\t\t\tisLeadingZero ? padZero(hours) : hours.toString(),\n\t\t);\n\t\tformat = format.replace(/H/g, hours.toString());\n\n\t\t// 12-hour format\n\t\tconst hours12 = hours % 12 || 12;\n\t\tformat = format.replace(\n\t\t\t/hh/g,\n\t\t\tisLeadingZero ? padZero(hours12) : hours12.toString(),\n\t\t);\n\t\tformat = format.replace(/h/g, hours12.toString());\n\n\t\t// Minutes and seconds\n\t\tformat = format.replace(\n\t\t\t/mm/g,\n\t\t\tisLeadingZero ? padZero(minutes) : minutes.toString(),\n\t\t);\n\t\tformat = format.replace(/m/g, minutes.toString());\n\t\tformat = format.replace(\n\t\t\t/ss/g,\n\t\t\tisLeadingZero ? padZero(seconds) : seconds.toString(),\n\t\t);\n\t\tformat = format.replace(/s/g, seconds.toString());\n\n\t\t// AM/PM\n\t\tconst ampm = hours >= 12 ? config.pm : config.am;\n\t\tformat = format.replace(/A/g, ampm);\n\t\tformat = format.replace(/a/g, ampm.toLowerCase());\n\n\t\t// Timezone (simplified implementation)\n\t\tconst timezoneOffset = date.getTimezoneOffset();\n\t\tconst timezoneOffsetHours = Math.abs(Math.floor(timezoneOffset / 60));\n\t\tconst timezoneOffsetMinutes = Math.abs(timezoneOffset % 60);\n\t\tconst timezoneSign = timezoneOffset > 0 ? '-' : '+';\n\n\t\tconst formattedTimezone = `${timezoneSign}${padZero(timezoneOffsetHours)}:${padZero(timezoneOffsetMinutes)}`;\n\t\tformat = format.replace(/ZZZ/g, formattedTimezone);\n\t}\n\n\treturn format;\n}\n\n/**\n * Parse a date string according to the provided format\n *\n * @param dateStr - Date string to parse\n * @param format - Format string\n * @param config - Datepicker configuration\n * @returns Parsed date or null if invalid\n */\nexport function parseDate(\n\tdateStr: string,\n\tformat: string,\n\tconfig: KTDatepickerConfigInterface,\n): Date | null {\n\tif (!dateStr) return null;\n\n\t// Handle natural language dates if enabled\n\tif (config.enableNaturalLanguage) {\n\t\tconst naturalDate = parseNaturalLanguageDate(dateStr);\n\t\tif (naturalDate) return naturalDate;\n\t}\n\n\t// Create a new date object to populate\n\tconst date = new Date();\n\tdate.setHours(0, 0, 0, 0);\n\n\t// Extract parts from the format\n\tconst formatParts: { [key: string]: string } = {};\n\n\tlet formatRegex = format\n\t\t.replace(/(\\w)(\\1*)/g, (_, p1, p2) => {\n\t\t\tconst length = p1.length + p2.length;\n\t\t\tlet token = '';\n\n\t\t\tswitch (p1) {\n\t\t\t\tcase 'y':\n\t\t\t\t\ttoken = length > 2 ? 'yyyy' : 'yy';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'M':\n\t\t\t\t\ttoken = ['M', 'MM', 'MMM', 'MMMM'][Math.min(length - 1, 3)];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'd':\n\t\t\t\t\ttoken = length > 1 ? 'dd' : 'd';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'E':\n\t\t\t\t\ttoken = length > 3 ? 'EEEE' : length > 1 ? 'EEE' : 'E';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'h':\n\t\t\t\tcase 'H':\n\t\t\t\t\ttoken = length > 1 ? p1 + p1 : p1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'm':\n\t\t\t\t\ttoken = length > 1 ? 'mm' : 'm';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 's':\n\t\t\t\t\ttoken = length > 1 ? 'ss' : 's';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'a':\n\t\t\t\tcase 'A':\n\t\t\t\t\ttoken = p1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\ttoken = p1.repeat(length);\n\t\t\t}\n\n\t\t\tformatParts[token] = '';\n\t\t\treturn `(\\\\d+|[a-zA-Z]+)`;\n\t\t})\n\t\t.replace(/[^\\w\\s]/g, '\\\\$&');\n\n\tconst match = new RegExp(formatRegex).exec(dateStr);\n\tif (!match) return null;\n\n\t// Map format tokens to their extracted values\n\tlet i = 1;\n\tfor (const token in formatParts) {\n\t\tformatParts[token] = match[i++];\n\t}\n\n\t// Extract year\n\tif (formatParts.yyyy) {\n\t\tdate.setFullYear(parseInt(formatParts.yyyy));\n\t} else if (formatParts.yy) {\n\t\tconst year = parseInt(formatParts.yy);\n\t\tconst century = Math.floor(new Date().getFullYear() / 100) * 100;\n\t\tdate.setFullYear(century + year);\n\t}\n\n\t// Extract month\n\tif (formatParts.MM || formatParts.M) {\n\t\tconst month = parseInt(formatParts.MM || formatParts.M) - 1;\n\t\tif (month >= 0 && month <= 11) {\n\t\t\tdate.setMonth(month);\n\t\t}\n\t} else if (formatParts.MMM || formatParts.MMMM) {\n\t\tconst monthName = formatParts.MMMM || formatParts.MMM;\n\t\tconst locale = getLocaleConfig(config);\n\t\tconst monthIndex = locale.monthNames.findIndex(\n\t\t\t(m) => m.toLowerCase() === monthName.toLowerCase(),\n\t\t);\n\t\tif (monthIndex === -1) {\n\t\t\tconst shortMonthIndex = locale.monthNamesShort.findIndex(\n\t\t\t\t(m) => m.toLowerCase() === monthName.toLowerCase(),\n\t\t\t);\n\t\t\tif (shortMonthIndex !== -1) {\n\t\t\t\tdate.setMonth(shortMonthIndex);\n\t\t\t}\n\t\t} else {\n\t\t\tdate.setMonth(monthIndex);\n\t\t}\n\t}\n\n\t// Extract day\n\tif (formatParts.dd || formatParts.d) {\n\t\tconst day = parseInt(formatParts.dd || formatParts.d);\n\t\tif (day >= 1 && day <= 31) {\n\t\t\tdate.setDate(day);\n\t\t}\n\t}\n\n\t// Extract time if needed\n\tif (config.enableTime) {\n\t\t// Hours (24-hour format)\n\t\tif (formatParts.HH || formatParts.H) {\n\t\t\tconst hours = parseInt(formatParts.HH || formatParts.H);\n\t\t\tif (hours >= 0 && hours <= 23) {\n\t\t\t\tdate.setHours(hours);\n\t\t\t}\n\t\t}\n\t\t// Hours (12-hour format)\n\t\telse if (formatParts.hh || formatParts.h) {\n\t\t\tlet hours = parseInt(formatParts.hh || formatParts.h);\n\n\t\t\t// Adjust for AM/PM\n\t\t\tif (formatParts.A) {\n\t\t\t\tconst isPM = formatParts.A.toUpperCase() === config.pm;\n\t\t\t\tif (isPM && hours < 12) {\n\t\t\t\t\thours += 12;\n\t\t\t\t} else if (!isPM && hours === 12) {\n\t\t\t\t\thours = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hours >= 0 && hours <= 23) {\n\t\t\t\tdate.setHours(hours);\n\t\t\t}\n\t\t}\n\n\t\t// Minutes\n\t\tif (formatParts.mm || formatParts.m) {\n\t\t\tconst minutes = parseInt(formatParts.mm || formatParts.m);\n\t\t\tif (minutes >= 0 && minutes <= 59) {\n\t\t\t\tdate.setMinutes(minutes);\n\t\t\t}\n\t\t}\n\n\t\t// Seconds\n\t\tif (formatParts.ss || formatParts.s) {\n\t\t\tconst seconds = parseInt(formatParts.ss || formatParts.s);\n\t\t\tif (seconds >= 0 && seconds <= 59) {\n\t\t\t\tdate.setSeconds(seconds);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Validate the final date\n\treturn isValidDate(date) ? date : null;\n}\n\n/**\n * Parse natural language date strings\n *\n * @param input - Natural language date string\n * @returns Parsed date or null if not recognized\n */\nfunction parseNaturalLanguageDate(input: string): Date | null {\n\tconst normalized = input.trim().toLowerCase();\n\tconst now = new Date();\n\n\t// Handle common natural language inputs\n\tswitch (normalized) {\n\t\tcase 'today':\n\t\t\treturn new Date(now.setHours(0, 0, 0, 0));\n\n\t\tcase 'yesterday': {\n\t\t\tconst yesterday = new Date(now);\n\t\t\tyesterday.setDate(yesterday.getDate() - 1);\n\t\t\tyesterday.setHours(0, 0, 0, 0);\n\t\t\treturn yesterday;\n\t\t}\n\n\t\tcase 'tomorrow': {\n\t\t\tconst tomorrow = new Date(now);\n\t\t\ttomorrow.setDate(tomorrow.getDate() + 1);\n\t\t\ttomorrow.setHours(0, 0, 0, 0);\n\t\t\treturn tomorrow;\n\t\t}\n\n\t\tdefault: {\n\t\t\t// Handle relative dates like \"next week\", \"last month\", etc.\n\t\t\tconst relativeMatch = normalized.match(\n\t\t\t\t/^(next|last|this)\\s+(day|week|month|year)$/,\n\t\t\t);\n\t\t\tif (relativeMatch) {\n\t\t\t\tconst [_, direction, unit] = relativeMatch;\n\t\t\t\tconst result = new Date(now);\n\t\t\t\tresult.setHours(0, 0, 0, 0);\n\n\t\t\t\tswitch (unit) {\n\t\t\t\t\tcase 'day':\n\t\t\t\t\t\tresult.setDate(\n\t\t\t\t\t\t\tresult.getDate() +\n\t\t\t\t\t\t\t\t(direction === 'next' ? 1 : direction === 'last' ? -1 : 0),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'week':\n\t\t\t\t\t\tresult.setDate(\n\t\t\t\t\t\t\tresult.getDate() +\n\t\t\t\t\t\t\t\t(direction === 'next' ? 7 : direction === 'last' ? -7 : 0),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'month':\n\t\t\t\t\t\tresult.setMonth(\n\t\t\t\t\t\t\tresult.getMonth() +\n\t\t\t\t\t\t\t\t(direction === 'next' ? 1 : direction === 'last' ? -1 : 0),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'year':\n\t\t\t\t\t\tresult.setFullYear(\n\t\t\t\t\t\t\tresult.getFullYear() +\n\t\t\t\t\t\t\t\t(direction === 'next' ? 1 : direction === 'last' ? -1 : 0),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n/**\n * Check if a date is valid\n *\n * @param date - Date to check\n * @returns Whether the date is valid\n */\nexport function isValidDate(date: any): boolean {\n\treturn date instanceof Date && !isNaN(date.getTime());\n}\n\n/**\n * Get the number of days in a month\n *\n * @param year - Year\n * @param month - Month (0-indexed)\n * @returns Number of days in the month\n */\nexport function getDaysInMonth(year: number, month: number): number {\n\treturn new Date(year, month + 1, 0).getDate();\n}\n\n/**\n * Get the first day of the month\n *\n * @param year - Year\n * @param month - Month (0-indexed)\n * @returns Day of week for the first day (0 = Sunday, 6 = Saturday)\n */\nexport function getFirstDayOfMonth(year: number, month: number): number {\n\treturn new Date(year, month, 1).getDay();\n}\n\n/**\n * Pad a number with a leading zero if needed\n *\n * @param num - Number to pad\n * @returns Padded number string\n */\nexport function padZero(num: number): string {\n\treturn num < 10 ? `0${num}` : num.toString();\n}\n\n/**\n * Get locale configuration for the datepicker\n *\n * @param config - Datepicker configuration\n * @returns Locale configuration\n */\nexport function getLocaleConfig(\n\tconfig: KTDatepickerConfigInterface,\n): LocaleConfigInterface {\n\treturn config.locales[config.locale] || config.locales['en-US'];\n}\n\n/**\n * Check if a date is between two other dates (inclusive)\n *\n * @param date - Date to check\n * @param start - Start date\n * @param end - End date\n * @returns Whether the date is between start and end\n */\nexport function isDateBetween(date: Date, start: Date, end: Date): boolean {\n\tconst dateTime = date.getTime();\n\treturn dateTime >= start.getTime() && dateTime <= end.getTime();\n}\n\n/**\n * Compare two dates for equality (ignoring time)\n *\n * @param date1 - First date\n * @param date2 - Second date\n * @returns Whether the dates are equal\n */\nexport function isSameDay(date1: Date, date2: Date): boolean {\n\treturn (\n\t\tdate1.getFullYear() === date2.getFullYear() &&\n\t\tdate1.getMonth() === date2.getMonth() &&\n\t\tdate1.getDate() === date2.getDate()\n\t);\n}\n\n/**\n * Check if a date is a weekend (Saturday or Sunday)\n *\n * @param date - Date to check\n * @returns Whether the date is a weekend\n */\nexport function isWeekend(date: Date): boolean {\n\tconst day = date.getDay();\n\treturn day === 0 || day === 6;\n}\n\n/**\n * Check if a date is disabled (outside min/max range or explicitly disabled)\n *\n * @param date - Date to check\n * @param config - Datepicker configuration\n * @returns Whether the date is disabled\n */\nexport function isDateDisabled(\n\tdate: Date,\n\tconfig: KTDatepickerConfigInterface,\n): boolean {\n\tif (!date || !(date instanceof Date) || isNaN(date.getTime())) {\n\t\treturn true;\n\t}\n\n\t// Set the time to noon for consistent comparison\n\tconst normalizedDate = new Date(date);\n\tnormalizedDate.setHours(12, 0, 0, 0);\n\n\t// Check min date\n\tif (config.minDate) {\n\t\tlet minDate: Date | null = null;\n\n\t\tif (config.minDate instanceof Date) {\n\t\t\tminDate = new Date(config.minDate);\n\t\t\tminDate.setHours(0, 0, 0, 0);\n\t\t} else {\n\t\t\t// Try parsing with the configured format\n\t\t\tminDate = parseDate(config.minDate.toString(), config.format, config);\n\n\t\t\t// If that fails, try parsing with other common formats\n\t\t\tif (!minDate) {\n\t\t\t\t// Try DD/MM/YYYY format\n\t\t\t\tconst parts = config.minDate.toString().split('/');\n\t\t\t\tif (parts.length === 3) {\n\t\t\t\t\tconst day = parseInt(parts[0], 10);\n\t\t\t\t\tconst month = parseInt(parts[1], 10) - 1;\n\t\t\t\t\tconst year = parseInt(parts[2], 10);\n\n\t\t\t\t\tif (!isNaN(day) && !isNaN(month) && !isNaN(year)) {\n\t\t\t\t\t\tminDate = new Date(year, month, day);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (minDate) {\n\t\t\t// Ensure minDate has time set to beginning of day for accurate comparison\n\t\t\tminDate.setHours(0, 0, 0, 0);\n\t\t\tif (normalizedDate < minDate) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check max date\n\tif (config.maxDate) {\n\t\tlet maxDate: Date | null = null;\n\n\t\tif (config.maxDate instanceof Date) {\n\t\t\tmaxDate = new Date(config.maxDate);\n\t\t\tmaxDate.setHours(23, 59, 59, 999);\n\t\t} else {\n\t\t\t// Try parsing with the configured format\n\t\t\tmaxDate = parseDate(config.maxDate.toString(), config.format, config);\n\n\t\t\t// If that fails, try parsing with other common formats\n\t\t\tif (!maxDate) {\n\t\t\t\t// Try DD/MM/YYYY format\n\t\t\t\tconst parts = config.maxDate.toString().split('/');\n\t\t\t\tif (parts.length === 3) {\n\t\t\t\t\tconst day = parseInt(parts[0], 10);\n\t\t\t\t\tconst month = parseInt(parts[1], 10) - 1;\n\t\t\t\t\tconst year = parseInt(parts[2], 10);\n\n\t\t\t\t\tif (!isNaN(day) && !isNaN(month) && !isNaN(year)) {\n\t\t\t\t\t\tmaxDate = new Date(year, month, day);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (maxDate) {\n\t\t\t// Ensure maxDate has time set to end of day for accurate comparison\n\t\t\tmaxDate.setHours(23, 59, 59, 999);\n\t\t\tif (normalizedDate > maxDate) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check explicitly disabled dates\n\tif (config.disabledDates && config.disabledDates.length > 0) {\n\t\tfor (const disabledDate of config.disabledDates) {\n\t\t\tconst disabled =\n\t\t\t\tdisabledDate instanceof Date\n\t\t\t\t\t? disabledDate\n\t\t\t\t\t: parseDate(disabledDate.toString(), config.format, config);\n\n\t\t\tif (disabled && isSameDay(normalizedDate, disabled)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Generate a calender for the specified month\n *\n * @param year - Year\n * @param month - Month (0-indexed)\n * @param config - Datepicker configuration\n * @returns Calendar days matrix\n */\nexport function generateCalendarMonth(\n\tyear: number,\n\tmonth: number,\n\tconfig: KTDatepickerConfigInterface,\n): Date[][] {\n\tconst daysInMonth = getDaysInMonth(year, month);\n\tconst firstDayOfMonth = getFirstDayOfMonth(year, month);\n\tconst locale = getLocaleConfig(config);\n\tconst firstDayOfWeek = locale.firstDayOfWeek;\n\n\t// Calculate the offset from the first day of the month to the first day of the calendar\n\tlet startOffset = (firstDayOfMonth - firstDayOfWeek + 7) % 7;\n\n\t// Create a 6x7 matrix for the calendar\n\tconst calendar: Date[][] = [];\n\tlet day = 1 - startOffset;\n\n\tfor (let week = 0; week < 6; week++) {\n\t\tconst weekDays: Date[] = [];\n\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\tconst date = new Date(year, month, day);\n\t\t\tweekDays.push(date);\n\t\t\tday++;\n\t\t}\n\n\t\tcalendar.push(weekDays);\n\n\t\t// If we've gone past the end of the month and it's a complete week, we can stop\n\t\tif (day > daysInMonth && week >= 4) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn calendar;\n}\n\n/**\n * Check if two dates are the same day\n * (ignoring time part)\n *\n * @param date1 - First date to compare\n * @param date2 - Second date to compare\n * @returns True if dates are the same day\n */\nexport function isDateEqual(date1: Date, date2: Date): boolean {\n\treturn (\n\t\tdate1.getDate() === date2.getDate() &&\n\t\tdate1.getMonth() === date2.getMonth() &&\n\t\tdate1.getFullYear() === date2.getFullYear()\n\t);\n}\n\n/**\n * Check if a date is within a range (inclusive)\n *\n * @param date - Date to check\n * @param startDate - Start date of the range\n * @param endDate - End date of the range\n * @returns True if date is within the range\n */\nexport function isDateInRange(\n\tdate: Date,\n\tstartDate: Date,\n\tendDate: Date,\n): boolean {\n\tconst time = date.getTime();\n\tconst startTime = startDate.getTime();\n\tconst endTime = endDate.getTime();\n\n\treturn time >= startTime && time <= endTime;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTDismissInterface, KTDismissConfigInterface } from './types';\nimport { KTDismissModeType } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_DISMISS_INITIALIZED: boolean;\n\t\tKTDismiss: typeof KTDismiss;\n\t}\n}\n\nexport class KTDismiss extends KTComponent implements KTDismissInterface {\n\tprotected override _name: string = 'dismiss';\n\tprotected override _defaultConfig: KTDismissConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tmode: 'remove',\n\t\tinterrupt: true,\n\t\ttarget: '',\n\t};\n\tprotected override _config: KTDismissConfigInterface = this._defaultConfig;\n\tprotected _isAnimating: boolean = false;\n\tprotected _targetElement: HTMLElement | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTDismissConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._config['mode'] = this._config['mode'] as KTDismissModeType;\n\n\t\tif (!this._element) return;\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-dismiss') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tif ((this._getOption('interrupt') as boolean) === true) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\n\t\t\tthis._dismiss();\n\t\t});\n\t}\n\n\tprotected _dismiss(): void {\n\t\tif (this._isAnimating) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('dismiss', payload);\n\t\tthis._dispatchEvent('dismiss', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._targetElement) return;\n\t\tthis._targetElement.style.opacity = '0';\n\t\tKTDom.reflow(this._targetElement);\n\t\tthis._isAnimating = true;\n\n\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\tif (!this._targetElement) return;\n\t\t\tthis._isAnimating = false;\n\t\t\tthis._targetElement.style.opacity = '';\n\n\t\t\tif (this._getOption('mode').toString().toLowerCase() === 'hide') {\n\t\t\t\tthis._targetElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tKTDom.remove(this._targetElement);\n\t\t\t}\n\n\t\t\tthis._fireEvent('dismissed');\n\t\t\tthis._dispatchEvent('dismissed');\n\t\t});\n\t}\n\n\tpublic getTargetElement(): HTMLElement {\n\t\treturn this._targetElement;\n\t}\n\n\tpublic dismiss(): void {\n\t\tthis._dismiss();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTDismiss {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'dismiss')) {\n\t\t\treturn KTData.get(element, 'dismiss') as KTDismiss;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-dismiss')) {\n\t\t\treturn new KTDismiss(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTDismissConfigInterface,\n\t): KTDismiss {\n\t\treturn this.getInstance(element) || new KTDismiss(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-dismiss]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTDismiss(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTDismiss.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTDismiss = KTDismiss;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTDismiss } from './dismiss';\nexport type { KTDismissConfigInterface, KTDismissInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTDrawerInterface, KTDrawerConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_DRAWER_INITIALIZED: boolean;\n\t\tKTDrawer: typeof KTDrawer;\n\t}\n}\n\nexport class KTDrawer extends KTComponent implements KTDrawerInterface {\n\tprotected override _name: string = 'drawer';\n\tprotected override _defaultConfig: KTDrawerConfigInterface = {\n\t\tzindex: '100',\n\t\tenable: true,\n\t\tclass: '',\n\t\tshownClass: 'flex',\n\t\thiddenClass: 'hidden',\n\t\tbackdrop: true,\n\t\tbackdropClass: 'kt-drawer-backdrop',\n\t\tbackdropStatic: false,\n\t\tkeyboard: true,\n\t\tdisableScroll: true,\n\t\tpersistent: false,\n\t\tcontainer: '',\n\t\tfocus: true,\n\t};\n\tprotected override _config: KTDrawerConfigInterface = this._defaultConfig;\n\tprotected _isOpen: boolean = false;\n\tprotected _isTransitioning: boolean = false;\n\tprotected _backdropElement: HTMLElement | null = null;\n\tprotected _relatedTarget: HTMLElement | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTDrawerConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._handleClose();\n\t\tthis._update();\n\t\tthis._handleContainer();\n\t}\n\n\tprotected _handleClose(): void {\n\t\tif (!this._element) return;\n\t\tKTEventHandler.on(this._element, '[data-kt-drawer-hide]', 'click', () => {\n\t\t\tthis._hide();\n\t\t});\n\t}\n\n\tprotected _toggle(relatedTarget?: HTMLElement): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen === true) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show(relatedTarget);\n\t\t}\n\t}\n\n\tprotected _show(relatedTarget?: HTMLElement): void {\n\t\tif (this._isOpen || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tKTDrawer.hide();\n\n\t\tif (this._getOption('backdrop') === true) this._createBackdrop();\n\n\t\tif (relatedTarget) this._relatedTarget = relatedTarget;\n\n\t\tif (!this._element) return;\n\t\tthis._isTransitioning = true;\n\t\tthis._element.classList.remove(this._getOption('hiddenClass') as string);\n\t\tthis._element.classList.add(this._getOption('shownClass') as string);\n\t\tthis._element.setAttribute('role', 'dialog');\n\t\tthis._element.setAttribute('aria-modal', 'true');\n\t\tthis._element.setAttribute('tabindex', '-1');\n\n\t\tconst zindex: number = parseInt(this._getOption('zindex') as string);\n\t\tif (zindex > 0) {\n\t\t\tthis._element.style.zIndex = `${zindex}`;\n\t\t}\n\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = 'hidden';\n\t\t}\n\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.add('open');\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\tif (this._getOption('focus') === true) {\n\t\t\t\tthis._autoFocus();\n\t\t\t}\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(): void {\n\t\tif (!this._element) return;\n\t\tif (this._isOpen === false || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isTransitioning = true;\n\t\tthis._element.removeAttribute('role');\n\t\tthis._element.removeAttribute('aria-modal');\n\t\tthis._element.removeAttribute('tabindex');\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = '';\n\t\t}\n\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.remove('open');\n\n\t\tif (this._getOption('backdrop') === true) {\n\t\t\tthis._deleteBackdrop();\n\t\t}\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tif (!this._element) return;\n\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\t\t\tthis._element.classList.add(this._getOption('hiddenClass') as string);\n\t\t\tthis._element.classList.remove(this._getOption('shownClass') as string);\n\t\t\tthis._element.style.zIndex = '';\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _update(): void {\n\t\tif ((this._getOption('class') as string)?.length > 0) {\n\t\t\tif (this.isEnabled()) {\n\t\t\t\tKTDom.addClass(this._element, this._getOption('class') as string);\n\t\t\t} else {\n\t\t\t\tKTDom.removeClass(this._element, this._getOption('class') as string);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _handleContainer(): void {\n\t\tif (this._getOption('container')) {\n\t\t\tif (this._getOption('container') === 'body') {\n\t\t\t\tdocument.body.appendChild(this._element);\n\t\t\t} else {\n\t\t\t\tdocument\n\t\t\t\t\t.querySelector(this._getOption('container') as string)\n\t\t\t\t\t?.appendChild(this._element);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _autoFocus(): void {\n\t\tif (!this._element) return;\n\t\tconst input: HTMLInputElement | null = this._element.querySelector(\n\t\t\t'[data-kt-drawer-focus]',\n\t\t);\n\t\tif (!input) return;\n\t\telse input.focus();\n\t}\n\n\tprotected _createBackdrop(): void {\n\t\tif (!this._element) return;\n\n\t\tconst zindex: number = parseInt(this._getOption('zindex') as string);\n\n\t\tthis._backdropElement = document.createElement('DIV');\n\t\tthis._backdropElement.style.zIndex = (zindex - 1).toString();\n\t\tthis._backdropElement.setAttribute('data-kt-drawer-backdrop', 'true');\n\t\tdocument.body.append(this._backdropElement);\n\t\tKTDom.reflow(this._backdropElement);\n\t\tKTDom.addClass(\n\t\t\tthis._backdropElement,\n\t\t\tthis._getOption('backdropClass') as string,\n\t\t);\n\n\t\tthis._backdropElement.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\t\t\tif (this._getOption('backdropStatic') === false) {\n\t\t\t\tthis._hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _deleteBackdrop(): void {\n\t\tif (!this._backdropElement) return;\n\n\t\tKTDom.reflow(this._backdropElement);\n\t\tthis._backdropElement.style.opacity = '0';\n\n\t\tKTDom.transitionEnd(this._backdropElement, () => {\n\t\t\tif (!this._backdropElement) return;\n\t\t\tKTDom.remove(this._backdropElement);\n\t\t});\n\t}\n\n\tprotected _isEnabled(): boolean {\n\t\treturn KTUtils.stringToBoolean(this._getOption('enable'));\n\t}\n\n\tpublic toggle(): void {\n\t\treturn this._toggle();\n\t}\n\n\tpublic show(relatedTarget?: HTMLElement): void {\n\t\treturn this._show(relatedTarget);\n\t}\n\n\tpublic hide(): void {\n\t\treturn this._hide();\n\t}\n\n\tpublic update(): void {\n\t\treturn this._update();\n\t}\n\n\tpublic getRelatedTarget(): HTMLElement | null {\n\t\treturn this._relatedTarget;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\tpublic isEnabled(): boolean {\n\t\treturn this._isEnabled();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTDrawer {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'drawer')) {\n\t\t\treturn KTData.get(element, 'drawer') as KTDrawer;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-drawer-initialized') === 'true') {\n\t\t\treturn new KTDrawer(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTDrawerConfigInterface,\n\t): KTDrawer {\n\t\treturn this.getInstance(element) || new KTDrawer(element, config);\n\t}\n\n\tpublic static hide(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-drawer-initialized]');\n\n\t\telements.forEach((element) => {\n\t\t\tconst drawer = KTDrawer.getInstance(element as HTMLElement);\n\n\t\t\tif (drawer && drawer.isOpen()) {\n\t\t\t\tdrawer.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleResize(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\t() => {\n\t\t\t\t\tdocument\n\t\t\t\t\t\t.querySelectorAll('[data-kt-drawer-initialized]')\n\t\t\t\t\t\t.forEach((element) => {\n\t\t\t\t\t\t\tconst drawer = KTDrawer.getInstance(element as HTMLElement);\n\t\t\t\t\t\t\tdrawer.update();\n\n\t\t\t\t\t\t\tif (drawer && drawer.isOpen() && !drawer.isEnabled()) {\n\t\t\t\t\t\t\t\tdrawer.hide();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static handleToggle(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-drawer-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst selector = target.getAttribute('data-kt-drawer-toggle');\n\t\t\t\tif (!selector) return;\n\n\t\t\t\tconst drawerEl = document.querySelector(selector);\n\t\t\t\tconst drawer = KTDrawer.getInstance(drawerEl as HTMLElement);\n\t\t\t\tif (drawer) {\n\t\t\t\t\tdrawer.toggle();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleDismiss(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-drawer-dismiss]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst modalElement = target.closest(\n\t\t\t\t\t'[data-kt-drawer=\"true\"]',\n\t\t\t\t) as HTMLElement;\n\t\t\t\tif (modalElement) {\n\t\t\t\t\tconst modal = KTDrawer.getInstance(modalElement);\n\t\t\t\t\tif (modal) {\n\t\t\t\t\t\tmodal.hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleClickAway() {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tconst drawerEl = document.querySelector(\n\t\t\t\t'.open[data-kt-drawer-initialized]',\n\t\t\t);\n\t\t\tif (!drawerEl) return;\n\n\t\t\tconst drawer = KTDrawer.getInstance(drawerEl as HTMLElement);\n\t\t\tif (!drawer) return;\n\n\t\t\tif (drawer.getOption('persistent')) return;\n\n\t\t\tif (drawer.getOption('backdrop')) return;\n\n\t\t\tif (\n\t\t\t\tdrawerEl !== event.target &&\n\t\t\t\tdrawer.getRelatedTarget() !== event.target &&\n\t\t\t\tdrawerEl.contains(event.target as HTMLElement) === false\n\t\t\t) {\n\t\t\t\tdrawer.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleKeyword() {\n\t\tdocument.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst drawerEl = document.querySelector(\n\t\t\t\t'.open[data-kt-drawer-initialized]',\n\t\t\t);\n\t\t\tconst drawer = KTDrawer.getInstance(drawerEl as HTMLElement);\n\t\t\tif (!drawer) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// if esc key was not pressed in combination with ctrl or alt or shift\n\t\t\tif (\n\t\t\t\tevent.key === 'Escape' &&\n\t\t\t\t!(event.ctrlKey || event.altKey || event.shiftKey)\n\t\t\t) {\n\t\t\t\tdrawer.hide();\n\t\t\t}\n\n\t\t\tif (event.code === 'Tab' && !event.metaKey) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-drawer]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTDrawer(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTDrawer.createInstances();\n\n\t\tif (window.KT_DRAWER_INITIALIZED !== true) {\n\t\t\tKTDrawer.handleToggle();\n\t\t\tKTDrawer.handleDismiss();\n\t\t\tKTDrawer.handleResize();\n\t\t\tKTDrawer.handleClickAway();\n\t\t\tKTDrawer.handleKeyword();\n\t\t\twindow.KT_DRAWER_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTDrawer = KTDrawer;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTDrawer } from './drawer';\nexport type { KTDrawerConfigInterface, KTDrawerInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport {\n\tInstance as PopperInstance,\n\tcreatePopper,\n\tPlacement,\n\tVirtualElement,\n} from '@popperjs/core';\nimport KTDom from '../../helpers/dom';\nimport KTData from '../../helpers/data';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTDropdownConfigInterface, KTDropdownInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_DROPDOWN_INITIALIZED: boolean;\n\t\tKTDropdown: typeof KTDropdown;\n\t}\n}\n\nexport class KTDropdown extends KTComponent implements KTDropdownInterface {\n\tprotected override _name: string = 'dropdown';\n\tprotected override _defaultConfig: KTDropdownConfigInterface = {\n\t\tzindex: 105,\n\t\thoverTimeout: 200,\n\t\tplacement: 'bottom-start',\n\t\tplacementRtl: 'bottom-end',\n\t\tpermanent: false,\n\t\tdismiss: false,\n\t\tkeyboard: true,\n\t\ttrigger: 'click',\n\t\tattach: '',\n\t\toffset: '0px, 5px',\n\t\toffsetRtl: '0px, 5px',\n\t\thiddenClass: 'hidden',\n\t};\n\tprotected override _config: KTDropdownConfigInterface = this._defaultConfig;\n\tprotected _disabled: boolean = false;\n\tprotected _toggleElement: HTMLElement;\n\tprotected _menuElement: HTMLElement;\n\tprotected _isTransitioning: boolean = false;\n\tprotected _isOpen: boolean = false;\n\n\tconstructor(element: HTMLElement, config?: KTDropdownConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._toggleElement = this._element.querySelector(\n\t\t\t'[data-kt-dropdown-toggle]',\n\t\t) as HTMLElement;\n\t\tif (!this._toggleElement) return;\n\t\tthis._menuElement = this._element.querySelector(\n\t\t\t'[data-kt-dropdown-menu]',\n\t\t) as HTMLElement;\n\t\tif (!this._menuElement) return;\n\n\t\tKTData.set(this._menuElement, 'dropdownElement', this._element);\n\t\tthis._setupNestedDropdowns();\n\t}\n\n\tprotected _setupNestedDropdowns(): void {\n\t\tconst subDropdowns = this._menuElement.querySelectorAll(\n\t\t\t'[data-kt-dropdown-toggle]',\n\t\t);\n\t\tsubDropdowns.forEach((subToggle) => {\n\t\t\tconst subItem = subToggle.closest(\n\t\t\t\t'[data-kt-dropdown-item]',\n\t\t\t) as HTMLElement;\n\t\t\tconst subMenu = subToggle\n\t\t\t\t.closest('.kt-menu-item')\n\t\t\t\t?.querySelector('[data-kt-dropdown-menu]');\n\t\t\tif (subItem && subMenu) {\n\t\t\t\tnew KTDropdown(subItem);\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _click(event: Event): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif (this._disabled) return;\n\n\t\tif (this._getOption('trigger') !== 'click') return;\n\n\t\tthis._toggle();\n\t}\n\n\tprotected _mouseover(event: MouseEvent): void {\n\t\tif (this._disabled) return;\n\n\t\tif (this._getOption('trigger') !== 'hover') return;\n\n\t\tif (KTData.get(this._element, 'hover') === '1') {\n\t\t\tclearTimeout(KTData.get(this._element, 'timeout') as number);\n\t\t\tKTData.remove(this._element, 'hover');\n\t\t\tKTData.remove(this._element, 'timeout');\n\t\t}\n\n\t\tthis._show();\n\t}\n\n\tprotected _mouseout(event: MouseEvent): void {\n\t\tif (this._disabled) return;\n\n\t\tif (this._getOption('trigger') !== 'hover') return;\n\n\t\tconst relatedTarget = event.relatedTarget as HTMLElement;\n\t\tconst isWithinDropdown = this._element.contains(relatedTarget);\n\n\t\tif (isWithinDropdown) return;\n\n\t\tconst timeout = setTimeout(\n\t\t\t() => {\n\t\t\t\tif (KTData.get(this._element, 'hover') === '1') {\n\t\t\t\t\tthis._hide();\n\t\t\t\t}\n\t\t\t},\n\t\t\tparseInt(this._getOption('hoverTimeout') as string),\n\t\t);\n\n\t\tKTData.set(this._element, 'hover', '1');\n\t\tKTData.set(this._element, 'timeout', timeout);\n\t}\n\n\tprotected _toggle(): void {\n\t\tif (this._isOpen) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show();\n\t\t}\n\t}\n\n\tprotected _show(): void {\n\t\tif (this._isOpen || this._isTransitioning) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel) return;\n\n\t\tKTDropdown.hide(this._element);\n\n\t\tlet zIndex: number = parseInt(this._getOption('zindex') as string);\n\t\tconst parentZindex: number = KTDom.getHighestZindex(this._element);\n\n\t\tif (parentZindex !== null && parentZindex >= zIndex) {\n\t\t\tzIndex = parentZindex + 1;\n\t\t}\n\t\tif (zIndex > 0) {\n\t\t\tthis._menuElement.style.zIndex = zIndex.toString();\n\t\t}\n\n\t\tthis._menuElement.style.display = 'block';\n\t\tthis._menuElement.style.opacity = '0';\n\t\tKTDom.reflow(this._menuElement);\n\t\tthis._menuElement.style.opacity = '1';\n\n\t\tthis._menuElement.classList.remove(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._toggleElement.classList.add('active');\n\t\tthis._menuElement.classList.add('open');\n\t\tthis._element.classList.add('open');\n\n\t\tthis._initPopper();\n\n\t\tKTDom.transitionEnd(this._menuElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(): void {\n\t\tif (!this._isOpen || this._isTransitioning) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel) return;\n\n\t\tthis._menuElement.style.opacity = '1';\n\t\tKTDom.reflow(this._menuElement);\n\t\tthis._menuElement.style.opacity = '0';\n\t\tthis._menuElement.classList.remove('open');\n\t\tthis._toggleElement.classList.remove('active');\n\t\tthis._element.classList.remove('open');\n\n\t\tKTDom.transitionEnd(this._menuElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\n\t\t\tthis._menuElement.classList.add(this._getOption('hiddenClass') as string);\n\t\t\tthis._menuElement.style.display = '';\n\t\t\tthis._menuElement.style.zIndex = '';\n\n\t\t\tthis._destroyPopper();\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _initPopper(): void {\n\t\tconst isRtl = KTDom.isRTL();\n\t\tlet reference: HTMLElement;\n\t\tconst attach = this._getOption('attach') as string;\n\n\t\tif (attach) {\n\t\t\treference =\n\t\t\t\tattach === 'parent'\n\t\t\t\t\t? (this._toggleElement.parentNode as HTMLElement)\n\t\t\t\t\t: (document.querySelector(attach) as HTMLElement);\n\t\t} else {\n\t\t\treference = this._toggleElement;\n\t\t}\n\n\t\tif (reference) {\n\t\t\tconst popper = createPopper(\n\t\t\t\treference as Element | VirtualElement,\n\t\t\t\tthis._menuElement,\n\t\t\t\tthis._getPopperConfig(),\n\t\t\t);\n\t\t\tKTData.set(this._element, 'popper', popper);\n\t\t}\n\t}\n\n\tprotected _destroyPopper(): void {\n\t\tif (KTData.has(this._element, 'popper')) {\n\t\t\t(KTData.get(this._element, 'popper') as PopperInstance).destroy();\n\t\t\tKTData.remove(this._element, 'popper');\n\t\t}\n\t}\n\n\tprotected _isDropdownOpen(): boolean {\n\t\treturn (\n\t\t\tthis._element.classList.contains('open') &&\n\t\t\tthis._menuElement.classList.contains('open')\n\t\t);\n\t}\n\n\tprotected _getPopperConfig(): object {\n\t\tconst isRtl = KTDom.isRTL();\n\t\tlet placement = this._getOption('placement') as Placement;\n\t\tif (isRtl && this._getOption('placementRtl')) {\n\t\t\tplacement = this._getOption('placementRtl') as Placement;\n\t\t}\n\n\t\tlet offsetValue = this._getOption('offset');\n\t\tif (isRtl && this._getOption('offsetRtl')) {\n\t\t\toffsetValue = this._getOption('offsetRtl') as Placement;\n\t\t}\n\t\tconst offset = offsetValue\n\t\t\t? offsetValue\n\t\t\t\t\t.toString()\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.map((value) => parseInt(value.trim(), 10))\n\t\t\t: [0, 0];\n\n\t\tconst strategy =\n\t\t\tthis._getOption('overflow') === true ? 'absolute' : 'fixed';\n\t\tconst altAxis = this._getOption('flip') !== false;\n\t\treturn {\n\t\t\tplacement: placement,\n\t\t\tstrategy: strategy,\n\t\t\tmodifiers: [\n\t\t\t\t{\n\t\t\t\t\tname: 'offset',\n\t\t\t\t\toptions: { offset: offset },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'preventOverflow',\n\t\t\t\t\toptions: { altAxis: altAxis },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'flip',\n\t\t\t\t\toptions: { flipVariations: false },\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\n\tprotected _getToggleElement(): HTMLElement {\n\t\treturn this._toggleElement;\n\t}\n\n\tprotected _getContentElement(): HTMLElement {\n\t\treturn this._menuElement;\n\t}\n\n\t// General Methods\n\tpublic click(event: Event): void {\n\t\tthis._click(event);\n\t}\n\n\tpublic mouseover(event: MouseEvent): void {\n\t\tthis._mouseover(event);\n\t}\n\n\tpublic mouseout(event: MouseEvent): void {\n\t\tthis._mouseout(event);\n\t}\n\n\tpublic show(): void {\n\t\tthis._show();\n\t}\n\n\tpublic hide(): void {\n\t\tthis._hide();\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic getToggleElement(): HTMLElement {\n\t\treturn this._toggleElement;\n\t}\n\n\tpublic getContentElement(): HTMLElement {\n\t\treturn this._menuElement;\n\t}\n\n\tpublic isPermanent(): boolean {\n\t\treturn this._getOption('permanent') as boolean;\n\t}\n\n\tpublic disable(): void {\n\t\tthis._disabled = true;\n\t}\n\n\tpublic enable(): void {\n\t\tthis._disabled = false;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isDropdownOpen();\n\t}\n\n\t// Static Methods\n\tpublic static getElement(reference: HTMLElement): HTMLElement {\n\t\tif (reference && reference.hasAttribute('data-kt-dropdown-initialized'))\n\t\t\treturn reference;\n\n\t\tconst findElement =\n\t\t\treference &&\n\t\t\t(reference.closest('[data-kt-dropdown-initialized]') as HTMLElement);\n\t\tif (findElement) return findElement;\n\n\t\tif (\n\t\t\treference &&\n\t\t\treference.hasAttribute('data-kt-dropdown-menu') &&\n\t\t\tKTData.has(reference, 'dropdownElement')\n\t\t) {\n\t\t\treturn KTData.get(reference, 'dropdownElement') as HTMLElement;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTDropdown {\n\t\telement = this.getElement(element);\n\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'dropdown')) {\n\t\t\treturn KTData.get(element, 'dropdown') as KTDropdown;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-dropdown-initialized') === 'true') {\n\t\t\treturn new KTDropdown(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTDropdownConfigInterface,\n\t): KTDropdown {\n\t\treturn this.getInstance(element) || new KTDropdown(element, config);\n\t}\n\n\tpublic static update(): void {\n\t\tdocument\n\t\t\t.querySelectorAll('.open[data-kt-dropdown-initialized]')\n\t\t\t.forEach((item) => {\n\t\t\t\tif (KTData.has(item as HTMLElement, 'popper')) {\n\t\t\t\t\t(\n\t\t\t\t\t\tKTData.get(item as HTMLElement, 'popper') as PopperInstance\n\t\t\t\t\t).forceUpdate();\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tpublic static hide(skipElement?: HTMLElement): void {\n\t\tdocument\n\t\t\t.querySelectorAll(\n\t\t\t\t'.open[data-kt-dropdown-initialized]:not([data-kt-dropdown-permanent=\"true\"])',\n\t\t\t)\n\t\t\t.forEach((item) => {\n\t\t\t\tif (skipElement && (skipElement === item || item.contains(skipElement)))\n\t\t\t\t\treturn;\n\n\t\t\t\tconst dropdown = KTDropdown.getInstance(item as HTMLElement);\n\t\t\t\tif (dropdown) dropdown.hide();\n\t\t\t});\n\t}\n\n\tpublic static handleClickAway(): void {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tdocument\n\t\t\t\t.querySelectorAll(\n\t\t\t\t\t'.open[data-kt-dropdown-initialized]:not([data-kt-dropdown-permanent=\"true\"])',\n\t\t\t\t)\n\t\t\t\t.forEach((element) => {\n\t\t\t\t\tconst dropdown = KTDropdown.getInstance(element as HTMLElement);\n\t\t\t\t\tif (!dropdown) return;\n\n\t\t\t\t\tconst contentElement = dropdown.getContentElement();\n\t\t\t\t\tconst toggleElement = dropdown.getToggleElement();\n\n\t\t\t\t\tif (\n\t\t\t\t\t\ttoggleElement === event.target ||\n\t\t\t\t\t\ttoggleElement.contains(event.target as HTMLElement) ||\n\t\t\t\t\t\tcontentElement === event.target ||\n\t\t\t\t\t\tcontentElement.contains(event.target as HTMLElement)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdropdown.hide();\n\t\t\t\t});\n\t\t});\n\t}\n\n\tpublic static handleKeyboard(): void {\n\t\tdocument.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst dropdownEl = document.querySelector(\n\t\t\t\t'.open[data-kt-dropdown-initialized]',\n\t\t\t);\n\t\t\tconst dropdown = KTDropdown.getInstance(dropdownEl as HTMLElement);\n\t\t\tif (!dropdown || !dropdown._getOption('keyboard')) return;\n\n\t\t\tif (\n\t\t\t\tevent.key === 'Escape' &&\n\t\t\t\t!(event.ctrlKey || event.altKey || event.shiftKey)\n\t\t\t) {\n\t\t\t\tdropdown.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleMouseover(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-toggle], [data-kt-dropdown-menu]',\n\t\t\t'mouseover',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown && dropdown._getOption('trigger') === 'hover') {\n\t\t\t\t\tdropdown.mouseover(event as MouseEvent);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleMouseout(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-toggle], [data-kt-dropdown-menu]',\n\t\t\t'mouseout',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown && dropdown._getOption('trigger') === 'hover') {\n\t\t\t\t\tdropdown.mouseout(event as MouseEvent);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleClick(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown) {\n\t\t\t\t\tdropdown.click(event);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleDismiss(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-dismiss]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown) {\n\t\t\t\t\tdropdown.hide();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static initHandlers(): void {\n\t\tthis.handleClickAway();\n\t\tthis.handleKeyboard();\n\t\tthis.handleMouseover();\n\t\tthis.handleMouseout();\n\t\tthis.handleClick();\n\t\tthis.handleDismiss();\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-dropdown]');\n\t\telements.forEach((element) => {\n\t\t\tnew KTDropdown(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTDropdown.createInstances();\n\n\t\tif (window.KT_DROPDOWN_INITIALIZED !== true) {\n\t\t\tKTDropdown.initHandlers();\n\t\t\twindow.KT_DROPDOWN_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTDropdown = KTDropdown;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTDropdown } from './dropdown';\nexport type { KTDropdownConfigInterface, KTDropdownInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTImageInputInterface, KTImageInputConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_IMAGE_INPUT_INITIALIZED: boolean;\n\t\tKTImageInput: typeof KTImageInput;\n\t}\n}\n\nexport class KTImageInput extends KTComponent implements KTImageInputInterface {\n\tprotected override _name: string = 'image-input';\n\tprotected override _defaultConfig: KTImageInputConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t};\n\tprotected _inputElement: HTMLInputElement;\n\tprotected _hiddenElement: HTMLInputElement;\n\tprotected _removeElement: HTMLElement;\n\tprotected _previewElement: HTMLElement;\n\tprotected _previewUrl: string = '';\n\tprotected _lastMode: string;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTImageInputConfigInterface = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._inputElement = this._element.querySelector('input[type=\"file\"]');\n\t\tthis._hiddenElement = this._element.querySelector('input[type=\"hidden\"]');\n\t\tthis._removeElement = this._element.querySelector(\n\t\t\t'[data-kt-image-input-remove]',\n\t\t);\n\t\tthis._previewElement = this._element.querySelector(\n\t\t\t'[data-kt-image-input-preview]',\n\t\t);\n\n\t\tthis._update();\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-image-input-placeholder]',\n\t\t\t'click',\n\t\t\t(event: Event) => {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tthis._inputElement.click();\n\t\t\t},\n\t\t);\n\n\t\tthis._inputElement.addEventListener('change', () => {\n\t\t\tthis._change();\n\t\t});\n\n\t\tthis._removeElement.addEventListener('click', () => {\n\t\t\tthis._remove();\n\t\t});\n\t}\n\n\tprotected _change(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('change', payload);\n\t\tthis._dispatchEvent('change', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst reader = new FileReader();\n\n\t\treader.onload = () => {\n\t\t\tthis._previewElement.style.backgroundImage = `url(${reader.result})`;\n\t\t};\n\n\t\treader.readAsDataURL(this._inputElement.files[0]);\n\t\tthis._inputElement.value = '';\n\t\tthis._hiddenElement.value = '';\n\t\tthis._lastMode = 'new';\n\n\t\tthis._element.classList.add('changed');\n\t\tthis._removeElement.classList.remove('hidden');\n\t\tthis._element.classList.remove('empty');\n\n\t\tthis._fireEvent('changed');\n\t\tthis._dispatchEvent('changed');\n\t}\n\n\tprotected _remove(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('remove', payload);\n\t\tthis._dispatchEvent('remove', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element.classList.remove('empty');\n\t\tthis._element.classList.remove('changed');\n\n\t\tif (this._lastMode == 'new') {\n\t\t\tif (this._previewUrl == '')\n\t\t\t\tthis._removeElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\n\t\t\tif (this._previewUrl) {\n\t\t\t\tthis._previewElement.style.backgroundImage = `url(${this._previewUrl})`;\n\t\t\t} else {\n\t\t\t\tthis._previewElement.style.backgroundImage = 'none';\n\t\t\t\tthis._element.classList.add('empty');\n\t\t\t}\n\n\t\t\tthis._inputElement.value = '';\n\t\t\tthis._hiddenElement.value = '';\n\n\t\t\tthis._lastMode = 'saved';\n\t\t} else if (this._lastMode == 'saved') {\n\t\t\tif (this._previewUrl == '')\n\t\t\t\tthis._removeElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\n\t\t\tthis._previewElement.style.backgroundImage = 'none';\n\t\t\tthis._element.classList.add('empty');\n\n\t\t\tthis._hiddenElement.value = '1';\n\t\t\tthis._inputElement.value = '';\n\n\t\t\tthis._lastMode = 'placeholder';\n\t\t} else if (this._lastMode == 'placeholder') {\n\t\t\tif (this._previewUrl == '')\n\t\t\t\tthis._removeElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\n\t\t\tif (this._previewUrl) {\n\t\t\t\tthis._previewElement.style.backgroundImage = `url(${this._previewUrl})`;\n\t\t\t} else {\n\t\t\t\tthis._element.classList.add('empty');\n\t\t\t}\n\n\t\t\tthis._inputElement.value = '';\n\t\t\tthis._hiddenElement.value = '';\n\n\t\t\tthis._lastMode = 'saved';\n\t\t}\n\n\t\tthis._fireEvent('remove');\n\t\tthis._dispatchEvent('remove');\n\t}\n\n\tprotected _update() {\n\t\tif (this._previewElement.style.backgroundImage) {\n\t\t\tthis._setPreviewUrl(this._previewElement.style.backgroundImage);\n\t\t\tthis._removeElement.classList.remove(\n\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t);\n\t\t\tthis._lastMode = 'saved';\n\t\t} else {\n\t\t\tthis._removeElement.classList.add(\n\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t);\n\t\t\tthis._element.classList.add('empty');\n\t\t\tthis._lastMode = 'placeholder';\n\t\t}\n\t}\n\n\tprotected _getPreviewUrl(): string {\n\t\treturn this._previewUrl;\n\t}\n\n\tprotected _setPreviewUrl(url: string): void {\n\t\tthis._previewUrl = url.replace(/(url\\(|\\)|\")/g, '');\n\t}\n\n\tpublic isEmpty(): boolean {\n\t\treturn this._inputElement.value.length === 0;\n\t}\n\n\tpublic isChanged(): boolean {\n\t\treturn this._inputElement.value.length > 0;\n\t}\n\n\tpublic remove(): void {\n\t\tthis._remove();\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic setPreviewUrl(url: string): void {\n\t\tthis._setPreviewUrl(url);\n\t}\n\n\tpublic getPreviewUrl(): string {\n\t\treturn this._getPreviewUrl();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTImageInput {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'image-input')) {\n\t\t\treturn KTData.get(element, 'image-input') as KTImageInput;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-image-input')) {\n\t\t\treturn new KTImageInput(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTImageInputConfigInterface,\n\t): KTImageInput {\n\t\treturn this.getInstance(element) || new KTImageInput(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-image-input]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTImageInput(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTImageInput.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTImageInput = KTImageInput;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTImageInput } from './image-input';\nexport type {\n\tKTImageInputConfigInterface,\n\tKTImageInputInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTModal } from './modal';\nexport type { KTModalConfigInterface, KTModalInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTModalInterface, KTModalConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_MODAL_INITIALIZED: boolean;\n\t\tKTModal: typeof KTModal;\n\t}\n}\n\nexport class KTModal extends KTComponent implements KTModalInterface {\n\tprotected override _name: string = 'modal';\n\tprotected override _defaultConfig: KTModalConfigInterface = {\n\t\tzindex: '90',\n\t\tbackdrop: true,\n\t\tbackdropClass: 'kt-modal-backdrop',\n\t\tbackdropStatic: false,\n\t\tkeyboard: true,\n\t\tdisableScroll: true,\n\t\tpersistent: false,\n\t\tfocus: true,\n\t\thiddenClass: 'hidden',\n\t};\n\tprotected override _config: KTModalConfigInterface = this._defaultConfig;\n\tprotected _isOpen: boolean = false;\n\tprotected _isTransitioning: boolean = false;\n\tprotected _backdropElement: HTMLElement | null = null;\n\tprotected _targetElement: HTMLElement | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTModalConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers() {\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tif (this._element !== event.target) return;\n\n\t\t\tif (this._getOption('backdropStatic') === false) {\n\t\t\t\tthis._hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _toggle(targetElement?: HTMLElement): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen === true) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show(targetElement);\n\t\t}\n\t}\n\n\tprotected _show(targetElement?: HTMLElement): void {\n\t\tif (this._isOpen || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\t//const beforeScroll = this.fireEvent('beforeScroll', this.el);\n\t\t//this.dispatch('beforeScroll.hs.scrollspy', this.el, this.el);\n\t\t//if (beforeScroll instanceof Promise) beforeScroll.then(() => scrollFn());\n\t\t//else scrollFn();\n\n\t\tif (targetElement) this._targetElement = targetElement;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tKTModal.hide();\n\n\t\tif (!this._element) return;\n\t\tthis._isTransitioning = true;\n\t\tthis._element.setAttribute('role', 'dialog');\n\t\tthis._element.setAttribute('aria-modal', 'true');\n\t\tthis._element.setAttribute('tabindex', '-1');\n\n\t\tthis._setZindex();\n\t\tif (this._getOption('backdrop') === true) this._createBackdrop();\n\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = 'hidden';\n\t\t}\n\n\t\tthis._element.style.display = 'block';\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.add('open');\n\t\tthis._element.classList.remove(this._getOption('hiddenClass') as string);\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\tif (this._getOption('focus') === true) {\n\t\t\t\tthis._autoFocus();\n\t\t\t}\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(): void {\n\t\tif (!this._element) return;\n\t\tif (this._isOpen === false || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isTransitioning = true;\n\t\tthis._element.removeAttribute('role');\n\t\tthis._element.removeAttribute('aria-modal');\n\t\tthis._element.removeAttribute('tabindex');\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = '';\n\t\t}\n\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.remove('open');\n\n\t\tif (this._getOption('backdrop') === true) {\n\t\t\tthis._deleteBackdrop();\n\t\t}\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tif (!this._element) return;\n\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\t\t\tthis._element.style.display = '';\n\t\t\tthis._element.classList.add(this._getOption('hiddenClass') as string);\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _setZindex(): void {\n\t\tlet zindex: number = parseInt(this._getOption('zindex') as string);\n\n\t\tif (parseInt(KTDom.getCssProp(this._element, 'z-index')) > zindex) {\n\t\t\tzindex = parseInt(KTDom.getCssProp(this._element, 'z-index'));\n\t\t}\n\n\t\tif (KTDom.getHighestZindex(this._element) > zindex) {\n\t\t\tzindex = KTDom.getHighestZindex(this._element) + 1;\n\t\t}\n\n\t\tthis._element.style.zIndex = String(zindex);\n\t}\n\n\tprotected _autoFocus(): void {\n\t\tif (!this._element) return;\n\t\tconst input: HTMLInputElement | null = this._element.querySelector(\n\t\t\t'[data-kt-modal-input-focus]',\n\t\t);\n\t\tif (!input) return;\n\t\telse input.focus();\n\t}\n\n\tprotected _createBackdrop(): void {\n\t\tif (!this._element) return;\n\t\tconst zindex: number = parseInt(KTDom.getCssProp(this._element, 'z-index'));\n\t\tthis._backdropElement = document.createElement('DIV');\n\t\tthis._backdropElement.setAttribute('data-kt-modal-backdrop', 'true');\n\t\tthis._backdropElement.style.zIndex = (zindex - 1).toString();\n\t\tdocument.body.append(this._backdropElement);\n\t\tKTDom.reflow(this._backdropElement);\n\t\tKTDom.addClass(\n\t\t\tthis._backdropElement,\n\t\t\tthis._getOption('backdropClass') as string,\n\t\t);\n\t}\n\n\tprotected _deleteBackdrop(): void {\n\t\tif (!this._backdropElement) return;\n\n\t\tKTDom.reflow(this._backdropElement);\n\t\tthis._backdropElement.style.opacity = '0';\n\n\t\tKTDom.transitionEnd(this._backdropElement, () => {\n\t\t\tif (!this._backdropElement) return;\n\t\t\tKTDom.remove(this._backdropElement);\n\t\t});\n\t}\n\n\tpublic toggle(targetElement?: HTMLElement): void {\n\t\treturn this._toggle(targetElement);\n\t}\n\n\tpublic show(targetElement?: HTMLElement): void {\n\t\treturn this._show(targetElement);\n\t}\n\n\tpublic hide(): void {\n\t\treturn this._hide();\n\t}\n\n\tpublic getTargetElement(): HTMLElement | null {\n\t\treturn this._targetElement;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTModal {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'modal')) {\n\t\t\treturn KTData.get(element, 'modal') as KTModal;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-modal')) {\n\t\t\treturn new KTModal(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTModalConfigInterface,\n\t): KTModal {\n\t\treturn this.getInstance(element) || new KTModal(element, config);\n\t}\n\n\tpublic static hide(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-modal-initialized]');\n\n\t\telements.forEach((element) => {\n\t\t\tconst modal = KTModal.getInstance(element as HTMLElement);\n\n\t\t\tif (modal && modal.isOpen()) {\n\t\t\t\tmodal.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleToggle(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-modal-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst selector = target.getAttribute('data-kt-modal-toggle');\n\t\t\t\tif (!selector) return;\n\n\t\t\t\tconst modalElement = document.querySelector(selector);\n\t\t\t\tconst modal = KTModal.getInstance(modalElement as HTMLElement);\n\t\t\t\tif (modal) {\n\t\t\t\t\tmodal.toggle(target);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleDismiss(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-modal-dismiss]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst modalElement = target.closest(\n\t\t\t\t\t'[data-kt-modal-initialized]',\n\t\t\t\t) as HTMLElement;\n\t\t\t\tif (modalElement) {\n\t\t\t\t\tconst modal = KTModal.getInstance(modalElement);\n\t\t\t\t\tif (modal) {\n\t\t\t\t\t\tmodal.hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleClickAway() {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tconst modalElement = document.querySelector(\n\t\t\t\t'.open[data-kt-modal-initialized]',\n\t\t\t);\n\t\t\tif (!modalElement) return;\n\n\t\t\tconst modal = KTModal.getInstance(modalElement as HTMLElement);\n\t\t\tif (!modal) return;\n\n\t\t\tif (KTUtils.stringToBoolean(modal.getOption('persistent')) === true)\n\t\t\t\treturn;\n\n\t\t\tif (KTUtils.stringToBoolean(modal.getOption('backdrop')) === true) return;\n\n\t\t\tif (\n\t\t\t\tmodalElement !== event.target &&\n\t\t\t\tmodal.getTargetElement() !== event.target &&\n\t\t\t\tmodalElement.contains(event.target as HTMLElement) === false\n\t\t\t) {\n\t\t\t\tmodal.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleKeyword() {\n\t\tdocument.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst modalElement = document.querySelector(\n\t\t\t\t'.open[data-kt-modal-initialized]',\n\t\t\t);\n\t\t\tconst modal = KTModal.getInstance(modalElement as HTMLElement);\n\t\t\tif (!modal) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// if esc key was not pressed in combination with ctrl or alt or shift\n\t\t\tif (\n\t\t\t\tevent.key === 'Escape' &&\n\t\t\t\t!(event.ctrlKey || event.altKey || event.shiftKey)\n\t\t\t) {\n\t\t\t\tmodal.hide();\n\t\t\t}\n\n\t\t\tif (event.code === 'Tab' && !event.metaKey) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-modal]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTModal(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTModal.createInstances();\n\n\t\tif (window.KT_MODAL_INITIALIZED !== true) {\n\t\t\tKTModal.handleToggle();\n\t\t\tKTModal.handleDismiss();\n\t\t\tKTModal.handleClickAway();\n\t\t\tKTModal.handleKeyword();\n\t\t\twindow.KT_MODAL_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTModal = KTModal;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTReparent } from './reparent';\nexport type { KTReparentConfigInterface, KTReparentInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTReparentInterface, KTReparentConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_REPARENT_INITIALIZED: boolean;\n\t\tKTReparent: typeof KTReparent;\n\t}\n}\n\nexport class KTReparent extends KTComponent implements KTReparentInterface {\n\tprotected override _name: string = 'reparent';\n\tprotected override _defaultConfig: KTReparentConfigInterface = {\n\t\tmode: '',\n\t\ttarget: '',\n\t};\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTReparentConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._update();\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._element) return;\n\t\tconst target = this._getOption('target') as string;\n\t\tconst targetEl = KTDom.getElement(target);\n\t\tconst mode = this._getOption('mode');\n\n\t\tif (targetEl && this._element.parentNode !== targetEl) {\n\t\t\tif (mode === 'prepend') {\n\t\t\t\ttargetEl.prepend(this._element);\n\t\t\t} else if (mode === 'append') {\n\t\t\t\ttargetEl.append(this._element);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic static handleResize(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\t() => {\n\t\t\t\t\tdocument\n\t\t\t\t\t\t.querySelectorAll('[data-kt-reparent-initialized]')\n\t\t\t\t\t\t.forEach((element) => {\n\t\t\t\t\t\t\tconst reparent = KTReparent.getInstance(element as HTMLElement);\n\t\t\t\t\t\t\tconsole.log('reparent update');\n\t\t\t\t\t\t\treparent?.update();\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTReparent {\n\t\treturn KTData.get(element, 'reparent') as KTReparent;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTReparentConfigInterface,\n\t): KTReparent {\n\t\treturn this.getInstance(element) || new KTReparent(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-reparent]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTReparent(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTReparent.createInstances();\n\n\t\tif (window.KT_REPARENT_INITIALIZED !== true) {\n\t\t\tKTReparent.handleResize();\n\t\t\twindow.KT_REPARENT_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTReparent = KTReparent;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTScrollable } from './scrollable';\nexport type {\n\tKTScrollableConfigInterface,\n\tKTScrollableInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTScrollableInterface, KTScrollableConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_SCROLLABLE_INITIALIZED: boolean;\n\t\tKTScrollable: typeof KTScrollable;\n\t}\n}\n\nexport class KTScrollable extends KTComponent implements KTScrollableInterface {\n\tprotected override _name: string = 'scrollable';\n\tprotected override _defaultConfig: KTScrollableConfigInterface = {\n\t\tsave: true,\n\t\tdependencies: '',\n\t\twrappers: '',\n\t\toffset: '',\n\t};\n\tprotected override _config: KTScrollableConfigInterface = this._defaultConfig;\n\tprotected _elementId: string | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTScrollableConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\t\tthis._elementId = this._element.getAttribute('id');\n\t\tthis._handlers();\n\t\tthis._update();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\t\tthis._element.addEventListener('scroll', () => {\n\t\t\tif (!this._element) return;\n\t\t\tlocalStorage.setItem(\n\t\t\t\t`${this._elementId}st`,\n\t\t\t\tthis._element.scrollTop.toString(),\n\t\t\t);\n\t\t});\n\t}\n\n\tprotected _update(): void {\n\t\tthis._setupHeight();\n\t\tthis._setupState();\n\t}\n\n\tprotected _setupHeight(): void {\n\t\tif (!this._element) return;\n\n\t\tconst heightType = this._getHeightType();\n\t\tconst height = this._getHeight();\n\n\t\t// Set height\n\t\tif (height && height != '0' && height.length > 0) {\n\t\t\tthis._element.style.setProperty(heightType, height);\n\t\t} else {\n\t\t\tthis._element.style.setProperty(heightType, '');\n\t\t}\n\t}\n\n\tprotected _setupState(): void {\n\t\tif (!this._element) return;\n\t\tconst stateEnabled = this._getOption('state') === true;\n\t\tconst elementIdExists = Boolean(this._elementId);\n\n\t\tif (stateEnabled && elementIdExists) {\n\t\t\tconst storedPosition = localStorage.getItem(this._elementId + 'st');\n\n\t\t\tif (storedPosition) {\n\t\t\t\tconst pos = parseInt(storedPosition);\n\n\t\t\t\tif (pos > 0) {\n\t\t\t\t\tthis._element.scroll({\n\t\t\t\t\t\ttop: pos,\n\t\t\t\t\t\tbehavior: 'instant',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _getHeight(): string {\n\t\tconst height = this._getHeightOption();\n\n\t\tif (\n\t\t\theight !== null &&\n\t\t\ttypeof height === 'string' &&\n\t\t\theight.toLowerCase() === 'auto'\n\t\t) {\n\t\t\treturn this._getAutoHeight();\n\t\t} else if (height) {\n\t\t\treturn parseInt(height).toString() + 'px';\n\t\t} else {\n\t\t\treturn '0';\n\t\t}\n\t}\n\n\tprotected _getAutoHeight(): string {\n\t\tif (!this._element) return '';\n\t\tlet height = KTDom.getViewPort().height;\n\t\tconst dependencies = this._getOption('dependencies') as string;\n\t\tconst wrappers = this._getOption('wrappers') as string;\n\t\tconst offset = this._getOption('offset') as string;\n\t\theight -= this._getElementSpacing(this._element);\n\n\t\tif (dependencies && dependencies.length > 0) {\n\t\t\tconst elements = document.querySelectorAll(dependencies);\n\t\t\telements.forEach((element) => {\n\t\t\t\tif (KTDom.getCssProp(element as HTMLElement, 'display') === 'none') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\theight -= this._getElementHeight(element as HTMLElement);\n\t\t\t});\n\t\t}\n\n\t\tif (wrappers && wrappers.length > 0) {\n\t\t\tconst elements = document.querySelectorAll(wrappers);\n\t\t\telements.forEach((element) => {\n\t\t\t\tif (KTDom.getCssProp(element as HTMLElement, 'display') === 'none') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\theight -= this._getElementSpacing(element as HTMLElement);\n\t\t\t});\n\t\t}\n\n\t\tif (offset && offset.length > 0) {\n\t\t\theight -= parseInt(offset);\n\t\t}\n\n\t\treturn height.toString() + 'px';\n\t}\n\n\tprotected _getElementHeight(element: HTMLElement): number {\n\t\tlet height = 0;\n\n\t\tif (!element) {\n\t\t\treturn height;\n\t\t}\n\n\t\tconst computedStyle = window.getComputedStyle(element);\n\t\tif (computedStyle.height) {\n\t\t\theight += parseInt(computedStyle.height);\n\t\t}\n\t\tif (computedStyle.marginTop) {\n\t\t\theight += parseInt(computedStyle.marginTop);\n\t\t}\n\t\tif (computedStyle.marginBottom) {\n\t\t\theight += parseInt(computedStyle.marginBottom);\n\t\t}\n\t\tif (computedStyle.borderTopWidth) {\n\t\t\theight += parseInt(computedStyle.borderTopWidth);\n\t\t}\n\t\tif (computedStyle.borderBottomWidth) {\n\t\t\theight += parseInt(computedStyle.borderBottomWidth);\n\t\t}\n\n\t\treturn height;\n\t}\n\n\tprotected _getElementSpacing(element: HTMLElement): number {\n\t\tlet spacing: number = 0;\n\n\t\tif (!element) {\n\t\t\treturn spacing;\n\t\t}\n\n\t\tconst computedStyle = window.getComputedStyle(element);\n\t\tif (computedStyle.marginTop) {\n\t\t\tspacing += parseInt(computedStyle.marginTop);\n\t\t}\n\t\tif (computedStyle.marginBottom) {\n\t\t\tspacing += parseInt(computedStyle.marginBottom);\n\t\t}\n\t\tif (computedStyle.paddingTop) {\n\t\t\tspacing += parseInt(computedStyle.paddingTop);\n\t\t}\n\t\tif (computedStyle.paddingBottom) {\n\t\t\tspacing += parseInt(computedStyle.paddingBottom);\n\t\t}\n\t\tif (computedStyle.borderTopWidth) {\n\t\t\tspacing += parseInt(computedStyle.borderTopWidth);\n\t\t}\n\t\tif (computedStyle.borderBottomWidth) {\n\t\t\tspacing += parseInt(computedStyle.borderBottomWidth);\n\t\t}\n\n\t\treturn spacing;\n\t}\n\n\tprotected _getHeightType(): string {\n\t\tif (this._getOption('minHeight')) {\n\t\t\treturn 'min-height';\n\t\t}\n\t\tif (this._getOption('maxHeight')) {\n\t\t\treturn 'max-height';\n\t\t} else {\n\t\t\treturn 'height';\n\t\t}\n\t}\n\n\tprotected _getHeightOption(): string {\n\t\tconst heightType = this._getHeightType();\n\n\t\tif (heightType == 'min-height') {\n\t\t\treturn this._getOption('minHeight') as string;\n\t\t}\n\t\tif (heightType == 'max-height') {\n\t\t\treturn this._getOption('maxHeight') as string;\n\t\t} else {\n\t\t\treturn this._getOption('height') as string;\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\treturn this._update();\n\t}\n\n\tpublic getHeight(): string {\n\t\treturn this._getHeight();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTScrollable {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'scrollable')) {\n\t\t\treturn KTData.get(element, 'scrollable') as KTScrollable;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-scrollable')) {\n\t\t\treturn new KTScrollable(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTScrollableConfigInterface,\n\t): KTScrollable {\n\t\treturn this.getInstance(element) || new KTScrollable(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-scrollable]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTScrollable(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static handleResize(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\tfunction () {\n\t\t\t\t\t// Locate and update scrollable instances on window resize\n\t\t\t\t\tconst elements = document.querySelectorAll(\n\t\t\t\t\t\t'[data-kt-scrollable-initialized]',\n\t\t\t\t\t);\n\t\t\t\t\telements.forEach((element) => {\n\t\t\t\t\t\tKTScrollable.getInstance(element as HTMLElement)?.update();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTScrollable.createInstances();\n\n\t\tif (window.KT_SCROLLABLE_INITIALIZED !== true) {\n\t\t\tKTScrollable.handleResize();\n\n\t\t\twindow.KT_SCROLLABLE_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTScrollable = KTScrollable;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTScrollspy } from './scrollspy';\nexport type { KTScrollspyConfigInterface, KTScrollspyInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTScrollspyInterface, KTScrollspyConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_SCROLLSPY_INITIALIZED: boolean;\n\t\tKTScrollspy: typeof KTScrollspy;\n\t}\n}\n\nexport class KTScrollspy extends KTComponent implements KTScrollspyInterface {\n\tprotected override _name: string = 'scrollspy';\n\tprotected override _defaultConfig: KTScrollspyConfigInterface = {\n\t\ttarget: 'body',\n\t\toffset: 0,\n\t\tsmooth: true,\n\t};\n\tprotected override _config: KTScrollspyConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement | Document | null = null;\n\tprotected _anchorElements: NodeListOf<HTMLElement> | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTScrollspyConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\n\t\tconst targetElement =\n\t\t\tthis._getTarget() === 'body'\n\t\t\t\t? document\n\t\t\t\t: KTDom.getElement(this._getTarget());\n\t\tif (!targetElement) return;\n\n\t\tthis._targetElement = targetElement;\n\n\t\tthis._anchorElements = this._element.querySelectorAll(\n\t\t\t'[data-kt-scrollspy-anchor]',\n\t\t);\n\n\t\tif (!this._anchorElements) return;\n\n\t\tthis._handlers();\n\t\tthis._update();\n\t}\n\n\tprivate _getTarget(): string {\n\t\treturn (\n\t\t\t(this._element.getAttribute('data-kt-scrollspy-target') as string) ||\n\t\t\t(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._anchorElements) return;\n\n\t\tthis._targetElement.addEventListener('scroll', () => {\n\t\t\tthis._anchorElements.forEach((anchorElement) => {\n\t\t\t\tthis._updateAnchor(anchorElement);\n\t\t\t});\n\t\t});\n\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-scrollspy-anchor]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._scrollTo(target);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _scrollTo(anchorElement: HTMLElement): void {\n\t\tif (!anchorElement) return;\n\n\t\tconst sectionElement = KTDom.getElement(anchorElement.getAttribute('href'));\n\t\tif (!sectionElement) return;\n\n\t\tconst targetElement =\n\t\t\tthis._targetElement === document ? window : this._targetElement;\n\t\tif (!targetElement) return;\n\n\t\tlet offset = parseInt(this._getOption('offset') as string);\n\t\tif (anchorElement.getAttribute('data-kt-scrollspy-anchor-offset')) {\n\t\t\toffset = parseInt(\n\t\t\t\tanchorElement.getAttribute('data-kt-scrollspy-anchor-offset') as string,\n\t\t\t);\n\t\t}\n\n\t\tconst scrollTop = sectionElement.offsetTop - offset;\n\n\t\tif ('scrollTo' in targetElement) {\n\t\t\ttargetElement.scrollTo({\n\t\t\t\ttop: scrollTop,\n\t\t\t\tleft: 0,\n\t\t\t\tbehavior: this._getOption('smooth') ? 'smooth' : 'instant',\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _updateAnchor(anchorElement: HTMLElement): void {\n\t\tconst sectionElement = KTDom.getElement(anchorElement.getAttribute('href'));\n\t\tif (!sectionElement) return;\n\n\t\tif (!KTDom.isVisible(anchorElement)) return;\n\n\t\tif (!this._anchorElements) return;\n\n\t\tconst scrollPosition =\n\t\t\tthis._targetElement === document\n\t\t\t\t? document.documentElement.scrollTop || document.body.scrollTop\n\t\t\t\t: (this._targetElement as HTMLElement).scrollTop;\n\n\t\tlet offset = parseInt(this._getOption('offset') as string);\n\t\tif (anchorElement.getAttribute('data-kt-scrollspy-anchor-offset')) {\n\t\t\toffset = parseInt(\n\t\t\t\tanchorElement.getAttribute('data-kt-scrollspy-anchor-offset') as string,\n\t\t\t);\n\t\t}\n\n\t\tconst offsetTop = sectionElement.offsetTop;\n\n\t\tif (scrollPosition + offset >= offsetTop) {\n\t\t\tthis._anchorElements.forEach((anchorElement) => {\n\t\t\t\tanchorElement.classList.remove('active');\n\t\t\t});\n\n\t\t\tconst payload = { element: anchorElement };\n\t\t\tthis._fireEvent('activate', payload);\n\t\t\tthis._dispatchEvent('activate', payload);\n\n\t\t\tanchorElement.classList.add('active');\n\n\t\t\tconst parentAnchorElements = KTDom.parents(\n\t\t\t\tanchorElement,\n\t\t\t\t'[data-kt-scrollspy-group]',\n\t\t\t);\n\t\t\tif (parentAnchorElements) {\n\t\t\t\tparentAnchorElements.forEach((parentAnchorElement) => {\n\t\t\t\t\tparentAnchorElement\n\t\t\t\t\t\t.querySelector('[data-kt-scrollspy-anchor]')\n\t\t\t\t\t\t?.classList.add('active');\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _update() {\n\t\tif (!this._anchorElements) return;\n\n\t\tthis._anchorElements.forEach((anchorElement) => {\n\t\t\tthis._updateAnchor(anchorElement);\n\t\t});\n\t}\n\n\tprotected _isActive(anchorElement: HTMLElement): boolean {\n\t\treturn anchorElement.classList.contains('active');\n\t}\n\n\tpublic updateAnchor(anchorElement: HTMLElement): void {\n\t\tthis._updateAnchor(anchorElement);\n\t}\n\n\tpublic isActive(anchorElement: HTMLElement): boolean {\n\t\treturn this._isActive(anchorElement);\n\t}\n\n\tpublic update(): void {\n\t\tthis.update();\n\t}\n\n\tpublic scrollTo(anchorElement: HTMLElement): void {\n\t\tthis._scrollTo(anchorElement);\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTScrollspy {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'scrollspy')) {\n\t\t\treturn KTData.get(element, 'scrollspy') as KTScrollspy;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-scrollspy')) {\n\t\t\treturn new KTScrollspy(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTScrollspyConfigInterface,\n\t): KTScrollspy {\n\t\treturn this.getInstance(element) || new KTScrollspy(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-scrollspy]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTScrollspy(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTScrollspy.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTScrollspy = KTScrollspy;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTScrollto } from './scrollto';\nexport type { KTScrolltoConfigInterface, KTScrolltoInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTScrolltoInterface, KTScrolltoConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_SCROLLTO_INITIALIZED: boolean;\n\t\tKTScrollto: typeof KTScrollto;\n\t}\n}\n\nexport class KTScrollto extends KTComponent implements KTScrolltoInterface {\n\tprotected override _name: string = 'scrollto';\n\tprotected override _defaultConfig: KTScrolltoConfigInterface = {\n\t\tsmooth: true,\n\t\tparent: 'body',\n\t\ttarget: '',\n\t\toffset: 0,\n\t};\n\tprotected override _config: KTScrolltoConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement;\n\n\tconstructor(element: HTMLElement, config?: KTScrolltoConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\n\t\tthis._targetElement = this._getTargetElement();\n\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-scrollto') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\t\t\tthis._scroll();\n\t\t});\n\t}\n\n\tprotected _scroll(): void {\n\t\tconst pos =\n\t\t\tthis._targetElement.offsetTop +\n\t\t\tparseInt(this._getOption('offset') as string);\n\n\t\tlet parent: HTMLElement | Window = KTDom.getElement(\n\t\t\tthis._getOption('parent') as string,\n\t\t);\n\n\t\tif (!parent || parent === document.body) {\n\t\t\tparent = window;\n\t\t}\n\n\t\tparent.scrollTo({\n\t\t\ttop: pos,\n\t\t\tbehavior: (this._getOption('smooth') as boolean) ? 'smooth' : 'instant',\n\t\t});\n\t}\n\n\tpublic scroll(): void {\n\t\tthis._scroll();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTScrollto {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'scrollto')) {\n\t\t\treturn KTData.get(element, 'scrollto') as KTScrollto;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-scrollto')) {\n\t\t\treturn new KTScrollto(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTScrolltoConfigInterface,\n\t): KTScrollto {\n\t\treturn this.getInstance(element) || new KTScrollto(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-scrollto]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTScrollto(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTScrollto.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTScrollto = KTScrollto;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { KTSelectConfigInterface } from './config';\nimport { KTSelect } from './select';\nimport { handleDropdownKeyNavigation } from './utils';\nimport { SelectMode } from './types';\n\n/**\n * KTSelectCombobox - Handles combobox-specific functionality for KTSelect\n */\nexport class KTSelectCombobox {\n\tprivate _select: KTSelect;\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _searchInputElement: HTMLInputElement;\n\tprivate _clearButtonElement: HTMLElement | null;\n\tprivate _boundKeyNavHandler: (event: KeyboardEvent) => void;\n\tprivate _boundInputHandler: (event: Event) => void;\n\tprivate _boundClearHandler: (event: MouseEvent) => void;\n\n\tconstructor(select: KTSelect) {\n\t\tthis._select = select;\n\t\tthis._config = select.getConfig();\n\n\t\t// Get the display element (could be the input directly or a parent div)\n\t\tconst displayElement = select.getValueDisplayElement();\n\n\t\t// Find the input element - either it's the display element itself or a child\n\t\tthis._searchInputElement =\n\t\t\tdisplayElement.tagName === 'INPUT'\n\t\t\t\t? (displayElement as HTMLInputElement)\n\t\t\t\t: displayElement.querySelector('input[data-kt-select-search]');\n\n\t\t// Find the clear button\n\t\tthis._clearButtonElement =\n\t\t\tdisplayElement.tagName === 'DIV'\n\t\t\t\t? displayElement.querySelector('[data-kt-select-clear-button]')\n\t\t\t\t: null;\n\n\t\t// Create bound handler references to allow proper cleanup\n\t\tthis._boundKeyNavHandler = this._handleComboboxKeyNav.bind(this);\n\t\tthis._boundInputHandler = this._handleComboboxInput.bind(this);\n\t\tthis._boundClearHandler = this._handleClearButtonClick.bind(this);\n\n\t\t// Attach event listeners\n\t\tthis._attachEventListeners();\n\n\t\tif (this._config.debug) console.log('KTSelectCombobox initialized');\n\t}\n\n\t/**\n\t * Attach event listeners specific to combobox\n\t */\n\tprivate _attachEventListeners(): void {\n\t\t// First remove any existing listeners to prevent duplicates\n\t\tthis._removeEventListeners();\n\n\t\t// Add input event handler to filter options as user types\n\t\tthis._searchInputElement.addEventListener('input', this._boundInputHandler);\n\n\t\t// Add keyboard navigation for the combobox\n\t\tthis._searchInputElement.addEventListener(\n\t\t\t'keydown',\n\t\t\tthis._boundKeyNavHandler,\n\t\t);\n\n\t\t// Add clear button click event listener\n\t\tif (this._clearButtonElement) {\n\t\t\tthis._clearButtonElement.addEventListener(\n\t\t\t\t'click',\n\t\t\t\tthis._boundClearHandler,\n\t\t\t);\n\t\t}\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log(\n\t\t\t\t'Combobox event listeners attached to:',\n\t\t\t\tthis._searchInputElement,\n\t\t\t);\n\t}\n\n\t/**\n\t * Remove event listeners to prevent memory leaks or duplicates\n\t */\n\tprivate _removeEventListeners(): void {\n\t\tif (this._searchInputElement) {\n\t\t\tthis._searchInputElement.removeEventListener(\n\t\t\t\t'input',\n\t\t\t\tthis._boundInputHandler,\n\t\t\t);\n\t\t\tthis._searchInputElement.removeEventListener(\n\t\t\t\t'keydown',\n\t\t\t\tthis._boundKeyNavHandler,\n\t\t\t);\n\t\t}\n\n\t\tif (this._clearButtonElement) {\n\t\t\tthis._clearButtonElement.removeEventListener(\n\t\t\t\t'click',\n\t\t\t\tthis._boundClearHandler,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handle combobox input events\n\t */\n\tprivate _handleComboboxInput(event: Event): void {\n\t\tconst inputElement = event.target as HTMLInputElement;\n\t\tconst query = inputElement.value.toLowerCase();\n\n\t\tif (this._config.debug) console.log('Combobox input event, query:', query);\n\n\t\t// Toggle clear button visibility based on input value\n\t\tthis._toggleClearButtonVisibility(query);\n\n\t\t// If dropdown isn't open, open it when user starts typing\n\t\tif (!(this._select as any)._dropdownIsOpen) {\n\t\t\tthis._select.openDropdown();\n\t\t}\n\n\t\t// Filter options based on input\n\t\tthis._filterOptionsForCombobox(query);\n\t}\n\n\t/**\n\t * Handle clear button click\n\t */\n\tprivate _handleClearButtonClick(event: MouseEvent): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\t// Clear the input\n\t\tthis._searchInputElement.value = '';\n\n\t\t// Hide the clear button\n\t\tthis._toggleClearButtonVisibility('');\n\n\t\t// Show all options and open dropdown\n\t\tthis._select.showAllOptions();\n\t\tthis._select.openDropdown();\n\n\t\t// Clear the current selection\n\t\tthis._select.clearSelection();\n\n\t\t// Focus on the input\n\t\tthis._searchInputElement.focus();\n\t}\n\n\t/**\n\t * Toggle clear button visibility based on input value\n\t */\n\tprivate _toggleClearButtonVisibility(value: string): void {\n\t\tif (!this._clearButtonElement) return;\n\n\t\tif (value.length > 0) {\n\t\t\tthis._clearButtonElement.classList.remove('hidden');\n\t\t} else {\n\t\t\tthis._clearButtonElement.classList.add('hidden');\n\t\t}\n\t}\n\n\t/**\n\t * Filter options for combobox based on input query\n\t */\n\tprivate _filterOptionsForCombobox(query: string): void {\n\t\t// Access the private method through type assertion\n\t\t(this._select as any)._filterOptionsForCombobox(query);\n\t}\n\n\t/**\n\t * Handle keyboard navigation in combobox mode\n\t */\n\tprivate _handleComboboxKeyNav(event: KeyboardEvent): void {\n\t\tif (this._config.debug) console.log('Combobox keydown event:', event.key);\n\n\t\t// Prevent event propagation to stop bubbling to other handlers\n\t\tevent.stopPropagation();\n\n\t\t// Handle clear with Escape when dropdown is closed\n\t\tif (\n\t\t\tevent.key === 'Escape' &&\n\t\t\t!(this._select as any)._dropdownIsOpen &&\n\t\t\tthis._searchInputElement.value !== ''\n\t\t) {\n\t\t\tevent.preventDefault();\n\t\t\tthis._searchInputElement.value = '';\n\t\t\tthis._toggleClearButtonVisibility('');\n\t\t\tthis._select.clearSelection();\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle dropdown visibility with special keys\n\t\tif (\n\t\t\t!(this._select as any)._dropdownIsOpen &&\n\t\t\t(event.key === 'ArrowDown' ||\n\t\t\t\tevent.key === 'ArrowUp' ||\n\t\t\t\tevent.key === 'Enter')\n\t\t) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log('Opening dropdown from keyboard in combobox');\n\t\t\tthis._select.openDropdown();\n\t\t\tevent.preventDefault();\n\n\t\t\t// If it's arrow keys, also move focus\n\t\t\tif (event.key === 'ArrowDown') {\n\t\t\t\t(this._select as any)._focusNextOption();\n\t\t\t} else if (event.key === 'ArrowUp') {\n\t\t\t\t(this._select as any)._focusPreviousOption();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Use the shared keyboard navigation handler\n\t\thandleDropdownKeyNavigation(event, this._select, {\n\t\t\tmultiple: this._config.multiple,\n\t\t\tcloseOnSelect: this._config.closeOnSelect,\n\t\t});\n\t}\n\n\t/**\n\t * Update the combobox input value when an option is selected\n\t */\n\tpublic updateSelectedValue(selectedText: string): void {\n\t\tif (this._searchInputElement) {\n\t\t\t// Extract just the text content if it contains HTML\n\t\t\tlet cleanText = selectedText;\n\n\t\t\t// If the text might contain HTML (when description is present)\n\t\t\tif (selectedText.includes('<') || selectedText.includes('>')) {\n\t\t\t\t// Create a temporary element to extract just the text\n\t\t\t\tconst tempDiv = document.createElement('div');\n\t\t\t\ttempDiv.innerHTML = selectedText;\n\n\t\t\t\t// Find and use only the option-title text if available\n\t\t\t\tconst titleElement = tempDiv.querySelector('[data-kt-option-title]');\n\t\t\t\tif (titleElement) {\n\t\t\t\t\tcleanText = titleElement.textContent || selectedText;\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback to all text content if option-title not found\n\t\t\t\t\tcleanText = tempDiv.textContent || selectedText;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the input value directly for immediate feedback\n\t\t\tthis._searchInputElement.value = cleanText;\n\n\t\t\t// Show the clear button if there's a value\n\t\t\tthis._toggleClearButtonVisibility(cleanText);\n\n\t\t\t// Trigger an input event to ensure any input-based listeners are notified\n\t\t\tconst inputEvent = new Event('input', { bubbles: true });\n\t\t\tthis._searchInputElement.dispatchEvent(inputEvent);\n\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log('Combobox value updated to:', cleanText);\n\t\t}\n\t}\n\n\t/**\n\t * Reset the input value to match the current selection\n\t * This can be called to sync the input with the current state\n\t */\n\tpublic resetInputValueToSelection(): void {\n\t\tconst selectedOptions = this._select.getSelectedOptions();\n\t\tif (selectedOptions.length > 0) {\n\t\t\tconst selectedOption = Array.from(this._select.getOptionsElement()).find(\n\t\t\t\t(opt) => opt.dataset.value === selectedOptions[0],\n\t\t\t) as HTMLElement;\n\n\t\t\tif (selectedOption) {\n\t\t\t\t// Find the option-title element to get just the title text\n\t\t\t\tconst titleElement = selectedOption.querySelector(\n\t\t\t\t\t'[data-kt-option-title]',\n\t\t\t\t);\n\t\t\t\tlet selectedText = '';\n\n\t\t\t\tif (titleElement) {\n\t\t\t\t\t// If it has a structured content with a title element\n\t\t\t\t\tselectedText = titleElement.textContent?.trim() || '';\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback to the whole text content\n\t\t\t\t\tselectedText = selectedOption.textContent?.trim() || '';\n\t\t\t\t}\n\n\t\t\t\tthis.updateSelectedValue(selectedText);\n\t\t\t}\n\t\t} else {\n\t\t\t// No selection, clear the input\n\t\t\tif (this._searchInputElement) {\n\t\t\t\tthis._searchInputElement.value = '';\n\t\t\t\tthis._toggleClearButtonVisibility('');\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Destroy the combobox component and clean up event listeners\n\t */\n\tpublic destroy(): void {\n\t\tthis._removeEventListeners();\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { SelectMode } from './types';\n\nexport const DefaultConfig: KTSelectConfigInterface = {\n\t// ...other config options\n\tloadMoreText: 'Load more...',\n\t// General Display\n\tdebug: false,\n\tplaceholder: 'Select an option', // Default placeholder text when no option is selected\n\tdropdownZindex: null, // Initial z-index value for the dropdown\n\n\t// Data Handling\n\titems: [], // Static list of options\n\tisLoading: false, // Indicates if options are being loaded asynchronously\n\tonFetch: null, // Callback function to fetch options asynchronously\n\n\t// Remote Data Configuration\n\tremote: false, // Enable/disable remote data fetching\n\tdataUrl: null, // URL to fetch options from\n\tapiDataProperty: null, // Property in the response object that contains the options\n\tremoteErrorMessage: 'Failed to load data', // Error message to display if remote data fetch fails\n\n\t// Field Mapping\n\tdataValueField: null, // Property in the option object that contains the value (default: 'id')\n\tdataFieldText: null, // Property in the option object that contains the text (default: 'title')\n\tdataFieldDescription: null, // Property in the option object that contains the description\n\tdataFieldIcon: null, // Property in the option object that contains the icon\n\tdataFieldIconWidth: null, // Property in the option object that contains the icon width\n\tdataFieldIconHeight: null, // Property in the option object that contains the icon height\n\n\t// Search Configuration\n\tsearchParam: '', // Query parameter for API search requests\n\tsearchDebounce: 300, // Debounce delay for search (in ms)\n\n\t// Pagination Configuration\n\tpagination: false, // Enable/disable pagination for remote data\n\tpaginationLimit: 10, // Items per page\n\tpaginationPageParam: 'page', // Parameter name for page number\n\tpaginationLimitParam: 'limit', // Parameter name for items per page\n\tpaginationTotalParam: 'total', // Parameter name for total items\n\n\t// Selection Behavior\n\tmultiple: false, // Enable/disable multi-select\n\tmaxSelections: null, // Maximum number of selections allowed in multi-select mode (null for unlimited)\n\tcloseOnSelect: true, // Close the dropdown after selecting an option (single-select only)\n\tdisabled: false, // Disable the select component\n\tisRequired: false, // Make selection required\n\tmode: null, // Select mode: tags or combobox\n\n\t// Search Functionality\n\tenableSearch: false, // Enable/disable search functionality within the dropdown\n\tsearchPlaceholder: 'Search...', // Placeholder text for the search input\n\tsearchAutofocus: true, // Autofocus on search input when dropdown opens\n\tsearchMinLength: 0, // Minimum characters required to trigger search\n\tsearchMaxItems: 50, // Maximum number of search results to display\n\tsearchNotFoundText: 'No results found', // Text to display when no search results are found\n\tsearchHighlight: true, // Highlight matching search terms within the options\n\tclearSearchOnClose: true, // Clear search input when dropdown closes\n\n\t// Multi-Select Display\n\tselectAllText: 'Select all', // Text for the \"Select All\" option (if implemented)\n\tclearAllText: 'Clear all', // Text for the \"Clear All\" option (if implemented)\n\tshowSelectedCount: true, // Show the number of selected options in multi-select mode\n\trenderSelected: null, // Custom function to render the selected value(s) in the display area\n\n\t// Accessibility & Usability\n\tlabel: 'Select an option', // Label for the select component (for screen readers)\n\theight: 250, // Maximum height of the dropdown menu in pixels (if exceeded, a scrollbar will appear)\n\n\t// Dropdown Configuration\n\tdropdownPlacement: null,\n\tdropdownFlip: false,\n\tdropdownPreventOverflow: false,\n\tdropdownStrategy: null,\n\tdropdownWidth: null, // Custom width for dropdown (e.g., '300px'), null to match toggle element width\n\n\t// Styling\n\tfocusClass: 'option-focused',\n\thoverClass: 'hovered',\n\tbgClass: 'bg-blue-50',\n\tfontClass: 'font-medium',\n};\n\nexport interface KTSelectConfigInterface {\n\t// ...other config options\n\tloadMoreText?: string;\n\t// General Display\n\tdebug?: boolean;\n\tplaceholder?: string;\n\tdropdownZindex?: number | null;\n\n\t// Selection Behavior\n\tmultiple?: boolean;\n\tmaxSelections?: number | null;\n\tcloseOnSelect?: boolean;\n\tdisabled?: boolean;\n\tisRequired?: boolean;\n\tmode?: SelectMode | null;\n\n\t// Search Functionality\n\tenableSearch?: boolean;\n\tsearchPlaceholder?: string;\n\tsearchAutofocus?: boolean;\n\tsearchMinLength?: number;\n\tsearchMaxItems?: number;\n\tsearchNotFoundText?: string;\n\tsearchHighlight?: boolean;\n\tsearchDebounce?: number;\n\tsearchParam?: string;\n\tclearSearchOnClose?: boolean;\n\n\t// Multi-Select Display\n\tselectAllText?: string;\n\tclearAllText?: string;\n\tshowSelectedCount?: boolean;\n\trenderSelected?: (selectedOptions: any[]) => string; // Assuming any[] for now, adjust based on your option data structure\n\n\t// Accessibility & Usability\n\tlabel?: string;\n\theight: number;\n\n\t// Data Handling\n\titems?: KTSelectOption[];\n\tisLoading?: boolean;\n\tonFetch?: (query?: string) => Promise<KTSelectOption[]>;\n\n\t// Remote Data Configuration\n\tremote?: boolean;\n\tdataUrl?: string;\n\tapiDataProperty?: string;\n\tremoteErrorMessage?: string;\n\n\t// Field Mapping\n\tdataValueField?: string;\n\tdataFieldText?: string;\n\tdataFieldDescription?: string;\n\tdataFieldIcon?: string;\n\tdataFieldIconWidth?: string;\n\tdataFieldIconHeight?: string;\n\n\t// Pagination Configuration\n\tpagination?: boolean;\n\tpaginationLimit?: number;\n\tpaginationPageParam?: string;\n\tpaginationLimitParam?: string;\n\tpaginationTotalParam?: string;\n\n\t// Dropdown Configuration\n\tdropdownPlacement?: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';\n\tdropdownFlip?: boolean;\n\tdropdownPreventOverflow?: boolean;\n\tdropdownStrategy?: 'fixed' | 'absolute';\n\tdropdownWidth?: string | null; // Custom width for dropdown, null to match toggle element width\n\n\t// Styling\n\tfocusClass?: string;\n\thoverClass?: string;\n\tbgClass?: string;\n\tfontClass?: string;\n}\n\nexport interface KTSelectOption {\n\tid: string;\n\ttitle: string;\n\ticon?: string;\n\tdescription?: string;\n\tselected?: boolean;\n}\n\nexport class KTSelectState {\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _selectedOptions: string[] = [];\n\n\tconstructor(config?: KTSelectConfigInterface) {\n\t\tthis._config = this._initDefaultConfig(config);\n\t}\n\n\tprivate _initDefaultConfig(\n\t\tconfig: KTSelectConfigInterface,\n\t): KTSelectConfigInterface {\n\t\treturn {\n\t\t\t...DefaultConfig,\n\t\t\t...config,\n\t\t};\n\t}\n\n\tpublic setItems(items?: any[], query?: string): Promise<void> {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tif (items) {\n\t\t\t\tthis._config.items = items;\n\t\t\t\tresolve();\n\t\t\t} else if (this._config.dataUrl) {\n\t\t\t\tthis._fetchRemoteData(query)\n\t\t\t\t\t.then(resolve) // Resolve after _fetchRemoteData completes\n\t\t\t\t\t.catch(reject);\n\t\t\t} else if (this._config.onFetch) {\n\t\t\t\tthis._config.isLoading = true;\n\t\t\t\tthis._config\n\t\t\t\t\t.onFetch(query)\n\t\t\t\t\t.then((items) => {\n\t\t\t\t\t\tthis._config.items = items;\n\t\t\t\t\t\tresolve(); // Resolve after onFetch completes\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tconsole.error('Error fetching data:', error);\n\t\t\t\t\t\treject(error); // Reject on error\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tthis._config.isLoading = false;\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _fetchRemoteData(query?: string): Promise<void> {\n\t\tthis._config.isLoading = true; // Show loading indicator\n\n\t\tlet url = this._config.dataUrl!;\n\t\tif (query) {\n\t\t\turl += `?${this._config.searchParam}=${encodeURIComponent(query)}`;\n\t\t}\n\n\t\treturn fetch(url)\n\t\t\t.then((response) => response.json())\n\t\t\t.then((data) => {\n\t\t\t\tif (this._config.apiDataProperty) {\n\t\t\t\t\t// Extract the data property from the response\n\t\t\t\t\tif (this._config.apiDataProperty in data) {\n\t\t\t\t\t\tdata = data[this._config.apiDataProperty];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t'Error fetching data:',\n\t\t\t\t\t\t\t`Property '${this._config.apiDataProperty}' not found in response`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis._config.items = data;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error fetching data:', error);\n\t\t\t\t// Handle error (e.g., display an error message)\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis._config.isLoading = false; // Hide loading indicator\n\t\t\t});\n\t}\n\n\tpublic getItems(): KTSelectOption[] {\n\t\treturn this._config.items || [];\n\t}\n\n\tpublic setItemsFromOptions(options: HTMLOptionElement[]): void {\n\t\tthis._config.items = options.map((option) => ({\n\t\t\tid: option.value,\n\t\t\ttitle: option.textContent || '',\n\t\t\t// Add other properties from option element if needed\n\t\t}));\n\t}\n\n\tpublic getConfig(): KTSelectConfigInterface {\n\t\treturn this._config;\n\t}\n\n\tpublic setSelectedOptions(value: string | string[]): void {\n\t\tif (\n\t\t\tthis._config.multiple &&\n\t\t\ttypeof value === 'string' &&\n\t\t\t!this._selectedOptions.includes(value)\n\t\t) {\n\t\t\tthis._selectedOptions.push(value);\n\t\t} else if (!this._config.multiple) {\n\t\t\t// For single select, replace the previous selection with the new one\n\t\t\tthis._selectedOptions = typeof value === 'string' ? [value] : [value[0]];\n\t\t} else if (this._config.multiple && Array.isArray(value)) {\n\t\t\t// For multiple select with array input, use the provided array\n\t\t\tthis._selectedOptions = [...value];\n\t\t}\n\t}\n\n\tpublic toggleSelectedOptions(value: string): void {\n\t\tif (!this._config.multiple) {\n\t\t\t// For non-multiple, always set the new value\n\t\t\tthis._selectedOptions = [value];\n\t\t\treturn;\n\t\t}\n\n\t\t// For multiple selection, toggle the value\n\t\tconst index = this._selectedOptions.indexOf(value);\n\t\tif (index > -1) {\n\t\t\tthis._selectedOptions.splice(index, 1);\n\t\t} else {\n\t\t\tthis._selectedOptions.push(value);\n\t\t}\n\t}\n\n\tpublic getSelectedOptions(): string[] {\n\t\treturn this._selectedOptions;\n\t}\n\n\tpublic isSelected(value: string): boolean {\n\t\treturn this._selectedOptions.includes(value);\n\t}\n\n\tpublic modifyConfig(config: Partial<KTSelectConfigInterface>): void {\n\t\tthis._config = { ...this._config, ...config };\n\t}\n}\n\nexport const SelectOptionDefaultConfig: KTSelectOptionConfigInterface = {\n\tdescription: '',\n\ticon: null,\n};\n\nexport interface KTSelectOptionConfigInterface {\n\tdescription: string;\n\ticon: string;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport {\n\tInstance as PopperInstance,\n\tcreatePopper,\n\tPlacement,\n\tVirtualElement,\n} from '@popperjs/core';\nimport KTDom from '../../helpers/dom';\nimport KTData from '../../helpers/data';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTSelectConfigInterface } from './config';\nimport { FocusManager, EventManager } from './utils';\n\n/**\n * KTSelectDropdown\n *\n * A specialized dropdown implementation for the KTSelect component.\n * This module handles the dropdown functionality for the select component,\n * including positioning, showing/hiding, and keyboard navigation.\n */\nexport class KTSelectDropdown extends KTComponent {\n\tprotected override readonly _name: string = 'select-dropdown';\n\tprotected override readonly _config: KTSelectConfigInterface;\n\n\t// DOM Elements\n\tprotected _element: HTMLElement;\n\tprivate _toggleElement: HTMLElement;\n\tprivate _dropdownElement: HTMLElement;\n\n\t// State\n\tprivate _isOpen: boolean = false;\n\tprivate _isTransitioning: boolean = false;\n\tprivate _popperInstance: PopperInstance | null = null;\n\tprivate _eventManager: EventManager;\n\tprivate _focusManager: FocusManager;\n\n\t/**\n\t * Constructor\n\t * @param element The parent element (select wrapper)\n\t * @param toggleElement The element that triggers the dropdown\n\t * @param dropdownElement The dropdown content element\n\t * @param config The configuration options\n\t */\n\tconstructor(\n\t\telement: HTMLElement,\n\t\ttoggleElement: HTMLElement,\n\t\tdropdownElement: HTMLElement,\n\t\tconfig: KTSelectConfigInterface,\n\t) {\n\t\tsuper();\n\n\t\tthis._element = element;\n\t\tthis._toggleElement = toggleElement;\n\t\tthis._dropdownElement = dropdownElement;\n\t\tthis._config = config;\n\t\tthis._eventManager = new EventManager();\n\t\tthis._focusManager = new FocusManager(\n\t\t\tdropdownElement,\n\t\t\t'[data-kt-select-option]',\n\t\t\tconfig,\n\t\t);\n\n\t\tthis._setupEventListeners();\n\t}\n\n\t/**\n\t * Set up event listeners for the dropdown\n\t */\n\tprivate _setupEventListeners(): void {\n\t\t// Toggle click\n\t\tthis._eventManager.addListener(\n\t\t\tthis._toggleElement,\n\t\t\t'click',\n\t\t\tthis._handleToggleClick.bind(this),\n\t\t);\n\n\t\t// Keyboard navigation\n\t\tthis._eventManager.addListener(\n\t\t\tthis._element,\n\t\t\t'keydown',\n\t\t\tthis._handleKeyDown.bind(this),\n\t\t);\n\n\t\t// Close on outside click\n\t\tthis._eventManager.addListener(\n\t\t\tdocument as unknown as HTMLElement,\n\t\t\t'click',\n\t\t\tthis._handleOutsideClick.bind(this),\n\t\t);\n\t}\n\n\t/**\n\t * Handle toggle element click\n\t */\n\tprivate _handleToggleClick(event: Event): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tthis.toggle();\n\t}\n\n\t/**\n\t * Handle keyboard events\n\t */\n\tprivate _handleKeyDown(event: KeyboardEvent): void {\n\t\tif (!this._isOpen) return;\n\n\t\tswitch (event.key) {\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.close();\n\t\t\t\tthis._toggleElement.focus();\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._focusManager.focusNext();\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._focusManager.focusPrevious();\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// Focus first visible option\n\t\t\t\tconst firstOption = this._focusManager.getVisibleOptions()[0];\n\t\t\t\tif (firstOption) {\n\t\t\t\t\tthis._focusManager.applyFocus(firstOption);\n\t\t\t\t\tthis._focusManager.scrollIntoView(firstOption);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// Focus last visible option\n\t\t\t\tconst visibleOptions = this._focusManager.getVisibleOptions();\n\t\t\t\tconst lastOption = visibleOptions[visibleOptions.length - 1];\n\t\t\t\tif (lastOption) {\n\t\t\t\t\tthis._focusManager.applyFocus(lastOption);\n\t\t\t\t\tthis._focusManager.scrollIntoView(lastOption);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Handle clicks outside the dropdown\n\t */\n\tprivate _handleOutsideClick(event: MouseEvent): void {\n\t\tif (!this._isOpen) return;\n\n\t\tconst target = event.target as HTMLElement;\n\n\t\tif (\n\t\t\t!this._element.contains(target) &&\n\t\t\t!this._dropdownElement.contains(target)\n\t\t) {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t/**\n\t * Set width of dropdown based on toggle element\n\t */\n\tprivate _setDropdownWidth(): void {\n\t\tif (!this._dropdownElement || !this._toggleElement) return;\n\n\t\t// Check if width is configured\n\t\tif (this._config.dropdownWidth) {\n\t\t\t// If custom width is set, use that\n\t\t\tthis._dropdownElement.style.width = this._config.dropdownWidth;\n\t\t} else {\n\t\t\t// Otherwise, match toggle element width for a cleaner appearance\n\t\t\tconst toggleWidth = this._toggleElement.offsetWidth;\n\t\t\tthis._dropdownElement.style.width = `${toggleWidth}px`;\n\t\t}\n\t}\n\n\t/**\n\t * Initialize the Popper instance for dropdown positioning\n\t */\n\tprivate _initPopper(): void {\n\t\t// Destroy existing popper instance if it exists\n\t\tthis._destroyPopper();\n\n\t\t// Default offset\n\t\tconst offsetValue = '0, 5';\n\n\t\t// Get configuration options\n\t\tconst placement = this._config.dropdownPlacement || 'bottom-start';\n\t\tconst strategy = this._config.dropdownStrategy || 'fixed';\n\t\tconst preventOverflow = this._config.dropdownPreventOverflow !== false;\n\t\tconst flip = this._config.dropdownFlip !== false;\n\n\t\t// Create new popper instance\n\t\tthis._popperInstance = createPopper(\n\t\t\tthis._toggleElement,\n\t\t\tthis._dropdownElement,\n\t\t\t{\n\t\t\t\tplacement: placement as Placement,\n\t\t\t\tstrategy: strategy as 'fixed' | 'absolute',\n\t\t\t\tmodifiers: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'offset',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\toffset: this._parseOffset(offsetValue),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'preventOverflow',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tboundary: 'viewport',\n\t\t\t\t\t\t\taltAxis: preventOverflow,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'flip',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tenabled: flip,\n\t\t\t\t\t\t\tfallbackPlacements: ['top-start', 'bottom-end', 'top-end'],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'sameWidth',\n\t\t\t\t\t\tenabled: !this._config.dropdownWidth,\n\t\t\t\t\t\tphase: 'beforeWrite',\n\t\t\t\t\t\trequires: ['computeStyles'],\n\t\t\t\t\t\tfn: ({ state }) => {\n\t\t\t\t\t\t\tstate.styles.popper.width = `${state.rects.reference.width}px`;\n\t\t\t\t\t\t},\n\t\t\t\t\t\teffect: ({ state }) => {\n\t\t\t\t\t\t\t// Add type guard for HTMLElement\n\t\t\t\t\t\t\tconst reference = state.elements.reference as HTMLElement;\n\t\t\t\t\t\t\tif (reference && 'offsetWidth' in reference) {\n\t\t\t\t\t\t\t\tstate.elements.popper.style.width = `${reference.offsetWidth}px`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Parse offset string into an array of numbers\n\t */\n\tprivate _parseOffset(offset: string): number[] {\n\t\treturn offset.split(',').map((value) => parseInt(value.trim(), 10));\n\t}\n\n\t/**\n\t * Destroy the Popper instance\n\t */\n\tprivate _destroyPopper(): void {\n\t\tif (this._popperInstance) {\n\t\t\tthis._popperInstance.destroy();\n\t\t\tthis._popperInstance = null;\n\t\t}\n\t}\n\n\t/**\n\t * Update dropdown position\n\t */\n\tpublic updatePosition(): void {\n\t\tif (this._popperInstance) {\n\t\t\tthis._popperInstance.update();\n\t\t}\n\t}\n\n\t/**\n\t * Toggle the dropdown\n\t */\n\tpublic toggle(): void {\n\t\tif (this._config.debug)\n\t\t\tconsole.log('KTSelectDropdown.toggle called - isOpen:', this._isOpen);\n\n\t\tif (this._isTransitioning) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log('KTSelectDropdown.toggle - ignoring during transition');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen) {\n\t\t\tthis.close();\n\t\t} else {\n\t\t\tthis.open();\n\t\t}\n\t}\n\n\t/**\n\t * Open the dropdown\n\t */\n\tpublic open(): void {\n\t\tif (this._isOpen || this._isTransitioning) return;\n\n\t\t// Fire before show event\n\t\tconst beforeShowEvent = new CustomEvent('kt.select.dropdown.show', {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t});\n\t\tthis._element.dispatchEvent(beforeShowEvent);\n\n\t\tif (beforeShowEvent.defaultPrevented) return;\n\n\t\t// Begin opening transition\n\t\tthis._isTransitioning = true;\n\n\t\t// Set initial styles - remove display: block and use class toggling instead\n\t\tthis._dropdownElement.classList.remove('hidden');\n\t\tthis._dropdownElement.style.opacity = '0';\n\n\t\t// Set dropdown width\n\t\tthis._setDropdownWidth();\n\n\t\t// Make sure the element is visible for transitioning\n\t\tKTDom.reflow(this._dropdownElement);\n\n\t\t// Apply z-index if configured\n\t\tif (this._config.dropdownZindex) {\n\t\t\tthis._dropdownElement.style.zIndex =\n\t\t\t\tthis._config.dropdownZindex.toString();\n\t\t} else {\n\t\t\t// Auto-calculate z-index\n\t\t\tconst parentZindex = KTDom.getHighestZindex(this._element);\n\t\t\tif (parentZindex) {\n\t\t\t\tthis._dropdownElement.style.zIndex = (parentZindex + 1).toString();\n\t\t\t}\n\t\t}\n\n\t\t// Initialize popper for positioning\n\t\tthis._initPopper();\n\n\t\t// Add active classes\n\t\tthis._dropdownElement.classList.add('open');\n\t\tthis._toggleElement.classList.add('active');\n\t\tthis._toggleElement.setAttribute('aria-expanded', 'true');\n\n\t\t// Start transition\n\t\tthis._dropdownElement.style.opacity = '1';\n\n\t\t// Handle transition end\n\t\tKTDom.transitionEnd(this._dropdownElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\t// Focus the first item if search is enabled\n\t\t\tif (this._config.enableSearch) {\n\t\t\t\tconst searchInput = this._dropdownElement.querySelector(\n\t\t\t\t\t'input[type=\"search\"]',\n\t\t\t\t);\n\t\t\t\tif (searchInput) {\n\t\t\t\t\t(searchInput as HTMLInputElement).focus();\n\t\t\t\t} else {\n\t\t\t\t\tthis._focusFirstOption();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._focusFirstOption();\n\t\t\t}\n\n\t\t\t// Fire after show event\n\t\t\tconst afterShowEvent = new CustomEvent('kt.select.dropdown.shown', {\n\t\t\t\tbubbles: true,\n\t\t\t});\n\t\t\tthis._element.dispatchEvent(afterShowEvent);\n\t\t});\n\t}\n\n\t/**\n\t * Focus the first option in the dropdown\n\t */\n\tprivate _focusFirstOption(): void {\n\t\tconst firstOption = this._focusManager.getVisibleOptions()[0];\n\t\tif (firstOption) {\n\t\t\tthis._focusManager.applyFocus(firstOption);\n\t\t\tthis._focusManager.scrollIntoView(firstOption);\n\t\t}\n\t}\n\n\t/**\n\t * Close the dropdown\n\t */\n\tpublic close(): void {\n\t\tif (this._config.debug)\n\t\t\tconsole.log(\n\t\t\t\t'KTSelectDropdown.close called - isOpen:',\n\t\t\t\tthis._isOpen,\n\t\t\t\t'isTransitioning:',\n\t\t\t\tthis._isTransitioning,\n\t\t\t);\n\n\t\tif (!this._isOpen || this._isTransitioning) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log(\n\t\t\t\t\t'KTSelectDropdown.close - early return: dropdown not open or is transitioning',\n\t\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Fire before hide event\n\t\tconst beforeHideEvent = new CustomEvent('kt.select.dropdown.hide', {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t});\n\t\tthis._element.dispatchEvent(beforeHideEvent);\n\n\t\tif (beforeHideEvent.defaultPrevented) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log(\n\t\t\t\t\t'KTSelectDropdown.close - canceling due to defaultPrevented on beforeHideEvent',\n\t\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log('KTSelectDropdown.close - starting transition');\n\t\t// Begin closing transition\n\t\tthis._isTransitioning = true;\n\n\t\t// Start transition\n\t\tthis._dropdownElement.style.opacity = '0';\n\n\t\t// Use a combination of transition end and a fallback timer\n\t\tlet transitionComplete = false;\n\n\t\t// Set a fixed-duration fallback in case the transition event doesn't fire\n\t\tconst fallbackTimer = setTimeout(() => {\n\t\t\tif (!transitionComplete) {\n\t\t\t\tif (this._config.debug)\n\t\t\t\t\tconsole.log('KTSelectDropdown.close - fallback timer triggered');\n\t\t\t\tcompleteTransition();\n\t\t\t}\n\t\t}, 300); // 300ms should be enough for most transitions\n\n\t\t// Setup the transition end function\n\t\tconst completeTransition = () => {\n\t\t\tif (transitionComplete) return;\n\t\t\ttransitionComplete = true;\n\t\t\tclearTimeout(fallbackTimer);\n\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log('KTSelectDropdown.close - transition ended');\n\t\t\t// Remove active classes\n\t\t\tthis._dropdownElement.classList.add('hidden');\n\t\t\tthis._dropdownElement.classList.remove('open');\n\t\t\tthis._toggleElement.classList.remove('active');\n\t\t\tthis._toggleElement.setAttribute('aria-expanded', 'false');\n\n\t\t\t// Reset styles - replace display: none with adding hidden class\n\t\t\tthis._dropdownElement.classList.add('hidden');\n\t\t\tthis._dropdownElement.style.opacity = '';\n\t\t\tthis._dropdownElement.style.zIndex = '';\n\n\t\t\t// Destroy popper\n\t\t\tthis._destroyPopper();\n\n\t\t\t// Update state\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\n\t\t\t// Fire after hide event\n\t\t\tconst afterHideEvent = new CustomEvent('kt.select.dropdown.hidden', {\n\t\t\t\tbubbles: true,\n\t\t\t});\n\t\t\tthis._element.dispatchEvent(afterHideEvent);\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log('KTSelectDropdown.close - complete, events fired');\n\t\t};\n\n\t\t// Handle transition end via the utility but also have the fallback\n\t\tKTDom.transitionEnd(this._dropdownElement, completeTransition);\n\t}\n\n\t/**\n\t * Check if dropdown is open\n\t */\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\t/**\n\t * Clean up component\n\t */\n\tpublic override dispose(): void {\n\t\t// Destroy popper\n\t\tthis._destroyPopper();\n\n\t\t// Remove event listeners\n\t\tthis._eventManager.removeAllListeners(this._element);\n\t\tthis._eventManager.removeAllListeners(this._toggleElement);\n\t\tthis._eventManager.removeAllListeners(document as unknown as HTMLElement);\n\n\t\t// Clean up focus manager\n\t\tif (\n\t\t\tthis._focusManager &&\n\t\t\ttypeof this._focusManager.dispose === 'function'\n\t\t) {\n\t\t\tthis._focusManager.dispose();\n\t\t}\n\n\t\t// Clean up state\n\t\tthis._isOpen = false;\n\t\tthis._isTransitioning = false;\n\n\t\t// Remove data reference\n\t\tKTData.remove(this._element, this._name);\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTSelect } from './select';\nexport { KTSelectRemote } from './remote';\nexport { KTSelectCombobox } from './combobox';\nexport { KTSelectSearch } from './search';\nexport { KTSelectTags } from './tags';\nexport { KTSelectDropdown } from './dropdown';\nexport { filterOptions, FocusManager, EventManager } from './utils';\nexport { KTSelectConfigInterface, KTSelectOption } from './config';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTComponent from '../component';\nimport {\n\tKTSelectOptionConfigInterface,\n\tKTSelectConfigInterface,\n} from './config';\nimport { defaultTemplates } from './templates';\n\nexport class KTSelectOption extends KTComponent {\n\tprotected override readonly _name: string = 'select-option';\n\tprotected override readonly _dataOptionPrefix: string = 'kt-'; // Use 'kt-' prefix to support data-kt-select-option attributes\n\tprotected override readonly _config: KTSelectOptionConfigInterface;\n\tprivate _globalConfig: KTSelectConfigInterface;\n\n\tconstructor(element: HTMLElement, config?: KTSelectConfigInterface) {\n\t\tsuper();\n\n\t\t// Always initialize a new option instance\n\t\tthis._init(element);\n\t\tthis._buildConfig();\n\t\tthis._globalConfig = config;\n\n\t\t// Don't store in KTData to avoid Singleton pattern issues\n\t\t// Each option should be a unique instance\n\t\t(element as any).instance = this;\n\t}\n\n\tpublic getHTMLOptionElement(): HTMLOptionElement {\n\t\treturn this._element as HTMLOptionElement;\n\t}\n\n\tpublic render(): HTMLElement {\n\t\tconst optionElement = this.getHTMLOptionElement();\n\t\t// Use the global config if available, or create a minimal valid config\n\t\tconst config = this._globalConfig || { height: 250 };\n\t\t// Create a new option element every time\n\t\treturn defaultTemplates.option(optionElement, config);\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport {\n\tKTSelectConfigInterface,\n\tKTSelectOption as KTSelectOptionData,\n} from './config';\n\n/**\n * KTSelectRemote class\n * Handles fetching remote data for the KTSelect component\n */\nexport class KTSelectRemote {\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _isLoading: boolean = false;\n\tprivate _hasError: boolean = false;\n\tprivate _errorMessage: string = '';\n\tprivate _currentPage: number = 1;\n\tprivate _totalPages: number = 1;\n\tprivate _lastQuery: string = '';\n\tprivate _element: HTMLElement | null = null;\n\n\t/**\n\t * Constructor\n\t * @param config KTSelect configuration\n\t * @param element The select element\n\t */\n\tconstructor(config: KTSelectConfigInterface, element?: HTMLElement) {\n\t\tthis._config = config;\n\t\tthis._element = element || null;\n\t}\n\n\t/**\n\t * Fetch data from remote URL\n\t * @param query Optional search query\n\t * @param page Page number for pagination\n\t * @returns Promise with fetched items\n\t */\n\tpublic fetchData(\n\t\tquery?: string,\n\t\tpage: number = 1,\n\t): Promise<KTSelectOptionData[]> {\n\t\tthis._isLoading = true;\n\t\tthis._hasError = false;\n\t\tthis._errorMessage = '';\n\t\tthis._lastQuery = query || '';\n\t\tthis._currentPage = page;\n\n\t\tlet url = this._buildUrl(query, page);\n\n\t\tif (this._config.debug) console.log('Fetching remote data from:', url);\n\n\t\t// Dispatch search start event\n\t\tthis._dispatchEvent('remoteSearchStart');\n\n\t\treturn fetch(url)\n\t\t\t.then((response: Response): Promise<any> => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`HTTP error! Status: ${response.status}`);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.then((data: any): KTSelectOptionData[] => {\n\t\t\t\t// Process the data\n\t\t\t\treturn this._processData(data);\n\t\t\t})\n\t\t\t.catch((error: Error): KTSelectOptionData[] => {\n\t\t\t\tconsole.error('Error fetching remote data:', error);\n\t\t\t\tthis._hasError = true;\n\t\t\t\tthis._errorMessage =\n\t\t\t\t\tthis._config.remoteErrorMessage || 'Failed to load data';\n\t\t\t\treturn [];\n\t\t\t})\n\t\t\t.finally((): void => {\n\t\t\t\tthis._isLoading = false;\n\t\t\t\t// Dispatch search end event\n\t\t\t\tthis._dispatchEvent('remoteSearchEnd');\n\t\t\t});\n\t}\n\n\t/**\n\t * Dispatch custom events to notify about search state changes\n\t * @param eventName Name of the event to dispatch\n\t */\n\tprivate _dispatchEvent(eventName: string): void {\n\t\tif (!this._element) return;\n\n\t\tconst event = new CustomEvent(`ktselect.${eventName}`, {\n\t\t\tbubbles: true,\n\t\t\tdetail: {\n\t\t\t\tquery: this._lastQuery,\n\t\t\t\tisLoading: this._isLoading,\n\t\t\t\thasError: this._hasError,\n\t\t\t\terrorMessage: this._errorMessage,\n\t\t\t},\n\t\t});\n\n\t\tthis._element.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Build the URL for the API request\n\t * @param query Search query\n\t * @param page Page number\n\t * @returns Fully formed URL\n\t */\n\tprivate _buildUrl(query?: string, page: number = 1): string {\n\t\tlet url = this._config.dataUrl;\n\n\t\tif (!url) {\n\t\t\tconsole.error('No URL specified for remote data');\n\t\t\treturn '';\n\t\t}\n\n\t\t// Add parameters\n\t\tconst params = new URLSearchParams();\n\n\t\t// Add search parameter if provided\n\t\tif (query && this._config.searchParam) {\n\t\t\tparams.append(this._config.searchParam, query);\n\t\t}\n\n\t\t// Add pagination parameters if enabled\n\t\tif (this._config.pagination) {\n\t\t\tconst limitParam = this._config.paginationLimitParam || 'limit';\n\t\t\tconst pageParam = this._config.paginationPageParam || 'page';\n\t\t\tconst limit = this._config.paginationLimit || 10;\n\n\t\t\tparams.append(limitParam, limit.toString());\n\t\t\tparams.append(pageParam, page.toString());\n\t\t}\n\n\t\t// Append parameters to URL if there are any\n\t\tconst paramsString = params.toString();\n\t\tif (paramsString) {\n\t\t\turl += (url.includes('?') ? '&' : '?') + paramsString;\n\t\t}\n\n\t\treturn url;\n\t}\n\n\t/**\n\t * Process the API response data\n\t * @param data API response data\n\t * @returns Array of KTSelectOptionData\n\t */\n\tprivate _processData(data: any): KTSelectOptionData[] {\n\t\ttry {\n\t\t\tif (this._config.debug) console.log('Processing API response:', data);\n\n\t\t\tlet processedData = data;\n\n\t\t\t// Extract data from the API property if specified\n\t\t\tif (this._config.apiDataProperty && data[this._config.apiDataProperty]) {\n\t\t\t\tif (this._config.debug)\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Extracting data from property: ${this._config.apiDataProperty}`,\n\t\t\t\t\t);\n\n\t\t\t\t// If pagination metadata is available, extract it\n\t\t\t\tif (this._config.pagination) {\n\t\t\t\t\tif (data.total_pages) {\n\t\t\t\t\t\tthis._totalPages = data.total_pages;\n\t\t\t\t\t\tif (this._config.debug)\n\t\t\t\t\t\t\tconsole.log(`Total pages found: ${this._totalPages}`);\n\t\t\t\t\t}\n\t\t\t\t\tif (data.total) {\n\t\t\t\t\t\tthis._totalPages = Math.ceil(\n\t\t\t\t\t\t\tdata.total / (this._config.paginationLimit || 10),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (this._config.debug)\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`Calculated total pages: ${this._totalPages} from total: ${data.total}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocessedData = data[this._config.apiDataProperty];\n\t\t\t}\n\n\t\t\t// Ensure data is an array\n\t\t\tif (!Array.isArray(processedData)) {\n\t\t\t\tconsole.warn('Remote data is not an array:', processedData);\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log(\n\t\t\t\t\t`Mapping ${processedData.length} items to KTSelectOptionData format`,\n\t\t\t\t);\n\n\t\t\t// Map data to KTSelectOptionData format\n\t\t\tconst mappedData = processedData.map((item: any): KTSelectOptionData => {\n\t\t\t\tconst mappedItem = this._mapItemToOption(item);\n\n\t\t\t\t// Add logging to trace data path extraction\n\t\t\t\tif (\n\t\t\t\t\tthis._config.dataValueField &&\n\t\t\t\t\tthis._config.dataValueField.includes('.')\n\t\t\t\t) {\n\t\t\t\t\t// For nested paths, verify extraction worked\n\t\t\t\t\tconst parts = this._config.dataValueField.split('.');\n\t\t\t\t\tlet nestedValue = item;\n\n\t\t\t\t\t// Try to navigate to the value manually for verification\n\t\t\t\t\tfor (const part of parts) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnestedValue &&\n\t\t\t\t\t\t\ttypeof nestedValue === 'object' &&\n\t\t\t\t\t\t\tpart in nestedValue\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnestedValue = nestedValue[part];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnestedValue = null;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we found a value, verify it matches what was extracted\n\t\t\t\t\tif (nestedValue !== null && nestedValue !== undefined) {\n\t\t\t\t\t\tconst expectedValue = String(nestedValue);\n\t\t\t\t\t\tif (this._config.debug)\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`Data path verification for [${this._config.dataValueField}]: Expected: ${expectedValue}, Got: ${mappedItem.id}`,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (mappedItem.id !== expectedValue && expectedValue) {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t`Value mismatch! Path: ${this._config.dataValueField}, Expected: ${expectedValue}, Got: ${mappedItem.id}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._config.debug)\n\t\t\t\t\tconsole.log(`Mapped item: ${JSON.stringify(mappedItem)}`);\n\t\t\t\treturn mappedItem;\n\t\t\t});\n\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log(`Returned ${mappedData.length} mapped items`);\n\t\t\treturn mappedData;\n\t\t} catch (error) {\n\t\t\tconsole.error('Error processing remote data:', error);\n\t\t\tthis._hasError = true;\n\t\t\tthis._errorMessage = 'Error processing data';\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Map a data item to KTSelectOptionData format\n\t * @param item Data item from API\n\t * @returns KTSelectOptionData object\n\t */\n\tprivate _mapItemToOption(item: any): KTSelectOptionData {\n\t\t// Get the field mapping from config with fallbacks for common field names\n\t\tconst valueField = this._config.dataValueField || 'id';\n\t\tconst labelField = this._config.dataFieldText || 'title';\n\t\tconst descriptionField = this._config.dataFieldDescription || 'description';\n\t\tconst iconField = this._config.dataFieldIcon || 'icon';\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log(\n\t\t\t\t`Mapping fields: value=${valueField}, label=${labelField}, description=${descriptionField}, icon=${iconField}`,\n\t\t\t);\n\t\tif (this._config.debug)\n\t\t\tconsole.log('Item data:', JSON.stringify(item).substring(0, 200) + '...'); // Trimmed for readability\n\n\t\t// Extract values using dot notation if needed\n\t\tconst getValue = (obj: any, path: string): any => {\n\t\t\tif (!path) return null;\n\t\t\tif (!obj) return null;\n\n\t\t\ttry {\n\t\t\t\t// Handle dot notation to access nested properties\n\t\t\t\tconst parts = path.split('.');\n\t\t\t\tlet result = obj;\n\n\t\t\t\tfor (const part of parts) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tresult === null ||\n\t\t\t\t\t\tresult === undefined ||\n\t\t\t\t\t\ttypeof result !== 'object'\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tresult = result[part];\n\t\t\t\t}\n\n\t\t\t\t// Log the extraction result\n\t\t\t\tif (this._config.debug)\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Extracted [${path}] => ${\n\t\t\t\t\t\t\tresult !== null && result !== undefined\n\t\t\t\t\t\t\t\t? typeof result === 'object'\n\t\t\t\t\t\t\t\t\t? JSON.stringify(result).substring(0, 50)\n\t\t\t\t\t\t\t\t\t: String(result).substring(0, 50)\n\t\t\t\t\t\t\t\t: 'null'\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Error extracting path ${path}:`, error);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\n\t\t// Try to get a usable ID, with fallbacks\n\t\tlet id = getValue(item, valueField);\n\n\t\t// Ensure id is always a proper string\n\t\tif (id === null || id === undefined) {\n\t\t\t// If no ID found, check for id.value or item.id as fallbacks\n\t\t\tif (\n\t\t\t\titem.id &&\n\t\t\t\ttypeof item.id === 'object' &&\n\t\t\t\t'value' in item.id &&\n\t\t\t\titem.id.value\n\t\t\t) {\n\t\t\t\tid = String(item.id.value);\n\t\t\t\tif (this._config.debug)\n\t\t\t\t\tconsole.log(`Using id.value as fallback: ${id}`);\n\t\t\t} else if (item.id) {\n\t\t\t\tid = String(item.id);\n\t\t\t\tif (this._config.debug)\n\t\t\t\t\tconsole.log(`Using direct item.id as fallback: ${id}`);\n\t\t\t} else {\n\t\t\t\t// If no ID found at all, use the title instead (will be extracted below)\n\t\t\t\tif (this._config.debug)\n\t\t\t\t\tconsole.log(`No ID found, will use title as fallback`);\n\t\t\t\tid = null;\n\t\t\t}\n\t\t} else if (typeof id === 'object') {\n\t\t\t// If ID is an object, log the issue and set to null to use title fallback\n\t\t\tconsole.warn(\n\t\t\t\t`ID for path ${valueField} is an object, will use title fallback instead`,\n\t\t\t);\n\t\t\tid = null;\n\t\t} else {\n\t\t\t// Otherwise, ensure it's a string\n\t\t\tid = String(id);\n\t\t\tif (this._config.debug) console.log(`Final ID value: ${id}`);\n\t\t}\n\n\t\t// Try to get a usable title, with fallbacks\n\t\tlet title = getValue(item, labelField);\n\t\ttitle = title !== null ? String(title) : '';\n\t\tif (this._config.debug)\n\t\t\tconsole.log(`Title/label field [${labelField}]:`, title);\n\n\t\t// If title is still empty, try common field names\n\t\tif (!title) {\n\t\t\t// Try common field names if the configured one doesn't work\n\t\t\tif (item.name) title = String(item.name);\n\t\t\telse if (item.title) title = String(item.title);\n\t\t\telse if (item.label) title = String(item.label);\n\t\t\telse if (item.text) title = String(item.text);\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log('After fallback checks, title:', title);\n\t\t}\n\n\t\t// Get description - make sure we don't pass null, undefined, or \"null\" string values\n\t\tlet description = getValue(item, descriptionField);\n\t\tif (\n\t\t\tdescription === null ||\n\t\t\tdescription === undefined ||\n\t\t\tString(description) === 'null' ||\n\t\t\tString(description) === 'undefined'\n\t\t) {\n\t\t\tdescription = null;\n\t\t} else {\n\t\t\tdescription = String(description);\n\t\t}\n\t\tif (this._config.debug)\n\t\t\tconsole.log(`Description field [${descriptionField}]:`, description);\n\n\t\t// Try to get an icon - make sure we don't pass null, undefined, or \"null\" string values\n\t\tlet icon = getValue(item, iconField);\n\t\tif (\n\t\t\ticon === null ||\n\t\t\ticon === undefined ||\n\t\t\tString(icon) === 'null' ||\n\t\t\tString(icon) === 'undefined'\n\t\t) {\n\t\t\ticon = null;\n\t\t} else {\n\t\t\ticon = String(icon);\n\t\t}\n\t\tif (this._config.debug) console.log(`Icon field [${iconField}]:`, icon);\n\n\t\t// If ID is null, use the title as fallback\n\t\tif (id === null || id === '') {\n\t\t\tid = title;\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log(`Using title as fallback for ID: ${id}`);\n\t\t}\n\n\t\t// Create the option object with non-empty values\n\t\tconst result = {\n\t\t\tid: id || title || 'id-' + Math.random().toString(36).substr(2, 9), // Ensure we always have an ID\n\t\t\ttitle: title || 'Unnamed option',\n\t\t\tdescription: description,\n\t\t\ticon: icon,\n\t\t};\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log('Final mapped item:', JSON.stringify(result));\n\t\treturn result;\n\t}\n\n\t/**\n\t * Load the next page of results\n\t * @returns Promise with fetched items\n\t */\n\tpublic loadNextPage(): Promise<KTSelectOptionData[]> {\n\t\tif (this._currentPage < this._totalPages) {\n\t\t\treturn this.fetchData(this._lastQuery, this._currentPage + 1);\n\t\t}\n\t\treturn Promise.resolve([]);\n\t}\n\n\t/**\n\t * Check if there are more pages available\n\t * @returns Boolean indicating if more pages exist\n\t */\n\tpublic hasMorePages(): boolean {\n\t\treturn this._currentPage < this._totalPages;\n\t}\n\n\t/**\n\t * Get loading state\n\t * @returns Boolean indicating if data is loading\n\t */\n\tpublic isLoading(): boolean {\n\t\treturn this._isLoading;\n\t}\n\n\t/**\n\t * Get error state\n\t * @returns Boolean indicating if there was an error\n\t */\n\tpublic hasError(): boolean {\n\t\treturn this._hasError;\n\t}\n\n\t/**\n\t * Get error message\n\t * @returns Error message\n\t */\n\tpublic getErrorMessage(): string {\n\t\treturn this._errorMessage;\n\t}\n\n\t/**\n\t * Reset the remote data state\n\t */\n\tpublic reset(): void {\n\t\tthis._isLoading = false;\n\t\tthis._hasError = false;\n\t\tthis._errorMessage = '';\n\t\tthis._currentPage = 1;\n\t\tthis._totalPages = 1;\n\t\tthis._lastQuery = '';\n\t}\n\n\t/**\n\t * Set the select element for event dispatching\n\t * @param element The select element\n\t */\n\tpublic setElement(element: HTMLElement): void {\n\t\tthis._element = element;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { KTSelect } from './select';\nimport { defaultTemplates } from './templates';\nimport {\n\thandleDropdownKeyNavigation,\n\tfilterOptions,\n\tFocusManager,\n\tEventManager,\n} from './utils';\n\nexport class KTSelectSearch {\n\tprivate _select: KTSelect;\n\tprivate _searchInput: HTMLInputElement;\n\tprivate _noResultsElement: HTMLElement | null = null;\n\tprivate _originalOptionContents = new Map<string, string>();\n\tprivate _boundKeyNavHandler: (event: KeyboardEvent) => void;\n\tprivate _eventManager: EventManager;\n\tprivate _focusManager: FocusManager;\n\tprivate _config: import('./config').KTSelectConfigInterface;\n\n\t// Public handler for search input (made public for event binding)\n\tpublic handleSearchInput: (...args: any[]) => void;\n\n\tconstructor(select: KTSelect) {\n\t\tthis._select = select;\n\t\tthis._searchInput = select.getSearchInput();\n\t\tthis._eventManager = new EventManager();\n\t\tthis._focusManager = new FocusManager(\n\t\t\tthis._select.getDropdownElement(),\n\t\t\t'[data-kt-select-option]',\n\t\t\tselect.getConfig(),\n\t\t);\n\t\tthis._boundKeyNavHandler = this._handleKeyboardNavigation.bind(this);\n\t\tthis.handleSearchInput = this._handleSearchInput.bind(this);\n\t\tthis._config = select.getConfig();\n\t\tthis._cacheOriginalOptionContents();\n\t}\n\n\tinit() {\n\t\tif (this._select.getConfig().enableSearch) {\n\t\t\tthis._searchInput = this._select.getSearchInput();\n\n\t\t\tif (this._searchInput) {\n\t\t\t\tif (this._config.debug)\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t'Initializing search module with input:',\n\t\t\t\t\t\tthis._searchInput,\n\t\t\t\t\t);\n\n\t\t\t\t// First remove any existing listeners to prevent duplicates\n\t\t\t\tthis._removeEventListeners();\n\n\t\t\t\t// Add the event listener\n\t\t\t\tthis._eventManager.addListener(\n\t\t\t\t\tthis._searchInput,\n\t\t\t\t\t'input',\n\t\t\t\t\tthis.handleSearchInput,\n\t\t\t\t);\n\n\t\t\t\t// Add blur event listener to ensure highlights are cleared when focus is lost\n\t\t\t\tthis._eventManager.addListener(this._searchInput, 'blur', () => {\n\t\t\t\t\t// Small delay to prevent race conditions with selection\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (!this._searchInput.value) {\n\t\t\t\t\t\t\tthis._resetAllOptions();\n\t\t\t\t\t\t\tthis.clearSearchHighlights();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 100);\n\t\t\t\t});\n\n\t\t\t\t// Listen for remote search events to coordinate with remote search functionality\n\t\t\t\tif (\n\t\t\t\t\tthis._select.getConfig().remote &&\n\t\t\t\t\tthis._select.getConfig().searchParam\n\t\t\t\t) {\n\t\t\t\t\tthis._select\n\t\t\t\t\t\t.getElement()\n\t\t\t\t\t\t.addEventListener('remoteSearchStart', () => {\n\t\t\t\t\t\t\t// Reset focused option when remote search starts\n\t\t\t\t\t\t\tthis._focusManager.resetFocus();\n\t\t\t\t\t\t});\n\n\t\t\t\t\tthis._select.getElement().addEventListener('remoteSearchEnd', () => {\n\t\t\t\t\t\t// After remote search completes, refresh our option cache\n\t\t\t\t\t\tthis.refreshOptionCache();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Add keyboard navigation for search results\n\t\t\t\t// This is stopping event propagation to prevent conflicts\n\t\t\t\tthis._eventManager.addListener(\n\t\t\t\t\tthis._searchInput,\n\t\t\t\t\t'keydown',\n\t\t\t\t\tthis._boundKeyNavHandler,\n\t\t\t\t);\n\n\t\t\t\t// Listen for dropdown close to reset options if search is empty\n\t\t\t\tthis._select.getElement().addEventListener('dropdown.close', () => {\n\t\t\t\t\tthis._focusManager.resetFocus();\n\t\t\t\t\t// Always clear highlights when dropdown closes\n\t\t\t\t\tthis.clearSearchHighlights();\n\t\t\t\t\tif (!this._searchInput.value) {\n\t\t\t\t\t\tthis._resetAllOptions();\n\t\t\t\t\t}\n\t\t\t\t\t// Clear the search input when dropdown closes if configured\n\t\t\t\t\tif (this._select.getConfig().clearSearchOnClose) {\n\t\t\t\t\t\tthis._searchInput.value = '';\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Clear highlights when an option is selected\n\t\t\t\tthis._select.getElement().addEventListener('change', () => {\n\t\t\t\t\tthis.clearSearchHighlights();\n\n\t\t\t\t\t// Close dropdown if configured to do so\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis._select.getConfig().closeOnSelect &&\n\t\t\t\t\t\t!this._select.getConfig().multiple\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis._select.closeDropdown();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Autofocus on search input\n\t\t\t\tif (this._select.getConfig().searchAutofocus) {\n\t\t\t\t\tthis._select.getElement().addEventListener('dropdown.show', () => {\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t// Add slight delay to ensure the dropdown and search input are visible\n\t\t\t\t\t\t\tthis._searchInput?.focus();\n\t\t\t\t\t\t}, 50);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Listen for explicit dropdown open event to clear highlights if needed\n\t\t\t\tthis._select.getElement().addEventListener('dropdown.show', () => {\n\t\t\t\t\t// If search input is empty, ensure highlights are cleared on open\n\t\t\t\t\tif (!this._searchInput?.value) {\n\t\t\t\t\t\tthis.clearSearchHighlights();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Remove event listeners to prevent memory leaks or duplicates\n\t */\n\tprivate _removeEventListeners(): void {\n\t\tif (this._searchInput) {\n\t\t\tthis._eventManager.removeAllListeners(this._searchInput);\n\t\t}\n\t}\n\n\t/**\n\t * Handle keyboard navigation for search results\n\t */\n\tprivate _handleKeyboardNavigation(event: KeyboardEvent) {\n\t\t// Stop propagation to prevent multiple handlers from firing\n\t\tevent.stopPropagation();\n\n\t\tif (this._config.debug) console.log('Search module keydown:', event.key);\n\n\t\tconst visibleOptions = this._focusManager.getVisibleOptions();\n\t\tif (visibleOptions.length === 0) return;\n\n\t\t// Use the shared keyboard navigation handler with custom callbacks\n\t\thandleDropdownKeyNavigation(\n\t\t\tevent,\n\t\t\tthis._select,\n\t\t\t{\n\t\t\t\tmultiple: this._select.getConfig().multiple,\n\t\t\t\tcloseOnSelect: this._select.getConfig().closeOnSelect,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonArrowDown: () => this._focusManager.focusNext(),\n\t\t\t\tonArrowUp: () => this._focusManager.focusPrevious(),\n\t\t\t\tonEnter: () => this._selectFocusedOption(),\n\t\t\t\tonClose: () => {\n\t\t\t\t\tif (event.key === 'Escape') {\n\t\t\t\t\t\tthis.clearSearchHighlights();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Select the currently focused option\n\t */\n\tprivate _selectFocusedOption() {\n\t\tconst focusedOption = this._focusManager.getFocusedOption();\n\n\t\tif (focusedOption) {\n\t\t\tconst optionValue = focusedOption.getAttribute('data-value');\n\n\t\t\tif (optionValue) {\n\t\t\t\t// Ensure highlights are cleared before selection\n\t\t\t\tthis.clearSearchHighlights();\n\n\t\t\t\t// Trigger the selection in the main select component\n\t\t\t\tthis._select['_selectOption'](optionValue);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Store original HTML content of all options for later restoration\n\t * This prevents losing formatting when clearing search\n\t */\n\tprivate _cacheOriginalOptionContents() {\n\t\t// Wait for options to be initialized\n\t\tsetTimeout(() => {\n\t\t\tconst options = Array.from(this._select.getOptionsElement());\n\t\t\toptions.forEach((option) => {\n\t\t\t\tconst value = option.getAttribute('data-value');\n\t\t\t\tif (value) {\n\t\t\t\t\tthis._originalOptionContents.set(value, option.innerHTML);\n\t\t\t\t}\n\t\t\t});\n\t\t}, 0);\n\t}\n\n\tprivate _handleSearchInput(event: Event) {\n\t\tconst query = (event.target as HTMLInputElement).value.toLowerCase();\n\t\tconst config = this._select.getConfig();\n\n\t\t// Reset focused option when search changes\n\t\tthis._focusManager.resetFocus();\n\n\t\t// If search query is empty, clear all highlights\n\t\tif (query.trim() === '') {\n\t\t\tthis.clearSearchHighlights();\n\t\t}\n\n\t\t// For remote search, we don't filter locally\n\t\t// The KTSelect component will handle the remote search\n\t\tif (config.remote && config.searchParam) {\n\t\t\t// If query is too short, reset all options to visible state\n\t\t\tif (query.length < config.searchMinLength) {\n\t\t\t\tthis._resetAllOptions();\n\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t}\n\t\t\t// Otherwise, let KTSelect handle remote search\n\t\t\treturn;\n\t\t}\n\n\t\t// For local search\n\t\tif (query.length >= config.searchMinLength) {\n\t\t\tthis._filterOptions(query);\n\t\t} else {\n\t\t\tthis._resetAllOptions();\n\t\t\tthis._clearNoResultsMessage();\n\t\t}\n\t}\n\n\tprivate _filterOptions(query: string) {\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\t\tconst config = this._select.getConfig();\n\t\tconst dropdownElement = this._select.getDropdownElement();\n\n\t\t// Cache original option HTML if not already cached\n\t\tif (this._originalOptionContents.size === 0) {\n\t\t\tthis._cacheOriginalOptionContents();\n\t\t}\n\n\t\t// Use the shared filterOptions utility\n\t\tfilterOptions(options, query, config, dropdownElement, (visibleCount) =>\n\t\t\tthis._handleNoResults(visibleCount),\n\t\t);\n\n\t\t// Apply specialized text highlighting if needed\n\t\tif (config.searchHighlight && query.trim() !== '') {\n\t\t\tthis._applyHighlightToDisplay(query);\n\t\t}\n\t}\n\n\t/**\n\t * Apply highlighting to the display element for multi-select\n\t */\n\tprivate _applyHighlightToDisplay(query: string) {\n\t\t// Implementation for display highlighting\n\t}\n\n\t/**\n\t * Reset all options to their original state\n\t */\n\tprivate _resetAllOptions() {\n\t\t// Show all options\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\n\t\t// Cache original option HTML if not already cached\n\t\tif (this._originalOptionContents.size === 0) {\n\t\t\tthis._cacheOriginalOptionContents();\n\t\t}\n\n\t\toptions.forEach((option) => {\n\t\t\t// Remove the hidden class\n\t\t\toption.classList.remove('hidden');\n\n\t\t\t// Restore original HTML content (remove highlights)\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value && this._originalOptionContents.has(value)) {\n\t\t\t\toption.innerHTML = this._originalOptionContents.get(value);\n\t\t\t}\n\n\t\t\t// Remove any display styling\n\t\t\tif (\n\t\t\t\toption.hasAttribute('style') &&\n\t\t\t\toption.getAttribute('style').includes('display:')\n\t\t\t) {\n\t\t\t\tconst styleAttr = option.getAttribute('style');\n\t\t\t\tif (\n\t\t\t\t\tstyleAttr.trim() === 'display: none;' ||\n\t\t\t\t\tstyleAttr.trim() === 'display: block;'\n\t\t\t\t) {\n\t\t\t\t\toption.removeAttribute('style');\n\t\t\t\t} else {\n\t\t\t\t\toption.setAttribute(\n\t\t\t\t\t\t'style',\n\t\t\t\t\t\tstyleAttr.replace(/display:\\s*[^;]+;?/gi, '').trim(),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _handleNoResults(visibleOptionsCount: number) {\n\t\tif (visibleOptionsCount === 0 && this._searchInput.value.trim() !== '') {\n\t\t\tthis._showNoResultsMessage();\n\t\t} else {\n\t\t\tthis._clearNoResultsMessage();\n\t\t}\n\t}\n\n\tprivate _showNoResultsMessage() {\n\t\tthis._clearNoResultsMessage();\n\n\t\tconst config = this._select.getConfig();\n\t\tthis._noResultsElement = defaultTemplates.noResults(config);\n\n\t\tconst dropdownElement = this._select.getDropdownElement();\n\t\tconst optionsContainer = dropdownElement.querySelector(\n\t\t\t'[data-kt-select-options-container]',\n\t\t);\n\t\tif (optionsContainer) {\n\t\t\toptionsContainer.appendChild(this._noResultsElement);\n\t\t} else {\n\t\t\tdropdownElement.appendChild(this._noResultsElement);\n\t\t}\n\t}\n\n\tprivate _clearNoResultsMessage() {\n\t\tif (this._noResultsElement && this._noResultsElement.parentNode) {\n\t\t\tthis._noResultsElement.parentNode.removeChild(this._noResultsElement);\n\t\t\tthis._noResultsElement = null;\n\t\t}\n\t}\n\n\t/**\n\t * Public method to explicitly clear all search highlights\n\t * This is called when search is reset or selection changes\n\t */\n\tpublic clearSearchHighlights() {\n\t\t// Restore original option content (removes highlighting)\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\n\t\toptions.forEach((option) => {\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value && this._originalOptionContents.has(value)) {\n\t\t\t\toption.innerHTML = this._originalOptionContents.get(value);\n\t\t\t}\n\t\t});\n\n\t\t// Also clear highlights from the display element\n\t\tthis._clearDisplayHighlights();\n\t}\n\n\t/**\n\t * Clear any highlights from the display element (selected values)\n\t */\n\tprivate _clearDisplayHighlights() {\n\t\t// Implementation for clearing display highlights\n\t}\n\n\t/**\n\t * This ensures that search highlighting works correctly with new options\n\t */\n\tpublic refreshOptionCache(): void {\n\t\t// Re-cache all option contents\n\t\tthis._originalOptionContents.clear();\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\n\t\toptions.forEach((option) => {\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value) {\n\t\t\t\tthis._originalOptionContents.set(value, option.innerHTML);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Clean up all resources used by the search module\n\t */\n\tpublic destroy(): void {\n\t\t// Remove all event listeners\n\t\tthis._removeEventListeners();\n\n\t\t// Clear all references\n\t\tthis._focusManager.dispose();\n\t\tthis._eventManager.removeAllListeners(null);\n\n\t\t// Clear cached content\n\t\tthis._originalOptionContents.clear();\n\n\t\t// Clear highlight elements\n\t\tthis.clearSearchHighlights();\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport {\n\tKTSelectConfigInterface,\n\tKTSelectState,\n\tKTSelectOption as KTSelectOptionData,\n} from './config';\nimport { KTSelectOption } from './option';\nimport { KTSelectRemote } from './remote';\nimport { KTSelectSearch } from './search';\nimport { defaultTemplates } from './templates';\nimport { KTSelectCombobox } from './combobox';\nimport { KTSelectDropdown } from './dropdown';\nimport {\n\thandleDropdownKeyNavigation,\n\tfilterOptions,\n\tFocusManager,\n\tEventManager,\n} from './utils';\nimport { KTSelectTags } from './tags';\nimport { SelectMode } from './types';\n\nexport class KTSelect extends KTComponent {\n\t// Core properties\n\tprotected override readonly _name: string = 'select';\n\tprotected override readonly _dataOptionPrefix: string = 'kt-'; // Use 'kt-' prefix to support data-kt-select-option attributes\n\tprotected override readonly _config: KTSelectConfigInterface;\n\tprotected override _defaultConfig: KTSelectConfigInterface;\n\n\t// DOM elements\n\tprivate _wrapperElement: HTMLElement;\n\tprivate _displayElement: HTMLElement;\n\tprivate _dropdownContentElement: HTMLElement;\n\tprivate _searchInputElement: HTMLInputElement | null;\n\tprivate _valueDisplayElement: HTMLElement;\n\tprivate _options: NodeListOf<HTMLElement>;\n\n\t// State\n\tprivate _dropdownIsOpen: boolean = false;\n\tprivate _state: KTSelectState;\n\tprivate _searchModule: KTSelectSearch;\n\tprivate _remoteModule: KTSelectRemote;\n\tprivate _comboboxModule: KTSelectCombobox | null = null;\n\tprivate _tagsModule: KTSelectTags | null = null;\n\tprivate _dropdownModule: KTSelectDropdown | null = null;\n\tprivate _loadMoreIndicator: HTMLElement | null = null;\n\tprivate _focusManager: FocusManager;\n\tprivate _eventManager: EventManager;\n\n\t/**\n\t * Constructor: Initializes the select component\n\t */\n\tconstructor(element: HTMLElement, config?: KTSelectConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element, this._name)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._state = new KTSelectState(this._config);\n\t\tthis._config = this._state.getConfig();\n\n\t\t(element as any).instance = this;\n\n\t\t// Initialize event manager\n\t\tthis._eventManager = new EventManager();\n\n\t\t// Initialize remote module if remote data is enabled\n\t\tif (this._config.remote) {\n\t\t\tthis._remoteModule = new KTSelectRemote(this._config, this._element);\n\t\t\tthis._initializeRemoteData();\n\t\t} else {\n\t\t\tthis._state\n\t\t\t\t.setItems()\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (this._config.debug)\n\t\t\t\t\t\tconsole.log('Setting up component after remote data is loaded');\n\t\t\t\t\tthis._setupComponent();\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Error setting items:', error);\n\t\t\t\t\t// Handle the error, e.g., display an error message to the user\n\t\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Initialize remote data fetching\n\t */\n\tprivate _initializeRemoteData() {\n\t\tif (!this._remoteModule || !this._config.remote) return;\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log('Initializing remote data with URL:', this._config.dataUrl);\n\n\t\t// Show loading state\n\t\tthis._renderLoadingState();\n\n\t\t// Fetch remote data\n\t\tthis._remoteModule\n\t\t\t.fetchData()\n\t\t\t.then((items) => {\n\t\t\t\tif (this._config.debug) console.log('Remote data fetched:', items);\n\n\t\t\t\t// Remove placeholder/loading options before setting new items\n\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t// Update state with fetched items\n\t\t\t\tthis._state\n\t\t\t\t\t.setItems(items)\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t// Generate options from the fetched data\n\t\t\t\t\t\tthis._generateOptionsHtml(this._element);\n\n\t\t\t\t\t\tif (this._config.debug)\n\t\t\t\t\t\t\tconsole.log('Generating options HTML from remote data');\n\t\t\t\t\t\tthis._setupComponent();\n\n\t\t\t\t\t\t// Add pagination \"Load More\" button if needed\n\t\t\t\t\t\tif (this._config.pagination && this._remoteModule.hasMorePages()) {\n\t\t\t\t\t\t\tthis._addLoadMoreButton();\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tconsole.error('Error setting items:', error);\n\t\t\t\t\t\tthis._renderErrorState(error.message || 'Failed to load data');\n\t\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error fetching remote data:', error);\n\t\t\t\tthis._renderErrorState(\n\t\t\t\t\tthis._remoteModule.getErrorMessage() || 'Failed to load data',\n\t\t\t\t);\n\t\t\t});\n\t}\n\n\t/**\n\t * Clear existing options from the select element\n\t */\n\tprivate _clearExistingOptions() {\n\t\t// Keep only the empty/placeholder option and remove the rest\n\t\tconst options = Array.from(\n\t\t\tthis._element.querySelectorAll('option:not([value=\"\"])'),\n\t\t);\n\t\toptions.forEach((option) => option.remove());\n\n\t\t// Ensure we have at least an empty option\n\t\tif (this._element.querySelectorAll('option').length === 0) {\n\t\t\tconst emptyOption = defaultTemplates.emptyOption({\n\t\t\t\t...this._config,\n\t\t\t\tplaceholder: this._config.placeholder,\n\t\t\t});\n\t\t\tthis._element.appendChild(emptyOption);\n\t\t}\n\t}\n\n\t/**\n\t * Helper to show a dropdown message (error, loading, noResults)\n\t */\n\tprivate _showDropdownMessage(\n\t\ttype: 'error' | 'loading' | 'noResults',\n\t\tmessage?: string,\n\t) {\n\t\tif (!this._dropdownContentElement) return;\n\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t'[data-kt-select-options-container]',\n\t\t);\n\t\tif (!optionsContainer) return;\n\n\t\tswitch (type) {\n\t\t\tcase 'error':\n\t\t\t\toptionsContainer.innerHTML = defaultTemplates.error({\n\t\t\t\t\t...this._config,\n\t\t\t\t\terrorMessage: message,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase 'loading':\n\t\t\t\toptionsContainer.innerHTML = defaultTemplates.loading(\n\t\t\t\t\tthis._config,\n\t\t\t\t\tmessage || 'Loading...',\n\t\t\t\t).outerHTML;\n\t\t\t\tbreak;\n\t\t\tcase 'noResults':\n\t\t\t\toptionsContainer.innerHTML = '';\n\t\t\t\toptionsContainer.appendChild(defaultTemplates.noResults(this._config));\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Render loading state in dropdown\n\t */\n\tprivate _renderLoadingState() {\n\t\tif (this._element.querySelectorAll('option').length <= 1) {\n\t\t\tconst existingLoadingOptions = this._element.querySelectorAll(\n\t\t\t\t'option[disabled][selected][value=\"\"]',\n\t\t\t);\n\t\t\texistingLoadingOptions.forEach((option) => option.remove());\n\t\t\tthis._showDropdownMessage('loading', 'Loading options...');\n\t\t}\n\t}\n\n\t/**\n\t * Render error state\n\t * @param message Error message\n\t */\n\tprivate _renderErrorState(message: string) {\n\t\t// Create error option if the select is empty\n\t\tif (this._element.querySelectorAll('option').length <= 1) {\n\t\t\tconst loadingOptions = this._element.querySelectorAll(\n\t\t\t\t'option[disabled]:not([value])',\n\t\t\t);\n\t\t\tloadingOptions.forEach((option) => option.remove());\n\n\t\t\t// Use template function for error option instead of hardcoded element\n\t\t\tconst errorOption = defaultTemplates.errorOption({\n\t\t\t\t...this._config,\n\t\t\t\terrorMessage: message,\n\t\t\t});\n\t\t\tthis._element.appendChild(errorOption);\n\t\t}\n\n\t\t// If dropdown is already created, show error message there\n\t\tthis._showDropdownMessage('error', message);\n\n\t\tif (!this._wrapperElement) {\n\t\t\tif (this._config.debug) console.log('Setting up component after error');\n\t\t\tthis._setupComponent();\n\t\t}\n\t}\n\n\t/**\n\t * Add \"Load More\" button for pagination\n\t */\n\tprivate _addLoadMoreButton() {\n\t\tif (!this._dropdownContentElement || !this._config.pagination) return;\n\n\t\t// Remove existing button if any\n\t\tif (this._loadMoreIndicator) {\n\t\t\tthis._loadMoreIndicator.remove();\n\t\t\tthis._loadMoreIndicator = null;\n\t\t}\n\n\t\t// Create load more button using template\n\t\tthis._loadMoreIndicator = defaultTemplates.loadMore(this._config);\n\n\t\t// Add to dropdown\n\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t'[data-kt-select-options-container]',\n\t\t);\n\t\tif (optionsContainer) {\n\t\t\toptionsContainer.appendChild(this._loadMoreIndicator);\n\t\t} else {\n\t\t\tthis._dropdownContentElement.appendChild(this._loadMoreIndicator);\n\t\t}\n\n\t\t// Add event listener\n\t\tthis._loadMoreIndicator.addEventListener(\n\t\t\t'click',\n\t\t\tthis._handleLoadMore.bind(this),\n\t\t);\n\t}\n\n\t/**\n\t * Handle load more button click\n\t */\n\tprivate _handleLoadMore() {\n\t\tif (!this._remoteModule || !this._config.pagination) return;\n\n\t\t// Show loading state\n\t\tif (this._loadMoreIndicator) {\n\t\t\tthis._loadMoreIndicator.textContent = 'Loading...';\n\t\t}\n\n\t\t// Fetch next page\n\t\tthis._remoteModule\n\t\t\t.loadNextPage()\n\t\t\t.then((newItems) => {\n\t\t\t\t// Get existing items\n\t\t\t\tconst existingItems = this._state.getItems();\n\n\t\t\t\t// Combine new items with existing items\n\t\t\t\tthis._state\n\t\t\t\t\t.setItems([...existingItems, ...newItems])\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t// Update options in the dropdown\n\t\t\t\t\t\tthis._updateOptionsInDropdown(newItems);\n\n\t\t\t\t\t\t// Check if there are more pages\n\t\t\t\t\t\tif (this._remoteModule.hasMorePages()) {\n\t\t\t\t\t\t\t// Reset load more button\n\t\t\t\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\t\t\t\tthis._loadMoreIndicator.textContent =\n\t\t\t\t\t\t\t\t\tthis._config.loadMoreText || 'Load more...';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Remove load more button if no more pages\n\t\t\t\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\t\t\t\tthis._loadMoreIndicator.remove();\n\t\t\t\t\t\t\t\tthis._loadMoreIndicator = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tconsole.error('Error updating items:', error);\n\n\t\t\t\t\t\t// Reset load more button\n\t\t\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\t\t\tthis._loadMoreIndicator.textContent = 'Error loading more items';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error loading more items:', error);\n\n\t\t\t\t// Reset load more button\n\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\tthis._loadMoreIndicator.textContent = 'Error loading more items';\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t/**\n\t * Update options in the dropdown\n\t * @param newItems New items to add to the dropdown\n\t */\n\tprivate _updateOptionsInDropdown(newItems: KTSelectOptionData[]) {\n\t\tif (!this._dropdownContentElement || !newItems.length) return;\n\n\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t'[data-kt-select-options-container]',\n\t\t);\n\t\tif (!optionsContainer) return;\n\n\t\t// Get the load more button\n\t\tconst loadMoreButton = optionsContainer.querySelector(\n\t\t\t'[data-kt-select-load-more]',\n\t\t);\n\n\t\t// Process each new item\n\t\tnewItems.forEach((item) => {\n\t\t\t// Create option for the original select\n\t\t\tconst selectOption = defaultTemplates.emptyOption({\n\t\t\t\t...this._config,\n\t\t\t\tplaceholder: item.title || 'Unnamed option',\n\t\t\t});\n\t\t\tselectOption.value = item.id || '';\n\n\t\t\t// Add description and icon attributes if available and valid\n\t\t\tif (\n\t\t\t\titem.description &&\n\t\t\t\titem.description !== 'null' &&\n\t\t\t\titem.description !== 'undefined'\n\t\t\t) {\n\t\t\t\tselectOption.setAttribute(\n\t\t\t\t\t'data-kt-select-option-description',\n\t\t\t\t\titem.description,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (item.icon && item.icon !== 'null' && item.icon !== 'undefined') {\n\t\t\t\tselectOption.setAttribute('data-kt-select-option-icon', item.icon);\n\t\t\t}\n\n\t\t\t// Add the option to the original select element\n\t\t\tthis._element.appendChild(selectOption);\n\n\t\t\t// Create option element for the dropdown using the KTSelectOption class\n\t\t\t// This ensures consistent option rendering\n\t\t\tconst ktOption = new KTSelectOption(selectOption, this._config);\n\t\t\tconst renderedOption = ktOption.render();\n\n\t\t\t// Add to dropdown container\n\t\t\tif (loadMoreButton) {\n\t\t\t\t// Insert before the load more button\n\t\t\t\toptionsContainer.insertBefore(renderedOption, loadMoreButton);\n\t\t\t} else {\n\t\t\t\t// Append to the end\n\t\t\t\toptionsContainer.appendChild(renderedOption);\n\t\t\t}\n\t\t});\n\n\t\t// Update options NodeList to include the new options\n\t\tthis._options = this._wrapperElement.querySelectorAll(\n\t\t\t`[data-kt-select-option]`,\n\t\t) as NodeListOf<HTMLElement>;\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log(`Added ${newItems.length} more options to dropdown`);\n\t}\n\n\t/**\n\t * ========================================================================\n\t * INITIALIZATION METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Set up the component after everything is initialized\n\t */\n\tprivate _setupComponent() {\n\t\t// Setup HTML structure\n\t\tthis._createHtmlStructure();\n\t\tthis._setupElementReferences();\n\t\tthis._initZIndex();\n\n\t\t// Initialize options\n\t\tthis._initializeOptionsHtml();\n\t\tthis._preSelectOptions(this._element);\n\n\t\t// Apply disabled state if needed\n\t\tthis._applyInitialDisabledState();\n\n\t\t// Initialize search if enabled\n\t\tif (this._config.enableSearch) {\n\t\t\tthis._initializeSearchModule();\n\t\t}\n\n\t\t// Initialize combobox if enabled\n\t\tif (this._config.mode === SelectMode.COMBOBOX) {\n\t\t\tthis._comboboxModule = new KTSelectCombobox(this);\n\t\t}\n\n\t\t// Initialize tags if enabled\n\t\tif (this._config.mode === SelectMode.TAGS) {\n\t\t\tthis._tagsModule = new KTSelectTags(this);\n\t\t}\n\n\t\t// Initialize focus manager after dropdown element is created\n\t\tthis._focusManager = new FocusManager(\n\t\t\tthis._dropdownContentElement,\n\t\t\t'[data-kt-select-option]',\n\t\t\tthis._config,\n\t\t);\n\n\t\t// Initialize dropdown module after all elements are created\n\t\tthis._dropdownModule = new KTSelectDropdown(\n\t\t\tthis._wrapperElement,\n\t\t\tthis._displayElement,\n\t\t\tthis._dropdownContentElement,\n\t\t\tthis._config,\n\t\t);\n\n\t\t// Update display and set ARIA attributes\n\t\tthis._updateDisplayAndAriaAttributes();\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._setAriaAttributes();\n\n\t\t// Attach event listeners after all modules are initialized\n\t\tthis._attachEventListeners();\n\t}\n\n\t/**\n\t * Initialize options HTML from data\n\t */\n\tprivate _initializeOptionsHtml() {\n\t\tthis._generateOptionsHtml(this._element);\n\t}\n\n\t/**\n\t * Creates the HTML structure for the select component\n\t */\n\tprivate _createHtmlStructure() {\n\t\tconst options = Array.from(this._element.querySelectorAll('option'));\n\n\t\t// Create wrapper and display elements\n\t\tconst wrapperElement = defaultTemplates.main(this._config);\n\t\tconst displayElement = defaultTemplates.display(this._config);\n\n\t\t// Add the display element to the wrapper\n\t\twrapperElement.appendChild(displayElement);\n\n\t\t// Create an empty dropdown first (without options) using template\n\t\tconst dropdownElement = defaultTemplates.dropdownContent({\n\t\t\t...this._config,\n\t\t\tzindex: this._config.dropdownZindex,\n\t\t});\n\n\t\t// Add search input if needed\n\t\tconst isCombobox = this._config.mode === SelectMode.COMBOBOX;\n\t\tconst hasSearch = this._config.enableSearch && !isCombobox;\n\n\t\tif (hasSearch) {\n\t\t\tconst searchElement = defaultTemplates.search(this._config);\n\t\t\tdropdownElement.appendChild(searchElement);\n\t\t}\n\n\t\t// Create options container using template\n\t\tconst optionsContainer = defaultTemplates.optionsContainer(this._config);\n\n\t\t// Add each option directly to the container\n\t\toptions.forEach((optionElement) => {\n\t\t\t// Skip empty placeholder options (only if BOTH value AND text are empty)\n\t\t\t// This allows options with empty value but visible text to display in dropdown\n\t\t\tif (\n\t\t\t\toptionElement.value === '' &&\n\t\t\t\toptionElement.textContent.trim() === ''\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create new KTSelectOption instance for each option\n\t\t\tconst selectOption = new KTSelectOption(optionElement, this._config);\n\t\t\tconst renderedOption = selectOption.render();\n\n\t\t\t// Append directly to options container\n\t\t\toptionsContainer.appendChild(renderedOption);\n\t\t});\n\n\t\t// Add options container to dropdown\n\t\tdropdownElement.appendChild(optionsContainer);\n\n\t\t// Add dropdown to wrapper\n\t\twrapperElement.appendChild(dropdownElement);\n\n\t\t// Insert after the original element\n\t\tthis._element.after(wrapperElement);\n\t\tthis._element.style.display = 'none';\n\t}\n\n\t/**\n\t * Setup all element references after DOM is created\n\t */\n\tprivate _setupElementReferences() {\n\t\tthis._wrapperElement = this._element.nextElementSibling as HTMLElement;\n\n\t\t// Get display element\n\t\tthis._displayElement = this._wrapperElement.querySelector(\n\t\t\t`[data-kt-select-display]`,\n\t\t) as HTMLElement;\n\n\t\t// Get dropdown content element - this is critical for dropdown functionality\n\t\tthis._dropdownContentElement = this._wrapperElement.querySelector(\n\t\t\t`[data-kt-select-dropdown-content]`,\n\t\t) as HTMLElement;\n\n\t\tif (!this._dropdownContentElement) {\n\t\t\tconsole.error('Dropdown content element not found', this._wrapperElement);\n\t\t}\n\n\t\t// Get search input element - this is used for the search functionality\n\t\t// First check if it's in dropdown, then check if it's in display (for combobox)\n\t\tthis._searchInputElement = this._dropdownContentElement.querySelector(\n\t\t\t`[data-kt-select-search]`,\n\t\t) as HTMLInputElement;\n\n\t\t// If not found in dropdown, check if it's the display element itself (for combobox)\n\t\tif (\n\t\t\t!this._searchInputElement &&\n\t\t\tthis._config.mode === SelectMode.COMBOBOX\n\t\t) {\n\t\t\tthis._searchInputElement = this._displayElement as HTMLInputElement;\n\t\t}\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log(\n\t\t\t\t'Search input found:',\n\t\t\t\tthis._searchInputElement ? 'Yes' : 'No',\n\t\t\t\t'Mode:',\n\t\t\t\tthis._config.mode,\n\t\t\t\t'EnableSearch:',\n\t\t\t\tthis._config.enableSearch,\n\t\t\t);\n\n\t\tthis._valueDisplayElement = this._wrapperElement.querySelector(\n\t\t\t`[data-kt-select-value]`,\n\t\t) as HTMLElement;\n\n\t\tthis._options = this._wrapperElement.querySelectorAll(\n\t\t\t`[data-kt-select-option]`,\n\t\t) as NodeListOf<HTMLElement>;\n\t}\n\n\t/**\n\t * Attach all event listeners to elements\n\t */\n\tprivate _attachEventListeners() {\n\t\t// Document level event listeners\n\t\tdocument.addEventListener('click', this._handleDocumentClick.bind(this));\n\t\tdocument.addEventListener('keydown', this._handleEscKey.bind(this));\n\n\t\t// Dropdown option click events\n\t\tthis._eventManager.addListener(\n\t\t\tthis._dropdownContentElement,\n\t\t\t'click',\n\t\t\tthis._handleDropdownOptionClick.bind(this),\n\t\t);\n\n\t\t// Only attach click handler to display element\n\t\tthis._eventManager.addListener(\n\t\t\tthis._displayElement,\n\t\t\t'click',\n\t\t\tthis._handleDropdownClick.bind(this),\n\t\t);\n\n\t\t// Only attach keyboard navigation to display element if NOT in combobox mode\n\t\t// This prevents conflicts with the combobox module's keyboard handler\n\t\tif (this._config.mode !== SelectMode.COMBOBOX) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log(\n\t\t\t\t\t'Attaching keyboard navigation to display element (non-combobox mode)',\n\t\t\t\t);\n\t\t\tthis._eventManager.addListener(\n\t\t\t\tthis._displayElement,\n\t\t\t\t'keydown',\n\t\t\t\tthis._handleDropdownKeyDown.bind(this),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Initialize search module if search is enabled\n\t */\n\tprivate _initializeSearchModule() {\n\t\tif (this._config.enableSearch) {\n\t\t\tthis._searchModule = new KTSelectSearch(this);\n\t\t\tthis._searchModule.init();\n\n\t\t\t// If remote search is enabled, add event listener for search input\n\t\t\tif (\n\t\t\t\tthis._config.remote &&\n\t\t\t\tthis._config.searchParam &&\n\t\t\t\tthis._searchInputElement\n\t\t\t) {\n\t\t\t\tthis._searchInputElement.addEventListener(\n\t\t\t\t\t'input',\n\t\t\t\t\tthis._handleRemoteSearch.bind(this),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Apply ARIA attributes and update display\n\t */\n\tprivate _updateDisplayAndAriaAttributes() {\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._setAriaAttributes();\n\t}\n\n\t/**\n\t * Apply initial disabled state if configured\n\t */\n\tprivate _applyInitialDisabledState() {\n\t\tif (this._config.disabled) {\n\t\t\tthis.getElement().classList.add('disabled');\n\t\t\tthis.getElement().setAttribute('disabled', 'disabled');\n\t\t\tthis._wrapperElement.classList.add('disabled');\n\t\t}\n\t}\n\n\t/**\n\t * Generate options HTML from data items\n\t */\n\tprivate _generateOptionsHtml(element: HTMLElement) {\n\t\tconst items = this._state.getItems() || [];\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log(`Generating options HTML from ${items.length} items`);\n\n\t\t// Only modify options if we have items to replace them with\n\t\tif (items && items.length > 0) {\n\t\t\t// Clear existing options except the first empty one\n\t\t\tconst options = element.querySelectorAll('option:not(:first-child)');\n\t\t\toptions.forEach((option) => option.remove());\n\n\t\t\t// Generate options from data\n\t\t\titems.forEach((item) => {\n\t\t\t\tconst optionElement = document.createElement('option');\n\n\t\t\t\t// Get value - use item.id directly if available, otherwise try dataValueField\n\t\t\t\tlet value = '';\n\t\t\t\tif (item.id !== undefined) {\n\t\t\t\t\tvalue = String(item.id);\n\t\t\t\t} else if (this._config.dataValueField) {\n\t\t\t\t\tconst extractedValue = this._getValueByKey(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tthis._config.dataValueField,\n\t\t\t\t\t);\n\t\t\t\t\tvalue = extractedValue !== null ? String(extractedValue) : '';\n\t\t\t\t}\n\n\t\t\t\t// Get label - use item.title directly if available, otherwise try dataFieldText\n\t\t\t\tlet label = '';\n\t\t\t\tif (item.title !== undefined) {\n\t\t\t\t\tlabel = String(item.title);\n\t\t\t\t} else if (this._config.dataFieldText) {\n\t\t\t\t\tconst extractedLabel = this._getValueByKey(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tthis._config.dataFieldText,\n\t\t\t\t\t);\n\t\t\t\t\tlabel =\n\t\t\t\t\t\textractedLabel !== null ? String(extractedLabel) : 'Unnamed option';\n\t\t\t\t}\n\n\t\t\t\t// Get description - skip if null, undefined, or \"null\" string\n\t\t\t\tlet description = null;\n\t\t\t\tif (\n\t\t\t\t\titem.description !== undefined &&\n\t\t\t\t\titem.description !== null &&\n\t\t\t\t\tString(item.description) !== 'null' &&\n\t\t\t\t\tString(item.description) !== 'undefined'\n\t\t\t\t) {\n\t\t\t\t\tdescription = String(item.description);\n\t\t\t\t} else if (this._config.dataFieldDescription) {\n\t\t\t\t\tconst extractedDesc = this._getValueByKey(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tthis._config.dataFieldDescription,\n\t\t\t\t\t);\n\t\t\t\t\tif (\n\t\t\t\t\t\textractedDesc !== null &&\n\t\t\t\t\t\textractedDesc !== undefined &&\n\t\t\t\t\t\tString(extractedDesc) !== 'null' &&\n\t\t\t\t\t\tString(extractedDesc) !== 'undefined'\n\t\t\t\t\t) {\n\t\t\t\t\t\tdescription = String(extractedDesc);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Get icon - skip if null, undefined, or \"null\" string\n\t\t\t\tlet icon = null;\n\t\t\t\tif (\n\t\t\t\t\titem.icon !== undefined &&\n\t\t\t\t\titem.icon !== null &&\n\t\t\t\t\tString(item.icon) !== 'null' &&\n\t\t\t\t\tString(item.icon) !== 'undefined'\n\t\t\t\t) {\n\t\t\t\t\ticon = String(item.icon);\n\t\t\t\t} else if (this._config.dataFieldIcon) {\n\t\t\t\t\tconst extractedIcon = this._getValueByKey(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tthis._config.dataFieldIcon,\n\t\t\t\t\t);\n\t\t\t\t\tif (\n\t\t\t\t\t\textractedIcon !== null &&\n\t\t\t\t\t\textractedIcon !== undefined &&\n\t\t\t\t\t\tString(extractedIcon) !== 'null' &&\n\t\t\t\t\t\tString(extractedIcon) !== 'undefined'\n\t\t\t\t\t) {\n\t\t\t\t\t\ticon = String(extractedIcon);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Log the extracted values for debugging\n\t\t\t\tif (this._config.debug)\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Option: value=${value}, label=${label}, desc=${description ? description : 'none'}, icon=${icon ? icon : 'none'}`,\n\t\t\t\t\t);\n\n\t\t\t\t// Set option attributes\n\t\t\t\toptionElement.value = value;\n\t\t\t\toptionElement.textContent = label || 'Unnamed option';\n\n\t\t\t\tif (description) {\n\t\t\t\t\toptionElement.setAttribute(\n\t\t\t\t\t\t'data-kt-select-option-description',\n\t\t\t\t\t\tdescription,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (icon) {\n\t\t\t\t\toptionElement.setAttribute('data-kt-select-option-icon', icon);\n\t\t\t\t}\n\n\t\t\t\tif (item.selected) {\n\t\t\t\t\toptionElement.setAttribute('selected', 'selected');\n\t\t\t\t}\n\n\t\t\t\telement.appendChild(optionElement);\n\t\t\t});\n\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log(`Added ${items.length} options to select element`);\n\t\t} else {\n\t\t\tif (this._config.debug) console.log('No items to generate options from');\n\t\t}\n\t}\n\n\t/**\n\t * Extract nested property value from object using dot notation\n\t */\n\tprivate _getValueByKey(obj: any, key: string): any {\n\t\tif (!key || !obj) return null;\n\n\t\t// Use reduce to walk through the object by splitting the key on dots\n\t\tconst result = key\n\t\t\t.split('.')\n\t\t\t.reduce((o, k) => (o && o[k] !== undefined ? o[k] : null), obj);\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log(\n\t\t\t\t`Extracting [${key}] from object => ${result !== null ? JSON.stringify(result) : 'null'}`,\n\t\t\t);\n\t\treturn result;\n\t}\n\n\t/**\n\t * Pre-select options that have the selected attribute\n\t */\n\tprivate _preSelectOptions(element: HTMLElement) {\n\t\t// Handle options with selected attribute\n\t\tArray.from(element.querySelectorAll('option[selected]')).forEach(\n\t\t\t(option) => {\n\t\t\t\tconst value = (option as HTMLOptionElement).value;\n\t\t\t\tthis._selectOption(value);\n\t\t\t},\n\t\t);\n\n\t\t// Handle data-kt-select-pre-selected attribute for React compatibility\n\t\tconst preSelectedValues = element.getAttribute(\n\t\t\t'data-kt-select-pre-selected',\n\t\t);\n\t\tif (preSelectedValues) {\n\t\t\tconst values = preSelectedValues.split(',').map((v) => v.trim());\n\t\t\tvalues.forEach((value) => {\n\t\t\t\tif (value) {\n\t\t\t\t\tthis._selectOption(value);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set appropriate z-index for dropdown\n\t */\n\tprivate _initZIndex() {\n\t\tlet zindex: number = this._config.dropdownZindex as number;\n\t\tif (\n\t\t\tparseInt(KTDom.getCssProp(this._dropdownContentElement, 'z-index')) >\n\t\t\tzindex\n\t\t) {\n\t\t\tzindex = parseInt(\n\t\t\t\tKTDom.getCssProp(this._dropdownContentElement, 'z-index'),\n\t\t\t);\n\t\t}\n\t\tif (KTDom.getHighestZindex(this._wrapperElement) > zindex) {\n\t\t\tzindex = KTDom.getHighestZindex(this._wrapperElement) + 1;\n\t\t}\n\t\tthis._dropdownContentElement.style.zIndex = String(zindex);\n\t}\n\n\t/**\n\t * ========================================================================\n\t * DROPDOWN MANAGEMENT\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Toggle dropdown visibility\n\t */\n\tpublic toggleDropdown() {\n\t\tif (this._config.debug) console.log('toggleDropdown called');\n\t\tif (this._dropdownModule) {\n\t\t\t// Always use the dropdown module's state to determine whether to open or close\n\t\t\tif (this._dropdownModule.isOpen()) {\n\t\t\t\tif (this._config.debug) console.log('Dropdown is open, closing...');\n\t\t\t\tthis.closeDropdown();\n\t\t\t} else {\n\t\t\t\tif (this._config.debug) console.log('Dropdown is closed, opening...');\n\t\t\t\tthis.openDropdown();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Open the dropdown\n\t */\n\tpublic openDropdown() {\n\t\tif (this._config.debug)\n\t\t\tconsole.log(\n\t\t\t\t'openDropdown called, dropdownModule exists:',\n\t\t\t\t!!this._dropdownModule,\n\t\t\t);\n\n\t\tif (!this._dropdownModule) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log('Early return from openDropdown - module missing');\n\t\t\treturn;\n\t\t}\n\n\t\t// Don't open dropdown if the select is disabled\n\t\tif (this._config.disabled) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log('Early return from openDropdown - select is disabled');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log('Opening dropdown via dropdownModule...');\n\n\t\t// Set our internal flag to match what we're doing\n\t\tthis._dropdownIsOpen = true;\n\n\t\t// Open the dropdown via the module\n\t\tthis._dropdownModule.open();\n\n\t\t// Dispatch custom event\n\t\tthis._dispatchEvent('show');\n\t\tthis._fireEvent('show');\n\n\t\t// Focus search input if configured and exists\n\t\tif (\n\t\t\tthis._config.enableSearch &&\n\t\t\tthis._config.searchAutofocus &&\n\t\t\tthis._searchInputElement\n\t\t) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._searchInputElement.focus();\n\t\t\t}, 50);\n\t\t}\n\n\t\t// Update ARIA states\n\t\tthis._setAriaAttributes();\n\n\t\t// Focus the first selected option or first option if nothing selected\n\t\tthis._focusSelectedOption();\n\t}\n\n\t/**\n\t * Close the dropdown\n\t */\n\tpublic closeDropdown() {\n\t\tif (this._config.debug)\n\t\t\tconsole.log(\n\t\t\t\t'closeDropdown called, dropdownModule exists:',\n\t\t\t\t!!this._dropdownModule,\n\t\t\t);\n\n\t\t// Only check if dropdown module exists, not dropdownIsOpen flag\n\t\tif (!this._dropdownModule) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log('Early return from closeDropdown - module missing');\n\t\t\treturn;\n\t\t}\n\n\t\t// Always close by delegating to the dropdown module, which is the source of truth\n\t\tif (this._config.debug)\n\t\t\tconsole.log('Closing dropdown via dropdownModule...');\n\n\t\t// Clear search input and highlights if the dropdown is closing\n\t\tif (this._searchModule && this._searchInputElement) {\n\t\t\t// Clear search input if configured to do so\n\t\t\tif (this._config.clearSearchOnClose) {\n\t\t\t\tthis._searchInputElement.value = '';\n\t\t\t}\n\n\t\t\t// Always clear the highlights when dropdown closes\n\t\t\tthis._searchModule.clearSearchHighlights();\n\t\t}\n\n\t\t// Set our internal flag to match what we're doing\n\t\tthis._dropdownIsOpen = false;\n\n\t\t// Call the dropdown module's close method\n\t\tthis._dropdownModule.close();\n\n\t\t// Reset all focus states\n\t\tif (this._focusManager) {\n\t\t\tthis._focusManager.resetFocus();\n\t\t}\n\n\t\t// Dispatch custom events\n\t\tthis._dispatchEvent('close');\n\t\tthis._fireEvent('close');\n\n\t\t// Update ARIA states\n\t\tthis._setAriaAttributes();\n\t\tif (this._config.debug) console.log('closeDropdown complete');\n\t}\n\n\t/**\n\t * Update dropdown position\n\t */\n\tpublic updateDropdownPosition() {\n\t\tif (this._dropdownModule) {\n\t\t\tthis._dropdownModule.updatePosition();\n\t\t}\n\t}\n\n\t/**\n\t * Focus on the first selected option if any exists in the dropdown\n\t */\n\tprivate _focusSelectedOption() {\n\t\t// Get selected options\n\t\tconst selectedOptions = this.getSelectedOptions();\n\t\tif (selectedOptions.length === 0) return;\n\n\t\t// Get the first selected option element\n\t\tconst firstSelectedValue = selectedOptions[0];\n\n\t\t// Use the FocusManager to focus on the option\n\t\tthis._focusManager.focusOptionByValue(firstSelectedValue);\n\t}\n\n\t/**\n\t * ========================================================================\n\t * SELECTION MANAGEMENT\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Select an option by value\n\t */\n\tprivate _selectOption(value: string) {\n\t\t// Get current selection state\n\t\tconst isSelected = this._state.isSelected(value);\n\n\t\t// Toggle selection in state\n\t\tif (this._config.multiple) {\n\t\t\t// Toggle in multiple mode\n\t\t\tthis._state.toggleSelectedOptions(value);\n\t\t} else {\n\t\t\t// Set as only selection in single mode\n\t\t\tthis._state.setSelectedOptions(value);\n\t\t}\n\n\t\t// Update the original select element's option selected state\n\t\tconst optionEl = Array.from(this._element.querySelectorAll('option')).find(\n\t\t\t(opt) => opt.value === value,\n\t\t) as HTMLOptionElement;\n\n\t\tif (optionEl) {\n\t\t\tif (this._config.multiple) {\n\t\t\t\t// Toggle the selection for multiple select\n\t\t\t\toptionEl.selected = !isSelected;\n\t\t\t} else {\n\t\t\t\t// Set as only selection for single select\n\t\t\t\tArray.from(this._element.querySelectorAll('option')).forEach((opt) => {\n\t\t\t\t\t(opt as HTMLOptionElement).selected = opt.value === value;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Update the visual display of selected options\n\t\tthis.updateSelectedOptionDisplay();\n\n\t\t// Update option classes without re-rendering the dropdown content\n\t\tthis._updateSelectedOptionClass();\n\n\t\t// Dispatch standard and custom change events\n\t\tthis._dispatchEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t\tthis._fireEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t}\n\n\t/**\n\t * Update selected option display value\n\t */\n\tpublic updateSelectedOptionDisplay() {\n\t\tconst selectedOptions = this.getSelectedOptions();\n\n\t\tif (this._config.renderSelected) {\n\t\t\t// Use the custom renderSelected function if provided\n\t\t\tthis._updateValueDisplay(this._config.renderSelected(selectedOptions));\n\t\t} else {\n\t\t\tif (selectedOptions.length === 0) {\n\t\t\t\tif (this._config.mode !== SelectMode.COMBOBOX) {\n\t\t\t\t\tthis._updateValueDisplay(this._config.placeholder); // Use innerHTML for placeholder\n\t\t\t\t}\n\t\t\t} else if (this._config.multiple) {\n\t\t\t\tif (this._config.mode === SelectMode.TAGS) {\n\t\t\t\t\t// Use the tags module to render selected options as tags\n\t\t\t\t\tif (this._tagsModule) {\n\t\t\t\t\t\tthis._tagsModule.updateTagsDisplay(selectedOptions);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Fallback if tags module not initialized for some reason\n\t\t\t\t\t\tthis._updateValueDisplay(selectedOptions.join(', '));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Render as comma-separated values\n\t\t\t\t\tconst displayText = selectedOptions\n\t\t\t\t\t\t.map((option) => this._getOptionInnerHtml(option) || '')\n\t\t\t\t\t\t.join(', ');\n\t\t\t\t\tthis._updateValueDisplay(displayText);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst selectedOption = selectedOptions[0];\n\t\t\t\tif (selectedOption) {\n\t\t\t\t\tconst selectedText = this._getOptionInnerHtml(selectedOption);\n\t\t\t\t\tthis._updateValueDisplay(selectedText);\n\n\t\t\t\t\t// Update combobox input value if in combobox mode\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis._config.mode === SelectMode.COMBOBOX &&\n\t\t\t\t\t\tthis._comboboxModule\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis._comboboxModule.updateSelectedValue(selectedText);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis._updateValueDisplay(this._config.placeholder);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update any debug display boxes if they exist\n\t\tthis._updateDebugDisplays();\n\t}\n\n\t/**\n\t * Update the value display element\n\t */\n\tprivate _updateValueDisplay(value: string) {\n\t\tif (this._config.mode === SelectMode.COMBOBOX) {\n\t\t\t// For combobox, we only update the hidden value element, not the input\n\t\t\t// The combobox module will handle updating the input value\n\t\t\tif (!this._comboboxModule) {\n\t\t\t\t(this._valueDisplayElement as HTMLInputElement).value = value;\n\t\t\t}\n\t\t} else {\n\t\t\tthis._valueDisplayElement.innerHTML = value;\n\t\t}\n\t}\n\n\t/**\n\t * Update debug displays if present\n\t */\n\tprivate _updateDebugDisplays() {\n\t\t// Check if we're in a test environment with debug boxes\n\t\tconst selectId = this.getElement().id;\n\t\tif (selectId) {\n\t\t\tconst debugElement = document.getElementById(`${selectId}-value`);\n\t\t\tif (debugElement) {\n\t\t\t\tconst selectedOptions = this.getSelectedOptions();\n\n\t\t\t\t// Format display based on selection mode\n\t\t\t\tif (this._config.multiple) {\n\t\t\t\t\t// For multiple selection, show comma-separated list\n\t\t\t\t\tdebugElement.textContent =\n\t\t\t\t\t\tselectedOptions.length > 0 ? selectedOptions.join(', ') : 'None';\n\t\t\t\t} else {\n\t\t\t\t\t// For single selection, show just the one value\n\t\t\t\t\tdebugElement.textContent =\n\t\t\t\t\t\tselectedOptions.length > 0 ? selectedOptions[0] : 'None';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get option inner HTML content by option value\n\t */\n\tprivate _getOptionInnerHtml(optionValue: string) {\n\t\tconst option = Array.from(this._options).find(\n\t\t\t(opt) => opt.dataset.value === optionValue,\n\t\t);\n\t\tif (this._config.mode == SelectMode.COMBOBOX) {\n\t\t\treturn option.textContent;\n\t\t}\n\t\treturn option.innerHTML; // Get the entire HTML content of the option\n\t}\n\n\t/**\n\t * Update CSS classes for selected options\n\t */\n\tprivate _updateSelectedOptionClass(): void {\n\t\tconst allOptions = this._wrapperElement.querySelectorAll(\n\t\t\t`[data-kt-select-option]`,\n\t\t);\n\t\tconst selectedValues = this._state.getSelectedOptions();\n\t\tconst maxReached =\n\t\t\ttypeof this._config.maxSelections === 'number' &&\n\t\t\tselectedValues.length >= this._config.maxSelections;\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log(\n\t\t\t\t'Updating selected classes for options, selected values:',\n\t\t\t\tselectedValues,\n\t\t\t);\n\n\t\tallOptions.forEach((option) => {\n\t\t\tconst optionValue = option.getAttribute('data-value');\n\t\t\tif (!optionValue) return;\n\t\t\tconst isSelected = selectedValues.includes(optionValue);\n\t\t\tif (isSelected) {\n\t\t\t\toption.classList.add('selected');\n\t\t\t\toption.setAttribute('aria-selected', 'true');\n\t\t\t\toption.classList.remove('hidden');\n\t\t\t\toption.classList.remove('disabled');\n\t\t\t\toption.removeAttribute('aria-disabled');\n\t\t\t} else {\n\t\t\t\toption.classList.remove('selected');\n\t\t\t\toption.setAttribute('aria-selected', 'false');\n\t\t\t\tif (maxReached) {\n\t\t\t\t\toption.classList.add('disabled');\n\t\t\t\t\toption.setAttribute('aria-disabled', 'true');\n\t\t\t\t} else {\n\t\t\t\t\toption.classList.remove('disabled');\n\t\t\t\t\toption.removeAttribute('aria-disabled');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Clear all selected options\n\t */\n\tpublic clearSelection() {\n\t\t// Clear the current selection\n\t\tthis._state.setSelectedOptions([]);\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._updateSelectedOptionClass();\n\n\t\t// For combobox, also clear the input value\n\t\tif (this._config.mode === SelectMode.COMBOBOX) {\n\t\t\tif (this._searchInputElement) {\n\t\t\t\tthis._searchInputElement.value = '';\n\t\t\t}\n\n\t\t\t// If combobox has a clear button, hide it\n\t\t\tif (this._comboboxModule) {\n\t\t\t\t// The combobox module will handle hiding the clear button\n\t\t\t\tthis._comboboxModule.resetInputValueToSelection();\n\t\t\t}\n\t\t}\n\n\t\t// Dispatch change event\n\t\tthis._dispatchEvent('change');\n\t\tthis._fireEvent('change');\n\t}\n\n\t/**\n\t * Set selected options programmatically\n\t */\n\tpublic setSelectedOptions(options: HTMLOptionElement[]) {\n\t\tconst values = Array.from(options).map((option) => option.value);\n\t\tthis._state.setSelectedOptions(values);\n\t}\n\n\t/**\n\t * ========================================================================\n\t * KEYBOARD NAVIGATION\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Handle dropdown key down events for keyboard navigation\n\t * Only used for standard (non-combobox) dropdowns\n\t */\n\tprivate _handleDropdownKeyDown(event: KeyboardEvent) {\n\t\t// Log event for debugging\n\t\tif (this._config.debug)\n\t\t\tconsole.log('Standard dropdown keydown:', event.key);\n\n\t\t// Use the shared handler\n\t\thandleDropdownKeyNavigation(event, this, {\n\t\t\tmultiple: this._config.multiple,\n\t\t\tcloseOnSelect: this._config.closeOnSelect,\n\t\t});\n\t}\n\n\t/**\n\t * Focus next option in dropdown\n\t */\n\tprivate _focusNextOption(): Element | null {\n\t\treturn this._focusManager.focusNext();\n\t}\n\n\t/**\n\t * Focus previous option in dropdown\n\t */\n\tprivate _focusPreviousOption(): Element | null {\n\t\treturn this._focusManager.focusPrevious();\n\t}\n\n\t/**\n\t * Apply hover/focus state to focused option\n\t */\n\tprivate _hoverFocusedOption(option: Element) {\n\t\tthis._focusManager.applyFocus(option as HTMLElement);\n\t}\n\n\t/**\n\t * Scroll option into view when navigating\n\t */\n\tprivate _scrollOptionIntoView(option: Element) {\n\t\tthis._focusManager.scrollIntoView(option as HTMLElement);\n\t}\n\n\t/**\n\t * Select the currently focused option\n\t */\n\tpublic selectFocusedOption() {\n\t\tconst focusedOption = this._focusManager.getFocusedOption();\n\n\t\tif (focusedOption) {\n\t\t\tconst selectedValue = focusedOption.dataset.value;\n\n\t\t\t// Extract just the title text, not including description\n\t\t\tlet selectedText = '';\n\t\t\tconst titleElement = focusedOption.querySelector(\n\t\t\t\t'[data-kt-option-title]',\n\t\t\t);\n\t\t\tif (titleElement) {\n\t\t\t\t// If it has a structured content with title element\n\t\t\t\tselectedText = titleElement.textContent?.trim() || '';\n\t\t\t} else {\n\t\t\t\t// Fallback to the whole text content\n\t\t\t\tselectedText = focusedOption.textContent?.trim() || '';\n\t\t\t}\n\n\t\t\t// First trigger the selection to ensure state is updated properly\n\t\t\tif (selectedValue) {\n\t\t\t\tthis._selectOption(selectedValue);\n\t\t\t}\n\n\t\t\t// For combobox mode, update input value AFTER selection to ensure consistency\n\t\t\tif (this._config.mode === SelectMode.COMBOBOX && this._comboboxModule) {\n\t\t\t\tthis._comboboxModule.updateSelectedValue(selectedText);\n\t\t\t\t// Also directly update the input value for immediate visual feedback\n\t\t\t\tif (this._searchInputElement) {\n\t\t\t\t\tthis._searchInputElement.value = selectedText;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * COMBOBOX SPECIFIC METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Handle combobox input events\n\t */\n\tprivate _handleComboboxInput(event: Event) {\n\t\tif (this._comboboxModule) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst inputElement = event.target as HTMLInputElement;\n\t\tconst query = inputElement.value.toLowerCase();\n\n\t\t// If dropdown isn't open, open it when user starts typing\n\t\tif (!this._dropdownIsOpen) {\n\t\t\tthis.openDropdown();\n\t\t}\n\n\t\t// Filter options based on input\n\t\tthis._filterOptionsForCombobox(query);\n\t}\n\n\t/**\n\t * Filter options for combobox based on input query\n\t * Uses the shared filterOptions function\n\t */\n\tprivate _filterOptionsForCombobox(query: string) {\n\t\tconst options = Array.from(\n\t\t\tthis._dropdownContentElement.querySelectorAll('[data-kt-select-option]'),\n\t\t) as HTMLElement[];\n\n\t\tfilterOptions(options, query, this._config, this._dropdownContentElement);\n\t}\n\n\t/**\n\t * ========================================================================\n\t * EVENT HANDLERS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Handle display element click\n\t */\n\tprivate _handleDropdownClick(event: Event) {\n\t\tif (this._config.debug)\n\t\t\tconsole.log('Display element clicked', event.target);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation(); // Prevent event bubbling\n\t\tthis.toggleDropdown();\n\t}\n\n\t/**\n\t * Handle click within the dropdown\n\t */\n\tprivate _handleDropdownOptionClick(event: Event) {\n\t\tconst optionElement = (event.target as HTMLElement).closest(\n\t\t\t`[data-kt-select-option]`,\n\t\t);\n\n\t\t// If an option is clicked, handle the option click\n\t\tif (optionElement) {\n\t\t\tthis._handleOptionClick(event);\n\t\t}\n\t}\n\n\t/**\n\t * Handle clicking on an option in the dropdown\n\t */\n\tprivate _handleOptionClick(event: Event) {\n\t\tif (this._config.debug)\n\t\t\tconsole.log('_handleOptionClick called', event.target);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\t// Find the clicked option element\n\t\tconst clickedOption = (event.target as HTMLElement).closest(\n\t\t\t`[data-kt-select-option]`,\n\t\t) as HTMLElement;\n\n\t\tif (!clickedOption) {\n\t\t\tif (this._config.debug) console.log('No clicked option found');\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if the option is disabled\n\t\tif (clickedOption.getAttribute('aria-disabled') === 'true') {\n\t\t\tif (this._config.debug) console.log('Option is disabled, ignoring click');\n\t\t\treturn;\n\t\t}\n\n\t\t// Use dataset.value to get the option value\n\t\tconst optionValue = clickedOption.dataset.value;\n\t\tif (optionValue === undefined) {\n\t\t\tif (this._config.debug) console.log('Option value is undefined');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._config.debug) console.log('Option clicked:', optionValue);\n\n\t\t// Use toggleSelection instead of _selectOption to prevent re-rendering\n\t\tthis.toggleSelection(optionValue);\n\t}\n\n\t/**\n\t * Handle document click for closing dropdown\n\t */\n\tprivate _handleDocumentClick(event: MouseEvent) {\n\t\tconst targetElement = event.target as HTMLElement;\n\t\t// Check if the click is outside the dropdown and the display element\n\t\tif (!this._wrapperElement.contains(targetElement)) {\n\t\t\tthis.closeDropdown();\n\t\t}\n\t}\n\n\t/**\n\t * Handle escape key press\n\t */\n\tprivate _handleEscKey(event: KeyboardEvent) {\n\t\tif (event.key === 'Escape' && this._dropdownIsOpen) {\n\t\t\tthis.closeDropdown();\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * ACCESSIBILITY METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Set ARIA attributes for accessibility\n\t */\n\tprivate _setAriaAttributes() {\n\t\tthis._displayElement.setAttribute(\n\t\t\t'aria-expanded',\n\t\t\tthis._dropdownIsOpen.toString(),\n\t\t);\n\t}\n\n\t/**\n\t * Handle focus events\n\t */\n\tprivate _handleFocus() {\n\t\t// Implementation pending\n\t}\n\n\t/**\n\t * Handle blur events\n\t */\n\tprivate _handleBlur() {\n\t\t// Implementation pending\n\t}\n\n\t/**\n\t * ========================================================================\n\t * PUBLIC API\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Get the search input element\n\t */\n\tpublic getSearchInput(): HTMLInputElement {\n\t\treturn this._searchInputElement;\n\t}\n\n\t/**\n\t * Get selected options\n\t */\n\tpublic getSelectedOptions() {\n\t\treturn this._state.getSelectedOptions();\n\t}\n\n\t/**\n\t * Get configuration\n\t */\n\tpublic getConfig(): KTSelectConfigInterface {\n\t\treturn this._config;\n\t}\n\n\t/**\n\t * Get option elements\n\t */\n\tpublic getOptionsElement(): NodeListOf<HTMLElement> {\n\t\treturn this._options;\n\t}\n\n\t/**\n\t * Get dropdown element\n\t */\n\tpublic getDropdownElement() {\n\t\treturn this._dropdownContentElement;\n\t}\n\n\t/**\n\t * Get value display element\n\t */\n\tpublic getValueDisplayElement() {\n\t\treturn this._valueDisplayElement;\n\t}\n\n\t/**\n\t * Show all options in the dropdown\n\t */\n\tpublic showAllOptions() {\n\t\t// Get all options in the dropdown\n\t\tconst options = Array.from(\n\t\t\tthis._wrapperElement.querySelectorAll(`[data-kt-select-option]`),\n\t\t);\n\n\t\t// Show all options by removing the hidden class and any inline styles\n\t\toptions.forEach((option) => {\n\t\t\t// Remove hidden class\n\t\t\toption.classList.remove('hidden');\n\n\t\t\t// Clean up any existing inline styles for backward compatibility\n\t\t\tif (option.hasAttribute('style')) {\n\t\t\t\tconst styleAttr = option.getAttribute('style');\n\n\t\t\t\tif (styleAttr.includes('display:')) {\n\t\t\t\t\t// If style only contains display property, remove the entire attribute\n\t\t\t\t\tif (\n\t\t\t\t\t\tstyleAttr.trim() === 'display: none;' ||\n\t\t\t\t\t\tstyleAttr.trim() === 'display: block;'\n\t\t\t\t\t) {\n\t\t\t\t\t\toption.removeAttribute('style');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Otherwise, remove just the display property\n\t\t\t\t\t\toption.setAttribute(\n\t\t\t\t\t\t\t'style',\n\t\t\t\t\t\t\tstyleAttr.replace(/display:\\s*[^;]+;?/gi, '').trim(),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// If search input exists, clear it\n\t\tif (this._searchInputElement && this._config.mode !== SelectMode.COMBOBOX) {\n\t\t\tthis._searchInputElement.value = '';\n\t\t\t// If we have a search module, clear any search filtering\n\t\t\tif (this._searchModule) {\n\t\t\t\tthis._searchModule.clearSearchHighlights();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Toggle multi-select functionality\n\t */\n\tpublic enableMultiSelect() {\n\t\tthis._state.modifyConfig({ multiple: true });\n\t}\n\n\t/**\n\t * Disable multi-select functionality\n\t */\n\tpublic disableMultiSelect() {\n\t\tthis._state.modifyConfig({ multiple: false });\n\t}\n\n\t/**\n\t * Toggle the selection of an option\n\t */\n\tpublic toggleSelection(value: string): void {\n\t\t// Get current selection state\n\t\tconst isSelected = this._state.isSelected(value);\n\t\tif (this._config.debug)\n\t\t\tconsole.log(\n\t\t\t\t`toggleSelection called for value: ${value}, isSelected: ${isSelected}, multiple: ${this._config.multiple}, closeOnSelect: ${this._config.closeOnSelect}`,\n\t\t\t);\n\n\t\t// If already selected in single select mode, do nothing (can't deselect in single select)\n\t\tif (isSelected && !this._config.multiple) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log(\n\t\t\t\t\t'Early return from toggleSelection - already selected in single select mode',\n\t\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._config.debug)\n\t\t\tconsole.log(\n\t\t\t\t`Toggling selection for option: ${value}, currently selected: ${isSelected}`,\n\t\t\t);\n\n\t\t// Ensure any search highlights are cleared when selection changes\n\t\tif (this._searchModule) {\n\t\t\tthis._searchModule.clearSearchHighlights();\n\t\t}\n\n\t\t// Toggle the selection in the state\n\t\tthis._state.toggleSelectedOptions(value);\n\n\t\t// Update the original select element's option selected state\n\t\tconst optionEl = Array.from(this._element.querySelectorAll('option')).find(\n\t\t\t(opt) => opt.value === value,\n\t\t) as HTMLOptionElement;\n\n\t\tif (optionEl) {\n\t\t\t// For multiple select, toggle the 'selected' attribute\n\t\t\tif (this._config.multiple) {\n\t\t\t\toptionEl.selected = !isSelected;\n\t\t\t} else {\n\t\t\t\t// For single select, deselect all other options and select this one\n\t\t\t\tArray.from(this._element.querySelectorAll('option')).forEach((opt) => {\n\t\t\t\t\t(opt as HTMLOptionElement).selected = opt.value === value;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Update the display element value\n\t\tthis.updateSelectedOptionDisplay();\n\n\t\t// Update option classes without re-rendering the dropdown content\n\t\tthis._updateSelectedOptionClass();\n\n\t\t// For single select mode, always close the dropdown after selection\n\t\t// For multiple select mode, only close if closeOnSelect is true\n\t\tif (!this._config.multiple) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log(\n\t\t\t\t\t'About to call closeDropdown() for single select mode - always close after selection',\n\t\t\t\t);\n\t\t\tthis.closeDropdown();\n\t\t} else if (this._config.closeOnSelect) {\n\t\t\tif (this._config.debug)\n\t\t\t\tconsole.log(\n\t\t\t\t\t'About to call closeDropdown() for multiple select with closeOnSelect:true',\n\t\t\t\t);\n\t\t\tthis.closeDropdown();\n\t\t}\n\n\t\t// Dispatch custom change event with additional data\n\t\tthis._dispatchEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t\tthis._fireEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t}\n\n\t/**\n\t * Clean up all resources when the component is destroyed\n\t * This overrides the parent dispose method\n\t */\n\tpublic override dispose(): void {\n\t\t// Clean up event listeners\n\t\tthis._eventManager.removeAllListeners(null);\n\n\t\t// Dispose modules\n\t\tif (this._dropdownModule) {\n\t\t\tthis._dropdownModule.dispose();\n\t\t}\n\n\t\tif (this._comboboxModule) {\n\t\t\tif (typeof this._comboboxModule.destroy === 'function') {\n\t\t\t\tthis._comboboxModule.destroy();\n\t\t\t}\n\t\t}\n\n\t\tif (this._tagsModule) {\n\t\t\tif (typeof this._tagsModule.destroy === 'function') {\n\t\t\t\tthis._tagsModule.destroy();\n\t\t\t}\n\t\t}\n\n\t\tif (this._searchModule) {\n\t\t\tif (typeof this._searchModule.destroy === 'function') {\n\t\t\t\tthis._searchModule.destroy();\n\t\t\t}\n\t\t}\n\n\t\t// Remove DOM elements\n\t\tif (this._wrapperElement && this._wrapperElement.parentNode) {\n\t\t\tthis._wrapperElement.parentNode.removeChild(this._wrapperElement);\n\t\t}\n\n\t\t// Call parent dispose to clean up data\n\t\tsuper.dispose();\n\t}\n\n\t/**\n\t * ========================================================================\n\t * STATIC METHODS\n\t * ========================================================================\n\t */\n\n\tprivate static readonly _instances = new Map<HTMLElement, KTSelect>();\n\n\t/**\n\t * Create instances of KTSelect for all matching elements\n\t */\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll<HTMLElement>('[data-kt-select]');\n\n\t\telements.forEach((element) => {\n\t\t\tif (\n\t\t\t\telement.hasAttribute('data-kt-select') &&\n\t\t\t\t!element.classList.contains('data-kt-select-initialized')\n\t\t\t) {\n\t\t\t\tconst instance = new KTSelect(element);\n\t\t\t\tthis._instances.set(element, instance);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Initialize all KTSelect instances\n\t */\n\tpublic static init(): void {\n\t\tKTSelect.createInstances();\n\t}\n\n\t/**\n\t * Handle remote search\n\t * @param event Input event\n\t */\n\tprivate _handleRemoteSearch(event: Event) {\n\t\tif (\n\t\t\t!this._remoteModule ||\n\t\t\t!this._config.remote ||\n\t\t\t!this._config.searchParam\n\t\t)\n\t\t\treturn;\n\n\t\tconst query = (event.target as HTMLInputElement).value;\n\n\t\t// Check if the query is long enough\n\t\tif (query.length < (this._config.searchMinLength || 0)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Debounce the search\n\t\tif (this._searchDebounceTimeout) {\n\t\t\tclearTimeout(this._searchDebounceTimeout);\n\t\t}\n\n\t\tthis._searchDebounceTimeout = window.setTimeout(() => {\n\t\t\t// Show loading state\n\t\t\tthis._renderSearchLoadingState();\n\n\t\t\t// Fetch remote data with search query\n\t\t\tthis._remoteModule\n\t\t\t\t.fetchData(query)\n\t\t\t\t.then((items) => {\n\t\t\t\t\t// Update state with fetched items\n\t\t\t\t\tthis._state\n\t\t\t\t\t\t.setItems(items)\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t// Update options in the dropdown\n\t\t\t\t\t\t\tthis._updateSearchResults(items);\n\n\t\t\t\t\t\t\t// Refresh the search module's option cache if search is enabled\n\t\t\t\t\t\t\tif (this._searchModule && this._config.enableSearch) {\n\t\t\t\t\t\t\t\tthis._searchModule.refreshOptionCache();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tconsole.error('Error updating search results:', error);\n\t\t\t\t\t\t\tthis._renderSearchErrorState(\n\t\t\t\t\t\t\t\terror.message || 'Failed to load search results',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Error fetching search results:', error);\n\t\t\t\t\tthis._renderSearchErrorState(\n\t\t\t\t\t\tthis._remoteModule.getErrorMessage() ||\n\t\t\t\t\t\t\t'Failed to load search results',\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}, this._config.searchDebounce || 300);\n\t}\n\n\t// Search debounce timeout\n\tprivate _searchDebounceTimeout: number | null = null;\n\n\t/**\n\t * Render loading state for search\n\t */\n\tprivate _renderSearchLoadingState() {\n\t\tif (!this._originalOptionsHtml && this._dropdownContentElement) {\n\t\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t\t'[data-kt-select-options-container]',\n\t\t\t);\n\t\t\tif (optionsContainer) {\n\t\t\t\tthis._originalOptionsHtml = optionsContainer.innerHTML;\n\t\t\t}\n\t\t}\n\t\tthis._showDropdownMessage('loading', 'Searching...');\n\t}\n\n\t// Store original options HTML for restoring after search\n\tprivate _originalOptionsHtml: string | null = null;\n\n\t/**\n\t * Render error state for search\n\t * @param message Error message\n\t */\n\tprivate _renderSearchErrorState(message: string) {\n\t\tthis._showDropdownMessage('error', message);\n\t}\n\n\t/**\n\t * Update search results in the dropdown\n\t * @param items Search result items\n\t */\n\tprivate _updateSearchResults(items: KTSelectOptionData[]) {\n\t\tif (!this._dropdownContentElement) return;\n\n\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t'[data-kt-select-options-container]',\n\t\t);\n\t\tif (!optionsContainer) return;\n\n\t\t// Clear current options\n\t\toptionsContainer.innerHTML = '';\n\n\t\tif (items.length === 0) {\n\t\t\t// Show no results message using template for consistency and customization\n\t\t\tconst noResultsElement = defaultTemplates.noResults(this._config);\n\t\t\toptionsContainer.appendChild(noResultsElement);\n\t\t\treturn;\n\t\t}\n\n\t\t// Process each item individually to create options\n\t\titems.forEach((item) => {\n\t\t\t// Create option for the original select\n\t\t\tconst selectOption = defaultTemplates.emptyOption({\n\t\t\t\t...this._config,\n\t\t\t\tplaceholder: item.title,\n\t\t\t});\n\t\t\tselectOption.value = item.id;\n\t\t\tif (item.description) {\n\t\t\t\tselectOption.setAttribute(\n\t\t\t\t\t'data-kt-select-option-description',\n\t\t\t\t\titem.description,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (item.icon) {\n\t\t\t\tselectOption.setAttribute('data-kt-select-option-icon', item.icon);\n\t\t\t}\n\n\t\t\t// Create option element for the dropdown\n\t\t\tconst ktOption = new KTSelectOption(selectOption, this._config);\n\t\t\tconst renderedOption = ktOption.render();\n\n\t\t\t// Add to dropdown container\n\t\t\toptionsContainer.appendChild(renderedOption);\n\t\t});\n\n\t\t// Add pagination \"Load More\" button if needed\n\t\tif (this._config.pagination && this._remoteModule.hasMorePages()) {\n\t\t\tthis._addLoadMoreButton();\n\t\t}\n\n\t\t// Update options NodeList\n\t\tthis._options = this._wrapperElement.querySelectorAll(\n\t\t\t`[data-kt-select-option]`,\n\t\t) as NodeListOf<HTMLElement>;\n\t}\n\n\t/**\n\t * Filter options by query\n\t */\n\tpublic filterOptions(query: string): void {\n\t\tthis._filterOptionsForCombobox(query);\n\t}\n\n\t/**\n\t * Check if dropdown is open\n\t */\n\tpublic isDropdownOpen(): boolean {\n\t\treturn this._dropdownIsOpen;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { KTSelectConfigInterface } from './config';\nimport { KTSelect } from './select';\nimport { defaultTemplates } from './templates';\nimport { EventManager } from './utils';\n\n/**\n * KTSelectTags - Handles tags-specific functionality for KTSelect\n */\nexport class KTSelectTags {\n\tprivate _select: KTSelect;\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _valueDisplayElement: HTMLElement;\n\tprivate _eventManager: EventManager;\n\n\t/**\n\t * Constructor: Initializes the tags component\n\t */\n\tconstructor(select: KTSelect) {\n\t\tthis._select = select;\n\t\tthis._config = select.getConfig();\n\t\tthis._valueDisplayElement = select.getValueDisplayElement();\n\t\tthis._eventManager = new EventManager();\n\n\t\tif (this._config.debug) console.log('KTSelectTags initialized');\n\t}\n\n\t/**\n\t * Update selected tags display\n\t * Renders selected options as tags in the display element\n\t */\n\tpublic updateTagsDisplay(selectedOptions: string[]): void {\n\t\t// Clear existing content\n\t\tthis._valueDisplayElement.innerHTML = '';\n\n\t\t// If no options selected, show placeholder\n\t\tif (selectedOptions.length === 0) {\n\t\t\tthis._valueDisplayElement.textContent = this._config.placeholder || '';\n\t\t\treturn;\n\t\t}\n\n\t\t// Create and append a tag element for each selected option\n\t\tselectedOptions.forEach((optionValue) => {\n\t\t\tconst tagElement = this._createTagElement(optionValue);\n\t\t\tthis._valueDisplayElement.appendChild(tagElement);\n\t\t});\n\t}\n\n\t/**\n\t * Create tag element for a selected option\n\t */\n\tprivate _createTagElement(optionValue: string): HTMLElement {\n\t\tconst optionLabel = this._getOptionLabel(optionValue);\n\t\t// Create a mock option object to pass to the tag template\n\t\tconst mockOption = {\n\t\t\tid: optionValue,\n\t\t\ttitle: optionLabel,\n\t\t\tselected: true,\n\t\t};\n\n\t\t// Use the tag template\n\t\tconst tag = defaultTemplates.tag(mockOption, this._config);\n\n\t\t// Add event listener to the close button\n\t\tconst closeButton = tag.querySelector(\n\t\t\t`[data-kt-select-remove-button]`,\n\t\t) as HTMLElement;\n\n\t\tif (closeButton) {\n\t\t\tthis._eventManager.addListener(closeButton, 'click', (event: Event) => {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tthis._removeTag(optionValue);\n\t\t\t});\n\t\t}\n\n\t\treturn tag;\n\t}\n\n\t/**\n\t * Get the label/text for an option by its value\n\t */\n\tprivate _getOptionLabel(optionValue: string): string {\n\t\t// First look for an option element in the dropdown with matching value\n\t\tconst optionElements = this._select.getOptionsElement();\n\t\tfor (const option of Array.from(optionElements)) {\n\t\t\tif ((option as HTMLElement).dataset.value === optionValue) {\n\t\t\t\treturn (option as HTMLElement).textContent?.trim() || optionValue;\n\t\t\t}\n\t\t}\n\n\t\t// If not found in dropdown, look in original select element\n\t\tconst originalOptions = this._select\n\t\t\t.getElement()\n\t\t\t.querySelectorAll('option');\n\t\tfor (const option of Array.from(originalOptions)) {\n\t\t\tif ((option as HTMLOptionElement).value === optionValue) {\n\t\t\t\treturn (option as HTMLOptionElement).textContent?.trim() || optionValue;\n\t\t\t}\n\t\t}\n\n\t\t// If still not found, return the value itself\n\t\treturn optionValue;\n\t}\n\n\t/**\n\t * Remove a tag and its selection\n\t */\n\tprivate _removeTag(optionValue: string): void {\n\t\t// Delegate to the select component to handle state changes\n\t\tthis._select.toggleSelection(optionValue);\n\t}\n\n\t/**\n\t * Clean up resources used by this module\n\t */\n\tpublic destroy(): void {\n\t\tthis._eventManager.removeAllListeners(null);\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { KTSelectConfigInterface, KTSelectOption } from './config';\nimport { SelectMode } from './types';\n\n/**\n * Default HTML string templates for KTSelect. All UI structure is defined here.\n * Users can override any template by providing a matching key in the config.templates object.\n */\nconst defaultTemplateStrings = {\n\tdropdownContent: `<div data-kt-select-dropdown-content class=\"kt-select-dropdown hidden\" style=\"z-index: {{zindex}};\">{{content}}</div>`,\n\toptionsContainer: `<ul role=\"listbox\" aria-label=\"{{label}}\" data-kt-select-options-container style=\"max-height: {{height}}px; overflow-y: auto;\">{{options}}</ul>`,\n\temptyOption: `<option value=\"\">{{placeholder}}</option>`,\n\terrorOption: `<option value=\"\" disabled selected>{{errorMessage}}</option>`, // Template for error <option>\n\n\tloadMore: `<li class=\"py-2 px-4 text-center text-gray-600 cursor-pointer hover:bg-gray-100\" data-kt-select-load-more>{{loadMoreText}}</li>`,\n\tdropdown: `<div data-kt-select-dropdown-content class=\"absolute z-10 w-full mt-2 bg-white border border-gray-200 rounded-md shadow-md\">\n\t\t{{search}}\n\t\t<ul role=\"listbox\" aria-label=\"{{label}}\" data-kt-select-options-container style=\"max-height: {{height}}px; overflow-y: auto;\">\n\t\t\t{{options}}\n\t\t</ul>\n\t</div>`,\n\terror: `<li class=\"px-3 py-2 text-red-500\" role=\"alert\">{{errorMessage}}</li>`,\n\n\thighlight: `<span class=\"highlight\">{{text}}</span>`,\n\tmain: `<div data-kt-select-wrapper class=\"relative\" data-kt-select-mode=\"{{mode}}\"></div>`,\n\tdisplayCombobox: `<div class=\"relative flex items-center w-full\">\n\t\t<input data-kt-select-search data-kt-select-display data-kt-select-value type=\"text\" class=\"flex-1 w-full items-center justify-between px-3 py-2 border border-gray-300 rounded-md cursor-pointer focus:outline-none focus:ring-2 focus:ring-blue-200 focus:border-blue-400\" placeholder=\"{{placeholder}}\" role=\"searchbox\" aria-label=\"{{label}}\" {{disabled}} />\n\t\t<button type=\"button\" data-kt-select-clear-button class=\"absolute right-3 hidden text-gray-400 hover:text-gray-600\" aria-label=\"Clear selection\">\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n\t\t</svg>\n\t\t</button>\n\t</div>`,\n\n\ticon: `<span class=\"option-icon mr-2\"><img src=\"{{icon}}\" class=\"rounded-full w-6 h-6\" /></span>`,\n\tdescription: `<div class=\"option-description text-sm text-gray-500\">{{description}}</div>`,\n\n\tdisplay: `<div data-kt-select-display class=\"flex items-center justify-between px-3 py-2 border border-gray-300 rounded-md cursor-pointer focus:outline-none focus:ring-2 focus:ring-blue-200 focus:border-blue-400\" tabindex=\"{{tabindex}}\" role=\"button\" aria-haspopup=\"listbox\" aria-expanded=\"false\" aria-label=\"{{label}}\" {{disabled}}>\n\t\t<span data-kt-select-value>{{placeholder}}</span>\n\t\t<span data-kt-select-arrow class=\"ml-2\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t<polyline points=\"6 9 12 15 18 9\"></polyline>\n\t\t\t</svg>\n\t\t</span>\n\t</div>`,\n\toption: `<li data-kt-select-option data-value=\"{{value}}\" class=\"px-3 py-2 cursor-pointer hover:bg-gray-100 flex items-center{{selectedClass}}{{disabledClass}}\" role=\"option\" {{selected}} {{disabled}}>{{icon}}<div class=\"option-content\"><div class=\"option-title\" data-kt-option-title>{{text}}</div>{{description}}</div></li>`,\n\n\toptionGroup: `<li role=\"group\" aria-label=\"{{label}}\" class=\"py-1\"><div class=\"px-3 py-1 text-xs font-semibold text-gray-500 uppercase\">{{label}}</div><ul>{{optionsHtml}}</ul></li>`,\n\tsearch: `<div class=\"px-3 py-2 border-b border-gray-200\"><input type=\"text\" data-kt-select-search placeholder=\"{{searchPlaceholder}}\" class=\"w-full border-none focus:outline-none text-sm\" role=\"searchbox\" aria-label=\"{{searchPlaceholder}}\"/></div>`,\n\tnoResults: `<li class=\"px-3 py-2 text-gray-500\" role=\"status\">{{searchNotFoundText}}</li>`,\n\tloading: `<li class=\"px-3 py-2 text-gray-500 italic\" role=\"status\" aria-live=\"polite\">{{loadingMessage}}</li>`,\n\ttag: `<div data-kt-select-tag class=\"inline-flex items-center bg-blue-50 border border-blue-100 rounded px-2 py-1 text-sm mr-1 mb-1\"><span>{{title}}</span><span data-kt-select-remove-button data-value=\"{{id}}\" class=\"ml-1 text-blue-400 hover:text-blue-600 cursor-pointer\" role=\"button\" aria-label=\"Remove {{safeTitle}}\" tabindex=\"0\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg></span></div>`,\n};\n\n/**\n * Template interface for KTSelect component\n * Each method returns an HTML string or HTMLElement\n */\nexport interface KTSelectTemplateInterface {\n\t/**\n\t * Renders the dropdown content container\n\t */\n\tdropdownContent: (\n\t\tconfig: KTSelectConfigInterface & { zindex?: number; content?: string },\n\t) => HTMLElement;\n\t/**\n\t * Renders the options container\n\t */\n\toptionsContainer: (\n\t\tconfig: KTSelectConfigInterface & { options?: string },\n\t) => HTMLElement;\n\t/**\n\t * Renders an empty <option> for native select\n\t */\n\temptyOption: (\n\t\tconfig: KTSelectConfigInterface & { placeholder?: string },\n\t) => HTMLOptionElement;\n\t/**\n\t * Renders an error <option> for the native select\n\t */\n\terrorOption: (\n\t\tconfig: KTSelectConfigInterface & { errorMessage: string },\n\t) => HTMLElement;\n\t/**\n\t * Renders the load more button for pagination\n\t */\n\tloadMore: (config: KTSelectConfigInterface) => HTMLElement;\n\t/**\n\t * Renders an error message in the dropdown\n\t */\n\terror: (config: KTSelectConfigInterface & { errorMessage: string }) => string;\n\n\thighlight: (config: KTSelectConfigInterface, text: string) => HTMLElement;\n\n\t// Main components\n\tmain: (config: KTSelectConfigInterface) => HTMLElement;\n\tdisplay: (config: KTSelectConfigInterface) => HTMLElement;\n\tdropdown: (\n\t\tconfig: KTSelectConfigInterface,\n\t\toptionsHtml: string,\n\t) => HTMLElement;\n\n\t// Icon rendering\n\ticon: (icon: string, config: KTSelectConfigInterface) => HTMLElement;\n\tdescription: (\n\t\tdescription: string,\n\t\tconfig: KTSelectConfigInterface,\n\t) => HTMLElement;\n\n\t// Option rendering\n\toption: (\n\t\toption: KTSelectOption | HTMLOptionElement,\n\t\tconfig: KTSelectConfigInterface,\n\t) => HTMLElement;\n\toptionGroup: (\n\t\tlabel: string,\n\t\toptionsHtml: string,\n\t\tconfig: KTSelectConfigInterface,\n\t) => HTMLElement;\n\n\t// Search and empty states\n\tsearch: (config: KTSelectConfigInterface) => HTMLElement;\n\tnoResults: (config: KTSelectConfigInterface) => HTMLElement;\n\tloading: (\n\t\tconfig: KTSelectConfigInterface,\n\t\tloadingMessage: string,\n\t) => HTMLElement;\n\n\t// Multi-select\n\ttag: (option: KTSelectOption, config: KTSelectConfigInterface) => HTMLElement;\n\tselectedDisplay: (\n\t\tselectedOptions: KTSelectOption[],\n\t\tconfig: KTSelectConfigInterface,\n\t) => string;\n}\n\n/**\n * Default templates for KTSelect component\n */\nfunction stringToElement(html: string): HTMLElement {\n\tconst template = document.createElement('template');\n\ttemplate.innerHTML = html.trim();\n\treturn template.content.firstElementChild as HTMLElement;\n}\n\n/**\n * User-supplied template overrides. Use setTemplateStrings() to add or update.\n */\nlet userTemplateStrings: Partial<typeof defaultTemplateStrings> = {};\n\n/**\n * Register or update user template overrides.\n * @param templates Partial template object to merge with defaults.\n */\nexport function setTemplateStrings(\n\ttemplates: Partial<typeof defaultTemplateStrings>,\n): void {\n\tuserTemplateStrings = { ...userTemplateStrings, ...templates };\n}\n\n/**\n * Get the complete template set, merging defaults, user overrides, and config templates.\n * @param config Optional config object with a \"templates\" property.\n */\nexport function getTemplateStrings(\n\tconfig?: KTSelectConfigInterface,\n): typeof defaultTemplateStrings {\n\tconst templates =\n\t\tconfig && typeof config === 'object' && 'templates' in config\n\t\t\t? (config as any).templates\n\t\t\t: undefined;\n\tif (templates) {\n\t\treturn { ...defaultTemplateStrings, ...userTemplateStrings, ...templates };\n\t}\n\treturn { ...defaultTemplateStrings, ...userTemplateStrings };\n}\n\n/**\n * Default templates for KTSelect component\n */\nexport const defaultTemplates: KTSelectTemplateInterface = {\n\t/**\n\t * Renders a highlighted text\n\t */\n\thighlight: (config: KTSelectConfigInterface, text: string) => {\n\t\tconst template = getTemplateStrings(config).highlight;\n\t\tconst html = template.replace('{{text}}', text);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the dropdown content\n\t */\n\tdropdownContent: (\n\t\tconfig: KTSelectConfigInterface & { zindex?: number; content?: string },\n\t) => {\n\t\tconst template = getTemplateStrings(config).dropdownContent;\n\t\tconst html = template\n\t\t\t.replace('{{zindex}}', config.zindex ? String(config.zindex) : '')\n\t\t\t.replace('{{content}}', config.content || '');\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the options container for the dropdown\n\t */\n\toptionsContainer: (\n\t\tconfig: KTSelectConfigInterface & { options?: string },\n\t) => {\n\t\tconst template = getTemplateStrings(config).optionsContainer;\n\t\tconst html = template\n\t\t\t.replace('{{label}}', config.label || 'Options')\n\t\t\t.replace('{{height}}', config.height ? String(config.height) : '250')\n\t\t\t.replace('{{options}}', config.options || '');\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders an empty option in the dropdown\n\t */\n\temptyOption: (config: KTSelectConfigInterface & { placeholder?: string }) => {\n\t\tconst template = getTemplateStrings(config).emptyOption;\n\t\tconst html = template.replace(\n\t\t\t'{{placeholder}}',\n\t\t\tconfig.placeholder || 'Select...',\n\t\t);\n\t\treturn stringToElement(html) as HTMLOptionElement;\n\t},\n\n\t/**\n\t * Renders an error option in the dropdown\n\t */\n\terrorOption: (config: KTSelectConfigInterface & { errorMessage: string }) => {\n\t\tconst template = getTemplateStrings(config).errorOption;\n\t\tconst html = template.replace(\n\t\t\t'{{errorMessage}}',\n\t\t\tconfig.errorMessage || 'An error occurred',\n\t\t);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the load more button for pagination\n\t */\n\tloadMore: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config).loadMore.replace(\n\t\t\t'{{loadMoreText}}',\n\t\t\tconfig.loadMoreText || 'Load more...',\n\t\t);\n\t\treturn stringToElement(html);\n\t},\n\t/**\n\t * Renders an error message in the dropdown\n\t */\n\terror: (\n\t\tconfig: KTSelectConfigInterface & { errorMessage: string },\n\t): string => {\n\t\tconst template = getTemplateStrings(config).error;\n\t\treturn template.replace(\n\t\t\t'{{errorMessage}}',\n\t\t\tconfig.errorMessage || 'An error occurred',\n\t\t);\n\t},\n\t/**\n\t * Renders the main container for the select component\n\t */\n\tmain: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tconst html = getTemplateStrings(config).main.replace(\n\t\t\t'{{mode}}',\n\t\t\tconfig.mode || '',\n\t\t);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the display element (trigger) for the select\n\t */\n\tdisplay: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tconst isCombobox = config.mode === SelectMode.COMBOBOX;\n\t\tif (isCombobox) {\n\t\t\tlet html = getTemplateStrings(config)\n\t\t\t\t.displayCombobox.replace(\n\t\t\t\t\t/{{placeholder}}/g,\n\t\t\t\t\tconfig.placeholder || 'Select...',\n\t\t\t\t)\n\t\t\t\t.replace(\n\t\t\t\t\t/{{label}}/g,\n\t\t\t\t\tconfig.label || config.placeholder || 'Select...',\n\t\t\t\t)\n\t\t\t\t.replace('{{disabled}}', config.disabled ? 'disabled' : '');\n\t\t\treturn stringToElement(html);\n\t\t}\n\t\tlet html = getTemplateStrings(config)\n\t\t\t.display.replace('{{tabindex}}', config.disabled ? '-1' : '0')\n\t\t\t.replace('{{label}}', config.label || config.placeholder || 'Select...')\n\t\t\t.replace('{{disabled}}', config.disabled ? 'aria-disabled=\"true\"' : '')\n\t\t\t.replace('{{placeholder}}', config.placeholder || 'Select...');\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the dropdown content container\n\t */\n\tdropdown: (\n\t\tconfig: KTSelectConfigInterface,\n\t\toptionsHtml: string,\n\t): HTMLElement => {\n\t\tconst isCombobox = config.mode === SelectMode.COMBOBOX;\n\t\tconst hasSearch = config.enableSearch && !isCombobox;\n\t\tconst template = getTemplateStrings(config).dropdown;\n\t\tlet searchHtml = '';\n\t\tif (hasSearch) {\n\t\t\tconst searchElement = defaultTemplates.search(config);\n\t\t\tsearchHtml = searchElement.outerHTML;\n\t\t}\n\t\tconst html = template\n\t\t\t.replace('{{search}}', searchHtml)\n\t\t\t.replace('{{options}}', optionsHtml)\n\t\t\t.replace('{{label}}', config.label || 'Options')\n\t\t\t.replace('{{height}}', config.height ? String(config.height) : '250');\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders a single option\n\t */\n\toption: (\n\t\toption: KTSelectOption | HTMLOptionElement,\n\t\tconfig: KTSelectConfigInterface & { templates: KTSelectTemplateInterface },\n\t): HTMLElement => {\n\t\tconst isHtmlOption = option instanceof HTMLOptionElement;\n\n\t\tconst value = isHtmlOption ? option.value : (option as KTSelectOption).id;\n\t\tconst text = isHtmlOption ? option.text : (option as KTSelectOption).title;\n\t\tconst disabled = isHtmlOption\n\t\t\t? option.disabled\n\t\t\t: (option as any).disabled === true;\n\t\tconst selected = isHtmlOption\n\t\t\t? option.selected\n\t\t\t: !!(option as KTSelectOption).selected;\n\n\t\t// Prefer data-kt-select-option (JSON) if present\n\t\tlet description: string | undefined;\n\t\tlet icon: string | undefined;\n\t\tif (isHtmlOption) {\n\t\t\tconst json = option.getAttribute('data-kt-select-option');\n\t\t\tif (json) {\n\t\t\t\ttry {\n\t\t\t\t\tconst optionData = JSON.parse(json);\n\t\t\t\t\tdescription = optionData?.description;\n\t\t\t\t\ticon = optionData?.icon;\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// fallback to legacy attributes if JSON is invalid\n\t\t\t\t\tdescription =\n\t\t\t\t\t\toption.getAttribute('data-kt-select-option-description') ||\n\t\t\t\t\t\tundefined;\n\t\t\t\t\ticon = option.getAttribute('data-kt-select-option-icon') || undefined;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdescription =\n\t\t\t\t\toption.getAttribute('data-kt-select-option-description') || undefined;\n\t\t\t\ticon = option.getAttribute('data-kt-select-option-icon') || undefined;\n\t\t\t}\n\t\t} else {\n\t\t\tdescription = (option as KTSelectOption).description;\n\t\t\ticon = (option as KTSelectOption).icon;\n\t\t}\n\n\t\t// Build option element with proper accessibility attributes\n\t\tconst selectedClass = selected ? ' selected' : '';\n\t\tconst disabledClass = disabled ? ' disabled' : '';\n\t\tlet html = getTemplateStrings(config)\n\t\t\t.option.replace('{{value}}', value)\n\t\t\t.replace('{{selectedClass}}', selectedClass)\n\t\t\t.replace('{{disabledClass}}', disabledClass)\n\t\t\t.replace(\n\t\t\t\t'{{selected}}',\n\t\t\t\tselected ? 'aria-selected=\"true\"' : 'aria-selected=\"false\"',\n\t\t\t)\n\t\t\t.replace('{{disabled}}', disabled ? 'aria-disabled=\"true\"' : '')\n\t\t\t.replace(\n\t\t\t\t/{{icon}}/g,\n\t\t\t\ticon ? defaultTemplates.icon(icon, config).outerHTML : '',\n\t\t\t)\n\t\t\t.replace('{{text}}', text)\n\t\t\t.replace(\n\t\t\t\t/{{description}}/g,\n\t\t\t\tdescription\n\t\t\t\t\t? defaultTemplates.description(description, config).outerHTML\n\t\t\t\t\t: '',\n\t\t\t);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders an icon\n\t */\n\ticon: (icon: string, config: KTSelectConfigInterface): HTMLElement => {\n\t\tconst html = getTemplateStrings(config).icon.replace('{{icon}}', icon);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders a description\n\t */\n\tdescription: (\n\t\tdescription: string,\n\t\tconfig: KTSelectConfigInterface,\n\t): HTMLElement => {\n\t\tconst html = getTemplateStrings(config).description.replace(\n\t\t\t'{{description}}',\n\t\t\tdescription,\n\t\t);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders an option group with header\n\t */\n\toptionGroup: (\n\t\tlabel: string,\n\t\toptionsHtml: string,\n\t\tconfig: KTSelectConfigInterface,\n\t): HTMLElement => {\n\t\tlet html = getTemplateStrings(config)\n\t\t\t.optionGroup.replace(/{{label}}/g, label)\n\t\t\t.replace('{{optionsHtml}}', optionsHtml);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the search input\n\t */\n\tsearch: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config).search.replace(\n\t\t\t'{{searchPlaceholder}}',\n\t\t\tconfig.searchPlaceholder || 'Search...',\n\t\t);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the no results message\n\t */\n\tnoResults: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config).noResults.replace(\n\t\t\t'{{searchNotFoundText}}',\n\t\t\tconfig.searchNotFoundText || 'No results found',\n\t\t);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the loading state\n\t */\n\tloading: (\n\t\tconfig: KTSelectConfigInterface,\n\t\tloadingMessage: string,\n\t): HTMLElement => {\n\t\tlet html = getTemplateStrings(config).loading.replace(\n\t\t\t'{{loadingMessage}}',\n\t\t\tloadingMessage || 'Loading options...',\n\t\t);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders a tag for multi-select\n\t */\n\ttag: (\n\t\toption: KTSelectOption,\n\t\tconfig: KTSelectConfigInterface,\n\t): HTMLElement => {\n\t\t// Escape HTML characters for aria-label to prevent HTML injection\n\t\tconst escapeHTML = (str: string) => {\n\t\t\treturn str.replace(/[&<>\"']/g, (match) => {\n\t\t\t\tconst escapeMap: Record<string, string> = {\n\t\t\t\t\t'&': '&amp;',\n\t\t\t\t\t'<': '&lt;',\n\t\t\t\t\t'>': '&gt;',\n\t\t\t\t\t'\"': '&quot;',\n\t\t\t\t\t\"'\": '&#39;',\n\t\t\t\t};\n\t\t\t\treturn escapeMap[match];\n\t\t\t});\n\t\t};\n\n\t\t// Ensure we have plain text for the aria-label\n\t\tconst safeTitle = escapeHTML(option.title);\n\t\tlet html = getTemplateStrings(config)\n\t\t\t.tag.replace('{{title}}', option.title)\n\t\t\t.replace('{{id}}', option.id)\n\t\t\t.replace('{{safeTitle}}', safeTitle);\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Formats the display of selected values\n\t */\n\tselectedDisplay: (\n\t\tselectedOptions: KTSelectOption[],\n\t\tconfig: KTSelectConfigInterface,\n\t): string => {\n\t\tif (!selectedOptions || selectedOptions.length === 0) {\n\t\t\treturn config.placeholder || 'Select...';\n\t\t}\n\n\t\tif (config.multiple) {\n\t\t\tif (\n\t\t\t\tconfig.renderSelected &&\n\t\t\t\ttypeof config.renderSelected === 'function'\n\t\t\t) {\n\t\t\t\treturn config.renderSelected(selectedOptions);\n\t\t\t}\n\n\t\t\tif (config.showSelectedCount) {\n\t\t\t\tconst count = selectedOptions.length;\n\t\t\t\treturn `${count} ${count === 1 ? 'item' : 'items'} selected`;\n\t\t\t}\n\n\t\t\treturn selectedOptions.map((option) => option.title).join(', ');\n\t\t} else {\n\t\t\treturn selectedOptions[0].title;\n\t\t}\n\t},\n};\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n/**\n * Common type interfaces for the KTSelect component\n */\n\n/**\n * Select mode options\n */\nexport enum SelectMode {\n\tTAGS = 'tags',\n\tCOMBOBOX = 'combobox',\n}\n\nexport interface KTSelectOption {\n\tid: string;\n\ttitle: string;\n\tselected?: boolean;\n\tdescription?: string;\n\ticon?: string;\n\tdisabled?: boolean;\n}\n\nexport interface KTSelectOptionData {\n\t[key: string]: any;\n}\n\nexport interface KTSelectState {\n\tgetSelectedOptions(): string[];\n\tsetSelectedOptions(value: string | string[]): void;\n\ttoggleSelectedOptions(value: string): void;\n\tisSelected(value: string): boolean;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n// utils.ts\n\nimport { KTSelect } from './select';\nimport { defaultTemplates, getTemplateStrings } from './templates';\nimport { KTSelectConfigInterface } from './config';\n\n/**\n * Format a number as a currency string\n */\nexport function formatCurrency(value: number): string {\n\treturn new Intl.NumberFormat('en-US', {\n\t\tstyle: 'currency',\n\t\tcurrency: 'USD',\n\t}).format(value);\n}\n\n/**\n * Filter options based on a search query\n */\nexport function filterOptions(\n\toptions: HTMLElement[],\n\tquery: string,\n\tconfig: KTSelectConfigInterface,\n\tdropdownElement: HTMLElement,\n\tonVisibleCount?: (count: number) => void,\n): number {\n\tlet visibleOptionsCount = 0;\n\n\t// Clear existing \"no results\" messages\n\tconst noResultsElement = dropdownElement.querySelector(\n\t\t'[data-kt-select-no-results]',\n\t);\n\tif (noResultsElement) {\n\t\tnoResultsElement.remove();\n\t}\n\n\t// For empty query, ensure highlights are cleared from all options\n\tif (!query || query.trim() === '') {\n\t\t// Just make all options visible without highlighting\n\t\tfor (const option of options) {\n\t\t\t// Make option visible by removing hidden classes and inline styles\n\t\t\toption.classList.remove('hidden');\n\n\t\t\t// Clean up any inline display styles from legacy code\n\t\t\tif (\n\t\t\t\toption.hasAttribute('style') &&\n\t\t\t\toption.getAttribute('style').includes('display:')\n\t\t\t) {\n\t\t\t\tconst styleAttr = option.getAttribute('style');\n\t\t\t\tif (\n\t\t\t\t\tstyleAttr.trim() === 'display: none;' ||\n\t\t\t\t\tstyleAttr.trim() === 'display: block;'\n\t\t\t\t) {\n\t\t\t\t\toption.removeAttribute('style');\n\t\t\t\t} else {\n\t\t\t\t\toption.setAttribute(\n\t\t\t\t\t\t'style',\n\t\t\t\t\t\tstyleAttr.replace(/display:\\s*[^;]+;?/gi, '').trim(),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tvisibleOptionsCount++;\n\t\t}\n\n\t\t// Call the callback with the visible count if provided\n\t\tif (onVisibleCount) {\n\t\t\tonVisibleCount(visibleOptionsCount);\n\t\t}\n\n\t\treturn visibleOptionsCount;\n\t}\n\n\t// Filter options based on query\n\tfor (const option of options) {\n\t\tconst optionText = option.textContent?.toLowerCase() || '';\n\t\tconst isMatch = optionText.includes(query.toLowerCase());\n\n\t\tif (isMatch || query.trim() === '') {\n\t\t\t// Show option by removing the hidden class and any display inline styles\n\t\t\toption.classList.remove('hidden');\n\n\t\t\t// Remove any inline display styles that might be present\n\t\t\tif (\n\t\t\t\toption.hasAttribute('style') &&\n\t\t\t\toption.getAttribute('style').includes('display:')\n\t\t\t) {\n\t\t\t\tconst styleAttr = option.getAttribute('style');\n\t\t\t\tif (\n\t\t\t\t\tstyleAttr.trim() === 'display: none;' ||\n\t\t\t\t\tstyleAttr.trim() === 'display: block;'\n\t\t\t\t) {\n\t\t\t\t\toption.removeAttribute('style');\n\t\t\t\t} else {\n\t\t\t\t\toption.setAttribute(\n\t\t\t\t\t\t'style',\n\t\t\t\t\t\tstyleAttr.replace(/display:\\s*[^;]+;?/gi, '').trim(),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvisibleOptionsCount++;\n\n\t\t\t// Apply highlighting if needed - but preserve the option structure\n\t\t\tif (isMatch && config.searchHighlight && query.trim() !== '') {\n\t\t\t\t// Clone option elements that contain icons or descriptions\n\t\t\t\tconst hasIcon =\n\t\t\t\t\toption.querySelector('[data-kt-select-option-icon]') !== null;\n\t\t\t\tconst hasDescription =\n\t\t\t\t\toption.querySelector('[data-kt-select-option-description]') !== null;\n\n\t\t\t\tif (hasIcon || hasDescription) {\n\t\t\t\t\t// Only highlight the text part without changing structure\n\t\t\t\t\tconst titleElement = option.querySelector(\n\t\t\t\t\t\t'[data-kt-option-title]',\n\t\t\t\t\t) as HTMLElement;\n\t\t\t\t\tif (titleElement) {\n\t\t\t\t\t\thighlightTextInElement(titleElement, query, config);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Simple option with just text - standard highlighting\n\t\t\t\t\thighlightTextInElement(option, query, config);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Hide option using hidden class\n\t\t\toption.classList.add('hidden');\n\n\t\t\t// Remove any inline display styles\n\t\t\tif (\n\t\t\t\toption.hasAttribute('style') &&\n\t\t\t\toption.getAttribute('style').includes('display:')\n\t\t\t) {\n\t\t\t\tconst styleAttr = option.getAttribute('style');\n\t\t\t\tif (\n\t\t\t\t\tstyleAttr.trim() === 'display: none;' ||\n\t\t\t\t\tstyleAttr.trim() === 'display: block;'\n\t\t\t\t) {\n\t\t\t\t\toption.removeAttribute('style');\n\t\t\t\t} else {\n\t\t\t\t\toption.setAttribute(\n\t\t\t\t\t\t'style',\n\t\t\t\t\t\tstyleAttr.replace(/display:\\s*[^;]+;?/gi, '').trim(),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Early exit if maxItems limit is reached\n\t\tif (config.searchMaxItems && visibleOptionsCount >= config.searchMaxItems) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Call the callback with the visible count if provided\n\tif (onVisibleCount) {\n\t\tonVisibleCount(visibleOptionsCount);\n\t}\n\n\treturn visibleOptionsCount;\n}\n\n/**\n * Highlight text only within a specific element, preserving other elements\n */\nexport function highlightTextInElement(\n\telement: HTMLElement,\n\tquery: string,\n\tconfig: KTSelectConfigInterface,\n): void {\n\tif (!element || !query || query.trim() === '') return;\n\n\tconst queryLower = query.toLowerCase();\n\n\tfunction walk(node: Node) {\n\t\tif (node.nodeType === Node.TEXT_NODE) {\n\t\t\tconst text = node.nodeValue || '';\n\t\t\tconst textLower = text.toLowerCase();\n\t\t\tconst matchIndex = textLower.indexOf(queryLower);\n\n\t\t\tif (matchIndex !== -1) {\n\t\t\t\tconst before = text.slice(0, matchIndex);\n\t\t\t\tconst match = text.slice(matchIndex, matchIndex + query.length);\n\t\t\t\tconst after = text.slice(matchIndex + query.length);\n\n\t\t\t\tconst frag = document.createDocumentFragment();\n\t\t\t\tif (before) frag.appendChild(document.createTextNode(before));\n\n\t\t\t\t// Use the highlight template, which returns an HTMLElement\n\t\t\t\tconst highlightSpan = defaultTemplates.highlight(config, match);\n\t\t\t\tfrag.appendChild(highlightSpan);\n\n\t\t\t\tif (after) frag.appendChild(document.createTextNode(after));\n\n\t\t\t\tnode.parentNode?.replaceChild(frag, node);\n\t\t\t\t// Only highlight the first occurrence in this node\n\t\t\t}\n\t\t} else if (node.nodeType === Node.ELEMENT_NODE) {\n\t\t\t// Don't re-highlight already highlighted nodes\n\t\t\tif ((node as HTMLElement).classList.contains('highlight')) return;\n\t\t\tArray.from(node.childNodes).forEach(walk);\n\t\t}\n\t}\n\twalk(element);\n}\n\n/**\n * Focus manager for keyboard navigation\n * Consolidates redundant focus management logic into shared functions\n */\nexport class FocusManager {\n\tprivate _element: HTMLElement;\n\tprivate _optionsSelector: string;\n\tprivate _focusedOptionIndex: number | null = null;\n\tprivate _focusClass: string;\n\tprivate _hoverClass: string;\n\tprivate _bgClass: string;\n\tprivate _fontClass: string;\n\tprivate _eventManager: EventManager;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\toptionsSelector: string = '[data-kt-select-option]',\n\t\tconfig?: KTSelectConfigInterface,\n\t) {\n\t\tthis._element = element;\n\t\tthis._optionsSelector = optionsSelector;\n\t\tthis._eventManager = new EventManager();\n\n\t\t// Use config values if provided, otherwise fallback to defaults\n\t\tthis._focusClass = config?.focusClass || 'option-focused';\n\t\tthis._hoverClass = config?.hoverClass || 'hovered';\n\t\tthis._bgClass = config?.bgClass || 'bg-blue-50';\n\t\tthis._fontClass = config?.fontClass || 'font-medium';\n\n\t\t// Add click handler to update focus state when options are clicked\n\t\tthis._setupOptionClickHandlers();\n\t}\n\n\t/**\n\t * Set up click handlers for all options to update focus state\n\t */\n\tprivate _setupOptionClickHandlers(): void {\n\t\t// Add click handler to the options container\n\t\tthis._eventManager.addListener(this._element, 'click', (e: Event) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst optionElement = target.closest(this._optionsSelector);\n\n\t\t\tif (optionElement) {\n\t\t\t\t// First clear all focus\n\t\t\t\tthis.resetFocus();\n\n\t\t\t\t// Then update the focused index based on the clicked option\n\t\t\t\tconst options = this.getVisibleOptions();\n\t\t\t\tconst clickedIndex = options.indexOf(optionElement as HTMLElement);\n\n\t\t\t\tif (clickedIndex >= 0) {\n\t\t\t\t\tthis._focusedOptionIndex = clickedIndex;\n\t\t\t\t\tthis.applyFocus(options[clickedIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Get all visible options\n\t */\n\tpublic getVisibleOptions(): HTMLElement[] {\n\t\treturn Array.from(\n\t\t\tthis._element.querySelectorAll(this._optionsSelector),\n\t\t).filter((option) => {\n\t\t\tconst element = option as HTMLElement;\n\t\t\t// Check only for hidden class\n\t\t\tif (element.classList.contains('hidden')) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Also check inline styles for backward compatibility\n\t\t\tif (element.style.display === 'none') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}) as HTMLElement[];\n\t}\n\n\t/**\n\t * Focus the next visible option\n\t */\n\tpublic focusNext(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\n\t\tthis.resetFocus();\n\n\t\tif (this._focusedOptionIndex === null) {\n\t\t\tthis._focusedOptionIndex = 0;\n\t\t} else {\n\t\t\tthis._focusedOptionIndex =\n\t\t\t\t(this._focusedOptionIndex + 1) % options.length;\n\t\t}\n\n\t\tconst option = options[this._focusedOptionIndex];\n\t\tthis.applyFocus(option);\n\t\tthis.scrollIntoView(option);\n\n\t\treturn option;\n\t}\n\n\t/**\n\t * Focus the previous visible option\n\t */\n\tpublic focusPrevious(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\n\t\tthis.resetFocus();\n\n\t\tif (this._focusedOptionIndex === null) {\n\t\t\tthis._focusedOptionIndex = options.length - 1;\n\t\t} else {\n\t\t\tthis._focusedOptionIndex =\n\t\t\t\t(this._focusedOptionIndex - 1 + options.length) % options.length;\n\t\t}\n\n\t\tconst option = options[this._focusedOptionIndex];\n\t\tthis.applyFocus(option);\n\t\tthis.scrollIntoView(option);\n\n\t\treturn option;\n\t}\n\n\t/**\n\t * Apply focus to a specific option\n\t */\n\tpublic applyFocus(option: HTMLElement): void {\n\t\tif (!option) return;\n\n\t\t// Remove focus from all options first\n\t\tthis.resetFocus();\n\n\t\t// Add focus to this option\n\t\toption.classList.add(this._focusClass);\n\t\toption.classList.add(this._hoverClass);\n\t\toption.classList.add(this._bgClass);\n\t\toption.classList.add(this._fontClass);\n\t}\n\n\t/**\n\t * Reset focus on all options\n\t */\n\tpublic resetFocus(): void {\n\t\t// Find all elements with the focus classes\n\t\tconst focusedElements = this._element.querySelectorAll(\n\t\t\t`.${this._focusClass}, .${this._hoverClass}, .${this._bgClass}, .${this._fontClass}`,\n\t\t);\n\n\t\t// Remove classes from all elements\n\t\tfocusedElements.forEach((element) => {\n\t\t\telement.classList.remove(this._focusClass);\n\t\t\telement.classList.remove(this._hoverClass);\n\t\t\telement.classList.remove(this._bgClass);\n\t\t\telement.classList.remove(this._fontClass);\n\t\t});\n\n\t\t// Reset index if visible options have changed\n\t\tconst visibleOptions = this.getVisibleOptions();\n\t\tif (\n\t\t\tthis._focusedOptionIndex !== null &&\n\t\t\tthis._focusedOptionIndex >= visibleOptions.length\n\t\t) {\n\t\t\tthis._focusedOptionIndex = null;\n\t\t}\n\t}\n\n\t/**\n\t * Ensure the focused option is visible in the scrollable container\n\t */\n\tpublic scrollIntoView(option: HTMLElement): void {\n\t\tif (!option) return;\n\n\t\tconst container = this._element.querySelector(\n\t\t\t'[data-kt-select-options-container]',\n\t\t);\n\t\tif (!container) return;\n\n\t\tconst optionRect = option.getBoundingClientRect();\n\t\tconst containerRect = container.getBoundingClientRect();\n\n\t\t// Check if option is below the visible area\n\t\tif (optionRect.bottom > containerRect.bottom) {\n\t\t\toption.scrollIntoView({ block: 'end', behavior: 'smooth' });\n\t\t}\n\t\t// Check if option is above the visible area\n\t\telse if (optionRect.top < containerRect.top) {\n\t\t\toption.scrollIntoView({ block: 'start', behavior: 'smooth' });\n\t\t}\n\t}\n\n\t/**\n\t * Focus a specific option by its value\n\t */\n\tpublic focusOptionByValue(value: string): boolean {\n\t\tconst options = this.getVisibleOptions();\n\t\tconst index = options.findIndex((option) => option.dataset.value === value);\n\n\t\tif (index >= 0) {\n\t\t\tthis._focusedOptionIndex = index;\n\t\t\tthis.applyFocus(options[index]);\n\t\t\tthis.scrollIntoView(options[index]);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Get the currently focused option\n\t */\n\tpublic getFocusedOption(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\n\t\tif (\n\t\t\tthis._focusedOptionIndex !== null &&\n\t\t\tthis._focusedOptionIndex < options.length\n\t\t) {\n\t\t\treturn options[this._focusedOptionIndex];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get the index of the currently focused option\n\t */\n\tpublic getFocusedIndex(): number | null {\n\t\treturn this._focusedOptionIndex;\n\t}\n\n\t/**\n\t * Set the focused option index directly\n\t */\n\tpublic setFocusedIndex(index: number | null): void {\n\t\tthis._focusedOptionIndex = index;\n\t}\n\n\t/**\n\t * Clean up event listeners\n\t */\n\tpublic dispose(): void {\n\t\tif (this._eventManager) {\n\t\t\tthis._eventManager.removeAllListeners(this._element);\n\t\t}\n\t}\n}\n\n/**\n * Shared keyboard navigation handler for dropdown options\n * Can be used by both combobox and search modules\n */\nexport function handleDropdownKeyNavigation(\n\tevent: KeyboardEvent,\n\tselect: KTSelect,\n\tconfig: {\n\t\tmultiple?: boolean;\n\t\tcloseOnSelect?: boolean;\n\t},\n\tcallbacks?: {\n\t\tonArrowUp?: () => void;\n\t\tonArrowDown?: () => void;\n\t\tonEnter?: () => void;\n\t\tonClose?: () => void;\n\t},\n): void {\n\ttry {\n\t\t// Get the dropdown state\n\t\tconst isDropdownOpen = (select as any)._dropdownIsOpen;\n\n\t\t// Log the event to help debug\n\t\tconst origin = 'handleDropdownKeyNavigation';\n\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\tconsole.log(\n\t\t\t\t`[${origin}] Key: ${event.key}, Dropdown open: ${isDropdownOpen}`,\n\t\t\t);\n\n\t\t// Handle basic keyboard navigation\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\t\tif (!isDropdownOpen) {\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Opening dropdown on ArrowDown`);\n\t\t\t\t\tselect.openDropdown();\n\n\t\t\t\t\t// Focus the first option after opening\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t(select as any)._focusNextOption();\n\t\t\t\t\t}, 50);\n\t\t\t\t} else if (callbacks?.onArrowDown) {\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Using custom onArrowDown callback`);\n\t\t\t\t\tcallbacks.onArrowDown();\n\t\t\t\t} else {\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Using default _focusNextOption`);\n\t\t\t\t\tconst focusedOption = (select as any)._focusNextOption();\n\n\t\t\t\t\t// Ensure we have a focused option\n\t\t\t\t\tif (focusedOption) {\n\t\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\t\tconsole.log(`[${origin}] Focused next option:`, focusedOption);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowUp':\n\t\t\t\tif (!isDropdownOpen) {\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Opening dropdown on ArrowUp`);\n\t\t\t\t\tselect.openDropdown();\n\n\t\t\t\t\t// Focus the last option after opening\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t(select as any)._focusPreviousOption();\n\t\t\t\t\t}, 50);\n\t\t\t\t} else if (callbacks?.onArrowUp) {\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Using custom onArrowUp callback`);\n\t\t\t\t\tcallbacks.onArrowUp();\n\t\t\t\t} else {\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Using default _focusPreviousOption`);\n\t\t\t\t\tconst focusedOption = (select as any)._focusPreviousOption();\n\n\t\t\t\t\t// Ensure we have a focused option\n\t\t\t\t\tif (focusedOption) {\n\t\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`[${origin}] Focused previous option:`,\n\t\t\t\t\t\t\t\tfocusedOption,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\n\t\t\tcase 'Enter':\n\t\t\t\t// Prevent form submission\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (isDropdownOpen) {\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Enter pressed with dropdown open`);\n\n\t\t\t\t\t// For combobox mode, ensure we update the input value directly\n\t\t\t\t\tconst isCombobox = select.getConfig().mode === 'combobox';\n\t\t\t\t\tconst comboboxModule = (select as any)._comboboxModule;\n\n\t\t\t\t\tif (callbacks?.onEnter) {\n\t\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\t\tconsole.log(`[${origin}] Using custom onEnter callback`);\n\t\t\t\t\t\tcallbacks.onEnter();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\t\tconsole.log(`[${origin}] Using default selectFocusedOption`);\n\t\t\t\t\t\t// Make sure there is a focused option before trying to select it\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(select as any)._focusManager &&\n\t\t\t\t\t\t\t(select as any)._focusManager.getFocusedOption()\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tselect.selectFocusedOption();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// If no option is focused, try to focus the first one\n\t\t\t\t\t\t\tconst focusedOption = (select as any)._focusNextOption();\n\t\t\t\t\t\t\t// Only select if an option was successfully focused\n\t\t\t\t\t\t\tif (focusedOption) {\n\t\t\t\t\t\t\t\tselect.selectFocusedOption();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Close dropdown after selection if not multiple and closeOnSelect is true\n\t\t\t\t\tif (!config.multiple && config.closeOnSelect !== false) {\n\t\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\t\tconsole.log(`[${origin}] Closing dropdown after selection`);\n\t\t\t\t\t\tselect.closeDropdown();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If dropdown is closed, open it on Enter\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Opening dropdown on Enter`);\n\t\t\t\t\tselect.openDropdown();\n\n\t\t\t\t\t// Focus the first option after opening\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t(select as any)._focusNextOption();\n\t\t\t\t\t}, 50);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'Tab':\n\t\t\t\t// Only handle tab if dropdown is open\n\t\t\t\tif (isDropdownOpen) {\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Closing dropdown on Tab`);\n\t\t\t\t\tselect.closeDropdown();\n\t\t\t\t\tif (callbacks?.onClose) {\n\t\t\t\t\t\tcallbacks.onClose();\n\t\t\t\t\t}\n\t\t\t\t\t// Don't prevent default tab behavior - let it move focus naturally\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'Escape':\n\t\t\t\t// Only handle escape if dropdown is open\n\t\t\t\tif (isDropdownOpen) {\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Closing dropdown on Escape`);\n\t\t\t\t\tselect.closeDropdown();\n\t\t\t\t\tif (callbacks?.onClose) {\n\t\t\t\t\t\tcallbacks.onClose();\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault(); // Prevent other escape handlers\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase ' ': // Space key\n\t\t\t\t// If dropdown is closed, space should open it (but not if in combobox mode)\n\t\t\t\tif (!isDropdownOpen && !(select.getConfig().mode === 'combobox')) {\n\t\t\t\t\tif (select.getConfig && select.getConfig().debug)\n\t\t\t\t\t\tconsole.log(`[${origin}] Opening dropdown on Space`);\n\t\t\t\t\tselect.openDropdown();\n\n\t\t\t\t\t// Focus the first option after opening\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t(select as any)._focusNextOption();\n\t\t\t\t\t}, 50);\n\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t} catch (error) {\n\t\tconsole.error('Error in keyboard navigation handler:', error);\n\t}\n}\n\n/**\n * Centralized event listener management\n */\nexport class EventManager {\n\tprivate _boundHandlers: Map<\n\t\tstring,\n\t\tMap<EventListenerOrEventListenerObject, EventListenerOrEventListenerObject>\n\t> = new Map();\n\n\t/**\n\t * Add an event listener with a bound context\n\t */\n\tpublic addListener(\n\t\telement: HTMLElement,\n\t\tevent: string,\n\t\thandler: EventListenerOrEventListenerObject,\n\t\tcontext?: any,\n\t): void {\n\t\tif (!element) return;\n\n\t\t// Create a bound version of the handler if context provided\n\t\tconst boundHandler: EventListenerOrEventListenerObject =\n\t\t\tcontext && typeof handler === 'function'\n\t\t\t\t? handler.bind(context)\n\t\t\t\t: handler;\n\n\t\t// Store the relationship between original and bound handler\n\t\tif (!this._boundHandlers.has(event)) {\n\t\t\tthis._boundHandlers.set(event, new Map());\n\t\t}\n\n\t\tconst eventMap = this._boundHandlers.get(event)!;\n\t\teventMap.set(handler, boundHandler);\n\n\t\t// Add the event listener\n\t\telement.addEventListener(event, boundHandler);\n\t}\n\n\t/**\n\t * Remove an event listener\n\t */\n\tpublic removeListener(\n\t\telement: HTMLElement,\n\t\tevent: string,\n\t\thandler: EventListenerOrEventListenerObject,\n\t): void {\n\t\tif (!element) return;\n\n\t\tconst eventMap = this._boundHandlers.get(event);\n\t\tif (!eventMap) return;\n\n\t\t// Get the bound version of the handler\n\t\tconst boundHandler = eventMap.get(handler);\n\t\tif (!boundHandler) return;\n\n\t\t// Remove the event listener\n\t\telement.removeEventListener(event, boundHandler);\n\n\t\t// Clean up the map\n\t\teventMap.delete(handler);\n\t\tif (eventMap.size === 0) {\n\t\t\tthis._boundHandlers.delete(event);\n\t\t}\n\t}\n\n\t/**\n\t * Remove all event listeners\n\t */\n\tpublic removeAllListeners(element: HTMLElement): void {\n\t\tif (!element) return;\n\n\t\t// Go through each event type\n\t\tthis._boundHandlers.forEach((eventMap, event) => {\n\t\t\t// For each event type, go through each handler\n\t\t\teventMap.forEach((boundHandler, originalHandler) => {\n\t\t\t\telement.removeEventListener(event, boundHandler);\n\t\t\t});\n\t\t});\n\n\t\t// Clear the maps\n\t\tthis._boundHandlers.clear();\n\t}\n}\n\n/**\n * Debounce function to limit how often a function can be called\n */\nexport function debounce(\n\tfunc: (...args: any[]) => void,\n\tdelay: number,\n): (...args: any[]) => void {\n\tlet timeout: ReturnType<typeof setTimeout>;\n\n\treturn function (...args: any[]) {\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(() => func(...args), delay);\n\t};\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTStepper } from './stepper';\nexport type { KTStepperConfigInterface, KTStepperInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTStepperInterface, KTStepperConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_STEPPER_INITIALIZED: boolean;\n\t\tKTStepper: typeof KTStepper;\n\t}\n}\n\nexport class KTStepper extends KTComponent implements KTStepperInterface {\n\tprotected override _name: string = 'stepper';\n\tprotected override _defaultConfig: KTStepperConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tactiveStep: 1,\n\t};\n\tprotected override _config: KTStepperConfigInterface = this._defaultConfig;\n\tprotected _activeStep: number = 0;\n\tprotected _nextElement: HTMLElement | null = null;\n\tprotected _backElement: HTMLElement | null = null;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTStepperConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\t\tthis._nextElement = this._element.querySelector('[data-kt-stepper-next]');\n\t\tthis._backElement = this._element.querySelector('[data-kt-stepper-back]');\n\n\t\tthis._activeStep = 1;\n\t\tif (this._getOption('activeStep') !== this._activeStep) {\n\t\t\tthis._go(this._getOption('activeStep') as number);\n\t\t}\n\n\t\tthis._update();\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._nextElement) {\n\t\t\tconsole.error('data-kt-stepper-next not found');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._nextElement) {\n\t\t\tthis._nextElement.addEventListener('click', (event: Event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._goNext();\n\t\t\t});\n\t\t}\n\n\t\tif (this._backElement) {\n\t\t\tthis._backElement.addEventListener('click', (event: Event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._goBack();\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._element) return;\n\t\tlet state = '';\n\n\t\tif (this._activeStep === this._getTotalSteps()) {\n\t\t\tstate = 'last';\n\t\t} else if (this._activeStep === 1) {\n\t\t\tstate = 'first';\n\t\t} else {\n\t\t\tstate = 'between';\n\t\t}\n\n\t\tthis._element.classList.remove('first');\n\t\tthis._element.classList.remove('last');\n\t\tthis._element.classList.remove('between');\n\t\tthis._element.classList.add(state);\n\n\t\tthis._getItemElements().forEach((element, index) => {\n\t\t\tconst contentElement = KTDom.getElement(\n\t\t\t\telement.getAttribute('data-kt-stepper-item'),\n\t\t\t);\n\t\t\tif (!contentElement) return;\n\n\t\t\telement.classList.remove('active');\n\t\t\telement.classList.remove('completed');\n\t\t\telement.classList.remove('pending');\n\n\t\t\tconst numberElement = element.querySelector('[data-kt-stepper-number]');\n\t\t\tif (numberElement) numberElement.innerHTML = String(index + 1);\n\n\t\t\tif (index + 1 == this._activeStep) {\n\t\t\t\telement.classList.add('active');\n\t\t\t\tcontentElement.classList.remove(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcontentElement.classList.add(this._getOption('hiddenClass') as string);\n\t\t\t\tif (index + 1 < this._activeStep) {\n\t\t\t\t\telement.classList.add('completed');\n\t\t\t\t} else {\n\t\t\t\t\telement.classList.add('pending');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _getItemElements(): Array<HTMLElement> {\n\t\tconst elements: Array<HTMLElement> = [];\n\n\t\tthis._element\n\t\t\t.querySelectorAll('[data-kt-stepper-item]')\n\t\t\t.forEach((element) => {\n\t\t\t\tif (KTDom.isVisible(element as HTMLElement)) {\n\t\t\t\t\telements.push(element as HTMLElement);\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn elements;\n\t}\n\n\tprotected _go(step: number): void {\n\t\tif (step === this._activeStep || step > this._getTotalSteps() || step < 0)\n\t\t\treturn;\n\n\t\tconst payload = { step: step, cancel: false };\n\t\tthis._fireEvent('change', payload);\n\t\tthis._dispatchEvent('change', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._activeStep = step;\n\t\tthis._update();\n\n\t\tthis._fireEvent('changed');\n\t\tthis._dispatchEvent('changed');\n\t}\n\n\tprotected _goTo(itemElement: HTMLElement): void {\n\t\tconst step = this._getStep(itemElement);\n\t\tthis._go(step);\n\t}\n\n\tprotected _getStep(itemElement: HTMLElement): number {\n\t\tlet step = -1;\n\n\t\tthis._getItemElements().forEach((element, index) => {\n\t\t\tif (element === itemElement) {\n\t\t\t\tstep = index + 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\n\t\treturn step;\n\t}\n\n\tprotected _getItemElement(step: number) {\n\t\treturn this._getItemElements()[step - 1];\n\t}\n\n\tprotected _getTotalSteps(): number {\n\t\treturn this._getItemElements().length;\n\t}\n\n\tprotected _goNext(): void {\n\t\tlet step;\n\n\t\tif (this._getTotalSteps() >= this._activeStep + 1) {\n\t\t\tstep = this._activeStep + 1;\n\t\t} else {\n\t\t\tstep = this._getTotalSteps();\n\t\t}\n\n\t\tthis._go(step);\n\t}\n\n\tprotected _goBack(): void {\n\t\tlet step;\n\n\t\tif (this._activeStep - 1 > 1) {\n\t\t\tstep = this._activeStep - 1;\n\t\t} else {\n\t\t\tstep = 1;\n\t\t}\n\n\t\tthis._go(step);\n\t}\n\n\tprotected _goLast(): void {\n\t\tconst step = this._getTotalSteps();\n\t\tthis._go(step);\n\t}\n\n\tprotected _goFirst(): void {\n\t\tconst step = 1;\n\t\tthis._go(step);\n\t}\n\n\tprotected _isLast(): boolean {\n\t\treturn this._getTotalSteps() === this._activeStep + 1;\n\t}\n\n\tprotected _isFirst(): boolean {\n\t\treturn this._activeStep === 1;\n\t}\n\n\tpublic isLast(): boolean {\n\t\treturn this._isLast();\n\t}\n\n\tpublic isFirst(): boolean {\n\t\treturn this._isFirst();\n\t}\n\n\tpublic go(step: number): void {\n\t\tthis._go(step);\n\t}\n\n\tpublic goTo(itemElement: HTMLElement): void {\n\t\tthis.goTo(itemElement);\n\t}\n\n\tpublic goFirst(): void {\n\t\tthis._goFirst();\n\t}\n\n\tpublic goLast(): void {\n\t\tthis._goLast();\n\t}\n\n\tpublic goNext(): void {\n\t\tthis._goNext();\n\t}\n\n\tpublic goBack(): void {\n\t\tthis._goBack();\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic getStep(itemElement: HTMLElement): number {\n\t\treturn this._getStep(itemElement);\n\t}\n\n\tpublic getItemElement(step: number): HTMLElement {\n\t\treturn this._getItemElement(step);\n\t}\n\n\tpublic getTotalSteps(): number {\n\t\treturn this._getTotalSteps();\n\t}\n\n\tpublic getItemElements(): Array<HTMLElement> {\n\t\treturn this._getItemElements();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTStepper {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'stepper')) {\n\t\t\treturn KTData.get(element, 'stepper') as KTStepper;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-stepper')) {\n\t\t\treturn new KTStepper(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTStepperConfigInterface,\n\t): KTStepper | null {\n\t\treturn this.getInstance(element) || new KTStepper(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-stepper]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTStepper(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTStepper.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTStepper = KTStepper;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTSticky } from './sticky';\nexport type { KTStickyConfigInterface, KTStickyInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTStickyInterface, KTStickyConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_STICKY_INITIALIZED: boolean;\n\t\tKTSticky: typeof KTSticky;\n\t}\n}\n\nexport class KTSticky extends KTComponent implements KTStickyInterface {\n\tprotected override _name: string = 'sticky';\n\tprotected override _defaultConfig: KTStickyConfigInterface = {\n\t\ttarget: 'body',\n\t\tname: '',\n\t\tclass: '',\n\t\ttop: '',\n\t\tstart: '',\n\t\tend: '',\n\t\twidth: '',\n\t\tzindex: '',\n\t\toffset: 0,\n\t\treverse: false,\n\t\trelease: '',\n\t\tactivate: '',\n\t};\n\tprotected override _config: KTStickyConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement | Document | null = null;\n\n\tprotected _attributeRoot: string;\n\tprotected _eventTriggerState: boolean;\n\tprotected _lastScrollTop: number;\n\tprotected _releaseElement: HTMLElement;\n\tprotected _activateElement: HTMLElement;\n\tprotected _wrapperElement: HTMLElement;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTStickyConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._releaseElement = KTDom.getElement(\n\t\t\tthis._getOption('release') as string,\n\t\t);\n\t\tthis._activateElement = KTDom.getElement(\n\t\t\tthis._getOption('activate') as string,\n\t\t);\n\t\tthis._wrapperElement = this._element.closest('[data-kt-sticky-wrapper]');\n\t\tthis._attributeRoot = `data-kt-sticky-${this._getOption('name')}`;\n\t\tthis._eventTriggerState = true;\n\t\tthis._lastScrollTop = 0;\n\n\t\tconst targetElement =\n\t\t\tthis._getTarget() === 'body'\n\t\t\t\t? document\n\t\t\t\t: KTDom.getElement(this._getTarget());\n\t\tif (!targetElement) return;\n\n\t\tthis._targetElement = targetElement;\n\n\t\tthis._handlers();\n\t\tthis._process();\n\t\tthis._update();\n\t}\n\n\tprivate _getTarget(): string {\n\t\treturn (\n\t\t\t(this._element.getAttribute('data-kt-sticky-target') as string) ||\n\t\t\t(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\t() => {\n\t\t\t\t\tthis._update();\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\n\t\tthis._targetElement.addEventListener('scroll', () => {\n\t\t\tthis._process();\n\t\t});\n\t}\n\n\tprotected _process(): void {\n\t\tconst reverse = this._getOption('reverse');\n\t\tconst offset = this._getOffset();\n\n\t\tif (offset < 0) {\n\t\t\tthis._disable();\n\t\t\treturn;\n\t\t}\n\n\t\tconst st =\n\t\t\tthis._getTarget() === 'body'\n\t\t\t\t? KTDom.getScrollTop()\n\t\t\t\t: (this._targetElement as HTMLElement).scrollTop;\n\t\tconst release =\n\t\t\tthis._releaseElement && KTDom.isPartiallyInViewport(this._releaseElement);\n\n\t\t// Release on reverse scroll mode\n\t\tif (reverse === true) {\n\t\t\t// Forward scroll mode\n\t\t\tif (st > offset && !release) {\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === false) {\n\t\t\t\t\tif (this._enable() === false) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdocument.body.setAttribute(this._attributeRoot, 'on');\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === true) {\n\t\t\t\t\tconst payload = { active: true };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = false;\n\t\t\t\t}\n\t\t\t\t// Back scroll mode\n\t\t\t} else {\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === true) {\n\t\t\t\t\tthis._disable();\n\t\t\t\t\tif (release) {\n\t\t\t\t\t\tthis._element.classList.add('release');\n\t\t\t\t\t}\n\t\t\t\t\tdocument.body.removeAttribute(this._attributeRoot);\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === false) {\n\t\t\t\t\tconst payload = { active: false };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._lastScrollTop = st;\n\t\t\t// Classic scroll mode\n\t\t} else {\n\t\t\t// Forward scroll mode\n\t\t\tif (st > offset && !release) {\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === false) {\n\t\t\t\t\tif (this._enable() === false) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdocument.body.setAttribute(this._attributeRoot, 'on');\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === true) {\n\t\t\t\t\tconst payload = { active: true };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = false;\n\t\t\t\t}\n\t\t\t\t// Back scroll mode\n\t\t\t} else {\n\t\t\t\t// back scroll mode\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === true) {\n\t\t\t\t\tthis._disable();\n\t\t\t\t\tif (release) {\n\t\t\t\t\t\tthis._element.classList.add('release');\n\t\t\t\t\t}\n\t\t\t\t\tdocument.body.removeAttribute(this._attributeRoot);\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === false) {\n\t\t\t\t\tconst payload = { active: false };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _getOffset(): number {\n\t\tlet offset = parseInt(this._getOption('offset') as string);\n\t\tconst activateElement = KTDom.getElement(\n\t\t\tthis._getOption('activate') as string,\n\t\t);\n\n\t\tif (activateElement) {\n\t\t\toffset = Math.abs(offset - activateElement.offsetTop);\n\t\t}\n\n\t\treturn offset;\n\t}\n\n\tprotected _enable(): boolean {\n\t\tif (!this._element) return false;\n\n\t\tlet width = this._getOption('width') as string;\n\t\tconst top = this._getOption('top') as string;\n\t\tconst start = this._getOption('start') as string;\n\t\tconst end = this._getOption('end') as string;\n\t\tconst height = this._calculateHeight();\n\t\tconst zindex = this._getOption('zindex') as string;\n\t\tconst classList = this._getOption('class') as string;\n\n\t\tif (height + parseInt(top) > KTDom.getViewPort().height) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (width) {\n\t\t\tconst targetElement = document.querySelector(width) as HTMLElement;\n\t\t\tif (targetElement) {\n\t\t\t\twidth = KTDom.getCssProp(targetElement, 'width');\n\t\t\t} else if (width == 'auto') {\n\t\t\t\twidth = KTDom.getCssProp(this._element, 'width');\n\t\t\t}\n\n\t\t\tthis._element.style.width = `${Math.round(parseFloat(width))}px`;\n\t\t}\n\n\t\tif (top) {\n\t\t\tthis._element.style.top = `${top}px`;\n\t\t}\n\n\t\tif (start) {\n\t\t\tif (start === 'auto') {\n\t\t\t\tconst offsetLeft = KTDom.offset(this._element).left;\n\t\t\t\tif (offsetLeft >= 0) {\n\t\t\t\t\tthis._element.style.insetInlineStart = `${offsetLeft}px`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._element.style.insetInlineStart = `${start}px`;\n\t\t\t}\n\t\t}\n\n\t\tif (end) {\n\t\t\tif (end === 'auto') {\n\t\t\t\tconst offseRight = KTDom.offset(this._element).right;\n\t\t\t\tif (offseRight >= 0) {\n\t\t\t\t\tthis._element.style.insetInlineEnd = `${offseRight}px`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._element.style.insetInlineEnd = `${end}px`;\n\t\t\t}\n\t\t}\n\n\t\tif (zindex) {\n\t\t\tthis._element.style.zIndex = zindex;\n\t\t\tthis._element.style.position = 'fixed';\n\t\t}\n\n\t\tif (classList) {\n\t\t\tKTDom.addClass(this._element, classList);\n\t\t}\n\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.style.height = `${height}px`;\n\t\t}\n\n\t\tthis._element.classList.add('active');\n\t\tthis._element.classList.remove('release');\n\n\t\treturn true;\n\t}\n\n\tprotected _disable(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.style.top = '';\n\t\tthis._element.style.width = '';\n\t\tthis._element.style.left = '';\n\t\tthis._element.style.right = '';\n\t\tthis._element.style.zIndex = '';\n\t\tthis._element.style.position = '';\n\n\t\tconst classList = this._getOption('class') as string;\n\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.style.height = '';\n\t\t}\n\n\t\tif (classList) {\n\t\t\tKTDom.removeClass(this._element, classList);\n\t\t}\n\n\t\tthis._element.classList.remove('active');\n\t}\n\n\tprotected _update(): void {\n\t\tif (this._isActive()) {\n\t\t\tthis._disable();\n\t\t\tthis._enable();\n\t\t} else {\n\t\t\tthis._disable();\n\t\t}\n\t}\n\n\tprotected _calculateHeight(): number {\n\t\tif (!this._element) return 0;\n\n\t\tlet height = parseFloat(KTDom.getCssProp(this._element, 'height'));\n\t\theight += parseFloat(KTDom.getCssProp(this._element, 'margin-top'));\n\t\theight += parseFloat(KTDom.getCssProp(this._element, 'margin-bottom'));\n\n\t\tif (KTDom.getCssProp(this._element, 'border-top')) {\n\t\t\theight =\n\t\t\t\theight + parseFloat(KTDom.getCssProp(this._element, 'border-top'));\n\t\t}\n\n\t\tif (KTDom.getCssProp(this._element, 'border-bottom')) {\n\t\t\theight =\n\t\t\t\theight + parseFloat(KTDom.getCssProp(this._element, 'border-bottom'));\n\t\t}\n\n\t\treturn height;\n\t}\n\n\tprotected _isActive(): boolean {\n\t\treturn this._element.classList.contains('active');\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic isActive(): boolean {\n\t\treturn this._isActive();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTSticky {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'sticky')) {\n\t\t\treturn KTData.get(element, 'sticky') as KTSticky;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-sticky')) {\n\t\t\treturn new KTSticky(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTStickyConfigInterface,\n\t): KTSticky {\n\t\treturn this.getInstance(element) || new KTSticky(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-sticky]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTSticky(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTSticky.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTSticky = KTSticky;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTTabs } from './tabs';\nexport type { KTTabsConfigInterface, KTTabsInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTTabsInterface, KTTabsConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_TABS_INITIALIZED: boolean;\n\t\tKTTabs: typeof KTTabs;\n\t}\n}\n\nexport class KTTabs extends KTComponent implements KTTabsInterface {\n\tprotected override _name: string = 'tabs';\n\tprotected override _defaultConfig: KTTabsConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t};\n\tprotected override _config: KTTabsConfigInterface = this._defaultConfig;\n\tprotected _currentTabElement: HTMLElement | null = null;\n\tprotected _currentContentElement: HTMLElement | null = null;\n\tprotected _lastTabElement: HTMLElement | null = null;\n\tprotected _lastContentElement: HTMLElement | null = null;\n\tprotected _tabElements: NodeListOf<HTMLElement> | null = null;\n\tprotected _isTransitioning: boolean = false;\n\n\tconstructor(element: HTMLElement, config?: KTTabsConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\t\tthis._tabElements = this._element.querySelectorAll('[data-kt-tab-toggle]');\n\t\tthis._currentTabElement = this._element.querySelector(\n\t\t\t'.active[data-kt-tab-toggle]',\n\t\t);\n\t\tthis._currentContentElement =\n\t\t\t(this._currentTabElement &&\n\t\t\t\t(KTDom.getElement(\n\t\t\t\t\tthis._currentTabElement.getAttribute('data-kt-tab-toggle'),\n\t\t\t\t) ||\n\t\t\t\t\tKTDom.getElement(this._currentTabElement.getAttribute('href')))) ||\n\t\t\tnull;\n\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-tab-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._show(target);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _show(tabElement: HTMLElement): void {\n\t\tif (this._isShown(tabElement) || this._isTransitioning) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._currentTabElement?.classList.remove('active');\n\t\tthis._currentTabElement?.classList.remove('selected');\n\t\tthis._currentContentElement?.classList.add(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._lastTabElement = this._currentTabElement;\n\t\tthis._getDropdownToggleElement(this._lastTabElement)?.classList.remove(\n\t\t\t'active',\n\t\t);\n\n\t\tthis._lastContentElement = this._currentContentElement;\n\t\tthis._currentTabElement = tabElement;\n\t\tthis._currentContentElement =\n\t\t\tKTDom.getElement(tabElement.getAttribute('data-kt-tab-toggle')) ||\n\t\t\tKTDom.getElement(tabElement.getAttribute('href'));\n\t\tthis._currentTabElement?.classList.add('active');\n\t\tthis._currentTabElement?.classList.add('selected');\n\t\tthis._currentContentElement?.classList.remove(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._getDropdownToggleElement(this._currentTabElement)?.classList.add(\n\t\t\t'active',\n\t\t);\n\n\t\tthis._currentContentElement.style.opacity = '0';\n\t\tKTDom.reflow(this._currentContentElement);\n\t\tthis._currentContentElement.style.opacity = '1';\n\n\t\tKTDom.transitionEnd(this._currentContentElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._currentContentElement.style.opacity = '';\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _getDropdownToggleElement(element: HTMLElement): HTMLElement {\n\t\tconst containerElement = element.closest(\n\t\t\t'[data-kt-dropdown-initialized],[data-kt-menu-initialized]',\n\t\t) as HTMLElement;\n\n\t\tif (containerElement) {\n\t\t\treturn containerElement.querySelector(\n\t\t\t\t'[data-kt-dropdown-toggle], [data-kt-menu-toggle]',\n\t\t\t);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprotected _isShown(tabElement: HTMLElement): boolean {\n\t\treturn tabElement.classList.contains('active');\n\t}\n\n\tpublic isShown(tabElement: HTMLElement): boolean {\n\t\treturn this._isShown(tabElement);\n\t}\n\n\tpublic show(tabElement: HTMLElement): void {\n\t\treturn this._show(tabElement);\n\t}\n\n\tpublic static keyboardArrow(): void {}\n\n\tpublic static keyboardJump(): void {}\n\n\tpublic static handleAccessibility(): void {}\n\n\tpublic static getInstance(element: HTMLElement): KTTabs {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'tabs')) {\n\t\t\treturn KTData.get(element, 'tabs') as KTTabs;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-tabs')) {\n\t\t\treturn new KTTabs(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTTabsConfigInterface,\n\t): KTTabs {\n\t\treturn this.getInstance(element) || new KTTabs(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-tabs]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTTabs(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTTabs.createInstances();\n\n\t\tif (window.KT_TABS_INITIALIZED !== true) {\n\t\t\tKTTabs.handleAccessibility();\n\t\t\twindow.KT_TABS_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTTabs = KTTabs;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTThemeSwitch } from './theme-switch';\nexport type {\n\tKTThemeSwitchConfigInterface,\n\tKTThemeSwitchInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\nimport KTData from '../../helpers/data';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTThemeSwitchInterface, KTThemeSwitchConfigInterface } from './types';\nimport { KTThemeSwitchModeType } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_STICKY_INITIALIZED: boolean;\n\t\tKTThemeSwitch: typeof KTThemeSwitch;\n\t}\n}\n\nexport class KTThemeSwitch\n\textends KTComponent\n\timplements KTThemeSwitchInterface\n{\n\tprotected override _name: string = 'theme-swtich';\n\tprotected override _defaultConfig: KTThemeSwitchConfigInterface = {\n\t\tmode: 'light',\n\t};\n\tprotected _mode: KTThemeSwitchModeType | null = null;\n\tprotected _currentMode: KTThemeSwitchModeType | null = null;\n\n\tconstructor(\n\t\telement: HTMLElement | HTMLHtmlElement,\n\t\tconfig: KTThemeSwitchConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement | HTMLHtmlElement, this._name))\n\t\t\treturn;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._setMode(\n\t\t\t(localStorage.getItem('kt-theme') ||\n\t\t\t\tthis._getOption('mode')) as KTThemeSwitchModeType,\n\t\t);\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-theme-switch-toggle]',\n\t\t\t'click',\n\t\t\t() => {\n\t\t\t\tthis._toggle();\n\t\t\t},\n\t\t);\n\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-theme-switch-set]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst mode = target.getAttribute(\n\t\t\t\t\t'data-kt-theme-switch-set',\n\t\t\t\t) as KTThemeSwitchModeType;\n\t\t\t\tthis._setMode(mode);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _toggle() {\n\t\tconst mode = this._currentMode === 'light' ? 'dark' : 'light';\n\n\t\tthis._setMode(mode);\n\t}\n\n\tprotected _setMode(mode: KTThemeSwitchModeType): void {\n\t\tif (!this._element) return;\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('change', payload);\n\t\tthis._dispatchEvent('change', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet currentMode: KTThemeSwitchModeType = mode;\n\t\tif (mode === 'system') {\n\t\t\tcurrentMode = this._getSystemMode();\n\t\t}\n\n\t\tthis._mode = mode;\n\t\tthis._currentMode = currentMode;\n\t\tthis._bindMode();\n\t\tthis._updateState();\n\t\tlocalStorage.setItem('kt-theme', this._mode);\n\t\tthis._element.setAttribute('data-kt-theme-switch-mode', mode);\n\n\t\tthis._fireEvent('changed', {});\n\t\tthis._dispatchEvent('changed', {});\n\t}\n\n\tprotected _getMode(): KTThemeSwitchModeType {\n\t\treturn (\n\t\t\t(localStorage.getItem('kt-theme') as KTThemeSwitchModeType) || this._mode\n\t\t);\n\t}\n\n\tprotected _getSystemMode(): KTThemeSwitchModeType {\n\t\treturn window.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t\t? 'dark'\n\t\t\t: 'light';\n\t}\n\n\tprotected _bindMode(): void {\n\t\tif (!this._currentMode || !this._element) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element.classList.remove('dark');\n\t\tthis._element.classList.remove('light');\n\t\tthis._element.removeAttribute(this._getOption('attribute') as string);\n\t\tthis._element.classList.add(this._currentMode);\n\t}\n\n\tprotected _updateState() {\n\t\tconst elements = document.querySelectorAll<HTMLInputElement>(\n\t\t\t'input[type=\"checkbox\"][data-kt-theme-switch-state]',\n\t\t);\n\t\telements.forEach((element) => {\n\t\t\tif (element.getAttribute('data-kt-theme-switch-state') === this._mode) {\n\t\t\t\telement.checked = true;\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic getMode(): KTThemeSwitchModeType {\n\t\treturn this._getMode();\n\t}\n\n\tpublic setMode(mode: KTThemeSwitchModeType) {\n\t\tthis.setMode(mode);\n\t}\n\n\tpublic static getInstance(): KTThemeSwitch {\n\t\tconst root = document.documentElement;\n\n\t\tif (KTData.has(root, 'theme-switch')) {\n\t\t\treturn KTData.get(root, 'theme-switch') as KTThemeSwitch;\n\t\t}\n\n\t\tif (root) {\n\t\t\treturn new KTThemeSwitch(root);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst root = document.documentElement;\n\t\tif (root) new KTThemeSwitch(root);\n\t}\n\n\tpublic static init(): void {\n\t\tKTThemeSwitch.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTThemeSwitch = KTThemeSwitch;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTTogglePassword } from './toggle-password';\nexport type {\n\tKTTogglePasswordConfigInterface,\n\tKTTogglePasswordInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport {\n\tKTTogglePasswordConfigInterface,\n\tKTTogglePasswordInterface,\n} from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKTTogglePassword: typeof KTTogglePassword;\n\t}\n}\n\nexport class KTTogglePassword\n\textends KTComponent\n\timplements KTTogglePasswordInterface\n{\n\tprotected override _name: string = 'toggle-password';\n\tprotected override _defaultConfig: KTTogglePasswordConfigInterface = {\n\t\tpermanent: false,\n\t};\n\tprotected override _config: KTTogglePasswordConfigInterface =\n\t\tthis._defaultConfig;\n\tprotected _triggerElement: HTMLElement;\n\tprotected _inputElement: HTMLInputElement;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTTogglePasswordConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._triggerElement = this._element.querySelector(\n\t\t\t'[data-kt-toggle-password-trigger]',\n\t\t);\n\t\tthis._inputElement = this._element.querySelector('input');\n\n\t\tif (!this._triggerElement || !this._inputElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._triggerElement.addEventListener('click', () => {\n\t\t\tthis._toggle();\n\t\t});\n\n\t\tthis._inputElement.addEventListener('input', () => {\n\t\t\tthis._update();\n\t\t});\n\t}\n\n\tprotected _toggle(): void {\n\t\tif (!this._element) return;\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isVisible()) {\n\t\t\tthis._element.classList.remove('active');\n\t\t\tthis._setVisible(false);\n\t\t} else {\n\t\t\tthis._element.classList.add('active');\n\t\t\tthis._setVisible(true);\n\t\t}\n\n\t\tthis._fireEvent('toggled');\n\t\tthis._dispatchEvent('toggled');\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._element) return;\n\n\t\tif ((this._getOption('permanent') as boolean) === false) {\n\t\t\tif (this._isVisible()) {\n\t\t\t\tthis._setVisible(false);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _isVisible(): boolean {\n\t\treturn this._inputElement.getAttribute('type') === 'text';\n\t}\n\n\tpublic _setVisible(flag: boolean) {\n\t\tif (flag) {\n\t\t\tthis._inputElement.setAttribute('type', 'text');\n\t\t} else {\n\t\t\tthis._inputElement.setAttribute('type', 'password');\n\t\t}\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic setVisible(flag: boolean): void {\n\t\tthis._setVisible(flag);\n\t}\n\n\tpublic isVisible(): boolean {\n\t\treturn this._isVisible();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTTogglePassword {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'toggle-password')) {\n\t\t\treturn KTData.get(element, 'toggle-password') as KTTogglePassword;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-toggle-password')) {\n\t\t\treturn new KTTogglePassword(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTTogglePasswordConfigInterface,\n\t): KTTogglePassword {\n\t\treturn this.getInstance(element) || new KTTogglePassword(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-toggle-password]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTTogglePassword(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTTogglePassword.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTTogglePassword = KTTogglePassword;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTToggle } from './toggle';\nexport type { KTToggleConfigInterface, KTToggleInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTToggleConfigInterface, KTToggleInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKTToggle: typeof KTToggle;\n\t}\n}\n\nexport class KTToggle extends KTComponent implements KTToggleInterface {\n\tprotected override _name: string = 'toggle';\n\tprotected override _defaultConfig: KTToggleConfigInterface = {\n\t\ttarget: '',\n\t\tactiveClass: 'active',\n\t\tclass: '',\n\t\tremoveClass: '',\n\t\tattribute: '',\n\t};\n\tprotected override _config: KTToggleConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTToggleConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.addEventListener('click', () => {\n\t\t\tthis._toggle();\n\t\t});\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-toggle') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _toggle(): void {\n\t\tif (!this._element) return;\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element.classList.toggle(this._getOption('activeClass') as string);\n\t\tthis._update();\n\n\t\tthis._fireEvent('toggled');\n\t\tthis._dispatchEvent('toggled');\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._targetElement) return;\n\n\t\tif (this._getOption('removeClass')) {\n\t\t\tKTDom.removeClass(\n\t\t\t\tthis._targetElement,\n\t\t\t\tthis._getOption('removeClass') as string,\n\t\t\t);\n\t\t}\n\n\t\tif (!this._isActive()) {\n\t\t\tif (this._getOption('class')) {\n\t\t\t\tKTDom.addClass(this._targetElement, this._getOption('class') as string);\n\t\t\t}\n\n\t\t\tif (this._getOption('attribute')) {\n\t\t\t\tthis._targetElement.setAttribute(\n\t\t\t\t\tthis._getOption('attribute') as string,\n\t\t\t\t\t'true',\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tif (this._getOption('class')) {\n\t\t\t\tKTDom.removeClass(\n\t\t\t\t\tthis._targetElement,\n\t\t\t\t\tthis._getOption('class') as string,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (this._getOption('attribute')) {\n\t\t\t\tthis._targetElement.removeAttribute(\n\t\t\t\t\tthis._getOption('attribute') as string,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _isActive(): boolean {\n\t\tif (!this._element) return false;\n\n\t\treturn (\n\t\t\tKTDom.hasClass(this._targetElement, this._getOption('class') as string) ||\n\t\t\tthis._targetElement.hasAttribute(this._getOption('attribute') as string)\n\t\t);\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic isActive(): boolean {\n\t\treturn this._isActive();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTToggle {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'toggle')) {\n\t\t\treturn KTData.get(element, 'toggle') as KTToggle;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-toggle')) {\n\t\t\treturn new KTToggle(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTToggleConfigInterface,\n\t): KTToggle {\n\t\treturn this.getInstance(element) || new KTToggle(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-toggle]');\n\t\telements.forEach((element) => {\n\t\t\tnew KTToggle(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTToggle.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTToggle = KTToggle;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nexport { KTTooltip } from './tooltip';\nexport type { KTTooltipConfigInterface, KTTooltipInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTTooltipInterface, KTTooltipConfigInterface } from './types';\nimport {\n\tcreatePopper,\n\tPositioningStrategy,\n\tInstance,\n\tPlacement,\n} from '@popperjs/core';\nimport { KTTooltipTriggerType } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_TOOLTIP_INITIALIZED: boolean;\n\t\tKTTooltip: typeof KTTooltip;\n\t}\n}\n\nexport class KTTooltip extends KTComponent implements KTTooltipInterface {\n\tprotected override _name: string = 'tooltip';\n\tprotected override _defaultConfig: KTTooltipConfigInterface = {\n\t\ttarget: '',\n\t\thiddenClass: 'hidden',\n\t\ttrigger: 'hover',\n\t\tplacement: 'top',\n\t\tplacementRtl: 'top',\n\t\tcontainer: '',\n\t\tstrategy: 'fixed',\n\t\toffset: '0, 5px',\n\t\toffsetRtl: '0, 5px',\n\t\tdelayShow: 0,\n\t\tdelayHide: 0,\n\t\tpermanent: false,\n\t\tzindex: '100',\n\t};\n\tprotected override _config: KTTooltipConfigInterface = this._defaultConfig;\n\tprotected _isOpen: boolean = false;\n\tprotected _targetElement: HTMLElement;\n\tprotected _popper!: Instance;\n\tprotected _transitioning: boolean = false;\n\tprotected _timeout!: ReturnType<typeof setTimeout>;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTTooltipConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-tooltip') as string,\n\t\t\t) ||\n\t\t\tthis._element.querySelector('[data-kt-tooltip-content]') ||\n\t\t\tKTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tif (this._getOption('trigger') === 'click') {\n\t\t\tthis._element.addEventListener('click', () => this._toggle());\n\t\t}\n\n\t\tif (this._getOption('trigger') === 'focus') {\n\t\t\tthis._element.addEventListener('focus', () => this._toggle());\n\t\t\tthis._element.addEventListener('blur', () => this._hide());\n\t\t}\n\n\t\tif (this._getOption('trigger') === 'hover') {\n\t\t\tthis._element.addEventListener('mouseenter', () => this._show());\n\t\t\tthis._element.addEventListener('mouseleave', () => this._hide());\n\t\t}\n\t}\n\n\tprotected _show(): void {\n\t\tif (this._timeout) {\n\t\t\tclearTimeout(this._timeout);\n\t\t}\n\n\t\tif (this._isOpen) return;\n\n\t\tthis._timeout = setTimeout(\n\t\t\t() => {\n\t\t\t\tconst payload = { cancel: false };\n\t\t\t\tthis._fireEvent('show', payload);\n\t\t\t\tthis._dispatchEvent('show', payload);\n\t\t\t\tif (payload.cancel === true) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!this._targetElement) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!this._element) return;\n\n\t\t\t\tthis._createPopper();\n\t\t\t\tthis._handleContainer();\n\t\t\t\tthis._setZindex();\n\n\t\t\t\tthis._targetElement.classList.add('show');\n\t\t\t\tthis._targetElement.classList.remove(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\t\t\t\tthis._targetElement.style.opacity = '0';\n\t\t\t\tKTDom.reflow(this._targetElement);\n\t\t\t\tthis._targetElement.style.opacity = '1';\n\t\t\t\tthis._transitioning = true;\n\t\t\t\tthis._isOpen = true;\n\n\t\t\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\t\t\tthis._targetElement.style.opacity = '';\n\t\t\t\t\tthis._transitioning = false;\n\t\t\t\t\tthis._fireEvent('shown');\n\t\t\t\t\tthis._dispatchEvent('shown');\n\t\t\t\t});\n\t\t\t},\n\t\t\tthis._getOption('delayShow') as number,\n\t\t);\n\t}\n\n\tprotected _hide(): void {\n\t\tif (this._timeout) {\n\t\t\tclearTimeout(this._timeout);\n\t\t}\n\n\t\tif (!this._isOpen) return;\n\n\t\tthis._timeout = setTimeout(\n\t\t\t() => {\n\t\t\t\tconst payload = { cancel: false };\n\t\t\t\tthis._fireEvent('hide', payload);\n\t\t\t\tthis._dispatchEvent('hide', payload);\n\t\t\t\tif (payload.cancel === true) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!this._targetElement) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis._targetElement.style.opacity = '1';\n\t\t\t\tKTDom.reflow(this._targetElement);\n\t\t\t\tthis._targetElement.style.opacity = '0';\n\t\t\t\tthis._transitioning = true;\n\t\t\t\tthis._isOpen = false;\n\n\t\t\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\t\t\tthis._popper.destroy();\n\t\t\t\t\tthis._targetElement.classList.remove('show');\n\t\t\t\t\tthis._targetElement.classList.add(\n\t\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t\t);\n\t\t\t\t\tthis._targetElement.style.opacity = '';\n\t\t\t\t\tthis._transitioning = false;\n\t\t\t\t\tthis._fireEvent('hidden');\n\t\t\t\t\tthis._dispatchEvent('hidden');\n\t\t\t\t});\n\t\t\t},\n\t\t\tthis._getOption('delayHide') as number,\n\t\t);\n\t}\n\n\tprotected _toggle(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show();\n\t\t}\n\t}\n\n\tprotected _createPopper(): void {\n\t\tif (!this._element) return;\n\n\t\tconst isRtl = KTDom.isRTL();\n\n\t\t// Placement\n\t\tlet placement = this._getOption('placement') as Placement;\n\t\tif (isRtl && this._getOption('placementRtl')) {\n\t\t\tplacement = this._getOption('placementRtl') as Placement;\n\t\t}\n\n\t\t// Offset\n\t\tlet offsetValue = this._getOption('offset');\n\t\tif (isRtl && this._getOption('offsetRtl')) {\n\t\t\toffsetValue = this._getOption('offsetRtl') as Placement;\n\t\t}\n\t\tconst offset = offsetValue\n\t\t\t? offsetValue\n\t\t\t\t\t.toString()\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.map((value) => parseInt(value.trim(), 10))\n\t\t\t: [0, 0];\n\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._popper = createPopper(this._element, this._targetElement, {\n\t\t\tplacement: placement,\n\t\t\tstrategy: this._getOption('strategy') as PositioningStrategy,\n\t\t\tmodifiers: [\n\t\t\t\t{\n\t\t\t\t\tname: 'offset',\n\t\t\t\t\toptions: {\n\t\t\t\t\t\toffset,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\n\tprotected _handleContainer(): void {\n\t\tif (this._getOption('container')) {\n\t\t\tif (this._getOption('container') === 'body') {\n\t\t\t\tdocument.body.appendChild(this._targetElement);\n\t\t\t} else {\n\t\t\t\tdocument\n\t\t\t\t\t.querySelector(this._getOption('container') as string)\n\t\t\t\t\t?.appendChild(this._targetElement);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _setZindex(): void {\n\t\tlet zindex: number = parseInt(this._getOption('zindex') as string);\n\n\t\tif (parseInt(KTDom.getCssProp(this._element, 'z-index')) > zindex) {\n\t\t\tzindex = parseInt(KTDom.getCssProp(this._element, 'z-index'));\n\t\t}\n\n\t\tif (KTDom.getHighestZindex(this._element) > zindex) {\n\t\t\tzindex = KTDom.getHighestZindex(this._element) + 1;\n\t\t}\n\n\t\tthis._targetElement.style.zIndex = String(zindex);\n\t}\n\n\tpublic show(): void {\n\t\tthis._show();\n\t}\n\n\tpublic hide(): void {\n\t\tthis._hide();\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic getContentElement(): HTMLElement | null {\n\t\treturn this._targetElement;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\tpublic getTriggerOption(): KTTooltipTriggerType {\n\t\treturn this._getOption('trigger') as KTTooltipTriggerType;\n\t}\n\n\tpublic isPermanent(): boolean {\n\t\treturn this._getOption('permanent') as boolean;\n\t}\n\n\tpublic static initHandlers(): void {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tdocument\n\t\t\t\t.querySelectorAll('[data-kt-tooltip-initialized]')\n\t\t\t\t.forEach((tooltipElement) => {\n\t\t\t\t\tconst tooltip = KTTooltip.getInstance(tooltipElement as HTMLElement);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\ttooltip &&\n\t\t\t\t\t\ttooltip.isOpen() &&\n\t\t\t\t\t\ttooltip.getTriggerOption() !== 'hover' &&\n\t\t\t\t\t\t!tooltip.isPermanent()\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst contentElement = tooltip.getContentElement();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcontentElement &&\n\t\t\t\t\t\t\t(contentElement === event.target ||\n\t\t\t\t\t\t\t\tcontentElement.contains(event.target as HTMLElement))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttooltip.hide();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTTooltip {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'tooltip')) {\n\t\t\treturn KTData.get(element, 'tooltip') as KTTooltip;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-tooltip')) {\n\t\t\treturn new KTTooltip(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTTooltipConfigInterface,\n\t): KTTooltip {\n\t\treturn this.getInstance(element) || new KTTooltip(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tdocument.querySelectorAll('[data-kt-tooltip]').forEach((element) => {\n\t\t\tnew KTTooltip(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTTooltip.createInstances();\n\n\t\tif (window.KT_TOOLTIP_INITIALIZED !== true) {\n\t\t\tKTTooltip.initHandlers();\n\t\t\twindow.KT_TOOLTIP_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTTooltip = KTTooltip;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nconst KTElementMap = new Map();\n\nconst KTData = {\n\tset(element: HTMLElement, key: string, value: unknown): void {\n\t\tif (!KTElementMap.has(element)) {\n\t\t\tKTElementMap.set(element, new Map());\n\t\t}\n\n\t\tconst valueMap = KTElementMap.get(element);\n\n\t\tvalueMap.set(key, value);\n\t},\n\n\tget(element: HTMLElement, key: string): unknown {\n\t\tif (KTElementMap.has(element)) {\n\t\t\treturn KTElementMap.get(element).get(key) || null;\n\t\t}\n\n\t\treturn null;\n\t},\n\n\thas(element: HTMLElement, key: string): boolean {\n\t\treturn KTElementMap.has(element) && KTElementMap.get(element).has(key);\n\t},\n\n\tremove(element: HTMLElement, key: string): void {\n\t\tif (!KTElementMap.has(element) || !KTElementMap.get(element).has(key)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst valueMap = KTElementMap.get(element);\n\n\t\tvalueMap.delete(key);\n\n\t\tif (valueMap.size === 0) {\n\t\t\tKTElementMap.delete(element);\n\t\t}\n\t},\n};\n\nexport default KTData;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\n/* eslint-disable max-len */\nimport KTUtils from './utils';\nimport { KTOffsetType, KTOptionType, KTViewPortType } from '../types';\n\nconst KTDom = {\n\tisRTL(): boolean {\n\t\tconst htmlTag = document.documentElement; // Access the <html> tag\n\n\t\t// Check if the \"dir\" attribute is present and its value is \"rtl\"\n\t\tconst dir = htmlTag.getAttribute('dir');\n\n\t\treturn dir === 'rtl';\n\t},\n\n\tisElement(element: HTMLElement): boolean {\n\t\tif (element && element instanceof HTMLElement) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n\n\tgetElement(element: HTMLElement | string): HTMLElement {\n\t\tif (this.isElement(element)) {\n\t\t\treturn element as HTMLElement;\n\t\t}\n\n\t\tif (element && (element as string).length > 0) {\n\t\t\treturn document.querySelector(KTUtils.parseSelector(element as string));\n\t\t}\n\n\t\treturn null;\n\t},\n\n\tremove(element: HTMLElement): void {\n\t\tif (this.isElement(element) && element.parentNode) {\n\t\t\telement.parentNode.removeChild(element);\n\t\t}\n\t},\n\n\thasClass(element: HTMLElement, className: string): boolean {\n\t\t// Split classNames string into an array of individual class names\n\t\tconst classes = className.split(' ');\n\n\t\t// Loop through each class name\n\t\tfor (const className of classes) {\n\t\t\t// Check if the element has the current class name\n\t\t\tif (!element.classList.contains(className)) {\n\t\t\t\t// Return false if any class is missing\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Return true if all classes are present\n\t\treturn true;\n\t},\n\n\taddClass(element: HTMLElement, className: string): void {\n\t\tconst classNames = className.split(' ');\n\n\t\tif (element.classList) {\n\t\t\tfor (let i = 0; i < classNames.length; i++) {\n\t\t\t\tif (classNames[i] && classNames[i].length > 0) {\n\t\t\t\t\telement.classList.add(classNames[i].trim());\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!this.hasClass(element, className)) {\n\t\t\tfor (let x = 0; x < classNames.length; x++) {\n\t\t\t\telement.className += ' ' + classNames[x].trim();\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveClass(element: HTMLElement, className: string): void {\n\t\tconst classNames = className.split(' ');\n\n\t\tif (element.classList) {\n\t\t\tfor (let i = 0; i < classNames.length; i++) {\n\t\t\t\telement.classList.remove(classNames[i].trim());\n\t\t\t}\n\t\t} else if (this.hasClass(element, className)) {\n\t\t\tfor (let x = 0; x < classNames.length; x++) {\n\t\t\t\telement.className = element.className.replace(\n\t\t\t\t\tnew RegExp('\\\\b' + classNames[x].trim() + '\\\\b', 'g'),\n\t\t\t\t\t'',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\tgetCssProp(element: HTMLElement, prop: string): string {\n\t\treturn (\n\t\t\telement ? window.getComputedStyle(element).getPropertyValue(prop) : ''\n\t\t).replace(' ', '');\n\t},\n\n\tsetCssProp(element: HTMLElement, prop: string, value: string) {\n\t\tif (element) {\n\t\t\twindow.getComputedStyle(element).setProperty(prop, value);\n\t\t}\n\t},\n\n\toffset(element: HTMLElement): KTOffsetType {\n\t\tif (!element) return { top: 0, left: 0, right: 0, bottom: 0 };\n\n\t\tconst rect = element.getBoundingClientRect();\n\n\t\treturn {\n\t\t\ttop: rect.top,\n\t\t\tleft: rect.left,\n\t\t\tright: window.innerWidth - rect.right,\n\t\t\tbottom: window.innerHeight - rect.top,\n\t\t};\n\t},\n\n\tgetIndex(element: HTMLElement): number {\n\t\tconst children = Array.from(element.parentNode?.children || []);\n\t\treturn children.indexOf(element);\n\t},\n\n\tparents(element: HTMLElement, selector: string): Array<HTMLElement> {\n\t\tconst parents: Array<HTMLElement> = [];\n\n\t\t// Push each parent element to the array\n\t\tfor (\n\t\t\telement && element !== document.documentElement;\n\t\t\t(element = element.parentElement as HTMLElement);\n\n\t\t) {\n\t\t\tif (selector) {\n\t\t\t\tif (element.matches(selector)) {\n\t\t\t\t\tparents.push(element as HTMLElement);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tparents.push(element as HTMLElement);\n\t\t}\n\n\t\t// Return our parent array\n\t\treturn parents;\n\t},\n\n\tsiblings(element: HTMLElement) {\n\t\tconst parent = element.parentNode;\n\t\tif (!parent) return [];\n\t\treturn Array.from(parent.children).filter((child) => child !== element);\n\t},\n\n\tchildren(element: HTMLElement, selector: string): Array<HTMLElement> {\n\t\tif (!element || !element.childNodes) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst result: Array<HTMLElement> = [];\n\t\tconst l = element.childNodes.length;\n\t\tlet i = 0;\n\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tif (\n\t\t\t\telement.childNodes[i].nodeType == 1 &&\n\t\t\t\t(element.childNodes[i] as HTMLElement).matches(selector)\n\t\t\t) {\n\t\t\t\tresult.push(element.childNodes[i] as HTMLElement);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tchild(element: HTMLElement, selector: string): HTMLElement {\n\t\tconst children = KTDom.children(element, selector);\n\n\t\treturn children ? children[0] : null;\n\t},\n\n\tisVisible(element: HTMLElement): boolean {\n\t\tif (!this.isElement(element) || element.getClientRects().length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line max-len\n\t\treturn (\n\t\t\tgetComputedStyle(element).getPropertyValue('visibility') === 'visible'\n\t\t);\n\t},\n\n\tisDisabled(\n\t\telement: HTMLInputElement | HTMLSelectElement | HTMLButtonElement,\n\t): boolean {\n\t\tif (!element || element.nodeType !== Node.ELEMENT_NODE) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (element.classList.contains('disabled')) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (typeof element.disabled !== 'undefined') {\n\t\t\treturn element.disabled;\n\t\t}\n\n\t\treturn (\n\t\t\telement.hasAttribute('disabled') &&\n\t\t\telement.getAttribute('disabled') !== 'false'\n\t\t);\n\t},\n\n\ttransitionEnd(element: HTMLElement, callback: CallableFunction): void {\n\t\tconst duration: number = this.getCSSTransitionDuration(element);\n\n\t\tsetTimeout(() => {\n\t\t\tcallback();\n\t\t}, duration);\n\t},\n\n\tanimationEnd(element: HTMLElement, callback: CallableFunction): void {\n\t\tconst duration: number = this.getCSSAnimationDuration(element);\n\n\t\tsetTimeout(() => {\n\t\t\tcallback();\n\t\t}, duration);\n\t},\n\n\tgetCSSTransitionDuration(element: HTMLElement): number {\n\t\treturn (\n\t\t\tparseFloat(window.getComputedStyle(element).transitionDuration) * 1000\n\t\t);\n\t},\n\n\tgetCSSAnimationDuration(element: HTMLElement): number {\n\t\treturn (\n\t\t\tparseFloat(window.getComputedStyle(element).animationDuration) * 1000\n\t\t);\n\t},\n\n\treflow(element: HTMLElement): void {\n\t\telement.offsetHeight;\n\t},\n\n\tinsertAfter(element: HTMLElement, referenceNode: HTMLElement) {\n\t\tconst parentNode = referenceNode.parentNode;\n\t\tif (parentNode) {\n\t\t\tparentNode.insertBefore(element, referenceNode.nextSibling);\n\t\t}\n\t},\n\n\tgetHighestZindex(element: HTMLElement): number {\n\t\tlet position: string, value: number;\n\n\t\twhile (element && element !== document.documentElement) {\n\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\tposition = element.style.position;\n\n\t\t\tif (\n\t\t\t\tposition === 'absolute' ||\n\t\t\t\tposition === 'relative' ||\n\t\t\t\tposition === 'fixed'\n\t\t\t) {\n\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t// other browsers return a string\n\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\t\tvalue = parseInt(element.style.zIndex);\n\n\t\t\t\tif (!isNaN(value) && value !== 0) {\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telement = element.parentNode as HTMLElement;\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\tisParentOrElementHidden(element: HTMLElement): boolean {\n\t\tif (!element) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst computedStyle = window.getComputedStyle(element);\n\n\t\tif (computedStyle.display === 'none') {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn this.isParentOrElementHidden(element.parentElement);\n\t},\n\n\tgetViewPort(): KTViewPortType {\n\t\treturn {\n\t\t\twidth: window.innerWidth,\n\t\t\theight: window.innerHeight,\n\t\t};\n\t},\n\n\tgetScrollTop() {\n\t\treturn (document.scrollingElement || document.documentElement).scrollTop;\n\t},\n\n\tisInViewport(element: HTMLElement): boolean {\n\t\tconst rect = element.getBoundingClientRect();\n\n\t\treturn (\n\t\t\trect.top >= 0 &&\n\t\t\trect.left >= 0 &&\n\t\t\trect.bottom <=\n\t\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t\t);\n\t},\n\n\tisPartiallyInViewport(element: HTMLElement): boolean {\n\t\tconst x = element.getBoundingClientRect().left;\n\t\tconst y = element.getBoundingClientRect().top;\n\t\tconst ww = Math.max(\n\t\t\tdocument.documentElement.clientWidth,\n\t\t\twindow.innerWidth || 0,\n\t\t);\n\t\tconst hw = Math.max(\n\t\t\tdocument.documentElement.clientHeight,\n\t\t\twindow.innerHeight || 0,\n\t\t);\n\t\tconst w = element.clientWidth;\n\t\tconst h = element.clientHeight;\n\n\t\treturn y < hw && y + h > 0 && x < ww && x + w > 0;\n\t},\n\n\tisVisibleInParent(child: HTMLElement, parent: HTMLElement): boolean {\n\t\tconst childRect = child.getBoundingClientRect();\n\t\tconst parentRect = parent.getBoundingClientRect();\n\n\t\t// Check if the child element is visible\n\t\tif (\n\t\t\tchild.offsetParent === null ||\n\t\t\tgetComputedStyle(child).visibility === 'hidden' ||\n\t\t\tgetComputedStyle(child).display === 'none'\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if the child is within the vertical bounds of the parent\n\t\tconst isVisibleVertically =\n\t\t\tchildRect.top >= parentRect.top && childRect.bottom <= parentRect.bottom;\n\n\t\t// Check if the child is within the horizontal bounds of the parent\n\t\tconst isVisibleHorizontally =\n\t\t\tchildRect.left >= parentRect.left && childRect.right <= parentRect.right;\n\n\t\treturn isVisibleVertically && isVisibleHorizontally;\n\t},\n\n\tgetRelativeTopPosition(child: HTMLElement, parent: HTMLElement): number {\n\t\tconst childRect = child.getBoundingClientRect();\n\t\tconst parentRect = parent.getBoundingClientRect();\n\n\t\t// Calculate the relative top position\n\t\tconst relativeTop = childRect.top - parentRect.top;\n\n\t\treturn relativeTop;\n\t},\n\n\tgetDataAttributes(element: HTMLElement, prefix: string): object {\n\t\tif (!element) {\n\t\t\treturn {};\n\t\t}\n\n\t\tprefix = KTUtils.camelCase(prefix);\n\n\t\tconst attributes: { [key: string]: KTOptionType } = {};\n\t\tconst keys = Object.keys(element.dataset).filter((key) =>\n\t\t\tkey.startsWith(prefix),\n\t\t);\n\n\t\tfor (const key of keys) {\n\t\t\tlet normalizedKey = key.replace(prefix, '');\n\t\t\tnormalizedKey = KTUtils.uncapitalize(normalizedKey);\n\t\t\tattributes[normalizedKey] = KTUtils.parseDataAttribute(\n\t\t\t\telement.dataset[key],\n\t\t\t);\n\t\t}\n\n\t\treturn attributes;\n\t},\n\n\tready(callback: CallableFunction): void {\n\t\tif (document.readyState === 'loading') {\n\t\t\tdocument.addEventListener('DOMContentLoaded', () => {\n\t\t\t\tcallback();\n\t\t\t});\n\t\t} else {\n\t\t\tcallback();\n\t\t}\n\t},\n};\n\nexport default KTDom;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { KTCallableType } from '../types';\nimport KTUtils from './utils';\n\nexport interface KTDelegatedEventHandlersInterface {\n\t[key: string]: KTCallableType;\n}\n\nconst KTDelegatedEventHandlers: KTDelegatedEventHandlersInterface = {};\n\nconst KTEventHandler = {\n\ton: function (\n\t\telement: HTMLElement,\n\t\tselector: string,\n\t\teventName: string,\n\t\thandler: KTCallableType,\n\t): string {\n\t\tif (element === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst eventId = KTUtils.geUID('event');\n\n\t\tKTDelegatedEventHandlers[eventId] = (\n\t\t\tevent: Event & { target: HTMLElement },\n\t\t) => {\n\t\t\tconst targets = element.querySelectorAll(selector);\n\t\t\tlet target = event.target;\n\n\t\t\twhile (target && target !== element) {\n\t\t\t\tfor (let i = 0, j = targets.length; i < j; i++) {\n\t\t\t\t\tif (target === targets[i]) {\n\t\t\t\t\t\thandler.call(this, event, target);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttarget = target.parentNode as HTMLElement;\n\t\t\t}\n\t\t};\n\n\t\telement.addEventListener(eventName, KTDelegatedEventHandlers[eventId]);\n\n\t\treturn eventId;\n\t},\n\n\toff(element: HTMLElement, eventName: string, eventId: string) {\n\t\tif (!element || KTDelegatedEventHandlers[eventId] === null) {\n\t\t\treturn;\n\t\t}\n\n\t\telement.removeEventListener(eventName, KTDelegatedEventHandlers[eventId]);\n\n\t\tdelete KTDelegatedEventHandlers[eventId];\n\t},\n};\n\nexport default KTEventHandler;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport { KTOptionType } from '../types';\n\nconst KTUtils = {\n\tgeUID(prefix: string = ''): string {\n\t\treturn prefix + Math.floor(Math.random() * new Date().getTime());\n\t},\n\n\tgetCssVar(variable: string): string {\n\t\tlet hex = getComputedStyle(document.documentElement).getPropertyValue(\n\t\t\tvariable,\n\t\t);\n\n\t\tif (hex && hex.length > 0) {\n\t\t\thex = hex.trim();\n\t\t}\n\n\t\treturn hex;\n\t},\n\n\tparseDataAttribute(value: string): KTOptionType {\n\t\tif (value === 'true') {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (value === 'false') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (value === Number(value).toString()) {\n\t\t\treturn Number(value);\n\t\t}\n\n\t\tif (value === '' || value === 'null') {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (typeof value !== 'string') {\n\t\t\treturn value;\n\t\t}\n\n\t\ttry {\n\t\t\treturn KTUtils.parseJson(value) as object;\n\t\t} catch {\n\t\t\treturn value;\n\t\t}\n\t},\n\n\tparseJson(value: string): JSON {\n\t\treturn value && value.length > 0\n\t\t\t? JSON.parse(decodeURIComponent(value))\n\t\t\t: null;\n\t},\n\n\tparseSelector(selector: string): string {\n\t\tif (selector && window.CSS && window.CSS.escape) {\n\t\t\t// Escape any IDs in the selector using CSS.escape\n\t\t\tselector = selector.replace(\n\t\t\t\t/#([^\\s\"#']+)/g,\n\t\t\t\t(match, id) => `#${window.CSS.escape(id)}`,\n\t\t\t);\n\t\t}\n\n\t\treturn selector;\n\t},\n\n\tcapitalize(value: string): string {\n\t\treturn value.charAt(0).toUpperCase() + value.slice(1);\n\t},\n\n\tuncapitalize(value: string): string {\n\t\treturn value.charAt(0).toLowerCase() + value.slice(1);\n\t},\n\n\tcamelCase(value: string): string {\n\t\treturn value.replace(/-([a-z])/g, (match, letter) => {\n\t\t\treturn letter.toUpperCase();\n\t\t});\n\t},\n\n\tcamelReverseCase(str: string): string {\n\t\treturn str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\t},\n\n\tisRTL(): boolean {\n\t\tconst htmlElement = document.querySelector('html');\n\t\treturn Boolean(\n\t\t\thtmlElement && htmlElement.getAttribute('direction') === 'rtl',\n\t\t);\n\t},\n\n\tthrottle(\n\t\ttimer: undefined | ReturnType<typeof setTimeout>,\n\t\tfunc: CallableFunction,\n\t\tdelay: number,\n\t): void {\n\t\t// If setTimeout is already scheduled, no need to do anything\n\t\tif (timer) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Schedule a setTimeout after delay seconds\n\t\ttimer = setTimeout(() => {\n\t\t\tfunc();\n\n\t\t\t// Once setTimeout function execution is finished, timerId = undefined so that in <br>\n\t\t\t// the next scroll event function execution can be scheduled by the setTimeout\n\t\t\tclearTimeout(timer);\n\t\t}, delay);\n\t},\n\n\tchecksum(value: string): string {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\thash = ((hash << 5) - hash + value.charCodeAt(i)) | 0;\n\t\t}\n\n\t\treturn ('0000000' + (hash >>> 0).toString(16)).slice(-8);\n\t},\n\n\tstringToBoolean: (value: KTOptionType): boolean | null => {\n\t\tif (typeof value === 'boolean') return value;\n\t\tif (typeof value !== 'string') return null;\n\n\t\tconst cleanedStr = value.toLowerCase().trim();\n\t\tif (cleanedStr === 'true') return true;\n\t\tif (cleanedStr === 'false') return false;\n\t\treturn null;\n\t},\n\n\tstringToObject: <T>(value: KTOptionType): T | null => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(value.toString() as string);\n\t\t\tif (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n\t\t\t\treturn parsed as T;\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\tstringToInteger: (value: KTOptionType | number): number | null => {\n\t\t// If already a number, return it as an integer\n\t\tif (typeof value === 'number' && !isNaN(value)) {\n\t\t\treturn Math.floor(value);\n\t\t}\n\n\t\t// If not a string, return null\n\t\tif (typeof value !== 'string') return null;\n\n\t\tconst cleanedStr = value.trim();\n\t\tconst num = parseInt(cleanedStr, 10);\n\t\tif (!isNaN(num) && cleanedStr !== '') {\n\t\t\treturn num;\n\t\t}\n\t\treturn null;\n\t},\n\n\tstringToFloat: (value: KTOptionType | number): number | null => {\n\t\t// If already a number, return it as is\n\t\tif (typeof value === 'number' && !isNaN(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// If not a string, return null\n\t\tif (typeof value !== 'string') return null;\n\n\t\tconst cleanedStr = value.trim();\n\t\tconst num = parseFloat(cleanedStr);\n\t\tif (!isNaN(num) && cleanedStr !== '') {\n\t\t\treturn num;\n\t\t}\n\t\treturn null;\n\t},\n};\n\nexport default KTUtils;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n * @version: 1.0.0\n */\nimport KTDom from './helpers/dom';\nimport KTUtils from './helpers/utils';\nimport KTEventHandler from './helpers/event-handler';\nimport { KTDropdown } from './components/dropdown';\nimport { KTModal } from './components/modal';\nimport { KTDrawer } from './components/drawer';\nimport { KTCollapse } from './components/collapse';\nimport { KTDismiss } from './components/dismiss';\nimport { KTTabs } from './components/tabs';\nimport { KTAccordion } from './components/accordion';\nimport { KTScrollspy } from './components/scrollspy';\nimport { KTScrollable } from './components/scrollable';\nimport { KTScrollto } from './components/scrollto';\nimport { KTSticky } from './components/sticky';\nimport { KTReparent } from './components/reparent';\nimport { KTToggle } from './components/toggle';\nimport { KTTooltip } from './components/tooltip';\nimport { KTStepper } from './components/stepper';\nimport { KTThemeSwitch } from './components/theme-switch';\nimport { KTImageInput } from './components/image-input';\nimport { KTTogglePassword } from './components/toggle-password';\nimport { KTDataTable } from './components/datatable';\nimport { KTDatepicker } from './components/datepicker';\nimport { KTSelect } from './components/select';\n\nexport { KTDropdown } from './components/dropdown';\nexport { KTModal } from './components/modal';\nexport { KTDrawer } from './components/drawer';\nexport { KTCollapse } from './components/collapse';\nexport { KTDismiss } from './components/dismiss';\nexport { KTTabs } from './components/tabs';\nexport { KTAccordion } from './components/accordion';\nexport { KTScrollspy } from './components/scrollspy';\nexport { KTScrollable } from './components/scrollable';\nexport { KTScrollto } from './components/scrollto';\nexport { KTSticky } from './components/sticky';\nexport { KTReparent } from './components/reparent';\nexport { KTToggle } from './components/toggle';\nexport { KTTooltip } from './components/tooltip';\nexport { KTStepper } from './components/stepper';\nexport { KTThemeSwitch } from './components/theme-switch';\nexport { KTImageInput } from './components/image-input';\nexport { KTTogglePassword } from './components/toggle-password';\nexport { KTDataTable } from './components/datatable';\nexport { KTDatepicker } from './components/datepicker';\nexport { KTSelect } from './components/select';\n\nconst KTComponents = {\n\tinit(): void {\n\t\tKTDropdown.init();\n\t\tKTModal.init();\n\t\tKTDrawer.init();\n\t\tKTCollapse.init();\n\t\tKTDismiss.init();\n\t\tKTTabs.init();\n\t\tKTAccordion.init();\n\t\tKTScrollspy.init();\n\t\tKTScrollable.init();\n\t\tKTScrollto.init();\n\t\tKTSticky.init();\n\t\tKTReparent.init();\n\t\tKTToggle.init();\n\t\tKTTooltip.init();\n\t\tKTStepper.init();\n\t\tKTThemeSwitch.init();\n\t\tKTImageInput.init();\n\t\tKTTogglePassword.init();\n\t\tKTDataTable.init();\n\t\tKTDatepicker.init();\n\t\tKTSelect.init();\n\t},\n};\n\ndeclare global {\n\tinterface Window {\n\t\tKTUtils: typeof KTUtils;\n\t\tKTDom: typeof KTDom;\n\t\tKTEventHandler: typeof KTEventHandler;\n\t\tKTDropdown: typeof KTDropdown;\n\t\tKTModal: typeof KTModal;\n\t\tKTDrawer: typeof KTDrawer;\n\t\tKTCollapse: typeof KTCollapse;\n\t\tKTDismiss: typeof KTDismiss;\n\t\tKTTabs: typeof KTTabs;\n\t\tKTAccordion: typeof KTAccordion;\n\t\tKTScrollspy: typeof KTScrollspy;\n\t\tKTScrollable: typeof KTScrollable;\n\t\tKTScrollto: typeof KTScrollto;\n\t\tKTSticky: typeof KTSticky;\n\t\tKTReparent: typeof KTReparent;\n\t\tKTToggle: typeof KTToggle;\n\t\tKTTooltip: typeof KTTooltip;\n\t\tKTStepper: typeof KTStepper;\n\t\tKTThemeSwitch: typeof KTThemeSwitch;\n\t\tKTImageInput: typeof KTImageInput;\n\t\tKTTogglePassword: typeof KTTogglePassword;\n\t\tKTDataTable: typeof KTDataTable;\n\t\tKTDatepicker: typeof KTDatepicker;\n\t\tKTSelect: typeof KTSelect;\n\t\tKTComponents: typeof KTComponents;\n\t}\n}\n\nexport default KTComponents;\n\nKTDom.ready(() => {\n\tKTComponents.init();\n});\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/index.ts\");\n"],"names":["root","factory","exports","module","define","amd","a","i","self","DEFAULT_OPTIONS","placement","modifiers","strategy","areValidElements","_len","arguments","length","args","Array","_key","some","element","getBoundingClientRect","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","reference","popper","options","state","orderedModifiers","Object","assign","modifiersData","elements","attributes","styles","effectCleanupFns","isDestroyed","instance","setOptions","setOptionsAction","cleanupModifierEffects","scrollParents","isElement","contextElement","concat","filter","m","enabled","forEach","_ref","name","_ref$options","effect","cleanupFn","noopFn","push","update","forceUpdate","_state$elements","rects","reset","modifier","data","index","_state$orderedModifie","fn","_state$orderedModifie2","_options","Promise","resolve","destroy","then","onFirstUpdate","createPopper","contains","parent","child","rootNode","getRootNode","isShadowRoot","next","isSameNode","parentNode","host","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","isHTMLElement","offsetWidth","round","width","offsetHeight","height","visualViewport","window","addVisualOffsets","x","left","offsetLeft","y","top","offsetTop","right","bottom","getClientRectFromMixedType","clippingParent","viewport","rect","clientTop","clientLeft","clientHeight","clientWidth","getInnerBoundingClientRect","getClippingRect","boundary","rootBoundary","mainClippingParents","clippingParents","clipperElement","indexOf","position","getClippingParents","firstClippingParent","clippingRect","reduce","accRect","max","min","getCompositeRect","elementOrVirtualElement","offsetParent","isFixed","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","documentElement","scroll","scrollLeft","scrollTop","offsets","getComputedStyle","getDocumentElement","ownerDocument","document","getDocumentRect","_element$ownerDocumen","html","winScroll","body","scrollWidth","scrollHeight","direction","getHTMLElementScroll","getLayoutRect","Math","abs","getNodeName","nodeName","toLowerCase","getNodeScroll","node","getTrueOffsetParent","getOffsetParent","isFirefox","test","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getParentNode","assignedSlot","getScrollParent","getViewportRect","win","layoutViewport","getWindow","toString","defaultView","getWindowScroll","pageXOffset","pageYOffset","getWindowScrollBarX","Element","HTMLElement","ShadowRoot","isLayoutViewport","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","isTableElement","listScrollParents","list","scrollParent","isBody","target","updatedList","auto","basePlacements","start","end","variationPlacements","acc","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","phase","keys","style","value","removeAttribute","setAttribute","_ref2","initialStyles","margin","arrow","hasOwnProperty","property","attribute","requires","_state$modifiersData$","arrowElement","popperOffsets","basePlacement","axis","len","paddingObject","padding","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","center","offset","within","axisProp","centerOffset","_options$element","querySelector","requiresIfExists","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","gpuAcceleration","adaptive","roundOffsets","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","_options$scroll","_options$resize","resize","addEventListener","removeEventListener","_skip","_options$mainAxis","mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","altBoundary","_options$flipVariatio","flipVariations","allowedAutoPlacements","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","Map","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","set","_loop","_i","fittingPlacement","find","get","slice","getSideOffsets","preventedOffsets","isAnySideFullyClipped","side","preventOverflow","referenceOverflow","elementContext","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","distanceAndSkiddingToXY","invertDistance","skidding","distance","_options$offset","_data$state$placement","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMin","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","withinMaxClamp","computeAutoPlacement","_options$allowedAutoP","allowedPlacements","overflows","sort","b","computeOffsets","commonX","commonY","debounce","pending","undefined","detectOverflow","_options$placement","_options$strategy","_options$boundary","_options$rootBoundary","_options$elementConte","_options$altBoundary","_options$padding","altContext","clippingClientRect","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","key","multiply","expandToHashMap","hashMap","getAltAxis","getBasePlacement","split","getFreshSideObject","getMainAxisFromPlacement","hash","getOppositePlacement","replace","matched","getOppositeVariationPlacement","getVariation","mergeByName","merged","current","existing","map","mergePaddingObject","order","visited","Set","result","add","dep","has","depModifier","orderModifiers","rectToClientRect","getUAString","uaData","navigator","userAgentData","brands","isArray","item","brand","version","join","userAgent","v","config","_name","_defaultConfig","hiddenClass","activeClass","expandAll","_config","_init","_buildConfig","_handlers","on","this","_element","event","preventDefault","accordionElement","closest","_toggle","payload","cancel","_fireEvent","_dispatchEvent","classList","_hide","_show","hasAttribute","_getOption","toggleElement","contentElement","getElement","getAttribute","_hideSiblings","remove","reflow","transitionEnd","siblings","sibling","show","hide","toggle","getInstance","KTAccordion","getOrCreateInstance","createInstances","querySelectorAll","init","_isAnimating","_targetElement","_getTargetElement","_isOpen","_expand","_collapse","expand","collapse","isOpen","KTCollapse","_dataOptionPrefix","_uid","_events","geUID","eventType","callable","CustomEvent","detail","bubbles","cancelable","composed","dispatchEvent","getCssProp","camelReverseCase","_getGlobalConfig","KTGlobalComponentsConfig","getDataAttributes","dispose","callback","eventId","off","delete","getOption","fireEvent","headerChecked","headerCheckElement","targetElements","preserveSelection","checkbox","getSelectedRows","_state","selectedRows","String","setSelectedRows","rows","from","checkboxListener","checkboxToggle","checked","isChecked","change","el","includes","updateHeaderCheckboxState","reapplyCheckedStates","row","checkedClass","total","indeterminate","input","handleRowCheckboxChange","uncheck","getChecked","updateState","theadElement","getState","setState","updateData","toggleSortOrder","currentField","currentOrder","newField","setSortIcon","sortField","sortOrder","sortClass","classes","asc","desc","th","sortElement","base","className","trim","initSort","header","cellIndex","field","sortData","aText","bText","compareValues","_originalTbodyClass","_originalTrClasses","_originalTheadClass","_originalTdClasses","_originalThClasses","_data","_initDefaultConfig","_initElements","_checkbox","createCheckboxHandler","eventName","eventData","_sortHandler","createSortHandler","_theadElement","bind","_updateData","stateSave","_deleteState","_loadState","requestMethod","requestHeaders","info","infoEmpty","pageSizes","pageSize","pageMore","pageMoreLimit","pagination","number","class","text","previous","more","search","delay","values","loading","template","content","table","size","spinner","loadingClass","_tableElement","_tbodyElement","tBodies","createTBody","tHead","_storeOriginalClasses","_infoElement","_sizeElement","_paginationElement","thElements","originalRows","rowIndex","tdElements","td","_showSpinner","apiEndpoint","_fetchDataFromLocal","_finalize","_fetchDataFromServer","_attachSearchEvent","_hideSpinner","tableId","_tableId","searchElement","_debouncedSearch","debouncedSearch","_debounce","page","originalData","_tableConfigInvalidate","_localTableHeaderInvalidate","_localTableContentInvalidate","_localExtractTableContent","originalDataAttributes","_temp","call","endIndex","startIndex","totalItems","_draw","checksum","JSON","stringify","innerHTML","_contentChecksum","restConfig","_configChecksum","ths","dataRow","colName","queryParams","_getQueryParamsForFetchRequest","_performFetchRequest","response","responseData","json","_noticeOnTable","mapResponse","totalCount","filters","URLSearchParams","column","type","mapRequest","requestBody","apiEndpointWithQueryParams","URL","fetch","method","headers","catch","error","totalPages","ceil","_dispose","_updateTable","_updatePagination","_saveState","removeChild","tbodyElement","_updateTableContent","fragment","createDocumentFragment","textContent","createElement","columns","colIndex","columnDef","render","createdCell","appendChild","prototype","attr","message","cell","insertRow","insertCell","colSpan","_removeChildElements","_createPageSizeControls","_createPaginationControls","container","firstChild","option","selected","append","onchange","_reloadPageSize","Number","_setPaginationInfoText","paginationContainer","_createPaginationContainer","_createPaginationButtons","currentPage","createButton","disabled","handleClick","button","onclick","_paginateData","pageMoreEnabled","maxButtons","_calculatePageRange","startPage","endPage","halfMaxButtons","floor","isInteger","_createSpinner","display","ns","_tableNamespace","localStorage","setItem","stateString","getItem","parse","removeItem","stateNamespace","id","func","wait","timeout","clearTimeout","setTimeout","goPage","setPageSize","reload","redraw","showSpinner","hideSpinner","setFilter","f","query","KTDataTable","_instances","stateManager","_calendarContainer","_dropdownElement","_dropdownManager","_isVisible","_stateManager","_eventManager","getEventManager","now","Date","_currentViewMonth","getMonth","_currentViewYear","getFullYear","_initializeCalendar","_setupEventListeners","getConfig","getLocaleConfig","headerElement","leftNavButton","_navigateMonth","headerCenter","rightNavButton","footerElement","todayButton","_goToToday","clearButton","_clearSelection","applyButton","_applySelection","rightFooter","_initDropdownManager","_renderCalendarView","displayElement","inputElement","triggerElement","KTDatepickerDropdown","e","setOpen","prevMonthBtn","nextMonthBtn","buttons","todayBtn","clearBtn","applyBtn","btn","btnText","monthYearText","_toggleMonthYearView","dayButton","dateIdAttr","part","parseInt","year","month","day","clickedDate","setHours","_handleDateSelection","dateAttr","_handleDaySelection","range","selectedDateRange","startDate","endDate","_clearRangeHoverClasses","hoverDate","_applyRangeHoverEffect","currentDate","setDate","KTDatepickerEventName","STATE_CHANGE","isRangeSelectionInProgress","_updateCalendarView","VIEW_CHANGE","_updateViewMode","OPEN","CLOSE","UPDATE","timeContainer","hourInput","minuteInput","secondInput","amButton","pmButton","am","pm","_handleTimeChange","_setAmPm","locale","visibleMonths","viewMode","tempDate","setMonth","monthContainer","monthHeader","monthNames","calendarGridTemplate","weekDays","calendarMatrix","generateCalendarMonth","daysBody","_renderDays","_updateMonthYearDisplay","currentMonth","monthSelectionTemplate","monthIdx","_selectMonth","currentYear","visibleYears","yearSelectionTemplate","_selectYear","prevYearsBtn","newYear","newDate","setFullYear","setCurrentDate","nextYearsBtn","today","week","date","isCurrentMonth","isToday","isSameDay","isSelected","isRangeStart","isRangeEnd","isInRange","selectedDate","isDateBetween","multiDateSelection","selectedDates","d","isDisabled","isDateDisabled","isWeekendDay","isWeekend","actualMonth","actualYear","dayTemplate","getDate","calendarHeader","monthYearSelectTemplate","monthSelector","yearSelector","setViewMode","clickedButton","console","log","toISOString","localSelectedDate","enableTime","selectedTime","hours","minutes","seconds","currentRange","isStartingNewRange","selectedMonth","currentViewMonth","isInDifferentMonth","setSelectedDate","updatedRange","earlierDate","dayButtons","parentCell","dayOfMonth","newMode","isValidHours","isNaN","isValidMinutes","isValidSeconds","isPM","setSelectedTime","ampm","updatedDate","period","keepViewModeOnSelection","_updateTimeDisplay","isAM","getHours","getMinutes","getSeconds","displayHours","timeFormat","forceLeadingZero","open","close","updatePosition","startDateMidnight","hoverDateMidnight","rangeEnd","dateRangeISOStrings","padStart","dateStr","KTDatepickerCalendar","DefaultConfig","locales","DefaultLocales","format","hourStep","rangeSeparator","maxDates","disabledDates","enableNaturalLanguage","animationDuration","animationEasing","animationEnterClass","animationExitClass","_mergeConfig","_initializeState","KTDatepickerEventManager","isFocused","isRangeSelectionStart","prevIsOpen","_dispatchChangeEvent","existingIndex","findIndex","splice","time","mode","onOpen","onClose","setFocused","resetState","dispatchDateChangeEvent","onChange","KTDatepickerStateManager","_dateInputElement","_startDateInputElement","_endDateInputElement","_displayElement","_useSegmentedDisplay","_displayWrapper","_displayText","_currentDate","_currentRange","_segmentFocused","_initializeInputElements","_createDisplayElement","_calendar","_keyboard","KTDatepickerKeyboard","_initializeDefaultValues","tabIndex","placeholder","displayContainer","segmentedDateRangeInputTemplate","segmentedDateInputTemplate","segment","stopPropagation","segmentType","_handleSegmentClick","dispatchKeyboardOpenEvent","_removeSegmentHighlights","_syncDisplayWithSelectedDate","DATE_CHANGE","_handleDateChange","_handleSegmentKeydown","_navigateSegments","currentSegment","segments","currentIndex","newIndex","newSegment","focus","daySegment","monthSegment","yearSegment","startDay","startMonth","startYear","endDay","endMonth","endYear","formatDate","formattedDate","Event","_updateDisplayElement","displayValue","endFormatted","_updateRangeDisplayElement","placeholderTemplate","displayText","_handleInputChange","inputValue","rangeParts","parseDate","setDateRange","singleDate","parsedDate","minDateAttr","maxDateAttr","minDate","setMinDate","maxDate","setMaxDate","getDateRange","warn","KTDatepicker","_focusableSelector","getVisibleOptions","applyFocus","focusNext","currentFocused","activeElement","nextIndex","focusPrevious","prevIndex","scrollIntoView","block","behavior","_listeners","addListener","handler","elementListeners","handlers","removeAllListeners","_focusableElements","_firstFocusableElement","_lastFocusableElement","_update","focusableElements","handleTab","keyCode","shiftKey","focusFirstElement","dropdownElement","_isTransitioning","_popperInstance","_focusTrap","_activeElement","_toggleElement","EventManager","_focusManager","FocusManager","_handleToggleClick","_handleKeyDown","_handleOutsideClick","firstOption","visibleOptions","lastOption","datepickerElement","_setDropdownWidth","spacing","totalWidth","minWidth","_initPopper","_destroyPopper","_parseOffset","triggerRect","dropdownRect","viewportHeight","innerHeight","viewportWidth","innerWidth","spaceBelow","spaceAbove","overflowRight","beforeShowEvent","defaultPrevented","zIndex","_focusFirstInteractiveElement","afterShowEvent","currentMonthDay","beforeHideEvent","opacity","afterHideEvent","listener","dispatchOpenEvent","dispatchCloseEvent","dispatchUpdateEvent","KEYBOARD_OPEN","dispatchViewChangeEvent","dispatchTimeChangeEvent","timeData","TIME_CHANGE","dispatchInputChangeEvent","DatepickerTypes","_focusedDay","_isListening","_handleDaysViewKeyNavigation","_handleMonthsViewKeyNavigation","_handleYearsViewKeyNavigation","_activateKeyboardNavigation","_deactivateKeyboardNavigation","_focusDay","daysInMonth","firstDayOffset","getDay","firstDayOfWeek","lastDayPrevMonth","dayPosition","lastRowStart","prevMonthDate","prevMonthDays","nextMonthDate","nextMonthDays","yearsPerPage","yearsPerPageUp","yearsPerPageDown","dropdown","selector","currentDay","dateId","generateLocaleConfig","_","toLocaleString","monthNamesShort","dayNames","weekday","dayNamesShort","dayNamesMin","parseFormatString","currentType","currentValue","addSegment","char","getSegmentWidthClass","getSegmentLabel","charAt","toUpperCase","formatSegments","separators","seg","getDefaultSegmentedRangeTemplate","weekDayFormat","getDayNames","firstDay","headerCells","hoverAttributes","monthStr","dayStr","months","idx","years","isCurrentYear","yearClass","datepickerContainerTemplate","inputWrapperTemplate","KTDatepickerEvents","naturalDate","normalized","yesterday","tomorrow","relativeMatch","match","unit","parseNaturalLanguageDate","formatParts","formatRegex","p1","p2","token","repeat","RegExp","exec","yyyy","yy","century","MM","M","MMM","MMMM","monthIndex","shortMonthIndex","dd","HH","H","hh","h","A","mm","setMinutes","ss","s","setSeconds","isValidDate","getTime","getDaysInMonth","getFirstDayOfMonth","padZero","num","date1","date2","isLeadingZero","monthNum","dayOfWeek","hours12","timezoneOffset","getTimezoneOffset","timezoneOffsetHours","timezoneOffsetMinutes","formattedTimezone","dateTime","normalizedDate","parts","disabledDate","firstDayOfMonth","calendar","startTime","endTime","interrupt","_dismiss","getTargetElement","dismiss","KTDismiss","zindex","enable","shownClass","backdrop","backdropClass","backdropStatic","keyboard","disableScroll","persistent","_backdropElement","_relatedTarget","_handleClose","_handleContainer","relatedTarget","KTDrawer","_createBackdrop","_autoFocus","_deleteBackdrop","isEnabled","addClass","removeClass","_isEnabled","stringToBoolean","getRelatedTarget","drawer","handleResize","throttle","timer","handleToggle","drawerEl","handleDismiss","modalElement","modal","handleClickAway","handleKeyword","ctrlKey","altKey","code","metaKey","KT_DRAWER_INITIALIZED","hoverTimeout","placementRtl","permanent","trigger","attach","offsetRtl","_disabled","_menuElement","_setupNestedDropdowns","subToggle","subItem","subMenu","KTDropdown","_click","_mouseover","_mouseout","parentZindex","getHighestZindex","isRTL","_getPopperConfig","_isDropdownOpen","isRtl","offsetValue","_getToggleElement","_getContentElement","click","mouseover","mouseout","getToggleElement","getContentElement","isPermanent","disable","findElement","skipElement","handleKeyboard","dropdownEl","handleMouseover","handleMouseout","initHandlers","KT_DROPDOWN_INITIALIZED","_previewUrl","_inputElement","_hiddenElement","_removeElement","_previewElement","_change","_remove","reader","FileReader","onload","backgroundImage","readAsDataURL","files","_lastMode","_setPreviewUrl","_getPreviewUrl","url","isEmpty","isChanged","setPreviewUrl","getPreviewUrl","KTImageInput","KTModal","targetElement","_setZindex","KT_MODAL_INITIALIZED","KTReparent","targetEl","prepend","reparent","KT_REPARENT_INITIALIZED","KTScrollable","save","dependencies","wrappers","_elementId","_setupHeight","_setupState","heightType","_getHeightType","_getHeight","setProperty","stateEnabled","elementIdExists","Boolean","storedPosition","pos","_getHeightOption","_getAutoHeight","getViewPort","_getElementSpacing","_getElementHeight","computedStyle","marginTop","marginBottom","borderTopWidth","borderBottomWidth","paddingTop","paddingBottom","getHeight","KT_SCROLLABLE_INITIALIZED","KTScrollspy","smooth","_anchorElements","_getTarget","anchorElement","_updateAnchor","_scrollTo","sectionElement","scrollTo","isVisible","scrollPosition","parentAnchorElements","parents","parentAnchorElement","_isActive","updateAnchor","isActive","KTScrollto","_scroll","select","_select","getValueDisplayElement","_searchInputElement","tagName","_clearButtonElement","_boundKeyNavHandler","_handleComboboxKeyNav","_boundInputHandler","_handleComboboxInput","_boundClearHandler","_handleClearButtonClick","_attachEventListeners","debug","_removeEventListeners","_toggleClearButtonVisibility","_dropdownIsOpen","openDropdown","_filterOptionsForCombobox","showAllOptions","clearSelection","handleDropdownKeyNavigation","multiple","closeOnSelect","_focusNextOption","_focusPreviousOption","updateSelectedValue","selectedText","cleanText","tempDiv","titleElement","inputEvent","resetInputValueToSelection","selectedOptions","getSelectedOptions","selectedOption","getOptionsElement","opt","dataset","KTSelectCombobox","loadMoreText","dropdownZindex","items","isLoading","onFetch","remote","dataUrl","apiDataProperty","remoteErrorMessage","dataValueField","dataFieldText","dataFieldDescription","dataFieldIcon","dataFieldIconWidth","dataFieldIconHeight","searchParam","searchDebounce","paginationLimit","paginationPageParam","paginationLimitParam","paginationTotalParam","maxSelections","isRequired","enableSearch","searchPlaceholder","searchAutofocus","searchMinLength","searchMaxItems","searchNotFoundText","searchHighlight","clearSearchOnClose","selectAllText","clearAllText","showSelectedCount","renderSelected","label","dropdownPlacement","dropdownFlip","dropdownPreventOverflow","dropdownStrategy","dropdownWidth","focusClass","hoverClass","bgClass","fontClass","_selectedOptions","setItems","reject","_fetchRemoteData","finally","encodeURIComponent","getItems","setItemsFromOptions","title","setSelectedOptions","toggleSelectedOptions","modifyConfig","KTSelectState","SelectOptionDefaultConfig","description","icon","toggleWidth","flip","searchInput","_focusFirstOption","transitionComplete","fallbackTimer","completeTransition","KTSelectDropdown","KTSelect","KTSelectRemote","KTSelectSearch","KTSelectTags","filterOptions","_globalConfig","getHTMLOptionElement","optionElement","defaultTemplates","KTSelectOption","_isLoading","_hasError","_errorMessage","_currentPage","_totalPages","_lastQuery","fetchData","_buildUrl","ok","Error","status","_processData","hasError","errorMessage","params","limitParam","pageParam","limit","paramsString","processedData","total_pages","mappedData","mappedItem","_mapItemToOption","nestedValue","expectedValue","valueField","labelField","descriptionField","iconField","substring","getValue","obj","path","random","substr","loadNextPage","hasMorePages","getErrorMessage","setElement","_noResultsElement","_originalOptionContents","_searchInput","getSearchInput","getDropdownElement","_handleKeyboardNavigation","handleSearchInput","_handleSearchInput","_cacheOriginalOptionContents","_resetAllOptions","clearSearchHighlights","resetFocus","refreshOptionCache","closeDropdown","onArrowDown","onArrowUp","onEnter","_selectFocusedOption","focusedOption","getFocusedOption","optionValue","_clearNoResultsMessage","_filterOptions","visibleCount","_handleNoResults","_applyHighlightToDisplay","styleAttr","visibleOptionsCount","_showNoResultsMessage","noResults","optionsContainer","_clearDisplayHighlights","clear","_comboboxModule","_tagsModule","_dropdownModule","_loadMoreIndicator","_searchDebounceTimeout","_originalOptionsHtml","_remoteModule","_initializeRemoteData","_setupComponent","_renderLoadingState","_clearExistingOptions","_generateOptionsHtml","_addLoadMoreButton","_renderErrorState","emptyOption","_showDropdownMessage","_dropdownContentElement","outerHTML","errorOption","_wrapperElement","loadMore","_handleLoadMore","newItems","existingItems","_updateOptionsInDropdown","loadMoreButton","selectOption","renderedOption","insertBefore","_createHtmlStructure","_setupElementReferences","_initZIndex","_initializeOptionsHtml","_preSelectOptions","_applyInitialDisabledState","_initializeSearchModule","SelectMode","COMBOBOX","TAGS","_updateDisplayAndAriaAttributes","updateSelectedOptionDisplay","_setAriaAttributes","wrapperElement","dropdownContent","isCombobox","after","nextElementSibling","_valueDisplayElement","_handleDocumentClick","_handleEscKey","_handleDropdownOptionClick","_handleDropdownClick","_handleDropdownKeyDown","_searchModule","_handleRemoteSearch","extractedValue","_getValueByKey","extractedLabel","extractedDesc","extractedIcon","o","k","_selectOption","preSelectedValues","toggleDropdown","_focusSelectedOption","updateDropdownPosition","firstSelectedValue","focusOptionByValue","optionEl","_updateSelectedOptionClass","_updateValueDisplay","updateTagsDisplay","_getOptionInnerHtml","_updateDebugDisplays","selectId","debugElement","getElementById","allOptions","selectedValues","maxReached","_hoverFocusedOption","_scrollOptionIntoView","selectFocusedOption","selectedValue","_handleOptionClick","clickedOption","toggleSelection","_handleFocus","_handleBlur","enableMultiSelect","disableMultiSelect","_renderSearchLoadingState","_updateSearchResults","_renderSearchErrorState","noResultsElement","isDropdownOpen","tagElement","_createTagElement","optionLabel","_getOptionLabel","mockOption","tag","closeButton","_removeTag","optionElements","originalOptions","templates","userTemplateStrings","defaultTemplateStrings","highlight","displayCombobox","optionGroup","stringToElement","firstElementChild","getTemplateStrings","optionsHtml","hasSearch","searchHtml","isHtmlOption","HTMLOptionElement","optionData","selectedClass","disabledClass","loadingMessage","safeTitle","selectedDisplay","count","Intl","NumberFormat","currency","onVisibleCount","isMatch","hasIcon","hasDescription","highlightTextInElement","callbacks","queryLower","walk","nodeType","Node","TEXT_NODE","nodeValue","matchIndex","before","frag","createTextNode","highlightSpan","replaceChild","ELEMENT_NODE","childNodes","optionsSelector","_focusedOptionIndex","_optionsSelector","_focusClass","_hoverClass","_bgClass","_fontClass","_setupOptionClickHandlers","clickedIndex","optionRect","containerRect","getFocusedIndex","setFocusedIndex","_boundHandlers","context","boundHandler","removeListener","eventMap","originalHandler","KTStepper","activeStep","_activeStep","_nextElement","_backElement","_go","_goNext","_goBack","_getTotalSteps","_getItemElements","numberElement","step","_goTo","itemElement","_getStep","_getItemElement","_goLast","_goFirst","_isLast","_isFirst","isLast","isFirst","go","goTo","goFirst","goLast","goNext","goBack","getStep","getItemElement","getTotalSteps","getItemElements","KTSticky","reverse","release","activate","_releaseElement","_activateElement","_attributeRoot","_eventTriggerState","_lastScrollTop","_process","_getOffset","_disable","st","getScrollTop","isPartiallyInViewport","_enable","active","activateElement","_calculateHeight","parseFloat","insetInlineStart","offseRight","insetInlineEnd","KTTabs","_currentTabElement","_currentContentElement","_lastTabElement","_lastContentElement","_tabElements","tabElement","_isShown","_getDropdownToggleElement","containerElement","isShown","keyboardArrow","keyboardJump","handleAccessibility","KT_TABS_INITIALIZED","KTThemeSwitch","_mode","_currentMode","_setMode","currentMode","_getSystemMode","_bindMode","_updateState","_getMode","matchMedia","matches","getMode","setMode","KTTogglePassword","_triggerElement","_setVisible","flag","setVisible","KTToggle","hasClass","KTTooltip","delayShow","delayHide","_transitioning","_timeout","_createPopper","_popper","getTriggerOption","tooltipElement","tooltip","KT_TOOLTIP_INITIALIZED","KTElementMap","KTData","valueMap","KTDom","parseSelector","classNames","prop","getPropertyValue","setCssProp","getIndex","children","parentElement","l","getClientRects","duration","getCSSTransitionDuration","animationEnd","getCSSAnimationDuration","transitionDuration","insertAfter","referenceNode","nextSibling","isParentOrElementHidden","scrollingElement","isInViewport","ww","hw","w","isVisibleInParent","childRect","parentRect","visibility","isVisibleVertically","isVisibleHorizontally","getRelativeTopPosition","prefix","camelCase","startsWith","normalizedKey","uncapitalize","parseDataAttribute","ready","readyState","KTDelegatedEventHandlers","KTEventHandler","targets","j","KTUtils","getCssVar","variable","hex","parseJson","decodeURIComponent","CSS","escape","capitalize","letter","str","htmlElement","charCodeAt","cleanedStr","stringToObject","parsed","stringToInteger","stringToFloat","KTComponents","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","defineProperty","enumerable","r","Symbol","toStringTag"],"sourceRoot":""}