@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,510 @@
|
|
|
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 {
|
|
7
|
+
Instance as PopperInstance,
|
|
8
|
+
createPopper,
|
|
9
|
+
Placement,
|
|
10
|
+
VirtualElement,
|
|
11
|
+
} from '@popperjs/core';
|
|
12
|
+
import KTDom from '../../helpers/dom';
|
|
13
|
+
import KTData from '../../helpers/data';
|
|
14
|
+
import KTEventHandler from '../../helpers/event-handler';
|
|
15
|
+
import KTComponent from '../component';
|
|
16
|
+
import { KTSelectConfigInterface } from './config';
|
|
17
|
+
import { FocusManager, EventManager } from './utils';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* KTSelectDropdown
|
|
21
|
+
*
|
|
22
|
+
* A specialized dropdown implementation for the KTSelect component.
|
|
23
|
+
* This module handles the dropdown functionality for the select component,
|
|
24
|
+
* including positioning, showing/hiding, and keyboard navigation.
|
|
25
|
+
*/
|
|
26
|
+
export class KTSelectDropdown extends KTComponent {
|
|
27
|
+
protected override readonly _name: string = 'select-dropdown';
|
|
28
|
+
protected override readonly _config: KTSelectConfigInterface;
|
|
29
|
+
|
|
30
|
+
// DOM Elements
|
|
31
|
+
protected _element: HTMLElement;
|
|
32
|
+
private _toggleElement: HTMLElement;
|
|
33
|
+
private _dropdownElement: HTMLElement;
|
|
34
|
+
|
|
35
|
+
// State
|
|
36
|
+
private _isOpen: boolean = false;
|
|
37
|
+
private _isTransitioning: boolean = false;
|
|
38
|
+
private _popperInstance: PopperInstance | null = null;
|
|
39
|
+
private _eventManager: EventManager;
|
|
40
|
+
private _focusManager: FocusManager;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Constructor
|
|
44
|
+
* @param element The parent element (select wrapper)
|
|
45
|
+
* @param toggleElement The element that triggers the dropdown
|
|
46
|
+
* @param dropdownElement The dropdown content element
|
|
47
|
+
* @param config The configuration options
|
|
48
|
+
*/
|
|
49
|
+
constructor(
|
|
50
|
+
element: HTMLElement,
|
|
51
|
+
toggleElement: HTMLElement,
|
|
52
|
+
dropdownElement: HTMLElement,
|
|
53
|
+
config: KTSelectConfigInterface,
|
|
54
|
+
) {
|
|
55
|
+
super();
|
|
56
|
+
|
|
57
|
+
this._element = element;
|
|
58
|
+
this._toggleElement = toggleElement;
|
|
59
|
+
this._dropdownElement = dropdownElement;
|
|
60
|
+
this._config = config;
|
|
61
|
+
this._eventManager = new EventManager();
|
|
62
|
+
this._focusManager = new FocusManager(
|
|
63
|
+
dropdownElement,
|
|
64
|
+
'[data-kt-select-option]',
|
|
65
|
+
config,
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
this._setupEventListeners();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Set up event listeners for the dropdown
|
|
73
|
+
*/
|
|
74
|
+
private _setupEventListeners(): void {
|
|
75
|
+
// Toggle click
|
|
76
|
+
this._eventManager.addListener(
|
|
77
|
+
this._toggleElement,
|
|
78
|
+
'click',
|
|
79
|
+
this._handleToggleClick.bind(this),
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
// Keyboard navigation
|
|
83
|
+
this._eventManager.addListener(
|
|
84
|
+
this._element,
|
|
85
|
+
'keydown',
|
|
86
|
+
this._handleKeyDown.bind(this),
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// Close on outside click
|
|
90
|
+
this._eventManager.addListener(
|
|
91
|
+
document as unknown as HTMLElement,
|
|
92
|
+
'click',
|
|
93
|
+
this._handleOutsideClick.bind(this),
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Handle toggle element click
|
|
99
|
+
*/
|
|
100
|
+
private _handleToggleClick(event: Event): void {
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
event.stopPropagation();
|
|
103
|
+
|
|
104
|
+
this.toggle();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Handle keyboard events
|
|
109
|
+
*/
|
|
110
|
+
private _handleKeyDown(event: KeyboardEvent): void {
|
|
111
|
+
if (!this._isOpen) return;
|
|
112
|
+
|
|
113
|
+
switch (event.key) {
|
|
114
|
+
case 'Escape':
|
|
115
|
+
event.preventDefault();
|
|
116
|
+
this.close();
|
|
117
|
+
this._toggleElement.focus();
|
|
118
|
+
break;
|
|
119
|
+
case 'ArrowDown':
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
this._focusManager.focusNext();
|
|
122
|
+
break;
|
|
123
|
+
case 'ArrowUp':
|
|
124
|
+
event.preventDefault();
|
|
125
|
+
this._focusManager.focusPrevious();
|
|
126
|
+
break;
|
|
127
|
+
case 'Home':
|
|
128
|
+
event.preventDefault();
|
|
129
|
+
// Focus first visible option
|
|
130
|
+
const firstOption = this._focusManager.getVisibleOptions()[0];
|
|
131
|
+
if (firstOption) {
|
|
132
|
+
this._focusManager.applyFocus(firstOption);
|
|
133
|
+
this._focusManager.scrollIntoView(firstOption);
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
case 'End':
|
|
137
|
+
event.preventDefault();
|
|
138
|
+
// Focus last visible option
|
|
139
|
+
const visibleOptions = this._focusManager.getVisibleOptions();
|
|
140
|
+
const lastOption = visibleOptions[visibleOptions.length - 1];
|
|
141
|
+
if (lastOption) {
|
|
142
|
+
this._focusManager.applyFocus(lastOption);
|
|
143
|
+
this._focusManager.scrollIntoView(lastOption);
|
|
144
|
+
}
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Handle clicks outside the dropdown
|
|
151
|
+
*/
|
|
152
|
+
private _handleOutsideClick(event: MouseEvent): void {
|
|
153
|
+
if (!this._isOpen) return;
|
|
154
|
+
|
|
155
|
+
const target = event.target as HTMLElement;
|
|
156
|
+
|
|
157
|
+
if (
|
|
158
|
+
!this._element.contains(target) &&
|
|
159
|
+
!this._dropdownElement.contains(target)
|
|
160
|
+
) {
|
|
161
|
+
this.close();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Set width of dropdown based on toggle element
|
|
167
|
+
*/
|
|
168
|
+
private _setDropdownWidth(): void {
|
|
169
|
+
if (!this._dropdownElement || !this._toggleElement) return;
|
|
170
|
+
|
|
171
|
+
// Check if width is configured
|
|
172
|
+
if (this._config.dropdownWidth) {
|
|
173
|
+
// If custom width is set, use that
|
|
174
|
+
this._dropdownElement.style.width = this._config.dropdownWidth;
|
|
175
|
+
} else {
|
|
176
|
+
// Otherwise, match toggle element width for a cleaner appearance
|
|
177
|
+
const toggleWidth = this._toggleElement.offsetWidth;
|
|
178
|
+
this._dropdownElement.style.width = `${toggleWidth}px`;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Initialize the Popper instance for dropdown positioning
|
|
184
|
+
*/
|
|
185
|
+
private _initPopper(): void {
|
|
186
|
+
// Destroy existing popper instance if it exists
|
|
187
|
+
this._destroyPopper();
|
|
188
|
+
|
|
189
|
+
// Default offset
|
|
190
|
+
const offsetValue = '0, 5';
|
|
191
|
+
|
|
192
|
+
// Get configuration options
|
|
193
|
+
const placement = this._config.dropdownPlacement || 'bottom-start';
|
|
194
|
+
const strategy = this._config.dropdownStrategy || 'fixed';
|
|
195
|
+
const preventOverflow = this._config.dropdownPreventOverflow !== false;
|
|
196
|
+
const flip = this._config.dropdownFlip !== false;
|
|
197
|
+
|
|
198
|
+
// Create new popper instance
|
|
199
|
+
this._popperInstance = createPopper(
|
|
200
|
+
this._toggleElement,
|
|
201
|
+
this._dropdownElement,
|
|
202
|
+
{
|
|
203
|
+
placement: placement as Placement,
|
|
204
|
+
strategy: strategy as 'fixed' | 'absolute',
|
|
205
|
+
modifiers: [
|
|
206
|
+
{
|
|
207
|
+
name: 'offset',
|
|
208
|
+
options: {
|
|
209
|
+
offset: this._parseOffset(offsetValue),
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
name: 'preventOverflow',
|
|
214
|
+
options: {
|
|
215
|
+
boundary: 'viewport',
|
|
216
|
+
altAxis: preventOverflow,
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
name: 'flip',
|
|
221
|
+
options: {
|
|
222
|
+
enabled: flip,
|
|
223
|
+
fallbackPlacements: ['top-start', 'bottom-end', 'top-end'],
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
name: 'sameWidth',
|
|
228
|
+
enabled: !this._config.dropdownWidth,
|
|
229
|
+
phase: 'beforeWrite',
|
|
230
|
+
requires: ['computeStyles'],
|
|
231
|
+
fn: ({ state }) => {
|
|
232
|
+
state.styles.popper.width = `${state.rects.reference.width}px`;
|
|
233
|
+
},
|
|
234
|
+
effect: ({ state }) => {
|
|
235
|
+
// Add type guard for HTMLElement
|
|
236
|
+
const reference = state.elements.reference as HTMLElement;
|
|
237
|
+
if (reference && 'offsetWidth' in reference) {
|
|
238
|
+
state.elements.popper.style.width = `${reference.offsetWidth}px`;
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
],
|
|
243
|
+
},
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Parse offset string into an array of numbers
|
|
249
|
+
*/
|
|
250
|
+
private _parseOffset(offset: string): number[] {
|
|
251
|
+
return offset.split(',').map((value) => parseInt(value.trim(), 10));
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Destroy the Popper instance
|
|
256
|
+
*/
|
|
257
|
+
private _destroyPopper(): void {
|
|
258
|
+
if (this._popperInstance) {
|
|
259
|
+
this._popperInstance.destroy();
|
|
260
|
+
this._popperInstance = null;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Update dropdown position
|
|
266
|
+
*/
|
|
267
|
+
public updatePosition(): void {
|
|
268
|
+
if (this._popperInstance) {
|
|
269
|
+
this._popperInstance.update();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Toggle the dropdown
|
|
275
|
+
*/
|
|
276
|
+
public toggle(): void {
|
|
277
|
+
if (this._config.debug)
|
|
278
|
+
console.log('KTSelectDropdown.toggle called - isOpen:', this._isOpen);
|
|
279
|
+
|
|
280
|
+
if (this._isTransitioning) {
|
|
281
|
+
if (this._config.debug)
|
|
282
|
+
console.log('KTSelectDropdown.toggle - ignoring during transition');
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (this._isOpen) {
|
|
287
|
+
this.close();
|
|
288
|
+
} else {
|
|
289
|
+
this.open();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Open the dropdown
|
|
295
|
+
*/
|
|
296
|
+
public open(): void {
|
|
297
|
+
if (this._isOpen || this._isTransitioning) return;
|
|
298
|
+
|
|
299
|
+
// Fire before show event
|
|
300
|
+
const beforeShowEvent = new CustomEvent('kt.select.dropdown.show', {
|
|
301
|
+
bubbles: true,
|
|
302
|
+
cancelable: true,
|
|
303
|
+
});
|
|
304
|
+
this._element.dispatchEvent(beforeShowEvent);
|
|
305
|
+
|
|
306
|
+
if (beforeShowEvent.defaultPrevented) return;
|
|
307
|
+
|
|
308
|
+
// Begin opening transition
|
|
309
|
+
this._isTransitioning = true;
|
|
310
|
+
|
|
311
|
+
// Set initial styles - remove display: block and use class toggling instead
|
|
312
|
+
this._dropdownElement.classList.remove('hidden');
|
|
313
|
+
this._dropdownElement.style.opacity = '0';
|
|
314
|
+
|
|
315
|
+
// Set dropdown width
|
|
316
|
+
this._setDropdownWidth();
|
|
317
|
+
|
|
318
|
+
// Make sure the element is visible for transitioning
|
|
319
|
+
KTDom.reflow(this._dropdownElement);
|
|
320
|
+
|
|
321
|
+
// Apply z-index if configured
|
|
322
|
+
if (this._config.dropdownZindex) {
|
|
323
|
+
this._dropdownElement.style.zIndex =
|
|
324
|
+
this._config.dropdownZindex.toString();
|
|
325
|
+
} else {
|
|
326
|
+
// Auto-calculate z-index
|
|
327
|
+
const parentZindex = KTDom.getHighestZindex(this._element);
|
|
328
|
+
if (parentZindex) {
|
|
329
|
+
this._dropdownElement.style.zIndex = (parentZindex + 1).toString();
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Initialize popper for positioning
|
|
334
|
+
this._initPopper();
|
|
335
|
+
|
|
336
|
+
// Add active classes
|
|
337
|
+
this._dropdownElement.classList.add('open');
|
|
338
|
+
this._toggleElement.classList.add('active');
|
|
339
|
+
this._toggleElement.setAttribute('aria-expanded', 'true');
|
|
340
|
+
|
|
341
|
+
// Start transition
|
|
342
|
+
this._dropdownElement.style.opacity = '1';
|
|
343
|
+
|
|
344
|
+
// Handle transition end
|
|
345
|
+
KTDom.transitionEnd(this._dropdownElement, () => {
|
|
346
|
+
this._isTransitioning = false;
|
|
347
|
+
this._isOpen = true;
|
|
348
|
+
|
|
349
|
+
// Focus the first item if search is enabled
|
|
350
|
+
if (this._config.enableSearch) {
|
|
351
|
+
const searchInput = this._dropdownElement.querySelector(
|
|
352
|
+
'input[type="search"]',
|
|
353
|
+
);
|
|
354
|
+
if (searchInput) {
|
|
355
|
+
(searchInput as HTMLInputElement).focus();
|
|
356
|
+
} else {
|
|
357
|
+
this._focusFirstOption();
|
|
358
|
+
}
|
|
359
|
+
} else {
|
|
360
|
+
this._focusFirstOption();
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Fire after show event
|
|
364
|
+
const afterShowEvent = new CustomEvent('kt.select.dropdown.shown', {
|
|
365
|
+
bubbles: true,
|
|
366
|
+
});
|
|
367
|
+
this._element.dispatchEvent(afterShowEvent);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Focus the first option in the dropdown
|
|
373
|
+
*/
|
|
374
|
+
private _focusFirstOption(): void {
|
|
375
|
+
const firstOption = this._focusManager.getVisibleOptions()[0];
|
|
376
|
+
if (firstOption) {
|
|
377
|
+
this._focusManager.applyFocus(firstOption);
|
|
378
|
+
this._focusManager.scrollIntoView(firstOption);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Close the dropdown
|
|
384
|
+
*/
|
|
385
|
+
public close(): void {
|
|
386
|
+
if (this._config.debug)
|
|
387
|
+
console.log(
|
|
388
|
+
'KTSelectDropdown.close called - isOpen:',
|
|
389
|
+
this._isOpen,
|
|
390
|
+
'isTransitioning:',
|
|
391
|
+
this._isTransitioning,
|
|
392
|
+
);
|
|
393
|
+
|
|
394
|
+
if (!this._isOpen || this._isTransitioning) {
|
|
395
|
+
if (this._config.debug)
|
|
396
|
+
console.log(
|
|
397
|
+
'KTSelectDropdown.close - early return: dropdown not open or is transitioning',
|
|
398
|
+
);
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Fire before hide event
|
|
403
|
+
const beforeHideEvent = new CustomEvent('kt.select.dropdown.hide', {
|
|
404
|
+
bubbles: true,
|
|
405
|
+
cancelable: true,
|
|
406
|
+
});
|
|
407
|
+
this._element.dispatchEvent(beforeHideEvent);
|
|
408
|
+
|
|
409
|
+
if (beforeHideEvent.defaultPrevented) {
|
|
410
|
+
if (this._config.debug)
|
|
411
|
+
console.log(
|
|
412
|
+
'KTSelectDropdown.close - canceling due to defaultPrevented on beforeHideEvent',
|
|
413
|
+
);
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
if (this._config.debug)
|
|
418
|
+
console.log('KTSelectDropdown.close - starting transition');
|
|
419
|
+
// Begin closing transition
|
|
420
|
+
this._isTransitioning = true;
|
|
421
|
+
|
|
422
|
+
// Start transition
|
|
423
|
+
this._dropdownElement.style.opacity = '0';
|
|
424
|
+
|
|
425
|
+
// Use a combination of transition end and a fallback timer
|
|
426
|
+
let transitionComplete = false;
|
|
427
|
+
|
|
428
|
+
// Set a fixed-duration fallback in case the transition event doesn't fire
|
|
429
|
+
const fallbackTimer = setTimeout(() => {
|
|
430
|
+
if (!transitionComplete) {
|
|
431
|
+
if (this._config.debug)
|
|
432
|
+
console.log('KTSelectDropdown.close - fallback timer triggered');
|
|
433
|
+
completeTransition();
|
|
434
|
+
}
|
|
435
|
+
}, 300); // 300ms should be enough for most transitions
|
|
436
|
+
|
|
437
|
+
// Setup the transition end function
|
|
438
|
+
const completeTransition = () => {
|
|
439
|
+
if (transitionComplete) return;
|
|
440
|
+
transitionComplete = true;
|
|
441
|
+
clearTimeout(fallbackTimer);
|
|
442
|
+
|
|
443
|
+
if (this._config.debug)
|
|
444
|
+
console.log('KTSelectDropdown.close - transition ended');
|
|
445
|
+
// Remove active classes
|
|
446
|
+
this._dropdownElement.classList.add('hidden');
|
|
447
|
+
this._dropdownElement.classList.remove('open');
|
|
448
|
+
this._toggleElement.classList.remove('active');
|
|
449
|
+
this._toggleElement.setAttribute('aria-expanded', 'false');
|
|
450
|
+
|
|
451
|
+
// Reset styles - replace display: none with adding hidden class
|
|
452
|
+
this._dropdownElement.classList.add('hidden');
|
|
453
|
+
this._dropdownElement.style.opacity = '';
|
|
454
|
+
this._dropdownElement.style.zIndex = '';
|
|
455
|
+
|
|
456
|
+
// Destroy popper
|
|
457
|
+
this._destroyPopper();
|
|
458
|
+
|
|
459
|
+
// Update state
|
|
460
|
+
this._isTransitioning = false;
|
|
461
|
+
this._isOpen = false;
|
|
462
|
+
|
|
463
|
+
// Fire after hide event
|
|
464
|
+
const afterHideEvent = new CustomEvent('kt.select.dropdown.hidden', {
|
|
465
|
+
bubbles: true,
|
|
466
|
+
});
|
|
467
|
+
this._element.dispatchEvent(afterHideEvent);
|
|
468
|
+
if (this._config.debug)
|
|
469
|
+
console.log('KTSelectDropdown.close - complete, events fired');
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
// Handle transition end via the utility but also have the fallback
|
|
473
|
+
KTDom.transitionEnd(this._dropdownElement, completeTransition);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Check if dropdown is open
|
|
478
|
+
*/
|
|
479
|
+
public isOpen(): boolean {
|
|
480
|
+
return this._isOpen;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Clean up component
|
|
485
|
+
*/
|
|
486
|
+
public override dispose(): void {
|
|
487
|
+
// Destroy popper
|
|
488
|
+
this._destroyPopper();
|
|
489
|
+
|
|
490
|
+
// Remove event listeners
|
|
491
|
+
this._eventManager.removeAllListeners(this._element);
|
|
492
|
+
this._eventManager.removeAllListeners(this._toggleElement);
|
|
493
|
+
this._eventManager.removeAllListeners(document as unknown as HTMLElement);
|
|
494
|
+
|
|
495
|
+
// Clean up focus manager
|
|
496
|
+
if (
|
|
497
|
+
this._focusManager &&
|
|
498
|
+
typeof this._focusManager.dispose === 'function'
|
|
499
|
+
) {
|
|
500
|
+
this._focusManager.dispose();
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// Clean up state
|
|
504
|
+
this._isOpen = false;
|
|
505
|
+
this._isTransitioning = false;
|
|
506
|
+
|
|
507
|
+
// Remove data reference
|
|
508
|
+
KTData.remove(this._element, this._name);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
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 { KTSelect } from './select';
|
|
7
|
+
export { KTSelectRemote } from './remote';
|
|
8
|
+
export { KTSelectCombobox } from './combobox';
|
|
9
|
+
export { KTSelectSearch } from './search';
|
|
10
|
+
export { KTSelectTags } from './tags';
|
|
11
|
+
export { KTSelectDropdown } from './dropdown';
|
|
12
|
+
export { filterOptions, FocusManager, EventManager } from './utils';
|
|
13
|
+
export { KTSelectConfigInterface, KTSelectOption } from './config';
|
|
@@ -0,0 +1,43 @@
|
|
|
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 KTComponent from '../component';
|
|
7
|
+
import {
|
|
8
|
+
KTSelectOptionConfigInterface,
|
|
9
|
+
KTSelectConfigInterface,
|
|
10
|
+
} from './config';
|
|
11
|
+
import { defaultTemplates } from './templates';
|
|
12
|
+
|
|
13
|
+
export class KTSelectOption extends KTComponent {
|
|
14
|
+
protected override readonly _name: string = 'select-option';
|
|
15
|
+
protected override readonly _dataOptionPrefix: string = 'kt-'; // Use 'kt-' prefix to support data-kt-select-option attributes
|
|
16
|
+
protected override readonly _config: KTSelectOptionConfigInterface;
|
|
17
|
+
private _globalConfig: KTSelectConfigInterface;
|
|
18
|
+
|
|
19
|
+
constructor(element: HTMLElement, config?: KTSelectConfigInterface) {
|
|
20
|
+
super();
|
|
21
|
+
|
|
22
|
+
// Always initialize a new option instance
|
|
23
|
+
this._init(element);
|
|
24
|
+
this._buildConfig();
|
|
25
|
+
this._globalConfig = config;
|
|
26
|
+
|
|
27
|
+
// Don't store in KTData to avoid Singleton pattern issues
|
|
28
|
+
// Each option should be a unique instance
|
|
29
|
+
(element as any).instance = this;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public getHTMLOptionElement(): HTMLOptionElement {
|
|
33
|
+
return this._element as HTMLOptionElement;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public render(): HTMLElement {
|
|
37
|
+
const optionElement = this.getHTMLOptionElement();
|
|
38
|
+
// Use the global config if available, or create a minimal valid config
|
|
39
|
+
const config = this._globalConfig || { height: 250 };
|
|
40
|
+
// Create a new option element every time
|
|
41
|
+
return defaultTemplates.option(optionElement, config);
|
|
42
|
+
}
|
|
43
|
+
}
|