@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.
- package/CONTRIBUTING.md +88 -0
- package/LICENSE.md +21 -0
- package/README.md +124 -0
- package/dist/ktui.js +19201 -0
- package/dist/ktui.min.js +2 -0
- package/dist/ktui.min.js.map +1 -0
- package/lib/cjs/components/accordion/accordion.js +168 -0
- package/lib/cjs/components/accordion/accordion.js.map +1 -0
- package/lib/cjs/components/accordion/index.js +6 -0
- package/lib/cjs/components/accordion/index.js.map +1 -0
- package/lib/cjs/components/accordion/types.js +3 -0
- package/lib/cjs/components/accordion/types.js.map +1 -0
- package/lib/cjs/components/collapse/collapse.js +169 -0
- package/lib/cjs/components/collapse/collapse.js.map +1 -0
- package/lib/cjs/components/collapse/index.js +6 -0
- package/lib/cjs/components/collapse/index.js.map +1 -0
- package/lib/cjs/components/collapse/types.js +3 -0
- package/lib/cjs/components/collapse/types.js.map +1 -0
- package/lib/cjs/components/component.js +135 -0
- package/lib/cjs/components/component.js.map +1 -0
- package/lib/cjs/components/config.js +26 -0
- package/lib/cjs/components/config.js.map +1 -0
- package/lib/cjs/components/config.umd.js +23 -0
- package/lib/cjs/components/config.umd.js.map +1 -0
- package/lib/cjs/components/constants.js +15 -0
- package/lib/cjs/components/constants.js.map +1 -0
- package/lib/cjs/components/datatable/datatable.js +1464 -0
- package/lib/cjs/components/datatable/datatable.js.map +1 -0
- package/lib/cjs/components/datatable/index.js +6 -0
- package/lib/cjs/components/datatable/index.js.map +1 -0
- package/lib/cjs/components/datatable/types.js +3 -0
- package/lib/cjs/components/datatable/types.js.map +1 -0
- package/lib/cjs/components/dismiss/dismiss.js +131 -0
- package/lib/cjs/components/dismiss/dismiss.js.map +1 -0
- package/lib/cjs/components/dismiss/index.js +6 -0
- package/lib/cjs/components/dismiss/index.js.map +1 -0
- package/lib/cjs/components/dismiss/types.js +3 -0
- package/lib/cjs/components/dismiss/types.js.map +1 -0
- package/lib/cjs/components/drawer/drawer.js +347 -0
- package/lib/cjs/components/drawer/drawer.js.map +1 -0
- package/lib/cjs/components/drawer/index.js +6 -0
- package/lib/cjs/components/drawer/index.js.map +1 -0
- package/lib/cjs/components/drawer/types.js +3 -0
- package/lib/cjs/components/drawer/types.js.map +1 -0
- package/lib/cjs/components/dropdown/dropdown.js +403 -0
- package/lib/cjs/components/dropdown/dropdown.js.map +1 -0
- package/lib/cjs/components/dropdown/index.js +6 -0
- package/lib/cjs/components/dropdown/index.js.map +1 -0
- package/lib/cjs/components/dropdown/types.js +3 -0
- package/lib/cjs/components/dropdown/types.js.map +1 -0
- package/lib/cjs/components/image-input/image-input.js +191 -0
- package/lib/cjs/components/image-input/image-input.js.map +1 -0
- package/lib/cjs/components/image-input/index.js +6 -0
- package/lib/cjs/components/image-input/index.js.map +1 -0
- package/lib/cjs/components/image-input/types.js +3 -0
- package/lib/cjs/components/image-input/types.js.map +1 -0
- package/lib/cjs/components/menu/index.js +6 -0
- package/lib/cjs/components/menu/index.js.map +1 -0
- package/lib/cjs/components/menu/menu.js +1021 -0
- package/lib/cjs/components/menu/menu.js.map +1 -0
- package/lib/cjs/components/menu/types.js +3 -0
- package/lib/cjs/components/menu/types.js.map +1 -0
- package/lib/cjs/components/modal/index.js +6 -0
- package/lib/cjs/components/modal/index.js.map +1 -0
- package/lib/cjs/components/modal/modal.js +316 -0
- package/lib/cjs/components/modal/modal.js.map +1 -0
- package/lib/cjs/components/modal/types.js +3 -0
- package/lib/cjs/components/modal/types.js.map +1 -0
- package/lib/cjs/components/reparent/index.js +6 -0
- package/lib/cjs/components/reparent/index.js.map +1 -0
- package/lib/cjs/components/reparent/reparent.js +93 -0
- package/lib/cjs/components/reparent/reparent.js.map +1 -0
- package/lib/cjs/components/reparent/types.js +3 -0
- package/lib/cjs/components/reparent/types.js.map +1 -0
- package/lib/cjs/components/scrollable/index.js +6 -0
- package/lib/cjs/components/scrollable/index.js.map +1 -0
- package/lib/cjs/components/scrollable/scrollable.js +259 -0
- package/lib/cjs/components/scrollable/scrollable.js.map +1 -0
- package/lib/cjs/components/scrollable/types.js +3 -0
- package/lib/cjs/components/scrollable/types.js.map +1 -0
- package/lib/cjs/components/scrollspy/index.js +6 -0
- package/lib/cjs/components/scrollspy/index.js.map +1 -0
- package/lib/cjs/components/scrollspy/scrollspy.js +174 -0
- package/lib/cjs/components/scrollspy/scrollspy.js.map +1 -0
- package/lib/cjs/components/scrollspy/types.js +3 -0
- package/lib/cjs/components/scrollspy/types.js.map +1 -0
- package/lib/cjs/components/scrollto/index.js +6 -0
- package/lib/cjs/components/scrollto/index.js.map +1 -0
- package/lib/cjs/components/scrollto/scrollto.js +103 -0
- package/lib/cjs/components/scrollto/scrollto.js.map +1 -0
- package/lib/cjs/components/scrollto/types.js +3 -0
- package/lib/cjs/components/scrollto/types.js.map +1 -0
- package/lib/cjs/components/stepper/index.js +6 -0
- package/lib/cjs/components/stepper/index.js.map +1 -0
- package/lib/cjs/components/stepper/stepper.js +258 -0
- package/lib/cjs/components/stepper/stepper.js.map +1 -0
- package/lib/cjs/components/stepper/types.js +3 -0
- package/lib/cjs/components/stepper/types.js.map +1 -0
- package/lib/cjs/components/sticky/index.js +6 -0
- package/lib/cjs/components/sticky/index.js.map +1 -0
- package/lib/cjs/components/sticky/sticky.js +297 -0
- package/lib/cjs/components/sticky/sticky.js.map +1 -0
- package/lib/cjs/components/sticky/types.js +3 -0
- package/lib/cjs/components/sticky/types.js.map +1 -0
- package/lib/cjs/components/tabs/index.js +6 -0
- package/lib/cjs/components/tabs/index.js.map +1 -0
- package/lib/cjs/components/tabs/tabs.js +146 -0
- package/lib/cjs/components/tabs/tabs.js.map +1 -0
- package/lib/cjs/components/tabs/types.js +3 -0
- package/lib/cjs/components/tabs/types.js.map +1 -0
- package/lib/cjs/components/theme/index.js +6 -0
- package/lib/cjs/components/theme/index.js.map +1 -0
- package/lib/cjs/components/theme/theme.js +147 -0
- package/lib/cjs/components/theme/theme.js.map +1 -0
- package/lib/cjs/components/theme/types.js +3 -0
- package/lib/cjs/components/theme/types.js.map +1 -0
- package/lib/cjs/components/toggle/index.js +6 -0
- package/lib/cjs/components/toggle/index.js.map +1 -0
- package/lib/cjs/components/toggle/toggle.js +139 -0
- package/lib/cjs/components/toggle/toggle.js.map +1 -0
- package/lib/cjs/components/toggle/types.js +3 -0
- package/lib/cjs/components/toggle/types.js.map +1 -0
- package/lib/cjs/components/toggle-password/index.js +6 -0
- package/lib/cjs/components/toggle-password/index.js.map +1 -0
- package/lib/cjs/components/toggle-password/toggle-password.js +131 -0
- package/lib/cjs/components/toggle-password/toggle-password.js.map +1 -0
- package/lib/cjs/components/toggle-password/types.js +3 -0
- package/lib/cjs/components/toggle-password/types.js.map +1 -0
- package/lib/cjs/components/tooltip/index.js +6 -0
- package/lib/cjs/components/tooltip/index.js.map +1 -0
- package/lib/cjs/components/tooltip/tooltip.js +271 -0
- package/lib/cjs/components/tooltip/tooltip.js.map +1 -0
- package/lib/cjs/components/tooltip/types.js +3 -0
- package/lib/cjs/components/tooltip/types.js.map +1 -0
- package/lib/cjs/helpers/data.js +33 -0
- package/lib/cjs/helpers/data.js.map +1 -0
- package/lib/cjs/helpers/dom.js +297 -0
- package/lib/cjs/helpers/dom.js.map +1 -0
- package/lib/cjs/helpers/event-handler.js +36 -0
- package/lib/cjs/helpers/event-handler.js.map +1 -0
- package/lib/cjs/helpers/utils.js +94 -0
- package/lib/cjs/helpers/utils.js.map +1 -0
- package/lib/cjs/index.js +105 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/types.js +3 -0
- package/lib/cjs/types.js.map +1 -0
- package/lib/esm/components/accordion/accordion.js +165 -0
- package/lib/esm/components/accordion/accordion.js.map +1 -0
- package/lib/esm/components/accordion/index.js +2 -0
- package/lib/esm/components/accordion/index.js.map +1 -0
- package/lib/esm/components/accordion/types.js +2 -0
- package/lib/esm/components/accordion/types.js.map +1 -0
- package/lib/esm/components/collapse/collapse.js +166 -0
- package/lib/esm/components/collapse/collapse.js.map +1 -0
- package/lib/esm/components/collapse/index.js +2 -0
- package/lib/esm/components/collapse/index.js.map +1 -0
- package/lib/esm/components/collapse/types.js +2 -0
- package/lib/esm/components/collapse/types.js.map +1 -0
- package/lib/esm/components/component.js +133 -0
- package/lib/esm/components/component.js.map +1 -0
- package/lib/esm/components/config.js +24 -0
- package/lib/esm/components/config.js.map +1 -0
- package/lib/esm/components/config.umd.js +23 -0
- package/lib/esm/components/config.umd.js.map +1 -0
- package/lib/esm/components/constants.js +12 -0
- package/lib/esm/components/constants.js.map +1 -0
- package/lib/esm/components/datatable/datatable.js +1461 -0
- package/lib/esm/components/datatable/datatable.js.map +1 -0
- package/lib/esm/components/datatable/index.js +2 -0
- package/lib/esm/components/datatable/index.js.map +1 -0
- package/lib/esm/components/datatable/types.js +2 -0
- package/lib/esm/components/datatable/types.js.map +1 -0
- package/lib/esm/components/dismiss/dismiss.js +128 -0
- package/lib/esm/components/dismiss/dismiss.js.map +1 -0
- package/lib/esm/components/dismiss/index.js +2 -0
- package/lib/esm/components/dismiss/index.js.map +1 -0
- package/lib/esm/components/dismiss/types.js +2 -0
- package/lib/esm/components/dismiss/types.js.map +1 -0
- package/lib/esm/components/drawer/drawer.js +344 -0
- package/lib/esm/components/drawer/drawer.js.map +1 -0
- package/lib/esm/components/drawer/index.js +2 -0
- package/lib/esm/components/drawer/index.js.map +1 -0
- package/lib/esm/components/drawer/types.js +2 -0
- package/lib/esm/components/drawer/types.js.map +1 -0
- package/lib/esm/components/dropdown/dropdown.js +400 -0
- package/lib/esm/components/dropdown/dropdown.js.map +1 -0
- package/lib/esm/components/dropdown/index.js +2 -0
- package/lib/esm/components/dropdown/index.js.map +1 -0
- package/lib/esm/components/dropdown/types.js +2 -0
- package/lib/esm/components/dropdown/types.js.map +1 -0
- package/lib/esm/components/image-input/image-input.js +188 -0
- package/lib/esm/components/image-input/image-input.js.map +1 -0
- package/lib/esm/components/image-input/index.js +2 -0
- package/lib/esm/components/image-input/index.js.map +1 -0
- package/lib/esm/components/image-input/types.js +2 -0
- package/lib/esm/components/image-input/types.js.map +1 -0
- package/lib/esm/components/menu/index.js +2 -0
- package/lib/esm/components/menu/index.js.map +1 -0
- package/lib/esm/components/menu/menu.js +1018 -0
- package/lib/esm/components/menu/menu.js.map +1 -0
- package/lib/esm/components/menu/types.js +2 -0
- package/lib/esm/components/menu/types.js.map +1 -0
- package/lib/esm/components/modal/index.js +2 -0
- package/lib/esm/components/modal/index.js.map +1 -0
- package/lib/esm/components/modal/modal.js +313 -0
- package/lib/esm/components/modal/modal.js.map +1 -0
- package/lib/esm/components/modal/types.js +2 -0
- package/lib/esm/components/modal/types.js.map +1 -0
- package/lib/esm/components/reparent/index.js +2 -0
- package/lib/esm/components/reparent/index.js.map +1 -0
- package/lib/esm/components/reparent/reparent.js +90 -0
- package/lib/esm/components/reparent/reparent.js.map +1 -0
- package/lib/esm/components/reparent/types.js +2 -0
- package/lib/esm/components/reparent/types.js.map +1 -0
- package/lib/esm/components/scrollable/index.js +2 -0
- package/lib/esm/components/scrollable/index.js.map +1 -0
- package/lib/esm/components/scrollable/scrollable.js +256 -0
- package/lib/esm/components/scrollable/scrollable.js.map +1 -0
- package/lib/esm/components/scrollable/types.js +2 -0
- package/lib/esm/components/scrollable/types.js.map +1 -0
- package/lib/esm/components/scrollspy/index.js +2 -0
- package/lib/esm/components/scrollspy/index.js.map +1 -0
- package/lib/esm/components/scrollspy/scrollspy.js +171 -0
- package/lib/esm/components/scrollspy/scrollspy.js.map +1 -0
- package/lib/esm/components/scrollspy/types.js +2 -0
- package/lib/esm/components/scrollspy/types.js.map +1 -0
- package/lib/esm/components/scrollto/index.js +2 -0
- package/lib/esm/components/scrollto/index.js.map +1 -0
- package/lib/esm/components/scrollto/scrollto.js +100 -0
- package/lib/esm/components/scrollto/scrollto.js.map +1 -0
- package/lib/esm/components/scrollto/types.js +2 -0
- package/lib/esm/components/scrollto/types.js.map +1 -0
- package/lib/esm/components/stepper/index.js +2 -0
- package/lib/esm/components/stepper/index.js.map +1 -0
- package/lib/esm/components/stepper/stepper.js +255 -0
- package/lib/esm/components/stepper/stepper.js.map +1 -0
- package/lib/esm/components/stepper/types.js +2 -0
- package/lib/esm/components/stepper/types.js.map +1 -0
- package/lib/esm/components/sticky/index.js +2 -0
- package/lib/esm/components/sticky/index.js.map +1 -0
- package/lib/esm/components/sticky/sticky.js +294 -0
- package/lib/esm/components/sticky/sticky.js.map +1 -0
- package/lib/esm/components/sticky/types.js +2 -0
- package/lib/esm/components/sticky/types.js.map +1 -0
- package/lib/esm/components/tabs/index.js +2 -0
- package/lib/esm/components/tabs/index.js.map +1 -0
- package/lib/esm/components/tabs/tabs.js +143 -0
- package/lib/esm/components/tabs/tabs.js.map +1 -0
- package/lib/esm/components/tabs/types.js +2 -0
- package/lib/esm/components/tabs/types.js.map +1 -0
- package/lib/esm/components/theme/index.js +2 -0
- package/lib/esm/components/theme/index.js.map +1 -0
- package/lib/esm/components/theme/theme.js +144 -0
- package/lib/esm/components/theme/theme.js.map +1 -0
- package/lib/esm/components/theme/types.js +2 -0
- package/lib/esm/components/theme/types.js.map +1 -0
- package/lib/esm/components/toggle/index.js +2 -0
- package/lib/esm/components/toggle/index.js.map +1 -0
- package/lib/esm/components/toggle/toggle.js +136 -0
- package/lib/esm/components/toggle/toggle.js.map +1 -0
- package/lib/esm/components/toggle/types.js +2 -0
- package/lib/esm/components/toggle/types.js.map +1 -0
- package/lib/esm/components/toggle-password/index.js +2 -0
- package/lib/esm/components/toggle-password/index.js.map +1 -0
- package/lib/esm/components/toggle-password/toggle-password.js +128 -0
- package/lib/esm/components/toggle-password/toggle-password.js.map +1 -0
- package/lib/esm/components/toggle-password/types.js +2 -0
- package/lib/esm/components/toggle-password/types.js.map +1 -0
- package/lib/esm/components/tooltip/index.js +2 -0
- package/lib/esm/components/tooltip/index.js.map +1 -0
- package/lib/esm/components/tooltip/tooltip.js +268 -0
- package/lib/esm/components/tooltip/tooltip.js.map +1 -0
- package/lib/esm/components/tooltip/types.js +2 -0
- package/lib/esm/components/tooltip/types.js.map +1 -0
- package/lib/esm/helpers/data.js +31 -0
- package/lib/esm/helpers/data.js.map +1 -0
- package/lib/esm/helpers/dom.js +295 -0
- package/lib/esm/helpers/dom.js.map +1 -0
- package/lib/esm/helpers/event-handler.js +34 -0
- package/lib/esm/helpers/event-handler.js.map +1 -0
- package/lib/esm/helpers/utils.js +92 -0
- package/lib/esm/helpers/utils.js.map +1 -0
- package/lib/esm/index.js +79 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/types.js +2 -0
- package/lib/esm/types.js.map +1 -0
- package/package.json +85 -0
- package/prettier.config.js +9 -0
- package/src/components/accordion/accordion-menu.css +51 -0
- package/src/components/accordion/accordion.css +86 -0
- package/src/components/accordion/accordion.ts +221 -0
- package/src/components/accordion/index.ts +7 -0
- package/src/components/accordion/types.ts +16 -0
- package/src/components/alert/alert.css +282 -0
- package/src/components/avatar/avatar.css +46 -0
- package/src/components/badge/badge.css +176 -0
- package/src/components/breadcrumb/breadcrumb.css +38 -0
- package/src/components/btn/btn.css +227 -0
- package/src/components/card/card.css +158 -0
- package/src/components/checkbox/checkbox.css +74 -0
- package/src/components/collapse/collapse.css +14 -0
- package/src/components/collapse/collapse.ts +200 -0
- package/src/components/collapse/index.ts +7 -0
- package/src/components/collapse/types.ts +16 -0
- package/src/components/component.ts +132 -0
- package/src/components/constants.ts +16 -0
- package/src/components/datatable/datatable-checkbox.ts +236 -0
- package/src/components/datatable/datatable-sort.ts +154 -0
- package/src/components/datatable/datatable.css +110 -0
- package/src/components/datatable/datatable.ts +1657 -0
- package/src/components/datatable/index.ts +19 -0
- package/src/components/datatable/types.ts +203 -0
- package/src/components/datepicker/calendar.ts +1397 -0
- package/src/components/datepicker/config.ts +368 -0
- package/src/components/datepicker/datepicker.css +7 -0
- package/src/components/datepicker/datepicker.ts +1287 -0
- package/src/components/datepicker/dropdown.ts +757 -0
- package/src/components/datepicker/events.ts +149 -0
- package/src/components/datepicker/index.ts +10 -0
- package/src/components/datepicker/keyboard.ts +646 -0
- package/src/components/datepicker/locales.ts +80 -0
- package/src/components/datepicker/templates.ts +792 -0
- package/src/components/datepicker/types.ts +154 -0
- package/src/components/datepicker/utils.ts +631 -0
- package/src/components/dismiss/dismiss.css +10 -0
- package/src/components/dismiss/dismiss.ts +152 -0
- package/src/components/dismiss/index.ts +7 -0
- package/src/components/dismiss/types.ts +17 -0
- package/src/components/drawer/drawer.css +97 -0
- package/src/components/drawer/drawer.ts +437 -0
- package/src/components/drawer/index.ts +7 -0
- package/src/components/drawer/types.ts +25 -0
- package/src/components/dropdown/dropdown-menu.css +56 -0
- package/src/components/dropdown/dropdown.css +46 -0
- package/src/components/dropdown/dropdown.ts +549 -0
- package/src/components/dropdown/index.ts +7 -0
- package/src/components/dropdown/types.ts +28 -0
- package/src/components/form/form.css +54 -0
- package/src/components/image-input/image-input.css +56 -0
- package/src/components/image-input/image-input.ts +249 -0
- package/src/components/image-input/index.ts +10 -0
- package/src/components/image-input/types.ts +12 -0
- package/src/components/input/input-group.css +42 -0
- package/src/components/input/input.css +136 -0
- package/src/components/kbd/kbd.css +30 -0
- package/src/components/label/label.css +20 -0
- package/src/components/link/link.css +81 -0
- package/src/components/modal/index.ts +7 -0
- package/src/components/modal/modal.css +73 -0
- package/src/components/modal/modal.ts +382 -0
- package/src/components/modal/types.ts +21 -0
- package/src/components/pagination/pagination.css +26 -0
- package/src/components/popover/popover.css +22 -0
- package/src/components/progress/progress.css +51 -0
- package/src/components/radio/radio.css +51 -0
- package/src/components/reparent/index.ts +7 -0
- package/src/components/reparent/reparent.ts +109 -0
- package/src/components/reparent/types.ts +15 -0
- package/src/components/scrollable/index.ts +10 -0
- package/src/components/scrollable/scrollable.css +29 -0
- package/src/components/scrollable/scrollable.ts +297 -0
- package/src/components/scrollable/types.ts +16 -0
- package/src/components/scrollspy/index.ts +7 -0
- package/src/components/scrollspy/scrollspy.css +13 -0
- package/src/components/scrollspy/scrollspy.ts +224 -0
- package/src/components/scrollspy/types.ts +15 -0
- package/src/components/scrollto/index.ts +7 -0
- package/src/components/scrollto/scrollto.ts +127 -0
- package/src/components/scrollto/types.ts +15 -0
- package/src/components/select/combobox.ts +305 -0
- package/src/components/select/config.ts +324 -0
- package/src/components/select/dropdown.ts +510 -0
- package/src/components/select/index.ts +13 -0
- package/src/components/select/option.ts +43 -0
- package/src/components/select/remote.ts +477 -0
- package/src/components/select/search.ts +430 -0
- package/src/components/select/select.css +105 -0
- package/src/components/select/select.ts +1916 -0
- package/src/components/select/tags.ts +123 -0
- package/src/components/select/templates.ts +531 -0
- package/src/components/select/types.ts +36 -0
- package/src/components/select/utils.ts +747 -0
- package/src/components/select/variants.css +5 -0
- package/src/components/separator/separator.css +14 -0
- package/src/components/skeleton/skeleton.css +10 -0
- package/src/components/stepper/index.ts +7 -0
- package/src/components/stepper/stepper.css +49 -0
- package/src/components/stepper/stepper.ts +308 -0
- package/src/components/stepper/types.ts +13 -0
- package/src/components/sticky/index.ts +7 -0
- package/src/components/sticky/sticky.css +22 -0
- package/src/components/sticky/sticky.ts +381 -0
- package/src/components/sticky/types.ts +23 -0
- package/src/components/switch/switch.css +110 -0
- package/src/components/table/table.css +168 -0
- package/src/components/tabs/index.ts +7 -0
- package/src/components/tabs/tabs.css +40 -0
- package/src/components/tabs/tabs.ts +190 -0
- package/src/components/tabs/types.ts +13 -0
- package/src/components/textarea/textarea.css +35 -0
- package/src/components/theme-switch/index.ts +10 -0
- package/src/components/theme-switch/theme-switch.css +22 -0
- package/src/components/theme-switch/theme-switch.ts +176 -0
- package/src/components/theme-switch/types.ts +15 -0
- package/src/components/toggle/index.ts +7 -0
- package/src/components/toggle/toggle.css +13 -0
- package/src/components/toggle/toggle.ts +173 -0
- package/src/components/toggle/types.ts +18 -0
- package/src/components/toggle-group/toggle-group.css +55 -0
- package/src/components/toggle-password/index.ts +10 -0
- package/src/components/toggle-password/toggle-password.css +13 -0
- package/src/components/toggle-password/toggle-password.ts +159 -0
- package/src/components/toggle-password/types.ts +13 -0
- package/src/components/tooltip/index.ts +7 -0
- package/src/components/tooltip/tooltip.css +18 -0
- package/src/components/tooltip/tooltip.ts +361 -0
- package/src/components/tooltip/types.ts +28 -0
- package/src/helpers/data.ts +46 -0
- package/src/helpers/dom.ts +405 -0
- package/src/helpers/event-handler.ts +61 -0
- package/src/helpers/utils.ts +183 -0
- package/src/index.ts +113 -0
- package/src/types.ts +23 -0
- package/styles.css +48 -0
- package/tsconfig.json +17 -0
- 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
|
+
}
|