@keenthemes/ktui 1.1.5 → 1.2.0
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/README.md +24 -0
- package/dist/ktui.js +11639 -11035
- package/dist/ktui.min.js +1 -1
- package/dist/ktui.min.js.map +1 -1
- package/dist/styles.css +140 -32
- package/lib/cjs/components/accordion/accordion.d.ts +32 -0
- package/lib/cjs/components/accordion/accordion.d.ts.map +1 -0
- package/lib/cjs/components/accordion/index.d.ts +7 -0
- package/lib/cjs/components/accordion/index.d.ts.map +1 -0
- package/lib/cjs/components/accordion/types.d.ts +15 -0
- package/lib/cjs/components/accordion/types.d.ts.map +1 -0
- package/lib/cjs/components/collapse/collapse.d.ts +28 -0
- package/lib/cjs/components/collapse/collapse.d.ts.map +1 -0
- package/lib/cjs/components/collapse/collapse.js +0 -2
- package/lib/cjs/components/collapse/collapse.js.map +1 -1
- package/lib/cjs/components/collapse/index.d.ts +7 -0
- package/lib/cjs/components/collapse/index.d.ts.map +1 -0
- package/lib/cjs/components/collapse/types.d.ts +15 -0
- package/lib/cjs/components/collapse/types.d.ts.map +1 -0
- package/lib/cjs/components/component.d.ts +44 -0
- package/lib/cjs/components/component.d.ts.map +1 -0
- package/lib/cjs/components/component.js +3 -1
- package/lib/cjs/components/component.js.map +1 -1
- package/lib/cjs/components/constants.d.ts +6 -0
- package/lib/cjs/components/constants.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable-checkbox.d.ts +16 -0
- package/lib/cjs/components/datatable/datatable-checkbox.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable-sort.d.ts +16 -0
- package/lib/cjs/components/datatable/datatable-sort.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable-sort.js +1 -2
- package/lib/cjs/components/datatable/datatable-sort.js.map +1 -1
- package/lib/cjs/components/datatable/datatable.d.ts +339 -0
- package/lib/cjs/components/datatable/datatable.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable.js +45 -23
- package/lib/cjs/components/datatable/datatable.js.map +1 -1
- package/lib/cjs/components/datatable/index.d.ts +7 -0
- package/lib/cjs/components/datatable/index.d.ts.map +1 -0
- package/lib/cjs/components/datatable/types.d.ts +166 -0
- package/lib/cjs/components/datatable/types.d.ts.map +1 -0
- package/lib/cjs/components/dismiss/dismiss.d.ts +30 -0
- package/lib/cjs/components/dismiss/dismiss.d.ts.map +1 -0
- package/lib/cjs/components/dismiss/index.d.ts +7 -0
- package/lib/cjs/components/dismiss/index.d.ts.map +1 -0
- package/lib/cjs/components/dismiss/types.d.ts +15 -0
- package/lib/cjs/components/dismiss/types.d.ts.map +1 -0
- package/lib/cjs/components/drawer/drawer.d.ts +63 -0
- package/lib/cjs/components/drawer/drawer.d.ts.map +1 -0
- package/lib/cjs/components/drawer/drawer.js +21 -9
- package/lib/cjs/components/drawer/drawer.js.map +1 -1
- package/lib/cjs/components/drawer/index.d.ts +7 -0
- package/lib/cjs/components/drawer/index.d.ts.map +1 -0
- package/lib/cjs/components/drawer/types.d.ts +27 -0
- package/lib/cjs/components/drawer/types.d.ts.map +1 -0
- package/lib/cjs/components/dropdown/dropdown.d.ts +71 -0
- package/lib/cjs/components/dropdown/dropdown.d.ts.map +1 -0
- package/lib/cjs/components/dropdown/dropdown.js.map +1 -1
- package/lib/cjs/components/dropdown/index.d.ts +7 -0
- package/lib/cjs/components/dropdown/index.d.ts.map +1 -0
- package/lib/cjs/components/dropdown/types.d.ts +27 -0
- package/lib/cjs/components/dropdown/types.d.ts.map +1 -0
- package/lib/cjs/components/image-input/image-input.d.ts +42 -0
- package/lib/cjs/components/image-input/image-input.d.ts.map +1 -0
- package/lib/cjs/components/image-input/index.d.ts +7 -0
- package/lib/cjs/components/image-input/index.d.ts.map +1 -0
- package/lib/cjs/components/image-input/types.d.ts +12 -0
- package/lib/cjs/components/image-input/types.d.ts.map +1 -0
- package/lib/cjs/components/modal/index.d.ts +7 -0
- package/lib/cjs/components/modal/index.d.ts.map +1 -0
- package/lib/cjs/components/modal/modal.d.ts +45 -0
- package/lib/cjs/components/modal/modal.d.ts.map +1 -0
- package/lib/cjs/components/modal/types.d.ts +21 -0
- package/lib/cjs/components/modal/types.d.ts.map +1 -0
- package/lib/cjs/components/rating/index.d.ts +7 -0
- package/lib/cjs/components/rating/index.d.ts.map +1 -0
- package/lib/cjs/components/rating/index.js +10 -0
- package/lib/cjs/components/rating/index.js.map +1 -0
- package/lib/cjs/components/rating/rating.d.ts +31 -0
- package/lib/cjs/components/rating/rating.d.ts.map +1 -0
- package/lib/cjs/components/rating/rating.js +239 -0
- package/lib/cjs/components/rating/rating.js.map +1 -0
- package/lib/cjs/components/rating/types.d.ts +25 -0
- package/lib/cjs/components/rating/types.d.ts.map +1 -0
- package/lib/cjs/components/rating/types.js +7 -0
- package/lib/cjs/components/rating/types.js.map +1 -0
- package/lib/cjs/components/reparent/index.d.ts +7 -0
- package/lib/cjs/components/reparent/index.d.ts.map +1 -0
- package/lib/cjs/components/reparent/reparent.d.ts +25 -0
- package/lib/cjs/components/reparent/reparent.d.ts.map +1 -0
- package/lib/cjs/components/reparent/types.d.ts +13 -0
- package/lib/cjs/components/reparent/types.d.ts.map +1 -0
- package/lib/cjs/components/repeater/index.d.ts +7 -0
- package/lib/cjs/components/repeater/index.d.ts.map +1 -0
- package/lib/cjs/components/repeater/index.js +10 -0
- package/lib/cjs/components/repeater/index.js.map +1 -0
- package/lib/cjs/components/repeater/repeater.d.ts +33 -0
- package/lib/cjs/components/repeater/repeater.d.ts.map +1 -0
- package/lib/cjs/components/repeater/repeater.js +173 -0
- package/lib/cjs/components/repeater/repeater.js.map +1 -0
- package/lib/cjs/components/repeater/types.d.ts +18 -0
- package/lib/cjs/components/repeater/types.d.ts.map +1 -0
- package/lib/cjs/components/repeater/types.js +7 -0
- package/lib/cjs/components/repeater/types.js.map +1 -0
- package/lib/cjs/components/scrollable/index.d.ts +7 -0
- package/lib/cjs/components/scrollable/index.d.ts.map +1 -0
- package/lib/cjs/components/scrollable/scrollable.d.ts +37 -0
- package/lib/cjs/components/scrollable/scrollable.d.ts.map +1 -0
- package/lib/cjs/components/scrollable/types.d.ts +15 -0
- package/lib/cjs/components/scrollable/types.d.ts.map +1 -0
- package/lib/cjs/components/scrollspy/index.d.ts +7 -0
- package/lib/cjs/components/scrollspy/index.d.ts.map +1 -0
- package/lib/cjs/components/scrollspy/scrollspy.d.ts +35 -0
- package/lib/cjs/components/scrollspy/scrollspy.d.ts.map +1 -0
- package/lib/cjs/components/scrollspy/types.d.ts +14 -0
- package/lib/cjs/components/scrollspy/types.d.ts.map +1 -0
- package/lib/cjs/components/scrollto/index.d.ts +7 -0
- package/lib/cjs/components/scrollto/index.d.ts.map +1 -0
- package/lib/cjs/components/scrollto/scrollto.d.ts +28 -0
- package/lib/cjs/components/scrollto/scrollto.d.ts.map +1 -0
- package/lib/cjs/components/scrollto/scrollto.js +0 -2
- package/lib/cjs/components/scrollto/scrollto.js.map +1 -1
- package/lib/cjs/components/scrollto/types.d.ts +14 -0
- package/lib/cjs/components/scrollto/types.d.ts.map +1 -0
- package/lib/cjs/components/select/combobox.d.ts +52 -0
- package/lib/cjs/components/select/combobox.d.ts.map +1 -0
- package/lib/cjs/components/select/combobox.js.map +1 -1
- package/lib/cjs/components/select/config.d.ts +105 -0
- package/lib/cjs/components/select/config.d.ts.map +1 -0
- package/lib/cjs/components/select/dropdown.d.ts +101 -0
- package/lib/cjs/components/select/dropdown.d.ts.map +1 -0
- package/lib/cjs/components/select/dropdown.js.map +1 -1
- package/lib/cjs/components/select/index.d.ts +13 -0
- package/lib/cjs/components/select/index.d.ts.map +1 -0
- package/lib/cjs/components/select/option.d.ts +23 -0
- package/lib/cjs/components/select/option.d.ts.map +1 -0
- package/lib/cjs/components/select/remote.d.ts +91 -0
- package/lib/cjs/components/select/remote.d.ts.map +1 -0
- package/lib/cjs/components/select/remote.js.map +1 -1
- package/lib/cjs/components/select/search.d.ts +67 -0
- package/lib/cjs/components/select/search.d.ts.map +1 -0
- package/lib/cjs/components/select/search.js +9 -5
- package/lib/cjs/components/select/search.js.map +1 -1
- package/lib/cjs/components/select/select.d.ts +427 -0
- package/lib/cjs/components/select/select.d.ts.map +1 -0
- package/lib/cjs/components/select/select.js +25 -5
- package/lib/cjs/components/select/select.js.map +1 -1
- package/lib/cjs/components/select/tags.d.ts +32 -0
- package/lib/cjs/components/select/tags.d.ts.map +1 -0
- package/lib/cjs/components/select/tags.js.map +1 -1
- package/lib/cjs/components/select/templates.d.ts +79 -0
- package/lib/cjs/components/select/templates.d.ts.map +1 -0
- package/lib/cjs/components/select/templates.js.map +1 -1
- package/lib/cjs/components/select/types.d.ts +23 -0
- package/lib/cjs/components/select/types.d.ts.map +1 -0
- package/lib/cjs/components/select/utils.d.ts +130 -0
- package/lib/cjs/components/select/utils.d.ts.map +1 -0
- package/lib/cjs/components/select/utils.js +10 -0
- package/lib/cjs/components/select/utils.js.map +1 -1
- package/lib/cjs/components/stepper/index.d.ts +7 -0
- package/lib/cjs/components/stepper/index.d.ts.map +1 -0
- package/lib/cjs/components/stepper/stepper.d.ts +53 -0
- package/lib/cjs/components/stepper/stepper.d.ts.map +1 -0
- package/lib/cjs/components/stepper/types.d.ts +12 -0
- package/lib/cjs/components/stepper/types.d.ts.map +1 -0
- package/lib/cjs/components/sticky/index.d.ts +7 -0
- package/lib/cjs/components/sticky/index.d.ts.map +1 -0
- package/lib/cjs/components/sticky/sticky.d.ts +51 -0
- package/lib/cjs/components/sticky/sticky.d.ts.map +1 -0
- package/lib/cjs/components/sticky/sticky.js +104 -24
- package/lib/cjs/components/sticky/sticky.js.map +1 -1
- package/lib/cjs/components/sticky/types.d.ts +28 -0
- package/lib/cjs/components/sticky/types.d.ts.map +1 -0
- package/lib/cjs/components/tabs/index.d.ts +7 -0
- package/lib/cjs/components/tabs/index.d.ts.map +1 -0
- package/lib/cjs/components/tabs/tabs.d.ts +38 -0
- package/lib/cjs/components/tabs/tabs.d.ts.map +1 -0
- package/lib/cjs/components/tabs/types.d.ts +12 -0
- package/lib/cjs/components/tabs/types.d.ts.map +1 -0
- package/lib/cjs/components/theme-switch/index.d.ts +7 -0
- package/lib/cjs/components/theme-switch/index.d.ts.map +1 -0
- package/lib/cjs/components/theme-switch/theme-switch.d.ts +33 -0
- package/lib/cjs/components/theme-switch/theme-switch.d.ts.map +1 -0
- package/lib/cjs/components/theme-switch/theme-switch.js +0 -2
- package/lib/cjs/components/theme-switch/theme-switch.js.map +1 -1
- package/lib/cjs/components/theme-switch/types.d.ts +13 -0
- package/lib/cjs/components/theme-switch/types.d.ts.map +1 -0
- package/lib/cjs/components/toast/index.d.ts +7 -0
- package/lib/cjs/components/toast/index.d.ts.map +1 -0
- package/lib/cjs/components/toast/toast.d.ts +76 -0
- package/lib/cjs/components/toast/toast.d.ts.map +1 -0
- package/lib/cjs/components/toast/toast.js +1 -2
- package/lib/cjs/components/toast/toast.js.map +1 -1
- package/lib/cjs/components/toast/types.d.ts +146 -0
- package/lib/cjs/components/toast/types.d.ts.map +1 -0
- package/lib/cjs/components/toggle/index.d.ts +7 -0
- package/lib/cjs/components/toggle/index.d.ts.map +1 -0
- package/lib/cjs/components/toggle/toggle.d.ts +31 -0
- package/lib/cjs/components/toggle/toggle.d.ts.map +1 -0
- package/lib/cjs/components/toggle/types.d.ts +17 -0
- package/lib/cjs/components/toggle/types.d.ts.map +1 -0
- package/lib/cjs/components/toggle-password/index.d.ts +7 -0
- package/lib/cjs/components/toggle-password/index.d.ts.map +1 -0
- package/lib/cjs/components/toggle-password/toggle-password.d.ts +32 -0
- package/lib/cjs/components/toggle-password/toggle-password.d.ts.map +1 -0
- package/lib/cjs/components/toggle-password/types.d.ts +12 -0
- package/lib/cjs/components/toggle-password/types.d.ts.map +1 -0
- package/lib/cjs/components/tooltip/index.d.ts +7 -0
- package/lib/cjs/components/tooltip/index.d.ts.map +1 -0
- package/lib/cjs/components/tooltip/tooltip.d.ts +46 -0
- package/lib/cjs/components/tooltip/tooltip.d.ts.map +1 -0
- package/lib/cjs/components/tooltip/types.d.ts +26 -0
- package/lib/cjs/components/tooltip/types.d.ts.map +1 -0
- package/lib/cjs/helpers/data.d.ts +13 -0
- package/lib/cjs/helpers/data.d.ts.map +1 -0
- package/lib/cjs/helpers/dom.d.ts +42 -0
- package/lib/cjs/helpers/dom.d.ts.map +1 -0
- package/lib/cjs/helpers/dom.js +0 -2
- package/lib/cjs/helpers/dom.js.map +1 -1
- package/lib/cjs/helpers/event-handler.d.ts +14 -0
- package/lib/cjs/helpers/event-handler.d.ts.map +1 -0
- package/lib/cjs/helpers/utils.d.ts +25 -0
- package/lib/cjs/helpers/utils.d.ts.map +1 -0
- package/lib/cjs/index.d.ts +114 -0
- package/lib/cjs/index.d.ts.map +1 -0
- package/lib/cjs/index.js +9 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/types.d.ts +17 -0
- package/lib/cjs/types.d.ts.map +1 -0
- package/lib/esm/components/accordion/accordion.d.ts +32 -0
- package/lib/esm/components/accordion/accordion.d.ts.map +1 -0
- package/lib/esm/components/accordion/index.d.ts +7 -0
- package/lib/esm/components/accordion/index.d.ts.map +1 -0
- package/lib/esm/components/accordion/types.d.ts +15 -0
- package/lib/esm/components/accordion/types.d.ts.map +1 -0
- package/lib/esm/components/collapse/collapse.d.ts +28 -0
- package/lib/esm/components/collapse/collapse.d.ts.map +1 -0
- package/lib/esm/components/collapse/collapse.js +0 -2
- package/lib/esm/components/collapse/collapse.js.map +1 -1
- package/lib/esm/components/collapse/index.d.ts +7 -0
- package/lib/esm/components/collapse/index.d.ts.map +1 -0
- package/lib/esm/components/collapse/types.d.ts +15 -0
- package/lib/esm/components/collapse/types.d.ts.map +1 -0
- package/lib/esm/components/component.d.ts +44 -0
- package/lib/esm/components/component.d.ts.map +1 -0
- package/lib/esm/components/component.js +3 -1
- package/lib/esm/components/component.js.map +1 -1
- package/lib/esm/components/constants.d.ts +6 -0
- package/lib/esm/components/constants.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable-checkbox.d.ts +16 -0
- package/lib/esm/components/datatable/datatable-checkbox.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable-sort.d.ts +16 -0
- package/lib/esm/components/datatable/datatable-sort.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable-sort.js +1 -2
- package/lib/esm/components/datatable/datatable-sort.js.map +1 -1
- package/lib/esm/components/datatable/datatable.d.ts +339 -0
- package/lib/esm/components/datatable/datatable.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable.js +45 -23
- package/lib/esm/components/datatable/datatable.js.map +1 -1
- package/lib/esm/components/datatable/index.d.ts +7 -0
- package/lib/esm/components/datatable/index.d.ts.map +1 -0
- package/lib/esm/components/datatable/types.d.ts +166 -0
- package/lib/esm/components/datatable/types.d.ts.map +1 -0
- package/lib/esm/components/dismiss/dismiss.d.ts +30 -0
- package/lib/esm/components/dismiss/dismiss.d.ts.map +1 -0
- package/lib/esm/components/dismiss/index.d.ts +7 -0
- package/lib/esm/components/dismiss/index.d.ts.map +1 -0
- package/lib/esm/components/dismiss/types.d.ts +15 -0
- package/lib/esm/components/dismiss/types.d.ts.map +1 -0
- package/lib/esm/components/drawer/drawer.d.ts +63 -0
- package/lib/esm/components/drawer/drawer.d.ts.map +1 -0
- package/lib/esm/components/drawer/drawer.js +21 -9
- package/lib/esm/components/drawer/drawer.js.map +1 -1
- package/lib/esm/components/drawer/index.d.ts +7 -0
- package/lib/esm/components/drawer/index.d.ts.map +1 -0
- package/lib/esm/components/drawer/types.d.ts +27 -0
- package/lib/esm/components/drawer/types.d.ts.map +1 -0
- package/lib/esm/components/dropdown/dropdown.d.ts +71 -0
- package/lib/esm/components/dropdown/dropdown.d.ts.map +1 -0
- package/lib/esm/components/dropdown/dropdown.js.map +1 -1
- package/lib/esm/components/dropdown/index.d.ts +7 -0
- package/lib/esm/components/dropdown/index.d.ts.map +1 -0
- package/lib/esm/components/dropdown/types.d.ts +27 -0
- package/lib/esm/components/dropdown/types.d.ts.map +1 -0
- package/lib/esm/components/image-input/image-input.d.ts +42 -0
- package/lib/esm/components/image-input/image-input.d.ts.map +1 -0
- package/lib/esm/components/image-input/index.d.ts +7 -0
- package/lib/esm/components/image-input/index.d.ts.map +1 -0
- package/lib/esm/components/image-input/types.d.ts +12 -0
- package/lib/esm/components/image-input/types.d.ts.map +1 -0
- package/lib/esm/components/modal/index.d.ts +7 -0
- package/lib/esm/components/modal/index.d.ts.map +1 -0
- package/lib/esm/components/modal/modal.d.ts +45 -0
- package/lib/esm/components/modal/modal.d.ts.map +1 -0
- package/lib/esm/components/modal/types.d.ts +21 -0
- package/lib/esm/components/modal/types.d.ts.map +1 -0
- package/lib/esm/components/rating/index.d.ts +7 -0
- package/lib/esm/components/rating/index.d.ts.map +1 -0
- package/lib/esm/components/rating/index.js +6 -0
- package/lib/esm/components/rating/index.js.map +1 -0
- package/lib/esm/components/rating/rating.d.ts +31 -0
- package/lib/esm/components/rating/rating.d.ts.map +1 -0
- package/lib/esm/components/rating/rating.js +236 -0
- package/lib/esm/components/rating/rating.js.map +1 -0
- package/lib/esm/components/rating/types.d.ts +25 -0
- package/lib/esm/components/rating/types.d.ts.map +1 -0
- package/lib/esm/components/rating/types.js +6 -0
- package/lib/esm/components/rating/types.js.map +1 -0
- package/lib/esm/components/reparent/index.d.ts +7 -0
- package/lib/esm/components/reparent/index.d.ts.map +1 -0
- package/lib/esm/components/reparent/reparent.d.ts +25 -0
- package/lib/esm/components/reparent/reparent.d.ts.map +1 -0
- package/lib/esm/components/reparent/types.d.ts +13 -0
- package/lib/esm/components/reparent/types.d.ts.map +1 -0
- package/lib/esm/components/repeater/index.d.ts +7 -0
- package/lib/esm/components/repeater/index.d.ts.map +1 -0
- package/lib/esm/components/repeater/index.js +6 -0
- package/lib/esm/components/repeater/index.js.map +1 -0
- package/lib/esm/components/repeater/repeater.d.ts +33 -0
- package/lib/esm/components/repeater/repeater.d.ts.map +1 -0
- package/lib/esm/components/repeater/repeater.js +170 -0
- package/lib/esm/components/repeater/repeater.js.map +1 -0
- package/lib/esm/components/repeater/types.d.ts +18 -0
- package/lib/esm/components/repeater/types.d.ts.map +1 -0
- package/lib/esm/components/repeater/types.js +6 -0
- package/lib/esm/components/repeater/types.js.map +1 -0
- package/lib/esm/components/scrollable/index.d.ts +7 -0
- package/lib/esm/components/scrollable/index.d.ts.map +1 -0
- package/lib/esm/components/scrollable/scrollable.d.ts +37 -0
- package/lib/esm/components/scrollable/scrollable.d.ts.map +1 -0
- package/lib/esm/components/scrollable/types.d.ts +15 -0
- package/lib/esm/components/scrollable/types.d.ts.map +1 -0
- package/lib/esm/components/scrollspy/index.d.ts +7 -0
- package/lib/esm/components/scrollspy/index.d.ts.map +1 -0
- package/lib/esm/components/scrollspy/scrollspy.d.ts +35 -0
- package/lib/esm/components/scrollspy/scrollspy.d.ts.map +1 -0
- package/lib/esm/components/scrollspy/types.d.ts +14 -0
- package/lib/esm/components/scrollspy/types.d.ts.map +1 -0
- package/lib/esm/components/scrollto/index.d.ts +7 -0
- package/lib/esm/components/scrollto/index.d.ts.map +1 -0
- package/lib/esm/components/scrollto/scrollto.d.ts +28 -0
- package/lib/esm/components/scrollto/scrollto.d.ts.map +1 -0
- package/lib/esm/components/scrollto/scrollto.js +0 -2
- package/lib/esm/components/scrollto/scrollto.js.map +1 -1
- package/lib/esm/components/scrollto/types.d.ts +14 -0
- package/lib/esm/components/scrollto/types.d.ts.map +1 -0
- package/lib/esm/components/select/combobox.d.ts +52 -0
- package/lib/esm/components/select/combobox.d.ts.map +1 -0
- package/lib/esm/components/select/combobox.js.map +1 -1
- package/lib/esm/components/select/config.d.ts +105 -0
- package/lib/esm/components/select/config.d.ts.map +1 -0
- package/lib/esm/components/select/dropdown.d.ts +101 -0
- package/lib/esm/components/select/dropdown.d.ts.map +1 -0
- package/lib/esm/components/select/dropdown.js.map +1 -1
- package/lib/esm/components/select/index.d.ts +13 -0
- package/lib/esm/components/select/index.d.ts.map +1 -0
- package/lib/esm/components/select/option.d.ts +23 -0
- package/lib/esm/components/select/option.d.ts.map +1 -0
- package/lib/esm/components/select/remote.d.ts +91 -0
- package/lib/esm/components/select/remote.d.ts.map +1 -0
- package/lib/esm/components/select/remote.js.map +1 -1
- package/lib/esm/components/select/search.d.ts +67 -0
- package/lib/esm/components/select/search.d.ts.map +1 -0
- package/lib/esm/components/select/search.js +9 -5
- package/lib/esm/components/select/search.js.map +1 -1
- package/lib/esm/components/select/select.d.ts +427 -0
- package/lib/esm/components/select/select.d.ts.map +1 -0
- package/lib/esm/components/select/select.js +25 -5
- package/lib/esm/components/select/select.js.map +1 -1
- package/lib/esm/components/select/tags.d.ts +32 -0
- package/lib/esm/components/select/tags.d.ts.map +1 -0
- package/lib/esm/components/select/tags.js.map +1 -1
- package/lib/esm/components/select/templates.d.ts +79 -0
- package/lib/esm/components/select/templates.d.ts.map +1 -0
- package/lib/esm/components/select/templates.js.map +1 -1
- package/lib/esm/components/select/types.d.ts +23 -0
- package/lib/esm/components/select/types.d.ts.map +1 -0
- package/lib/esm/components/select/utils.d.ts +130 -0
- package/lib/esm/components/select/utils.d.ts.map +1 -0
- package/lib/esm/components/select/utils.js +10 -0
- package/lib/esm/components/select/utils.js.map +1 -1
- package/lib/esm/components/stepper/index.d.ts +7 -0
- package/lib/esm/components/stepper/index.d.ts.map +1 -0
- package/lib/esm/components/stepper/stepper.d.ts +53 -0
- package/lib/esm/components/stepper/stepper.d.ts.map +1 -0
- package/lib/esm/components/stepper/types.d.ts +12 -0
- package/lib/esm/components/stepper/types.d.ts.map +1 -0
- package/lib/esm/components/sticky/index.d.ts +7 -0
- package/lib/esm/components/sticky/index.d.ts.map +1 -0
- package/lib/esm/components/sticky/sticky.d.ts +51 -0
- package/lib/esm/components/sticky/sticky.d.ts.map +1 -0
- package/lib/esm/components/sticky/sticky.js +104 -24
- package/lib/esm/components/sticky/sticky.js.map +1 -1
- package/lib/esm/components/sticky/types.d.ts +28 -0
- package/lib/esm/components/sticky/types.d.ts.map +1 -0
- package/lib/esm/components/tabs/index.d.ts +7 -0
- package/lib/esm/components/tabs/index.d.ts.map +1 -0
- package/lib/esm/components/tabs/tabs.d.ts +38 -0
- package/lib/esm/components/tabs/tabs.d.ts.map +1 -0
- package/lib/esm/components/tabs/types.d.ts +12 -0
- package/lib/esm/components/tabs/types.d.ts.map +1 -0
- package/lib/esm/components/theme-switch/index.d.ts +7 -0
- package/lib/esm/components/theme-switch/index.d.ts.map +1 -0
- package/lib/esm/components/theme-switch/theme-switch.d.ts +33 -0
- package/lib/esm/components/theme-switch/theme-switch.d.ts.map +1 -0
- package/lib/esm/components/theme-switch/theme-switch.js +0 -2
- package/lib/esm/components/theme-switch/theme-switch.js.map +1 -1
- package/lib/esm/components/theme-switch/types.d.ts +13 -0
- package/lib/esm/components/theme-switch/types.d.ts.map +1 -0
- package/lib/esm/components/toast/index.d.ts +7 -0
- package/lib/esm/components/toast/index.d.ts.map +1 -0
- package/lib/esm/components/toast/toast.d.ts +76 -0
- package/lib/esm/components/toast/toast.d.ts.map +1 -0
- package/lib/esm/components/toast/toast.js +1 -2
- package/lib/esm/components/toast/toast.js.map +1 -1
- package/lib/esm/components/toast/types.d.ts +146 -0
- package/lib/esm/components/toast/types.d.ts.map +1 -0
- package/lib/esm/components/toggle/index.d.ts +7 -0
- package/lib/esm/components/toggle/index.d.ts.map +1 -0
- package/lib/esm/components/toggle/toggle.d.ts +31 -0
- package/lib/esm/components/toggle/toggle.d.ts.map +1 -0
- package/lib/esm/components/toggle/types.d.ts +17 -0
- package/lib/esm/components/toggle/types.d.ts.map +1 -0
- package/lib/esm/components/toggle-password/index.d.ts +7 -0
- package/lib/esm/components/toggle-password/index.d.ts.map +1 -0
- package/lib/esm/components/toggle-password/toggle-password.d.ts +32 -0
- package/lib/esm/components/toggle-password/toggle-password.d.ts.map +1 -0
- package/lib/esm/components/toggle-password/types.d.ts +12 -0
- package/lib/esm/components/toggle-password/types.d.ts.map +1 -0
- package/lib/esm/components/tooltip/index.d.ts +7 -0
- package/lib/esm/components/tooltip/index.d.ts.map +1 -0
- package/lib/esm/components/tooltip/tooltip.d.ts +46 -0
- package/lib/esm/components/tooltip/tooltip.d.ts.map +1 -0
- package/lib/esm/components/tooltip/types.d.ts +26 -0
- package/lib/esm/components/tooltip/types.d.ts.map +1 -0
- package/lib/esm/helpers/data.d.ts +13 -0
- package/lib/esm/helpers/data.d.ts.map +1 -0
- package/lib/esm/helpers/dom.d.ts +42 -0
- package/lib/esm/helpers/dom.d.ts.map +1 -0
- package/lib/esm/helpers/dom.js +0 -2
- package/lib/esm/helpers/dom.js.map +1 -1
- package/lib/esm/helpers/event-handler.d.ts +14 -0
- package/lib/esm/helpers/event-handler.d.ts.map +1 -0
- package/lib/esm/helpers/utils.d.ts +25 -0
- package/lib/esm/helpers/utils.d.ts.map +1 -0
- package/lib/esm/index.d.ts +114 -0
- package/lib/esm/index.d.ts.map +1 -0
- package/lib/esm/index.js +6 -0
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/types.d.ts +17 -0
- package/lib/esm/types.d.ts.map +1 -0
- package/package.json +17 -9
- package/skills/ktui-components/SKILL.md +41 -0
- package/skills/ktui-theming/SKILL.md +50 -0
- package/src/components/collapse/collapse.ts +0 -3
- package/src/components/component.ts +5 -5
- package/src/components/datatable/__tests__/currency-sort.test.ts +108 -0
- package/src/components/datatable/__tests__/multi-row-headers.test.ts +121 -0
- package/src/components/datatable/__tests__/pagination-reset.test.ts +13 -5
- package/src/components/datatable/__tests__/race-conditions.test.ts +138 -78
- package/src/components/datatable/__tests__/setup.ts +9 -4
- package/src/components/datatable/datatable-sort.ts +12 -16
- package/src/components/datatable/datatable.css +4 -4
- package/src/components/datatable/datatable.ts +56 -26
- package/src/components/datatable/types.ts +3 -1
- package/src/components/drawer/drawer.ts +61 -24
- package/src/components/dropdown/dropdown.ts +3 -1
- package/src/components/input/input-group.css +15 -5
- package/src/components/rating/__tests__/rating.test.ts +234 -0
- package/src/components/rating/index.ts +11 -0
- package/src/components/rating/rating.css +11 -0
- package/src/components/rating/rating.ts +234 -0
- package/src/components/rating/types.ts +27 -0
- package/src/components/repeater/__tests__/repeater.test.ts +308 -0
- package/src/components/repeater/index.ts +7 -0
- package/src/components/repeater/repeater.ts +179 -0
- package/src/components/repeater/types.ts +19 -0
- package/src/components/scrollto/scrollto.ts +0 -3
- package/src/components/select/__tests__/ux-behaviors.test.ts +274 -8
- package/src/components/select/combobox.ts +0 -1
- package/src/components/select/dropdown.ts +0 -2
- package/src/components/select/remote.ts +1 -6
- package/src/components/select/search.ts +14 -7
- package/src/components/select/select.ts +33 -29
- package/src/components/select/tags.ts +0 -1
- package/src/components/select/templates.ts +8 -8
- package/src/components/select/utils.ts +15 -2
- package/src/components/sticky/__tests__/sticky.test.ts +205 -0
- package/src/components/sticky/sticky.ts +119 -21
- package/src/components/sticky/types.ts +3 -0
- package/src/components/theme-switch/theme-switch.ts +0 -3
- package/src/components/toast/toast.ts +3 -2
- package/src/helpers/dom.ts +0 -3
- package/src/index.ts +108 -0
- package/styles.css +1 -0
- package/lib/cjs/components/datatable/__tests__/pagination-reset.test.js +0 -596
- package/lib/cjs/components/datatable/__tests__/pagination-reset.test.js.map +0 -1
- package/lib/cjs/components/datatable/__tests__/race-conditions.test.js +0 -548
- package/lib/cjs/components/datatable/__tests__/race-conditions.test.js.map +0 -1
- package/lib/cjs/components/datatable/__tests__/setup.js +0 -63
- package/lib/cjs/components/datatable/__tests__/setup.js.map +0 -1
- package/lib/esm/components/datatable/__tests__/pagination-reset.test.js +0 -594
- package/lib/esm/components/datatable/__tests__/pagination-reset.test.js.map +0 -1
- package/lib/esm/components/datatable/__tests__/race-conditions.test.js +0 -546
- package/lib/esm/components/datatable/__tests__/race-conditions.test.js.map +0 -1
- package/lib/esm/components/datatable/__tests__/setup.js +0 -58
- package/lib/esm/components/datatable/__tests__/setup.js.map +0 -1
|
@@ -156,7 +156,7 @@ export const defaultTemplates: KTSelectTemplateInterface = {
|
|
|
156
156
|
dropdown: (
|
|
157
157
|
config: KTSelectConfigInterface & { zindex?: number; content?: string },
|
|
158
158
|
) => {
|
|
159
|
-
|
|
159
|
+
const template = getTemplateStrings(config).dropdown;
|
|
160
160
|
// If a custom dropdownTemplate is provided, it's responsible for its own content.
|
|
161
161
|
// Otherwise, the base template is used, and content is appended later.
|
|
162
162
|
if (config.dropdownTemplate) {
|
|
@@ -200,7 +200,7 @@ export const defaultTemplates: KTSelectTemplateInterface = {
|
|
|
200
200
|
* Renders the load more button for pagination
|
|
201
201
|
*/
|
|
202
202
|
loadMore: (config: KTSelectConfigInterface): HTMLElement => {
|
|
203
|
-
|
|
203
|
+
const html = getTemplateStrings(config)
|
|
204
204
|
.loadMore // .replace('{{loadMoreText}}', config.loadMoreText || 'Load more...') // Content is no longer in template string
|
|
205
205
|
.replace('{{class}}', config.loadMoreClass || '');
|
|
206
206
|
const element = stringToElement(html);
|
|
@@ -239,7 +239,7 @@ export const defaultTemplates: KTSelectTemplateInterface = {
|
|
|
239
239
|
* Renders the display element (trigger) for the select
|
|
240
240
|
*/
|
|
241
241
|
display: (config: KTSelectConfigInterface): HTMLElement => {
|
|
242
|
-
|
|
242
|
+
const html = getTemplateStrings(config)
|
|
243
243
|
.display.replace('{{tabindex}}', config.disabled ? '-1' : '0')
|
|
244
244
|
.replace('{{label}}', config.label || config.placeholder || 'Select...')
|
|
245
245
|
.replace('{{disabled}}', config.disabled ? 'aria-disabled="true"' : '')
|
|
@@ -335,7 +335,7 @@ export const defaultTemplates: KTSelectTemplateInterface = {
|
|
|
335
335
|
* Renders the search input
|
|
336
336
|
*/
|
|
337
337
|
search: (config: KTSelectConfigInterface): HTMLElement => {
|
|
338
|
-
|
|
338
|
+
const html = getTemplateStrings(config)
|
|
339
339
|
.search.replace(
|
|
340
340
|
'{{searchPlaceholder}}',
|
|
341
341
|
config.searchPlaceholder || 'Search...',
|
|
@@ -348,7 +348,7 @@ export const defaultTemplates: KTSelectTemplateInterface = {
|
|
|
348
348
|
* Renders the no results message
|
|
349
349
|
*/
|
|
350
350
|
searchEmpty: (config: KTSelectConfigInterface): HTMLElement => {
|
|
351
|
-
|
|
351
|
+
const html = getTemplateStrings(config).searchEmpty.replace(
|
|
352
352
|
'{{class}}',
|
|
353
353
|
config.searchEmptyClass || '',
|
|
354
354
|
);
|
|
@@ -376,7 +376,7 @@ export const defaultTemplates: KTSelectTemplateInterface = {
|
|
|
376
376
|
config: KTSelectConfigInterface,
|
|
377
377
|
loadingMessage: string,
|
|
378
378
|
): HTMLElement => {
|
|
379
|
-
|
|
379
|
+
const html = getTemplateStrings(config).loading.replace(
|
|
380
380
|
'{{class}}',
|
|
381
381
|
config.loadingClass || '',
|
|
382
382
|
);
|
|
@@ -392,7 +392,7 @@ export const defaultTemplates: KTSelectTemplateInterface = {
|
|
|
392
392
|
option: HTMLOptionElement,
|
|
393
393
|
config: KTSelectConfigInterface,
|
|
394
394
|
): HTMLElement => {
|
|
395
|
-
|
|
395
|
+
const template = getTemplateStrings(config).tag;
|
|
396
396
|
let preparedContent =
|
|
397
397
|
option.textContent || option.innerText || option.value || ''; // Default content is the option's text
|
|
398
398
|
|
|
@@ -444,7 +444,7 @@ export const defaultTemplates: KTSelectTemplateInterface = {
|
|
|
444
444
|
* Renders the placeholder for the select
|
|
445
445
|
*/
|
|
446
446
|
placeholder: (config: KTSelectConfigInterface): HTMLElement => {
|
|
447
|
-
|
|
447
|
+
const html = getTemplateStrings(config).placeholder.replace(
|
|
448
448
|
'{{class}}',
|
|
449
449
|
config.placeholderClass || '',
|
|
450
450
|
);
|
|
@@ -227,7 +227,7 @@ export class FocusManager {
|
|
|
227
227
|
this._focusedOptionIndex === null
|
|
228
228
|
? 0
|
|
229
229
|
: (this._focusedOptionIndex + 1) % options.length;
|
|
230
|
-
|
|
230
|
+
const startIdx = idx;
|
|
231
231
|
do {
|
|
232
232
|
const option = options[idx];
|
|
233
233
|
if (
|
|
@@ -255,7 +255,7 @@ export class FocusManager {
|
|
|
255
255
|
this._focusedOptionIndex === null
|
|
256
256
|
? options.length - 1
|
|
257
257
|
: (this._focusedOptionIndex - 1 + options.length) % options.length;
|
|
258
|
-
|
|
258
|
+
const startIdx = idx;
|
|
259
259
|
do {
|
|
260
260
|
const option = options[idx];
|
|
261
261
|
if (
|
|
@@ -367,6 +367,19 @@ export class FocusManager {
|
|
|
367
367
|
return options[this._focusedOptionIndex];
|
|
368
368
|
}
|
|
369
369
|
|
|
370
|
+
// Fallback: DOM may have focus class applied (e.g. by arrow keys from search input)
|
|
371
|
+
// while _focusedOptionIndex is out of sync. Use the option that has the focus class.
|
|
372
|
+
const focusedEl = this._element.querySelector(
|
|
373
|
+
`${this._optionsSelector}.${this._focusClass}`,
|
|
374
|
+
) as HTMLElement | null;
|
|
375
|
+
if (focusedEl && !focusedEl.classList.contains('hidden') && focusedEl.style.display !== 'none') {
|
|
376
|
+
const idx = options.indexOf(focusedEl);
|
|
377
|
+
if (idx >= 0) {
|
|
378
|
+
this._focusedOptionIndex = idx;
|
|
379
|
+
return focusedEl;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
370
383
|
return null;
|
|
371
384
|
}
|
|
372
385
|
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for KTSticky component (PR #107: release delay, active/release classes, debounce)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
6
|
+
import * as KTDomModule from '../../../helpers/dom';
|
|
7
|
+
import { KTSticky } from '../sticky';
|
|
8
|
+
import { waitFor } from '../../datatable/__tests__/setup';
|
|
9
|
+
|
|
10
|
+
describe('KTSticky', () => {
|
|
11
|
+
let stickyEl: HTMLElement;
|
|
12
|
+
let wrapper: HTMLElement;
|
|
13
|
+
let scrollTop = 0;
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
document.body.innerHTML = '';
|
|
17
|
+
scrollTop = 0;
|
|
18
|
+
vi.spyOn(KTDomModule.default, 'getScrollTop').mockImplementation(() => scrollTop);
|
|
19
|
+
vi.spyOn(KTDomModule.default, 'getViewPort').mockReturnValue({ height: 800, width: 1024 });
|
|
20
|
+
|
|
21
|
+
wrapper = document.createElement('div');
|
|
22
|
+
wrapper.setAttribute('data-kt-sticky-wrapper', 'true');
|
|
23
|
+
wrapper.style.height = '60px';
|
|
24
|
+
|
|
25
|
+
stickyEl = document.createElement('div');
|
|
26
|
+
stickyEl.setAttribute('data-kt-sticky', 'true');
|
|
27
|
+
stickyEl.setAttribute('data-kt-sticky-name', 'test');
|
|
28
|
+
stickyEl.setAttribute('data-kt-sticky-target', 'body');
|
|
29
|
+
stickyEl.setAttribute('data-kt-sticky-offset', '100');
|
|
30
|
+
stickyEl.setAttribute('data-kt-sticky-zindex', '10'); // required for _enable() to set position: fixed
|
|
31
|
+
stickyEl.style.height = '60px';
|
|
32
|
+
wrapper.appendChild(stickyEl);
|
|
33
|
+
document.body.appendChild(wrapper);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
vi.useRealTimers();
|
|
38
|
+
vi.restoreAllMocks();
|
|
39
|
+
document.body.innerHTML = '';
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe('PR #107: data-kt-sticky-release-delay', () => {
|
|
43
|
+
it('reads releaseDelay from data-kt-sticky-release-delay attribute', () => {
|
|
44
|
+
stickyEl.setAttribute('data-kt-sticky-release-delay', '300');
|
|
45
|
+
const instance = new KTSticky(stickyEl);
|
|
46
|
+
expect(instance.getOption('releaseDelay')).toBe(300);
|
|
47
|
+
instance.dispose();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('delays clearing inline styles when sticky is released (smooth exit)', async () => {
|
|
51
|
+
vi.useFakeTimers();
|
|
52
|
+
stickyEl.setAttribute('data-kt-sticky-release-delay', '250');
|
|
53
|
+
const instance = new KTSticky(stickyEl);
|
|
54
|
+
|
|
55
|
+
// Scroll past offset -> sticky becomes active (sync, no debounce when not active)
|
|
56
|
+
scrollTop = 150;
|
|
57
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
58
|
+
vi.advanceTimersByTime(0);
|
|
59
|
+
expect(stickyEl.classList.contains('active')).toBe(true);
|
|
60
|
+
expect(stickyEl.style.position).toBe('fixed');
|
|
61
|
+
|
|
62
|
+
// Scroll back up -> release (when active, debounce 200ms then _process)
|
|
63
|
+
scrollTop = 50;
|
|
64
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
65
|
+
vi.advanceTimersByTime(250); // debounce 200ms + a bit
|
|
66
|
+
expect(stickyEl.classList.contains('release')).toBe(true);
|
|
67
|
+
expect(stickyEl.style.position).toBe('fixed'); // not cleared yet (delay 250ms)
|
|
68
|
+
|
|
69
|
+
vi.advanceTimersByTime(250); // release delay
|
|
70
|
+
expect(stickyEl.style.position).toBe('');
|
|
71
|
+
expect(stickyEl.style.zIndex).toBe('');
|
|
72
|
+
|
|
73
|
+
vi.useRealTimers();
|
|
74
|
+
instance.dispose();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('with no releaseDelay, inline styles are cleared immediately on release', async () => {
|
|
78
|
+
stickyEl.removeAttribute('data-kt-sticky-release-delay');
|
|
79
|
+
const instance = new KTSticky(stickyEl);
|
|
80
|
+
|
|
81
|
+
scrollTop = 150;
|
|
82
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
83
|
+
await waitFor(50);
|
|
84
|
+
expect(stickyEl.style.position).toBe('fixed');
|
|
85
|
+
|
|
86
|
+
scrollTop = 50;
|
|
87
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
88
|
+
await waitFor(250); // debounce 200ms
|
|
89
|
+
expect(stickyEl.style.position).toBe('');
|
|
90
|
+
instance.dispose();
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe('PR #107: data-kt-sticky-active-class and data-kt-sticky-release-class', () => {
|
|
95
|
+
it('applies activeClass when sticky is active and releaseClass when released', async () => {
|
|
96
|
+
stickyEl.setAttribute('data-kt-sticky-active-class', 'sticky-on');
|
|
97
|
+
stickyEl.setAttribute('data-kt-sticky-release-class', 'sticky-off');
|
|
98
|
+
const instance = new KTSticky(stickyEl);
|
|
99
|
+
|
|
100
|
+
scrollTop = 150;
|
|
101
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
102
|
+
await waitFor(50);
|
|
103
|
+
expect(stickyEl.classList.contains('sticky-on')).toBe(true);
|
|
104
|
+
expect(stickyEl.classList.contains('sticky-off')).toBe(false);
|
|
105
|
+
|
|
106
|
+
scrollTop = 50;
|
|
107
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
108
|
+
await waitFor(250);
|
|
109
|
+
expect(stickyEl.classList.contains('sticky-on')).toBe(false);
|
|
110
|
+
expect(stickyEl.classList.contains('sticky-off')).toBe(true);
|
|
111
|
+
|
|
112
|
+
instance.dispose();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('falls back to data-kt-sticky-class when activeClass is not set', async () => {
|
|
116
|
+
stickyEl.setAttribute('data-kt-sticky-class', 'legacy-sticky');
|
|
117
|
+
const instance = new KTSticky(stickyEl);
|
|
118
|
+
|
|
119
|
+
scrollTop = 150;
|
|
120
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
121
|
+
await waitFor(50);
|
|
122
|
+
expect(stickyEl.classList.contains('legacy-sticky')).toBe(true);
|
|
123
|
+
instance.dispose();
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
describe('debounced scroll (no flicker on rapid scroll)', () => {
|
|
128
|
+
it('when active, scroll handler debounces so _process runs after delay', async () => {
|
|
129
|
+
vi.useFakeTimers();
|
|
130
|
+
const instance = new KTSticky(stickyEl);
|
|
131
|
+
scrollTop = 150;
|
|
132
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
133
|
+
vi.advanceTimersByTime(0);
|
|
134
|
+
expect(stickyEl.classList.contains('active')).toBe(true);
|
|
135
|
+
|
|
136
|
+
// Rapid scroll back: multiple scroll events, only one _process after debounce
|
|
137
|
+
scrollTop = 50;
|
|
138
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
139
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
140
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
141
|
+
expect(stickyEl.classList.contains('release')).toBe(false); // not yet, debounce pending
|
|
142
|
+
vi.advanceTimersByTime(250);
|
|
143
|
+
expect(stickyEl.classList.contains('release')).toBe(true);
|
|
144
|
+
|
|
145
|
+
vi.useRealTimers();
|
|
146
|
+
instance.dispose();
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe('change event', () => {
|
|
151
|
+
it('fires change event when sticky becomes active and when released', async () => {
|
|
152
|
+
const instance = new KTSticky(stickyEl);
|
|
153
|
+
const changes: { active: boolean }[] = [];
|
|
154
|
+
instance.on('change', (payload: { active: boolean }) => changes.push(payload));
|
|
155
|
+
|
|
156
|
+
scrollTop = 150;
|
|
157
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
158
|
+
await waitFor(50);
|
|
159
|
+
expect(changes).toContainEqual({ active: true });
|
|
160
|
+
|
|
161
|
+
scrollTop = 50;
|
|
162
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
163
|
+
await waitFor(250);
|
|
164
|
+
expect(changes).toContainEqual({ active: false });
|
|
165
|
+
|
|
166
|
+
instance.dispose();
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
describe('dispose', () => {
|
|
171
|
+
it('clears release-delay timeout so _resetStyles does not run after dispose', async () => {
|
|
172
|
+
vi.useFakeTimers();
|
|
173
|
+
stickyEl.setAttribute('data-kt-sticky-release-delay', '500');
|
|
174
|
+
const instance = new KTSticky(stickyEl);
|
|
175
|
+
|
|
176
|
+
scrollTop = 150;
|
|
177
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
178
|
+
vi.advanceTimersByTime(0);
|
|
179
|
+
|
|
180
|
+
scrollTop = 50;
|
|
181
|
+
window.dispatchEvent(new Event('scroll', { bubbles: true }));
|
|
182
|
+
vi.advanceTimersByTime(250);
|
|
183
|
+
expect(stickyEl.style.position).toBe('fixed');
|
|
184
|
+
|
|
185
|
+
instance.dispose();
|
|
186
|
+
vi.advanceTimersByTime(600);
|
|
187
|
+
// If timeout weren't cleared, _resetStyles would have run; element is disposed so we just ensure no throw
|
|
188
|
+
vi.useRealTimers();
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
describe('getInstance / getOrCreateInstance', () => {
|
|
193
|
+
it('getInstance returns null for element without data-kt-sticky', () => {
|
|
194
|
+
stickyEl.removeAttribute('data-kt-sticky');
|
|
195
|
+
expect(KTSticky.getInstance(stickyEl)).toBeNull();
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('getOrCreateInstance creates instance and returns it', () => {
|
|
199
|
+
const instance = KTSticky.getOrCreateInstance(stickyEl);
|
|
200
|
+
expect(instance).toBeInstanceOf(KTSticky);
|
|
201
|
+
expect(KTSticky.getInstance(stickyEl)).toBe(instance);
|
|
202
|
+
instance.dispose();
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
});
|
|
@@ -34,11 +34,17 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
|
|
|
34
34
|
reverse: false,
|
|
35
35
|
release: '',
|
|
36
36
|
activate: '',
|
|
37
|
+
releaseDelay: 0,
|
|
38
|
+
activeClass: '',
|
|
39
|
+
releaseClass: '',
|
|
37
40
|
};
|
|
38
41
|
protected override _config: KTStickyConfigInterface = this._defaultConfig;
|
|
39
42
|
protected _targetElement: HTMLElement | Document | null = null;
|
|
40
43
|
|
|
41
44
|
protected _attributeRoot: string;
|
|
45
|
+
protected _isScrolling: boolean;
|
|
46
|
+
protected _timeoutState: ReturnType<typeof setTimeout> | null = null;
|
|
47
|
+
protected _scrollTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
42
48
|
protected _eventTriggerState: boolean;
|
|
43
49
|
protected _lastScrollTop: number;
|
|
44
50
|
protected _releaseElement: HTMLElement;
|
|
@@ -69,6 +75,9 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
|
|
|
69
75
|
);
|
|
70
76
|
this._wrapperElement = this._element.closest('[data-kt-sticky-wrapper]');
|
|
71
77
|
this._attributeRoot = `data-kt-sticky-${this._getOption('name')}`;
|
|
78
|
+
this._isScrolling = false;
|
|
79
|
+
this._timeoutState = null;
|
|
80
|
+
this._scrollTimeout = null;
|
|
72
81
|
this._eventTriggerState = true;
|
|
73
82
|
this._lastScrollTop = 0;
|
|
74
83
|
|
|
@@ -110,26 +119,57 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
|
|
|
110
119
|
|
|
111
120
|
// Store scroll handler reference for cleanup
|
|
112
121
|
this._scrollHandler = () => {
|
|
113
|
-
|
|
122
|
+
|
|
123
|
+
this._isScrolling = true;
|
|
124
|
+
|
|
125
|
+
if(this._isActive() === true){
|
|
126
|
+
|
|
127
|
+
this._debounceScroll(() => {
|
|
128
|
+
|
|
129
|
+
this._isScrolling = false;
|
|
130
|
+
this._process();
|
|
131
|
+
|
|
132
|
+
}, 200);
|
|
133
|
+
|
|
134
|
+
}else{
|
|
135
|
+
|
|
136
|
+
this._isScrolling = false;
|
|
137
|
+
this._process();
|
|
138
|
+
|
|
139
|
+
}
|
|
140
|
+
|
|
114
141
|
};
|
|
115
142
|
|
|
116
143
|
if (this._targetElement) {
|
|
117
144
|
if (this._targetElement === document) {
|
|
118
|
-
window.addEventListener('scroll', this._scrollHandler);
|
|
145
|
+
window.addEventListener('scroll', this._scrollHandler, { passive: true });
|
|
119
146
|
} else {
|
|
120
147
|
(this._targetElement as HTMLElement).addEventListener(
|
|
121
148
|
'scroll',
|
|
122
149
|
this._scrollHandler,
|
|
150
|
+
{ passive: true }
|
|
123
151
|
);
|
|
124
152
|
}
|
|
125
153
|
}
|
|
126
154
|
}
|
|
127
155
|
|
|
156
|
+
protected _debounceScroll(callback: () => void, delay: number = 200): void {
|
|
157
|
+
|
|
158
|
+
if (this._scrollTimeout) {
|
|
159
|
+
clearTimeout(this._scrollTimeout);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
this._scrollTimeout = setTimeout(() => {
|
|
163
|
+
callback();
|
|
164
|
+
}, delay);
|
|
165
|
+
|
|
166
|
+
}
|
|
167
|
+
|
|
128
168
|
protected _process(): void {
|
|
129
169
|
const reverse = this._getOption('reverse');
|
|
130
170
|
const offset = this._getOffset();
|
|
131
171
|
|
|
132
|
-
if (offset
|
|
172
|
+
if (offset <= 0) {
|
|
133
173
|
this._disable();
|
|
134
174
|
return;
|
|
135
175
|
}
|
|
@@ -242,7 +282,6 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
|
|
|
242
282
|
const end = this._getOption('end') as string;
|
|
243
283
|
const height = this._calculateHeight();
|
|
244
284
|
const zindex = this._getOption('zindex') as string;
|
|
245
|
-
const classList = this._getOption('class') as string;
|
|
246
285
|
|
|
247
286
|
if (height + parseInt(top) > KTDom.getViewPort().height) {
|
|
248
287
|
return false;
|
|
@@ -310,16 +349,27 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
|
|
|
310
349
|
this._element.style.position = 'fixed';
|
|
311
350
|
}
|
|
312
351
|
|
|
313
|
-
|
|
314
|
-
|
|
352
|
+
const activeClassList = this._getOption('activeClass') as string;
|
|
353
|
+
if (activeClassList) {
|
|
354
|
+
KTDom.addClass(this._element, activeClassList);
|
|
355
|
+
}else{
|
|
356
|
+
const classList = this._getOption('class') as string;
|
|
357
|
+
if (classList) {
|
|
358
|
+
KTDom.addClass(this._element, classList);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const releaseClassList = this._getOption('releaseClass') as string;
|
|
363
|
+
if (releaseClassList) {
|
|
364
|
+
KTDom.removeClass(this._element, releaseClassList);
|
|
315
365
|
}
|
|
316
366
|
|
|
317
367
|
if (this._wrapperElement) {
|
|
318
368
|
this._wrapperElement.style.height = `${height}px`;
|
|
319
369
|
}
|
|
320
370
|
|
|
321
|
-
this._element.classList.add('active');
|
|
322
371
|
this._element.classList.remove('release');
|
|
372
|
+
this._element.classList.add('active');
|
|
323
373
|
|
|
324
374
|
return true;
|
|
325
375
|
}
|
|
@@ -327,6 +377,53 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
|
|
|
327
377
|
protected _disable(): void {
|
|
328
378
|
if (!this._element) return;
|
|
329
379
|
|
|
380
|
+
if (this._wrapperElement) {
|
|
381
|
+
this._wrapperElement.style.height = '';
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
this._element.classList.remove('active');
|
|
385
|
+
this._element.classList.add('release');
|
|
386
|
+
|
|
387
|
+
const activeClassList = this._getOption('activeClass') as string;
|
|
388
|
+
if (activeClassList) {
|
|
389
|
+
KTDom.removeClass(this._element, activeClassList);
|
|
390
|
+
}else{
|
|
391
|
+
const classList = this._getOption('class') as string;
|
|
392
|
+
if (classList) {
|
|
393
|
+
KTDom.removeClass(this._element, classList);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
const releaseClassList = this._getOption('releaseClass') as string;
|
|
398
|
+
if (releaseClassList) {
|
|
399
|
+
KTDom.addClass(this._element, releaseClassList);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
if(this._eventTriggerState === false){
|
|
403
|
+
const releaseDelay = this._getOption('releaseDelay') as number;
|
|
404
|
+
if(releaseDelay && this._timeoutState === null){
|
|
405
|
+
this._timeoutState = setTimeout(() => {
|
|
406
|
+
|
|
407
|
+
if (!this._element){
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
if (this._isRelease() === true) {
|
|
412
|
+
this._resetStyles();
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
this._timeoutState = null;
|
|
416
|
+
|
|
417
|
+
}, releaseDelay);
|
|
418
|
+
}else{
|
|
419
|
+
this._resetStyles();
|
|
420
|
+
}
|
|
421
|
+
}else{
|
|
422
|
+
this._timeoutState = null;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
protected _resetStyles = function () {
|
|
330
427
|
this._element.style.top = '';
|
|
331
428
|
this._element.style.bottom = '';
|
|
332
429
|
this._element.style.insetInlineStart = '';
|
|
@@ -338,21 +435,11 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
|
|
|
338
435
|
this._element.style.right = '';
|
|
339
436
|
this._element.style.zIndex = '';
|
|
340
437
|
this._element.style.position = '';
|
|
341
|
-
|
|
342
|
-
const classList = this._getOption('class') as string;
|
|
343
|
-
|
|
344
|
-
if (this._wrapperElement) {
|
|
345
|
-
this._wrapperElement.style.height = '';
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
if (classList) {
|
|
349
|
-
KTDom.removeClass(this._element, classList);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
this._element.classList.remove('active');
|
|
353
|
-
}
|
|
438
|
+
};
|
|
354
439
|
|
|
355
440
|
protected _update(): void {
|
|
441
|
+
this._timeoutState = null;
|
|
442
|
+
this._eventTriggerState = true;
|
|
356
443
|
if (this._isActive()) {
|
|
357
444
|
this._disable();
|
|
358
445
|
this._enable();
|
|
@@ -385,6 +472,10 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
|
|
|
385
472
|
return this._element.classList.contains('active');
|
|
386
473
|
}
|
|
387
474
|
|
|
475
|
+
protected _isRelease(): boolean {
|
|
476
|
+
return this._element.classList.contains('release');
|
|
477
|
+
}
|
|
478
|
+
|
|
388
479
|
public update(): void {
|
|
389
480
|
this._update();
|
|
390
481
|
}
|
|
@@ -393,6 +484,10 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
|
|
|
393
484
|
return this._isActive();
|
|
394
485
|
}
|
|
395
486
|
|
|
487
|
+
public isRelease(): boolean {
|
|
488
|
+
return this._isRelease();
|
|
489
|
+
}
|
|
490
|
+
|
|
396
491
|
public override dispose(): void {
|
|
397
492
|
// Remove resize event listener
|
|
398
493
|
if (this._resizeHandler) {
|
|
@@ -415,7 +510,10 @@ export class KTSticky extends KTComponent implements KTStickyInterface {
|
|
|
415
510
|
|
|
416
511
|
// Clean up state
|
|
417
512
|
this._disable();
|
|
418
|
-
if (
|
|
513
|
+
if (
|
|
514
|
+
this._attributeRoot &&
|
|
515
|
+
document.body.hasAttribute(this._attributeRoot)
|
|
516
|
+
) {
|
|
419
517
|
document.body.removeAttribute(this._attributeRoot);
|
|
420
518
|
}
|
|
421
519
|
|
|
@@ -415,8 +415,9 @@ export class KTToast extends KTComponent implements KTToastInterface {
|
|
|
415
415
|
if (options.beep) {
|
|
416
416
|
try {
|
|
417
417
|
// Use Web Audio API for a short beep
|
|
418
|
-
const ctx = new (
|
|
419
|
-
(window as any).webkitAudioContext
|
|
418
|
+
const ctx = new (
|
|
419
|
+
window.AudioContext || (window as any).webkitAudioContext
|
|
420
|
+
)();
|
|
420
421
|
const o = ctx.createOscillator();
|
|
421
422
|
const g = ctx.createGain();
|
|
422
423
|
o.type = 'sine';
|
package/src/helpers/dom.ts
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
* Copyright 2025 by Keenthemes Inc
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
/* eslint-disable max-len */
|
|
7
6
|
import KTUtils from './utils';
|
|
8
7
|
import { KTOffsetType, KTOptionType, KTViewPortType } from '../types';
|
|
9
8
|
|
|
@@ -130,7 +129,6 @@ const KTDom = {
|
|
|
130
129
|
for (
|
|
131
130
|
element && element !== document.documentElement;
|
|
132
131
|
(element = element.parentElement as HTMLElement);
|
|
133
|
-
|
|
134
132
|
) {
|
|
135
133
|
if (selector) {
|
|
136
134
|
if (element.matches(selector)) {
|
|
@@ -183,7 +181,6 @@ const KTDom = {
|
|
|
183
181
|
return false;
|
|
184
182
|
}
|
|
185
183
|
|
|
186
|
-
// eslint-disable-next-line max-len
|
|
187
184
|
return (
|
|
188
185
|
getComputedStyle(element).getPropertyValue('visibility') === 'visible'
|
|
189
186
|
);
|