@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,646 @@
1
+ /**
2
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
+ * Copyright 2025 by Keenthemes Inc
4
+ * @version: 1.0.0
5
+ */
6
+ import { KTDatepickerStateManager } from './config';
7
+ import { KTDatepickerEventManager, KTDatepickerEventName } from './events';
8
+
9
+ /**
10
+ * Keyboard navigation handler for KTDatepicker
11
+ */
12
+ export class KTDatepickerKeyboard {
13
+ private _element: HTMLElement;
14
+ private _stateManager: KTDatepickerStateManager;
15
+ private _eventManager: KTDatepickerEventManager;
16
+ private _focusedDay: number | null = null;
17
+ private _isListening = false;
18
+
19
+ /**
20
+ * Constructor for the KTDatepickerKeyboard class
21
+ *
22
+ * @param element - The datepicker element
23
+ * @param stateManager - State manager for the datepicker
24
+ */
25
+ constructor(element: HTMLElement, stateManager: KTDatepickerStateManager) {
26
+ this._element = element;
27
+ this._stateManager = stateManager;
28
+ this._eventManager = stateManager.getEventManager();
29
+
30
+ // Set up listeners
31
+ this._setupEventListeners();
32
+ }
33
+
34
+ /**
35
+ * Set up event listeners for keyboard navigation
36
+ */
37
+ private _setupEventListeners(): void {
38
+ // Listen for open/close events to activate/deactivate keyboard navigation
39
+ this._eventManager.addEventListener(KTDatepickerEventName.OPEN, () =>
40
+ this._activateKeyboardNavigation(),
41
+ );
42
+ this._eventManager.addEventListener(KTDatepickerEventName.CLOSE, () =>
43
+ this._deactivateKeyboardNavigation(),
44
+ );
45
+
46
+ // Listen for custom keyboard-open event
47
+ this._eventManager.addEventListener(
48
+ KTDatepickerEventName.KEYBOARD_OPEN,
49
+ () => {
50
+ // Ensure we activate keyboard navigation
51
+ this._activateKeyboardNavigation();
52
+
53
+ // Set initial focus day with a slight delay to allow the dropdown to render
54
+ setTimeout(() => {
55
+ // Initialize focused day if needed
56
+ if (this._focusedDay === null) {
57
+ const state = this._stateManager.getState();
58
+ if (state.selectedDate) {
59
+ this._focusedDay = state.selectedDate.getDate();
60
+ } else {
61
+ this._focusedDay = new Date().getDate();
62
+ }
63
+ }
64
+
65
+ // Focus the day
66
+ this._focusDay();
67
+ }, 150);
68
+ },
69
+ );
70
+
71
+ // Handle focus events
72
+ this._element.addEventListener('focusin', (e) => {
73
+ if (this._stateManager.getState().isOpen && !this._isListening) {
74
+ this._activateKeyboardNavigation();
75
+ }
76
+ });
77
+
78
+ // Add keydown event to the element itself to open dropdown with Enter key
79
+ this._element.addEventListener('keydown', (e) => {
80
+ const state = this._stateManager.getState();
81
+
82
+ // If not open yet, handle keys that should open the dropdown
83
+ if (!state.isOpen) {
84
+ if (
85
+ e.key === 'Enter' ||
86
+ e.key === ' ' ||
87
+ e.key === 'ArrowDown' ||
88
+ e.key === 'ArrowUp'
89
+ ) {
90
+ e.preventDefault();
91
+ e.stopPropagation(); // Prevent other handlers from capturing this event
92
+ this._stateManager.setOpen(true);
93
+
94
+ // Set initial focus day if none
95
+ if (this._focusedDay === null) {
96
+ if (state.selectedDate) {
97
+ this._focusedDay = state.selectedDate.getDate();
98
+ } else {
99
+ this._focusedDay = new Date().getDate();
100
+ }
101
+ // Focus the day after dropdown opens
102
+ setTimeout(() => this._focusDay(), 150);
103
+ }
104
+ }
105
+ }
106
+ });
107
+
108
+ // Add an additional event listener to the input field specifically
109
+ const inputs = this._element.querySelectorAll('input');
110
+ inputs.forEach((input) => {
111
+ input.addEventListener('keydown', (e) => {
112
+ const state = this._stateManager.getState();
113
+ if (!state.isOpen) {
114
+ if (
115
+ e.key === 'Enter' ||
116
+ e.key === ' ' ||
117
+ e.key === 'ArrowDown' ||
118
+ e.key === 'ArrowUp'
119
+ ) {
120
+ e.preventDefault();
121
+ e.stopPropagation();
122
+ this._stateManager.setOpen(true);
123
+
124
+ // Set initial focus day
125
+ if (this._focusedDay === null) {
126
+ if (state.selectedDate) {
127
+ this._focusedDay = state.selectedDate.getDate();
128
+ } else {
129
+ this._focusedDay = new Date().getDate();
130
+ }
131
+ // Focus the day after dropdown opens
132
+ setTimeout(() => this._focusDay(), 150);
133
+ }
134
+ }
135
+ }
136
+ });
137
+ });
138
+
139
+ // Add an even more specific listener for Enter key on the display element
140
+ const displayElement = this._element.querySelector(
141
+ '[data-kt-datepicker-display]',
142
+ );
143
+ if (displayElement) {
144
+ displayElement.addEventListener(
145
+ 'keydown',
146
+ (e: KeyboardEvent) => {
147
+ if (e.key === 'Enter') {
148
+ e.preventDefault();
149
+ e.stopPropagation();
150
+
151
+ const state = this._stateManager.getState();
152
+ if (!state.isOpen) {
153
+ this._stateManager.setOpen(true);
154
+
155
+ // Focus the current day with a slightly longer delay
156
+ setTimeout(() => {
157
+ if (this._focusedDay === null) {
158
+ if (state.selectedDate) {
159
+ this._focusedDay = state.selectedDate.getDate();
160
+ } else {
161
+ this._focusedDay = new Date().getDate();
162
+ }
163
+ }
164
+ this._focusDay();
165
+ }, 200);
166
+ }
167
+ }
168
+ },
169
+ true,
170
+ ); // Use capture phase to ensure this runs first
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Activate keyboard navigation
176
+ */
177
+ private _activateKeyboardNavigation(): void {
178
+ if (this._isListening) return;
179
+
180
+ // Add global keydown listener
181
+ document.addEventListener('keydown', this._handleKeyDown);
182
+ this._isListening = true;
183
+
184
+ // Set initial focus day if none
185
+ if (this._focusedDay === null) {
186
+ const state = this._stateManager.getState();
187
+ if (state.selectedDate) {
188
+ this._focusedDay = state.selectedDate.getDate();
189
+ } else {
190
+ this._focusedDay = new Date().getDate();
191
+ }
192
+
193
+ // Focus the day
194
+ setTimeout(() => this._focusDay(), 100);
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Deactivate keyboard navigation
200
+ */
201
+ private _deactivateKeyboardNavigation(): void {
202
+ if (!this._isListening) return;
203
+
204
+ // Remove global keydown listener
205
+ document.removeEventListener('keydown', this._handleKeyDown);
206
+ this._isListening = false;
207
+ }
208
+
209
+ /**
210
+ * Handle keydown events
211
+ */
212
+ private _handleKeyDown = (e: KeyboardEvent): void => {
213
+ const state = this._stateManager.getState();
214
+ const viewMode = state.viewMode;
215
+
216
+ // ESC key closes the dropdown
217
+ if (e.key === 'Escape') {
218
+ e.preventDefault();
219
+ this._stateManager.setOpen(false);
220
+ return;
221
+ }
222
+
223
+ // Handle different view modes differently
224
+ switch (viewMode) {
225
+ case 'days':
226
+ this._handleDaysViewKeyNavigation(e);
227
+ break;
228
+ case 'months':
229
+ this._handleMonthsViewKeyNavigation(e);
230
+ break;
231
+ case 'years':
232
+ this._handleYearsViewKeyNavigation(e);
233
+ break;
234
+ }
235
+ };
236
+
237
+ /**
238
+ * Handle key navigation in days view
239
+ */
240
+ private _handleDaysViewKeyNavigation(e: KeyboardEvent): void {
241
+ const state = this._stateManager.getState();
242
+ const config = this._stateManager.getConfig();
243
+ const currentDate = new Date(state.currentDate);
244
+ const daysInMonth = new Date(
245
+ currentDate.getFullYear(),
246
+ currentDate.getMonth() + 1,
247
+ 0,
248
+ ).getDate();
249
+
250
+ // Get the day of week for the first day of the month to calculate grid positions
251
+ const firstDayOfMonth = new Date(
252
+ currentDate.getFullYear(),
253
+ currentDate.getMonth(),
254
+ 1,
255
+ ).getDay();
256
+ // Adjust for first day of week setting
257
+ const firstDayOffset =
258
+ (firstDayOfMonth - config.locales[config.locale].firstDayOfWeek + 7) % 7;
259
+
260
+ // Ensure we have a focused day
261
+ if (this._focusedDay === null) {
262
+ if (state.selectedDate) {
263
+ this._focusedDay = state.selectedDate.getDate();
264
+ } else {
265
+ this._focusedDay = new Date().getDate();
266
+ }
267
+ }
268
+
269
+ switch (e.key) {
270
+ case 'ArrowLeft':
271
+ e.preventDefault();
272
+ e.stopPropagation(); // Stop event propagation
273
+ if (this._focusedDay === 1) {
274
+ // Move to previous month
275
+ const newDate = new Date(currentDate);
276
+ newDate.setMonth(newDate.getMonth() - 1);
277
+ this._stateManager.setCurrentDate(newDate);
278
+
279
+ // Set focus to last day of previous month
280
+ const lastDayPrevMonth = new Date(
281
+ currentDate.getFullYear(),
282
+ currentDate.getMonth(),
283
+ 0,
284
+ ).getDate();
285
+ this._focusedDay = lastDayPrevMonth;
286
+ } else {
287
+ this._focusedDay = Math.max(1, (this._focusedDay || 1) - 1);
288
+ }
289
+ this._focusDay();
290
+ break;
291
+
292
+ case 'ArrowRight':
293
+ e.preventDefault();
294
+ e.stopPropagation(); // Stop event propagation
295
+ if (this._focusedDay === daysInMonth) {
296
+ // Move to next month
297
+ const newDate = new Date(currentDate);
298
+ newDate.setMonth(newDate.getMonth() + 1);
299
+ this._stateManager.setCurrentDate(newDate);
300
+
301
+ // Set focus to first day of next month
302
+ this._focusedDay = 1;
303
+ } else {
304
+ this._focusedDay = Math.min(daysInMonth, (this._focusedDay || 1) + 1);
305
+ }
306
+ this._focusDay();
307
+ break;
308
+
309
+ case 'ArrowUp':
310
+ e.preventDefault();
311
+ e.stopPropagation(); // Stop event propagation
312
+ if (this._focusedDay && this._focusedDay <= 7) {
313
+ // We're in the first row of the current month
314
+ // Calculate the row position in the grid
315
+ const dayPosition = (this._focusedDay - 1 + firstDayOffset) % 7;
316
+
317
+ // Move to previous month
318
+ const newDate = new Date(currentDate);
319
+ newDate.setMonth(newDate.getMonth() - 1);
320
+ this._stateManager.setCurrentDate(newDate);
321
+
322
+ // Get days in previous month
323
+ const lastDayPrevMonth = new Date(
324
+ currentDate.getFullYear(),
325
+ currentDate.getMonth(),
326
+ 0,
327
+ ).getDate();
328
+
329
+ // Calculate the corresponding day in the previous month's last row
330
+ // Start with the last day of previous month
331
+ this._focusedDay = lastDayPrevMonth - (6 - dayPosition);
332
+ } else {
333
+ // Move up one week (7 days)
334
+ this._focusedDay = (this._focusedDay || 1) - 7;
335
+ }
336
+ this._focusDay();
337
+ break;
338
+
339
+ case 'ArrowDown':
340
+ e.preventDefault();
341
+ e.stopPropagation(); // Stop event propagation
342
+ const lastRowStart = daysInMonth - ((daysInMonth + firstDayOffset) % 7);
343
+
344
+ if (this._focusedDay && this._focusedDay > lastRowStart) {
345
+ // We're in the last row of the current month
346
+ // Calculate position in last row (0-6)
347
+ const dayPosition = (this._focusedDay - 1 + firstDayOffset) % 7;
348
+
349
+ // Move to next month
350
+ const newDate = new Date(currentDate);
351
+ newDate.setMonth(newDate.getMonth() + 1);
352
+ this._stateManager.setCurrentDate(newDate);
353
+
354
+ // Calculate the corresponding day in next month's first row
355
+ this._focusedDay =
356
+ dayPosition + 1 - ((dayPosition + firstDayOffset) % 7);
357
+ // Ensure we're in bounds for next month
358
+ const nextMonthDays = new Date(
359
+ newDate.getFullYear(),
360
+ newDate.getMonth() + 1,
361
+ 0,
362
+ ).getDate();
363
+ this._focusedDay = Math.min(this._focusedDay, nextMonthDays);
364
+ } else {
365
+ // Move down one week (7 days)
366
+ this._focusedDay = Math.min(daysInMonth, (this._focusedDay || 1) + 7);
367
+ }
368
+ this._focusDay();
369
+ break;
370
+
371
+ case 'Home':
372
+ e.preventDefault();
373
+ // Move to first day of the month
374
+ this._focusedDay = 1;
375
+ this._focusDay();
376
+ break;
377
+
378
+ case 'End':
379
+ e.preventDefault();
380
+ // Move to last day of the month
381
+ this._focusedDay = daysInMonth;
382
+ this._focusDay();
383
+ break;
384
+
385
+ case 'PageUp':
386
+ e.preventDefault();
387
+ // Move to previous month
388
+ const prevMonthDate = new Date(currentDate);
389
+ prevMonthDate.setMonth(prevMonthDate.getMonth() - 1);
390
+ this._stateManager.setCurrentDate(prevMonthDate);
391
+
392
+ // Adjust focused day if needed
393
+ const prevMonthDays = new Date(
394
+ prevMonthDate.getFullYear(),
395
+ prevMonthDate.getMonth() + 1,
396
+ 0,
397
+ ).getDate();
398
+ if (this._focusedDay > prevMonthDays) {
399
+ this._focusedDay = prevMonthDays;
400
+ }
401
+ this._focusDay();
402
+ break;
403
+
404
+ case 'PageDown':
405
+ e.preventDefault();
406
+ // Move to next month
407
+ const nextMonthDate = new Date(currentDate);
408
+ nextMonthDate.setMonth(nextMonthDate.getMonth() + 1);
409
+ this._stateManager.setCurrentDate(nextMonthDate);
410
+
411
+ // Adjust focused day if needed
412
+ const nextMonthDays = new Date(
413
+ nextMonthDate.getFullYear(),
414
+ nextMonthDate.getMonth() + 1,
415
+ 0,
416
+ ).getDate();
417
+ if (this._focusedDay > nextMonthDays) {
418
+ this._focusedDay = nextMonthDays;
419
+ }
420
+ this._focusDay();
421
+ break;
422
+
423
+ case 'Enter':
424
+ case ' ':
425
+ e.preventDefault();
426
+ if (this._focusedDay) {
427
+ // Select the focused day
428
+ const selectedDate = new Date(currentDate);
429
+ selectedDate.setDate(this._focusedDay);
430
+
431
+ if (config.enableTime && state.selectedTime) {
432
+ selectedDate.setHours(
433
+ state.selectedTime.hours,
434
+ state.selectedTime.minutes,
435
+ state.selectedTime.seconds,
436
+ );
437
+ } else {
438
+ selectedDate.setHours(0, 0, 0, 0);
439
+ }
440
+
441
+ this._stateManager.setSelectedDate(selectedDate);
442
+
443
+ // Close the dropdown if not range selection or if range is complete
444
+ if (
445
+ !config.range ||
446
+ (state.selectedDateRange &&
447
+ state.selectedDateRange.startDate &&
448
+ state.selectedDateRange.endDate)
449
+ ) {
450
+ this._stateManager.setOpen(false);
451
+ }
452
+ }
453
+ break;
454
+ }
455
+ }
456
+
457
+ /**
458
+ * Handle key navigation in months view
459
+ */
460
+ private _handleMonthsViewKeyNavigation(e: KeyboardEvent): void {
461
+ const state = this._stateManager.getState();
462
+ const currentDate = new Date(state.currentDate);
463
+ const currentMonth = currentDate.getMonth();
464
+
465
+ switch (e.key) {
466
+ case 'ArrowLeft':
467
+ e.preventDefault();
468
+ currentDate.setMonth((currentMonth - 1 + 12) % 12);
469
+ this._stateManager.setCurrentDate(currentDate);
470
+ break;
471
+
472
+ case 'ArrowRight':
473
+ e.preventDefault();
474
+ currentDate.setMonth((currentMonth + 1) % 12);
475
+ this._stateManager.setCurrentDate(currentDate);
476
+ break;
477
+
478
+ case 'ArrowUp':
479
+ e.preventDefault();
480
+ currentDate.setMonth((currentMonth - 3 + 12) % 12);
481
+ this._stateManager.setCurrentDate(currentDate);
482
+ break;
483
+
484
+ case 'ArrowDown':
485
+ e.preventDefault();
486
+ currentDate.setMonth((currentMonth + 3) % 12);
487
+ this._stateManager.setCurrentDate(currentDate);
488
+ break;
489
+
490
+ case 'Home':
491
+ e.preventDefault();
492
+ currentDate.setMonth(0);
493
+ this._stateManager.setCurrentDate(currentDate);
494
+ break;
495
+
496
+ case 'End':
497
+ e.preventDefault();
498
+ currentDate.setMonth(11);
499
+ this._stateManager.setCurrentDate(currentDate);
500
+ break;
501
+
502
+ case 'Enter':
503
+ case ' ':
504
+ e.preventDefault();
505
+ this._stateManager.setViewMode('days');
506
+ break;
507
+ }
508
+ }
509
+
510
+ /**
511
+ * Handle key navigation in years view
512
+ */
513
+ private _handleYearsViewKeyNavigation(e: KeyboardEvent): void {
514
+ const state = this._stateManager.getState();
515
+ const currentDate = new Date(state.currentDate);
516
+ const currentYear = currentDate.getFullYear();
517
+
518
+ switch (e.key) {
519
+ case 'ArrowLeft':
520
+ e.preventDefault();
521
+ currentDate.setFullYear(currentYear - 1);
522
+ this._stateManager.setCurrentDate(currentDate);
523
+ break;
524
+
525
+ case 'ArrowRight':
526
+ e.preventDefault();
527
+ currentDate.setFullYear(currentYear + 1);
528
+ this._stateManager.setCurrentDate(currentDate);
529
+ break;
530
+
531
+ case 'ArrowUp':
532
+ e.preventDefault();
533
+ currentDate.setFullYear(currentYear - 4);
534
+ this._stateManager.setCurrentDate(currentDate);
535
+ break;
536
+
537
+ case 'ArrowDown':
538
+ e.preventDefault();
539
+ currentDate.setFullYear(currentYear + 4);
540
+ this._stateManager.setCurrentDate(currentDate);
541
+ break;
542
+
543
+ case 'Home':
544
+ e.preventDefault();
545
+ const yearsPerView = this._stateManager.getConfig().visibleYears;
546
+ const startYear = currentYear - (currentYear % yearsPerView);
547
+ currentDate.setFullYear(startYear);
548
+ this._stateManager.setCurrentDate(currentDate);
549
+ break;
550
+
551
+ case 'End':
552
+ e.preventDefault();
553
+ const yearsPerPage = this._stateManager.getConfig().visibleYears;
554
+ const startYearEnd = currentYear - (currentYear % yearsPerPage);
555
+ const endYear = startYearEnd + yearsPerPage - 1;
556
+ currentDate.setFullYear(endYear);
557
+ this._stateManager.setCurrentDate(currentDate);
558
+ break;
559
+
560
+ case 'PageUp':
561
+ e.preventDefault();
562
+ const yearsPerPageUp = this._stateManager.getConfig().visibleYears;
563
+ currentDate.setFullYear(currentYear - yearsPerPageUp);
564
+ this._stateManager.setCurrentDate(currentDate);
565
+ break;
566
+
567
+ case 'PageDown':
568
+ e.preventDefault();
569
+ const yearsPerPageDown = this._stateManager.getConfig().visibleYears;
570
+ currentDate.setFullYear(currentYear + yearsPerPageDown);
571
+ this._stateManager.setCurrentDate(currentDate);
572
+ break;
573
+
574
+ case 'Enter':
575
+ case ' ':
576
+ e.preventDefault();
577
+ this._stateManager.setViewMode('months');
578
+ break;
579
+ }
580
+ }
581
+
582
+ /**
583
+ * Focus the currently focused day in the calendar
584
+ */
585
+ private _focusDay(): void {
586
+ if (!this._focusedDay) return;
587
+
588
+ const state = this._stateManager.getState();
589
+
590
+ // Try different selectors for the dropdown
591
+ const selectors = [
592
+ '.absolute.bg-white.shadow-lg.rounded-lg',
593
+ '.kt-datepicker-dropdown',
594
+ '.calendar-container',
595
+ ];
596
+
597
+ let dropdown = null;
598
+ for (const selector of selectors) {
599
+ dropdown = this._element.querySelector(selector);
600
+ if (dropdown) break;
601
+ }
602
+
603
+ if (!dropdown) {
604
+ // If no dropdown found, try getting any element with calendar buttons
605
+ dropdown =
606
+ this._element.querySelector('.multiple-months') ||
607
+ this._element.querySelector('[data-kt-datepicker-container]') ||
608
+ this._element;
609
+ }
610
+
611
+ const currentDay = this._focusedDay;
612
+ const currentMonth = state.currentDate.getMonth();
613
+ const currentYear = state.currentDate.getFullYear();
614
+
615
+ // First try to find the day in the current month
616
+ let dayButton = dropdown.querySelector(
617
+ `button[data-date="${currentDay}"]:not(.text-gray-400)`,
618
+ );
619
+
620
+ // If not found, try to find any button with the day number
621
+ if (!dayButton) {
622
+ dayButton = dropdown.querySelector(`button[data-date="${currentDay}"]`);
623
+ }
624
+
625
+ // If still not found, try to find by date-id
626
+ if (!dayButton) {
627
+ const dateId = `${currentYear}-${String(currentMonth + 1).padStart(2, '0')}-${String(currentDay).padStart(2, '0')}`;
628
+ dayButton = dropdown.querySelector(`button[data-date-id="${dateId}"]`);
629
+ }
630
+
631
+ // As a last resort, find any day button
632
+ if (!dayButton) {
633
+ dayButton = dropdown.querySelector('button[data-date]');
634
+ }
635
+
636
+ // Focus the day button if found
637
+ if (dayButton) {
638
+ (dayButton as HTMLElement).focus();
639
+
640
+ // Scroll into view if needed
641
+ if (dayButton.scrollIntoView) {
642
+ dayButton.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
643
+ }
644
+ }
645
+ }
646
+ }