@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,224 @@
|
|
|
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 KTData from '../../helpers/data';
|
|
7
|
+
import KTDom from '../../helpers/dom';
|
|
8
|
+
import KTEventHandler from '../../helpers/event-handler';
|
|
9
|
+
import KTComponent from '../component';
|
|
10
|
+
import { KTScrollspyInterface, KTScrollspyConfigInterface } from './types';
|
|
11
|
+
|
|
12
|
+
declare global {
|
|
13
|
+
interface Window {
|
|
14
|
+
KT_SCROLLSPY_INITIALIZED: boolean;
|
|
15
|
+
KTScrollspy: typeof KTScrollspy;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class KTScrollspy extends KTComponent implements KTScrollspyInterface {
|
|
20
|
+
protected override _name: string = 'scrollspy';
|
|
21
|
+
protected override _defaultConfig: KTScrollspyConfigInterface = {
|
|
22
|
+
target: 'body',
|
|
23
|
+
offset: 0,
|
|
24
|
+
smooth: true,
|
|
25
|
+
};
|
|
26
|
+
protected override _config: KTScrollspyConfigInterface = this._defaultConfig;
|
|
27
|
+
protected _targetElement: HTMLElement | Document | null = null;
|
|
28
|
+
protected _anchorElements: NodeListOf<HTMLElement> | null = null;
|
|
29
|
+
|
|
30
|
+
constructor(element: HTMLElement, config?: KTScrollspyConfigInterface) {
|
|
31
|
+
super();
|
|
32
|
+
|
|
33
|
+
if (KTData.has(element as HTMLElement, this._name)) return;
|
|
34
|
+
|
|
35
|
+
this._init(element);
|
|
36
|
+
this._buildConfig(config);
|
|
37
|
+
|
|
38
|
+
if (!this._element) return;
|
|
39
|
+
|
|
40
|
+
const targetElement =
|
|
41
|
+
this._getTarget() === 'body'
|
|
42
|
+
? document
|
|
43
|
+
: KTDom.getElement(this._getTarget());
|
|
44
|
+
if (!targetElement) return;
|
|
45
|
+
|
|
46
|
+
this._targetElement = targetElement;
|
|
47
|
+
|
|
48
|
+
this._anchorElements = this._element.querySelectorAll(
|
|
49
|
+
'[data-kt-scrollspy-anchor]',
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
if (!this._anchorElements) return;
|
|
53
|
+
|
|
54
|
+
this._handlers();
|
|
55
|
+
this._update();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private _getTarget(): string {
|
|
59
|
+
return (
|
|
60
|
+
(this._element.getAttribute('data-kt-scrollspy-target') as string) ||
|
|
61
|
+
(this._getOption('target') as string)
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
protected _handlers(): void {
|
|
66
|
+
if (!this._anchorElements) return;
|
|
67
|
+
|
|
68
|
+
this._targetElement.addEventListener('scroll', () => {
|
|
69
|
+
this._anchorElements.forEach((anchorElement) => {
|
|
70
|
+
this._updateAnchor(anchorElement);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
KTEventHandler.on(
|
|
75
|
+
this._element,
|
|
76
|
+
'[data-kt-scrollspy-anchor]',
|
|
77
|
+
'click',
|
|
78
|
+
(event: Event, target: HTMLElement) => {
|
|
79
|
+
event.preventDefault();
|
|
80
|
+
this._scrollTo(target);
|
|
81
|
+
},
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
protected _scrollTo(anchorElement: HTMLElement): void {
|
|
86
|
+
if (!anchorElement) return;
|
|
87
|
+
|
|
88
|
+
const sectionElement = KTDom.getElement(anchorElement.getAttribute('href'));
|
|
89
|
+
if (!sectionElement) return;
|
|
90
|
+
|
|
91
|
+
const targetElement =
|
|
92
|
+
this._targetElement === document ? window : this._targetElement;
|
|
93
|
+
if (!targetElement) return;
|
|
94
|
+
|
|
95
|
+
let offset = parseInt(this._getOption('offset') as string);
|
|
96
|
+
if (anchorElement.getAttribute('data-kt-scrollspy-anchor-offset')) {
|
|
97
|
+
offset = parseInt(
|
|
98
|
+
anchorElement.getAttribute('data-kt-scrollspy-anchor-offset') as string,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const scrollTop = sectionElement.offsetTop - offset;
|
|
103
|
+
|
|
104
|
+
if ('scrollTo' in targetElement) {
|
|
105
|
+
targetElement.scrollTo({
|
|
106
|
+
top: scrollTop,
|
|
107
|
+
left: 0,
|
|
108
|
+
behavior: this._getOption('smooth') ? 'smooth' : 'instant',
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
protected _updateAnchor(anchorElement: HTMLElement): void {
|
|
114
|
+
const sectionElement = KTDom.getElement(anchorElement.getAttribute('href'));
|
|
115
|
+
if (!sectionElement) return;
|
|
116
|
+
|
|
117
|
+
if (!KTDom.isVisible(anchorElement)) return;
|
|
118
|
+
|
|
119
|
+
if (!this._anchorElements) return;
|
|
120
|
+
|
|
121
|
+
const scrollPosition =
|
|
122
|
+
this._targetElement === document
|
|
123
|
+
? document.documentElement.scrollTop || document.body.scrollTop
|
|
124
|
+
: (this._targetElement as HTMLElement).scrollTop;
|
|
125
|
+
|
|
126
|
+
let offset = parseInt(this._getOption('offset') as string);
|
|
127
|
+
if (anchorElement.getAttribute('data-kt-scrollspy-anchor-offset')) {
|
|
128
|
+
offset = parseInt(
|
|
129
|
+
anchorElement.getAttribute('data-kt-scrollspy-anchor-offset') as string,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const offsetTop = sectionElement.offsetTop;
|
|
134
|
+
|
|
135
|
+
if (scrollPosition + offset >= offsetTop) {
|
|
136
|
+
this._anchorElements.forEach((anchorElement) => {
|
|
137
|
+
anchorElement.classList.remove('active');
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const payload = { element: anchorElement };
|
|
141
|
+
this._fireEvent('activate', payload);
|
|
142
|
+
this._dispatchEvent('activate', payload);
|
|
143
|
+
|
|
144
|
+
anchorElement.classList.add('active');
|
|
145
|
+
|
|
146
|
+
const parentAnchorElements = KTDom.parents(
|
|
147
|
+
anchorElement,
|
|
148
|
+
'[data-kt-scrollspy-group]',
|
|
149
|
+
);
|
|
150
|
+
if (parentAnchorElements) {
|
|
151
|
+
parentAnchorElements.forEach((parentAnchorElement) => {
|
|
152
|
+
parentAnchorElement
|
|
153
|
+
.querySelector('[data-kt-scrollspy-anchor]')
|
|
154
|
+
?.classList.add('active');
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
protected _update() {
|
|
161
|
+
if (!this._anchorElements) return;
|
|
162
|
+
|
|
163
|
+
this._anchorElements.forEach((anchorElement) => {
|
|
164
|
+
this._updateAnchor(anchorElement);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
protected _isActive(anchorElement: HTMLElement): boolean {
|
|
169
|
+
return anchorElement.classList.contains('active');
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
public updateAnchor(anchorElement: HTMLElement): void {
|
|
173
|
+
this._updateAnchor(anchorElement);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public isActive(anchorElement: HTMLElement): boolean {
|
|
177
|
+
return this._isActive(anchorElement);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public update(): void {
|
|
181
|
+
this.update();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
public scrollTo(anchorElement: HTMLElement): void {
|
|
185
|
+
this._scrollTo(anchorElement);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public static getInstance(element: HTMLElement): KTScrollspy {
|
|
189
|
+
if (!element) return null;
|
|
190
|
+
|
|
191
|
+
if (KTData.has(element, 'scrollspy')) {
|
|
192
|
+
return KTData.get(element, 'scrollspy') as KTScrollspy;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (element.getAttribute('data-kt-scrollspy')) {
|
|
196
|
+
return new KTScrollspy(element);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
public static getOrCreateInstance(
|
|
203
|
+
element: HTMLElement,
|
|
204
|
+
config?: KTScrollspyConfigInterface,
|
|
205
|
+
): KTScrollspy {
|
|
206
|
+
return this.getInstance(element) || new KTScrollspy(element, config);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
public static createInstances(): void {
|
|
210
|
+
const elements = document.querySelectorAll('[data-kt-scrollspy]');
|
|
211
|
+
|
|
212
|
+
elements.forEach((element) => {
|
|
213
|
+
new KTScrollspy(element as HTMLElement);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public static init(): void {
|
|
218
|
+
KTScrollspy.createInstances();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (typeof window !== 'undefined') {
|
|
223
|
+
window.KTScrollspy = KTScrollspy;
|
|
224
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
|
|
3
|
+
* Copyright 2025 by Keenthemes Inc
|
|
4
|
+
* @version: 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
export interface KTScrollspyConfigInterface {
|
|
7
|
+
target: string;
|
|
8
|
+
smooth: boolean;
|
|
9
|
+
offset: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface KTScrollspyInterface {
|
|
13
|
+
update(anchorElement: HTMLElement, event: Event): void;
|
|
14
|
+
scrollTo(anchorElement: HTMLElement): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
|
|
3
|
+
* Copyright 2025 by Keenthemes Inc
|
|
4
|
+
* @version: 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
/* eslint-disable max-len */
|
|
7
|
+
/* eslint-disable require-jsdoc */
|
|
8
|
+
|
|
9
|
+
import KTData from '../../helpers/data';
|
|
10
|
+
import KTDom from '../../helpers/dom';
|
|
11
|
+
import KTComponent from '../component';
|
|
12
|
+
import { KTScrolltoInterface, KTScrolltoConfigInterface } from './types';
|
|
13
|
+
|
|
14
|
+
declare global {
|
|
15
|
+
interface Window {
|
|
16
|
+
KT_SCROLLTO_INITIALIZED: boolean;
|
|
17
|
+
KTScrollto: typeof KTScrollto;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class KTScrollto extends KTComponent implements KTScrolltoInterface {
|
|
22
|
+
protected override _name: string = 'scrollto';
|
|
23
|
+
protected override _defaultConfig: KTScrolltoConfigInterface = {
|
|
24
|
+
smooth: true,
|
|
25
|
+
parent: 'body',
|
|
26
|
+
target: '',
|
|
27
|
+
offset: 0,
|
|
28
|
+
};
|
|
29
|
+
protected override _config: KTScrolltoConfigInterface = this._defaultConfig;
|
|
30
|
+
protected _targetElement: HTMLElement;
|
|
31
|
+
|
|
32
|
+
constructor(element: HTMLElement, config?: KTScrolltoConfigInterface) {
|
|
33
|
+
super();
|
|
34
|
+
|
|
35
|
+
if (KTData.has(element as HTMLElement, this._name)) return;
|
|
36
|
+
|
|
37
|
+
this._init(element);
|
|
38
|
+
this._buildConfig(config);
|
|
39
|
+
|
|
40
|
+
if (!this._element) return;
|
|
41
|
+
|
|
42
|
+
this._targetElement = this._getTargetElement();
|
|
43
|
+
|
|
44
|
+
if (!this._targetElement) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
this._handlers();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private _getTargetElement(): HTMLElement | null {
|
|
52
|
+
return (
|
|
53
|
+
KTDom.getElement(
|
|
54
|
+
this._element.getAttribute('data-kt-scrollto') as string,
|
|
55
|
+
) || KTDom.getElement(this._getOption('target') as string)
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
protected _handlers(): void {
|
|
60
|
+
if (!this._element) return;
|
|
61
|
+
|
|
62
|
+
this._element.addEventListener('click', (event: Event) => {
|
|
63
|
+
event.preventDefault();
|
|
64
|
+
this._scroll();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected _scroll(): void {
|
|
69
|
+
const pos =
|
|
70
|
+
this._targetElement.offsetTop +
|
|
71
|
+
parseInt(this._getOption('offset') as string);
|
|
72
|
+
|
|
73
|
+
let parent: HTMLElement | Window = KTDom.getElement(
|
|
74
|
+
this._getOption('parent') as string,
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
if (!parent || parent === document.body) {
|
|
78
|
+
parent = window;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
parent.scrollTo({
|
|
82
|
+
top: pos,
|
|
83
|
+
behavior: (this._getOption('smooth') as boolean) ? 'smooth' : 'instant',
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public scroll(): void {
|
|
88
|
+
this._scroll();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public static getInstance(element: HTMLElement): KTScrollto {
|
|
92
|
+
if (!element) return null;
|
|
93
|
+
|
|
94
|
+
if (KTData.has(element, 'scrollto')) {
|
|
95
|
+
return KTData.get(element, 'scrollto') as KTScrollto;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (element.getAttribute('data-kt-scrollto')) {
|
|
99
|
+
return new KTScrollto(element);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public static getOrCreateInstance(
|
|
106
|
+
element: HTMLElement,
|
|
107
|
+
config?: KTScrolltoConfigInterface,
|
|
108
|
+
): KTScrollto {
|
|
109
|
+
return this.getInstance(element) || new KTScrollto(element, config);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public static createInstances(): void {
|
|
113
|
+
const elements = document.querySelectorAll('[data-kt-scrollto]');
|
|
114
|
+
|
|
115
|
+
elements.forEach((element) => {
|
|
116
|
+
new KTScrollto(element as HTMLElement);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public static init(): void {
|
|
121
|
+
KTScrollto.createInstances();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (typeof window !== 'undefined') {
|
|
126
|
+
window.KTScrollto = KTScrollto;
|
|
127
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
|
|
3
|
+
* Copyright 2025 by Keenthemes Inc
|
|
4
|
+
* @version: 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
export interface KTScrolltoConfigInterface {
|
|
7
|
+
smooth: boolean;
|
|
8
|
+
parent: string;
|
|
9
|
+
target: string;
|
|
10
|
+
offset: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface KTScrolltoInterface {
|
|
14
|
+
scroll(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
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 { KTSelectConfigInterface } from './config';
|
|
7
|
+
import { KTSelect } from './select';
|
|
8
|
+
import { handleDropdownKeyNavigation } from './utils';
|
|
9
|
+
import { SelectMode } from './types';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* KTSelectCombobox - Handles combobox-specific functionality for KTSelect
|
|
13
|
+
*/
|
|
14
|
+
export class KTSelectCombobox {
|
|
15
|
+
private _select: KTSelect;
|
|
16
|
+
private _config: KTSelectConfigInterface;
|
|
17
|
+
private _searchInputElement: HTMLInputElement;
|
|
18
|
+
private _clearButtonElement: HTMLElement | null;
|
|
19
|
+
private _boundKeyNavHandler: (event: KeyboardEvent) => void;
|
|
20
|
+
private _boundInputHandler: (event: Event) => void;
|
|
21
|
+
private _boundClearHandler: (event: MouseEvent) => void;
|
|
22
|
+
|
|
23
|
+
constructor(select: KTSelect) {
|
|
24
|
+
this._select = select;
|
|
25
|
+
this._config = select.getConfig();
|
|
26
|
+
|
|
27
|
+
// Get the display element (could be the input directly or a parent div)
|
|
28
|
+
const displayElement = select.getValueDisplayElement();
|
|
29
|
+
|
|
30
|
+
// Find the input element - either it's the display element itself or a child
|
|
31
|
+
this._searchInputElement =
|
|
32
|
+
displayElement.tagName === 'INPUT'
|
|
33
|
+
? (displayElement as HTMLInputElement)
|
|
34
|
+
: displayElement.querySelector('input[data-kt-select-search]');
|
|
35
|
+
|
|
36
|
+
// Find the clear button
|
|
37
|
+
this._clearButtonElement =
|
|
38
|
+
displayElement.tagName === 'DIV'
|
|
39
|
+
? displayElement.querySelector('[data-kt-select-clear-button]')
|
|
40
|
+
: null;
|
|
41
|
+
|
|
42
|
+
// Create bound handler references to allow proper cleanup
|
|
43
|
+
this._boundKeyNavHandler = this._handleComboboxKeyNav.bind(this);
|
|
44
|
+
this._boundInputHandler = this._handleComboboxInput.bind(this);
|
|
45
|
+
this._boundClearHandler = this._handleClearButtonClick.bind(this);
|
|
46
|
+
|
|
47
|
+
// Attach event listeners
|
|
48
|
+
this._attachEventListeners();
|
|
49
|
+
|
|
50
|
+
if (this._config.debug) console.log('KTSelectCombobox initialized');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Attach event listeners specific to combobox
|
|
55
|
+
*/
|
|
56
|
+
private _attachEventListeners(): void {
|
|
57
|
+
// First remove any existing listeners to prevent duplicates
|
|
58
|
+
this._removeEventListeners();
|
|
59
|
+
|
|
60
|
+
// Add input event handler to filter options as user types
|
|
61
|
+
this._searchInputElement.addEventListener('input', this._boundInputHandler);
|
|
62
|
+
|
|
63
|
+
// Add keyboard navigation for the combobox
|
|
64
|
+
this._searchInputElement.addEventListener(
|
|
65
|
+
'keydown',
|
|
66
|
+
this._boundKeyNavHandler,
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
// Add clear button click event listener
|
|
70
|
+
if (this._clearButtonElement) {
|
|
71
|
+
this._clearButtonElement.addEventListener(
|
|
72
|
+
'click',
|
|
73
|
+
this._boundClearHandler,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (this._config.debug)
|
|
78
|
+
console.log(
|
|
79
|
+
'Combobox event listeners attached to:',
|
|
80
|
+
this._searchInputElement,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Remove event listeners to prevent memory leaks or duplicates
|
|
86
|
+
*/
|
|
87
|
+
private _removeEventListeners(): void {
|
|
88
|
+
if (this._searchInputElement) {
|
|
89
|
+
this._searchInputElement.removeEventListener(
|
|
90
|
+
'input',
|
|
91
|
+
this._boundInputHandler,
|
|
92
|
+
);
|
|
93
|
+
this._searchInputElement.removeEventListener(
|
|
94
|
+
'keydown',
|
|
95
|
+
this._boundKeyNavHandler,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (this._clearButtonElement) {
|
|
100
|
+
this._clearButtonElement.removeEventListener(
|
|
101
|
+
'click',
|
|
102
|
+
this._boundClearHandler,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Handle combobox input events
|
|
109
|
+
*/
|
|
110
|
+
private _handleComboboxInput(event: Event): void {
|
|
111
|
+
const inputElement = event.target as HTMLInputElement;
|
|
112
|
+
const query = inputElement.value.toLowerCase();
|
|
113
|
+
|
|
114
|
+
if (this._config.debug) console.log('Combobox input event, query:', query);
|
|
115
|
+
|
|
116
|
+
// Toggle clear button visibility based on input value
|
|
117
|
+
this._toggleClearButtonVisibility(query);
|
|
118
|
+
|
|
119
|
+
// If dropdown isn't open, open it when user starts typing
|
|
120
|
+
if (!(this._select as any)._dropdownIsOpen) {
|
|
121
|
+
this._select.openDropdown();
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Filter options based on input
|
|
125
|
+
this._filterOptionsForCombobox(query);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Handle clear button click
|
|
130
|
+
*/
|
|
131
|
+
private _handleClearButtonClick(event: MouseEvent): void {
|
|
132
|
+
event.preventDefault();
|
|
133
|
+
event.stopPropagation();
|
|
134
|
+
|
|
135
|
+
// Clear the input
|
|
136
|
+
this._searchInputElement.value = '';
|
|
137
|
+
|
|
138
|
+
// Hide the clear button
|
|
139
|
+
this._toggleClearButtonVisibility('');
|
|
140
|
+
|
|
141
|
+
// Show all options and open dropdown
|
|
142
|
+
this._select.showAllOptions();
|
|
143
|
+
this._select.openDropdown();
|
|
144
|
+
|
|
145
|
+
// Clear the current selection
|
|
146
|
+
this._select.clearSelection();
|
|
147
|
+
|
|
148
|
+
// Focus on the input
|
|
149
|
+
this._searchInputElement.focus();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Toggle clear button visibility based on input value
|
|
154
|
+
*/
|
|
155
|
+
private _toggleClearButtonVisibility(value: string): void {
|
|
156
|
+
if (!this._clearButtonElement) return;
|
|
157
|
+
|
|
158
|
+
if (value.length > 0) {
|
|
159
|
+
this._clearButtonElement.classList.remove('hidden');
|
|
160
|
+
} else {
|
|
161
|
+
this._clearButtonElement.classList.add('hidden');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Filter options for combobox based on input query
|
|
167
|
+
*/
|
|
168
|
+
private _filterOptionsForCombobox(query: string): void {
|
|
169
|
+
// Access the private method through type assertion
|
|
170
|
+
(this._select as any)._filterOptionsForCombobox(query);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Handle keyboard navigation in combobox mode
|
|
175
|
+
*/
|
|
176
|
+
private _handleComboboxKeyNav(event: KeyboardEvent): void {
|
|
177
|
+
if (this._config.debug) console.log('Combobox keydown event:', event.key);
|
|
178
|
+
|
|
179
|
+
// Prevent event propagation to stop bubbling to other handlers
|
|
180
|
+
event.stopPropagation();
|
|
181
|
+
|
|
182
|
+
// Handle clear with Escape when dropdown is closed
|
|
183
|
+
if (
|
|
184
|
+
event.key === 'Escape' &&
|
|
185
|
+
!(this._select as any)._dropdownIsOpen &&
|
|
186
|
+
this._searchInputElement.value !== ''
|
|
187
|
+
) {
|
|
188
|
+
event.preventDefault();
|
|
189
|
+
this._searchInputElement.value = '';
|
|
190
|
+
this._toggleClearButtonVisibility('');
|
|
191
|
+
this._select.clearSelection();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Handle dropdown visibility with special keys
|
|
196
|
+
if (
|
|
197
|
+
!(this._select as any)._dropdownIsOpen &&
|
|
198
|
+
(event.key === 'ArrowDown' ||
|
|
199
|
+
event.key === 'ArrowUp' ||
|
|
200
|
+
event.key === 'Enter')
|
|
201
|
+
) {
|
|
202
|
+
if (this._config.debug)
|
|
203
|
+
console.log('Opening dropdown from keyboard in combobox');
|
|
204
|
+
this._select.openDropdown();
|
|
205
|
+
event.preventDefault();
|
|
206
|
+
|
|
207
|
+
// If it's arrow keys, also move focus
|
|
208
|
+
if (event.key === 'ArrowDown') {
|
|
209
|
+
(this._select as any)._focusNextOption();
|
|
210
|
+
} else if (event.key === 'ArrowUp') {
|
|
211
|
+
(this._select as any)._focusPreviousOption();
|
|
212
|
+
}
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Use the shared keyboard navigation handler
|
|
217
|
+
handleDropdownKeyNavigation(event, this._select, {
|
|
218
|
+
multiple: this._config.multiple,
|
|
219
|
+
closeOnSelect: this._config.closeOnSelect,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Update the combobox input value when an option is selected
|
|
225
|
+
*/
|
|
226
|
+
public updateSelectedValue(selectedText: string): void {
|
|
227
|
+
if (this._searchInputElement) {
|
|
228
|
+
// Extract just the text content if it contains HTML
|
|
229
|
+
let cleanText = selectedText;
|
|
230
|
+
|
|
231
|
+
// If the text might contain HTML (when description is present)
|
|
232
|
+
if (selectedText.includes('<') || selectedText.includes('>')) {
|
|
233
|
+
// Create a temporary element to extract just the text
|
|
234
|
+
const tempDiv = document.createElement('div');
|
|
235
|
+
tempDiv.innerHTML = selectedText;
|
|
236
|
+
|
|
237
|
+
// Find and use only the option-title text if available
|
|
238
|
+
const titleElement = tempDiv.querySelector('[data-kt-option-title]');
|
|
239
|
+
if (titleElement) {
|
|
240
|
+
cleanText = titleElement.textContent || selectedText;
|
|
241
|
+
} else {
|
|
242
|
+
// Fallback to all text content if option-title not found
|
|
243
|
+
cleanText = tempDiv.textContent || selectedText;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Set the input value directly for immediate feedback
|
|
248
|
+
this._searchInputElement.value = cleanText;
|
|
249
|
+
|
|
250
|
+
// Show the clear button if there's a value
|
|
251
|
+
this._toggleClearButtonVisibility(cleanText);
|
|
252
|
+
|
|
253
|
+
// Trigger an input event to ensure any input-based listeners are notified
|
|
254
|
+
const inputEvent = new Event('input', { bubbles: true });
|
|
255
|
+
this._searchInputElement.dispatchEvent(inputEvent);
|
|
256
|
+
|
|
257
|
+
if (this._config.debug)
|
|
258
|
+
console.log('Combobox value updated to:', cleanText);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Reset the input value to match the current selection
|
|
264
|
+
* This can be called to sync the input with the current state
|
|
265
|
+
*/
|
|
266
|
+
public resetInputValueToSelection(): void {
|
|
267
|
+
const selectedOptions = this._select.getSelectedOptions();
|
|
268
|
+
if (selectedOptions.length > 0) {
|
|
269
|
+
const selectedOption = Array.from(this._select.getOptionsElement()).find(
|
|
270
|
+
(opt) => opt.dataset.value === selectedOptions[0],
|
|
271
|
+
) as HTMLElement;
|
|
272
|
+
|
|
273
|
+
if (selectedOption) {
|
|
274
|
+
// Find the option-title element to get just the title text
|
|
275
|
+
const titleElement = selectedOption.querySelector(
|
|
276
|
+
'[data-kt-option-title]',
|
|
277
|
+
);
|
|
278
|
+
let selectedText = '';
|
|
279
|
+
|
|
280
|
+
if (titleElement) {
|
|
281
|
+
// If it has a structured content with a title element
|
|
282
|
+
selectedText = titleElement.textContent?.trim() || '';
|
|
283
|
+
} else {
|
|
284
|
+
// Fallback to the whole text content
|
|
285
|
+
selectedText = selectedOption.textContent?.trim() || '';
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
this.updateSelectedValue(selectedText);
|
|
289
|
+
}
|
|
290
|
+
} else {
|
|
291
|
+
// No selection, clear the input
|
|
292
|
+
if (this._searchInputElement) {
|
|
293
|
+
this._searchInputElement.value = '';
|
|
294
|
+
this._toggleClearButtonVisibility('');
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Destroy the combobox component and clean up event listeners
|
|
301
|
+
*/
|
|
302
|
+
public destroy(): void {
|
|
303
|
+
this._removeEventListeners();
|
|
304
|
+
}
|
|
305
|
+
}
|