@keenthemes/ktui 1.1.2 → 1.1.4
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/dist/ktui.js +532 -59
- package/dist/ktui.min.js +1 -1
- package/dist/ktui.min.js.map +1 -1
- package/dist/styles.css +51 -0
- package/lib/cjs/components/component.js +22 -0
- package/lib/cjs/components/component.js.map +1 -1
- package/lib/cjs/components/datatable/datatable.js +26 -7
- package/lib/cjs/components/datatable/datatable.js.map +1 -1
- package/lib/cjs/components/drawer/drawer.js +255 -9
- package/lib/cjs/components/drawer/drawer.js.map +1 -1
- package/lib/cjs/components/dropdown/dropdown.js +55 -8
- package/lib/cjs/components/dropdown/dropdown.js.map +1 -1
- package/lib/cjs/components/select/search.js +17 -7
- package/lib/cjs/components/select/search.js.map +1 -1
- package/lib/cjs/components/select/select.js +92 -14
- package/lib/cjs/components/select/select.js.map +1 -1
- package/lib/cjs/components/sticky/sticky.js +44 -5
- package/lib/cjs/components/sticky/sticky.js.map +1 -1
- package/lib/cjs/helpers/data.js +8 -0
- package/lib/cjs/helpers/data.js.map +1 -1
- package/lib/cjs/helpers/event-handler.js +6 -5
- package/lib/cjs/helpers/event-handler.js.map +1 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/esm/components/component.js +22 -0
- package/lib/esm/components/component.js.map +1 -1
- package/lib/esm/components/datatable/datatable.js +26 -7
- package/lib/esm/components/datatable/datatable.js.map +1 -1
- package/lib/esm/components/drawer/drawer.js +255 -9
- package/lib/esm/components/drawer/drawer.js.map +1 -1
- package/lib/esm/components/dropdown/dropdown.js +55 -8
- package/lib/esm/components/dropdown/dropdown.js.map +1 -1
- package/lib/esm/components/select/search.js +17 -7
- package/lib/esm/components/select/search.js.map +1 -1
- package/lib/esm/components/select/select.js +92 -14
- package/lib/esm/components/select/select.js.map +1 -1
- package/lib/esm/components/sticky/sticky.js +44 -5
- package/lib/esm/components/sticky/sticky.js.map +1 -1
- package/lib/esm/helpers/data.js +8 -0
- package/lib/esm/helpers/data.js.map +1 -1
- package/lib/esm/helpers/event-handler.js +6 -5
- package/lib/esm/helpers/event-handler.js.map +1 -1
- package/lib/esm/index.js.map +1 -1
- package/package.json +4 -2
- package/src/components/component.ts +26 -0
- package/src/components/datatable/__tests__/race-conditions.test.ts +2 -2
- package/src/components/datatable/datatable.ts +32 -7
- package/src/components/drawer/drawer.ts +266 -10
- package/src/components/dropdown/dropdown.ts +63 -8
- package/src/components/select/__tests__/ux-behaviors.test.ts +382 -4
- package/src/components/select/search.ts +16 -7
- package/src/components/select/select.css +7 -2
- package/src/components/select/select.ts +112 -20
- package/src/components/sticky/sticky.ts +55 -5
- package/src/helpers/data.ts +10 -0
- package/src/helpers/event-handler.ts +7 -6
- package/src/index.ts +2 -0
package/dist/ktui.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ktui.min.js","mappings":"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","sources":["webpack://@keenthemes/ktui/webpack/universalModuleDefinition","webpack://@keenthemes/ktui/./src/components/select/index.ts","webpack://@keenthemes/ktui/./src/components/reparent/reparent.ts","webpack://@keenthemes/ktui/./src/components/drawer/drawer.ts","webpack://@keenthemes/ktui/./src/components/sticky/index.ts","webpack://@keenthemes/ktui/./src/components/stepper/stepper.ts","webpack://@keenthemes/ktui/./src/components/toggle/toggle.ts","webpack://@keenthemes/ktui/./src/components/tabs/tabs.ts","webpack://@keenthemes/ktui/./src/components/collapse/collapse.ts","webpack://@keenthemes/ktui/./src/components/tooltip/tooltip.ts","webpack://@keenthemes/ktui/./src/components/scrollable/index.ts","webpack://@keenthemes/ktui/./src/components/toggle-password/index.ts","webpack://@keenthemes/ktui/./src/helpers/utils.ts","webpack://@keenthemes/ktui/./src/components/datatable/index.ts","webpack://@keenthemes/ktui/./src/components/component.ts","webpack://@keenthemes/ktui/./src/components/accordion/index.ts","webpack://@keenthemes/ktui/./src/components/image-input/image-input.ts","webpack://@keenthemes/ktui/./src/components/sticky/sticky.ts","webpack://@keenthemes/ktui/./src/components/modal/index.ts","webpack://@keenthemes/ktui/./src/components/select/remote.ts","webpack://@keenthemes/ktui/./src/components/scrollto/scrollto.ts","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/enums.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/math.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/within.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/createPopper.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/popper.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://@keenthemes/ktui/./src/components/scrollto/index.ts","webpack://@keenthemes/ktui/./src/components/reparent/index.ts","webpack://@keenthemes/ktui/./src/components/select/option.ts","webpack://@keenthemes/ktui/./src/components/theme-switch/theme-switch.ts","webpack://@keenthemes/ktui/./src/components/scrollable/scrollable.ts","webpack://@keenthemes/ktui/./src/components/dropdown/index.ts","webpack://@keenthemes/ktui/./src/helpers/event-handler.ts","webpack://@keenthemes/ktui/./src/components/accordion/accordion.ts","webpack://@keenthemes/ktui/./src/components/datatable/datatable-sort.ts","webpack://@keenthemes/ktui/./src/components/scrollspy/index.ts","webpack://@keenthemes/ktui/./src/components/select/combobox.ts","webpack://@keenthemes/ktui/./src/components/datatable/datatable-checkbox.ts","webpack://@keenthemes/ktui/./src/components/tabs/index.ts","webpack://@keenthemes/ktui/./src/components/toggle/index.ts","webpack://@keenthemes/ktui/./src/components/stepper/index.ts","webpack://@keenthemes/ktui/./src/components/toast/index.ts","webpack://@keenthemes/ktui/./src/components/datatable/datatable.ts","webpack://@keenthemes/ktui/./src/components/modal/modal.ts","webpack://@keenthemes/ktui/./src/components/select/dropdown.ts","webpack://@keenthemes/ktui/./src/components/dismiss/dismiss.ts","webpack://@keenthemes/ktui/./src/components/toggle-password/toggle-password.ts","webpack://@keenthemes/ktui/./src/components/dismiss/index.ts","webpack://@keenthemes/ktui/./src/components/select/search.ts","webpack://@keenthemes/ktui/./src/components/select/select.ts","webpack://@keenthemes/ktui/./src/components/tooltip/index.ts","webpack://@keenthemes/ktui/./src/index.ts","webpack://@keenthemes/ktui/./src/components/collapse/index.ts","webpack://@keenthemes/ktui/./src/components/dropdown/dropdown.ts","webpack://@keenthemes/ktui/./src/components/drawer/index.ts","webpack://@keenthemes/ktui/./src/helpers/data.ts","webpack://@keenthemes/ktui/./src/components/select/tags.ts","webpack://@keenthemes/ktui/./src/components/toast/toast.ts","webpack://@keenthemes/ktui/./src/helpers/dom.ts","webpack://@keenthemes/ktui/./src/components/select/utils.ts","webpack://@keenthemes/ktui/./src/components/image-input/index.ts","webpack://@keenthemes/ktui/./src/components/select/templates.ts","webpack://@keenthemes/ktui/./src/components/theme-switch/index.ts","webpack://@keenthemes/ktui/./src/components/select/config.ts","webpack://@keenthemes/ktui/./src/components/scrollspy/scrollspy.ts","webpack://@keenthemes/ktui/webpack/bootstrap","webpack://@keenthemes/ktui/webpack/runtime/define property getters","webpack://@keenthemes/ktui/webpack/runtime/hasOwnProperty shorthand","webpack://@keenthemes/ktui/webpack/runtime/make namespace object","webpack://@keenthemes/ktui/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTSelect } from './select';\nexport { KTSelectRemote } from './remote';\nexport { KTSelectCombobox } from './combobox';\nexport { KTSelectSearch } from './search';\nexport { KTSelectTags } from './tags';\nexport { KTSelectDropdown } from './dropdown';\nexport {\n\tfilterOptions,\n\tFocusManager,\n\tEventManager,\n\tTypeToSearchBuffer,\n} from './utils';\nexport { KTSelectConfigInterface, KTSelectOption } from './config';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTReparentInterface, KTReparentConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_REPARENT_INITIALIZED: boolean;\n\t\tKTReparent: typeof KTReparent;\n\t}\n}\n\nexport class KTReparent extends KTComponent implements KTReparentInterface {\n\tprotected override _name: string = 'reparent';\n\tprotected override _defaultConfig: KTReparentConfigInterface = {\n\t\tmode: '',\n\t\ttarget: '',\n\t};\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTReparentConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._update();\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._element) return;\n\t\tconst target = this._getOption('target') as string;\n\t\tconst targetEl = KTDom.getElement(target);\n\t\tconst mode = this._getOption('mode');\n\n\t\tif (targetEl && this._element.parentNode !== targetEl) {\n\t\t\tif (mode === 'prepend') {\n\t\t\t\ttargetEl.prepend(this._element);\n\t\t\t} else if (mode === 'append') {\n\t\t\t\ttargetEl.append(this._element);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic static handleResize(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\t() => {\n\t\t\t\t\tdocument\n\t\t\t\t\t\t.querySelectorAll('[data-kt-reparent-initialized]')\n\t\t\t\t\t\t.forEach((element) => {\n\t\t\t\t\t\t\tconst reparent = KTReparent.getInstance(element as HTMLElement);\n\t\t\t\t\t\t\tconsole.log('reparent update');\n\t\t\t\t\t\t\treparent?.update();\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTReparent {\n\t\treturn KTData.get(element, 'reparent') as KTReparent;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTReparentConfigInterface,\n\t): KTReparent {\n\t\treturn this.getInstance(element) || new KTReparent(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-reparent]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTReparent(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTReparent.createInstances();\n\n\t\tif (window.KT_REPARENT_INITIALIZED !== true) {\n\t\t\tKTReparent.handleResize();\n\t\t\twindow.KT_REPARENT_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTReparent = KTReparent;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTDrawerInterface, KTDrawerConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_DRAWER_INITIALIZED: boolean;\n\t\tKTDrawer: typeof KTDrawer;\n\t}\n}\n\nexport class KTDrawer extends KTComponent implements KTDrawerInterface {\n\tprotected override _name: string = 'drawer';\n\tprotected override _defaultConfig: KTDrawerConfigInterface = {\n\t\tzindex: '100',\n\t\tenable: true,\n\t\tclass: '',\n\t\tshownClass: 'flex',\n\t\thiddenClass: 'hidden',\n\t\tbackdrop: true,\n\t\tbackdropClass: 'kt-drawer-backdrop',\n\t\tbackdropStatic: false,\n\t\tkeyboard: true,\n\t\tdisableScroll: true,\n\t\tpersistent: false,\n\t\tcontainer: '',\n\t\tfocus: true,\n\t};\n\tprotected override _config: KTDrawerConfigInterface = this._defaultConfig;\n\tprotected _isOpen: boolean = false;\n\tprotected _isTransitioning: boolean = false;\n\tprotected _backdropElement: HTMLElement | null = null;\n\tprotected _relatedTarget: HTMLElement | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTDrawerConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._handleClose();\n\t\tthis._update();\n\t\tthis._handleContainer();\n\t}\n\n\tprotected _handleClose(): void {\n\t\tif (!this._element) return;\n\t\tKTEventHandler.on(this._element, '[data-kt-drawer-hide]', 'click', () => {\n\t\t\tthis._hide();\n\t\t});\n\t}\n\n\tprotected _toggle(relatedTarget?: HTMLElement): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen === true) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show(relatedTarget);\n\t\t}\n\t}\n\n\tprotected _show(relatedTarget?: HTMLElement): void {\n\t\tif (this._isOpen || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tKTDrawer.hide();\n\n\t\tif (this._getOption('backdrop') === true) this._createBackdrop();\n\n\t\tif (relatedTarget) this._relatedTarget = relatedTarget;\n\n\t\tif (!this._element) return;\n\t\tthis._isTransitioning = true;\n\t\tthis._element.classList.remove(this._getOption('hiddenClass') as string);\n\t\tthis._element.classList.add(this._getOption('shownClass') as string);\n\t\tthis._element.setAttribute('role', 'dialog');\n\t\tthis._element.setAttribute('aria-modal', 'true');\n\t\tthis._element.setAttribute('tabindex', '-1');\n\n\t\tconst zindex: number = parseInt(this._getOption('zindex') as string);\n\t\tif (zindex > 0) {\n\t\t\tthis._element.style.zIndex = `${zindex}`;\n\t\t}\n\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = 'hidden';\n\t\t}\n\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.add('open');\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\tif (this._getOption('focus') === true) {\n\t\t\t\tthis._autoFocus();\n\t\t\t}\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(): void {\n\t\tif (!this._element) return;\n\t\tif (this._isOpen === false || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isTransitioning = true;\n\t\tthis._element.removeAttribute('role');\n\t\tthis._element.removeAttribute('aria-modal');\n\t\tthis._element.removeAttribute('tabindex');\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = '';\n\t\t}\n\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.remove('open');\n\n\t\tif (this._getOption('backdrop') === true) {\n\t\t\tthis._deleteBackdrop();\n\t\t}\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tif (!this._element) return;\n\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\t\t\tthis._element.classList.add(this._getOption('hiddenClass') as string);\n\t\t\tthis._element.classList.remove(this._getOption('shownClass') as string);\n\t\t\tthis._element.style.zIndex = '';\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _update(): void {\n\t\tif ((this._getOption('class') as string)?.length > 0) {\n\t\t\tif (this.isEnabled()) {\n\t\t\t\tKTDom.addClass(this._element, this._getOption('class') as string);\n\t\t\t} else {\n\t\t\t\tKTDom.removeClass(this._element, this._getOption('class') as string);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _handleContainer(): void {\n\t\tif (this._getOption('container')) {\n\t\t\tif (this._getOption('container') === 'body') {\n\t\t\t\tdocument.body.appendChild(this._element);\n\t\t\t} else {\n\t\t\t\tdocument\n\t\t\t\t\t.querySelector(this._getOption('container') as string)\n\t\t\t\t\t?.appendChild(this._element);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _autoFocus(): void {\n\t\tif (!this._element) return;\n\t\tconst input: HTMLInputElement | null = this._element.querySelector(\n\t\t\t'[data-kt-drawer-focus]',\n\t\t);\n\t\tif (!input) return;\n\t\telse input.focus();\n\t}\n\n\tprotected _createBackdrop(): void {\n\t\tif (!this._element) return;\n\n\t\tconst zindex: number = parseInt(this._getOption('zindex') as string);\n\n\t\tthis._backdropElement = document.createElement('DIV');\n\t\tthis._backdropElement.style.zIndex = (zindex - 1).toString();\n\t\tthis._backdropElement.setAttribute('data-kt-drawer-backdrop', 'true');\n\t\tdocument.body.append(this._backdropElement);\n\t\tKTDom.reflow(this._backdropElement);\n\t\tKTDom.addClass(\n\t\t\tthis._backdropElement,\n\t\t\tthis._getOption('backdropClass') as string,\n\t\t);\n\n\t\tthis._backdropElement.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\t\t\tif (this._getOption('backdropStatic') === false) {\n\t\t\t\tthis._hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _deleteBackdrop(): void {\n\t\tif (!this._backdropElement) return;\n\n\t\tKTDom.reflow(this._backdropElement);\n\t\tthis._backdropElement.style.opacity = '0';\n\n\t\tKTDom.transitionEnd(this._backdropElement, () => {\n\t\t\tif (!this._backdropElement) return;\n\t\t\tKTDom.remove(this._backdropElement);\n\t\t});\n\t}\n\n\tprotected _isEnabled(): boolean {\n\t\treturn KTUtils.stringToBoolean(this._getOption('enable'));\n\t}\n\n\tpublic toggle(): void {\n\t\treturn this._toggle();\n\t}\n\n\tpublic show(relatedTarget?: HTMLElement): void {\n\t\treturn this._show(relatedTarget);\n\t}\n\n\tpublic hide(): void {\n\t\treturn this._hide();\n\t}\n\n\tpublic update(): void {\n\t\treturn this._update();\n\t}\n\n\tpublic getRelatedTarget(): HTMLElement | null {\n\t\treturn this._relatedTarget;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\tpublic isEnabled(): boolean {\n\t\treturn this._isEnabled();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTDrawer {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'drawer')) {\n\t\t\treturn KTData.get(element, 'drawer') as KTDrawer;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-drawer-initialized') === 'true') {\n\t\t\treturn new KTDrawer(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTDrawerConfigInterface,\n\t): KTDrawer {\n\t\treturn this.getInstance(element) || new KTDrawer(element, config);\n\t}\n\n\tpublic static hide(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-drawer-initialized]');\n\n\t\telements.forEach((element) => {\n\t\t\tconst drawer = KTDrawer.getInstance(element as HTMLElement);\n\n\t\t\tif (drawer && drawer.isOpen()) {\n\t\t\t\tdrawer.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleResize(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\t() => {\n\t\t\t\t\tdocument\n\t\t\t\t\t\t.querySelectorAll('[data-kt-drawer-initialized]')\n\t\t\t\t\t\t.forEach((element) => {\n\t\t\t\t\t\t\tconst drawer = KTDrawer.getInstance(element as HTMLElement);\n\t\t\t\t\t\t\tdrawer.update();\n\n\t\t\t\t\t\t\tif (drawer && drawer.isOpen() && !drawer.isEnabled()) {\n\t\t\t\t\t\t\t\tdrawer.hide();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static handleToggle(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-drawer-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst selector = target.getAttribute('data-kt-drawer-toggle');\n\t\t\t\tif (!selector) return;\n\n\t\t\t\tconst drawerEl = document.querySelector(selector);\n\t\t\t\tconst drawer = KTDrawer.getInstance(drawerEl as HTMLElement);\n\t\t\t\tif (drawer) {\n\t\t\t\t\tdrawer.toggle();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleDismiss(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-drawer-dismiss]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst modalElement = target.closest(\n\t\t\t\t\t'[data-kt-drawer=\"true\"]',\n\t\t\t\t) as HTMLElement;\n\t\t\t\tif (modalElement) {\n\t\t\t\t\tconst modal = KTDrawer.getInstance(modalElement);\n\t\t\t\t\tif (modal) {\n\t\t\t\t\t\tmodal.hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleClickAway() {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tconst drawerEl = document.querySelector(\n\t\t\t\t'.open[data-kt-drawer-initialized]',\n\t\t\t);\n\t\t\tif (!drawerEl) return;\n\n\t\t\tconst drawer = KTDrawer.getInstance(drawerEl as HTMLElement);\n\t\t\tif (!drawer) return;\n\n\t\t\tif (drawer.getOption('persistent')) return;\n\n\t\t\tif (drawer.getOption('backdrop')) return;\n\n\t\t\tif (\n\t\t\t\tdrawerEl !== event.target &&\n\t\t\t\tdrawer.getRelatedTarget() !== event.target &&\n\t\t\t\tdrawerEl.contains(event.target as HTMLElement) === false\n\t\t\t) {\n\t\t\t\tdrawer.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleKeyword() {\n\t\tdocument.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst drawerEl = document.querySelector(\n\t\t\t\t'.open[data-kt-drawer-initialized]',\n\t\t\t);\n\t\t\tconst drawer = KTDrawer.getInstance(drawerEl as HTMLElement);\n\t\t\tif (!drawer) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// if esc key was not pressed in combination with ctrl or alt or shift\n\t\t\tif (\n\t\t\t\tevent.key === 'Escape' &&\n\t\t\t\t!(event.ctrlKey || event.altKey || event.shiftKey)\n\t\t\t) {\n\t\t\t\tdrawer.hide();\n\t\t\t}\n\n\t\t\tif (event.code === 'Tab' && !event.metaKey) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-drawer]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTDrawer(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTDrawer.createInstances();\n\n\t\tif (window.KT_DRAWER_INITIALIZED !== true) {\n\t\t\tKTDrawer.handleToggle();\n\t\t\tKTDrawer.handleDismiss();\n\t\t\tKTDrawer.handleResize();\n\t\t\tKTDrawer.handleClickAway();\n\t\t\tKTDrawer.handleKeyword();\n\t\t\twindow.KT_DRAWER_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTDrawer = KTDrawer;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTSticky } from './sticky';\nexport type { KTStickyConfigInterface, KTStickyInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTStepperInterface, KTStepperConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_STEPPER_INITIALIZED: boolean;\n\t\tKTStepper: typeof KTStepper;\n\t}\n}\n\nexport class KTStepper extends KTComponent implements KTStepperInterface {\n\tprotected override _name: string = 'stepper';\n\tprotected override _defaultConfig: KTStepperConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tactiveStep: 1,\n\t};\n\tprotected override _config: KTStepperConfigInterface = this._defaultConfig;\n\tprotected _activeStep: number = 0;\n\tprotected _nextElement: HTMLElement | null = null;\n\tprotected _backElement: HTMLElement | null = null;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTStepperConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\t\tthis._nextElement = this._element.querySelector('[data-kt-stepper-next]');\n\t\tthis._backElement = this._element.querySelector('[data-kt-stepper-back]');\n\n\t\tthis._activeStep = 1;\n\t\tif (this._getOption('activeStep') !== this._activeStep) {\n\t\t\tthis._go(this._getOption('activeStep') as number);\n\t\t}\n\n\t\tthis._update();\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._nextElement) {\n\t\t\tconsole.error('data-kt-stepper-next not found');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._nextElement) {\n\t\t\tthis._nextElement.addEventListener('click', (event: Event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._goNext();\n\t\t\t});\n\t\t}\n\n\t\tif (this._backElement) {\n\t\t\tthis._backElement.addEventListener('click', (event: Event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._goBack();\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._element) return;\n\t\tlet state = '';\n\n\t\tif (this._activeStep === this._getTotalSteps()) {\n\t\t\tstate = 'last';\n\t\t} else if (this._activeStep === 1) {\n\t\t\tstate = 'first';\n\t\t} else {\n\t\t\tstate = 'between';\n\t\t}\n\n\t\tthis._element.classList.remove('first');\n\t\tthis._element.classList.remove('last');\n\t\tthis._element.classList.remove('between');\n\t\tthis._element.classList.add(state);\n\n\t\tthis._getItemElements().forEach((element, index) => {\n\t\t\tconst contentElement = KTDom.getElement(\n\t\t\t\telement.getAttribute('data-kt-stepper-item'),\n\t\t\t);\n\t\t\tif (!contentElement) return;\n\n\t\t\telement.classList.remove('active');\n\t\t\telement.classList.remove('completed');\n\t\t\telement.classList.remove('pending');\n\n\t\t\tconst numberElement = element.querySelector('[data-kt-stepper-number]');\n\t\t\tif (numberElement) numberElement.innerHTML = String(index + 1);\n\n\t\t\tif (index + 1 == this._activeStep) {\n\t\t\t\telement.classList.add('active');\n\t\t\t\tcontentElement.classList.remove(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcontentElement.classList.add(this._getOption('hiddenClass') as string);\n\t\t\t\tif (index + 1 < this._activeStep) {\n\t\t\t\t\telement.classList.add('completed');\n\t\t\t\t} else {\n\t\t\t\t\telement.classList.add('pending');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _getItemElements(): Array<HTMLElement> {\n\t\tconst elements: Array<HTMLElement> = [];\n\n\t\tthis._element\n\t\t\t.querySelectorAll('[data-kt-stepper-item]')\n\t\t\t.forEach((element) => {\n\t\t\t\tif (KTDom.isVisible(element as HTMLElement)) {\n\t\t\t\t\telements.push(element as HTMLElement);\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn elements;\n\t}\n\n\tprotected async _go(step: number): Promise<void> {\n\t\tif (step === this._activeStep || step > this._getTotalSteps() || step < 0)\n\t\t\treturn;\n\n\t\tconst payload = { step: step, cancel: false };\n\t\tawait this._fireEvent('change', payload);\n\t\tthis._dispatchEvent('change', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._activeStep = step;\n\t\tthis._update();\n\n\t\tthis._fireEvent('changed');\n\t\tthis._dispatchEvent('changed');\n\t}\n\n\tprotected _goTo(itemElement: HTMLElement): void {\n\t\tconst step = this._getStep(itemElement);\n\t\tthis._go(step);\n\t}\n\n\tprotected _getStep(itemElement: HTMLElement): number {\n\t\tlet step = -1;\n\n\t\tthis._getItemElements().forEach((element, index) => {\n\t\t\tif (element === itemElement) {\n\t\t\t\tstep = index + 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\n\t\treturn step;\n\t}\n\n\tprotected _getItemElement(step: number) {\n\t\treturn this._getItemElements()[step - 1];\n\t}\n\n\tprotected _getTotalSteps(): number {\n\t\treturn this._getItemElements().length;\n\t}\n\n\tprotected _goNext(): void {\n\t\tlet step;\n\n\t\tif (this._getTotalSteps() >= this._activeStep + 1) {\n\t\t\tstep = this._activeStep + 1;\n\t\t} else {\n\t\t\tstep = this._getTotalSteps();\n\t\t}\n\n\t\tthis._go(step);\n\t}\n\n\tprotected _goBack(): void {\n\t\tlet step;\n\n\t\tif (this._activeStep - 1 > 1) {\n\t\t\tstep = this._activeStep - 1;\n\t\t} else {\n\t\t\tstep = 1;\n\t\t}\n\n\t\tthis._go(step);\n\t}\n\n\tprotected _goLast(): void {\n\t\tconst step = this._getTotalSteps();\n\t\tthis._go(step);\n\t}\n\n\tprotected _goFirst(): void {\n\t\tconst step = 1;\n\t\tthis._go(step);\n\t}\n\n\tprotected _isLast(): boolean {\n\t\treturn this._getTotalSteps() === this._activeStep + 1;\n\t}\n\n\tprotected _isFirst(): boolean {\n\t\treturn this._activeStep === 1;\n\t}\n\n\tpublic isLast(): boolean {\n\t\treturn this._isLast();\n\t}\n\n\tpublic isFirst(): boolean {\n\t\treturn this._isFirst();\n\t}\n\n\tpublic go(step: number): void {\n\t\tthis._go(step);\n\t}\n\n\tpublic goTo(itemElement: HTMLElement): void {\n\t\tthis.goTo(itemElement);\n\t}\n\n\tpublic goFirst(): void {\n\t\tthis._goFirst();\n\t}\n\n\tpublic goLast(): void {\n\t\tthis._goLast();\n\t}\n\n\tpublic goNext(): void {\n\t\tthis._goNext();\n\t}\n\n\tpublic goBack(): void {\n\t\tthis._goBack();\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic getStep(itemElement: HTMLElement): number {\n\t\treturn this._getStep(itemElement);\n\t}\n\n\tpublic getItemElement(step: number): HTMLElement {\n\t\treturn this._getItemElement(step);\n\t}\n\n\tpublic getTotalSteps(): number {\n\t\treturn this._getTotalSteps();\n\t}\n\n\tpublic getItemElements(): Array<HTMLElement> {\n\t\treturn this._getItemElements();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTStepper {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'stepper')) {\n\t\t\treturn KTData.get(element, 'stepper') as KTStepper;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-stepper')) {\n\t\t\treturn new KTStepper(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTStepperConfigInterface,\n\t): KTStepper | null {\n\t\treturn this.getInstance(element) || new KTStepper(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-stepper]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTStepper(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTStepper.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTStepper = KTStepper;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTToggleConfigInterface, KTToggleInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKTToggle: typeof KTToggle;\n\t}\n}\n\nexport class KTToggle extends KTComponent implements KTToggleInterface {\n\tprotected override _name: string = 'toggle';\n\tprotected override _defaultConfig: KTToggleConfigInterface = {\n\t\ttarget: '',\n\t\tactiveClass: 'active',\n\t\tclass: '',\n\t\tremoveClass: '',\n\t\tattribute: '',\n\t};\n\tprotected override _config: KTToggleConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTToggleConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.addEventListener('click', () => {\n\t\t\tthis._toggle();\n\t\t});\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-toggle') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _toggle(): void {\n\t\tif (!this._element) return;\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element.classList.toggle(this._getOption('activeClass') as string);\n\t\tthis._update();\n\n\t\tthis._fireEvent('toggled');\n\t\tthis._dispatchEvent('toggled');\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._targetElement) return;\n\n\t\tif (this._getOption('removeClass')) {\n\t\t\tKTDom.removeClass(\n\t\t\t\tthis._targetElement,\n\t\t\t\tthis._getOption('removeClass') as string,\n\t\t\t);\n\t\t}\n\n\t\tif (!this._isActive()) {\n\t\t\tif (this._getOption('class')) {\n\t\t\t\tKTDom.addClass(this._targetElement, this._getOption('class') as string);\n\t\t\t}\n\n\t\t\tif (this._getOption('attribute')) {\n\t\t\t\tthis._targetElement.setAttribute(\n\t\t\t\t\tthis._getOption('attribute') as string,\n\t\t\t\t\t'true',\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tif (this._getOption('class')) {\n\t\t\t\tKTDom.removeClass(\n\t\t\t\t\tthis._targetElement,\n\t\t\t\t\tthis._getOption('class') as string,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (this._getOption('attribute')) {\n\t\t\t\tthis._targetElement.removeAttribute(\n\t\t\t\t\tthis._getOption('attribute') as string,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _isActive(): boolean {\n\t\tif (!this._element) return false;\n\n\t\treturn (\n\t\t\tKTDom.hasClass(this._targetElement, this._getOption('class') as string) ||\n\t\t\tthis._targetElement.hasAttribute(this._getOption('attribute') as string)\n\t\t);\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic isActive(): boolean {\n\t\treturn this._isActive();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTToggle {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'toggle')) {\n\t\t\treturn KTData.get(element, 'toggle') as KTToggle;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-toggle')) {\n\t\t\treturn new KTToggle(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTToggleConfigInterface,\n\t): KTToggle {\n\t\treturn this.getInstance(element) || new KTToggle(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-toggle]');\n\t\telements.forEach((element) => {\n\t\t\tnew KTToggle(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTToggle.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTToggle = KTToggle;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTTabsInterface, KTTabsConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_TABS_INITIALIZED: boolean;\n\t\tKTTabs: typeof KTTabs;\n\t}\n}\n\nexport class KTTabs extends KTComponent implements KTTabsInterface {\n\tprotected override _name: string = 'tabs';\n\tprotected override _defaultConfig: KTTabsConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t};\n\tprotected override _config: KTTabsConfigInterface = this._defaultConfig;\n\tprotected _currentTabElement: HTMLElement | null = null;\n\tprotected _currentContentElement: HTMLElement | null = null;\n\tprotected _lastTabElement: HTMLElement | null = null;\n\tprotected _lastContentElement: HTMLElement | null = null;\n\tprotected _tabElements: NodeListOf<HTMLElement> | null = null;\n\tprotected _isTransitioning: boolean = false;\n\n\tconstructor(element: HTMLElement, config?: KTTabsConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\t\tthis._tabElements = this._element.querySelectorAll('[data-kt-tab-toggle]');\n\t\tthis._currentTabElement = this._element.querySelector(\n\t\t\t'.active[data-kt-tab-toggle]',\n\t\t);\n\t\tthis._currentContentElement =\n\t\t\t(this._currentTabElement &&\n\t\t\t\t(KTDom.getElement(\n\t\t\t\t\tthis._currentTabElement.getAttribute('data-kt-tab-toggle'),\n\t\t\t\t) ||\n\t\t\t\t\tKTDom.getElement(this._currentTabElement.getAttribute('href')))) ||\n\t\t\tnull;\n\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-tab-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._show(target);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _show(tabElement: HTMLElement): void {\n\t\tif (this._isShown(tabElement) || this._isTransitioning) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._currentTabElement?.classList.remove('active');\n\t\tthis._currentTabElement?.classList.remove('selected');\n\t\tthis._currentContentElement?.classList.add(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._lastTabElement = this._currentTabElement;\n\t\tthis._getDropdownToggleElement(this._lastTabElement)?.classList.remove(\n\t\t\t'active',\n\t\t);\n\n\t\tthis._lastContentElement = this._currentContentElement;\n\t\tthis._currentTabElement = tabElement;\n\t\tthis._currentContentElement =\n\t\t\tKTDom.getElement(tabElement.getAttribute('data-kt-tab-toggle')) ||\n\t\t\tKTDom.getElement(tabElement.getAttribute('href'));\n\t\tthis._currentTabElement?.classList.add('active');\n\t\tthis._currentTabElement?.classList.add('selected');\n\t\tthis._currentContentElement?.classList.remove(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._getDropdownToggleElement(this._currentTabElement)?.classList.add(\n\t\t\t'active',\n\t\t);\n\n\t\tthis._currentContentElement.style.opacity = '0';\n\t\tKTDom.reflow(this._currentContentElement);\n\t\tthis._currentContentElement.style.opacity = '1';\n\n\t\tKTDom.transitionEnd(this._currentContentElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._currentContentElement.style.opacity = '';\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _getDropdownToggleElement(element: HTMLElement): HTMLElement {\n\t\tconst containerElement = element.closest(\n\t\t\t'[data-kt-dropdown-initialized],[data-kt-menu-initialized]',\n\t\t) as HTMLElement;\n\n\t\tif (containerElement) {\n\t\t\treturn containerElement.querySelector(\n\t\t\t\t'[data-kt-dropdown-toggle], [data-kt-menu-toggle]',\n\t\t\t);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprotected _isShown(tabElement: HTMLElement): boolean {\n\t\treturn tabElement.classList.contains('active');\n\t}\n\n\tpublic isShown(tabElement: HTMLElement): boolean {\n\t\treturn this._isShown(tabElement);\n\t}\n\n\tpublic show(tabElement: HTMLElement): void {\n\t\treturn this._show(tabElement);\n\t}\n\n\tpublic static keyboardArrow(): void {}\n\n\tpublic static keyboardJump(): void {}\n\n\tpublic static handleAccessibility(): void {}\n\n\tpublic static getInstance(element: HTMLElement): KTTabs {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'tabs')) {\n\t\t\treturn KTData.get(element, 'tabs') as KTTabs;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-tabs')) {\n\t\t\treturn new KTTabs(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTTabsConfigInterface,\n\t): KTTabs {\n\t\treturn this.getInstance(element) || new KTTabs(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-tabs]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTTabs(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTTabs.createInstances();\n\n\t\tif (window.KT_TABS_INITIALIZED !== true) {\n\t\t\tKTTabs.handleAccessibility();\n\t\t\twindow.KT_TABS_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTTabs = KTTabs;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTCollapseInterface, KTCollapseConfigInterface } from './types';\n\nexport class KTCollapse extends KTComponent implements KTCollapseInterface {\n\tprotected override _name: string = 'collapse';\n\tprotected override _defaultConfig: KTCollapseConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tactiveClass: 'active',\n\t\ttarget: '',\n\t};\n\tprotected override _config: KTCollapseConfigInterface = this._defaultConfig;\n\tprotected _isAnimating: boolean = false;\n\tprotected _targetElement: HTMLElement;\n\n\tconstructor(element: HTMLElement, config?: KTCollapseConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-collapse') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _isOpen(): boolean {\n\t\treturn this._targetElement.classList.contains(\n\t\t\tthis._getOption('activeClass') as string,\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tthis._toggle();\n\t\t});\n\t}\n\n\tprotected _expand(): void {\n\t\tif (this._isAnimating || this._isOpen()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('expand', payload);\n\t\tthis._dispatchEvent('expand', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._element) {\n\t\t\tthis._element.setAttribute('aria-expanded', 'true');\n\t\t\tthis._element.classList.add(this._getOption('activeClass') as string);\n\t\t}\n\t\tthis._targetElement.classList.remove(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._targetElement.classList.add(this._getOption('activeClass') as string);\n\n\t\tthis._targetElement.style.height = '0px';\n\t\tthis._targetElement.style.overflow = 'hidden';\n\t\tKTDom.reflow(this._targetElement);\n\t\tthis._targetElement.style.height = `${this._targetElement.scrollHeight}px`;\n\t\tthis._isAnimating = true;\n\n\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\tthis._isAnimating = false;\n\t\t\tthis._targetElement.style.height = '';\n\t\t\tthis._targetElement.style.overflow = '';\n\n\t\t\tthis._fireEvent('expanded');\n\t\t\tthis._dispatchEvent('expanded');\n\t\t});\n\t}\n\n\tprotected _collapse(): void {\n\t\tif (this._isAnimating || !this._isOpen()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('collapse', payload);\n\t\tthis._dispatchEvent('collapse', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._element) return;\n\t\tthis._element.setAttribute('aria-expanded', 'false');\n\t\tthis._element.classList.remove(this._getOption('activeClass') as string);\n\t\tthis._targetElement.classList.remove(\n\t\t\tthis._getOption('activeClass') as string,\n\t\t);\n\n\t\tthis._targetElement.style.height = `${this._targetElement.scrollHeight}px`;\n\t\tKTDom.reflow(this._targetElement);\n\t\tthis._targetElement.style.height = `0px`;\n\t\tthis._targetElement.style.overflow = 'hidden';\n\t\tthis._isAnimating = true;\n\n\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\tthis._isAnimating = false;\n\t\t\tthis._targetElement.classList.add(\n\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t);\n\t\t\tthis._targetElement.style.overflow = '';\n\n\t\t\tthis._fireEvent('collapsed');\n\t\t\tthis._dispatchEvent('collapsed');\n\t\t});\n\t}\n\n\tprotected _toggle(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen()) {\n\t\t\tthis._collapse();\n\t\t} else {\n\t\t\tthis._expand();\n\t\t}\n\t}\n\n\tpublic expand(): void {\n\t\treturn this._expand();\n\t}\n\n\tpublic collapse(): void {\n\t\treturn this._collapse();\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTCollapse {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'collapse')) {\n\t\t\treturn KTData.get(element, 'collapse') as KTCollapse;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-collapse')) {\n\t\t\treturn new KTCollapse(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTCollapseConfigInterface,\n\t): KTCollapse {\n\t\treturn this.getInstance(element) || new KTCollapse(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-collapse]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTCollapse(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTCollapse.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTCollapse = KTCollapse;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTTooltipInterface, KTTooltipConfigInterface } from './types';\nimport {\n\tcreatePopper,\n\tPositioningStrategy,\n\tInstance,\n\tPlacement,\n} from '@popperjs/core';\nimport { KTTooltipTriggerType } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_TOOLTIP_INITIALIZED: boolean;\n\t\tKTTooltip: typeof KTTooltip;\n\t}\n}\n\nexport class KTTooltip extends KTComponent implements KTTooltipInterface {\n\tprotected override _name: string = 'tooltip';\n\tprotected override _defaultConfig: KTTooltipConfigInterface = {\n\t\ttarget: '',\n\t\thiddenClass: 'hidden',\n\t\ttrigger: 'hover',\n\t\tplacement: 'top',\n\t\tplacementRtl: 'top',\n\t\tcontainer: '',\n\t\tstrategy: 'fixed',\n\t\toffset: '0, 5px',\n\t\toffsetRtl: '0, 5px',\n\t\tdelayShow: 0,\n\t\tdelayHide: 0,\n\t\tpermanent: false,\n\t\tzindex: '100',\n\t};\n\tprotected override _config: KTTooltipConfigInterface = this._defaultConfig;\n\tprotected _isOpen: boolean = false;\n\tprotected _targetElement: HTMLElement;\n\tprotected _popper!: Instance;\n\tprotected _transitioning: boolean = false;\n\tprotected _timeout!: ReturnType<typeof setTimeout>;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTTooltipConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-tooltip') as string,\n\t\t\t) ||\n\t\t\tthis._element.querySelector('[data-kt-tooltip-content]') ||\n\t\t\tKTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tif (this._getOption('trigger') === 'click') {\n\t\t\tthis._element.addEventListener('click', () => this._toggle());\n\t\t}\n\n\t\tif (this._getOption('trigger') === 'focus') {\n\t\t\tthis._element.addEventListener('focus', () => this._toggle());\n\t\t\tthis._element.addEventListener('blur', () => this._hide());\n\t\t}\n\n\t\tif (this._getOption('trigger') === 'hover') {\n\t\t\tthis._element.addEventListener('mouseenter', () => this._show());\n\t\t\tthis._element.addEventListener('mouseleave', () => this._hide());\n\t\t}\n\t}\n\n\tprotected _show(): void {\n\t\tif (this._timeout) {\n\t\t\tclearTimeout(this._timeout);\n\t\t}\n\n\t\tif (this._isOpen) return;\n\n\t\tthis._timeout = setTimeout(\n\t\t\t() => {\n\t\t\t\tconst payload = { cancel: false };\n\t\t\t\tthis._fireEvent('show', payload);\n\t\t\t\tthis._dispatchEvent('show', payload);\n\t\t\t\tif (payload.cancel === true) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!this._targetElement) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!this._element) return;\n\n\t\t\t\tthis._createPopper();\n\t\t\t\tthis._handleContainer();\n\t\t\t\tthis._setZindex();\n\n\t\t\t\tthis._targetElement.classList.add('show');\n\t\t\t\tthis._targetElement.classList.remove(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\t\t\t\tthis._targetElement.style.opacity = '0';\n\t\t\t\tKTDom.reflow(this._targetElement);\n\t\t\t\tthis._targetElement.style.opacity = '1';\n\t\t\t\tthis._transitioning = true;\n\t\t\t\tthis._isOpen = true;\n\n\t\t\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\t\t\tthis._targetElement.style.opacity = '';\n\t\t\t\t\tthis._transitioning = false;\n\t\t\t\t\tthis._fireEvent('shown');\n\t\t\t\t\tthis._dispatchEvent('shown');\n\t\t\t\t});\n\t\t\t},\n\t\t\tthis._getOption('delayShow') as number,\n\t\t);\n\t}\n\n\tprotected _hide(): void {\n\t\tif (this._timeout) {\n\t\t\tclearTimeout(this._timeout);\n\t\t}\n\n\t\tif (!this._isOpen) return;\n\n\t\tthis._timeout = setTimeout(\n\t\t\t() => {\n\t\t\t\tconst payload = { cancel: false };\n\t\t\t\tthis._fireEvent('hide', payload);\n\t\t\t\tthis._dispatchEvent('hide', payload);\n\t\t\t\tif (payload.cancel === true) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!this._targetElement) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis._targetElement.style.opacity = '1';\n\t\t\t\tKTDom.reflow(this._targetElement);\n\t\t\t\tthis._targetElement.style.opacity = '0';\n\t\t\t\tthis._transitioning = true;\n\t\t\t\tthis._isOpen = false;\n\n\t\t\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\t\t\tthis._popper.destroy();\n\t\t\t\t\tthis._targetElement.classList.remove('show');\n\t\t\t\t\tthis._targetElement.classList.add(\n\t\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t\t);\n\t\t\t\t\tthis._targetElement.style.opacity = '';\n\t\t\t\t\tthis._transitioning = false;\n\t\t\t\t\tthis._fireEvent('hidden');\n\t\t\t\t\tthis._dispatchEvent('hidden');\n\t\t\t\t});\n\t\t\t},\n\t\t\tthis._getOption('delayHide') as number,\n\t\t);\n\t}\n\n\tprotected _toggle(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show();\n\t\t}\n\t}\n\n\tprotected _createPopper(): void {\n\t\tif (!this._element) return;\n\n\t\tconst isRtl = KTDom.isRTL();\n\n\t\t// Placement\n\t\tlet placement = this._getOption('placement') as Placement;\n\t\tif (isRtl && this._getOption('placementRtl')) {\n\t\t\tplacement = this._getOption('placementRtl') as Placement;\n\t\t}\n\n\t\t// Offset\n\t\tlet offsetValue = this._getOption('offset');\n\t\tif (isRtl && this._getOption('offsetRtl')) {\n\t\t\toffsetValue = this._getOption('offsetRtl') as Placement;\n\t\t}\n\t\tconst offset = offsetValue\n\t\t\t? offsetValue\n\t\t\t\t\t.toString()\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.map((value) => parseInt(value.trim(), 10))\n\t\t\t: [0, 0];\n\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._popper = createPopper(this._element, this._targetElement, {\n\t\t\tplacement: placement,\n\t\t\tstrategy: this._getOption('strategy') as PositioningStrategy,\n\t\t\tmodifiers: [\n\t\t\t\t{\n\t\t\t\t\tname: 'offset',\n\t\t\t\t\toptions: {\n\t\t\t\t\t\toffset,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\n\tprotected _handleContainer(): void {\n\t\tif (this._getOption('container')) {\n\t\t\tif (this._getOption('container') === 'body') {\n\t\t\t\tdocument.body.appendChild(this._targetElement);\n\t\t\t} else {\n\t\t\t\tdocument\n\t\t\t\t\t.querySelector(this._getOption('container') as string)\n\t\t\t\t\t?.appendChild(this._targetElement);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _setZindex(): void {\n\t\tlet zindex: number = parseInt(this._getOption('zindex') as string);\n\n\t\tif (parseInt(KTDom.getCssProp(this._element, 'z-index')) > zindex) {\n\t\t\tzindex = parseInt(KTDom.getCssProp(this._element, 'z-index'));\n\t\t}\n\n\t\tif (KTDom.getHighestZindex(this._element) > zindex) {\n\t\t\tzindex = KTDom.getHighestZindex(this._element) + 1;\n\t\t}\n\n\t\tthis._targetElement.style.zIndex = String(zindex);\n\t}\n\n\tpublic show(): void {\n\t\tthis._show();\n\t}\n\n\tpublic hide(): void {\n\t\tthis._hide();\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic getContentElement(): HTMLElement | null {\n\t\treturn this._targetElement;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\tpublic getTriggerOption(): KTTooltipTriggerType {\n\t\treturn this._getOption('trigger') as KTTooltipTriggerType;\n\t}\n\n\tpublic isPermanent(): boolean {\n\t\treturn this._getOption('permanent') as boolean;\n\t}\n\n\tpublic static initHandlers(): void {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tdocument\n\t\t\t\t.querySelectorAll('[data-kt-tooltip-initialized]')\n\t\t\t\t.forEach((tooltipElement) => {\n\t\t\t\t\tconst tooltip = KTTooltip.getInstance(tooltipElement as HTMLElement);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\ttooltip &&\n\t\t\t\t\t\ttooltip.isOpen() &&\n\t\t\t\t\t\ttooltip.getTriggerOption() !== 'hover' &&\n\t\t\t\t\t\t!tooltip.isPermanent()\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst contentElement = tooltip.getContentElement();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcontentElement &&\n\t\t\t\t\t\t\t(contentElement === event.target ||\n\t\t\t\t\t\t\t\tcontentElement.contains(event.target as HTMLElement))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttooltip.hide();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTTooltip {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'tooltip')) {\n\t\t\treturn KTData.get(element, 'tooltip') as KTTooltip;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-tooltip')) {\n\t\t\treturn new KTTooltip(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTTooltipConfigInterface,\n\t): KTTooltip {\n\t\treturn this.getInstance(element) || new KTTooltip(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tdocument.querySelectorAll('[data-kt-tooltip]').forEach((element) => {\n\t\t\tnew KTTooltip(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTTooltip.createInstances();\n\n\t\tif (window.KT_TOOLTIP_INITIALIZED !== true) {\n\t\t\tKTTooltip.initHandlers();\n\t\t\twindow.KT_TOOLTIP_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTTooltip = KTTooltip;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTScrollable } from './scrollable';\nexport type {\n\tKTScrollableConfigInterface,\n\tKTScrollableInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTTogglePassword } from './toggle-password';\nexport type {\n\tKTTogglePasswordConfigInterface,\n\tKTTogglePasswordInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTOptionType } from '../types';\n\nconst KTUtils = {\n\tgeUID(prefix: string = ''): string {\n\t\treturn prefix + Math.floor(Math.random() * new Date().getTime());\n\t},\n\n\tgetCssVar(variable: string): string {\n\t\tlet hex = getComputedStyle(document.documentElement).getPropertyValue(\n\t\t\tvariable,\n\t\t);\n\n\t\tif (hex && hex.length > 0) {\n\t\t\thex = hex.trim();\n\t\t}\n\n\t\treturn hex;\n\t},\n\n\tparseDataAttribute(value: string): KTOptionType {\n\t\tif (value === 'true') {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (value === 'false') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (value === Number(value).toString()) {\n\t\t\treturn Number(value);\n\t\t}\n\n\t\tif (value === '' || value === 'null') {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (typeof value !== 'string') {\n\t\t\treturn value;\n\t\t}\n\n\t\ttry {\n\t\t\treturn KTUtils.parseJson(value) as object;\n\t\t} catch {\n\t\t\treturn value;\n\t\t}\n\t},\n\n\tparseJson(value: string): JSON {\n\t\treturn value && value.length > 0\n\t\t\t? JSON.parse(decodeURIComponent(value))\n\t\t\t: null;\n\t},\n\n\tparseSelector(selector: string): string {\n\t\tif (selector && window.CSS && window.CSS.escape) {\n\t\t\t// Escape any IDs in the selector using CSS.escape\n\t\t\tselector = selector.replace(\n\t\t\t\t/#([^\\s\"#']+)/g,\n\t\t\t\t(match, id) => `#${window.CSS.escape(id)}`,\n\t\t\t);\n\t\t}\n\n\t\treturn selector;\n\t},\n\n\tcapitalize(value: string): string {\n\t\treturn value.charAt(0).toUpperCase() + value.slice(1);\n\t},\n\n\tuncapitalize(value: string): string {\n\t\treturn value.charAt(0).toLowerCase() + value.slice(1);\n\t},\n\n\tcamelCase(value: string): string {\n\t\treturn value.replace(/-([a-z])/g, (match, letter) => {\n\t\t\treturn letter.toUpperCase();\n\t\t});\n\t},\n\n\tcamelReverseCase(str: string): string {\n\t\treturn str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\t},\n\n\tisRTL(): boolean {\n\t\tconst htmlElement = document.querySelector('html');\n\t\treturn Boolean(\n\t\t\thtmlElement && htmlElement.getAttribute('direction') === 'rtl',\n\t\t);\n\t},\n\n\tthrottle(\n\t\ttimer: undefined | ReturnType<typeof setTimeout>,\n\t\tfunc: CallableFunction,\n\t\tdelay: number,\n\t): void {\n\t\t// If setTimeout is already scheduled, no need to do anything\n\t\tif (timer) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Schedule a setTimeout after delay seconds\n\t\ttimer = setTimeout(() => {\n\t\t\tfunc();\n\n\t\t\t// Once setTimeout function execution is finished, timerId = undefined so that in <br>\n\t\t\t// the next scroll event function execution can be scheduled by the setTimeout\n\t\t\tclearTimeout(timer);\n\t\t}, delay);\n\t},\n\n\tchecksum(value: string): string {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\thash = ((hash << 5) - hash + value.charCodeAt(i)) | 0;\n\t\t}\n\n\t\treturn ('0000000' + (hash >>> 0).toString(16)).slice(-8);\n\t},\n\n\tstringToBoolean: (value: KTOptionType): boolean | null => {\n\t\tif (typeof value === 'boolean') return value;\n\t\tif (typeof value !== 'string') return null;\n\n\t\tconst cleanedStr = value.toLowerCase().trim();\n\t\tif (cleanedStr === 'true') return true;\n\t\tif (cleanedStr === 'false') return false;\n\t\treturn null;\n\t},\n\n\tstringToObject: <T>(value: KTOptionType): T | null => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(value.toString() as string);\n\t\t\tif (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n\t\t\t\treturn parsed as T;\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\tstringToInteger: (value: KTOptionType | number): number | null => {\n\t\t// If already a number, return it as an integer\n\t\tif (typeof value === 'number' && !isNaN(value)) {\n\t\t\treturn Math.floor(value);\n\t\t}\n\n\t\t// If not a string, return null\n\t\tif (typeof value !== 'string') return null;\n\n\t\tconst cleanedStr = value.trim();\n\t\tconst num = parseInt(cleanedStr, 10);\n\t\tif (!isNaN(num) && cleanedStr !== '') {\n\t\t\treturn num;\n\t\t}\n\t\treturn null;\n\t},\n\n\tstringToFloat: (value: KTOptionType | number): number | null => {\n\t\t// If already a number, return it as is\n\t\tif (typeof value === 'number' && !isNaN(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// If not a string, return null\n\t\tif (typeof value !== 'string') return null;\n\n\t\tconst cleanedStr = value.trim();\n\t\tconst num = parseFloat(cleanedStr);\n\t\tif (!isNaN(num) && cleanedStr !== '') {\n\t\t\treturn num;\n\t\t}\n\t\treturn null;\n\t},\n};\n\nexport default KTUtils;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTDataTable } from './datatable';\nexport type {\n\tKTDataTableSortOrderInterface,\n\tKTDataTableDataInterface,\n\tKTDataTableStateInterface as KTDataTableState,\n\tKTDataTableInterface,\n\tKTDataTableResponseDataInterface,\n\tKTDataTableConfigInterface,\n\tKTDataTableColumnFilterTypeInterface,\n\tKTDataTableColumnFilterInterface,\n\tKTDataTableCheckConfigInterface,\n\tKTDataTableCheckInterface,\n\tKTDataTableCheckChangePayloadInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n/* eslint-disable guard-for-in */\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\ndeclare global {\n\tinterface Window {\n\t\tKTGlobalComponentsConfig: object;\n\t}\n}\n\nimport KTData from '../helpers/data';\nimport KTDom from '../helpers/dom';\nimport KTUtils from '../helpers/utils';\nimport { KTOptionType } from '../types';\n\nexport default class KTComponent {\n\tprotected _dataOptionPrefix: string = 'kt-';\n\tprotected _name: string;\n\tprotected _defaultConfig: object;\n\tprotected _config: object;\n\tprotected _events: Map<string, Map<string, CallableFunction>>;\n\tprotected _uid: string | null = null;\n\tprotected _element: HTMLElement | null = null;\n\n\tprotected _init(element: HTMLElement | null) {\n\t\telement = KTDom.getElement(element);\n\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element = element;\n\t\tthis._events = new Map();\n\t\tthis._uid = KTUtils.geUID(this._name);\n\n\t\tthis._element.setAttribute(`data-kt-${this._name}-initialized`, 'true');\n\n\t\tKTData.set(this._element, this._name, this);\n\t}\n\n\tprotected async _fireEvent(\n\t\teventType: string,\n\t\tpayload: object = null,\n\t): Promise<void> {\n\t\tconst callbacks = this._events.get(eventType);\n\n\t\tif (callbacks instanceof Map == false) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait Promise.all(\n\t\t\tArray.from(callbacks.values())\n\t\t\t\t.filter((callable) => {\n\t\t\t\t\treturn typeof callable === 'function';\n\t\t\t\t})\n\t\t\t\t.map((callable) => {\n\t\t\t\t\treturn Promise.resolve(callable(payload));\n\t\t\t\t}),\n\t\t);\n\t}\n\n\tprotected _dispatchEvent(eventType: string, payload: object = null): void {\n\t\tconst event = new CustomEvent(eventType, {\n\t\t\tdetail: { payload },\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t\tcomposed: false,\n\t\t});\n\n\t\tif (!this._element) return;\n\t\tthis._element.dispatchEvent(event);\n\t}\n\n\tprotected _getOption(name: string): KTOptionType {\n\t\tconst value = this._config[name as keyof object];\n\t\tconst reponsiveValue = KTDom.getCssProp(\n\t\t\tthis._element,\n\t\t\t`--kt-${this._name}-${KTUtils.camelReverseCase(name)}`,\n\t\t);\n\n\t\treturn reponsiveValue || value;\n\t}\n\n\tprotected _getGlobalConfig(): object {\n\t\tif (\n\t\t\twindow.KTGlobalComponentsConfig &&\n\t\t\t(window.KTGlobalComponentsConfig as object)[this._name as keyof object]\n\t\t) {\n\t\t\treturn (window.KTGlobalComponentsConfig as object)[\n\t\t\t\tthis._name as keyof object\n\t\t\t] as object;\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t}\n\n\tprotected _buildConfig(config: object = {}): void {\n\t\tif (!this._element) return;\n\n\t\tthis._config = {\n\t\t\t...this._defaultConfig,\n\t\t\t...this._getGlobalConfig(),\n\t\t\t...KTDom.getDataAttributes(\n\t\t\t\tthis._element,\n\t\t\t\tthis._dataOptionPrefix + this._name,\n\t\t\t),\n\t\t\t...config,\n\t\t};\n\t}\n\n\tpublic dispose(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.removeAttribute(`data-kt-${this._name}-initialized`);\n\t\tKTData.remove(this._element, this._name);\n\t}\n\n\tpublic on(eventType: string, callback: CallableFunction): string {\n\t\tconst eventId = KTUtils.geUID();\n\n\t\tif (!this._events.get(eventType)) {\n\t\t\tthis._events.set(eventType, new Map());\n\t\t}\n\n\t\tthis._events.get(eventType).set(eventId, callback);\n\n\t\treturn eventId;\n\t}\n\n\tpublic off(eventType: string, eventId: string): void {\n\t\tthis._events.get(eventType)?.delete(eventId);\n\t}\n\n\tpublic getOption(name: string): KTOptionType {\n\t\treturn this._getOption(name as keyof object);\n\t}\n\n\tpublic getElement(): HTMLElement {\n\t\tif (!this._element) return null;\n\t\treturn this._element;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTAccordion } from './accordion';\nexport type { KTAccordionConfigInterface, KTAccordionInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTImageInputInterface, KTImageInputConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_IMAGE_INPUT_INITIALIZED: boolean;\n\t\tKTImageInput: typeof KTImageInput;\n\t}\n}\n\nexport class KTImageInput extends KTComponent implements KTImageInputInterface {\n\tprotected override _name: string = 'image-input';\n\tprotected override _defaultConfig: KTImageInputConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t};\n\tprotected _inputElement: HTMLInputElement;\n\tprotected _hiddenElement: HTMLInputElement;\n\tprotected _removeElement: HTMLElement;\n\tprotected _previewElement: HTMLElement;\n\tprotected _previewUrl: string = '';\n\tprotected _lastMode: string;\n\tprotected _selectedFile: File | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTImageInputConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._inputElement = this._element.querySelector('input[type=\"file\"]')!;\n\t\tthis._hiddenElement = this._element.querySelector('input[type=\"hidden\"]')!;\n\t\tthis._removeElement = this._element.querySelector(\n\t\t\t'[data-kt-image-input-remove]',\n\t\t)!;\n\t\tthis._previewElement = this._element.querySelector(\n\t\t\t'[data-kt-image-input-preview]',\n\t\t)!;\n\n\t\tthis._update();\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-image-input-placeholder]',\n\t\t\t'click',\n\t\t\t(event: Event) => {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tthis._inputElement.click();\n\t\t\t},\n\t\t);\n\n\t\tthis._inputElement.addEventListener('change', () => {\n\t\t\tthis._change();\n\t\t});\n\n\t\tthis._removeElement.addEventListener('click', () => {\n\t\t\tthis._remove();\n\t\t});\n\t}\n\n\tprotected _change(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('change', payload);\n\t\tthis._dispatchEvent('change', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst reader = new FileReader();\n\n\t\treader.onload = () => {\n\t\t\tthis._previewElement.style.backgroundImage = `url(${reader.result})`;\n\t\t};\n\n\t\treader.readAsDataURL(this._inputElement.files[0]);\n\t\tthis._selectedFile = this._inputElement.files[0];\n\t\tthis._lastMode = 'new';\n\n\t\tthis._element.classList.add('changed');\n\t\tthis._removeElement.classList.remove('hidden');\n\t\tthis._element.classList.remove('empty');\n\n\t\tthis._fireEvent('changed');\n\t\tthis._dispatchEvent('changed');\n\t}\n\n\tprotected _remove(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('remove', payload);\n\t\tthis._dispatchEvent('remove', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element.classList.remove('empty');\n\t\tthis._element.classList.remove('changed');\n\n\t\tif (this._lastMode == 'new') {\n\t\t\tif (this._previewUrl == '')\n\t\t\t\tthis._removeElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\n\t\t\tif (this._previewUrl) {\n\t\t\t\tthis._previewElement.style.backgroundImage = `url(${this._previewUrl})`;\n\t\t\t} else {\n\t\t\t\tthis._previewElement.style.backgroundImage = 'none';\n\t\t\t\tthis._element.classList.add('empty');\n\t\t\t}\n\n\t\t\tthis._inputElement.value = '';\n\t\t\tthis._hiddenElement.value = '';\n\t\t\tthis._selectedFile = null;\n\n\t\t\tthis._lastMode = 'saved';\n\t\t} else if (this._lastMode == 'saved') {\n\t\t\tif (this._previewUrl == '')\n\t\t\t\tthis._removeElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\n\t\t\tthis._previewElement.style.backgroundImage = 'none';\n\t\t\tthis._element.classList.add('empty');\n\n\t\t\tthis._hiddenElement.value = '1';\n\t\t\tthis._inputElement.value = '';\n\t\t\tthis._selectedFile = null;\n\n\t\t\tthis._lastMode = 'placeholder';\n\t\t} else if (this._lastMode == 'placeholder') {\n\t\t\tif (this._previewUrl == '')\n\t\t\t\tthis._removeElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\n\t\t\tif (this._previewUrl) {\n\t\t\t\tthis._previewElement.style.backgroundImage = `url(${this._previewUrl})`;\n\t\t\t} else {\n\t\t\t\tthis._element.classList.add('empty');\n\t\t\t}\n\n\t\t\tthis._inputElement.value = '';\n\t\t\tthis._hiddenElement.value = '';\n\t\t\tthis._selectedFile = null;\n\n\t\t\tthis._lastMode = 'saved';\n\t\t}\n\n\t\tthis._fireEvent('remove');\n\t\tthis._dispatchEvent('remove');\n\t}\n\n\tprotected _update() {\n\t\tif (this._previewElement.style.backgroundImage) {\n\t\t\tthis._setPreviewUrl(this._previewElement.style.backgroundImage);\n\t\t\tthis._removeElement.classList.remove(\n\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t);\n\t\t\tthis._lastMode = 'saved';\n\t\t} else {\n\t\t\tthis._removeElement.classList.add(\n\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t);\n\t\t\tthis._element.classList.add('empty');\n\t\t\tthis._lastMode = 'placeholder';\n\t\t}\n\t}\n\n\tprotected _getPreviewUrl(): string {\n\t\treturn this._previewUrl;\n\t}\n\n\tprotected _setPreviewUrl(url: string): void {\n\t\tthis._previewUrl = url.replace(/(url\\(|\\)|\")/g, '');\n\t}\n\n\tpublic isEmpty(): boolean {\n\t\treturn this._selectedFile === null;\n\t}\n\n\tpublic isChanged(): boolean {\n\t\treturn this._selectedFile !== null;\n\t}\n\n\tpublic remove(): void {\n\t\tthis._remove();\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic setPreviewUrl(url: string): void {\n\t\tthis._setPreviewUrl(url);\n\t}\n\n\tpublic getPreviewUrl(): string {\n\t\treturn this._getPreviewUrl();\n\t}\n\n\tpublic getSelectedFile(): File | null {\n\t\treturn this._selectedFile;\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTImageInput | null {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'image-input')) {\n\t\t\treturn KTData.get(element, 'image-input') as KTImageInput;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-image-input')) {\n\t\t\treturn new KTImageInput(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTImageInputConfigInterface,\n\t): KTImageInput {\n\t\treturn this.getInstance(element) || new KTImageInput(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-image-input]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTImageInput(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTImageInput.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTImageInput = KTImageInput;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTStickyInterface, KTStickyConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_STICKY_INITIALIZED: boolean;\n\t\tKTSticky: typeof KTSticky;\n\t}\n}\n\nexport class KTSticky extends KTComponent implements KTStickyInterface {\n\tprotected override _name: string = 'sticky';\n\tprotected override _defaultConfig: KTStickyConfigInterface = {\n\t\ttarget: 'body',\n\t\tname: '',\n\t\tclass: '',\n\t\ttop: '',\n\t\tmiddle: false,\n\t\tbottom: '',\n\t\tstart: '',\n\t\tcenter: false,\n\t\tend: '',\n\t\twidth: '',\n\t\tzindex: '',\n\t\toffset: 0,\n\t\treverse: false,\n\t\trelease: '',\n\t\tactivate: '',\n\t};\n\tprotected override _config: KTStickyConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement | Document | null = null;\n\n\tprotected _attributeRoot: string;\n\tprotected _eventTriggerState: boolean;\n\tprotected _lastScrollTop: number;\n\tprotected _releaseElement: HTMLElement;\n\tprotected _activateElement: HTMLElement;\n\tprotected _wrapperElement: HTMLElement;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTStickyConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._releaseElement = KTDom.getElement(\n\t\t\tthis._getOption('release') as string,\n\t\t);\n\t\tthis._activateElement = KTDom.getElement(\n\t\t\tthis._getOption('activate') as string,\n\t\t);\n\t\tthis._wrapperElement = this._element.closest('[data-kt-sticky-wrapper]');\n\t\tthis._attributeRoot = `data-kt-sticky-${this._getOption('name')}`;\n\t\tthis._eventTriggerState = true;\n\t\tthis._lastScrollTop = 0;\n\n\t\tconst targetElement =\n\t\t\tthis._getTarget() === 'body'\n\t\t\t\t? document\n\t\t\t\t: KTDom.getElement(this._getTarget());\n\t\tif (!targetElement) return;\n\n\t\tthis._targetElement = targetElement;\n\n\t\tthis._handlers();\n\t\tthis._process();\n\t\tthis._update();\n\t}\n\n\tprivate _getTarget(): string {\n\t\treturn (\n\t\t\t(this._element.getAttribute('data-kt-sticky-target') as string) ||\n\t\t\t(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\t() => {\n\t\t\t\t\tthis._update();\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\n\t\tthis._targetElement.addEventListener('scroll', () => {\n\t\t\tthis._process();\n\t\t});\n\t}\n\n\tprotected _process(): void {\n\t\tconst reverse = this._getOption('reverse');\n\t\tconst offset = this._getOffset();\n\n\t\tif (offset < 0) {\n\t\t\tthis._disable();\n\t\t\treturn;\n\t\t}\n\n\t\tconst st =\n\t\t\tthis._getTarget() === 'body'\n\t\t\t\t? KTDom.getScrollTop()\n\t\t\t\t: (this._targetElement as HTMLElement).scrollTop;\n\t\tconst release =\n\t\t\tthis._releaseElement && KTDom.isPartiallyInViewport(this._releaseElement);\n\n\t\t// Release on reverse scroll mode\n\t\tif (reverse === true) {\n\t\t\t// Forward scroll mode\n\t\t\tif (st > offset && !release) {\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === false) {\n\t\t\t\t\tif (this._enable() === false) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdocument.body.setAttribute(this._attributeRoot, 'on');\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === true) {\n\t\t\t\t\tconst payload = { active: true };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = false;\n\t\t\t\t}\n\t\t\t\t// Back scroll mode\n\t\t\t} else {\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === true) {\n\t\t\t\t\tthis._disable();\n\t\t\t\t\tif (release) {\n\t\t\t\t\t\tthis._element.classList.add('release');\n\t\t\t\t\t}\n\t\t\t\t\tdocument.body.removeAttribute(this._attributeRoot);\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === false) {\n\t\t\t\t\tconst payload = { active: false };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._lastScrollTop = st;\n\t\t\t// Classic scroll mode\n\t\t} else {\n\t\t\t// Forward scroll mode\n\t\t\tif (st > offset && !release) {\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === false) {\n\t\t\t\t\tif (this._enable() === false) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdocument.body.setAttribute(this._attributeRoot, 'on');\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === true) {\n\t\t\t\t\tconst payload = { active: true };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = false;\n\t\t\t\t}\n\t\t\t\t// Back scroll mode\n\t\t\t} else {\n\t\t\t\t// back scroll mode\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === true) {\n\t\t\t\t\tthis._disable();\n\t\t\t\t\tif (release) {\n\t\t\t\t\t\tthis._element.classList.add('release');\n\t\t\t\t\t}\n\t\t\t\t\tdocument.body.removeAttribute(this._attributeRoot);\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === false) {\n\t\t\t\t\tconst payload = { active: false };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _getOffset(): number {\n\t\tlet offset = parseInt(this._getOption('offset') as string);\n\t\tconst activateElement = KTDom.getElement(\n\t\t\tthis._getOption('activate') as string,\n\t\t);\n\n\t\tif (activateElement) {\n\t\t\toffset = Math.abs(offset - activateElement.offsetTop);\n\t\t}\n\n\t\treturn offset;\n\t}\n\n\tprotected _enable(): boolean {\n\t\tif (!this._element) return false;\n\n\t\tlet width = this._getOption('width') as string;\n\t\tconst top = this._getOption('top') as string;\n\t\tconst middle = this._getOption('middle') as boolean;\n\t\tconst bottom = this._getOption('bottom') as string;\n\t\tconst start = this._getOption('start') as string;\n\t\tconst center = this._getOption('center') as boolean;\n\t\tconst end = this._getOption('end') as string;\n\t\tconst height = this._calculateHeight();\n\t\tconst zindex = this._getOption('zindex') as string;\n\t\tconst classList = this._getOption('class') as string;\n\n\t\tif (height + parseInt(top) > KTDom.getViewPort().height) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (width) {\n\t\t\tconst targetElement = document.querySelector(width) as HTMLElement;\n\t\t\tif (targetElement) {\n\t\t\t\twidth = KTDom.getCssProp(targetElement, 'width');\n\t\t\t} else if (width == 'auto') {\n\t\t\t\twidth = KTDom.getCssProp(this._element, 'width');\n\t\t\t}\n\n\t\t\tthis._element.style.width = `${Math.round(parseFloat(width))}px`;\n\t\t}\n\n\t\tif (middle === true) {\n\t\t\tthis._element.style.insetBlockStart = `50%`;\n\t\t} else {\n\t\t\tif (top) {\n\t\t\t\tif (top === 'auto') {\n\t\t\t\t\tthis._element.style.insetBlockStart = `0px`;\n\t\t\t\t} else {\n\t\t\t\t\tthis._element.style.insetBlockStart = `${top}px`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (bottom) {\n\t\t\t\t\tif (bottom === 'auto') {\n\t\t\t\t\t\tthis._element.style.insetBlockEnd = `0px`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._element.style.insetBlockEnd = `${bottom}px`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (center === true) {\n\t\t\tthis._element.style.insetInlineStart = `50%`;\n\t\t} else {\n\t\t\tif (start) {\n\t\t\t\tif (start === 'auto') {\n\t\t\t\t\tconst offsetLeft = KTDom.offset(this._element).left;\n\t\t\t\t\tif (offsetLeft >= 0) {\n\t\t\t\t\t\tthis._element.style.insetInlineStart = `${offsetLeft}px`;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis._element.style.insetInlineStart = `${start}px`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (end) {\n\t\t\t\t\tif (end === 'auto') {\n\t\t\t\t\t\tconst offsetRight = KTDom.offset(this._element).right;\n\t\t\t\t\t\tif (offsetRight >= 0) {\n\t\t\t\t\t\t\tthis._element.style.insetInlineEnd = `${offsetRight}px`;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._element.style.insetInlineEnd = `${end}px`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (zindex) {\n\t\t\tthis._element.style.zIndex = zindex;\n\t\t\tthis._element.style.position = 'fixed';\n\t\t}\n\n\t\tif (classList) {\n\t\t\tKTDom.addClass(this._element, classList);\n\t\t}\n\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.style.height = `${height}px`;\n\t\t}\n\n\t\tthis._element.classList.add('active');\n\t\tthis._element.classList.remove('release');\n\n\t\treturn true;\n\t}\n\n\tprotected _disable(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.style.top = '';\n\t\tthis._element.style.bottom = '';\n\t\tthis._element.style.insetInlineStart = '';\n\t\tthis._element.style.insetInlineEnd = '';\n\t\tthis._element.style.insetBlockStart = '';\n\t\tthis._element.style.insetBlockEnd = '';\n\t\tthis._element.style.width = '';\n\t\tthis._element.style.left = '';\n\t\tthis._element.style.right = '';\n\t\tthis._element.style.zIndex = '';\n\t\tthis._element.style.position = '';\n\n\t\tconst classList = this._getOption('class') as string;\n\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.style.height = '';\n\t\t}\n\n\t\tif (classList) {\n\t\t\tKTDom.removeClass(this._element, classList);\n\t\t}\n\n\t\tthis._element.classList.remove('active');\n\t}\n\n\tprotected _update(): void {\n\t\tif (this._isActive()) {\n\t\t\tthis._disable();\n\t\t\tthis._enable();\n\t\t} else {\n\t\t\tthis._disable();\n\t\t}\n\t}\n\n\tprotected _calculateHeight(): number {\n\t\tif (!this._element) return 0;\n\n\t\tlet height = parseFloat(KTDom.getCssProp(this._element, 'height'));\n\t\theight += parseFloat(KTDom.getCssProp(this._element, 'margin-top'));\n\t\theight += parseFloat(KTDom.getCssProp(this._element, 'margin-bottom'));\n\n\t\tif (KTDom.getCssProp(this._element, 'border-top')) {\n\t\t\theight =\n\t\t\t\theight + parseFloat(KTDom.getCssProp(this._element, 'border-top'));\n\t\t}\n\n\t\tif (KTDom.getCssProp(this._element, 'border-bottom')) {\n\t\t\theight =\n\t\t\t\theight + parseFloat(KTDom.getCssProp(this._element, 'border-bottom'));\n\t\t}\n\n\t\treturn height;\n\t}\n\n\tprotected _isActive(): boolean {\n\t\treturn this._element.classList.contains('active');\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic isActive(): boolean {\n\t\treturn this._isActive();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTSticky {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'sticky')) {\n\t\t\treturn KTData.get(element, 'sticky') as KTSticky;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-sticky')) {\n\t\t\treturn new KTSticky(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTStickyConfigInterface,\n\t): KTSticky {\n\t\treturn this.getInstance(element) || new KTSticky(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-sticky]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTSticky(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTSticky.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTSticky = KTSticky;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTModal } from './modal';\nexport type { KTModalConfigInterface, KTModalInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport {\n\tKTSelectConfigInterface,\n\tKTSelectOption as KTSelectOptionData,\n} from './config';\n\n/**\n * KTSelectRemote class\n * Handles fetching remote data for the KTSelect component\n */\nexport class KTSelectRemote {\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _isLoading: boolean = false;\n\tprivate _hasError: boolean = false;\n\tprivate _errorMessage: string = '';\n\tprivate _currentPage: number = 1;\n\tprivate _totalPages: number = 1;\n\tprivate _lastQuery: string = '';\n\tprivate _element: HTMLElement | null = null;\n\n\t/**\n\t * Constructor\n\t * @param config KTSelect configuration\n\t * @param element The select element\n\t */\n\tconstructor(config: KTSelectConfigInterface, element?: HTMLElement) {\n\t\tthis._config = config;\n\t\tthis._element = element || null;\n\t}\n\n\t/**\n\t * Fetch data from remote URL\n\t * @param query Optional search query\n\t * @param page Page number for pagination\n\t * @returns Promise with fetched items\n\t */\n\tpublic fetchData(\n\t\tquery?: string,\n\t\tpage: number = 1,\n\t): Promise<KTSelectOptionData[]> {\n\t\tthis._isLoading = true;\n\t\tthis._hasError = false;\n\t\tthis._errorMessage = '';\n\t\tthis._lastQuery = query || '';\n\t\tthis._currentPage = page;\n\n\t\tlet url = this._buildUrl(query, page);\n\n\t\t// Dispatch search start event\n\t\tthis._dispatchEvent('remoteSearchStart');\n\n\t\treturn fetch(url)\n\t\t\t.then((response: Response): Promise<any> => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`HTTP error! Status: ${response.status}`);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.then((data: any): KTSelectOptionData[] => {\n\t\t\t\t// Process the data\n\t\t\t\treturn this._processData(data);\n\t\t\t})\n\t\t\t.catch((error: Error): KTSelectOptionData[] => {\n\t\t\t\tconsole.error('Error fetching remote data:', error);\n\t\t\t\tthis._hasError = true;\n\t\t\t\tthis._errorMessage =\n\t\t\t\t\tthis._config.remoteErrorMessage || 'Failed to load data';\n\t\t\t\treturn [];\n\t\t\t})\n\t\t\t.finally((): void => {\n\t\t\t\tthis._isLoading = false;\n\t\t\t\t// Dispatch search end event\n\t\t\t\tthis._dispatchEvent('remoteSearchEnd');\n\t\t\t});\n\t}\n\n\t/**\n\t * Dispatch custom events to notify about search state changes\n\t * @param eventName Name of the event to dispatch\n\t */\n\tprivate _dispatchEvent(eventName: string): void {\n\t\tif (!this._element) return;\n\n\t\tconst event = new CustomEvent(`ktselect.${eventName}`, {\n\t\t\tbubbles: true,\n\t\t\tdetail: {\n\t\t\t\tquery: this._lastQuery,\n\t\t\t\tisLoading: this._isLoading,\n\t\t\t\thasError: this._hasError,\n\t\t\t\terrorMessage: this._errorMessage,\n\t\t\t},\n\t\t});\n\n\t\tthis._element.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Build the URL for the API request\n\t * @param query Search query\n\t * @param page Page number\n\t * @returns Fully formed URL\n\t */\n\tprivate _buildUrl(query?: string, page: number = 1): string {\n\t\tlet url = this._config.dataUrl;\n\n\t\tif (!url) {\n\t\t\tconsole.error('No URL specified for remote data');\n\t\t\treturn '';\n\t\t}\n\n\t\t// Add parameters\n\t\tconst params = new URLSearchParams();\n\n\t\t// Add search parameter if provided\n\t\tif (query && this._config.searchParam) {\n\t\t\tparams.append(this._config.searchParam, query);\n\t\t}\n\n\t\t// Add pagination parameters if enabled\n\t\tif (this._config.pagination) {\n\t\t\tconst limitParam = this._config.paginationLimitParam || 'limit';\n\t\t\tconst pageParam = this._config.paginationPageParam || 'page';\n\t\t\tconst limit = this._config.paginationLimit || 10;\n\n\t\t\tparams.append(limitParam, limit.toString());\n\t\t\tparams.append(pageParam, page.toString());\n\t\t}\n\n\t\t// Append parameters to URL if there are any\n\t\tconst paramsString = params.toString();\n\t\tif (paramsString) {\n\t\t\turl += (url.includes('?') ? '&' : '?') + paramsString;\n\t\t}\n\n\t\treturn url;\n\t}\n\n\t/**\n\t * Process the API response data\n\t * @param data API response data\n\t * @returns Array of KTSelectOptionData\n\t */\n\tprivate _processData(data: any): KTSelectOptionData[] {\n\t\ttry {\n\n\t\t\tlet processedData = data;\n\n\t\t\t// Extract data from the API property if specified\n\t\t\tif (this._config.apiDataProperty && data[this._config.apiDataProperty]) {\n\n\t\t\t\t// If pagination metadata is available, extract it\n\t\t\t\tif (this._config.pagination) {\n\t\t\t\t\tif (data.total_pages) {\n\t\t\t\t\t\tthis._totalPages = data.total_pages;\n\t\t\t\t\t}\n\t\t\t\t\tif (data.total) {\n\t\t\t\t\t\tthis._totalPages = Math.ceil(\n\t\t\t\t\t\t\tdata.total / (this._config.paginationLimit || 10),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocessedData = data[this._config.apiDataProperty];\n\t\t\t}\n\n\t\t\t// Ensure data is an array\n\t\t\tif (!Array.isArray(processedData)) {\n\t\t\t\tconsole.warn('Remote data is not an array:', processedData);\n\t\t\t\treturn [];\n\t\t\t}\n\n\n\t\t\t// Map data to KTSelectOptionData format\n\t\t\tconst mappedData = processedData.map((item: any): KTSelectOptionData => {\n\t\t\t\tconst mappedItem = this._mapItemToOption(item);\n\n\t\t\t\t// Add logging to trace data path extraction\n\t\t\t\tif (\n\t\t\t\t\tthis._config.dataValueField &&\n\t\t\t\t\tthis._config.dataValueField.includes('.')\n\t\t\t\t) {\n\t\t\t\t\t// For nested paths, verify extraction worked\n\t\t\t\t\tconst parts = this._config.dataValueField.split('.');\n\t\t\t\t\tlet nestedValue = item;\n\n\t\t\t\t\t// Try to navigate to the value manually for verification\n\t\t\t\t\tfor (const part of parts) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnestedValue &&\n\t\t\t\t\t\t\ttypeof nestedValue === 'object' &&\n\t\t\t\t\t\t\tpart in nestedValue\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnestedValue = nestedValue[part];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnestedValue = null;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we found a value, verify it matches what was extracted\n\t\t\t\t\tif (nestedValue !== null && nestedValue !== undefined) {\n\t\t\t\t\t\tconst expectedValue = String(nestedValue);\n\n\t\t\t\t\t\tif (mappedItem.id !== expectedValue && expectedValue) {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t`Value mismatch! Path: ${this._config.dataValueField}, Expected: ${expectedValue}, Got: ${mappedItem.id}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn mappedItem;\n\t\t\t});\n\n\t\t\treturn mappedData;\n\t\t} catch (error) {\n\t\t\tconsole.error('Error processing remote data:', error);\n\t\t\tthis._hasError = true;\n\t\t\tthis._errorMessage = 'Error processing data';\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Map a data item to KTSelectOptionData format\n\t * @param item Data item from API\n\t * @returns KTSelectOptionData object\n\t */\n\tprivate _mapItemToOption(item: any): KTSelectOptionData {\n\t\t// Get the field mapping from config with fallbacks for common field names\n\t\tconst valueField = this._config.dataValueField || 'id';\n\t\tconst labelField = this._config.dataFieldText || 'title';\n\n\n\t\t// Extract values using improved getValue function\n\t\tconst getValue = (obj: any, path: string): any => {\n\t\t\tif (!path || !obj) return null;\n\n\t\t\ttry {\n\t\t\t\t// Handle dot notation to access nested properties\n\t\t\t\tconst parts = path.split('.');\n\t\t\t\tlet result = obj;\n\n\t\t\t\tfor (const part of parts) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tresult === null ||\n\t\t\t\t\t\tresult === undefined ||\n\t\t\t\t\t\ttypeof result !== 'object'\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tresult = result[part];\n\t\t\t\t}\n\n\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Error extracting path ${path}:`, error);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\n\t\t// Get ID and ensure it's a string\n\t\tlet id = getValue(item, valueField);\n\t\tif (id === null || id === undefined) {\n\t\t\t// Try common fallback fields for ID\n\t\t\tconst fallbackFields = ['id', 'value', 'key', 'pk'];\n\t\t\tfor (const field of fallbackFields) {\n\t\t\t\tif (item[field] !== null && item[field] !== undefined) {\n\t\t\t\t\tid = String(item[field]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tid = String(id);\n\t\t}\n\n\t\t// If still no ID, generate one\n\t\tif (!id) {\n\t\t\tid = `option-${Math.random().toString(36).substr(2, 9)}`;\n\t\t}\n\n\t\t// Get label with proper fallbacks\n\t\tlet title = getValue(item, labelField);\n\t\tif (!title) {\n\t\t\t// Try common fallback fields for title\n\t\t\tconst fallbackFields = [\n\t\t\t\t'name',\n\t\t\t\t'title',\n\t\t\t\t'label',\n\t\t\t\t'text',\n\t\t\t\t'displayName',\n\t\t\t\t'description',\n\t\t\t];\n\t\t\tfor (const field of fallbackFields) {\n\t\t\t\tif (item[field] !== null && item[field] !== undefined) {\n\t\t\t\t\ttitle = String(item[field]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\ttitle = String(title);\n\t\t}\n\n\t\t// If still no title, use ID as fallback\n\t\tif (!title) {\n\t\t\ttitle = `Option ${id}`;\n\t\t}\n\n\t\t// Create the option object with consistent structure\n\t\tconst result: KTSelectOptionData = {\n\t\t\tid: id,\n\t\t\ttitle: title,\n\t\t\tselected: Boolean(item.selected),\n\t\t\tdisabled: Boolean(item.disabled),\n\t\t};\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Load the next page of results\n\t * @returns Promise with fetched items\n\t */\n\tpublic loadNextPage(): Promise<KTSelectOptionData[]> {\n\t\tif (this._currentPage < this._totalPages) {\n\t\t\treturn this.fetchData(this._lastQuery, this._currentPage + 1);\n\t\t}\n\t\treturn Promise.resolve([]);\n\t}\n\n\t/**\n\t * Check if there are more pages available\n\t * @returns Boolean indicating if more pages exist\n\t */\n\tpublic hasMorePages(): boolean {\n\t\treturn this._currentPage < this._totalPages;\n\t}\n\n\t/**\n\t * Get loading state\n\t * @returns Boolean indicating if data is loading\n\t */\n\tpublic isLoading(): boolean {\n\t\treturn this._isLoading;\n\t}\n\n\t/**\n\t * Get error state\n\t * @returns Boolean indicating if there was an error\n\t */\n\tpublic hasError(): boolean {\n\t\treturn this._hasError;\n\t}\n\n\t/**\n\t * Get error message\n\t * @returns Error message\n\t */\n\tpublic getErrorMessage(): string {\n\t\treturn this._errorMessage;\n\t}\n\n\t/**\n\t * Reset the remote data state\n\t */\n\tpublic reset(): void {\n\t\tthis._isLoading = false;\n\t\tthis._hasError = false;\n\t\tthis._errorMessage = '';\n\t\tthis._currentPage = 1;\n\t\tthis._totalPages = 1;\n\t\tthis._lastQuery = '';\n\t}\n\n\t/**\n\t * Set the select element for event dispatching\n\t * @param element The select element\n\t */\n\tpublic setElement(element: HTMLElement): void {\n\t\tthis._element = element;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTScrolltoInterface, KTScrolltoConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_SCROLLTO_INITIALIZED: boolean;\n\t\tKTScrollto: typeof KTScrollto;\n\t}\n}\n\nexport class KTScrollto extends KTComponent implements KTScrolltoInterface {\n\tprotected override _name: string = 'scrollto';\n\tprotected override _defaultConfig: KTScrolltoConfigInterface = {\n\t\tsmooth: true,\n\t\tparent: 'body',\n\t\ttarget: '',\n\t\toffset: 0,\n\t};\n\tprotected override _config: KTScrolltoConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement;\n\n\tconstructor(element: HTMLElement, config?: KTScrolltoConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\n\t\tthis._targetElement = this._getTargetElement();\n\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-scrollto') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\t\t\tthis._scroll();\n\t\t});\n\t}\n\n\tprotected _scroll(): void {\n\t\tconst pos =\n\t\t\tthis._targetElement.offsetTop +\n\t\t\tparseInt(this._getOption('offset') as string);\n\n\t\tlet parent: HTMLElement | Window = KTDom.getElement(\n\t\t\tthis._getOption('parent') as string,\n\t\t);\n\n\t\tif (!parent || parent === document.body) {\n\t\t\tparent = window;\n\t\t}\n\n\t\tparent.scrollTo({\n\t\t\ttop: pos,\n\t\t\tbehavior: (this._getOption('smooth') as boolean) ? 'smooth' : 'instant',\n\t\t});\n\t}\n\n\tpublic scroll(): void {\n\t\tthis._scroll();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTScrollto {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'scrollto')) {\n\t\t\treturn KTData.get(element, 'scrollto') as KTScrollto;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-scrollto')) {\n\t\t\treturn new KTScrollto(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTScrolltoConfigInterface,\n\t): KTScrollto {\n\t\treturn this.getInstance(element) || new KTScrollto(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-scrollto]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTScrollto(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTScrollto.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTScrollto = KTScrollto;\n}\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTScrollto } from './scrollto';\nexport type { KTScrolltoConfigInterface, KTScrolltoInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTReparent } from './reparent';\nexport type { KTReparentConfigInterface, KTReparentInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTComponent from '../component';\nimport { KTSelectConfigInterface } from './config';\nimport { defaultTemplates } from './templates';\n\nexport class KTSelectOption extends KTComponent {\n\tprotected override readonly _name: string = 'select-option';\n\tprotected override readonly _dataOptionPrefix: string = 'kt-'; // Use 'kt-' prefix to support data-kt-select-option attributes\n\tprotected override readonly _config: KTSelectConfigInterface; // Holds option-specific data from data-kt-*\n\tprivate _globalConfig: KTSelectConfigInterface; // Main select's config\n\n\tconstructor(element: HTMLElement, config?: KTSelectConfigInterface) {\n\t\tsuper();\n\n\t\t// Always initialize a new option instance\n\t\tthis._init(element);\n\t\tthis._globalConfig = config;\n\t\tthis._buildConfig();\n\n\t\t// Clean the config\n\t\tthis._config = (this._config as any)[''] || {};\n\n\t\t// Add the option config to the global config\n\t\t// Ensure optionsConfig is initialized\n\t\tif (this._globalConfig) {\n\t\t\tthis._globalConfig.optionsConfig = this._globalConfig.optionsConfig || {};\n\t\t\tthis._globalConfig.optionsConfig[(element as HTMLInputElement).value] =\n\t\t\t\tthis._config;\n\t\t\t// console.log('[KTSelectOption] Populating _globalConfig.optionsConfig for value', (element as HTMLInputElement).value, 'with:', JSON.parse(JSON.stringify(this._config)));\n\t\t\t// console.log('[KTSelectOption] _globalConfig.optionsConfig is now:', JSON.parse(JSON.stringify(this._globalConfig.optionsConfig)));\n\t\t} else {\n\t\t\t// Handle case where _globalConfig might be undefined, though constructor expects it.\n\t\t\t// This might indicate a need to ensure config is always passed or has a default.\n\t\t\tconsole.warn(\n\t\t\t\t'KTSelectOption: _globalConfig is undefined during constructor.',\n\t\t\t);\n\t\t}\n\n\t\t// Don't store in KTData to avoid Singleton pattern issues\n\t\t// Each option should be a unique instance\n\t\t(element as any).instance = this;\n\t}\n\n\tpublic get id(): string {\n\t\treturn this.getHTMLOptionElement().value;\n\t}\n\n\tpublic get title(): string {\n\t\treturn this.getHTMLOptionElement().textContent || '';\n\t}\n\n\tpublic getHTMLOptionElement(): HTMLOptionElement {\n\t\treturn this._element as HTMLOptionElement;\n\t}\n\n\t/**\n\t * Gathers all necessary data for rendering this option,\n\t * including standard HTML attributes and custom data-kt-* attributes.\n\t */\n\tpublic getOptionDataForTemplate(): Record<string, any> {\n\t\tconst el = this.getHTMLOptionElement();\n\t\tconst text = el.textContent || '';\n\t\treturn {\n\t\t\t// Custom data from data-kt-select-option attributes (parsed into this._config)\n\t\t\t...this._config,\n\t\t\t// Standard HTMLOptionElement properties\n\t\t\tvalue: el.value,\n\t\t\ttext: text, // Original text\n\t\t\tselected: el.selected,\n\t\t\tdisabled: el.disabled,\n\t\t\t// Provide 'content' for convenience in templates, defaulting to text.\n\t\t\t// User's optionTemplate can then use {{content}} or specific fields like {{text}}, {{icon}}, etc.\n\t\t\tcontent: text,\n\t\t};\n\t}\n\n\tpublic render(): HTMLElement {\n\t\t// 'this' is the KTSelectOption instance.\n\t\t// defaultTemplates.option will handle using this instance's data along with _globalConfig.\n\t\treturn defaultTemplates.option(this, this._globalConfig);\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\nimport KTData from '../../helpers/data';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTThemeSwitchInterface, KTThemeSwitchConfigInterface } from './types';\nimport { KTThemeSwitchModeType } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_STICKY_INITIALIZED: boolean;\n\t\tKTThemeSwitch: typeof KTThemeSwitch;\n\t}\n}\n\nexport class KTThemeSwitch\n\textends KTComponent\n\timplements KTThemeSwitchInterface\n{\n\tprotected override _name: string = 'theme-swtich';\n\tprotected override _defaultConfig: KTThemeSwitchConfigInterface = {\n\t\tmode: 'light',\n\t};\n\tprotected _mode: KTThemeSwitchModeType | null = null;\n\tprotected _currentMode: KTThemeSwitchModeType | null = null;\n\n\tconstructor(\n\t\telement: HTMLElement | HTMLHtmlElement,\n\t\tconfig: KTThemeSwitchConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement | HTMLHtmlElement, this._name))\n\t\t\treturn;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._setMode(\n\t\t\t(localStorage.getItem('kt-theme') ||\n\t\t\t\tthis._getOption('mode')) as KTThemeSwitchModeType,\n\t\t);\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-theme-switch-toggle]',\n\t\t\t'click',\n\t\t\t() => {\n\t\t\t\tthis._toggle();\n\t\t\t},\n\t\t);\n\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-theme-switch-set]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst mode = target.getAttribute(\n\t\t\t\t\t'data-kt-theme-switch-set',\n\t\t\t\t) as KTThemeSwitchModeType;\n\t\t\t\tthis._setMode(mode);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _toggle() {\n\t\tconst mode = this._currentMode === 'light' ? 'dark' : 'light';\n\n\t\tthis._setMode(mode);\n\t}\n\n\tprotected _setMode(mode: KTThemeSwitchModeType): void {\n\t\tif (!this._element) return;\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('change', payload);\n\t\tthis._dispatchEvent('change', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet currentMode: KTThemeSwitchModeType = mode;\n\t\tif (mode === 'system') {\n\t\t\tcurrentMode = this._getSystemMode();\n\t\t}\n\n\t\tthis._mode = mode;\n\t\tthis._currentMode = currentMode;\n\t\tthis._bindMode();\n\t\tthis._updateState();\n\t\tlocalStorage.setItem('kt-theme', this._mode);\n\t\tthis._element.setAttribute('data-kt-theme-switch-mode', mode);\n\n\t\tthis._fireEvent('changed', {});\n\t\tthis._dispatchEvent('changed', {});\n\t}\n\n\tprotected _getMode(): KTThemeSwitchModeType {\n\t\treturn (\n\t\t\t(localStorage.getItem('kt-theme') as KTThemeSwitchModeType) || this._mode\n\t\t);\n\t}\n\n\tprotected _getSystemMode(): KTThemeSwitchModeType {\n\t\treturn window.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t\t? 'dark'\n\t\t\t: 'light';\n\t}\n\n\tprotected _bindMode(): void {\n\t\tif (!this._currentMode || !this._element) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element.classList.remove('dark');\n\t\tthis._element.classList.remove('light');\n\t\tthis._element.removeAttribute(this._getOption('attribute') as string);\n\t\tthis._element.classList.add(this._currentMode);\n\t}\n\n\tprotected _updateState() {\n\t\tconst elements = document.querySelectorAll<HTMLInputElement>(\n\t\t\t'input[type=\"checkbox\"][data-kt-theme-switch-state]',\n\t\t);\n\t\telements.forEach((element) => {\n\t\t\tif (element.getAttribute('data-kt-theme-switch-state') === this._mode) {\n\t\t\t\telement.checked = true;\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic getMode(): KTThemeSwitchModeType {\n\t\treturn this._getMode();\n\t}\n\n\tpublic setMode(mode: KTThemeSwitchModeType) {\n\t\tthis.setMode(mode);\n\t}\n\n\tpublic static getInstance(): KTThemeSwitch {\n\t\tconst root = document.documentElement;\n\n\t\tif (KTData.has(root, 'theme-switch')) {\n\t\t\treturn KTData.get(root, 'theme-switch') as KTThemeSwitch;\n\t\t}\n\n\t\tif (root) {\n\t\t\treturn new KTThemeSwitch(root);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst root = document.documentElement;\n\t\tif (root) new KTThemeSwitch(root);\n\t}\n\n\tpublic static init(): void {\n\t\tKTThemeSwitch.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTThemeSwitch = KTThemeSwitch;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTScrollableInterface, KTScrollableConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_SCROLLABLE_INITIALIZED: boolean;\n\t\tKTScrollable: typeof KTScrollable;\n\t}\n}\n\nexport class KTScrollable extends KTComponent implements KTScrollableInterface {\n\tprotected override _name: string = 'scrollable';\n\tprotected override _defaultConfig: KTScrollableConfigInterface = {\n\t\tsave: true,\n\t\tdependencies: '',\n\t\twrappers: '',\n\t\toffset: '',\n\t};\n\tprotected override _config: KTScrollableConfigInterface = this._defaultConfig;\n\tprotected _elementId: string | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTScrollableConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\t\tthis._elementId = this._element.getAttribute('id');\n\t\tthis._handlers();\n\t\tthis._update();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\t\tthis._element.addEventListener('scroll', () => {\n\t\t\tif (!this._element) return;\n\t\t\tlocalStorage.setItem(\n\t\t\t\t`${this._elementId}st`,\n\t\t\t\tthis._element.scrollTop.toString(),\n\t\t\t);\n\t\t});\n\t}\n\n\tprotected _update(): void {\n\t\tthis._setupHeight();\n\t\tthis._setupState();\n\t}\n\n\tprotected _setupHeight(): void {\n\t\tif (!this._element) return;\n\n\t\tconst heightType = this._getHeightType();\n\t\tconst height = this._getHeight();\n\n\t\t// Set height\n\t\tif (height && height != '0' && height.length > 0) {\n\t\t\tthis._element.style.setProperty(heightType, height);\n\t\t} else {\n\t\t\tthis._element.style.setProperty(heightType, '');\n\t\t}\n\t}\n\n\tprotected _setupState(): void {\n\t\tif (!this._element) return;\n\t\tconst stateEnabled = this._getOption('state') === true;\n\t\tconst elementIdExists = Boolean(this._elementId);\n\n\t\tif (stateEnabled && elementIdExists) {\n\t\t\tconst storedPosition = localStorage.getItem(this._elementId + 'st');\n\n\t\t\tif (storedPosition) {\n\t\t\t\tconst pos = parseInt(storedPosition);\n\n\t\t\t\tif (pos > 0) {\n\t\t\t\t\tthis._element.scroll({\n\t\t\t\t\t\ttop: pos,\n\t\t\t\t\t\tbehavior: 'instant',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _getHeight(): string {\n\t\tconst height = this._getHeightOption();\n\n\t\tif (\n\t\t\theight !== null &&\n\t\t\ttypeof height === 'string' &&\n\t\t\theight.toLowerCase() === 'auto'\n\t\t) {\n\t\t\treturn this._getAutoHeight();\n\t\t} else if (height) {\n\t\t\treturn parseInt(height).toString() + 'px';\n\t\t} else {\n\t\t\treturn '0';\n\t\t}\n\t}\n\n\tprotected _getAutoHeight(): string {\n\t\tif (!this._element) return '';\n\t\tlet height = KTDom.getViewPort().height;\n\t\tconst dependencies = this._getOption('dependencies') as string;\n\t\tconst wrappers = this._getOption('wrappers') as string;\n\t\tconst offset = this._getOption('offset') as string;\n\t\theight -= this._getElementSpacing(this._element);\n\n\t\tif (dependencies && dependencies.length > 0) {\n\t\t\tconst elements = document.querySelectorAll(dependencies);\n\t\t\telements.forEach((element) => {\n\t\t\t\tif (KTDom.getCssProp(element as HTMLElement, 'display') === 'none') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\theight -= this._getElementHeight(element as HTMLElement);\n\t\t\t});\n\t\t}\n\n\t\tif (wrappers && wrappers.length > 0) {\n\t\t\tconst elements = document.querySelectorAll(wrappers);\n\t\t\telements.forEach((element) => {\n\t\t\t\tif (KTDom.getCssProp(element as HTMLElement, 'display') === 'none') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\theight -= this._getElementSpacing(element as HTMLElement);\n\t\t\t});\n\t\t}\n\n\t\tif (offset && offset.length > 0) {\n\t\t\theight -= parseInt(offset);\n\t\t}\n\n\t\treturn height.toString() + 'px';\n\t}\n\n\tprotected _getElementHeight(element: HTMLElement): number {\n\t\tlet height = 0;\n\n\t\tif (!element) {\n\t\t\treturn height;\n\t\t}\n\n\t\tconst computedStyle = window.getComputedStyle(element);\n\t\tif (computedStyle.height) {\n\t\t\theight += parseInt(computedStyle.height);\n\t\t}\n\t\tif (computedStyle.marginTop) {\n\t\t\theight += parseInt(computedStyle.marginTop);\n\t\t}\n\t\tif (computedStyle.marginBottom) {\n\t\t\theight += parseInt(computedStyle.marginBottom);\n\t\t}\n\t\tif (computedStyle.borderTopWidth) {\n\t\t\theight += parseInt(computedStyle.borderTopWidth);\n\t\t}\n\t\tif (computedStyle.borderBottomWidth) {\n\t\t\theight += parseInt(computedStyle.borderBottomWidth);\n\t\t}\n\n\t\treturn height;\n\t}\n\n\tprotected _getElementSpacing(element: HTMLElement): number {\n\t\tlet spacing: number = 0;\n\n\t\tif (!element) {\n\t\t\treturn spacing;\n\t\t}\n\n\t\tconst computedStyle = window.getComputedStyle(element);\n\t\tif (computedStyle.marginTop) {\n\t\t\tspacing += parseInt(computedStyle.marginTop);\n\t\t}\n\t\tif (computedStyle.marginBottom) {\n\t\t\tspacing += parseInt(computedStyle.marginBottom);\n\t\t}\n\t\tif (computedStyle.paddingTop) {\n\t\t\tspacing += parseInt(computedStyle.paddingTop);\n\t\t}\n\t\tif (computedStyle.paddingBottom) {\n\t\t\tspacing += parseInt(computedStyle.paddingBottom);\n\t\t}\n\t\tif (computedStyle.borderTopWidth) {\n\t\t\tspacing += parseInt(computedStyle.borderTopWidth);\n\t\t}\n\t\tif (computedStyle.borderBottomWidth) {\n\t\t\tspacing += parseInt(computedStyle.borderBottomWidth);\n\t\t}\n\n\t\treturn spacing;\n\t}\n\n\tprotected _getHeightType(): string {\n\t\tif (this._getOption('minHeight')) {\n\t\t\treturn 'min-height';\n\t\t}\n\t\tif (this._getOption('maxHeight')) {\n\t\t\treturn 'max-height';\n\t\t} else {\n\t\t\treturn 'height';\n\t\t}\n\t}\n\n\tprotected _getHeightOption(): string {\n\t\tconst heightType = this._getHeightType();\n\n\t\tif (heightType == 'min-height') {\n\t\t\treturn this._getOption('minHeight') as string;\n\t\t}\n\t\tif (heightType == 'max-height') {\n\t\t\treturn this._getOption('maxHeight') as string;\n\t\t} else {\n\t\t\treturn this._getOption('height') as string;\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\treturn this._update();\n\t}\n\n\tpublic getHeight(): string {\n\t\treturn this._getHeight();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTScrollable {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'scrollable')) {\n\t\t\treturn KTData.get(element, 'scrollable') as KTScrollable;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-scrollable')) {\n\t\t\treturn new KTScrollable(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTScrollableConfigInterface,\n\t): KTScrollable {\n\t\treturn this.getInstance(element) || new KTScrollable(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-scrollable]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTScrollable(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static handleResize(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\tfunction () {\n\t\t\t\t\t// Locate and update scrollable instances on window resize\n\t\t\t\t\tconst elements = document.querySelectorAll(\n\t\t\t\t\t\t'[data-kt-scrollable-initialized]',\n\t\t\t\t\t);\n\t\t\t\t\telements.forEach((element) => {\n\t\t\t\t\t\tKTScrollable.getInstance(element as HTMLElement)?.update();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTScrollable.createInstances();\n\n\t\tif (window.KT_SCROLLABLE_INITIALIZED !== true) {\n\t\t\tKTScrollable.handleResize();\n\n\t\t\twindow.KT_SCROLLABLE_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTScrollable = KTScrollable;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTDropdown } from './dropdown';\nexport type { KTDropdownConfigInterface, KTDropdownInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTCallableType } from '../types';\nimport KTUtils from './utils';\n\nexport interface KTDelegatedEventHandlersInterface {\n\t[key: string]: KTCallableType;\n}\n\nconst KTDelegatedEventHandlers: KTDelegatedEventHandlersInterface = {};\n\nconst KTEventHandler = {\n\ton: function (\n\t\telement: HTMLElement,\n\t\tselector: string,\n\t\teventName: string,\n\t\thandler: KTCallableType,\n\t): string {\n\t\tif (element === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst eventId = KTUtils.geUID('event');\n\n\t\tKTDelegatedEventHandlers[eventId] = (\n\t\t\tevent: Event & { target: HTMLElement },\n\t\t) => {\n\t\t\tconst targets = element.querySelectorAll(selector);\n\t\t\tlet target = event.target;\n\n\t\t\twhile (target && target !== element) {\n\t\t\t\tfor (let i = 0, j = targets.length; i < j; i++) {\n\t\t\t\t\tif (target === targets[i]) {\n\t\t\t\t\t\thandler.call(this, event, target);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttarget = target.parentNode as HTMLElement;\n\t\t\t}\n\t\t};\n\n\t\telement.addEventListener(eventName, KTDelegatedEventHandlers[eventId]);\n\n\t\treturn eventId;\n\t},\n\n\toff(element: HTMLElement, eventName: string, eventId: string) {\n\t\tif (!element || KTDelegatedEventHandlers[eventId] === null) {\n\t\t\treturn;\n\t\t}\n\n\t\telement.removeEventListener(eventName, KTDelegatedEventHandlers[eventId]);\n\n\t\tdelete KTDelegatedEventHandlers[eventId];\n\t},\n};\n\nexport default KTEventHandler;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTAccordionInterface, KTAccordionConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_ACCORDION_INITIALIZED: boolean;\n\t\tKTAccordion: typeof KTAccordion;\n\t}\n}\n\nexport class KTAccordion extends KTComponent implements KTAccordionInterface {\n\tprotected override _name: string = 'accordion';\n\tprotected override _defaultConfig: KTAccordionConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tactiveClass: 'active',\n\t\texpandAll: false,\n\t};\n\tprotected override _config: KTAccordionConfigInterface = this._defaultConfig;\n\tprotected _accordionElements: NodeListOf<HTMLElement>;\n\n\tconstructor(element: HTMLElement, config?: KTAccordionConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-accordion-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst accordionElement = target.closest(\n\t\t\t\t\t'[data-kt-accordion-item]',\n\t\t\t\t) as HTMLElement;\n\n\t\t\t\tif (accordionElement) this._toggle(accordionElement);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _toggle(accordionElement: HTMLElement): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (accordionElement.classList.contains('active')) {\n\t\t\tthis._hide(accordionElement);\n\t\t} else {\n\t\t\tthis._show(accordionElement);\n\t\t}\n\t}\n\n\tprotected _show(accordionElement: HTMLElement): void {\n\t\tif (\n\t\t\taccordionElement.hasAttribute('animating') ||\n\t\t\taccordionElement.classList.contains(\n\t\t\t\tthis._getOption('activeClass') as string,\n\t\t\t)\n\t\t)\n\t\t\treturn;\n\n\t\tconst toggleElement = KTDom.child(\n\t\t\taccordionElement,\n\t\t\t'[data-kt-accordion-toggle]',\n\t\t);\n\t\tif (!toggleElement) return;\n\n\t\tconst contentElement = KTDom.getElement(\n\t\t\t`#${toggleElement.getAttribute('aria-controls')}`,\n\t\t);\n\t\tif (!contentElement) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ((this._getOption('expandAll') as boolean) === false) {\n\t\t\tthis._hideSiblings(accordionElement);\n\t\t}\n\n\t\taccordionElement.setAttribute('aria-expanded', 'true');\n\t\taccordionElement.classList.add(this._getOption('activeClass') as string);\n\n\t\taccordionElement.setAttribute('animating', 'true');\n\t\tcontentElement.classList.remove(this._getOption('hiddenClass') as string);\n\t\tcontentElement.style.height = `0px`;\n\t\tKTDom.reflow(contentElement);\n\t\tcontentElement.style.height = `${contentElement.scrollHeight}px`;\n\n\t\tKTDom.transitionEnd(contentElement, () => {\n\t\t\taccordionElement.removeAttribute('animating');\n\t\t\tcontentElement.style.height = '';\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(accordionElement: HTMLElement): void {\n\t\tif (\n\t\t\taccordionElement.hasAttribute('animating') ||\n\t\t\t!accordionElement.classList.contains(\n\t\t\t\tthis._getOption('activeClass') as string,\n\t\t\t)\n\t\t)\n\t\t\treturn;\n\n\t\tconst toggleElement = KTDom.child(\n\t\t\taccordionElement,\n\t\t\t'[data-kt-accordion-toggle]',\n\t\t);\n\t\tif (!toggleElement) return;\n\n\t\tconst contentElement = KTDom.getElement(\n\t\t\t`#${toggleElement.getAttribute('aria-controls')}`,\n\t\t);\n\t\tif (!contentElement) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\taccordionElement.setAttribute('aria-expanded', 'false');\n\n\t\tcontentElement.style.height = `${contentElement.scrollHeight}px`;\n\t\tKTDom.reflow(contentElement);\n\t\tcontentElement.style.height = '0px';\n\t\taccordionElement.setAttribute('animating', 'true');\n\n\t\tKTDom.transitionEnd(contentElement, () => {\n\t\t\taccordionElement.removeAttribute('animating');\n\t\t\taccordionElement.classList.remove(\n\t\t\t\tthis._getOption('activeClass') as string,\n\t\t\t);\n\t\t\tcontentElement.classList.add(this._getOption('hiddenClass') as string);\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _hideSiblings(accordionElement: HTMLElement): void {\n\t\tconst siblings = KTDom.siblings(accordionElement);\n\n\t\tsiblings?.forEach((sibling) => {\n\t\t\tthis._hide(sibling as HTMLElement);\n\t\t});\n\t}\n\n\tpublic show(accordionElement: HTMLElement): void {\n\t\tthis._show(accordionElement);\n\t}\n\n\tpublic hide(accordionElement: HTMLElement): void {\n\t\tthis._hide(accordionElement);\n\t}\n\n\tpublic toggle(accordionElement: HTMLElement): void {\n\t\tthis._toggle(accordionElement);\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTAccordion {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'accordion')) {\n\t\t\treturn KTData.get(element, 'accordion') as KTAccordion;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-accordion-initialized') === 'true') {\n\t\t\treturn new KTAccordion(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTAccordionConfigInterface,\n\t): KTAccordion {\n\t\treturn this.getInstance(element) || new KTAccordion(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-accordion]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTAccordion(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTAccordion.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTAccordion = KTAccordion;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n// Sorting logic for KTDataTable\n\nimport {\n\tKTDataTableConfigInterface,\n\tKTDataTableSortOrderInterface,\n\tKTDataTableDataInterface,\n} from './types';\n\nexport interface KTDataTableSortAPI<T = KTDataTableDataInterface> {\n\tinitSort(): void;\n\tsortData(\n\t\tdata: T[],\n\t\tsortField: keyof T | number,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): T[];\n\ttoggleSortOrder(\n\t\tcurrentField: keyof T | number,\n\t\tcurrentOrder: KTDataTableSortOrderInterface,\n\t\tnewField: keyof T | number,\n\t): KTDataTableSortOrderInterface;\n\tsetSortIcon(\n\t\tsortField: keyof T,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): void;\n}\n\nexport function createSortHandler<T = KTDataTableDataInterface>(\n\tconfig: KTDataTableConfigInterface,\n\ttheadElement: HTMLTableSectionElement,\n\tgetState: () => {\n\t\tsortField: keyof T | number;\n\t\tsortOrder: KTDataTableSortOrderInterface;\n\t},\n\tsetState: (\n\t\tfield: keyof T | number,\n\t\torder: KTDataTableSortOrderInterface,\n\t) => void,\n\tfireEvent: (eventName: string, eventData?: any) => void,\n\tdispatchEvent: (eventName: string, eventData?: any) => void,\n\tupdateData: () => void,\n): KTDataTableSortAPI<T> {\n\t// Helper to compare values for sorting\n\tfunction compareValues(\n\t\ta: unknown,\n\t\tb: unknown,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): number {\n\t\tconst aText = String(a).replace(/<[^>]*>| /g, '');\n\t\tconst bText = String(b).replace(/<[^>]*>| /g, '');\n\t\treturn aText > bText\n\t\t\t? sortOrder === 'asc'\n\t\t\t\t? 1\n\t\t\t\t: -1\n\t\t\t: aText < bText\n\t\t\t\t? sortOrder === 'asc'\n\t\t\t\t\t? -1\n\t\t\t\t\t: 1\n\t\t\t\t: 0;\n\t}\n\n\tfunction sortData(\n\t\tdata: T[],\n\t\tsortField: keyof T | number,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): T[] {\n\t\treturn data.sort((a, b) => {\n\t\t\tconst aValue = a[sortField as keyof T] as unknown;\n\t\t\tconst bValue = b[sortField as keyof T] as unknown;\n\t\t\treturn compareValues(aValue, bValue, sortOrder);\n\t\t});\n\t}\n\n\tfunction toggleSortOrder(\n\t\tcurrentField: keyof T | number,\n\t\tcurrentOrder: KTDataTableSortOrderInterface,\n\t\tnewField: keyof T | number,\n\t): KTDataTableSortOrderInterface {\n\t\tif (currentField === newField) {\n\t\t\tswitch (currentOrder) {\n\t\t\t\tcase 'asc':\n\t\t\t\t\treturn 'desc';\n\t\t\t\tcase 'desc':\n\t\t\t\t\treturn '';\n\t\t\t\tdefault:\n\t\t\t\t\treturn 'asc';\n\t\t\t}\n\t\t}\n\t\treturn 'asc';\n\t}\n\n\tfunction setSortIcon(\n\t\tsortField: keyof T,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): void {\n\t\tconst sortClass = sortOrder\n\t\t\t? sortOrder === 'asc'\n\t\t\t\t? config.sort?.classes?.asc || ''\n\t\t\t\t: config.sort?.classes?.desc || ''\n\t\t\t: '';\n\t\tconst th =\n\t\t\ttypeof sortField === 'number'\n\t\t\t\t? theadElement.querySelectorAll('th')[sortField]\n\t\t\t\t: (theadElement.querySelector(\n\t\t\t\t\t\t`th[data-kt-datatable-column=\"${String(sortField)}\"], th[data-kt-datatable-column-sort=\"${String(sortField)}\"]`,\n\t\t\t\t\t) as HTMLElement);\n\t\tif (th) {\n\t\t\tconst sortElement = th.querySelector(\n\t\t\t\t`.${config.sort?.classes?.base}`,\n\t\t\t) as HTMLElement;\n\t\t\tif (sortElement) {\n\t\t\t\tsortElement.className =\n\t\t\t\t\t`${config.sort?.classes?.base} ${sortClass}`.trim();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction initSort(): void {\n\t\tif (!theadElement) return;\n\t\t// Set the initial sort icon\n\t\tsetSortIcon(getState().sortField as keyof T, getState().sortOrder);\n\t\t// Get all the table headers\n\t\tconst headers = Array.from(theadElement.querySelectorAll('th'));\n\t\theaders.forEach((header) => {\n\t\t\t// If the sort class is not found, it's not a sortable column\n\t\t\tif (!header.querySelector(`.${config.sort?.classes?.base}`)) return;\n\n\t\t\t// Check if sorting is disabled for this column\n\t\t\tconst sortDisabled =\n\t\t\t\theader.getAttribute('data-kt-datatable-column-sort') === 'false';\n\t\t\tif (sortDisabled) return;\n\n\t\t\tconst sortAttribute =\n\t\t\t\theader.getAttribute('data-kt-datatable-column-sort') ||\n\t\t\t\theader.getAttribute('data-kt-datatable-column');\n\t\t\tconst sortField = sortAttribute\n\t\t\t\t? (sortAttribute as keyof T)\n\t\t\t\t: (header.cellIndex as keyof T);\n\t\t\theader.addEventListener('click', () => {\n\t\t\t\tconst state = getState();\n\t\t\t\tconst sortOrder = toggleSortOrder(\n\t\t\t\t\tstate.sortField,\n\t\t\t\t\tstate.sortOrder,\n\t\t\t\t\tsortField,\n\t\t\t\t);\n\t\t\t\tsetSortIcon(sortField, sortOrder);\n\t\t\t\tsetState(sortField, sortOrder);\n\t\t\t\tfireEvent('sort', { field: sortField, order: sortOrder });\n\t\t\t\tdispatchEvent('sort', { field: sortField, order: sortOrder });\n\t\t\t\tupdateData();\n\t\t\t});\n\t\t});\n\t}\n\n\treturn { initSort, sortData, toggleSortOrder, setSortIcon };\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTScrollspy } from './scrollspy';\nexport type { KTScrollspyConfigInterface, KTScrollspyInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTSelectConfigInterface } from './config';\nimport { KTSelect } from './select';\nimport { filterOptions, renderTemplateString, stringToElement } from './utils';\nimport { defaultTemplates } from './templates';\n\n/**\n * KTSelectCombobox - Handles combobox-specific functionality for KTSelect\n */\nexport class KTSelectCombobox {\n\tprivate _select: KTSelect;\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _searchInputElement: HTMLInputElement;\n\tprivate _clearButtonElement: HTMLElement | null;\n\tprivate _boundInputHandler: (event: Event) => void;\n\tprivate _boundClearHandler: (event: MouseEvent) => void;\n\tprivate _valuesContainerElement: HTMLElement | null; // For tags or displayTemplate output\n\n\tconstructor(select: KTSelect) {\n\t\tthis._select = select;\n\t\tthis._config = select.getConfig();\n\n\t\tconst displayElement = select.getDisplayElement(); // KTSelect's main display element for combobox\n\n\t\tthis._searchInputElement = displayElement.querySelector(\n\t\t\t'input[data-kt-select-search]',\n\t\t);\n\t\tthis._clearButtonElement = displayElement.querySelector(\n\t\t\t'[data-kt-select-clear-button]',\n\t\t);\n\t\tthis._valuesContainerElement = displayElement.querySelector(\n\t\t\t'[data-kt-select-combobox-values]',\n\t\t);\n\n\t\tthis._boundInputHandler = this._handleComboboxInput.bind(this);\n\t\tthis._boundClearHandler = this._handleClearButtonClick.bind(this);\n\n\t\tthis._attachEventListeners();\n\n\t\tthis._select.getElement().addEventListener('dropdown.close', () => {\n\t\t\t// When dropdown closes, if not multi-select and not using displayTemplate,\n\t\t\t// ensure input shows the selected value or placeholder.\n\t\t\tif (!this._config.multiple && !this._config.displayTemplate) {\n\t\t\t\tthis.updateDisplay(this._select.getSelectedOptions());\n\t\t\t} else {\n\t\t\t\t// For tags or displayTemplate, the input should be clear for typing.\n\t\t\t\tthis._searchInputElement.value = '';\n\t\t\t}\n\t\t\tthis._toggleClearButtonVisibility(this._searchInputElement.value);\n\t\t\t// this._select.showAllOptions(); // showAllOptions might be too broad, filtering is managed by typing.\n\t\t});\n\n\t}\n\n\t/**\n\t * Attach event listeners specific to combobox\n\t */\n\tprivate _attachEventListeners(): void {\n\t\tthis._removeEventListeners();\n\t\tif (this._searchInputElement) {\n\t\t\t// Ensure element exists\n\t\t\tthis._searchInputElement.addEventListener(\n\t\t\t\t'input',\n\t\t\t\tthis._boundInputHandler,\n\t\t\t);\n\t\t}\n\t\tif (this._clearButtonElement) {\n\t\t\tthis._clearButtonElement.addEventListener(\n\t\t\t\t'click',\n\t\t\t\tthis._boundClearHandler,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove event listeners to prevent memory leaks or duplicates\n\t */\n\tprivate _removeEventListeners(): void {\n\t\tif (this._searchInputElement) {\n\t\t\tthis._searchInputElement.removeEventListener(\n\t\t\t\t'input',\n\t\t\t\tthis._boundInputHandler,\n\t\t\t);\n\t\t}\n\t\tif (this._clearButtonElement) {\n\t\t\tthis._clearButtonElement.removeEventListener(\n\t\t\t\t'click',\n\t\t\t\tthis._boundClearHandler,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handle combobox input events\n\t */\n\tprivate _handleComboboxInput(event: Event): void {\n\t\tconst inputElement = event.target as HTMLInputElement;\n\t\tconst query = inputElement.value;\n\n\t\tthis._toggleClearButtonVisibility(query);\n\n\t\tif (!(this._select as any).isDropdownOpen()) {\n\t\t\t// Use public getter\n\t\t\tthis._select.openDropdown();\n\t\t}\n\t\t// For single select without displayTemplate, if user types, they are essentially clearing the previous selection text\n\t\t// The actual selection state isn't cleared until they pick a new option or clear explicitly.\n\t\t// For multi-select or with displayTemplate, the input is purely for search.\n\t\tif (this._config.multiple || this._config.displayTemplate) {\n\t\t\t// Values are in _valuesContainerElement, input is for search\n\t\t} else {\n\t\t\t// Single select, no displayTemplate: If user types, it implies they might be changing selection.\n\t\t\t// We don't clear the actual _select state here, just the visual in input.\n\t\t}\n\n\t\tthis._filterOptionsForCombobox(query);\n\t}\n\n\t/**\n\t * Handle clear button click\n\t */\n\tprivate _handleClearButtonClick(event: MouseEvent): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tthis._searchInputElement.value = '';\n\t\tthis._toggleClearButtonVisibility('');\n\t\tif (this._valuesContainerElement) {\n\t\t\tthis._valuesContainerElement.innerHTML = '';\n\t\t}\n\t\tthis._select.clearSelection(); // This will also trigger updateSelectedOptionDisplay\n\t\tthis._select.showAllOptions(); // Show all options after clearing\n\t\tthis._select.openDropdown();\n\t\tthis._searchInputElement.focus();\n\t}\n\n\t/**\n\t * Toggle clear button visibility based on input value and selection state.\n\t * Clear button should be visible if there's text in input OR if there are selected items (for multi/displayTemplate modes).\n\t */\n\tprivate _toggleClearButtonVisibility(inputValue: string): void {\n\t\tif (!this._clearButtonElement) return;\n\t\tconst hasSelectedItems = this._select.getSelectedOptions().length > 0;\n\n\t\tif (\n\t\t\tinputValue.length > 0 ||\n\t\t\t(hasSelectedItems &&\n\t\t\t\t(this._config.multiple || this._config.displayTemplate))\n\t\t) {\n\t\t\tthis._clearButtonElement.classList.remove('hidden');\n\t\t} else {\n\t\t\tthis._clearButtonElement.classList.add('hidden');\n\t\t}\n\t}\n\n\t/**\n\t * Filter options for combobox based on input query\n\t */\n\tprivate _filterOptionsForCombobox(query: string): void {\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\t\tconst config = this._select.getConfig();\n\t\tconst dropdownElement = this._select.getDropdownElement();\n\t\tfilterOptions(options, query, config, dropdownElement);\n\t\t// After filtering, focusManager in KTSelectSearch (if search is also enabled there)\n\t\t// or the main FocusManager should adjust focus if needed.\n\t\t// For combobox, this filtering is the primary search mechanism.\n\t\t// We might need to tell select's focus manager to focus first option.\n\t\t(this._select as any)._focusManager.focusFirst(); // Consider if this is always right\n\t}\n\n\t/**\n\t * Updates the combobox display (input field or values container) based on selection.\n\t */\n\tpublic updateDisplay(selectedOptions: string[]): void {\n\t\tif (!this._searchInputElement) return;\n\n\t\t// Always clear the values container first if it exists\n\t\tif (this._valuesContainerElement) {\n\t\t\tthis._valuesContainerElement.innerHTML = '';\n\t\t}\n\n\t\tif (this._config.tags && this._valuesContainerElement) {\n\t\t\t// Combobox + Tags\n\t\t\tselectedOptions.forEach((value) => {\n\t\t\t\t// Ensure value is properly escaped for querySelector\n\t\t\t\tconst optionElement = this._select\n\t\t\t\t\t.getElement()\n\t\t\t\t\t.querySelector(\n\t\t\t\t\t\t`option[value=\"${CSS.escape(value)}\"]`,\n\t\t\t\t\t) as HTMLOptionElement;\n\t\t\t\tif (optionElement) {\n\t\t\t\t\tconst tagElement = defaultTemplates.tag(optionElement, this._config);\n\t\t\t\t\tthis._valuesContainerElement.appendChild(tagElement);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis._searchInputElement.value = ''; // Input field is for typing new searches\n\t\t\tthis._searchInputElement.placeholder =\n\t\t\t\tselectedOptions.length > 0\n\t\t\t\t\t? ''\n\t\t\t\t\t: this._config.placeholder || 'Select...';\n\t\t} else if (this._config.displayTemplate && this._valuesContainerElement) {\n\t\t\t// Combobox + DisplayTemplate (no tags)\n\t\t\tthis._valuesContainerElement.innerHTML =\n\t\t\t\tthis._select.renderDisplayTemplateForSelected(selectedOptions);\n\t\t\tthis._searchInputElement.value = ''; // Input field is for typing new searches\n\t\t\tthis._searchInputElement.placeholder =\n\t\t\t\tselectedOptions.length > 0\n\t\t\t\t\t? ''\n\t\t\t\t\t: this._config.placeholder || 'Select...';\n\t\t} else if (this._config.multiple && this._valuesContainerElement) {\n\t\t\t// Combobox + Multiple (no tags, no display template)\n\t\t\t// For simplicity, join text. A proper tag implementation would be more complex here.\n\t\t\tthis._valuesContainerElement.innerHTML = selectedOptions\n\t\t\t\t.map((value) => {\n\t\t\t\t\tconst optionEl = this._select\n\t\t\t\t\t\t.getElement()\n\t\t\t\t\t\t.querySelector(`option[value=\"${CSS.escape(value)}\"]`);\n\t\t\t\t\treturn optionEl ? optionEl.textContent : '';\n\t\t\t\t})\n\t\t\t\t.join(', '); // Basic comma separation\n\t\t\tthis._searchInputElement.value = '';\n\t\t\tthis._searchInputElement.placeholder =\n\t\t\t\tselectedOptions.length > 0\n\t\t\t\t\t? ''\n\t\t\t\t\t: this._config.placeholder || 'Select...';\n\t\t} else if (!this._config.multiple && selectedOptions.length > 0) {\n\t\t\t// Single select combobox: display selected option's text in the input\n\t\t\tconst selectedValue = selectedOptions[0];\n\t\t\tconst optionElement = this._select\n\t\t\t\t.getElement()\n\t\t\t\t.querySelector(`option[value=\"${CSS.escape(selectedValue)}\"]`);\n\t\t\tthis._searchInputElement.value = optionElement\n\t\t\t\t? optionElement.textContent || ''\n\t\t\t\t: '';\n\t\t\t// placeholder is implicitly handled by input value for single select\n\t\t} else {\n\t\t\t// No selection or not fitting above categories (e.g. single select, no items)\n\t\t\tthis._searchInputElement.value = '';\n\t\t\tthis._searchInputElement.placeholder =\n\t\t\t\tthis._config.placeholder || 'Select...';\n\t\t\t// _valuesContainerElement is already cleared if it exists\n\t\t}\n\t\tthis._toggleClearButtonVisibility(this._searchInputElement.value);\n\t}\n\n\t/**\n\t * Destroy the combobox component and clean up event listeners\n\t */\n\tpublic destroy(): void {\n\t\tthis._removeEventListeners();\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n// Checkbox logic for KTDataTable\n\nimport {\n\tKTDataTableConfigInterface,\n\tKTDataTableCheckChangePayloadInterface,\n} from './types';\nimport KTEventHandler from '../../helpers/event-handler';\n\nexport interface KTDataTableCheckboxAPI {\n\tinit(): void;\n\tcheck(): void;\n\tuncheck(): void;\n\ttoggle(): void;\n\tisChecked(): boolean;\n\tgetChecked(): string[];\n\tupdateState(): void;\n}\n\n// Main function to create checkbox logic for a datatable instance\nexport function createCheckboxHandler(\n\telement: HTMLElement,\n\tconfig: KTDataTableConfigInterface,\n\tfireEvent: (eventName: string, eventData?: any) => void,\n): KTDataTableCheckboxAPI {\n\tlet headerChecked = false;\n\tlet headerCheckElement: HTMLInputElement | null = null;\n\tlet targetElements: NodeListOf<HTMLInputElement> = null;\n\n\t// Default: preserve selection across all pages\n\tconst preserveSelection = config.checkbox?.preserveSelection !== false;\n\n\t// Helper: get selectedRows from state, always as string[]\n\tfunction getSelectedRows(): string[] {\n\t\tif (!config._state) config._state = {} as any;\n\t\tif (!Array.isArray(config._state.selectedRows))\n\t\t\tconfig._state.selectedRows = [];\n\t\treturn config._state.selectedRows.map(String);\n\t}\n\n\t// Helper: set selectedRows in state\n\tfunction setSelectedRows(rows: string[]) {\n\t\tif (!config._state) config._state = {} as any;\n\t\tconfig._state.selectedRows = Array.from(new Set(rows.map(String)));\n\t}\n\n\t// Helper: get all visible row IDs (values)\n\tfunction getVisibleRowIds(): string[] {\n\t\tif (!targetElements) return [];\n\t\treturn Array.from(targetElements)\n\t\t\t.map((el) => el.value)\n\t\t\t.filter((v) => v != null && v !== '');\n\t}\n\n\t// Listener for header checkbox\n\tconst checkboxListener = (event: MouseEvent) => {\n\t\tcheckboxToggle(event);\n\t};\n\n\tfunction init() {\n\t\theaderCheckElement = element.querySelector<HTMLInputElement>(\n\t\t\tconfig.attributes.check,\n\t\t);\n\t\tif (!headerCheckElement) return;\n\t\theaderChecked = headerCheckElement.checked;\n\t\ttargetElements = element.querySelectorAll(\n\t\t\tconfig.attributes.checkbox,\n\t\t) as NodeListOf<HTMLInputElement>;\n\t\tcheckboxHandler();\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction checkboxHandler() {\n\t\tif (!headerCheckElement) return;\n\t\theaderCheckElement.addEventListener('click', checkboxListener);\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\tconfig.attributes.checkbox,\n\t\t\t'input',\n\t\t\t(event: Event) => {\n\t\t\t\thandleRowCheckboxChange(event as InputEvent);\n\t\t\t},\n\t\t);\n\t}\n\n\t// When a row checkbox is changed\n\tfunction handleRowCheckboxChange(event: Event) {\n\t\tconst input = event.target as HTMLInputElement;\n\t\tif (!input) return;\n\t\tconst value = input.value;\n\t\tlet selectedRows = getSelectedRows();\n\t\tconst wasChecked = selectedRows.includes(value);\n\t\tconst isNowChecked = input.checked;\n\n\t\t// Update state first\n\t\tif (isNowChecked) {\n\t\t\tif (!wasChecked) selectedRows.push(value);\n\t\t} else {\n\t\t\tselectedRows = selectedRows.filter((v) => v !== value);\n\t\t}\n\t\tsetSelectedRows(selectedRows);\n\t\tupdateHeaderCheckboxState();\n\n\t\t// Fire specific checked/unchecked events after state is updated\n\t\tif (isNowChecked && !wasChecked) {\n\t\t\tfireEvent('checked');\n\t\t} else if (!isNowChecked && wasChecked) {\n\t\t\tfireEvent('unchecked');\n\t\t}\n\n\t\t// Always fire changed event for backward compatibility\n\t\tfireEvent('changed');\n\t}\n\n\t// When the header checkbox is toggled\n\tfunction checkboxToggle(event?: Event) {\n\t\tconst checked = !isChecked();\n\t\t// Update state first, then fire events\n\t\tchange(checked);\n\t\t// Fire checked/unchecked events after state is updated\n\t\tconst eventType = checked ? 'checked' : 'unchecked';\n\t\tfireEvent(eventType);\n\t}\n\n\t// Change all visible checkboxes and update selectedRows\n\tfunction change(checked: boolean) {\n\t\tconst payload: KTDataTableCheckChangePayloadInterface = { cancel: false };\n\t\tfireEvent('change', payload);\n\t\tif (payload.cancel === true) return;\n\t\theaderChecked = checked;\n\t\tif (headerCheckElement) headerCheckElement.checked = checked;\n\t\tif (targetElements) {\n\t\t\tconst visibleIds = getVisibleRowIds();\n\t\t\tlet selectedRows = getSelectedRows();\n\t\t\tif (checked) {\n\t\t\t\t// Add all visible IDs to selectedRows\n\t\t\t\tselectedRows = preserveSelection\n\t\t\t\t\t? Array.from(new Set([...selectedRows, ...visibleIds]))\n\t\t\t\t\t: visibleIds;\n\t\t\t} else {\n\t\t\t\t// Remove all visible IDs from selectedRows\n\t\t\t\tselectedRows = preserveSelection\n\t\t\t\t\t? selectedRows.filter((v) => !visibleIds.includes(v))\n\t\t\t\t\t: [];\n\t\t\t}\n\t\t\tsetSelectedRows(selectedRows);\n\t\t\t// Update visible checkboxes\n\t\t\ttargetElements.forEach((element: HTMLInputElement) => {\n\t\t\t\tif (element) {\n\t\t\t\t\telement.checked = checked;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tupdateHeaderCheckboxState();\n\t\tfireEvent('changed');\n\t}\n\n\t// Reapply checked state to visible checkboxes based on selectedRows\n\tfunction reapplyCheckedStates() {\n\t\tconst selectedRows = getSelectedRows();\n\t\tif (!targetElements) return;\n\t\ttargetElements.forEach((element: HTMLInputElement) => {\n\t\t\tif (!element) return;\n\t\t\tconst value = element.value;\n\t\t\telement.checked = selectedRows.includes(value);\n\t\t\t// Update row class\n\t\t\tconst row = element.closest('tr');\n\t\t\tif (row && config.checkbox?.checkedClass) {\n\t\t\t\tif (element.checked) {\n\t\t\t\t\trow.classList.add(config.checkbox.checkedClass);\n\t\t\t\t} else {\n\t\t\t\t\trow.classList.remove(config.checkbox.checkedClass);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t// Update header checkbox state (checked/indeterminate/unchecked)\n\tfunction updateHeaderCheckboxState() {\n\t\tif (!headerCheckElement || !targetElements) return;\n\t\tconst total = targetElements.length;\n\t\tlet checked = 0;\n\t\tfor (let i = 0; i < total; i++) {\n\t\t\tif (targetElements[i].checked) checked++;\n\t\t}\n\t\tif (checked === 0) {\n\t\t\theaderCheckElement.indeterminate = false;\n\t\t\theaderCheckElement.checked = false;\n\t\t\theaderChecked = false;\n\t\t} else if (checked > 0 && checked < total) {\n\t\t\theaderCheckElement.indeterminate = true;\n\t\t\theaderCheckElement.checked = false;\n\t\t\theaderChecked = false;\n\t\t} else if (checked === total) {\n\t\t\theaderCheckElement.indeterminate = false;\n\t\t\theaderCheckElement.checked = true;\n\t\t\theaderChecked = true;\n\t\t}\n\t}\n\n\t// Fix: isChecked() implementation\n\tfunction isChecked(): boolean {\n\t\treturn headerChecked;\n\t}\n\n\tfunction getChecked(): string[] {\n\t\treturn getSelectedRows();\n\t}\n\n\tfunction check() {\n\t\tchange(true);\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction uncheck() {\n\t\tchange(false);\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction toggle() {\n\t\tcheckboxToggle();\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction updateState() {\n\t\t// Called after redraw/pagination\n\t\ttargetElements = element.querySelectorAll(\n\t\t\tconfig.attributes.checkbox,\n\t\t) as NodeListOf<HTMLInputElement>;\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\treturn {\n\t\tinit,\n\t\tcheck,\n\t\tuncheck,\n\t\ttoggle,\n\t\tisChecked,\n\t\tgetChecked,\n\t\tupdateState,\n\t};\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTTabs } from './tabs';\nexport type { KTTabsConfigInterface, KTTabsInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTToggle } from './toggle';\nexport type { KTToggleConfigInterface, KTToggleInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTStepper } from './stepper';\nexport type { KTStepperConfigInterface, KTStepperInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTToast } from './toast';\nexport type { KTToastConfigInterface, KTToastInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTComponent from '../component';\nimport {\n\tKTDataTableDataInterface,\n\tKTDataTableInterface,\n\tKTDataTableConfigInterface as KTDataTableConfigInterface,\n\tKTDataTableSortOrderInterface,\n\tKTDataTableStateInterface,\n\tKTDataTableColumnFilterInterface,\n\tKTDataTableAttributeInterface,\n} from './types';\nimport KTUtils from '../../helpers/utils';\nimport KTComponents from '../../index';\nimport KTData from '../../helpers/data';\nimport {\n\tcreateCheckboxHandler,\n\tKTDataTableCheckboxAPI,\n} from './datatable-checkbox';\nimport { createSortHandler, KTDataTableSortAPI } from './datatable-sort';\n\n/**\n * Custom DataTable plugin class with server-side API, pagination, and sorting\n * @classdesc A custom KTComponent class that integrates server-side API, pagination, and sorting functionality into a table.\n * It supports fetching data from a server-side API, pagination, and sorting of the fetched data.\n * @class\n * @extends {KTComponent}\n * @param {HTMLElement} element The table element\n * @param {KTDataTableConfigInterface} [config] Additional configuration options\n */\nexport class KTDataTable<T extends KTDataTableDataInterface>\n\textends KTComponent\n\timplements KTDataTableInterface\n{\n\tprotected override _name: string = 'datatable';\n\tprotected override _config: KTDataTableConfigInterface;\n\tprotected override _defaultConfig: KTDataTableConfigInterface;\n\n\tprivate _tableElement: HTMLTableElement;\n\tprivate _tbodyElement: HTMLTableSectionElement;\n\tprivate _theadElement: HTMLTableSectionElement;\n\tprivate _originalTbodyClass: string = ''; // Store original tbody class\n\tprivate _originalTrClasses: string[] = []; // Store original tr classes\n\tprivate _originalTheadClass: string = ''; // Store original thead class\n\tprivate _originalTdClasses: string[][] = []; // Store original td classes as a 2D array [row][col]\n\tprivate _originalThClasses: string[] = []; // Store original th classes\n\n\tprivate _infoElement: HTMLElement;\n\tprivate _sizeElement: HTMLSelectElement;\n\tprivate _paginationElement: HTMLElement;\n\n\tprivate _checkbox: KTDataTableCheckboxAPI;\n\tprivate _sortHandler: KTDataTableSortAPI<T>;\n\n\tprivate _data: T[] = [];\n\tprivate _isFetching: boolean = false;\n\n\t/**\n\t * AbortController for cancelling previous fetch requests\n\t * Used to prevent race conditions when multiple requests are triggered rapidly\n\t */\n\tprivate _abortController: AbortController | null = null;\n\n\t/**\n\t * Request ID counter for tracking request sequence\n\t * Used to detect and ignore stale responses from older requests\n\t */\n\tprivate _requestId: number = 0;\n\n\tconstructor(element: HTMLElement, config?: KTDataTableConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._defaultConfig = this._initDefaultConfig(config);\n\n\t\tthis._init(element);\n\t\tthis._buildConfig();\n\n\t\t// Store the instance directly on the element\n\t\t(element as any).instance = this;\n\n\t\tthis._initElements();\n\n\t\t// Initialize checkbox handler\n\t\tthis._checkbox = createCheckboxHandler(\n\t\t\tthis._element,\n\t\t\tthis._config,\n\t\t\t(eventName: string, eventData?: any) => {\n\t\t\t\tthis._fireEvent(eventName, eventData);\n\t\t\t\tthis._dispatchEvent(eventName, eventData);\n\t\t\t},\n\t\t);\n\n\t\t// Initialize sort handler\n\t\tthis._sortHandler = createSortHandler(\n\t\t\tthis._config,\n\t\t\tthis._theadElement,\n\t\t\t() => ({\n\t\t\t\tsortField: this.getState().sortField,\n\t\t\t\tsortOrder: this.getState().sortOrder,\n\t\t\t}),\n\t\t\t(field, order) => {\n\t\t\t\tthis._config._state.sortField = field as never;\n\t\t\t\tthis._config._state.sortOrder = order;\n\t\t\t},\n\t\t\tthis._fireEvent.bind(this),\n\t\t\tthis._dispatchEvent.bind(this),\n\t\t\tthis._updateData.bind(this),\n\t\t);\n\n\t\tthis._sortHandler.initSort();\n\n\t\tif (this._config.stateSave === false) {\n\t\t\tthis._deleteState();\n\t\t}\n\n\t\tif (this._config.stateSave) {\n\t\t\tthis._loadState();\n\t\t}\n\n\t\tthis._updateData();\n\n\t\tthis._fireEvent('init');\n\t\tthis._dispatchEvent('init');\n\t}\n\n\t/**\n\t * Initialize default configuration for the datatable\n\t * @param config User-provided configuration options\n\t * @returns Default configuration merged with user-provided options\n\t */\n\tprivate _initDefaultConfig(\n\t\tconfig?: KTDataTableConfigInterface,\n\t): KTDataTableConfigInterface {\n\t\treturn {\n\t\t\t/**\n\t\t\t * HTTP method for server-side API call\n\t\t\t */\n\t\t\trequestMethod: 'GET',\n\t\t\t/**\n\t\t\t * Custom HTTP headers for the API request\n\t\t\t */\n\t\t\trequestHeaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Pagination info template\n\t\t\t */\n\t\t\tinfo: '{start}-{end} of {total}',\n\t\t\t/**\n\t\t\t * Info text when there is no data\n\t\t\t */\n\t\t\tinfoEmpty: 'No records found',\n\t\t\t/**\n\t\t\t * Available page sizes\n\t\t\t */\n\t\t\tpageSizes: [5, 10, 20, 30, 50],\n\t\t\t/**\n\t\t\t * Default page size\n\t\t\t */\n\t\t\tpageSize: 10,\n\t\t\t/**\n\t\t\t * Enable or disable pagination more button\n\t\t\t */\n\t\t\tpageMore: true,\n\t\t\t/**\n\t\t\t * Maximum number of pages before enabling pagination more button\n\t\t\t */\n\t\t\tpageMoreLimit: 3,\n\t\t\t/**\n\t\t\t * Pagination button templates\n\t\t\t */\n\t\t\tpagination: {\n\t\t\t\tnumber: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the pagination button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the pagination button\n\t\t\t\t\t */\n\t\t\t\t\ttext: '{page}',\n\t\t\t\t},\n\t\t\t\tprevious: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the previous pagination button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button kt-datatable-pagination-prev',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the previous pagination button\n\t\t\t\t\t */\n\t\t\t\t\ttext: `\n\t\t\t\t\t\t<svg class=\"rtl:transform rtl:rotate-180 size-3.5 shrink-0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t\t<path d=\"M8.86501 16.7882V12.8481H21.1459C21.3724 12.8481 21.5897 12.7581 21.7498 12.5979C21.91 12.4378 22 12.2205 22 11.994C22 11.7675 21.91 11.5503 21.7498 11.3901C21.5897 11.2299 21.3724 11.1399 21.1459 11.1399H8.86501V7.2112C8.86628 7.10375 8.83517 6.9984 8.77573 6.90887C8.7163 6.81934 8.63129 6.74978 8.53177 6.70923C8.43225 6.66869 8.32283 6.65904 8.21775 6.68155C8.11267 6.70405 8.0168 6.75766 7.94262 6.83541L2.15981 11.6182C2.1092 11.668 2.06901 11.7274 2.04157 11.7929C2.01413 11.8584 2 11.9287 2 11.9997C2 12.0707 2.01413 12.141 2.04157 12.2065C2.06901 12.272 2.1092 12.3314 2.15981 12.3812L7.94262 17.164C8.0168 17.2417 8.11267 17.2953 8.21775 17.3178C8.32283 17.3403 8.43225 17.3307 8.53177 17.2902C8.63129 17.2496 8.7163 17.18 8.77573 17.0905C8.83517 17.001 8.86628 16.8956 8.86501 16.7882Z\" fill=\"currentColor\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t},\n\t\t\t\tnext: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the next pagination button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button kt-datatable-pagination-next',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the next pagination button\n\t\t\t\t\t */\n\t\t\t\t\ttext: `\n\t\t\t\t\t\t<svg class=\"rtl:transform rtl:rotate-180 size-3.5 shrink-0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t\t<path d=\"M15.135 7.21144V11.1516H2.85407C2.62756 11.1516 2.41032 11.2415 2.25015 11.4017C2.08998 11.5619 2 11.7791 2 12.0056C2 12.2321 2.08998 12.4494 2.25015 12.6096C2.41032 12.7697 2.62756 12.8597 2.85407 12.8597H15.135V16.7884C15.1337 16.8959 15.1648 17.0012 15.2243 17.0908C15.2837 17.1803 15.3687 17.2499 15.4682 17.2904C15.5677 17.3309 15.6772 17.3406 15.7822 17.3181C15.8873 17.2956 15.9832 17.242 16.0574 17.1642L21.8402 12.3814C21.8908 12.3316 21.931 12.2722 21.9584 12.2067C21.9859 12.1412 22 12.0709 22 11.9999C22 11.9289 21.9859 11.8586 21.9584 11.7931C21.931 11.7276 21.8908 11.6683 21.8402 11.6185L16.0574 6.83565C15.9832 6.75791 15.8873 6.70429 15.7822 6.68179C15.6772 6.65929 15.5677 6.66893 15.4682 6.70948C15.3687 6.75002 15.2837 6.81959 15.2243 6.90911C15.1648 6.99864 15.1337 7.10399 15.135 7.21144Z\" fill=\"currentColor\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t},\n\t\t\t\tmore: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the pagination more button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button kt-datatable-pagination-more',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the pagination more button\n\t\t\t\t\t */\n\t\t\t\t\ttext: '...',\n\t\t\t\t},\n\t\t\t},\n\t\t\t/**\n\t\t\t * Sorting options\n\t\t\t */\n\t\t\tsort: {\n\t\t\t\t/**\n\t\t\t\t * CSS classes to be added to the sortable headers\n\t\t\t\t */\n\t\t\t\tclasses: {\n\t\t\t\t\tbase: 'kt-table-col',\n\t\t\t\t\tasc: 'asc',\n\t\t\t\t\tdesc: 'desc',\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * Local sorting callback function\n\t\t\t\t * Sorts the data array based on the sort field and order\n\t\t\t\t * @param data Data array to be sorted\n\t\t\t\t * @param sortField Property name of the data object to be sorted by\n\t\t\t\t * @param sortOrder Sorting order (ascending or descending)\n\t\t\t\t * @returns Sorted data array\n\t\t\t\t */\n\t\t\t\tcallback: (\n\t\t\t\t\tdata: T[],\n\t\t\t\t\tsortField: keyof T | number,\n\t\t\t\t\tsortOrder: KTDataTableSortOrderInterface,\n\t\t\t\t): T[] => {\n\t\t\t\t\treturn this._sortHandler\n\t\t\t\t\t\t? this._sortHandler.sortData(data, sortField, sortOrder)\n\t\t\t\t\t\t: data;\n\t\t\t\t},\n\t\t\t},\n\t\t\tsearch: {\n\t\t\t\t/**\n\t\t\t\t * Delay in milliseconds before the search function is applied to the data array\n\t\t\t\t * @default 500\n\t\t\t\t */\n\t\t\t\tdelay: 500, // ms\n\t\t\t\t/**\n\t\t\t\t * Local search callback function\n\t\t\t\t * Filters the data array based on the search string\n\t\t\t\t * @param data Data array to be filtered\n\t\t\t\t * @param search Search string used to filter the data array\n\t\t\t\t * @returns Filtered data array\n\t\t\t\t */\n\t\t\t\tcallback: (data: T[], search: string): T[] => {\n\t\t\t\t\tif (!data || !search) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\treturn data.filter((item: T) => {\n\t\t\t\t\t\tif (!item) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn Object.values(item).some(\n\t\t\t\t\t\t\t(value: string | number | boolean) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\ttypeof value !== 'string' &&\n\t\t\t\t\t\t\t\t\ttypeof value !== 'number' &&\n\t\t\t\t\t\t\t\t\ttypeof value !== 'boolean'\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst valueText = String(value)\n\t\t\t\t\t\t\t\t\t.replace(/<[^>]*>| /g, '')\n\t\t\t\t\t\t\t\t\t.toLowerCase();\n\t\t\t\t\t\t\t\treturn valueText.includes(search.toLowerCase());\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t/**\n\t\t\t * Loading spinner options\n\t\t\t */\n\t\t\tloading: {\n\t\t\t\t/**\n\t\t\t\t * Template to be displayed during data fetching process\n\t\t\t\t */\n\t\t\t\ttemplate: `\n\t\t\t\t\t<div class=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\">\n\t\t\t\t\t\t<div class=\"kt-datatable-loading\">\n\t\t\t\t\t\t\t<svg class=\"animate-spin -ml-1 h-5 w-5 text-gray-600\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t\t<circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"3\"></circle>\n\t\t\t\t\t\t\t\t<path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t\t/**\n\t\t\t\t * Loading text to be displayed in the template\n\t\t\t\t */\n\t\t\t\tcontent: 'Loading...',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Selectors of the elements to be targeted\n\t\t\t */\n\t\t\tattributes: {\n\t\t\t\t/**\n\t\t\t\t * Data table element\n\t\t\t\t */\n\t\t\t\ttable: 'table[data-kt-datatable-table=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Pagination info element\n\t\t\t\t */\n\t\t\t\tinfo: '[data-kt-datatable-info=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Page size dropdown element\n\t\t\t\t */\n\t\t\t\tsize: '[data-kt-datatable-size=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Pagination element\n\t\t\t\t */\n\t\t\t\tpagination: '[data-kt-datatable-pagination=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Spinner element\n\t\t\t\t */\n\t\t\t\tspinner: '[data-kt-datatable-spinner=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Checkbox element\n\t\t\t\t */\n\t\t\t\tcheck: '[data-kt-datatable-check=\"true\"]',\n\t\t\t\tcheckbox: '[data-kt-datatable-row-check=\"true\"]',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Enable or disable state saving\n\t\t\t */\n\t\t\tstateSave: true,\n\t\t\tcheckbox: {\n\t\t\t\tcheckedClass: 'checked',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Private properties\n\t\t\t */\n\t\t\t_state: {} as KTDataTableStateInterface,\n\t\t\tloadingClass: 'loading',\n\t\t\t...config,\n\t\t} as KTDataTableConfigInterface;\n\t}\n\n\t/**\n\t * Initialize table, tbody, thead, info, size, and pagination elements\n\t * @returns {void}\n\t */\n\tprivate _initElements(): void {\n\t\t/**\n\t\t * Data table element\n\t\t */\n\t\tthis._tableElement = this._element.querySelector<HTMLTableElement>(\n\t\t\tthis._config.attributes.table,\n\t\t)!;\n\t\t/**\n\t\t * Table body element\n\t\t */\n\t\tthis._tbodyElement =\n\t\t\tthis._tableElement.tBodies[0] || this._tableElement.createTBody();\n\t\t/**\n\t\t * Table head element\n\t\t */\n\t\tthis._theadElement = this._tableElement.tHead!;\n\n\t\t// Store original classes\n\t\tthis._storeOriginalClasses();\n\n\t\t/**\n\t\t * Pagination info element\n\t\t */\n\t\tthis._infoElement = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.info,\n\t\t)!;\n\t\t/**\n\t\t * Page size dropdown element\n\t\t */\n\t\tthis._sizeElement = this._element.querySelector<HTMLSelectElement>(\n\t\t\tthis._config.attributes.size,\n\t\t)!;\n\t\t/**\n\t\t * Pagination element\n\t\t */\n\t\tthis._paginationElement = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.pagination,\n\t\t)!;\n\t}\n\n\t/**\n\t * Store original classes from table elements\n\t * @returns {void}\n\t */\n\tprivate _storeOriginalClasses(): void {\n\t\t// Store tbody class\n\t\tif (this._tbodyElement) {\n\t\t\tthis._originalTbodyClass = this._tbodyElement.className || '';\n\t\t}\n\n\t\t// Store thead class and th classes\n\t\tif (this._theadElement) {\n\t\t\tthis._originalTheadClass = this._theadElement.className || '';\n\n\t\t\t// Store th classes\n\t\t\tconst thElements =\n\t\t\t\tthis._theadElement.querySelectorAll<HTMLTableCellElement>('th');\n\t\t\tthis._originalThClasses = Array.from(thElements).map(\n\t\t\t\t(th) => th.className || '',\n\t\t\t);\n\t\t}\n\n\t\t// Store tr and td classes\n\t\tif (this._tbodyElement) {\n\t\t\tconst originalRows =\n\t\t\t\tthis._tbodyElement.querySelectorAll<HTMLTableRowElement>('tr');\n\t\t\tthis._originalTrClasses = Array.from(originalRows).map(\n\t\t\t\t(row) => row.className || '',\n\t\t\t);\n\n\t\t\t// Store td classes as a 2D array\n\t\t\tthis._originalTdClasses = [];\n\t\t\tArray.from(originalRows).forEach((row, rowIndex) => {\n\t\t\t\tconst tdElements = row.querySelectorAll<HTMLTableCellElement>('td');\n\t\t\t\tthis._originalTdClasses[rowIndex] = Array.from(tdElements).map(\n\t\t\t\t\t(td) => td.className || '',\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Fetch data from the server or from the DOM if `apiEndpoint` is not defined.\n\t * @returns {Promise<void>} Promise which is resolved after data has been fetched and checkbox plugin initialized.\n\t */\n\tprivate async _updateData(): Promise<void> {\n\t\tif (this._isFetching) return; // Prevent duplicate fetches\n\t\tthis._isFetching = true;\n\t\ttry {\n\t\t\tthis._showSpinner(); // Show spinner before fetching data\n\n\t\t\t// Fetch data and finalize - properly await to ensure finally block runs after completion\n\t\t\tif (typeof this._config.apiEndpoint === 'undefined') {\n\t\t\t\tawait this._fetchDataFromLocal();\n\t\t\t\tawait this._finalize();\n\t\t\t} else {\n\t\t\t\tawait this._fetchDataFromServer();\n\t\t\t\tawait this._finalize();\n\t\t\t}\n\t\t} finally {\n\t\t\t// Finally block now correctly executes after promises resolve, not immediately\n\t\t\tthis._isFetching = false;\n\t\t}\n\t}\n\n\t/**\n\t * Finalize data table after data has been fetched\n\t * @returns {void}\n\t */\n\tprivate _finalize(): void {\n\t\tthis._element.classList.add('datatable-initialized');\n\n\t\t// Initialize checkbox logic\n\t\tthis._checkbox.init();\n\n\t\t// Re-initialize sort handler to restore click listeners after table redraw\n\t\tif (this._sortHandler) {\n\t\t\tthis._sortHandler.initSort();\n\t\t}\n\n\t\tthis._attachSearchEvent();\n\n\t\tif (typeof KTComponents !== 'undefined') {\n\t\t\tKTComponents.init();\n\t\t}\n\n\t\t/**\n\t\t * Hide spinner\n\t\t */\n\t\tthis._hideSpinner();\n\t}\n\n\t/**\n\t * Attach search event to the search input element\n\t * @returns {void}\n\t */\n\tprivate _attachSearchEvent(): void {\n\t\tconst tableId: string = this._tableId();\n\t\tconst searchElement: HTMLInputElement | null =\n\t\t\tdocument.querySelector<HTMLInputElement>(\n\t\t\t\t`[data-kt-datatable-search=\"#${tableId}\"]`,\n\t\t\t);\n\n\t\t// Get search state\n\t\tconst { search } = this.getState();\n\t\t// Set search value\n\t\tif (searchElement) {\n\t\t\tsearchElement.value =\n\t\t\t\tsearch === undefined || search === null\n\t\t\t\t\t? ''\n\t\t\t\t\t: typeof search === 'string'\n\t\t\t\t\t\t? search\n\t\t\t\t\t\t: String(search);\n\t\t}\n\n\t\tif (searchElement) {\n\t\t\t// Check if a debounced search function already exists\n\t\t\tif ((searchElement as any)._debouncedSearch) {\n\t\t\t\t// Remove the existing debounced event listener\n\t\t\t\tsearchElement.removeEventListener(\n\t\t\t\t\t'keyup',\n\t\t\t\t\t(searchElement as any)._debouncedSearch,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Create a new debounced search function\n\t\t\tconst debouncedSearch = this._debounce(() => {\n\t\t\t\tthis.search(searchElement.value);\n\t\t\t}, this._config.search.delay);\n\n\t\t\t// Store the new debounced function as a property of the element\n\t\t\t(searchElement as any)._debouncedSearch = debouncedSearch;\n\n\t\t\t// Add the new debounced event listener\n\t\t\tsearchElement.addEventListener('keyup', debouncedSearch);\n\t\t}\n\t}\n\n\t/**\n\t * Fetch data from the DOM\n\t * Fetch data from the table element and save it to the `originalData` state property.\n\t * This method is used when the data is not fetched from the server via an API endpoint.\n\t */\n\tprivate async _fetchDataFromLocal(): Promise<void> {\n\t\tthis._fireEvent('fetch');\n\t\tthis._dispatchEvent('fetch');\n\n\t\tconst { sortField, sortOrder, page, pageSize, search } = this.getState();\n\t\tlet { originalData } = this.getState();\n\n\t\t// If the table element or the original data is not defined, bail\n\t\tif (\n\t\t\t!this._tableElement ||\n\t\t\toriginalData === undefined ||\n\t\t\tthis._tableConfigInvalidate() ||\n\t\t\tthis._localTableHeaderInvalidate() ||\n\t\t\tthis._localTableContentInvalidate()\n\t\t) {\n\t\t\tthis._deleteState();\n\n\t\t\tconst { originalData, originalDataAttributes } =\n\t\t\t\tthis._localExtractTableContent();\n\n\t\t\tthis._config._state.originalData = originalData;\n\t\t\tthis._config._state.originalDataAttributes = originalDataAttributes;\n\t\t}\n\n\t\t// Update the original data variable\n\t\toriginalData = this.getState().originalData;\n\n\t\t// Clone the original data\n\t\tlet _temp = (this._data = [...originalData] as T[]);\n\n\t\tif (search) {\n\t\t\t_temp = this._data = this._config.search.callback.call(\n\t\t\t\tthis,\n\t\t\t\tthis._data,\n\t\t\t\tsearch,\n\t\t\t) as T[];\n\t\t}\n\n\t\t// If sorting is defined, sort the data\n\t\tif (\n\t\t\tsortField !== undefined &&\n\t\t\tsortOrder !== undefined &&\n\t\t\tsortOrder !== ''\n\t\t) {\n\t\t\tif (typeof this._config.sort.callback === 'function') {\n\t\t\t\tthis._data = this._config.sort.callback.call(\n\t\t\t\t\tthis,\n\t\t\t\t\tthis._data,\n\t\t\t\t\tsortField as string,\n\t\t\t\t\tsortOrder,\n\t\t\t\t) as T[];\n\t\t\t}\n\t\t}\n\n\t\t// If there is data, slice it to the current page size\n\t\tif (this._data?.length > 0) {\n\t\t\t// Calculate the start and end indices for the current page\n\t\t\tconst startIndex = (page - 1) * pageSize;\n\t\t\tconst endIndex = startIndex + pageSize;\n\n\t\t\tthis._data = this._data.slice(startIndex, endIndex) as T[];\n\t\t}\n\n\t\t// Determine number of total rows\n\t\tthis._config._state.totalItems = _temp.length;\n\n\t\t// Draw the data\n\t\tawait this._draw();\n\t\tthis._fireEvent('fetched');\n\t\tthis._dispatchEvent('fetched');\n\t}\n\n\t/**\n\t * Checks if the table content has been invalidated by comparing the current checksum of the table body\n\t * with the stored checksum in the state. If the checksums are different, the state is updated with the\n\t * new checksum and `true` is returned. Otherwise, `false` is returned.\n\t *\n\t * @returns {boolean} `true` if the table content has been invalidated, `false` otherwise.\n\t */\n\tprivate _localTableContentInvalidate(): boolean {\n\t\tconst checksum: string = KTUtils.checksum(\n\t\t\tJSON.stringify(this._tbodyElement.innerHTML),\n\t\t);\n\t\tif (this.getState()._contentChecksum !== checksum) {\n\t\t\tthis._config._state._contentChecksum = checksum;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate _tableConfigInvalidate(): boolean {\n\t\t// Remove _data and _state from config\n\t\tconst { _data, _state, ...restConfig } = this._config;\n\t\tconst checksum: string = KTUtils.checksum(JSON.stringify(restConfig));\n\t\tif (_state._configChecksum !== checksum) {\n\t\t\tthis._config._state._configChecksum = checksum;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extract the table content and returns it as an object containing an array of original data and an array of original data attributes.\n\t *\n\t * @returns {{originalData: T[], originalDataAttributes: KTDataTableAttributeInterface[]}} - An object containing an array of original data and an array of original data attributes.\n\t */\n\tprivate _localExtractTableContent(): {\n\t\toriginalData: T[];\n\t\toriginalDataAttributes: KTDataTableAttributeInterface[];\n\t} {\n\t\tconst originalData: T[] = [];\n\t\tconst originalDataAttributes: KTDataTableAttributeInterface[] = [];\n\n\t\tthis._storeOriginalClasses();\n\n\t\tconst rows = this._tbodyElement.querySelectorAll<HTMLTableRowElement>('tr');\n\t\tconst ths: NodeListOf<HTMLTableCellElement> = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th')\n\t\t\t: ([] as unknown as NodeListOf<HTMLTableCellElement>);\n\n\t\trows.forEach((row: HTMLTableRowElement) => {\n\t\t\tconst dataRow: T = {} as T;\n\t\t\tconst dataRowAttribute: KTDataTableAttributeInterface =\n\t\t\t\t{} as KTDataTableAttributeInterface;\n\n\t\t\trow.querySelectorAll<HTMLTableCellElement>('td').forEach((td, index) => {\n\t\t\t\tconst colName = ths[index]?.getAttribute('data-kt-datatable-column');\n\t\t\t\tif (colName) {\n\t\t\t\t\tdataRow[colName as keyof T] = td.innerHTML?.trim() as T[keyof T];\n\t\t\t\t} else {\n\t\t\t\t\t// Store the original HTML for fallback\n\t\t\t\t\tdataRow[index as keyof T] = td.innerHTML?.trim() as T[keyof T];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (Object.keys(dataRow).length > 0) {\n\t\t\t\toriginalData.push(dataRow);\n\t\t\t\toriginalDataAttributes.push(dataRowAttribute);\n\t\t\t}\n\t\t});\n\n\t\treturn { originalData, originalDataAttributes };\n\t}\n\n\t/**\n\t * Check if the table header is invalidated\n\t * @returns {boolean} - Returns true if the table header is invalidated, false otherwise\n\t */\n\tprivate _localTableHeaderInvalidate(): boolean {\n\t\tconst { originalData } = this.getState();\n\t\tconst currentTableHeaders = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th').length\n\t\t\t: 0;\n\t\tconst totalColumns = originalData.length\n\t\t\t? Object.keys(originalData[0]).length\n\t\t\t: 0;\n\n\t\treturn currentTableHeaders !== totalColumns;\n\t}\n\n\t/**\n\t * Fetch data from the server\n\t */\n\tprivate async _fetchDataFromServer(): Promise<void> {\n\t\t// Increment request ID to track this specific request\n\t\tconst currentRequestId = ++this._requestId;\n\n\t\tthis._fireEvent('fetch');\n\t\tthis._dispatchEvent('fetch');\n\n\t\tconst queryParams = this._getQueryParamsForFetchRequest();\n\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await this._performFetchRequest(queryParams);\n\t\t} catch (error) {\n\t\t\t// Silently ignore AbortError - request was cancelled\n\t\t\tif ((error as Error).name === 'AbortError') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\n\t\t// Check if this response is stale (a newer request has been initiated)\n\t\tif (currentRequestId !== this._requestId) {\n\t\t\t// Ignore stale response - a more recent request is in progress or has completed\n\t\t\treturn;\n\t\t}\n\n\t\tlet responseData = null;\n\n\t\ttry {\n\t\t\tresponseData = await response.json();\n\t\t} catch (error) {\n\t\t\t// Fire event with complete error context for application handling\n\t\t\tthis._fireEvent('parseError', {\n\t\t\t\tresponse,\n\t\t\t\terror: String(error),\n\t\t\t\tstatus: response.status,\n\t\t\t\tstatusText: response.statusText\n\t\t\t});\n\t\t\tthis._dispatchEvent('parseError', {\n\t\t\t\tresponse,\n\t\t\t\terror: String(error),\n\t\t\t\tstatus: response.status,\n\t\t\t\tstatusText: response.statusText\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Double-check request ID after JSON parsing (additional safety)\n\t\tif (currentRequestId !== this._requestId) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._fireEvent('fetched', { response: responseData });\n\t\tthis._dispatchEvent('fetched', { response: responseData });\n\n\t\t// Use the mapResponse function to transform the data if provided\n\t\tif (typeof this._config.mapResponse === 'function') {\n\t\t\tresponseData = this._config.mapResponse.call(this, responseData);\n\t\t}\n\n\t\tthis._data = responseData.data;\n\n\t\tthis._config._state.totalItems = responseData.totalCount;\n\n\t\tawait this._draw();\n\t\tthis._fireEvent('fetched');\n\t\tthis._dispatchEvent('fetched');\n\t}\n\n\t/**\n\t * Get the query params for a fetch request\n\t * @returns The query params for the fetch request\n\t */\n\tprivate _getQueryParamsForFetchRequest(): URLSearchParams {\n\t\t// Get the current state of the datatable\n\t\tconst { page, pageSize, sortField, sortOrder, filters, search } =\n\t\t\tthis.getState();\n\n\t\t// Create a new URLSearchParams object to store the query params\n\t\tlet queryParams = new URLSearchParams();\n\n\t\t// Add the current page number and page size to the query params\n\t\tqueryParams.set('page', String(page));\n\t\tqueryParams.set('size', String(pageSize));\n\n\t\t// If there is a sort order and field set, add them to the query params\n\t\tif (sortOrder !== undefined) {\n\t\t\tqueryParams.set('sortOrder', String(sortOrder));\n\t\t}\n\n\t\tif (sortField !== undefined) {\n\t\t\tqueryParams.set('sortField', String(sortField));\n\t\t}\n\n\t\t// If there are any filters set, add them to the query params\n\t\tif (Array.isArray(filters) && filters.length) {\n\t\t\tqueryParams.set(\n\t\t\t\t'filters',\n\t\t\t\tJSON.stringify(\n\t\t\t\t\tfilters.map((filter: KTDataTableColumnFilterInterface) => ({\n\t\t\t\t\t\t// Map the filter object to a simpler object with just the necessary properties\n\t\t\t\t\t\tcolumn: filter.column,\n\t\t\t\t\t\ttype: filter.type,\n\t\t\t\t\t\tvalue: filter.value,\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (search) {\n\t\t\tqueryParams.set(\n\t\t\t\t'search',\n\t\t\t\ttypeof search === 'object' ? JSON.stringify(search) : search,\n\t\t\t);\n\t\t}\n\n\t\t// If a mapRequest function is provided, call it with the query params object\n\t\tif (typeof this._config.mapRequest === 'function') {\n\t\t\tqueryParams = this._config.mapRequest.call(this, queryParams);\n\t\t}\n\n\t\t// Return the query params object\n\t\treturn queryParams;\n\t}\n\n\tprivate async _performFetchRequest(\n\t\tqueryParams: URLSearchParams,\n\t): Promise<Response> {\n\t\tlet requestMethod: RequestInit['method'] = this._config.requestMethod;\n\t\tlet requestBody: RequestInit['body'] | undefined = undefined;\n\n\t\t// Cancel previous request to prevent race conditions\n\t\tif (this._abortController) {\n\t\t\tthis._abortController.abort();\n\t\t}\n\n\t\t// Create new AbortController for this request\n\t\tthis._abortController = new AbortController();\n\n\t\t// If the request method is POST, send the query params as the request body\n\t\tif (requestMethod === 'POST') {\n\t\t\trequestBody = queryParams;\n\t\t} else if (requestMethod === 'GET') {\n\t\t\t// If the request method is GET, append the query params to the API endpoint\n\t\t\tconst apiEndpointWithQueryParams = this._createUrl(\n\t\t\t\tthis._config.apiEndpoint,\n\t\t\t);\n\t\t\tapiEndpointWithQueryParams.search = queryParams.toString();\n\t\t\tthis._config.apiEndpoint = apiEndpointWithQueryParams.toString();\n\t\t}\n\n\t\treturn fetch(this._config.apiEndpoint, {\n\t\t\tmethod: requestMethod,\n\t\t\tbody: requestBody,\n\t\t\theaders: this._config.requestHeaders,\n\t\t\t...(this._config.requestCredentials && {\n\t\t\t\tcredentials: this._config.requestCredentials,\n\t\t\t}),\n\t\t\t// Add abort signal if available\n\t\t\t...(this._abortController && { signal: this._abortController.signal }),\n\t\t}).catch((error) => {\n\t\t\t// Silently ignore AbortError - this is expected when requests are cancelled\n\t\t\tif (error.name === 'AbortError') {\n\t\t\t\treturn Promise.reject(error);\n\t\t\t}\n\n\t\t\t// Trigger an error event for non-abort errors\n\t\t\tthis._fireEvent('error', { error });\n\t\t\tthis._dispatchEvent('error', { error });\n\n\t\t\tthis._noticeOnTable('Error performing fetch request: ' + String(error));\n\t\t\tthrow error;\n\t\t});\n\t}\n\n\t/**\n\t * Creates a complete URL from a relative path or a full URL.\n\t *\n\t * This method accepts a string that can be either a relative path or a full URL.\n\t * If the string is a complete URL (i.e., it contains a valid protocol), a URL\n\t * object based on that string is returned. Otherwise, it ensures the path starts\n\t * with a \"/\" and combines it with the provided base URL (or the current window's origin)\n\t * to form a complete URL.\n\t *\n\t * @param {string} pathOrUrl - The path or URL to process.\n\t * @param {string | null} [baseUrl=window.location.origin] - The base URL for resolving the relative path.\n\t * Defaults to the current window's origin.\n\t * @returns {URL} The resulting URL object.\n\t */\n\n\tprivate _createUrl(\n\t\tpathOrUrl: string,\n\t\tbaseUrl: string | null = window.location.origin,\n\t): URL {\n\t\t// Regular expression to check if the input is a full URL\n\t\tconst isFullUrl = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(pathOrUrl);\n\n\t\tif (isFullUrl) {\n\t\t\treturn new URL(pathOrUrl); // Return full URL as URL object\n\t\t}\n\n\t\t// Ensure path starts with a slash to avoid incorrect concatenation\n\t\tconst normalizedPath = pathOrUrl.startsWith('/')\n\t\t\t? pathOrUrl\n\t\t\t: `/${pathOrUrl}`;\n\n\t\treturn new URL(normalizedPath, baseUrl);\n\t}\n\n\t/**\n\t * Update the table and pagination controls with new data\n\t * @returns {Promise<void>} A promise that resolves when the table and pagination controls are updated\n\t */\n\tprivate async _draw(): Promise<void> {\n\t\tthis._config._state.totalPages =\n\t\t\tMath.ceil(this.getState().totalItems / this.getState().pageSize) || 0;\n\n\t\tthis._fireEvent('draw');\n\t\tthis._dispatchEvent('draw');\n\n\t\tthis._dispose();\n\n\t\t// Update the table and pagination controls\n\t\tif (this._theadElement && this._tbodyElement) {\n\t\t\tthis._updateTable();\n\t\t}\n\n\t\tif (this._infoElement && this._paginationElement) {\n\t\t\tthis._updatePagination();\n\t\t}\n\n\t\tthis._fireEvent('drew');\n\t\tthis._dispatchEvent('drew');\n\n\t\t// Spinner is hidden in _finalize() to ensure it stays visible until the entire request completes\n\t\t// Removed duplicate _hideSpinner() call here to prevent premature hiding\n\n\t\tif (this._config.stateSave) {\n\t\t\tthis._saveState();\n\t\t}\n\t}\n\n\t/**\n\t * Update the HTML table with new data\n\t * @returns {HTMLTableSectionElement} The new table body element\n\t */\n\tprivate _updateTable(): HTMLTableSectionElement {\n\t\t// Clear the existing table contents using a more efficient method\n\t\twhile (this._tableElement.tBodies.length) {\n\t\t\tthis._tableElement.removeChild(this._tableElement.tBodies[0]);\n\t\t}\n\n\t\t// Create the table body with the new data\n\t\tconst tbodyElement =\n\t\t\tthis._tableElement.createTBody() as HTMLTableSectionElement;\n\n\t\t// Apply the original class to the new tbody element\n\t\tif (this._originalTbodyClass) {\n\t\t\ttbodyElement.className = this._originalTbodyClass;\n\t\t}\n\n\t\tthis._updateTableContent(tbodyElement);\n\n\t\treturn tbodyElement;\n\t}\n\n\t/**\n\t * Update the table content\n\t * @param tbodyElement The table body element\n\t * @returns {HTMLTableSectionElement} The updated table body element\n\t */\n\tprivate _updateTableContent(\n\t\ttbodyElement: HTMLTableSectionElement,\n\t): HTMLTableSectionElement {\n\t\tconst fragment = document.createDocumentFragment();\n\n\t\ttbodyElement.textContent = ''; // Clear the tbody element\n\n\t\tif (this._data.length === 0) {\n\t\t\tthis._noticeOnTable(this._config.infoEmpty || '');\n\t\t\treturn tbodyElement;\n\t\t}\n\n\t\tconst ths: NodeListOf<HTMLTableCellElement> = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th')\n\t\t\t: ([] as unknown as NodeListOf<HTMLTableCellElement>);\n\n\t\tthis._data.forEach((item: T, rowIndex: number) => {\n\t\t\tconst row = document.createElement('tr');\n\n\t\t\t// Apply original tr class if available\n\t\t\tif (this._originalTrClasses && this._originalTrClasses[rowIndex]) {\n\t\t\t\trow.className = this._originalTrClasses[rowIndex];\n\t\t\t}\n\n\t\t\tif (!this._config.columns) {\n\t\t\t\tconst dataRowAttributes = this.getState().originalDataAttributes\n\t\t\t\t\t? this.getState().originalDataAttributes[rowIndex]\n\t\t\t\t\t: null;\n\n\t\t\t\t// Use the order of <th> elements to render <td>s in the correct order\n\t\t\t\tths.forEach((th, colIndex) => {\n\t\t\t\t\tconst colName = th.getAttribute('data-kt-datatable-column');\n\t\t\t\t\tconst td = document.createElement('td');\n\t\t\t\t\tlet value: any;\n\t\t\t\t\tif (colName && Object.prototype.hasOwnProperty.call(item, colName)) {\n\t\t\t\t\t\tvalue = item[colName as keyof T];\n\t\t\t\t\t} else if (Object.prototype.hasOwnProperty.call(item, colIndex)) {\n\t\t\t\t\t\tvalue = item[colIndex as keyof T];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = '';\n\t\t\t\t\t}\n\t\t\t\t\ttd.innerHTML = value as string;\n\n\t\t\t\t\t// Apply original td class if available\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis._originalTdClasses &&\n\t\t\t\t\t\tthis._originalTdClasses[rowIndex] &&\n\t\t\t\t\t\tthis._originalTdClasses[rowIndex][colIndex]\n\t\t\t\t\t) {\n\t\t\t\t\t\ttd.className = this._originalTdClasses[rowIndex][colIndex];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dataRowAttributes && dataRowAttributes[colIndex]) {\n\t\t\t\t\t\tfor (const attr in dataRowAttributes[colIndex]) {\n\t\t\t\t\t\t\ttd.setAttribute(attr, dataRowAttributes[colIndex][attr]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\trow.appendChild(td);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tObject.keys(this._config.columns).forEach(\n\t\t\t\t\t(key: keyof T, colIndex: number) => {\n\t\t\t\t\t\tconst td = document.createElement('td');\n\t\t\t\t\t\tconst columnDef = this._config.columns[key as string];\n\n\t\t\t\t\t\t// Apply original td class if available\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis._originalTdClasses &&\n\t\t\t\t\t\t\tthis._originalTdClasses[rowIndex] &&\n\t\t\t\t\t\t\tthis._originalTdClasses[rowIndex][colIndex]\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttd.className = this._originalTdClasses[rowIndex][colIndex];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof columnDef.render === 'function') {\n\t\t\t\t\t\t\tconst result = columnDef.render.call(this, item[key], item, this);\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tresult instanceof HTMLElement ||\n\t\t\t\t\t\t\t\tresult instanceof DocumentFragment\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\ttd.appendChild(result);\n\t\t\t\t\t\t\t} else if (typeof result === 'string') {\n\t\t\t\t\t\t\t\ttd.innerHTML = result as string;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttd.textContent = item[key] as string;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof columnDef.createdCell === 'function') {\n\t\t\t\t\t\t\tcolumnDef.createdCell.call(this, td, item[key], item, row);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trow.appendChild(td);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfragment.appendChild(row);\n\t\t});\n\n\t\ttbodyElement.appendChild(fragment);\n\t\treturn tbodyElement;\n\t}\n\n\t/**\n\t * Show a notice on the table\n\t * @param message The message to show. If empty, the message will be removed\n\t * @returns {void}\n\t */\n\tprivate _noticeOnTable(message: string = ''): void {\n\t\tconst row = this._tableElement.tBodies[0].insertRow();\n\t\tconst cell = row.insertCell();\n\t\tcell.colSpan = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th').length\n\t\t\t: 0;\n\t\tcell.innerHTML = message;\n\t}\n\n\tprivate _updatePagination(): void {\n\t\tthis._removeChildElements(this._sizeElement);\n\t\tthis._createPageSizeControls(this._sizeElement);\n\n\t\tthis._removeChildElements(this._paginationElement);\n\t\tthis._createPaginationControls(this._infoElement, this._paginationElement);\n\t}\n\n\t/**\n\t * Removes all child elements from the given container element.\n\t * @param container The container element to remove the child elements from.\n\t */\n\tprivate _removeChildElements(container: HTMLElement): void {\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Loop through all child elements of the container and remove them one by one\n\t\twhile (container.firstChild) {\n\t\t\t// Remove the first child element (which is the first element in the list of child elements)\n\t\t\tcontainer.removeChild(container.firstChild);\n\t\t}\n\t}\n\n\t/**\n\t * Creates a container element for the items per page selector.\n\t * @param _sizeElement The element to create the page size controls in.\n\t * @returns The container element.\n\t */\n\tprivate _createPageSizeControls(\n\t\t_sizeElement: HTMLSelectElement,\n\t): HTMLSelectElement {\n\t\t// If no element is provided, return early\n\t\tif (!_sizeElement) {\n\t\t\treturn _sizeElement;\n\t\t}\n\n\t\t// Wait for the element to be attached to the DOM\n\t\tsetTimeout(() => {\n\t\t\t// Create <option> elements for each page size option\n\t\t\tconst options = this._config.pageSizes.map((size: number) => {\n\t\t\t\tconst option = document.createElement('option') as HTMLOptionElement;\n\t\t\t\toption.value = String(size);\n\t\t\t\toption.text = String(size);\n\t\t\t\toption.selected = this.getState().pageSize === size;\n\t\t\t\treturn option;\n\t\t\t});\n\n\t\t\t// Add the <option> elements to the provided element\n\t\t\t_sizeElement.append(...options);\n\t\t}, 100);\n\n\t\t// Create an event listener for the \"change\" event on the element\n\t\tconst _pageSizeControlsEvent = (event: Event) => {\n\t\t\t// When the element changes, reload the page with the new page size and page number 1\n\t\t\tthis._reloadPageSize(\n\t\t\t\tNumber((event.target as HTMLSelectElement).value),\n\t\t\t\t1,\n\t\t\t);\n\t\t};\n\n\t\t// Bind the event listener to the component instance\n\t\t_sizeElement.onchange = _pageSizeControlsEvent.bind(this);\n\n\t\t// Return the element\n\t\treturn _sizeElement;\n\t}\n\n\t/**\n\t * Reloads the data with the specified page size and optional page number.\n\t * @param pageSize The new page size.\n\t * @param page The new page number (optional, defaults to 1).\n\t */\n\tprivate _reloadPageSize(pageSize: number, page: number = 1): void {\n\t\t// Update the page size and page number in the state\n\t\tthis._config._state.pageSize = pageSize;\n\t\tthis._config._state.page = page;\n\n\t\t// Update the data with the new page size and page number\n\t\tthis._updateData();\n\t}\n\n\t/**\n\t * Creates the pagination controls for the component.\n\t * @param _infoElement The element to set the info text in.\n\t * @param _paginationElement The element to create the pagination controls in.\n\t * @return {HTMLElement} The element containing the pagination controls.\n\t */\n\tprivate _createPaginationControls(\n\t\t_infoElement: HTMLElement,\n\t\t_paginationElement: HTMLElement,\n\t): HTMLElement {\n\t\tif (!_infoElement || !_paginationElement || this._data.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tthis._setPaginationInfoText(_infoElement);\n\t\tconst paginationContainer =\n\t\t\tthis._createPaginationContainer(_paginationElement);\n\n\t\tif (paginationContainer) {\n\t\t\tthis._createPaginationButtons(paginationContainer);\n\t\t}\n\n\t\treturn paginationContainer;\n\t}\n\n\t/**\n\t * Sets the info text for the pagination controls.\n\t * @param _infoElement The element to set the info text in.\n\t */\n\tprivate _setPaginationInfoText(_infoElement: HTMLElement): void {\n\t\t_infoElement.textContent = this._config.info\n\t\t\t.replace(\n\t\t\t\t'{start}',\n\t\t\t\t(this.getState().page - 1) * this.getState().pageSize + 1 + '',\n\t\t\t)\n\t\t\t.replace(\n\t\t\t\t'{end}',\n\t\t\t\tMath.min(\n\t\t\t\t\tthis.getState().page * this.getState().pageSize,\n\t\t\t\t\tthis.getState().totalItems,\n\t\t\t\t) + '',\n\t\t\t)\n\t\t\t.replace('{total}', this.getState().totalItems + '');\n\t}\n\n\t/**\n\t * Creates the container element for the pagination controls.\n\t * @param _paginationElement The element to create the pagination controls in.\n\t * @return {HTMLElement} The container element.\n\t */\n\tprivate _createPaginationContainer(\n\t\t_paginationElement: HTMLElement,\n\t): HTMLElement {\n\t\t// No longer create a wrapping div. Just return the pagination element itself.\n\t\treturn _paginationElement;\n\t}\n\n\t/**\n\t * Creates the pagination buttons for the component.\n\t * @param paginationContainer The container element for the pagination controls.\n\t */\n\tprivate _createPaginationButtons(paginationContainer: HTMLElement): void {\n\t\tconst { page: currentPage, totalPages } = this.getState();\n\t\tconst { previous, next, number, more } = this._config.pagination;\n\n\t\t// Helper function to create a button\n\t\tconst createButton = (\n\t\t\ttext: string,\n\t\t\tclassName: string,\n\t\t\tdisabled: boolean,\n\t\t\thandleClick: () => void,\n\t\t): HTMLButtonElement => {\n\t\t\tconst button = document.createElement('button') as HTMLButtonElement;\n\t\t\tbutton.className = className;\n\t\t\tbutton.innerHTML = text;\n\t\t\tbutton.disabled = disabled;\n\t\t\tbutton.onclick = handleClick;\n\t\t\treturn button;\n\t\t};\n\n\t\t// Add Previous Button\n\t\tpaginationContainer.appendChild(\n\t\t\tcreateButton(\n\t\t\t\tprevious.text,\n\t\t\t\t`${previous.class}${currentPage === 1 ? ' disabled' : ''}`,\n\t\t\t\tcurrentPage === 1,\n\t\t\t\t() => this._paginateData(currentPage - 1),\n\t\t\t),\n\t\t);\n\n\t\t// Calculate range of pages\n\t\tconst pageMoreEnabled = this._config.pageMore;\n\n\t\tif (pageMoreEnabled) {\n\t\t\tconst maxButtons = this._config.pageMoreLimit;\n\t\t\tconst range = this._calculatePageRange(\n\t\t\t\tcurrentPage,\n\t\t\t\ttotalPages,\n\t\t\t\tmaxButtons,\n\t\t\t);\n\n\t\t\t// Add start ellipsis\n\t\t\tif (range.start > 1) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(more.text, more.class, false, () =>\n\t\t\t\t\t\tthis._paginateData(Math.max(1, range.start - 1)),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Add page buttons\n\t\t\tfor (let i = range.start; i <= range.end; i++) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(\n\t\t\t\t\t\tnumber.text.replace('{page}', i.toString()),\n\t\t\t\t\t\t`${number.class}${currentPage === i ? ' active disabled' : ''}`,\n\t\t\t\t\t\tcurrentPage === i,\n\t\t\t\t\t\t() => this._paginateData(i),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Add end ellipsis\n\t\t\tif (pageMoreEnabled && range.end < totalPages) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(more.text, more.class, false, () =>\n\t\t\t\t\t\tthis._paginateData(Math.min(totalPages, range.end + 1)),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// Add page buttons\n\t\t\tfor (let i = 1; i <= totalPages; i++) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(\n\t\t\t\t\t\tnumber.text.replace('{page}', i.toString()),\n\t\t\t\t\t\t`${number.class}${currentPage === i ? ' active disabled' : ''}`,\n\t\t\t\t\t\tcurrentPage === i,\n\t\t\t\t\t\t() => this._paginateData(i),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Add Next Button\n\t\tpaginationContainer.appendChild(\n\t\t\tcreateButton(\n\t\t\t\tnext.text,\n\t\t\t\t`${next.class}${currentPage === totalPages ? ' disabled' : ''}`,\n\t\t\t\tcurrentPage === totalPages,\n\t\t\t\t() => this._paginateData(currentPage + 1),\n\t\t\t),\n\t\t);\n\t}\n\n\t// New helper method to calculate page range\n\tprivate _calculatePageRange(\n\t\tcurrentPage: number,\n\t\ttotalPages: number,\n\t\tmaxButtons: number,\n\t): { start: number; end: number } {\n\t\tlet startPage: number, endPage: number;\n\t\tconst halfMaxButtons = Math.floor(maxButtons / 2);\n\n\t\tif (totalPages <= maxButtons) {\n\t\t\tstartPage = 1;\n\t\t\tendPage = totalPages;\n\t\t} else {\n\t\t\tstartPage = Math.max(currentPage - halfMaxButtons, 1);\n\t\t\tendPage = Math.min(startPage + maxButtons - 1, totalPages);\n\t\t\tif (endPage - startPage < maxButtons - 1) {\n\t\t\t\tstartPage = Math.max(endPage - maxButtons + 1, 1);\n\t\t\t}\n\t\t}\n\n\t\treturn { start: startPage, end: endPage };\n\t}\n\n\t/**\n\t * Method for handling pagination\n\t * @param page - The page number to navigate to\n\t */\n\tprivate _paginateData(page: number): void {\n\t\tif (page < 1 || !Number.isInteger(page)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._fireEvent('pagination', { page: page });\n\t\tthis._dispatchEvent('pagination', { page: page });\n\n\t\tif (page >= 1 && page <= this.getState().totalPages) {\n\t\t\tthis._config._state.page = page;\n\t\t\tthis._updateData();\n\t\t}\n\t}\n\n\t// Method to show the loading spinner\n\tprivate _showSpinner(): void {\n\t\tconst spinner =\n\t\t\tthis._element.querySelector<HTMLElement>(\n\t\t\t\tthis._config.attributes.spinner,\n\t\t\t) || this._createSpinner();\n\t\tif (spinner) {\n\t\t\tspinner.style.display = 'block';\n\t\t}\n\t\tthis._element.classList.add(this._config.loadingClass);\n\t}\n\n\t// Method to hide the loading spinner\n\tprivate _hideSpinner(): void {\n\t\tconst spinner = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.spinner,\n\t\t);\n\t\tif (spinner) {\n\t\t\tspinner.style.display = 'none';\n\t\t}\n\t\tthis._element.classList.remove(this._config.loadingClass);\n\t}\n\n\t// Method to create a spinner element if it doesn't exist\n\tprivate _createSpinner(): HTMLElement {\n\t\tif (typeof this._config.loading === 'undefined') {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst template = document.createElement('template');\n\t\ttemplate.innerHTML = this._config.loading.template\n\t\t\t.trim()\n\t\t\t.replace('{content}', this._config.loading.content);\n\t\tconst spinner = template.content.firstChild as HTMLElement;\n\t\tspinner.setAttribute('data-kt-datatable-spinner', 'true');\n\n\t\tthis._tableElement.appendChild(spinner);\n\n\t\treturn spinner;\n\t}\n\n\t/**\n\t * Saves the current state of the table to local storage.\n\t * @returns {void}\n\t */\n\tprivate _saveState(): void {\n\t\tthis._fireEvent('stateSave');\n\t\tthis._dispatchEvent('stateSave');\n\n\t\tconst ns: string = this._tableNamespace();\n\n\t\tif (ns) {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tns,\n\t\t\t\tJSON.stringify(this.getState() as KTDataTableStateInterface),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Loads the saved state of the table from local storage, if it exists.\n\t * @returns {Object} The saved state of the table, or null if no saved state exists.\n\t */\n\tprivate _loadState(): KTDataTableStateInterface | null {\n\t\tconst stateString = localStorage.getItem(this._tableNamespace());\n\t\tif (!stateString) return null;\n\n\t\ttry {\n\t\t\tconst state = JSON.parse(stateString) as KTDataTableStateInterface;\n\t\t\tif (state) this._config._state = state;\n\t\t\treturn state;\n\t\t} catch {} // eslint-disable-line no-empty\n\n\t\treturn null;\n\t}\n\n\tprivate _deleteState(): void {\n\t\tconst ns = this._tableNamespace();\n\n\t\tif (ns) {\n\t\t\tlocalStorage.removeItem(ns);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the namespace for the table's state.\n\t * If a namespace is specified in the config, it is used.\n\t * Otherwise, if the table element has an ID, it is used.\n\t * Otherwise, if the component element has an ID, it is used.\n\t * Finally, the component's UID is used.\n\t * @returns {string} The namespace for the table's state.\n\t */\n\tprivate _tableNamespace(): string {\n\t\t// Use the specified namespace, if one is given\n\t\tif (this._config.stateNamespace) {\n\t\t\treturn this._config.stateNamespace;\n\t\t}\n\n\t\t// Fallback to the component's UID\n\t\treturn this._tableId() ?? this._name;\n\t}\n\n\tprivate _tableId(): string {\n\t\tlet id: string = null;\n\t\t// If the table element has an ID, use that\n\t\tif (this._tableElement?.getAttribute('id')) {\n\t\t\tid = this._tableElement.getAttribute('id') as string;\n\t\t}\n\n\t\t// If the component element has an ID, use that\n\t\tif (this._element?.getAttribute('id')) {\n\t\t\tid = this._element.getAttribute('id') as string;\n\t\t}\n\n\t\treturn id;\n\t}\n\n\t/**\n\t * Clean up all event listeners, handlers, and DOM nodes created by this instance.\n\t * This method is called before re-rendering or when disposing the component.\n\t */\n\tprivate _dispose() {\n\t\t// --- 1. Remove search input event listener (debounced) ---\n\t\tconst tableId: string = this._tableId();\n\t\tconst searchElement: HTMLInputElement | null =\n\t\t\tdocument.querySelector<HTMLInputElement>(\n\t\t\t\t`[data-kt-datatable-search=\"#${tableId}\"]`,\n\t\t\t);\n\t\tif (searchElement && (searchElement as any)._debouncedSearch) {\n\t\t\tsearchElement.removeEventListener(\n\t\t\t\t'keyup',\n\t\t\t\t(searchElement as any)._debouncedSearch,\n\t\t\t);\n\t\t\tdelete (searchElement as any)._debouncedSearch;\n\t\t}\n\n\t\t// --- 2. Remove page size dropdown event listener ---\n\t\tif (this._sizeElement && this._sizeElement.onchange) {\n\t\t\tthis._sizeElement.onchange = null;\n\t\t}\n\n\t\t// --- 3. Remove all pagination button event listeners ---\n\t\tif (this._paginationElement) {\n\t\t\t// Remove all child nodes (buttons) to ensure no lingering listeners\n\t\t\twhile (this._paginationElement.firstChild) {\n\t\t\t\tthis._paginationElement.removeChild(this._paginationElement.firstChild);\n\t\t\t}\n\t\t}\n\n\t\t// --- 4. Dispose of handler objects (checkbox, sort) ---\n\t\t// KTDataTableCheckboxAPI does not have a dispose method, but we can remove header checkbox listener\n\t\tif (\n\t\t\tthis._checkbox &&\n\t\t\ttypeof (this._checkbox as any).dispose === 'function'\n\t\t) {\n\t\t\t(this._checkbox as any).dispose();\n\t\t} else {\n\t\t\t// Remove header checkbox event listener if possible\n\t\t\tconst headerCheckElement = this._element.querySelector<HTMLInputElement>(\n\t\t\t\tthis._config.attributes.check,\n\t\t\t);\n\t\t\tif (headerCheckElement) {\n\t\t\t\theaderCheckElement.replaceWith(headerCheckElement.cloneNode(true));\n\t\t\t}\n\t\t}\n\t\t// KTDataTableSortAPI does not have a dispose method, but we can remove th click listeners by replacing them\n\t\tif (this._theadElement) {\n\t\t\tconst ths = this._theadElement.querySelectorAll('th');\n\t\t\tths.forEach((th) => {\n\t\t\t\tth.replaceWith(th.cloneNode(true));\n\t\t\t});\n\t\t}\n\n\t\t// --- 5. Remove spinner DOM node if it exists ---\n\t\tconst spinner = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.spinner,\n\t\t);\n\t\tif (spinner && spinner.parentNode) {\n\t\t\tspinner.parentNode.removeChild(spinner);\n\t\t}\n\t\tthis._element.classList.remove(this._config.loadingClass);\n\n\t\t// --- 6. Remove instance reference from the DOM element ---\n\t\tif ((this._element as any).instance) {\n\t\t\tdelete (this._element as any).instance;\n\t\t}\n\n\t\t// --- 7. (Optional) Clear localStorage state ---\n\t\t// Uncomment the following line if you want to clear state on dispose:\n\t\t// this._deleteState();\n\t}\n\n\tprivate _debounce(func: Function, wait: number) {\n\t\tlet timeout: number | undefined;\n\t\treturn function (...args: any[]) {\n\t\t\tconst later = () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tfunc(...args);\n\t\t\t};\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = window.setTimeout(later, wait);\n\t\t};\n\t}\n\n\t/**\n\t * Gets the current state of the table.\n\t * @returns {KTDataTableStateInterface} The current state of the table.\n\t */\n\tpublic getState(): KTDataTableStateInterface {\n\t\treturn {\n\t\t\t/**\n\t\t\t * The current page number.\n\t\t\t */\n\t\t\tpage: 1,\n\t\t\t/**\n\t\t\t * The field that the data is sorted by.\n\t\t\t */\n\t\t\tsortField: null,\n\t\t\t/**\n\t\t\t * The sort order (ascending or descending).\n\t\t\t */\n\t\t\tsortOrder: '',\n\t\t\t/**\n\t\t\t * The number of rows to display per page.\n\t\t\t */\n\t\t\tpageSize: this._config.pageSize,\n\n\t\t\tfilters: [],\n\n\t\t\t/**\n\t\t\t * Any additional state that may have been stored in the config.\n\t\t\t */\n\t\t\t...this._config._state,\n\t\t};\n\t}\n\n\t/**\n\t * Sorts the data in the table by the specified field.\n\t * @param field The field to sort by.\n\t */\n\tpublic sort(field: keyof T | number): void {\n\t\t// Use the sort handler to update state and trigger sorting\n\t\tconst state = this.getState();\n\t\tconst sortOrder = this._sortHandler.toggleSortOrder(\n\t\t\tstate.sortField,\n\t\t\tstate.sortOrder,\n\t\t\tfield,\n\t\t);\n\t\tthis._sortHandler.setSortIcon(field as keyof T, sortOrder);\n\t\tthis._config._state.sortField = field as never;\n\t\tthis._config._state.sortOrder = sortOrder;\n\t\tthis._fireEvent('sort', { field, order: sortOrder });\n\t\tthis._dispatchEvent('sort', { field, order: sortOrder });\n\t\tthis._updateData();\n\t}\n\n\t/**\n\t * Navigates to the specified page in the data table.\n\t * @param page The page number to navigate to.\n\t */\n\tpublic goPage(page: number): void {\n\t\tif (page < 1 || !Number.isInteger(page)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Navigate to the specified page\n\t\tthis._paginateData(page);\n\t}\n\n\t/**\n\t * Set the page size of the data table.\n\t * @param pageSize The new page size.\n\t */\n\tpublic setPageSize(pageSize: number): void {\n\t\tif (!Number.isInteger(pageSize)) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Reload the page size of the data table.\n\t\t * @param pageSize The new page size.\n\t\t */\n\t\tthis._reloadPageSize(pageSize);\n\t}\n\n\t/**\n\t * Reloads the data from the server and updates the table.\n\t * Triggers the 'reload' event and the 'kt.datatable.reload' custom event.\n\t */\n\tpublic reload(): void {\n\t\tthis._fireEvent('reload');\n\t\tthis._dispatchEvent('reload');\n\n\t\t// Fetch the data from the server using the current sort and filter settings\n\t\tthis._updateData();\n\t}\n\n\tpublic redraw(page: number = 1): void {\n\t\tthis._fireEvent('redraw');\n\t\tthis._dispatchEvent('redraw');\n\n\t\tthis._paginateData(page);\n\t}\n\n\t/**\n\t * Show the loading spinner of the data table.\n\t */\n\tpublic showSpinner(): void {\n\t\t/**\n\t\t * Show the loading spinner of the data table.\n\t\t */\n\t\tthis._showSpinner();\n\t}\n\n\t/**\n\t * Hide the loading spinner of the data table.\n\t */\n\tpublic hideSpinner(): void {\n\t\t/**\n\t\t * Hide the loading spinner of the data table.\n\t\t */\n\t\tthis._hideSpinner();\n\t}\n\n\t/**\n\t * Filter data using the specified filter object.\n\t * Replaces the existing filter object for the column with the new one.\n\t * @param filter Filter object containing the column name and its value.\n\t * @returns The KTDataTable instance.\n\t * @throws Error if the filter object is null or undefined.\n\t */\n\tpublic setFilter(filter: KTDataTableColumnFilterInterface): KTDataTable<T> {\n\t\tthis._config._state.filters = [\n\t\t\t...(this.getState().filters || []).filter(\n\t\t\t\t(f) => f.column !== filter.column,\n\t\t\t),\n\t\t\tfilter,\n\t\t];\n\t\tthis._config._state.page = 1;\n\t\treturn this;\n\t}\n\n\tpublic override dispose(): void {\n\t\tthis._dispose();\n\t}\n\n\tpublic search(query: string | object): void {\n\t\tthis._config._state.search = query;\n\t\tthis._config._state.page = 1;\n\t\tthis.reload();\n\t}\n\n\t/**\n\t * Static variables\n\t */\n\tprivate static _instances = new Map<\n\t\tHTMLElement,\n\t\tKTDataTable<KTDataTableDataInterface>\n\t>();\n\n\t/**\n\t * Create KTDataTable instances for all elements with a data-kt-datatable=\"true\" attribute.\n\t * This function is now browser-guarded and must be called explicitly.\n\t */\n\tpublic static createInstances(): void {\n\t\tif (typeof document === 'undefined') return;\n\t\tconst elements = document.querySelectorAll<HTMLElement>(\n\t\t\t'[data-kt-datatable=\"true\"]',\n\t\t);\n\n\t\telements.forEach((element) => {\n\t\t\tif (\n\t\t\t\telement.hasAttribute('data-kt-datatable') &&\n\t\t\t\t!element.classList.contains('datatable-initialized')\n\t\t\t) {\n\t\t\t\t/**\n\t\t\t\t * Create an instance of KTDataTable for the given element\n\t\t\t\t * @param element The element to create an instance for\n\t\t\t\t */\n\t\t\t\tconst instance = new KTDataTable(element);\n\t\t\t\tthis._instances.set(element, instance);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Get the KTDataTable instance for a given element.\n\t *\n\t * @param element The element to retrieve the instance for\n\t * @returns The KTDataTable instance or undefined if not found\n\t */\n\tpublic static getInstance(\n\t\telement: HTMLElement,\n\t): KTDataTable<KTDataTableDataInterface> | undefined {\n\t\treturn this._instances.get(element);\n\t}\n\n\t/**\n\t * Initializes all KTDataTable instances on the page.\n\t * This function is now browser-guarded and must be called explicitly.\n\t */\n\tpublic static init(): void {\n\t\tif (typeof document === 'undefined') return;\n\t\t// Create instances of KTDataTable for all elements with a\n\t\t// data-kt-datatable=\"true\" attribute\n\t\tKTDataTable.createInstances();\n\t}\n\n\t/**\n\t * Check if all visible rows are checked (header checkbox state)\n\t * @returns {boolean}\n\t */\n\tpublic isChecked(): boolean {\n\t\treturn this._checkbox.isChecked();\n\t}\n\n\t/**\n\t * Toggle all visible row checkboxes (header checkbox)\n\t * @returns {void}\n\t */\n\tpublic toggle(): void {\n\t\tthis._checkbox.toggle();\n\t}\n\n\t/**\n\t * Check all visible row checkboxes\n\t * @returns {void}\n\t */\n\tpublic check(): void {\n\t\tthis._checkbox.check();\n\t\tthis._fireEvent('checked');\n\t\tthis._dispatchEvent('checked');\n\t}\n\n\t/**\n\t * Uncheck all visible row checkboxes\n\t * @returns {void}\n\t */\n\tpublic uncheck(): void {\n\t\tthis._checkbox.uncheck();\n\t\tthis._fireEvent('unchecked');\n\t\tthis._dispatchEvent('unchecked');\n\t}\n\n\t/**\n\t * Get all checked row IDs (across all pages if preserveSelection is true)\n\t * @returns {string[]}\n\t */\n\tpublic getChecked(): string[] {\n\t\treturn this._checkbox.getChecked();\n\t}\n\n\t/**\n\t * Reapply checked state to visible checkboxes (after redraw/pagination)\n\t * @returns {void}\n\t */\n\tpublic update(): void {\n\t\tthis._checkbox.updateState();\n\t}\n\n\t// Other plugin methods can be added here\n}\n\n/**\n * NOTE: This module is now PURE. No side effects or DOM/global assignments occur on import.\n * To auto-initialize all datatables on the page, call the exported `initAllDataTables()` function explicitly in the browser.\n */\n\nexport function initAllDataTables(): void {\n\tif (typeof document !== 'undefined') {\n\t\tKTDataTable.createInstances();\n\t\t// Optionally assign to window for legacy support\n\t\twindow.KTDataTable = KTDataTable;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTModalInterface, KTModalConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_MODAL_INITIALIZED: boolean;\n\t\tKTModal: typeof KTModal;\n\t}\n}\n\nexport class KTModal extends KTComponent implements KTModalInterface {\n\tprotected override _name: string = 'modal';\n\tprotected override _defaultConfig: KTModalConfigInterface = {\n\t\tzindex: '90',\n\t\tbackdrop: true,\n\t\tbackdropClass: 'kt-modal-backdrop',\n\t\tbackdropStatic: false,\n\t\tkeyboard: true,\n\t\tdisableScroll: true,\n\t\tpersistent: false,\n\t\tfocus: true,\n\t\thiddenClass: 'hidden',\n\t};\n\tprotected override _config: KTModalConfigInterface = this._defaultConfig;\n\tprotected _isOpen: boolean = false;\n\tprotected _isTransitioning: boolean = false;\n\tprotected _backdropElement: HTMLElement | null = null;\n\tprotected _targetElement: HTMLElement | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTModalConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers() {\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tconst target = event.target as HTMLElement;\n\t\t\tconst currentTarget = event.currentTarget as HTMLElement;\n\n\t\t\t// Only proceed if clicking directly on the backdrop (modal element itself)\n\t\t\t// This prevents closing when clicking inside modal content or any child elements\n\t\t\t// (including dropdowns rendered via dropdownContainer pointing to modal)\n\t\t\tif (target !== currentTarget) {\n\t\t\t\t// Stop propagation for clicks inside dropdowns to prevent dropdown from closing\n\t\t\t\t// Check if click is inside a dropdown element (KT Select dropdown)\n\t\t\t\tconst dropdownElement = target.closest('[data-kt-select-dropdown]');\n\t\t\t\tif (dropdownElement) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Only hide if both backdropStatic is false AND persistent is false\n\t\t\tif (\n\t\t\t\tthis._getOption('backdropStatic') === false &&\n\t\t\t\tKTUtils.stringToBoolean(this._getOption('persistent')) === false\n\t\t\t) {\n\t\t\t\tthis._hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _toggle(targetElement?: HTMLElement): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen === true) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show(targetElement);\n\t\t}\n\t}\n\n\tprotected _show(targetElement?: HTMLElement): void {\n\t\tif (this._isOpen || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (targetElement) this._targetElement = targetElement;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tKTModal.hide();\n\n\t\tif (!this._element) return;\n\t\tthis._isTransitioning = true;\n\t\tthis._element.setAttribute('role', 'dialog');\n\t\tthis._element.setAttribute('aria-modal', 'true');\n\t\tthis._element.setAttribute('tabindex', '-1');\n\n\t\tthis._setZindex();\n\t\tif (this._getOption('backdrop') === true) this._createBackdrop();\n\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = 'hidden';\n\t\t}\n\n\t\tthis._element.style.display = 'block';\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.add('open');\n\t\tthis._element.classList.remove(this._getOption('hiddenClass') as string);\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\tif (this._getOption('focus') === true) {\n\t\t\t\tthis._autoFocus();\n\t\t\t}\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(): void {\n\t\tif (!this._element) return;\n\t\tif (this._isOpen === false || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isTransitioning = true;\n\t\tthis._element.removeAttribute('role');\n\t\tthis._element.removeAttribute('aria-modal');\n\t\tthis._element.removeAttribute('tabindex');\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = '';\n\t\t}\n\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.remove('open');\n\n\t\tif (this._getOption('backdrop') === true) {\n\t\t\tthis._deleteBackdrop();\n\t\t}\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tif (!this._element) return;\n\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\t\t\tthis._element.style.display = '';\n\t\t\tthis._element.classList.add(this._getOption('hiddenClass') as string);\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _setZindex(): void {\n\t\tlet zindex: number = parseInt(this._getOption('zindex') as string);\n\n\t\tif (parseInt(KTDom.getCssProp(this._element, 'z-index')) > zindex) {\n\t\t\tzindex = parseInt(KTDom.getCssProp(this._element, 'z-index'));\n\t\t}\n\n\t\tif (KTDom.getHighestZindex(this._element) > zindex) {\n\t\t\tzindex = KTDom.getHighestZindex(this._element) + 1;\n\t\t}\n\n\t\tthis._element.style.zIndex = String(zindex);\n\t}\n\n\tprotected _autoFocus(): void {\n\t\tif (!this._element) return;\n\t\tconst input: HTMLInputElement | null = this._element.querySelector(\n\t\t\t'[data-kt-modal-input-focus]',\n\t\t);\n\t\tif (!input) return;\n\t\telse input.focus();\n\t}\n\n\tprotected _createBackdrop(): void {\n\t\tif (!this._element) return;\n\t\tconst zindex: number = parseInt(KTDom.getCssProp(this._element, 'z-index'));\n\t\tthis._backdropElement = document.createElement('DIV');\n\t\tthis._backdropElement.setAttribute('data-kt-modal-backdrop', 'true');\n\t\tthis._backdropElement.style.zIndex = (zindex - 1).toString();\n\t\tdocument.body.append(this._backdropElement);\n\t\tKTDom.reflow(this._backdropElement);\n\t\tKTDom.addClass(\n\t\t\tthis._backdropElement,\n\t\t\tthis._getOption('backdropClass') as string,\n\t\t);\n\t}\n\n\tprotected _deleteBackdrop(): void {\n\t\tif (!this._backdropElement) return;\n\n\t\tKTDom.reflow(this._backdropElement);\n\t\tthis._backdropElement.style.opacity = '0';\n\n\t\tKTDom.transitionEnd(this._backdropElement, () => {\n\t\t\tif (!this._backdropElement) return;\n\t\t\tKTDom.remove(this._backdropElement);\n\t\t});\n\t}\n\n\tpublic toggle(targetElement?: HTMLElement): void {\n\t\treturn this._toggle(targetElement);\n\t}\n\n\tpublic show(targetElement?: HTMLElement): void {\n\t\treturn this._show(targetElement);\n\t}\n\n\tpublic hide(): void {\n\t\treturn this._hide();\n\t}\n\n\tpublic getTargetElement(): HTMLElement | null {\n\t\treturn this._targetElement;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTModal {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'modal')) {\n\t\t\treturn KTData.get(element, 'modal') as KTModal;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-modal')) {\n\t\t\treturn new KTModal(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTModalConfigInterface,\n\t): KTModal {\n\t\treturn this.getInstance(element) || new KTModal(element, config);\n\t}\n\n\tpublic static hide(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-modal-initialized]');\n\n\t\telements.forEach((element) => {\n\t\t\tconst modal = KTModal.getInstance(element as HTMLElement);\n\n\t\t\tif (modal && modal.isOpen()) {\n\t\t\t\tmodal.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleToggle(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-modal-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst selector = target.getAttribute('data-kt-modal-toggle');\n\t\t\t\tif (!selector) return;\n\n\t\t\t\tconst modalElement = document.querySelector(selector);\n\t\t\t\tconst modal = KTModal.getInstance(modalElement as HTMLElement);\n\t\t\t\tif (modal) {\n\t\t\t\t\tmodal.toggle(target);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleDismiss(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-modal-dismiss]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst modalElement = target.closest(\n\t\t\t\t\t'[data-kt-modal-initialized]',\n\t\t\t\t) as HTMLElement;\n\t\t\t\tif (modalElement) {\n\t\t\t\t\tconst modal = KTModal.getInstance(modalElement);\n\t\t\t\t\tif (modal) {\n\t\t\t\t\t\tmodal.hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleClickAway() {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tconst modalElement = document.querySelector(\n\t\t\t\t'.open[data-kt-modal-initialized]',\n\t\t\t);\n\t\t\tif (!modalElement) return;\n\n\t\t\tconst modal = KTModal.getInstance(modalElement as HTMLElement);\n\t\t\tif (!modal) return;\n\n\t\t\tif (KTUtils.stringToBoolean(modal.getOption('persistent')) === true)\n\t\t\t\treturn;\n\n\t\t\tif (KTUtils.stringToBoolean(modal.getOption('backdrop')) === true) return;\n\n\t\t\tif (\n\t\t\t\tmodalElement !== event.target &&\n\t\t\t\tmodal.getTargetElement() !== event.target &&\n\t\t\t\tmodalElement.contains(event.target as HTMLElement) === false\n\t\t\t) {\n\t\t\t\tmodal.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleKeyword() {\n\t\tdocument.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst modalElement = document.querySelector(\n\t\t\t\t'.open[data-kt-modal-initialized]',\n\t\t\t);\n\t\t\tconst modal = KTModal.getInstance(modalElement as HTMLElement);\n\t\t\tif (!modal) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// if esc key was not pressed in combination with ctrl or alt or shift\n\t\t\tif (\n\t\t\t\tevent.key === 'Escape' &&\n\t\t\t\t!(event.ctrlKey || event.altKey || event.shiftKey)\n\t\t\t) {\n\t\t\t\tmodal.hide();\n\t\t\t}\n\n\t\t\tif (event.code === 'Tab' && !event.metaKey) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-modal]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTModal(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTModal.createInstances();\n\n\t\tif (window.KT_MODAL_INITIALIZED !== true) {\n\t\t\tKTModal.handleToggle();\n\t\t\tKTModal.handleDismiss();\n\t\t\tKTModal.handleClickAway();\n\t\t\tKTModal.handleKeyword();\n\t\t\twindow.KT_MODAL_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTModal = KTModal;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport {\n\tInstance as PopperInstance,\n\tcreatePopper,\n\tPlacement,\n} from '@popperjs/core';\nimport KTDom from '../../helpers/dom';\nimport KTData from '../../helpers/data';\nimport KTComponent from '../component';\nimport { KTSelectConfigInterface } from './config';\nimport { FocusManager, EventManager } from './utils';\nimport { KTSelect } from './select'; // Added import\n\n/**\n * KTSelectDropdown\n *\n * A specialized dropdown implementation for the KTSelect component.\n * This module handles the dropdown functionality for the select component,\n * including positioning and showing/hiding.\n */\nexport class KTSelectDropdown extends KTComponent {\n\tprotected override readonly _name: string = 'select-dropdown';\n\tprotected override readonly _config: KTSelectConfigInterface;\n\n\t// DOM Elements\n\tprotected _element: HTMLElement;\n\tprivate _toggleElement: HTMLElement;\n\tprivate _dropdownElement: HTMLElement;\n\n\t// State\n\tprivate _isOpen: boolean = false;\n\tprivate _isTransitioning: boolean = false;\n\tprivate _popperInstance: PopperInstance | null = null;\n\tprivate _eventManager: EventManager;\n\tprivate _focusManager: FocusManager;\n\tprivate _ktSelectInstance: KTSelect; // Added instance variable\n\n\t/**\n\t * Constructor\n\t * @param element The parent element (select wrapper)\n\t * @param toggleElement The element that triggers the dropdown\n\t * @param dropdownElement The dropdown content element\n\t * @param config The configuration options\n\t */\n\tconstructor(\n\t\telement: HTMLElement,\n\t\ttoggleElement: HTMLElement,\n\t\tdropdownElement: HTMLElement,\n\t\tconfig: KTSelectConfigInterface,\n\t\tktSelectInstance: KTSelect, // Added parameter\n\t) {\n\t\tsuper();\n\n\t\tthis._element = element;\n\t\tthis._toggleElement = toggleElement;\n\t\tthis._dropdownElement = dropdownElement;\n\t\tthis._config = config;\n\t\tthis._ktSelectInstance = ktSelectInstance; // Assign instance\n\n\t\t// For centered modals, don't move dropdown to container to preserve positioning context\n\t\t// For other cases, move to container if specified\n\t\tconst modalParent = this._getModalContainer();\n\t\tconst isCenteredModal =\n\t\t\tmodalParent && modalParent.classList.contains('kt-modal-center');\n\n\t\t// Only move dropdown if not in centered modal (regardless of strategy override)\n\t\t// This prevents the positioning bug even if user sets dropdownStrategy: 'fixed'\n\t\tconst container = this._resolveDropdownContainer();\n\t\tif (container && !isCenteredModal) {\n\t\t\tif (container !== this._dropdownElement.parentElement) {\n\t\t\t\tcontainer.appendChild(this._dropdownElement);\n\t\t\t}\n\t\t}\n\n\t\tthis._eventManager = new EventManager();\n\t\tthis._focusManager = new FocusManager(\n\t\t\tdropdownElement,\n\t\t\t'[data-kt-select-option]',\n\t\t\tconfig,\n\t\t);\n\n\t\tthis._setupEventListeners();\n\t}\n\n\t/**\n\t * Set up event listeners for the dropdown\n\t */\n\tprivate _setupEventListeners(): void {\n\t\t// Toggle click\n\t\tthis._eventManager.addListener(\n\t\t\tthis._toggleElement,\n\t\t\t'click',\n\t\t\tthis._handleToggleClick.bind(this),\n\t\t);\n\n\t\t// Close on outside click\n\t\tthis._eventManager.addListener(\n\t\t\tdocument as unknown as HTMLElement,\n\t\t\t'click',\n\t\t\tthis._handleOutsideClick.bind(this),\n\t\t);\n\t}\n\n\t/**\n\t * Handle toggle element click\n\t */\n\tprivate _handleToggleClick(event: Event): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif (this._config.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Call KTSelect's methods\n\t\tif (this._ktSelectInstance.isDropdownOpen()) {\n\t\t\tthis._ktSelectInstance.closeDropdown();\n\t\t} else {\n\t\t\tthis._ktSelectInstance.openDropdown();\n\t\t}\n\t}\n\n\t/**\n\t * Handle clicks outside the dropdown\n\t */\n\tprivate _handleOutsideClick(event: MouseEvent): void {\n\t\tif (!this._isOpen) return;\n\n\t\tconst target = event.target as HTMLElement;\n\n\t\tif (\n\t\t\t!this._element.contains(target) &&\n\t\t\t!this._dropdownElement.contains(target)\n\t\t) {\n\t\t\t// Call KTSelect's closeDropdown method\n\t\t\tthis._ktSelectInstance.closeDropdown();\n\t\t}\n\t}\n\n\t/**\n\t * Set width of dropdown based on toggle element\n\t */\n\tprivate _setDropdownWidth(): void {\n\t\tif (!this._dropdownElement || !this._toggleElement) return;\n\n\t\t// Check if width is configured\n\t\tif (this._config.dropdownWidth) {\n\t\t\t// If custom width is set, use that\n\t\t\tthis._dropdownElement.style.width = this._config.dropdownWidth;\n\t\t} else {\n\t\t\t// Otherwise, match toggle element width for a cleaner appearance\n\t\t\tconst toggleWidth = this._toggleElement.offsetWidth;\n\t\t\tthis._dropdownElement.style.width = `${toggleWidth}px`;\n\t\t}\n\t}\n\n\t/**\n\t * Detect if the select is inside a modal container\n\t * @returns The modal element if found, null otherwise\n\t */\n\tprivate _getModalContainer(): HTMLElement | null {\n\t\treturn this._element.closest(\n\t\t\t'[data-kt-modal], .kt-modal, .kt-modal-center',\n\t\t) as HTMLElement | null;\n\t}\n\n\t/**\n\t * Get the appropriate boundary element for Popper positioning\n\t * For centered modals, use .kt-modal-content to avoid transform calculation issues\n\t * @returns The boundary element, or null if no modal found\n\t */\n\tprivate _getModalBoundary(): HTMLElement | null {\n\t\tconst modalParent = this._getModalContainer();\n\t\tif (!modalParent) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// For centered modals, use .kt-modal-content as boundary to avoid transform issues\n\t\tif (modalParent.classList.contains('kt-modal-center')) {\n\t\t\tconst modalContent = modalParent.querySelector(\n\t\t\t\t'.kt-modal-content',\n\t\t\t) as HTMLElement | null;\n\t\t\treturn modalContent || modalParent;\n\t\t}\n\n\t\t// For non-centered modals, use the modal element itself\n\t\treturn modalParent;\n\t}\n\n\t/**\n\t * Get the appropriate positioning strategy based on context\n\t * @returns 'fixed' if inside non-centered modal, 'absolute' for centered modals or no modal\n\t */\n\tprivate _getPositioningStrategy(): 'fixed' | 'absolute' {\n\t\t// Check if config explicitly sets strategy\n\t\tif (this._config.dropdownStrategy) {\n\t\t\treturn this._config.dropdownStrategy as 'fixed' | 'absolute';\n\t\t}\n\n\t\t// For centered modals, use absolute positioning to avoid transform calculation issues\n\t\t// For non-centered modals, use fixed positioning\n\t\tconst modalParent = this._getModalContainer();\n\t\tif (modalParent && modalParent.classList.contains('kt-modal-center')) {\n\t\t\treturn 'absolute';\n\t\t}\n\n\t\t// Use fixed positioning for non-centered modals\n\t\treturn modalParent ? 'fixed' : 'absolute';\n\t}\n\n\t/**\n\t * Initialize the Popper instance for dropdown positioning\n\t */\n\tprivate _initPopper(): void {\n\t\t// Destroy existing popper instance if it exists\n\t\tthis._destroyPopper();\n\n\t\t// Default offset\n\t\tconst offsetValue = '0, 5';\n\n\t\t// Get configuration options\n\t\tconst placement = this._config.dropdownPlacement || 'bottom-start';\n\t\tconst strategy = this._getPositioningStrategy();\n\t\tconst preventOverflow = this._config.dropdownPreventOverflow !== false;\n\t\tconst flip = this._config.dropdownFlip !== false;\n\n\t\t// Get appropriate boundary element for modal context\n\t\tconst boundary = this._getModalBoundary() || 'clippingParents';\n\n\t\t// Create new popper instance\n\t\tthis._popperInstance = createPopper(\n\t\t\tthis._toggleElement,\n\t\t\tthis._dropdownElement,\n\t\t\t{\n\t\t\t\tplacement: placement as Placement,\n\t\t\t\tstrategy: strategy,\n\t\t\t\tmodifiers: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'offset',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\toffset: this._parseOffset(offsetValue),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'preventOverflow',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tboundary: boundary,\n\t\t\t\t\t\t\taltAxis: preventOverflow,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'flip',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tenabled: flip,\n\t\t\t\t\t\t\tfallbackPlacements: ['top-start', 'bottom-end', 'top-end'],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'sameWidth',\n\t\t\t\t\t\tenabled: !this._config.dropdownWidth,\n\t\t\t\t\t\tphase: 'beforeWrite',\n\t\t\t\t\t\trequires: ['computeStyles'],\n\t\t\t\t\t\tfn: ({ state }) => {\n\t\t\t\t\t\t\tstate.styles.popper.width = `${state.rects.reference.width}px`;\n\t\t\t\t\t\t},\n\t\t\t\t\t\teffect: ({ state }) => {\n\t\t\t\t\t\t\t// Add type guard for HTMLElement\n\t\t\t\t\t\t\tconst reference = state.elements.reference as HTMLElement;\n\t\t\t\t\t\t\tif (reference && 'offsetWidth' in reference) {\n\t\t\t\t\t\t\t\tstate.elements.popper.style.width = `${reference.offsetWidth}px`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Parse offset string into an array of numbers\n\t */\n\tprivate _parseOffset(offset: string): number[] {\n\t\treturn offset.split(',').map((value) => parseInt(value.trim(), 10));\n\t}\n\n\t/**\n\t * Destroy the Popper instance\n\t */\n\tprivate _destroyPopper(): void {\n\t\tif (this._popperInstance) {\n\t\t\tthis._popperInstance.destroy();\n\t\t\tthis._popperInstance = null;\n\t\t}\n\t}\n\n\t/**\n\t * Update dropdown position\n\t */\n\tpublic updatePosition(): void {\n\t\tif (this._popperInstance) {\n\t\t\tthis._popperInstance.update();\n\t\t}\n\t}\n\n\t/**\n\t * Open the dropdown\n\t */\n\tpublic open(): void {\n\t\tif (this._config.disabled) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._isOpen || this._isTransitioning) return;\n\n\t\t// Begin opening transition\n\t\tthis._isTransitioning = true;\n\n\t\t// Set initial styles\n\t\tthis._dropdownElement.classList.remove('hidden');\n\t\tthis._dropdownElement.style.opacity = '0';\n\n\t\t// Set dropdown width\n\t\tthis._setDropdownWidth();\n\n\t\t// Reflow\n\t\tKTDom.reflow(this._dropdownElement);\n\n\t\t// Apply z-index\n\t\tlet zIndexToApply: number | null = null;\n\n\t\tif (this._config.dropdownZindex) {\n\t\t\tzIndexToApply = this._config.dropdownZindex;\n\t\t}\n\n\t\t// Consider the dropdown's current z-index if it's already set and higher\n\t\tconst currentDropdownZIndexStr = KTDom.getCssProp(\n\t\t\tthis._dropdownElement,\n\t\t\t'z-index',\n\t\t);\n\t\tif (currentDropdownZIndexStr && currentDropdownZIndexStr !== 'auto') {\n\t\t\tconst currentDropdownZIndex = parseInt(currentDropdownZIndexStr);\n\t\t\tif (\n\t\t\t\t!isNaN(currentDropdownZIndex) &&\n\t\t\t\tcurrentDropdownZIndex > (zIndexToApply || 0)\n\t\t\t) {\n\t\t\t\tzIndexToApply = currentDropdownZIndex;\n\t\t\t}\n\t\t}\n\n\t\t// Ensure dropdown is above elements within its original toggle's parent context\n\t\tconst toggleParentContextZindex = KTDom.getHighestZindex(this._element); // _element is the select wrapper\n\t\tif (\n\t\t\ttoggleParentContextZindex !== null &&\n\t\t\ttoggleParentContextZindex >= (zIndexToApply || 0)\n\t\t) {\n\t\t\tzIndexToApply = toggleParentContextZindex + 1;\n\t\t}\n\n\t\tif (zIndexToApply !== null) {\n\t\t\tthis._dropdownElement.style.zIndex = zIndexToApply.toString();\n\t\t}\n\n\t\t// Initialize popper\n\t\tthis._initPopper();\n\n\t\t// Add active classes for visual state\n\t\tthis._dropdownElement.classList.add('open');\n\t\tthis._toggleElement.classList.add('active');\n\t\t// ARIA attributes will be handled by KTSelect\n\n\t\t// Start transition\n\t\tthis._dropdownElement.style.opacity = '1';\n\n\t\t// Handle transition end\n\t\tKTDom.transitionEnd(this._dropdownElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\t\t\t// Focus and events will be handled by KTSelect\n\t\t});\n\t}\n\n\t/**\n\t * Close the dropdown\n\t */\n\tpublic close(): void {\n\t\tif (!this._isOpen || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Events and ARIA will be handled by KTSelect\n\n\t\tthis._isTransitioning = true;\n\n\t\tthis._dropdownElement.style.opacity = '0';\n\n\t\tlet transitionComplete = false;\n\t\tconst fallbackTimer = setTimeout(() => {\n\t\t\tif (!transitionComplete) {\n\t\t\t\tcompleteTransition();\n\t\t\t}\n\t\t}, 300);\n\n\t\tconst completeTransition = () => {\n\t\t\tif (transitionComplete) return;\n\t\t\ttransitionComplete = true;\n\t\t\tclearTimeout(fallbackTimer);\n\n\n\t\t\tthis._dropdownElement.classList.add('hidden');\n\t\t\tthis._dropdownElement.classList.remove('open');\n\t\t\tthis._toggleElement.classList.remove('active');\n\t\t\t// ARIA attributes will be handled by KTSelect\n\n\t\t\tthis._destroyPopper();\n\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\n\t\t\t// Events will be handled by KTSelect\n\n\t\t};\n\n\t\tKTDom.transitionEnd(this._dropdownElement, completeTransition);\n\n\t\tif (\n\t\t\tKTDom.getCssProp(this._dropdownElement, 'transition-duration') === '0s'\n\t\t) {\n\t\t\tcompleteTransition();\n\t\t}\n\t}\n\n\t/**\n\t * Check if dropdown is open\n\t */\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\t/**\n\t * Clean up component\n\t */\n\tpublic override dispose(): void {\n\t\t// Destroy popper\n\t\tthis._destroyPopper();\n\n\t\t// Remove event listeners\n\t\tthis._eventManager.removeAllListeners(this._element);\n\t\tthis._eventManager.removeAllListeners(this._toggleElement);\n\t\tthis._eventManager.removeAllListeners(document as unknown as HTMLElement);\n\n\t\t// Clean up focus manager\n\t\tif (\n\t\t\tthis._focusManager &&\n\t\t\ttypeof this._focusManager.dispose === 'function'\n\t\t) {\n\t\t\tthis._focusManager.dispose();\n\t\t}\n\n\t\t// Clean up state\n\t\tthis._isOpen = false;\n\t\tthis._isTransitioning = false;\n\n\t\t// Remove data reference\n\t\tKTData.remove(this._element, this._name);\n\t}\n\n\tprivate _resolveDropdownContainer(): HTMLElement | null {\n\t\tconst containerSelector = this._config.dropdownContainer;\n\t\tif (containerSelector) {\n\t\t\tconst containerElement = document.querySelector(\n\t\t\t\tcontainerSelector,\n\t\t\t) as HTMLElement | null;\n\t\t\tif (!containerElement && this._config.debug) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`KTSelectDropdown: dropdownContainer selector \"${containerSelector}\" not found. Dropdown will remain in its default position.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn containerElement;\n\t\t}\n\t\treturn null;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTDismissInterface, KTDismissConfigInterface } from './types';\nimport { KTDismissModeType } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_DISMISS_INITIALIZED: boolean;\n\t\tKTDismiss: typeof KTDismiss;\n\t}\n}\n\nexport class KTDismiss extends KTComponent implements KTDismissInterface {\n\tprotected override _name: string = 'dismiss';\n\tprotected override _defaultConfig: KTDismissConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tmode: 'remove',\n\t\tinterrupt: true,\n\t\ttarget: '',\n\t};\n\tprotected override _config: KTDismissConfigInterface = this._defaultConfig;\n\tprotected _isAnimating: boolean = false;\n\tprotected _targetElement: HTMLElement | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTDismissConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._config['mode'] = this._config['mode'] as KTDismissModeType;\n\n\t\tif (!this._element) return;\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-dismiss') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tif ((this._getOption('interrupt') as boolean) === true) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\n\t\t\tthis._dismiss();\n\t\t});\n\t}\n\n\tprotected _dismiss(): void {\n\t\tif (this._isAnimating) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('dismiss', payload);\n\t\tthis._dispatchEvent('dismiss', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._targetElement) return;\n\t\tthis._targetElement.style.opacity = '0';\n\t\tKTDom.reflow(this._targetElement);\n\t\tthis._isAnimating = true;\n\n\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\tif (!this._targetElement) return;\n\t\t\tthis._isAnimating = false;\n\t\t\tthis._targetElement.style.opacity = '';\n\n\t\t\tif (this._getOption('mode').toString().toLowerCase() === 'hide') {\n\t\t\t\tthis._targetElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tKTDom.remove(this._targetElement);\n\t\t\t}\n\n\t\t\tthis._fireEvent('dismissed');\n\t\t\tthis._dispatchEvent('dismissed');\n\t\t});\n\t}\n\n\tpublic getTargetElement(): HTMLElement {\n\t\treturn this._targetElement;\n\t}\n\n\tpublic dismiss(): void {\n\t\tthis._dismiss();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTDismiss {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'dismiss')) {\n\t\t\treturn KTData.get(element, 'dismiss') as KTDismiss;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-dismiss')) {\n\t\t\treturn new KTDismiss(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTDismissConfigInterface,\n\t): KTDismiss {\n\t\treturn this.getInstance(element) || new KTDismiss(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-dismiss]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTDismiss(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTDismiss.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTDismiss = KTDismiss;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport {\n\tKTTogglePasswordConfigInterface,\n\tKTTogglePasswordInterface,\n} from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKTTogglePassword: typeof KTTogglePassword;\n\t}\n}\n\nexport class KTTogglePassword\n\textends KTComponent\n\timplements KTTogglePasswordInterface\n{\n\tprotected override _name: string = 'toggle-password';\n\tprotected override _defaultConfig: KTTogglePasswordConfigInterface = {\n\t\tpermanent: false,\n\t};\n\tprotected override _config: KTTogglePasswordConfigInterface =\n\t\tthis._defaultConfig;\n\tprotected _triggerElement: HTMLElement;\n\tprotected _inputElement: HTMLInputElement;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTTogglePasswordConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._triggerElement = this._element.querySelector(\n\t\t\t'[data-kt-toggle-password-trigger]',\n\t\t);\n\t\tthis._inputElement = this._element.querySelector('input');\n\n\t\tif (!this._triggerElement || !this._inputElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._triggerElement.addEventListener('click', () => {\n\t\t\tthis._toggle();\n\t\t});\n\n\t\tthis._inputElement.addEventListener('input', () => {\n\t\t\tthis._update();\n\t\t});\n\t}\n\n\tprotected _toggle(): void {\n\t\tif (!this._element) return;\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isVisible()) {\n\t\t\tthis._element.classList.remove('active');\n\t\t\tthis._setVisible(false);\n\t\t} else {\n\t\t\tthis._element.classList.add('active');\n\t\t\tthis._setVisible(true);\n\t\t}\n\n\t\tthis._fireEvent('toggled');\n\t\tthis._dispatchEvent('toggled');\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._element) return;\n\n\t\tif ((this._getOption('permanent') as boolean) === false) {\n\t\t\tif (this._isVisible()) {\n\t\t\t\tthis._setVisible(false);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _isVisible(): boolean {\n\t\treturn this._inputElement.getAttribute('type') === 'text';\n\t}\n\n\tpublic _setVisible(flag: boolean) {\n\t\tif (flag) {\n\t\t\tthis._inputElement.setAttribute('type', 'text');\n\t\t} else {\n\t\t\tthis._inputElement.setAttribute('type', 'password');\n\t\t}\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic setVisible(flag: boolean): void {\n\t\tthis._setVisible(flag);\n\t}\n\n\tpublic isVisible(): boolean {\n\t\treturn this._isVisible();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTTogglePassword {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'toggle-password')) {\n\t\t\treturn KTData.get(element, 'toggle-password') as KTTogglePassword;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-toggle-password')) {\n\t\t\treturn new KTTogglePassword(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTTogglePasswordConfigInterface,\n\t): KTTogglePassword {\n\t\treturn this.getInstance(element) || new KTTogglePassword(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-toggle-password]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTTogglePassword(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTTogglePassword.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTTogglePassword = KTTogglePassword;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTDismiss } from './dismiss';\nexport type { KTDismissConfigInterface, KTDismissInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTSelectConfigInterface } from './config';\nimport { KTSelect } from './select';\nimport { defaultTemplates } from './templates';\nimport { filterOptions, FocusManager, EventManager } from './utils';\n\nexport class KTSelectSearch {\n\tprivate _select: KTSelect;\n\tprivate _searchInput: HTMLInputElement;\n\tprivate _noResultsElement: HTMLElement | null = null;\n\tprivate _originalOptionContents = new Map<string, string>();\n\tprivate _eventManager: EventManager;\n\tprivate _focusManager: FocusManager;\n\tprivate _config: KTSelectConfigInterface;\n\n\t// Public handler for search input (made public for event binding)\n\tpublic handleSearchInput: (...args: any[]) => void;\n\n\tconstructor(select: KTSelect) {\n\t\tthis._select = select;\n\t\tthis._searchInput = select.getSearchInput();\n\t\tthis._eventManager = new EventManager();\n\t\tthis._focusManager = new FocusManager(\n\t\t\tthis._select.getDropdownElement(),\n\t\t\t'[data-kt-select-option]',\n\t\t\tselect.getConfig(),\n\t\t);\n\t\tthis.handleSearchInput = this._handleSearchInput.bind(this);\n\t\tthis._config = select.getConfig();\n\t\tthis._cacheOriginalOptionContents();\n\t}\n\n\tinit() {\n\t\tif (this._select.getConfig().enableSearch) {\n\t\t\tthis._searchInput = this._select.getSearchInput();\n\n\t\t\tif (this._searchInput) {\n\n\t\t\t\t// First remove any existing listeners to prevent duplicates\n\t\t\t\tthis._removeEventListeners();\n\n\t\t\t\t// Add the input event listener for filtering\n\t\t\t\tthis._eventManager.addListener(\n\t\t\t\t\tthis._searchInput,\n\t\t\t\t\t'input',\n\t\t\t\t\tthis.handleSearchInput,\n\t\t\t\t);\n\n\t\t\t\t// Add keydown event listener for navigation, selection, and escape\n\t\t\t\tthis._eventManager.addListener(\n\t\t\t\t\tthis._searchInput,\n\t\t\t\t\t'keydown',\n\t\t\t\t\tthis._handleSearchKeyDown.bind(this),\n\t\t\t\t);\n\n\t\t\t\t// Add blur event listener to ensure highlights are cleared when focus is lost\n\t\t\t\tthis._eventManager.addListener(this._searchInput, 'blur', () => {\n\t\t\t\t\t// Small delay to prevent race conditions with selection\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (!this._searchInput.value) {\n\t\t\t\t\t\t\tthis._resetAllOptions();\n\t\t\t\t\t\t\tthis.clearSearch();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 100);\n\t\t\t\t});\n\n\t\t\t\t// Listen for remote search events to coordinate with remote search functionality\n\t\t\t\tif (\n\t\t\t\t\tthis._select.getConfig().remote &&\n\t\t\t\t\tthis._select.getConfig().searchParam\n\t\t\t\t) {\n\t\t\t\t\tthis._select\n\t\t\t\t\t\t.getElement()\n\t\t\t\t\t\t.addEventListener('remoteSearchStart', () => {\n\t\t\t\t\t\t\t// Reset focused option when remote search starts\n\t\t\t\t\t\t\tthis._focusManager.resetFocus();\n\t\t\t\t\t\t});\n\n\t\t\t\t\tthis._select.getElement().addEventListener('remoteSearchEnd', () => {\n\t\t\t\t\t\t// After remote search completes, refresh our option cache\n\t\t\t\t\t\tthis.refreshOptionCache();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Listen for dropdown close to reset options - ATTACH TO WRAPPER\n\t\t\t\tthis._select\n\t\t\t\t\t.getWrapperElement()\n\t\t\t\t\t.addEventListener('dropdown.close', () => {\n\t\t\t\t\t\tthis._focusManager.resetFocus();\n\t\t\t\t\t\tconst config = this._select.getConfig();\n\n\t\t\t\t\t\t// Clear highlights from current options (always do this)\n\t\t\t\t\t\tthis.clearSearch();\n\n\t\t\t\t\t\t// Respect clearSearchOnClose config option\n\t\t\t\t\t\tif (config.clearSearchOnClose) {\n\t\t\t\t\t\t\t// Clear the search input field\n\t\t\t\t\t\t\tthis._searchInput.value = '';\n\t\t\t\t\t\t\t// Reset all options to their original state\n\t\t\t\t\t\t\tthis._resetAllOptions();\n\t\t\t\t\t\t\t// Clear any \"no results\" message\n\t\t\t\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// When clearSearchOnClose is false, preserve search text\n\t\t\t\t\t\t\t// The search input value is already preserved by KTSelect's closeDropdown method\n\t\t\t\t\t\t\t// Reset options visibility to show all (they will be re-filtered when dropdown reopens)\n\t\t\t\t\t\t\tthis._resetAllOptions();\n\t\t\t\t\t\t\t// Clear any \"no results\" message\n\t\t\t\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t\t\t\t\t// Note: The search input value is preserved, so when dropdown reopens,\n\t\t\t\t\t\t\t// the dropdown.show listener will detect it and re-filter options accordingly\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t// Clear highlights when an option is selected - ATTACH TO ORIGINAL SELECT (standard 'change' event)\n\t\t\t\tthis._select.getElement().addEventListener('change', () => {\n\t\t\t\t\tthis.clearSearch();\n\n\t\t\t\t\t// Close dropdown only for single select mode, and only if closeOnEnter is not false\n\t\t\t\t\t// Keep dropdown open for multiple select mode to allow additional selections\n\t\t\t\t\t// Also respect closeOnEnter config when it's explicitly set to false\n\t\t\t\t\tconst config = this._select.getConfig();\n\t\t\t\t\tif (!config.multiple && config.closeOnEnter !== false) {\n\t\t\t\t\t\tthis._select.closeDropdown();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Consolidated 'dropdown.show' event listener - ATTACH TO WRAPPER\n\t\t\t\tthis._select\n\t\t\t\t\t.getWrapperElement()\n\t\t\t\t\t.addEventListener('dropdown.show', () => {\n\t\t\t\t\t\tthis._focusManager.resetFocus(); // Always clear previous focus state\n\n\t\t\t\t\t\tif (this._searchInput?.value) {\n\t\t\t\t\t\t\t// If there's an existing search term:\n\t\t\t\t\t\t\t// 1. Re-filter options. This ensures the display (hidden/visible) is correct\n\t\t\t\t\t\t\t// and \"no results\" message is handled if query yields nothing.\n\t\t\t\t\t\t\tthis._filterOptions(this._searchInput.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// If search input is empty:\n\t\t\t\t\t\t\t// 1. Reset all options to their full, unfiltered, original state.\n\t\t\t\t\t\t\tthis._resetAllOptions(); // Shows all, clears highlights from options, restores original text\n\t\t\t\t\t\t\t// 2. Clear any \"no results\" message.\n\t\t\t\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Handle autofocus for the search input with retry mechanism\n\t\t\t\t\t\tif (this._select.getConfig().searchAutofocus) {\n\t\t\t\t\t\t\tthis._focusSearchInputWithRetry();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._select.updateSelectAllButtonState();\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Remove event listeners to prevent memory leaks or duplicates\n\t */\n\tprivate _removeEventListeners(): void {\n\t\tif (this._searchInput) {\n\t\t\tthis._eventManager.removeAllListeners(this._searchInput);\n\t\t}\n\t}\n\n\t/**\n\t * Focus the search input with retry mechanism for reliability\n\t * Retries up to 3 times with exponential backoff (50ms, 100ms, 200ms)\n\t */\n\tprivate _focusSearchInputWithRetry(attempt: number = 0): void {\n\t\tif (!this._searchInput) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst maxAttempts = 3;\n\t\tconst delays = [0, 50, 100, 200]; // Initial attempt + 3 retries\n\n\t\tif (attempt > maxAttempts) {\n\t\t\tif (this._config.debug) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'KTSelect: Failed to focus search input after',\n\t\t\t\t\tmaxAttempts,\n\t\t\t\t\t'attempts',\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst delay = delays[attempt] || 200;\n\t\tconst focusAttempt = () => {\n\t\t\ttry {\n\t\t\t\tthis._searchInput?.focus();\n\t\t\t\t// Check if focus was successful\n\t\t\t\tconst isFocused = document.activeElement === this._searchInput || this._searchInput === document.activeElement;\n\t\t\t\tif (isFocused) {\n\t\t\t\t\t// Focus successful\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Focus failed, retry if we haven't exceeded max attempts\n\t\t\t\tif (attempt < maxAttempts) {\n\t\t\t\t\tthis._focusSearchInputWithRetry(attempt + 1);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// Focus failed with error, retry if we haven't exceeded max attempts\n\t\t\t\tif (attempt < maxAttempts) {\n\t\t\t\t\tthis._focusSearchInputWithRetry(attempt + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (delay === 0) {\n\t\t\tfocusAttempt();\n\t\t} else {\n\t\t\tsetTimeout(focusAttempt, delay);\n\t\t}\n\t}\n\n\t/**\n\t * Handles keydown events on the search input for navigation and actions.\n\t */\n\tprivate _handleSearchKeyDown(event: KeyboardEvent): void {\n\t\tconst key = event.key;\n\n\t\tswitch (key) {\n\t\t\tcase ' ': // Spacebar\n\t\t\t\t// Do nothing, allow space to be typed into the input\n\t\t\t\t// Stop propagation to prevent parent handlers from processing this event\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._focusManager.focusNext();\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._focusManager.focusPrevious();\n\t\t\t\tbreak;\n\t\t\tcase 'Enter':\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// Always attempt to select the first available option in the list.\n\t\t\t\t// focusFirst() finds, focuses, and returns the first visible, non-disabled option.\n\t\t\t\tconst firstAvailableOption = this._focusManager.focusFirst();\n\n\t\t\t\tif (firstAvailableOption) {\n\t\t\t\t\tconst optionValue = firstAvailableOption.getAttribute('data-value');\n\t\t\t\t\tif (optionValue) {\n\t\t\t\t\t\t// toggleSelection() already handles closing the dropdown based on closeOnEnter config\n\t\t\t\t\t\t// for single-select mode, so we don't need to call closeDropdown() here\n\t\t\t\t\t\tthis._select.toggleSelection(optionValue);\n\t\t\t\t\t\t// If closeOnEnter is false, dropdown remains open for additional selections\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If no available option, do nothing (dropdown remains open)\n\t\t\t\tbreak;\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._searchInput.value = '';\n\t\t\t\tthis.clearSearch();\n\t\t\t\tthis._resetAllOptions();\n\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t\tthis._focusManager.focusFirst();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Store original HTML content of all options for later restoration\n\t * This prevents losing formatting when clearing search\n\t */\n\tprivate _cacheOriginalOptionContents() {\n\t\t// Wait for options to be initialized\n\t\tsetTimeout(() => {\n\t\t\tthis._originalOptionContents.clear(); // Clear before re-caching\n\t\t\tconst options = Array.from(this._select.getOptionsElement());\n\t\t\toptions.forEach((option) => {\n\t\t\t\tconst value = option.getAttribute('data-value');\n\t\t\t\tif (value) {\n\t\t\t\t\t// Store the full innerHTML as the original content\n\t\t\t\t\tthis._originalOptionContents.set(value, option.innerHTML);\n\t\t\t\t}\n\t\t\t});\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Restores the innerHTML of all options from the cache if they have been modified.\n\t * This is typically called before applying new filters/highlights.\n\t */\n\tprivate _restoreOptionContentsBeforeFilter(): void {\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\t\toptions.forEach((option) => {\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value && this._originalOptionContents.has(value)) {\n\t\t\t\tconst originalContent = this._originalOptionContents.get(value)!;\n\t\t\t\t// Only restore if current content is different, to avoid unnecessary DOM manipulation\n\t\t\t\tif (option.innerHTML !== originalContent) {\n\t\t\t\t\toption.innerHTML = originalContent;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _handleSearchInput(event: Event) {\n\t\tconst query = (event.target as HTMLInputElement).value;\n\t\tconst config = this._select.getConfig();\n\n\t\t// Reset focused option when search changes\n\t\tthis._focusManager.resetFocus();\n\n\t\t// Restore original content for all options before filtering/highlighting again\n\t\tthis._restoreOptionContentsBeforeFilter();\n\n\t\tif (query.trim() === '') {\n\t\t\tthis._resetAllOptions();\n\t\t\tthis._focusManager.focusFirst(); // Focus first option when search is cleared\n\t\t\treturn;\n\t\t}\n\n\t\t// For remote search, KTSelect component handles it.\n\t\t// KTSelect will call refreshAfterSearch on this module when remote data is updated.\n\t\tif (config.remote && config.searchParam) {\n\t\t\tif (query.length < config.searchMinLength) {\n\t\t\t\tthis._resetAllOptions();\n\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t\tthis._focusManager.focusFirst(); // Focus first if query too short\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// For local search\n\t\tif (query.length >= config.searchMinLength) {\n\t\t\tthis._filterOptions(query);\n\t\t\tthis._focusManager.focusFirst(); // Focus first visible option after local filtering\n\t\t} else {\n\t\t\tthis._resetAllOptions();\n\t\t\tthis._clearNoResultsMessage();\n\t\t\tthis._focusManager.focusFirst(); // Focus first if query too short and not remote\n\t\t}\n\t}\n\n\tprivate _filterOptions(query: string) {\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\t\tconst config = this._select.getConfig();\n\t\tconst dropdownElement = this._select.getDropdownElement();\n\n\t\t// Cache original option HTML if not already cached\n\t\tif (this._originalOptionContents.size === 0) {\n\t\t\tthis._cacheOriginalOptionContents();\n\t\t}\n\n\t\t// Restore original content before filtering, so highlighting is applied fresh.\n\t\tthis._restoreOptionContentsBeforeFilter();\n\n\t\tconst visibleCount = filterOptions(\n\t\t\toptions,\n\t\t\tquery,\n\t\t\tconfig,\n\t\t\tdropdownElement,\n\t\t\t(count) => this._handleNoResults(count),\n\t\t);\n\n\t\tthis._select.updateSelectAllButtonState();\n\t}\n\n\t/**\n\t * Reset all options to their original state\n\t */\n\tprivate _resetAllOptions() {\n\t\t// Show all options\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\n\t\t// Ensure the cache is populated if it's somehow empty here\n\t\tif (this._originalOptionContents.size === 0) {\n\t\t\tthis._cacheOriginalOptionContents();\n\t\t}\n\n\t\toptions.forEach((option) => {\n\t\t\toption.classList.remove('hidden');\n\t\t\tif (option.style.display === 'none') option.style.display = ''; // Ensure visible\n\n\t\t\t// Restore original HTML content (remove highlights)\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value && this._originalOptionContents.has(value)) {\n\t\t\t\tconst originalContent = this._originalOptionContents.get(value)!;\n\t\t\t\t// Only update if different, to minimize DOM changes\n\t\t\t\tif (option.innerHTML !== originalContent) {\n\t\t\t\t\toption.innerHTML = originalContent;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis._clearNoResultsMessage(); // Ensure no results message is cleared when resetting\n\t\tthis._select.updateSelectAllButtonState();\n\t}\n\n\tprivate _handleNoResults(visibleOptionsCount: number) {\n\t\tif (visibleOptionsCount === 0 && this._searchInput?.value?.trim() !== '') {\n\t\t\tthis._showNoResultsMessage();\n\t\t} else {\n\t\t\tthis._clearNoResultsMessage();\n\t\t}\n\t}\n\n\tprivate _showNoResultsMessage() {\n\t\tthis._clearNoResultsMessage();\n\n\t\tconst config = this._select.getConfig();\n\t\tthis._noResultsElement = defaultTemplates.searchEmpty(config);\n\n\t\tconst dropdownElement = this._select.getDropdownElement();\n\t\tconst optionsContainer = dropdownElement.querySelector(\n\t\t\t'[data-kt-select-options]',\n\t\t);\n\t\tif (optionsContainer) {\n\t\t\toptionsContainer.appendChild(this._noResultsElement);\n\t\t} else {\n\t\t\tdropdownElement.appendChild(this._noResultsElement);\n\t\t}\n\t}\n\n\tprivate _clearNoResultsMessage() {\n\t\tif (this._noResultsElement && this._noResultsElement.parentNode) {\n\t\t\tthis._noResultsElement.parentNode.removeChild(this._noResultsElement);\n\t\t\tthis._noResultsElement = null;\n\t\t}\n\t}\n\n\t/**\n\t * Public method to explicitly clear all search highlights\n\t * This is called when search is reset or selection changes\n\t */\n\tpublic clearSearch() {\n\t\t// Restore original option content (removes highlighting)\n\t\tconst optionsToClear = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\n\t\t// Ensure cache is available\n\t\tif (this._originalOptionContents.size === 0 && optionsToClear.length > 0) {\n\t\t\tthis._cacheOriginalOptionContents();\n\t\t}\n\n\t\toptionsToClear.forEach((option) => {\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value && this._originalOptionContents.has(value)) {\n\t\t\t\tconst originalContent = this._originalOptionContents.get(value)!;\n\t\t\t\t// Only restore if different\n\t\t\t\tif (option.innerHTML !== originalContent) {\n\t\t\t\t\toption.innerHTML = originalContent;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * This ensures that search highlighting works correctly with new options\n\t */\n\tpublic refreshOptionCache(): void {\n\t\t// Re-cache all option contents\n\t\tthis._originalOptionContents.clear();\n\t\tconst currentOptions = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\n\t\tcurrentOptions.forEach((option) => {\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value) {\n\t\t\t\tthis._originalOptionContents.set(value, option.innerHTML);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Called after search (local or remote via KTSelect) to reset focus.\n\t */\n\tpublic refreshAfterSearch(): void {\n\t\tthis._focusManager.resetFocus();\n\t\tthis._focusManager.focusFirst();\n\t\t// Re-cache original contents as options might have changed (especially after remote search)\n\t\tthis.refreshOptionCache();\n\t}\n\n\t/**\n\t * Clean up all resources used by the search module\n\t */\n\tpublic destroy(): void {\n\t\t// Remove all event listeners\n\t\tthis._removeEventListeners();\n\n\t\t// Clear all references\n\t\tif (this._focusManager) {\n\t\t\tthis._focusManager.dispose();\n\t\t}\n\n\t\t// Clear cached content\n\t\tthis._originalOptionContents.clear();\n\n\t\t// Clear highlight elements\n\t\tthis.clearSearch();\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport {\n\tKTSelectConfigInterface,\n\tKTSelectState,\n\tKTSelectOption as KTSelectOptionData,\n} from './config';\nimport { KTSelectOption } from './option';\nimport { KTSelectRemote } from './remote';\nimport { KTSelectSearch } from './search';\nimport { defaultTemplates } from './templates';\nimport { KTSelectCombobox } from './combobox';\nimport { KTSelectDropdown } from './dropdown';\nimport {\n\tFocusManager,\n\tEventManager,\n\trenderTemplateString,\n\tTypeToSearchBuffer,\n} from './utils';\nimport { KTSelectTags } from './tags';\n\nexport class KTSelect extends KTComponent {\n\t// Core properties\n\tprotected override readonly _name: string = 'select';\n\tprotected override readonly _dataOptionPrefix: string = 'kt-'; // Use 'kt-' prefix to support data-kt-select-option attributes\n\tprotected override readonly _config: KTSelectConfigInterface;\n\tprotected override _defaultConfig: KTSelectConfigInterface;\n\n\t// Static global configuration\n\tprivate static globalConfig: Partial<KTSelectConfigInterface> = {};\n\n\t// Static registry for tracking open dropdowns (global dropdown management)\n\tprivate static openDropdowns: Set<KTSelect> = new Set();\n\n\t// DOM elements\n\tprivate _wrapperElement: HTMLElement;\n\tprivate _displayElement: HTMLElement;\n\tprivate _dropdownContentElement: HTMLElement;\n\tprivate _searchInputElement: HTMLInputElement | null;\n\tprivate _options: NodeListOf<HTMLElement>;\n\n\t// Cached DOM references for performance\n\tprivate _optionsContainer: HTMLElement | null = null;\n\n\t// State\n\tprivate _dropdownIsOpen: boolean = false;\n\tprivate _state: KTSelectState;\n\tprivate _searchModule: KTSelectSearch;\n\tprivate _remoteModule: KTSelectRemote;\n\tprivate _comboboxModule: KTSelectCombobox | null = null;\n\tprivate _tagsModule: KTSelectTags | null = null;\n\tprivate _dropdownModule: KTSelectDropdown | null = null;\n\tprivate _loadMoreIndicator: HTMLElement | null = null;\n\tprivate _selectAllButton: HTMLElement | null = null;\n\tprivate _selectAllButtonToggle: HTMLButtonElement | null = null;\n\tprivate _focusManager: FocusManager;\n\tprivate _eventManager: EventManager;\n\tprivate _typeToSearchBuffer: TypeToSearchBuffer = new TypeToSearchBuffer();\n\tprivate _mutationObserver: MutationObserver | null = null;\n\tprivate _preSelectedValues: string[] = [];\n\n\t/**\n\t * Constructor: Initializes the select component\n\t */\n\tconstructor(element: HTMLElement, config?: KTSelectConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element, this._name)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._state = new KTSelectState(this._config);\n\t\tthis._config = this._state.getConfig();\n\n\t\t(element as any).instance = this;\n\n\t\t// Initialize event manager\n\t\tthis._eventManager = new EventManager();\n\n\t\t// Initialize remote module if remote data is enabled\n\t\tif (this._config.remote) {\n\t\t\tthis._remoteModule = new KTSelectRemote(this._config, this._element);\n\t\t\tthis._initializeRemoteData();\n\t\t} else {\n\t\t\tthis._state\n\t\t\t\t.setItems()\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis._setupComponent();\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Error setting items:', error);\n\t\t\t\t\t// Handle the error, e.g., display an error message to the user\n\t\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set global select configuration options.\n\t * This allows setting default configuration that will be applied to all new KTSelect instances.\n\t * @param options Partial select config to merge with global config.\n\t * @example\n\t * KTSelect.config({\n\t * enableSearch: true,\n\t * searchPlaceholder: 'Type to search...',\n\t * dropdownZindex: 9999,\n\t * height: 300\n\t * });\n\t */\n\tstatic config(options: Partial<KTSelectConfigInterface>): void {\n\t\tthis.globalConfig = { ...this.globalConfig, ...options };\n\t}\n\n\t/**\n\t * Override _buildConfig to include static globalConfig in the merge chain\n\t */\n\tprotected override _buildConfig(config: object = {}): void {\n\t\tif (!this._element) return;\n\n\t\t// Cast to writable to allow assignment (config is readonly but needs initialization)\n\t\t(this._config as any) = {\n\t\t\t...this._defaultConfig,\n\t\t\t...KTSelect.globalConfig,\n\t\t\t...this._getGlobalConfig(),\n\t\t\t...KTDom.getDataAttributes(\n\t\t\t\tthis._element,\n\t\t\t\tthis._dataOptionPrefix + this._name,\n\t\t\t),\n\t\t\t...config,\n\t\t} as KTSelectConfigInterface;\n\t}\n\n\t/**\n\t * Override _dispatchEvent to also dispatch on document for global listeners (jQuery compatibility)\n\t */\n\tprotected override _dispatchEvent(eventType: string, payload: object = null): void {\n\t\t// Call parent method to dispatch on element (existing behavior)\n\t\tsuper._dispatchEvent(eventType, payload);\n\n\t\t// Also dispatch on document if configured\n\t\tconst dispatchGlobalEvents =\n\t\t\tthis._config.dispatchGlobalEvents !== false; // Default to true\n\t\tif (dispatchGlobalEvents) {\n\t\t\t// Create namespaced event name for document dispatch\n\t\t\tconst namespacedEventType = `kt-select:${eventType}`;\n\n\t\t\t// Create event with same detail structure\n\t\t\tconst globalEvent = new CustomEvent(namespacedEventType, {\n\t\t\t\tdetail: {\n\t\t\t\t\tpayload,\n\t\t\t\t\tinstance: this, // Include component instance reference\n\t\t\t\t\telement: this._element, // Include element reference\n\t\t\t\t},\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tcomposed: true, // Allow event to cross shadow DOM boundaries\n\t\t\t});\n\n\t\t\t// Dispatch on document\n\t\t\tdocument.dispatchEvent(globalEvent);\n\t\t}\n\t}\n\n\t/**\n\t * Initialize remote data fetching\n\t */\n\tprivate _initializeRemoteData() {\n\t\tif (!this._remoteModule || !this._config.remote) return;\n\n\n\t\t// For remote data, we need to create the HTML structure first\n\t\t// so that the component can be properly initialized\n\t\tthis._createHtmlStructure();\n\t\tthis._setupElementReferences();\n\n\t\t// Show loading state\n\t\tthis._renderLoadingState();\n\n\t\t// Fetch remote data\n\t\tthis._remoteModule\n\t\t\t.fetchData()\n\t\t\t.then((items) => {\n\n\t\t\t\t// Remove placeholder/loading options before setting new items\n\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t// Update state with fetched items\n\t\t\t\tthis._state\n\t\t\t\t\t.setItems(items)\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t// Generate options from the fetched data\n\t\t\t\t\t\tthis._generateOptionsHtml(this._element);\n\n\n\t\t\t\t\t\t// Update the dropdown to show the new options\n\t\t\t\t\t\tthis._updateDropdownWithNewOptions();\n\n\t\t\t\t\t\t// Complete the component setup with the fetched data\n\t\t\t\t\t\tthis._completeRemoteSetup();\n\n\t\t\t\t\t\t// Add pagination \"Load More\" button if needed\n\t\t\t\t\t\tif (this._config.pagination && this._remoteModule.hasMorePages()) {\n\t\t\t\t\t\t\tthis._addLoadMoreButton();\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tconsole.error('Error setting items:', error);\n\t\t\t\t\t\tthis._renderErrorState(error.message || 'Failed to load data');\n\t\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error fetching remote data:', error);\n\t\t\t\tthis._renderErrorState(\n\t\t\t\t\tthis._remoteModule.getErrorMessage() || 'Failed to load data',\n\t\t\t\t);\n\t\t\t});\n\t}\n\n\t/**\n\t * Clear existing options from the select element\n\t */\n\tprivate _clearExistingOptions() {\n\t\t// Capture pre-selected values before clearing (for remote data)\n\t\tconst selectedOptions = Array.from(\n\t\t\tthis._element.querySelectorAll('option[selected]:not([value=\"\"])'),\n\t\t) as HTMLOptionElement[];\n\n\t\tif (selectedOptions.length > 0) {\n\t\t\tthis._preSelectedValues = selectedOptions.map((opt) => opt.value);\n\t\t}\n\n\t\t// Keep only the empty/placeholder option and remove the rest\n\t\tconst options = Array.from(\n\t\t\tthis._element.querySelectorAll('option:not([value=\"\"])'),\n\t\t);\n\t\toptions.forEach((option) => option.remove());\n\t}\n\n\t/**\n\t * Unified method to render options in dropdown - eliminates code duplication\n\t */\n\tprivate _renderOptionsInDropdown(\n\t\toptionsData: KTSelectOptionData[] | HTMLOptionElement[],\n\t\tclearContainer: boolean = true,\n\t): void {\n\t\tif (!this._dropdownContentElement) return;\n\n\t\t// Use cached options container for better performance\n\t\tconst optionsContainer =\n\t\t\tthis._optionsContainer ||\n\t\t\tthis._dropdownContentElement.querySelector('[data-kt-select-options]');\n\t\tif (!optionsContainer) return;\n\n\t\t// Clear container if requested\n\t\tif (clearContainer) {\n\t\t\toptionsContainer.innerHTML = '';\n\t\t}\n\n\t\t// Use DocumentFragment for efficient DOM manipulation\n\t\tconst fragment = document.createDocumentFragment();\n\n\t\t// Process options data\n\t\toptionsData.forEach((optionData) => {\n\t\t\tlet optionElement: HTMLOptionElement;\n\n\t\t\t// Handle different input types\n\t\t\tif (optionData instanceof HTMLOptionElement) {\n\t\t\t\t// Skip empty placeholder options\n\t\t\t\tif (optionData.value === '' && optionData.textContent.trim() === '') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\toptionElement = optionData;\n\t\t\t} else {\n\t\t\t\t// Handle KTSelectOptionData objects - cast to ensure type safety\n\t\t\t\tconst dataItem = optionData as KTSelectOptionData;\n\t\t\t\toptionElement = document.createElement('option');\n\t\t\t\toptionElement.value = dataItem.id || '';\n\t\t\t\toptionElement.textContent = dataItem.title || '';\n\n\t\t\t\tif (dataItem.selected) {\n\t\t\t\t\toptionElement.setAttribute('selected', 'selected');\n\t\t\t\t}\n\t\t\t\tif (dataItem.disabled) {\n\t\t\t\t\toptionElement.setAttribute('disabled', 'disabled');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create KTSelectOption instance for proper rendering\n\t\t\tconst selectOption = new KTSelectOption(optionElement, this._config);\n\t\t\tconst renderedOption = selectOption.render();\n\n\t\t\t// Add to fragment for batch DOM operation\n\t\t\tfragment.appendChild(renderedOption);\n\t\t});\n\n\t\t// Batch append all options at once\n\t\toptionsContainer.appendChild(fragment);\n\n\t\t// Update options NodeList\n\t\tthis._options = this._dropdownContentElement.querySelectorAll(\n\t\t\t'[data-kt-select-option]',\n\t\t) as NodeListOf<HTMLElement>;\n\n\t}\n\n\t/**\n\t * Update dropdown with new options from the original select element\n\t */\n\tprivate _updateDropdownWithNewOptions() {\n\t\t// Get all options from the original select element\n\t\tconst options = Array.from(this._element.querySelectorAll('option'));\n\n\t\t// Use unified renderer\n\t\tthis._renderOptionsInDropdown(options, true);\n\t}\n\n\t/**\n\t * Complete the setup for remote data after HTML structure is created\n\t */\n\tprivate _completeRemoteSetup() {\n\t\t// Initialize options\n\t\tthis._preSelectOptions(this._element);\n\n\t\t// Prevent browser auto-selection when placeholder is configured\n\t\tif (\n\t\t\tthis._config.placeholder &&\n\t\t\tthis._state.getSelectedOptions().length === 0 &&\n\t\t\tthis._preSelectedValues.length === 0\n\t\t) {\n\t\t\t(this._element as HTMLSelectElement).value = '';\n\t\t}\n\n\t\t// Apply pre-selected values captured before remote data was loaded\n\t\tif (this._preSelectedValues.length > 0) {\n\n\t\t\t// Get all available option values from the loaded remote data\n\t\t\tconst availableValues = Array.from(\n\t\t\t\tthis._element.querySelectorAll('option'),\n\t\t\t).map((opt) => (opt as HTMLOptionElement).value);\n\n\t\t\t// Filter pre-selected values to only those that exist in remote data\n\t\t\tconst validPreSelectedValues = this._preSelectedValues.filter((value) =>\n\t\t\t\tavailableValues.includes(value),\n\t\t\t);\n\n\t\t\tif (validPreSelectedValues.length > 0) {\n\t\t\t\t// For single-select mode, only use the first value\n\t\t\t\tconst valuesToSelect = this._config.multiple\n\t\t\t\t\t? validPreSelectedValues\n\t\t\t\t\t: [validPreSelectedValues[0]];\n\n\n\t\t\t\t// Get any existing selections from _preSelectOptions (e.g., data-kt-select-pre-selected)\n\t\t\t\tconst existingSelections = this._state.getSelectedOptions();\n\n\t\t\t\t// Merge existing selections with native pre-selected values (no duplicates)\n\t\t\t\tconst allSelections = this._config.multiple\n\t\t\t\t\t? Array.from(new Set([...existingSelections, ...valuesToSelect]))\n\t\t\t\t\t: valuesToSelect;\n\n\t\t\t\t// Set all selections at once to avoid toggling issues\n\t\t\t\tthis._state.setSelectedOptions(allSelections);\n\n\t\t\t\t// Update the native select element to match\n\t\t\t\tArray.from(this._element.querySelectorAll('option')).forEach((opt) => {\n\t\t\t\t\t(opt as HTMLOptionElement).selected = allSelections.includes(\n\t\t\t\t\t\topt.value,\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\t// Update the visual display\n\t\t\t\tthis.updateSelectedOptionDisplay();\n\t\t\t\tthis._updateSelectedOptionClass();\n\t\t\t}\n\n\t\t\t// Clear the pre-selected values array after processing\n\t\t\tthis._preSelectedValues = [];\n\t\t}\n\n\t\t// Apply disabled state if needed\n\t\tthis._applyInitialDisabledState();\n\n\t\t// Initialize search if enabled\n\t\tif (this._config.enableSearch) {\n\t\t\tthis._initializeSearchModule();\n\t\t}\n\n\t\t// Initialize combobox if enabled\n\t\tif (this._config.combobox) {\n\t\t\tthis._comboboxModule = new KTSelectCombobox(this);\n\t\t}\n\n\t\t// Initialize tags if enabled\n\t\tif (this._config.tags) {\n\t\t\tthis._tagsModule = new KTSelectTags(this);\n\t\t}\n\n\t\t// Initialize focus manager after dropdown element is created\n\t\tthis._focusManager = new FocusManager(\n\t\t\tthis._dropdownContentElement,\n\t\t\t'[data-kt-select-option]',\n\t\t\tthis._config,\n\t\t);\n\n\t\t// Initialize dropdown module after all elements are created\n\t\tthis._dropdownModule = new KTSelectDropdown(\n\t\t\tthis._wrapperElement,\n\t\t\tthis._displayElement,\n\t\t\tthis._dropdownContentElement,\n\t\t\tthis._config,\n\t\t\tthis, // Pass the KTSelect instance to KTSelectDropdown\n\t\t);\n\n\t\t// Update display and set ARIA attributes\n\t\tthis._updateDisplayAndAriaAttributes();\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._setAriaAttributes();\n\n\t\t// Update select all button state\n\t\tthis.updateSelectAllButtonState();\n\n\t\t// Focus the first selected option or first option if nothing selected\n\t\tthis._focusSelectedOption();\n\n\t\t// Attach event listeners after all modules are initialized\n\t\tthis._attachEventListeners();\n\n\t\tthis._observeNativeSelect();\n\t}\n\n\t/**\n\t * Helper to show a dropdown message (error, loading, noResults)\n\t */\n\tprivate _showDropdownMessage(\n\t\ttype: 'error' | 'loading' | 'empty',\n\t\tmessage?: string,\n\t) {\n\t\tif (!this._dropdownContentElement) return;\n\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t'[data-kt-select-options]',\n\t\t);\n\t\tif (!optionsContainer) return;\n\n\t\t// Clear previous messages\n\t\toptionsContainer.innerHTML = '';\n\n\t\tswitch (type) {\n\t\t\tcase 'error':\n\t\t\t\toptionsContainer.appendChild(\n\t\t\t\t\tdefaultTemplates.error({\n\t\t\t\t\t\t...this._config,\n\t\t\t\t\t\terrorMessage: message,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'loading':\n\t\t\t\toptionsContainer.appendChild(\n\t\t\t\t\tdefaultTemplates.loading(this._config, message || 'Loading...'),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'empty':\n\t\t\t\toptionsContainer.appendChild(\n\t\t\t\t\tdefaultTemplates.searchEmpty(this._config),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Render loading state in dropdown\n\t */\n\tprivate _renderLoadingState() {\n\t\tif (this._element.querySelectorAll('option').length <= 1) {\n\t\t\tconst existingLoadingOptions = this._element.querySelectorAll(\n\t\t\t\t'option[disabled][selected][value=\"\"]',\n\t\t\t);\n\t\t\texistingLoadingOptions.forEach((option) => option.remove());\n\t\t\tthis._showDropdownMessage('loading', 'Loading options...');\n\t\t}\n\t}\n\n\t/**\n\t * Render error state\n\t * @param message Error message\n\t */\n\tprivate _renderErrorState(message: string) {\n\t\t// If dropdown is already created, show error message there\n\t\tthis._showDropdownMessage('error', message);\n\n\t\tif (!this._wrapperElement) {\n\t\t\tthis._setupComponent();\n\t\t}\n\t}\n\n\t/**\n\t * Add \"Load More\" button for pagination\n\t */\n\tprivate _addLoadMoreButton() {\n\t\tif (!this._dropdownContentElement || !this._config.pagination) return;\n\n\t\t// Remove existing button if any\n\t\tif (this._loadMoreIndicator) {\n\t\t\tthis._loadMoreIndicator.remove();\n\t\t\tthis._loadMoreIndicator = null;\n\t\t}\n\n\t\t// Create load more button using template\n\t\tthis._loadMoreIndicator = defaultTemplates.loadMore(this._config);\n\n\t\t// Add to dropdown\n\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t'[data-kt-select-options]',\n\t\t);\n\t\tif (optionsContainer) {\n\t\t\toptionsContainer.appendChild(this._loadMoreIndicator);\n\t\t} else {\n\t\t\tthis._dropdownContentElement.appendChild(this._loadMoreIndicator);\n\t\t}\n\n\t\t// Add event listener\n\t\tthis._loadMoreIndicator.addEventListener(\n\t\t\t'click',\n\t\t\tthis._handleLoadMore.bind(this),\n\t\t);\n\t}\n\n\t/**\n\t * Handle load more button click\n\t */\n\tprivate _handleLoadMore() {\n\t\tif (!this._remoteModule || !this._config.pagination) return;\n\n\t\t// Show loading state\n\t\tif (this._loadMoreIndicator) {\n\t\t\tthis._loadMoreIndicator.textContent = 'Loading...';\n\t\t}\n\n\t\t// Fetch next page\n\t\tthis._remoteModule\n\t\t\t.loadNextPage()\n\t\t\t.then((newItems) => {\n\t\t\t\t// Get existing items\n\t\t\t\tconst existingItems = this._state.getItems();\n\n\t\t\t\t// Combine new items with existing items\n\t\t\t\tthis._state\n\t\t\t\t\t.setItems([...existingItems, ...newItems])\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t// Update options in the dropdown\n\t\t\t\t\t\tthis._updateOptionsInDropdown(newItems);\n\n\t\t\t\t\t\t// Check if there are more pages\n\t\t\t\t\t\tif (this._remoteModule.hasMorePages()) {\n\t\t\t\t\t\t\t// Reset load more button\n\t\t\t\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\t\t\t\tthis._loadMoreIndicator.textContent =\n\t\t\t\t\t\t\t\t\tthis._config.loadMoreText || 'Load more...';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Remove load more button if no more pages\n\t\t\t\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\t\t\t\tthis._loadMoreIndicator.remove();\n\t\t\t\t\t\t\t\tthis._loadMoreIndicator = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tconsole.error('Error updating items:', error);\n\n\t\t\t\t\t\t// Reset load more button\n\t\t\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\t\t\tthis._loadMoreIndicator.textContent = 'Error loading more items';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error loading more items:', error);\n\n\t\t\t\t// Reset load more button\n\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\tthis._loadMoreIndicator.textContent = 'Error loading more items';\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t/**\n\t * Update options in the dropdown\n\t * @param newItems New items to add to the dropdown\n\t */\n\tprivate _updateOptionsInDropdown(newItems: KTSelectOptionData[]) {\n\t\tif (!this._dropdownContentElement || !newItems.length) return;\n\n\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t`[data-kt-select-options]`,\n\t\t);\n\t\tif (!optionsContainer) return;\n\n\t\t// Get the load more button\n\t\tconst loadMoreButton = optionsContainer.querySelector(\n\t\t\t`[data-kt-select-load-more]`,\n\t\t);\n\n\t\t// Process each new item\n\t\tnewItems.forEach((item) => {\n\t\t\t// Create option for the original select\n\t\t\tconst selectOption = document.createElement('option');\n\t\t\tselectOption.value = item.id || '';\n\n\t\t\t// Add to dropdown container\n\t\t\tif (loadMoreButton) {\n\t\t\t\t// Insert before the load more button\n\t\t\t\toptionsContainer.insertBefore(selectOption, loadMoreButton);\n\t\t\t} else {\n\t\t\t\t// Append to the end\n\t\t\t\toptionsContainer.appendChild(selectOption);\n\t\t\t}\n\t\t});\n\n\t\t// Update options NodeList to include the new options\n\t\tthis._options = this._dropdownContentElement.querySelectorAll(\n\t\t\t`[data-kt-select-option]`,\n\t\t) as NodeListOf<HTMLElement>;\n\n\t}\n\n\t/**\n\t * ========================================================================\n\t * INITIALIZATION METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Set up the component after everything is initialized\n\t */\n\tprivate _setupComponent() {\n\t\t// Setup HTML structure\n\t\tthis._createHtmlStructure();\n\t\tthis._setupElementReferences();\n\n\t\t// Initialize options\n\t\tthis._preSelectOptions(this._element);\n\n\t\t// Prevent browser auto-selection when placeholder is configured\n\t\tif (\n\t\t\tthis._config.placeholder &&\n\t\t\tthis._state.getSelectedOptions().length === 0\n\t\t) {\n\t\t\t(this._element as HTMLSelectElement).value = '';\n\t\t}\n\n\t\t// Apply disabled state if needed\n\t\tthis._applyInitialDisabledState();\n\n\t\t// Initialize search if enabled\n\t\tif (this._config.enableSearch) {\n\t\t\tthis._initializeSearchModule();\n\t\t}\n\n\t\t// Initialize combobox if enabled\n\t\tif (this._config.combobox) {\n\t\t\tthis._comboboxModule = new KTSelectCombobox(this);\n\t\t}\n\n\t\t// Initialize tags if enabled\n\t\tif (this._config.tags) {\n\t\t\tthis._tagsModule = new KTSelectTags(this);\n\t\t}\n\n\t\t// Initialize focus manager after dropdown element is created\n\t\tthis._focusManager = new FocusManager(\n\t\t\tthis._dropdownContentElement,\n\t\t\t'[data-kt-select-option]',\n\t\t\tthis._config,\n\t\t);\n\n\t\t// Initialize dropdown module after all elements are created\n\t\tthis._dropdownModule = new KTSelectDropdown(\n\t\t\tthis._wrapperElement,\n\t\t\tthis._displayElement,\n\t\t\tthis._dropdownContentElement,\n\t\t\tthis._config,\n\t\t\tthis, // Pass the KTSelect instance to KTSelectDropdown\n\t\t);\n\n\t\t// Update display and set ARIA attributes\n\t\tthis._updateDisplayAndAriaAttributes();\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._setAriaAttributes();\n\n\t\t// Update select all button state\n\t\tthis.updateSelectAllButtonState();\n\n\t\t// Focus the first selected option or first option if nothing selected\n\t\tthis._focusSelectedOption();\n\n\t\t// Attach event listeners after all modules are initialized\n\t\tthis._attachEventListeners();\n\n\t\tthis._observeNativeSelect();\n\t}\n\n\t/**\n\t * Creates the HTML structure for the select component\n\t */\n\tprivate _createHtmlStructure() {\n\t\tconst options = Array.from(this._element.querySelectorAll('option'));\n\n\t\t// Create wrapper and display elements\n\t\tconst wrapperElement = defaultTemplates.wrapper(this._config);\n\n\t\tconst displayElement = defaultTemplates.display(this._config);\n\n\t\t// Add the display element to the wrapper\n\t\twrapperElement.appendChild(displayElement);\n\n\t\t// Move classes from original select to wrapper and display elements\n\t\tif (this._element.classList.length > 0) {\n\t\t\tconst originalClasses = Array.from(this._element.classList);\n\t\t\tconst displaySpecificClasses = [\n\t\t\t\t'kt-select',\n\t\t\t\t'kt-select-sm',\n\t\t\t\t'kt-select-lg',\n\t\t\t];\n\n\t\t\tconst classesForWrapper = originalClasses.filter(\n\t\t\t\t(className) => !displaySpecificClasses.includes(className),\n\t\t\t);\n\t\t\tif (classesForWrapper.length > 0) {\n\t\t\t\twrapperElement.classList.add(...classesForWrapper);\n\t\t\t}\n\n\t\t\t// Move display-specific classes to display element\n\t\t\tconst classesForDisplay = originalClasses.filter((className) =>\n\t\t\t\tdisplaySpecificClasses.includes(className),\n\t\t\t);\n\t\t\tif (classesForDisplay.length > 0) {\n\t\t\t\tdisplayElement.classList.add(...classesForDisplay);\n\t\t\t}\n\n\t\t\tthis._element.className = ''; // Clear classes from original select element\n\t\t}\n\n\t\t// Create an empty dropdown first (without options) using template\n\t\tconst dropdownElement = defaultTemplates.dropdown({\n\t\t\t...this._config,\n\t\t\tzindex: this._config.dropdownZindex,\n\t\t});\n\n\t\t// Add search input if needed\n\t\tif (this._config.enableSearch) {\n\t\t\tconst searchElement = defaultTemplates.search(this._config);\n\t\t\tdropdownElement.appendChild(searchElement);\n\t\t}\n\n\t\t// Add select all button if needed\n\t\tif (this._config.multiple && this._config.enableSelectAll) {\n\t\t\tconst selectAllElement = defaultTemplates.selectAll(this._config);\n\t\t\tdropdownElement.appendChild(selectAllElement);\n\t\t}\n\n\t\t// Create options container using template\n\t\tconst optionsContainer = defaultTemplates.options(this._config);\n\n\t\t// Add each option directly to the container (only if options exist)\n\t\toptions.forEach((optionElement) => {\n\t\t\t// Skip empty placeholder options (only if BOTH value AND text are empty)\n\t\t\t// This allows options with empty value but visible text to display in dropdown\n\t\t\tif (\n\t\t\t\toptionElement.value === '' &&\n\t\t\t\toptionElement.textContent.trim() === ''\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create new KTSelectOption instance for each option\n\t\t\tconst selectOption = new KTSelectOption(optionElement, this._config);\n\t\t\tconst renderedOption = selectOption.render();\n\n\t\t\t// Append directly to options container\n\t\t\toptionsContainer.appendChild(renderedOption);\n\t\t});\n\n\t\t// Add options container to dropdown\n\t\tdropdownElement.appendChild(optionsContainer);\n\n\t\t// Add dropdown to wrapper\n\t\twrapperElement.appendChild(dropdownElement);\n\n\t\t// Insert after the original element\n\t\tthis._element.after(wrapperElement);\n\t\tthis._element.classList.add('hidden');\n\t}\n\n\t/**\n\t * Setup all element references after DOM is created\n\t */\n\tprivate _setupElementReferences() {\n\t\tthis._wrapperElement = this._element.nextElementSibling as HTMLElement;\n\n\t\t// Safety check - ensure wrapper element exists\n\t\tif (!this._wrapperElement) {\n\t\t\tconsole.error(\n\t\t\t\t'KTSelect: Wrapper element not found. HTML structure may not be created properly.',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Get display element\n\t\tthis._displayElement = this._wrapperElement.querySelector(\n\t\t\t`[data-kt-select-display]`,\n\t\t) as HTMLElement;\n\n\t\t// Get dropdown content element - this is critical for dropdown functionality\n\t\tthis._dropdownContentElement = this._wrapperElement.querySelector(\n\t\t\t`[data-kt-select-dropdown]`,\n\t\t) as HTMLElement;\n\n\t\tif (!this._dropdownContentElement) {\n\t\t\tconsole.error(\n\t\t\t\t'KTSelect: Dropdown content element not found',\n\t\t\t\tthis._wrapperElement,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Get search input element - this is used for the search functionality\n\t\t// First try to find the actual input element (not the wrapper div)\n\t\tthis._searchInputElement = this._dropdownContentElement.querySelector(\n\t\t\t`input[data-kt-select-search]`,\n\t\t) as HTMLInputElement;\n\n\t\t// If not found, try the wrapper selector (for backward compatibility)\n\t\tif (!this._searchInputElement) {\n\t\t\tconst searchWrapper = this._dropdownContentElement.querySelector(\n\t\t\t\t`[data-kt-select-search]`,\n\t\t\t) as HTMLElement;\n\t\t\tif (searchWrapper) {\n\t\t\t\tthis._searchInputElement = searchWrapper.querySelector(\n\t\t\t\t\t'input',\n\t\t\t\t) as HTMLInputElement;\n\t\t\t}\n\t\t}\n\n\t\t// If still not found in dropdown, check if it's the display element itself (combobox mode)\n\t\tif (!this._searchInputElement) {\n\t\t\tthis._searchInputElement = this._displayElement.querySelector(\n\t\t\t\t'input[data-kt-select-search]',\n\t\t\t) as HTMLInputElement;\n\t\t}\n\n\t\tthis._selectAllButton = this._wrapperElement.querySelector(\n\t\t\t'[data-kt-select-select-all]',\n\t\t) as HTMLElement;\n\n\t\t// Cache the options container for performance\n\t\tthis._optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t'[data-kt-select-options]',\n\t\t) as HTMLElement;\n\n\t\tthis._options = this._dropdownContentElement.querySelectorAll(\n\t\t\t`[data-kt-select-option]`,\n\t\t) as NodeListOf<HTMLElement>;\n\t}\n\n\t/**\n\t * Attach all event listeners to elements\n\t */\n\tprivate _attachEventListeners() {\n\t\t// Document level event listeners\n\t\tdocument.addEventListener('click', this._handleDocumentClick.bind(this));\n\n\t\t// Dropdown option click events\n\t\tthis._eventManager.addListener(\n\t\t\tthis._dropdownContentElement,\n\t\t\t'click',\n\t\t\tthis._handleDropdownOptionClick.bind(this),\n\t\t);\n\n\t\tif (this._selectAllButton) {\n\t\t\tthis._selectAllButtonToggle =\n\t\t\t\tthis._selectAllButton.querySelector('button');\n\t\t\tif (this._selectAllButtonToggle) {\n\t\t\t\tthis._eventManager.addListener(\n\t\t\t\t\tthis._selectAllButtonToggle,\n\t\t\t\t\t'click',\n\t\t\t\t\tthis._handleSelectAllClick.bind(this),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Attach centralized keyboard handler to the wrapper element.\n\t\t// Events from focusable children like _displayElement or _searchInputElement (if present) will bubble up.\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.addEventListener(\n\t\t\t\t'keydown',\n\t\t\t\tthis._handleKeyboardEvent.bind(this),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Initialize search module if search is enabled\n\t */\n\tprivate _initializeSearchModule() {\n\t\tif (this._config.enableSearch) {\n\t\t\tthis._searchModule = new KTSelectSearch(this);\n\t\t\tthis._searchModule.init();\n\n\t\t\t// If remote search is enabled, add event listener for search input\n\t\t\tif (\n\t\t\t\tthis._config.remote &&\n\t\t\t\tthis._config.searchParam &&\n\t\t\t\tthis._searchInputElement\n\t\t\t) {\n\t\t\t\tthis._searchInputElement.addEventListener(\n\t\t\t\t\t'input',\n\t\t\t\t\tthis._handleRemoteSearch.bind(this),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Apply ARIA attributes and update display\n\t */\n\tprivate _updateDisplayAndAriaAttributes() {\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._setAriaAttributes();\n\t}\n\n\t/**\n\t * Apply initial disabled state if configured\n\t */\n\tprivate _applyInitialDisabledState() {\n\t\tif (this._config.disabled) {\n\t\t\tthis.getElement().classList.add('disabled');\n\t\t\tthis.getElement().setAttribute('disabled', 'disabled');\n\t\t\tthis._wrapperElement.classList.add('disabled');\n\t\t}\n\t}\n\n\t/**\n\t * Generate options HTML from data items\n\t */\n\tprivate _generateOptionsHtml(element: HTMLElement) {\n\t\tconst items = this._state.getItems() || [];\n\n\n\t\t// Only modify options if we have items to replace them with\n\t\tif (items && items.length > 0) {\n\t\t\t// Clear existing options except the first empty one\n\t\t\tconst options = element.querySelectorAll('option:not(:first-child)');\n\t\t\toptions.forEach((option) => option.remove());\n\n\t\t\t// Generate options from data\n\t\t\titems.forEach((item) => {\n\t\t\t\tconst optionElement = document.createElement('option');\n\n\t\t\t\t// Get value - use item.id directly if available, otherwise try dataValueField\n\t\t\t\tlet value = '';\n\t\t\t\tif (item.id !== undefined) {\n\t\t\t\t\tvalue = String(item.id);\n\t\t\t\t} else if (this._config.dataValueField) {\n\t\t\t\t\tconst extractedValue = this._getValueByKey(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tthis._config.dataValueField,\n\t\t\t\t\t);\n\t\t\t\t\tvalue = extractedValue !== null ? String(extractedValue) : '';\n\t\t\t\t}\n\n\t\t\t\t// Get label - use item.title directly if available, otherwise try dataFieldText\n\t\t\t\tlet label = '';\n\t\t\t\tif (item.title !== undefined) {\n\t\t\t\t\tlabel = String(item.title);\n\t\t\t\t} else if (this._config.dataFieldText) {\n\t\t\t\t\tconst extractedLabel = this._getValueByKey(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tthis._config.dataFieldText,\n\t\t\t\t\t);\n\t\t\t\t\tlabel =\n\t\t\t\t\t\textractedLabel !== null ? String(extractedLabel) : 'Unnamed option';\n\t\t\t\t}\n\n\n\t\t\t\t// Set option attributes\n\t\t\t\toptionElement.value = value;\n\t\t\t\toptionElement.textContent = label || 'Unnamed option';\n\n\t\t\t\tif (item.selected) {\n\t\t\t\t\toptionElement.setAttribute('selected', 'selected');\n\t\t\t\t}\n\n\t\t\t\telement.appendChild(optionElement);\n\t\t\t});\n\n\t\t}\n\t}\n\n\t/**\n\t * Extract nested property value from object using dot notation\n\t */\n\tprivate _getValueByKey(obj: any, key: string): any {\n\t\tif (!key || !obj) return null;\n\n\t\t// Use reduce to walk through the object by splitting the key on dots\n\t\tconst result = key\n\t\t\t.split('.')\n\t\t\t.reduce((o, k) => (o && o[k] !== undefined ? o[k] : null), obj);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Pre-select options that have the selected attribute\n\t */\n\tprivate _preSelectOptions(element: HTMLElement) {\n\t\t// Handle options with selected attribute\n\t\tArray.from(element.querySelectorAll('option[selected]')).forEach(\n\t\t\t(option) => {\n\t\t\t\tconst value = (option as HTMLOptionElement).value;\n\t\t\t\tthis._selectOption(value);\n\t\t\t},\n\t\t);\n\n\t\t// Handle data-kt-select-pre-selected attribute for React compatibility\n\t\tconst preSelectedValues = element.getAttribute(\n\t\t\t'data-kt-select-pre-selected',\n\t\t);\n\t\tif (preSelectedValues) {\n\t\t\tconst values = preSelectedValues.split(',').map((v) => v.trim());\n\t\t\tvalues.forEach((value) => {\n\t\t\t\tif (value) {\n\t\t\t\t\tthis._selectOption(value);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * DROPDOWN MANAGEMENT\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Open the dropdown\n\t */\n\tpublic openDropdown() {\n\t\tif (this._config.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._dropdownModule) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Don't open dropdown if the select is disabled\n\t\tif (this._config.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Global dropdown management: close other open dropdowns if configured\n\t\tconst closeOnOtherOpen =\n\t\t\tthis._config.closeOnOtherOpen !== false; // Default to true\n\t\tif (closeOnOtherOpen) {\n\t\t\t// Close all other open dropdowns\n\t\t\tconst otherSelectsToClose: KTSelect[] = [];\n\t\t\tKTSelect.openDropdowns.forEach((otherSelect) => {\n\t\t\t\tconst isOther = otherSelect !== this;\n\t\t\t\tconst isOpen = otherSelect._dropdownIsOpen;\n\t\t\t\tif (isOther && isOpen) {\n\t\t\t\t\totherSelectsToClose.push(otherSelect);\n\t\t\t\t}\n\t\t\t});\n\t\t\totherSelectsToClose.forEach((otherSelect) => {\n\t\t\t\totherSelect.closeDropdown();\n\t\t\t});\n\t\t}\n\n\n\t\t// Set our internal flag to match what we're doing\n\t\tthis._dropdownIsOpen = true;\n\n\t\t// Add to registry\n\t\tKTSelect.openDropdowns.add(this);\n\n\t\t// Open the dropdown via the module\n\t\tthis._dropdownModule.open();\n\n\t\t// Dispatch custom events\n\t\tthis._dispatchEvent('show');\n\t\tthis._fireEvent('show');\n\n\t\t// Dispatch dropdown.show event on wrapper for search module\n\t\tconst dropdownShowEvent = new CustomEvent('dropdown.show', {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t});\n\t\tthis._wrapperElement.dispatchEvent(dropdownShowEvent);\n\n\t\t// Update ARIA states\n\t\tthis._setAriaAttributes();\n\n\t\t// Update select all button state\n\t\tthis.updateSelectAllButtonState();\n\n\t\t// Focus the first selected option or first option if nothing selected\n\t\tthis._focusSelectedOption();\n\t}\n\n\t/**\n\t * Close the dropdown\n\t */\n\tpublic closeDropdown() {\n\t\t// Only check if dropdown module exists, not dropdownIsOpen flag\n\t\tif (!this._dropdownModule) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear search input if the dropdown is closing\n\t\tif (this._searchModule && this._searchInputElement) {\n\t\t\t// Clear search input if configured to do so\n\t\t\tif (this._config.clearSearchOnClose) {\n\t\t\t\tthis._searchInputElement.value = '';\n\t\t\t}\n\n\t\t\t// Clear search input when dropdown closes\n\t\t\tthis._searchModule.clearSearch();\n\t\t}\n\n\t\t// Set our internal flag to match what we're doing\n\t\tthis._dropdownIsOpen = false;\n\n\t\t// Remove from registry\n\t\tKTSelect.openDropdowns.delete(this);\n\n\t\t// Call the dropdown module's close method\n\t\tthis._dropdownModule.close();\n\n\t\t// Reset all focus states\n\t\tif (this._focusManager) {\n\t\t\tthis._focusManager.resetFocus();\n\t\t}\n\n\t\t// Dispatch custom events\n\t\tthis._dispatchEvent('close');\n\t\tthis._fireEvent('close');\n\n\t\t// Dispatch dropdown.close event on wrapper for search module\n\t\tconst dropdownCloseEvent = new CustomEvent('dropdown.close', {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t});\n\t\tthis._wrapperElement.dispatchEvent(dropdownCloseEvent);\n\n\t\t// Update ARIA states\n\t\tthis._setAriaAttributes();\n\t}\n\n\t/**\n\t * Update dropdown position\n\t */\n\tpublic updateDropdownPosition() {\n\t\tif (this._dropdownModule) {\n\t\t\tthis._dropdownModule.updatePosition();\n\t\t}\n\t}\n\n\t/**\n\t * Focus on the first selected option if any exists in the dropdown\n\t */\n\tprivate _focusSelectedOption() {\n\t\t// Get selected options\n\t\tconst selectedOptions = this.getSelectedOptions();\n\t\tif (selectedOptions.length === 0) return;\n\n\t\t// Iterate through selected options and focus the first one that is visible\n\t\tfor (const value of selectedOptions) {\n\t\t\tif (this._focusManager && this._focusManager.focusOptionByValue(value)) {\n\t\t\t\tbreak; // Stop after focusing the first found selected and visible option\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * SELECTION MANAGEMENT\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Select an option by value\n\t */\n\tprivate _selectOption(value: string) {\n\t\t// Prevent selection if the option is disabled (in dropdown or original select)\n\t\tif (this._isOptionDisabled(value)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get current selection state\n\t\tconst isSelected = this._state.isSelected(value);\n\n\t\t// Toggle selection in state\n\t\tif (this._config.multiple) {\n\t\t\t// Toggle in multiple mode\n\t\t\tthis._state.toggleSelectedOptions(value);\n\t\t} else {\n\t\t\t// Set as only selection in single mode\n\t\t\tthis._state.setSelectedOptions(value);\n\t\t}\n\n\t\t// Update the original select element's option selected state\n\t\tconst optionEl = Array.from(this._element.querySelectorAll('option')).find(\n\t\t\t(opt) => opt.value === value,\n\t\t) as HTMLOptionElement;\n\n\t\tif (optionEl) {\n\t\t\tif (this._config.multiple) {\n\t\t\t\t// Toggle the selection for multiple select\n\t\t\t\toptionEl.selected = !isSelected;\n\t\t\t} else {\n\t\t\t\t// Set as only selection for single select\n\t\t\t\tArray.from(this._element.querySelectorAll('option')).forEach((opt) => {\n\t\t\t\t\t(opt as HTMLOptionElement).selected = opt.value === value;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Update the visual display of selected options\n\t\tthis.updateSelectedOptionDisplay();\n\n\t\t// Update option classes without re-rendering the dropdown content\n\t\tthis._updateSelectedOptionClass();\n\n\t\t// Dispatch standard and custom change events\n\t\tthis._dispatchEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t\tthis._fireEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t}\n\n\t/**\n\t * Sync native select value attribute for FormData support\n\t */\n\tprivate _syncNativeSelectValue(): void {\n\t\tconst selectedOptions = this.getSelectedOptions();\n\n\t\tif (this._config.multiple) {\n\t\t\t// For multiple select, the selected options are marked via option.selected\n\t\t\t// The native select's value property will return the first selected option's value\n\t\t\t// FormData will include all selected values automatically\n\t\t} else {\n\t\t\t// For single select, set the value attribute explicitly\n\t\t\tconst selectedValue =\n\t\t\t\tselectedOptions.length > 0 ? selectedOptions[0] : '';\n\t\t\t(this._element as HTMLSelectElement).value = selectedValue;\n\t\t}\n\t}\n\n\t/**\n\t * Update selected option display value\n\t */\n\tpublic updateSelectedOptionDisplay() {\n\t\tconst selectedOptions = this.getSelectedOptions();\n\t\tconst tagsEnabled = this._config.tags && this._tagsModule;\n\t\tconst valueDisplayEl = this.getValueDisplayElement();\n\n\t\t// Sync native select value for FormData support\n\t\tthis._syncNativeSelectValue();\n\n\t\tif (tagsEnabled) {\n\t\t\t// Tags module will render tags if selectedOptions > 0, or clear them if selectedOptions === 0.\n\t\t\tthis._tagsModule.updateTagsDisplay(selectedOptions);\n\t\t}\n\n\t\t// Guard against valueDisplayEl being null due to template modifications\n\t\tif (!valueDisplayEl) {\n\t\t\tif (this._config.debug) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'KTSelect: Value display element is null. Cannot update display or placeholder. Check template for [data-kt-select-value].',\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn; // Nothing to display on if the element is missing\n\t\t}\n\n\t\tif (typeof this._config.renderSelected === 'function') {\n\t\t\tvalueDisplayEl.innerHTML = this._config.renderSelected(selectedOptions);\n\t\t} else {\n\t\t\tif (selectedOptions.length === 0) {\n\t\t\t\t// No options selected: display placeholder.\n\t\t\t\t// This runs if tags are off, OR if tags are on but no items are selected (tags module would have cleared tags).\n\t\t\t\tconst placeholderEl = defaultTemplates.placeholder(this._config);\n\t\t\t\tvalueDisplayEl.replaceChildren(placeholderEl);\n\t\t\t} else {\n\t\t\t\t// Options are selected.\n\t\t\t\tif (tagsEnabled) {\n\t\t\t\t\t// Tags are enabled AND options are selected: tags module has rendered them.\n\t\t\t\t\t// Completely clear all content to avoid redundancy with tags\n\t\t\t\t\t// Don't touch the innerHTML here as tags module manages it\n\t\t\t\t\t// Just ensure no text content is generated\n\t\t\t\t\treturn; // Exit early to prevent any text generation\n\t\t\t\t} else {\n\t\t\t\t\t// Tags are not enabled AND options are selected: render normal text display.\n\t\t\t\t\tlet content = '';\n\t\t\t\t\tif (this._config.displayTemplate) {\n\t\t\t\t\t\tcontent = this.renderDisplayTemplateForSelected(\n\t\t\t\t\t\t\tthis.getSelectedOptions(),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontent = this.getSelectedOptionsText();\n\t\t\t\t\t}\n\t\t\t\t\tvalueDisplayEl.innerHTML = content;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check if an option was originally disabled in the HTML\n\t */\n\tprivate _isOptionOriginallyDisabled(value: string): boolean {\n\t\tconst originalOption = Array.from(\n\t\t\tthis._element.querySelectorAll('option'),\n\t\t).find((opt) => opt.value === value) as HTMLOptionElement;\n\t\treturn originalOption ? originalOption.disabled : false;\n\t}\n\n\t/**\n\t * Update CSS classes for selected options\n\t */\n\tprivate _updateSelectedOptionClass(): void {\n\t\tconst allOptions = this._dropdownContentElement.querySelectorAll(\n\t\t\t`[data-kt-select-option]`,\n\t\t);\n\t\tconst selectedValues = this._state.getSelectedOptions();\n\t\tconst maxReached =\n\t\t\ttypeof this._config.maxSelections === 'number' &&\n\t\t\tselectedValues.length >= this._config.maxSelections;\n\n\n\t\tallOptions.forEach((option) => {\n\t\t\tconst optionValue = option.getAttribute('data-value');\n\t\t\tif (!optionValue) return;\n\n\t\t\tconst isSelected = selectedValues.includes(optionValue);\n\t\t\tconst isOriginallyDisabled =\n\t\t\t\tthis._isOptionOriginallyDisabled(optionValue);\n\n\t\t\tif (isSelected) {\n\t\t\t\toption.classList.add('selected');\n\t\t\t\toption.setAttribute('aria-selected', 'true');\n\t\t\t\t// Selected options should not be visually hidden or disabled by maxSelections logic\n\t\t\t\toption.classList.remove('hidden');\n\t\t\t\toption.classList.remove('disabled');\n\t\t\t\toption.removeAttribute('aria-disabled');\n\t\t\t} else {\n\t\t\t\toption.classList.remove('selected');\n\t\t\t\toption.setAttribute('aria-selected', 'false');\n\n\t\t\t\t// An option should be disabled if it was originally disabled OR if maxSelections is reached\n\t\t\t\tif (isOriginallyDisabled || maxReached) {\n\t\t\t\t\toption.classList.add('disabled');\n\t\t\t\t\toption.setAttribute('aria-disabled', 'true');\n\t\t\t\t} else {\n\t\t\t\t\toption.classList.remove('disabled');\n\t\t\t\t\toption.removeAttribute('aria-disabled');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Clear all selected options\n\t */\n\tpublic clearSelection() {\n\t\t// Clear the current selection\n\t\tthis._state.setSelectedOptions([]);\n\n\t\t// Clear all native select options\n\t\tArray.from(this._element.querySelectorAll('option')).forEach((opt) => {\n\t\t\t(opt as HTMLOptionElement).selected = false;\n\t\t});\n\n\t\t// Clear native select value\n\t\t(this._element as HTMLSelectElement).value = '';\n\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._updateSelectedOptionClass();\n\n\t\t// Update select all button state\n\t\tthis.updateSelectAllButtonState();\n\n\t\t// Dispatch change event\n\t\tthis._dispatchEvent('change');\n\t\tthis._fireEvent('change');\n\t}\n\n\t/**\n\t * Set selected options programmatically\n\t */\n\tpublic setSelectedOptions(options: HTMLOptionElement[]) {\n\t\tconst values = Array.from(options).map((option) => option.value);\n\t\tthis._state.setSelectedOptions(values);\n\t}\n\n\t/**\n\t * Select the currently focused option\n\t */\n\tpublic selectFocusedOption() {\n\t\tconst focusedOption = this._focusManager.getFocusedOption();\n\n\t\tif (focusedOption) {\n\t\t\tconst selectedValue = focusedOption.dataset.value;\n\n\t\t\t// Extract just the title text, not including description\n\t\t\tlet selectedText = '';\n\t\t\tconst titleElement = focusedOption.querySelector(\n\t\t\t\t'[data-kt-option-title]',\n\t\t\t);\n\t\t\tif (titleElement) {\n\t\t\t\t// If it has a structured content with title element\n\t\t\t\tselectedText = titleElement.textContent?.trim() || '';\n\t\t\t} else {\n\t\t\t\t// Fallback to the whole text content\n\t\t\t\tselectedText = focusedOption.textContent?.trim() || '';\n\t\t\t}\n\n\t\t\t// First trigger the selection to ensure state is updated properly\n\t\t\tif (selectedValue) {\n\t\t\t\tthis._selectOption(selectedValue);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * EVENT HANDLERS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Handle click within the dropdown\n\t */\n\tprivate _handleDropdownOptionClick(event: Event) {\n\t\tconst optionElement = (event.target as HTMLElement).closest(\n\t\t\t`[data-kt-select-option]`,\n\t\t);\n\n\t\t// If an option is clicked, handle the option click\n\t\tif (optionElement) {\n\t\t\tthis._handleOptionClick(event);\n\t\t}\n\t}\n\n\t/**\n\t * Handle clicking on an option in the dropdown\n\t */\n\tprivate _handleOptionClick(event: Event) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\t// Find the clicked option element\n\t\tconst clickedOption = (event.target as HTMLElement).closest(\n\t\t\t`[data-kt-select-option]`,\n\t\t) as HTMLElement;\n\n\t\tif (!clickedOption) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if the option is disabled\n\t\tif (clickedOption.getAttribute('aria-disabled') === 'true') {\n\t\t\treturn;\n\t\t}\n\n\t\t// Use dataset.value to get the option value\n\t\tconst optionValue = clickedOption.dataset.value;\n\t\tif (optionValue === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If in single-select mode and the clicked option is already selected, just close the dropdown.\n\t\tif (!this._config.multiple && this._state.isSelected(optionValue)) {\n\t\t\tthis.closeDropdown();\n\t\t\treturn;\n\t\t}\n\n\t\t// Use toggleSelection instead of _selectOption to prevent re-rendering\n\t\tthis.toggleSelection(optionValue);\n\t}\n\n\t/**\n\t * Handle document click for closing dropdown\n\t */\n\tprivate _handleDocumentClick(event: MouseEvent) {\n\t\tconst targetElement = event.target as HTMLElement;\n\t\t// Check if the click is outside the dropdown and the display element\n\t\tif (!this._wrapperElement.contains(targetElement)) {\n\t\t\tthis.closeDropdown();\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * ACCESSIBILITY METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Set ARIA attributes for accessibility\n\t */\n\tprivate _setAriaAttributes() {\n\t\tthis._displayElement.setAttribute(\n\t\t\t'aria-expanded',\n\t\t\tthis._dropdownIsOpen.toString(),\n\t\t);\n\t}\n\n\t/**\n\t * ========================================================================\n\t * PUBLIC API\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Get the search input element\n\t */\n\tpublic getSearchInput(): HTMLInputElement {\n\t\treturn this._searchInputElement;\n\t}\n\n\t/**\n\t * Get selected options\n\t */\n\tpublic getSelectedOptions() {\n\t\treturn this._state.getSelectedOptions();\n\t}\n\n\t/**\n\t * Get configuration\n\t */\n\tpublic getConfig(): KTSelectConfigInterface {\n\t\treturn this._config;\n\t}\n\n\t/**\n\t * Get option elements\n\t */\n\tpublic getOptionsElement(): NodeListOf<HTMLElement> {\n\t\treturn this._options;\n\t}\n\n\t/**\n\t * Get dropdown element\n\t */\n\tpublic getDropdownElement() {\n\t\treturn this._dropdownContentElement;\n\t}\n\n\t/**\n\t * Get value display element\n\t */\n\tpublic getValueDisplayElement() {\n\t\treturn this._displayElement;\n\t}\n\n\t/**\n\t * Get wrapper element\n\t */\n\tpublic getWrapperElement(): HTMLElement {\n\t\treturn this._wrapperElement;\n\t}\n\n\t/**\n\t * Show all options in the dropdown\n\t */\n\tpublic showAllOptions() {\n\t\t// Get all options in the dropdown\n\t\tconst options = Array.from(\n\t\t\tthis._dropdownContentElement.querySelectorAll(`[data-kt-select-option]`),\n\t\t);\n\n\t\t// Show all options by removing the hidden class and any inline styles\n\t\toptions.forEach((option) => {\n\t\t\t// Remove hidden class\n\t\t\toption.classList.remove('hidden');\n\n\t\t\t// Clean up any existing inline styles for backward compatibility\n\t\t\tif (option.hasAttribute('style')) {\n\t\t\t\tconst styleAttr = option.getAttribute('style');\n\n\t\t\t\tif (styleAttr.includes('display:')) {\n\t\t\t\t\t// If style only contains display property, remove the entire attribute\n\t\t\t\t\tif (\n\t\t\t\t\t\tstyleAttr.trim() === 'display: none;' ||\n\t\t\t\t\t\tstyleAttr.trim() === 'display: block;'\n\t\t\t\t\t) {\n\t\t\t\t\t\toption.removeAttribute('style');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Otherwise, remove just the display property\n\t\t\t\t\t\toption.setAttribute(\n\t\t\t\t\t\t\t'style',\n\t\t\t\t\t\t\tstyleAttr?.replace(/display:\\s*[^;]+;?/gi, '')?.trim(),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// If search input exists, clear it\n\t\tif (this._searchInputElement) {\n\t\t\tthis._searchInputElement.value = '';\n\t\t\t// If we have a search module, clear any search filtering\n\t\t\tif (this._searchModule) {\n\t\t\t\tthis._searchModule.clearSearch();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Toggle multi-select functionality\n\t */\n\tpublic enableMultiSelect() {\n\t\tthis._state.modifyConfig({ multiple: true });\n\t}\n\n\t/**\n\t * Disable multi-select functionality\n\t */\n\tpublic disableMultiSelect() {\n\t\tthis._state.modifyConfig({ multiple: false });\n\t}\n\n\t/**\n\t * Toggle the selection of an option\n\t */\n\tpublic toggleSelection(value: string): void {\n\t\t// Prevent selection if the option is disabled (in dropdown or original select)\n\t\tif (this._isOptionDisabled(value)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get current selection state\n\t\tconst isSelected = this._state.isSelected(value);\n\n\t\t// If already selected in single select mode, do nothing (can't deselect in single select)\n\t\tif (isSelected && !this._config.multiple) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ensure any search input is cleared when selection changes\n\t\tif (this._searchModule) {\n\t\t\tthis._searchModule.clearSearch();\n\t\t}\n\n\t\t// Toggle the selection in the state\n\t\tthis._state.toggleSelectedOptions(value);\n\n\t\t// Update the original select element's option selected state\n\t\tconst optionEl = Array.from(this._element.querySelectorAll('option')).find(\n\t\t\t(opt) => opt.value === value,\n\t\t) as HTMLOptionElement;\n\n\t\tif (optionEl) {\n\t\t\t// For multiple select, toggle the 'selected' attribute\n\t\t\tif (this._config.multiple) {\n\t\t\t\toptionEl.selected = !isSelected;\n\t\t\t} else {\n\t\t\t\t// For single select, deselect all other options and select this one\n\t\t\t\tArray.from(this._element.querySelectorAll('option')).forEach((opt) => {\n\t\t\t\t\t(opt as HTMLOptionElement).selected = opt.value === value;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Update the display element value\n\t\tthis.updateSelectedOptionDisplay();\n\n\t\t// Update option classes without re-rendering the dropdown content\n\t\tthis._updateSelectedOptionClass();\n\n\t\t// For single select mode, close the dropdown after selection unless closeOnEnter is false\n\t\t// For multiple select mode, keep the dropdown open to allow multiple selections\n\t\tif (!this._config.multiple) {\n\t\t\t// Check if we should close based on closeOnEnter config\n\t\t\t// closeOnEnter only applies to Enter key selections, but for backward compatibility,\n\t\t\t// we'll respect it for all selections when explicitly set to false\n\t\t\tconst shouldClose =\n\t\t\t\tthis._config.closeOnEnter !== false; // Default to true\n\t\t\tif (shouldClose) {\n\t\t\t\tthis.closeDropdown();\n\t\t\t} else {\n\t\t\t\tthis.updateSelectAllButtonState();\n\t\t\t}\n\t\t} else {\n\t\t\t// Don't close dropdown in multiple select mode to allow multiple selections\n\t\t\tthis.updateSelectAllButtonState();\n\t\t}\n\n\t\t// Dispatch custom change event with additional data\n\t\tthis._dispatchEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t\tthis._fireEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t}\n\n\t/**\n\t * Clean up all resources when the component is destroyed\n\t * This overrides the parent dispose method\n\t */\n\tpublic override dispose(): void {\n\t\t// Clean up event listeners\n\t\tthis._eventManager.removeAllListeners(null);\n\n\t\t// Dispose modules\n\t\tif (this._dropdownModule) {\n\t\t\tthis._dropdownModule.dispose();\n\t\t}\n\n\t\tif (this._comboboxModule) {\n\t\t\tif (typeof this._comboboxModule.destroy === 'function') {\n\t\t\t\tthis._comboboxModule.destroy();\n\t\t\t}\n\t\t}\n\n\t\tif (this._tagsModule) {\n\t\t\tif (typeof this._tagsModule.destroy === 'function') {\n\t\t\t\tthis._tagsModule.destroy();\n\t\t\t}\n\t\t}\n\n\t\tif (this._searchModule) {\n\t\t\tif (typeof this._searchModule.destroy === 'function') {\n\t\t\t\tthis._searchModule.destroy();\n\t\t\t}\n\t\t}\n\n\t\t// Remove DOM elements\n\t\tif (this._wrapperElement && this._wrapperElement.parentNode) {\n\t\t\tthis._wrapperElement.parentNode.removeChild(this._wrapperElement);\n\t\t}\n\n\t\t// Call parent dispose to clean up data\n\t\tsuper.dispose();\n\t}\n\n\t/**\n\t * ========================================================================\n\t * DYNAMIC CONTROL METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Programmatically enable the select component\n\t * @public\n\t */\n\tpublic enable(): void {\n\t\t// Update config state\n\t\tthis._config.disabled = false;\n\n\t\t// Remove disabled attribute from native select\n\t\tthis._element.removeAttribute('disabled');\n\t\tthis._element.classList.remove('disabled');\n\n\t\t// Remove disabled state from wrapper and display elements\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.classList.remove('disabled');\n\t\t}\n\n\t\tif (this._displayElement) {\n\t\t\tthis._displayElement.removeAttribute('aria-disabled');\n\t\t}\n\n\t\t// Dispatch enabled event\n\t\tthis._dispatchEvent('enabled');\n\t\tthis._fireEvent('enabled');\n\t}\n\n\t/**\n\t * Programmatically disable the select component\n\t * @public\n\t */\n\tpublic disable(): void {\n\t\t// Update config state\n\t\tthis._config.disabled = true;\n\n\t\t// Close dropdown if currently open\n\t\tif (this._dropdownIsOpen) {\n\t\t\tthis.closeDropdown();\n\t\t}\n\n\t\t// Add disabled attribute to native select\n\t\tthis._element.setAttribute('disabled', 'disabled');\n\t\tthis._element.classList.add('disabled');\n\n\t\t// Add disabled state to wrapper and display elements\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.classList.add('disabled');\n\t\t}\n\n\t\tif (this._displayElement) {\n\t\t\tthis._displayElement.setAttribute('aria-disabled', 'true');\n\t\t}\n\n\t\t// Dispatch disabled event\n\t\tthis._dispatchEvent('disabled');\n\t\tthis._fireEvent('disabled');\n\t}\n\n\t/**\n\t * Update the dropdown to sync with native select element changes\n\t * For remote selects, refetches data from the server and preserves selections\n\t * Optionally accepts new options to replace existing ones (static selects only)\n\t *\n\t * @param newOptions Optional array of new options [{value, text}, ...] (static selects only)\n\t * @public\n\t * @remarks\n\t * - For static selects: rebuilds dropdown from native select or new options\n\t * - For remote selects: fetches fresh data, preserves matching selections\n\t * - Selections are preserved if their values exist in new remote data\n\t * - Selections are cleared if their values don't exist in new data\n\t * @fires updated - After update completes successfully\n\t * @fires updateError - If remote data fetch fails\n\t */\n\tpublic update(newOptions?: Array<{ value: string; text: string }>): void {\n\t\t// For remote selects, refetch data\n\t\tif (this._config.remote && this._remoteModule) {\n\t\t\tthis._remoteModule\n\t\t\t\t.fetchData()\n\t\t\t\t.then((items) => {\n\t\t\t\t\t// Capture currently selected values before clearing\n\t\t\t\t\tconst currentlySelected = this._state.getSelectedOptions();\n\n\t\t\t\t\t// Clear existing options (also captures to _preSelectedValues)\n\t\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t\t// Get all available values from new remote data\n\t\t\t\t\tconst availableValues = items.map((item) => item.id);\n\n\t\t\t\t\t// Filter to only values that exist in new data\n\t\t\t\t\tconst validSelections = currentlySelected.filter((value) =>\n\t\t\t\t\t\tavailableValues.includes(value),\n\t\t\t\t\t);\n\n\n\t\t\t\t\t// Add new options from remote data and restore selection state\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\t\toption.value = item.id;\n\t\t\t\t\t\toption.textContent = item.title;\n\t\t\t\t\t\tif (item.disabled) option.disabled = true;\n\n\t\t\t\t\t\t// Restore selected attribute for preserved selections\n\t\t\t\t\t\tif (validSelections.includes(item.id)) {\n\t\t\t\t\t\t\toption.selected = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._element.appendChild(option);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Rebuild dropdown\n\t\t\t\t\tthis._rebuildOptionsFromNative();\n\n\t\t\t\t\t// Sync selection state from native select (now has selected attributes)\n\t\t\t\t\tthis._syncSelectionFromNative();\n\n\t\t\t\t\t// Dispatch updated event\n\t\t\t\t\tthis._dispatchEvent('updated');\n\t\t\t\t\tthis._fireEvent('updated');\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Error updating remote data:', error);\n\t\t\t\t\tthis._dispatchEvent('updateError');\n\t\t\t\t\tthis._fireEvent('updateError');\n\t\t\t\t});\n\t\t} else {\n\t\t\t// For static selects, handle new options\n\t\t\tif (newOptions) {\n\t\t\t\t// Clear existing options except placeholder\n\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t// Add new options to native select\n\t\t\t\tnewOptions.forEach((opt) => {\n\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\toption.value = opt.value;\n\t\t\t\t\toption.textContent = opt.text;\n\t\t\t\t\tthis._element.appendChild(option);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Rebuild dropdown from native select\n\t\t\tthis._rebuildOptionsFromNative();\n\n\t\t\t// Dispatch updated event\n\t\t\tthis._dispatchEvent('updated');\n\t\t\tthis._fireEvent('updated');\n\t\t}\n\t}\n\n\t/**\n\t * Reload remote data and rebuild the dropdown\n\t * Only works with remote data enabled\n\t * @returns Promise that resolves when reload completes\n\t * @public\n\t */\n\tpublic reload(): Promise<void> {\n\t\t// Guard clause: only works with remote data\n\t\tif (!this._config.remote || !this._remoteModule) {\n\t\t\tconsole.warn('reload() only works with remote data enabled');\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\t// Dispatch reload start event\n\t\tthis._dispatchEvent('reloadStart');\n\t\tthis._fireEvent('reloadStart');\n\n\t\t// Capture currently selected values before clearing\n\t\tconst currentlySelected = this._state.getSelectedOptions();\n\n\t\t// Fetch fresh remote data\n\t\treturn this._remoteModule\n\t\t\t.fetchData()\n\t\t\t.then((items) => {\n\t\t\t\t// Clear existing options (captures to _preSelectedValues)\n\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t// Update state with new items\n\t\t\t\treturn this._state.setItems(items).then(() => {\n\t\t\t\t\t// Generate new options HTML\n\t\t\t\t\tthis._generateOptionsHtml(this._element);\n\n\t\t\t\t\t// Preserve selections by marking matching options as selected\n\t\t\t\t\tconst availableValues = items.map((item) =>\n\t\t\t\t\t\titem.id !== undefined ? String(item.id) : '',\n\t\t\t\t\t);\n\t\t\t\t\tconst validSelections = currentlySelected.filter((value) =>\n\t\t\t\t\t\tavailableValues.includes(value),\n\t\t\t\t\t);\n\n\n\t\t\t\t\t// Mark preserved selections on new options\n\t\t\t\t\tvalidSelections.forEach((value) => {\n\t\t\t\t\t\tconst option = Array.from(\n\t\t\t\t\t\t\tthis._element.querySelectorAll('option'),\n\t\t\t\t\t\t).find((opt) => opt.value === value) as HTMLOptionElement;\n\t\t\t\t\t\tif (option) {\n\t\t\t\t\t\t\toption.selected = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Update the dropdown\n\t\t\t\t\tthis._updateDropdownWithNewOptions();\n\n\t\t\t\t\t// Sync selection state from native select (now has selected attributes)\n\t\t\t\t\tthis._syncSelectionFromNative();\n\n\t\t\t\t\t// Update visual display\n\t\t\t\t\tthis.updateSelectedOptionDisplay();\n\t\t\t\t\tthis._updateSelectedOptionClass();\n\n\t\t\t\t\t// Update select all button state if applicable\n\t\t\t\t\tif (this._config.multiple && this._config.enableSelectAll) {\n\t\t\t\t\t\tthis.updateSelectAllButtonState();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Dispatch reload complete event\n\t\t\t\t\tthis._dispatchEvent('reloadComplete');\n\t\t\t\t\tthis._fireEvent('reloadComplete');\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error reloading remote data:', error);\n\n\t\t\t\t// Dispatch reload error event with error details\n\t\t\t\tthis._dispatchEvent('reloadError', { error });\n\t\t\t\tthis._fireEvent('reloadError', { error });\n\n\t\t\t\t// Re-throw error so caller can handle it\n\t\t\t\tthrow error;\n\t\t\t});\n\t}\n\n\t/**\n\t * Refresh the visual display and state without rebuilding options\n\t * For remote selects, refetches data from the server and preserves selections\n\t * that exist in the newly fetched data\n\t *\n\t * @public\n\t * @remarks\n\t * - For static selects: syncs visual state with native select\n\t * - For remote selects: fetches fresh data, preserves matching selections\n\t * - Selections are preserved if their values exist in new remote data\n\t * - Selections are cleared if their values don't exist in new data\n\t * @fires refreshed - After refresh completes successfully\n\t * @fires refreshError - If remote data fetch fails\n\t */\n\tpublic refresh(): void {\n\t\t// For remote selects, refetch data\n\t\tif (this._config.remote && this._remoteModule) {\n\t\t\tthis._remoteModule\n\t\t\t\t.fetchData()\n\t\t\t\t.then((items) => {\n\t\t\t\t\t// Capture currently selected values before clearing\n\t\t\t\t\tconst currentlySelected = this._state.getSelectedOptions();\n\n\t\t\t\t\t// Clear existing options (also captures to _preSelectedValues)\n\t\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t\t// Get all available values from new remote data\n\t\t\t\t\tconst availableValues = items.map((item) => item.id);\n\n\t\t\t\t\t// Filter to only values that exist in new data\n\t\t\t\t\tconst validSelections = currentlySelected.filter((value) =>\n\t\t\t\t\t\tavailableValues.includes(value),\n\t\t\t\t\t);\n\n\n\t\t\t\t\t// Add new options and restore selection state\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\t\toption.value = item.id;\n\t\t\t\t\t\toption.textContent = item.title;\n\t\t\t\t\t\tif (item.disabled) option.disabled = true;\n\n\t\t\t\t\t\t// Restore selected attribute for preserved selections\n\t\t\t\t\t\tif (validSelections.includes(item.id)) {\n\t\t\t\t\t\t\toption.selected = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._element.appendChild(option);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Rebuild dropdown\n\t\t\t\t\tthis._rebuildOptionsFromNative();\n\n\t\t\t\t\t// Sync selection state from native select (now has selected attributes)\n\t\t\t\t\tthis._syncSelectionFromNative();\n\n\t\t\t\t\t// Reapply ARIA attributes\n\t\t\t\t\tthis._setAriaAttributes();\n\n\t\t\t\t\t// Dispatch refreshed event\n\t\t\t\t\tthis._dispatchEvent('refreshed');\n\t\t\t\t\tthis._fireEvent('refreshed');\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Error refreshing remote data:', error);\n\t\t\t\t\tthis._dispatchEvent('refreshError');\n\t\t\t\t\tthis._fireEvent('refreshError');\n\t\t\t\t});\n\t\t} else {\n\t\t\t// For static selects, just sync visual state\n\t\t\tthis._syncSelectionFromNative();\n\n\t\t\t// Reapply ARIA attributes\n\t\t\tthis._setAriaAttributes();\n\n\t\t\t// Dispatch refreshed event\n\t\t\tthis._dispatchEvent('refreshed');\n\t\t\tthis._fireEvent('refreshed');\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * STATIC METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Create instances of KTSelect for all matching elements\n\t */\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll<HTMLElement>('[data-kt-select]');\n\n\t\telements.forEach((element) => {\n\t\t\tif (\n\t\t\t\telement.hasAttribute('data-kt-select') &&\n\t\t\t\t!element.classList.contains('data-kt-select-initialized')\n\t\t\t) {\n\t\t\t\tnew KTSelect(element);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Initialize all KTSelect instances\n\t */\n\tpublic static init(): void {\n\t\tKTSelect.createInstances();\n\t}\n\n\t/**\n\t * Get an existing KTSelect instance from an element\n\t */\n\tpublic static getInstance(element: HTMLElement): KTSelect | null {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'select')) {\n\t\t\treturn KTData.get(element, 'select') as KTSelect;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-select')) {\n\t\t\treturn new KTSelect(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get an existing KTSelect instance or create a new one\n\t */\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTSelectConfigInterface,\n\t): KTSelect {\n\t\treturn this.getInstance(element) || new KTSelect(element, config);\n\t}\n\n\t/**\n\t * Handle remote search\n\t * @param event Input event\n\t */\n\tprivate _handleRemoteSearch(event: Event) {\n\t\tif (\n\t\t\t!this._remoteModule ||\n\t\t\t!this._config.remote ||\n\t\t\t!this._config.searchParam\n\t\t)\n\t\t\treturn;\n\n\t\tconst query = (event.target as HTMLInputElement).value;\n\n\t\t// Check if the query is long enough\n\t\tif (query.length < (this._config.searchMinLength || 0)) {\n\t\t\t// Restore original options if query is too short\n\t\t\tthis._restoreOriginalOptions();\n\t\t\treturn;\n\t\t}\n\n\t\t// Debounce the search\n\t\tif (this._searchDebounceTimeout) {\n\t\t\tclearTimeout(this._searchDebounceTimeout);\n\t\t}\n\n\t\tthis._searchDebounceTimeout = window.setTimeout(() => {\n\t\t\t// Show loading state\n\t\t\tthis._renderSearchLoadingState();\n\n\t\t\t// Fetch remote data with search query\n\t\t\tthis._remoteModule\n\t\t\t\t.fetchData(query)\n\t\t\t\t.then((items) => {\n\t\t\t\t\t// Update state with fetched items\n\t\t\t\t\tthis._state\n\t\t\t\t\t\t.setItems(items)\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t// Update options in the dropdown\n\t\t\t\t\t\t\tthis._updateSearchResults(items);\n\n\t\t\t\t\t\t\t// Refresh the search module to update focus and cache\n\t\t\t\t\t\t\tif (this._searchModule) {\n\t\t\t\t\t\t\t\tthis._searchModule.refreshAfterSearch();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.updateSelectAllButtonState();\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tconsole.error('Error updating search results:', error);\n\t\t\t\t\t\t\tthis._renderSearchErrorState(\n\t\t\t\t\t\t\t\terror.message || 'Failed to load search results',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Error fetching search results:', error);\n\t\t\t\t\tthis._renderSearchErrorState(\n\t\t\t\t\t\tthis._remoteModule.getErrorMessage() ||\n\t\t\t\t\t\t\t'Failed to load search results',\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}, this._config.searchDebounce || 300);\n\t}\n\n\t// Search debounce timeout\n\tprivate _searchDebounceTimeout: number | null = null;\n\n\t/**\n\t * Render loading state for search\n\t */\n\tprivate _renderSearchLoadingState() {\n\t\tif (!this._originalOptionsHtml && this._dropdownContentElement) {\n\t\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t\t'[data-kt-select-options]',\n\t\t\t);\n\t\t\tif (optionsContainer) {\n\t\t\t\tthis._originalOptionsHtml = optionsContainer.innerHTML;\n\t\t\t}\n\t\t}\n\t\tthis._showDropdownMessage('loading', 'Searching...');\n\t}\n\n\t// Store original options HTML for restoring after search\n\tprivate _originalOptionsHtml: string | null = null;\n\n\t/**\n\t * Render error state for search\n\t * @param message Error message\n\t */\n\tprivate _renderSearchErrorState(message: string) {\n\t\tthis._showDropdownMessage('error', message);\n\n\t\t// Restore original options after error with a delay\n\t\tsetTimeout(() => {\n\t\t\tthis._restoreOriginalOptions();\n\t\t}, 2000);\n\t}\n\n\t/**\n\t * Restore original options when search is cleared\n\t */\n\tprivate _restoreOriginalOptions() {\n\t\tif (!this._dropdownContentElement || !this._originalOptionsHtml) return;\n\n\t\t// Use cached options container for better performance\n\t\tconst optionsContainer =\n\t\t\tthis._optionsContainer ||\n\t\t\tthis._dropdownContentElement.querySelector('[data-kt-select-options]');\n\t\tif (!optionsContainer) return;\n\n\t\t// Restore original options\n\t\toptionsContainer.innerHTML = this._originalOptionsHtml;\n\n\t\t// Update options NodeList\n\t\tthis._options = this._dropdownContentElement.querySelectorAll(\n\t\t\t'[data-kt-select-option]',\n\t\t) as NodeListOf<HTMLElement>;\n\n\t\t// Refresh search module\n\t\tif (this._searchModule) {\n\t\t\tthis._searchModule.refreshAfterSearch();\n\t\t}\n\t\tthis.updateSelectAllButtonState();\n\n\t}\n\n\t/**\n\t * Update search results in the dropdown\n\t * @param items Search result items\n\t */\n\tprivate _updateSearchResults(items: KTSelectOptionData[]) {\n\t\tif (!this._dropdownContentElement) return;\n\n\t\t// Use cached options container for better performance\n\t\tconst optionsContainer =\n\t\t\tthis._optionsContainer ||\n\t\t\tthis._dropdownContentElement.querySelector('[data-kt-select-options]');\n\t\tif (!optionsContainer) return;\n\n\t\t// Handle empty results\n\t\tif (items.length === 0) {\n\t\t\toptionsContainer.innerHTML = '';\n\t\t\tconst noResultsElement = defaultTemplates.searchEmpty(this._config);\n\t\t\toptionsContainer.appendChild(noResultsElement);\n\t\t\treturn;\n\t\t}\n\n\t\t// First update the original select element with search results\n\t\tthis._updateOriginalSelectWithSearchResults(items);\n\n\t\t// Then update dropdown using the standard flow\n\t\tthis._updateDropdownWithNewOptions();\n\n\t\t// Add pagination \"Load More\" button if needed\n\t\tif (this._config.pagination && this._remoteModule.hasMorePages()) {\n\t\t\tthis._addLoadMoreButton();\n\t\t}\n\t}\n\n\t/**\n\t * Update original select element with search results\n\t * @param items Search result items\n\t */\n\tprivate _updateOriginalSelectWithSearchResults(items: KTSelectOptionData[]) {\n\t\t// Clear existing options except placeholder\n\t\tthis._clearExistingOptions();\n\n\t\t// Add search result items to original select element\n\t\titems.forEach((item) => {\n\t\t\tconst optionElement = document.createElement('option');\n\t\t\toptionElement.value = item.id || '';\n\t\t\toptionElement.textContent = item.title || '';\n\n\t\t\tif (item.selected) {\n\t\t\t\toptionElement.setAttribute('selected', 'selected');\n\t\t\t}\n\t\t\tif (item.disabled) {\n\t\t\t\toptionElement.setAttribute('disabled', 'disabled');\n\t\t\t}\n\n\t\t\tthis._element.appendChild(optionElement);\n\t\t});\n\n\t}\n\n\t/**\n\t * Check if dropdown is open\n\t */\n\tpublic isDropdownOpen(): boolean {\n\t\treturn this._dropdownIsOpen;\n\t}\n\n\tpublic getSelectedOptionsText(): string {\n\t\tconst selectedValues = this.getSelectedOptions();\n\t\tconst displaySeparator = this._config.displaySeparator || ', ';\n\t\tconst texts = selectedValues\n\t\t\t.map((value) => {\n\t\t\t\tconst option = Array.from(this._options).find(\n\t\t\t\t\t(opt) => opt.getAttribute('data-value') === value,\n\t\t\t\t);\n\t\t\t\treturn option?.getAttribute('data-text') || '';\n\t\t\t})\n\t\t\t.filter(Boolean);\n\t\treturn texts.join(displaySeparator);\n\t}\n\n\t/**\n\t * Check if an option is disabled (either in dropdown or original select)\n\t */\n\tprivate _isOptionDisabled(value: string): boolean {\n\t\tconst dropdownOption = Array.from(this._options).find(\n\t\t\t(opt) => opt.getAttribute('data-value') === value,\n\t\t);\n\t\tconst isDropdownDisabled =\n\t\t\tdropdownOption &&\n\t\t\t(dropdownOption.classList.contains('disabled') ||\n\t\t\t\tdropdownOption.getAttribute('aria-disabled') === 'true');\n\t\tconst selectOption = Array.from(\n\t\t\tthis._element.querySelectorAll('option'),\n\t\t).find((opt) => opt.value === value) as HTMLOptionElement;\n\t\tconst isNativeDisabled = selectOption && selectOption.disabled;\n\t\treturn Boolean(isDropdownDisabled || isNativeDisabled);\n\t}\n\n\t/**\n\t * Centralized keyboard event handler for all select modes\n\t */\n\tprivate _handleKeyboardEvent(event: KeyboardEvent) {\n\t\t// If the event target is the search input and the event was already handled (defaultPrevented),\n\t\t// then return early to avoid duplicate processing by this broader handler.\n\t\tif (event.target === this._searchInputElement && event.defaultPrevented) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isOpen = this._dropdownIsOpen;\n\t\tconst config = this._config;\n\t\tconst focusManager = this._focusManager;\n\t\tconst buffer = this._typeToSearchBuffer;\n\n\t\t// If the event target is the search input, let it handle most typing keys naturally.\n\t\tif (event.target === this._searchInputElement) {\n\t\t\t// Allow navigation keys like ArrowDown, ArrowUp, Escape, Enter (for search/selection) to be handled by the logic below.\n\t\t\t// For other keys (characters, space, backspace, delete), let the input field process them.\n\t\t\tif (\n\t\t\t\tevent.key !== 'ArrowDown' &&\n\t\t\t\tevent.key !== 'ArrowUp' &&\n\t\t\t\tevent.key !== 'Escape' &&\n\t\t\t\tevent.key !== 'Enter' &&\n\t\t\t\tevent.key !== 'Tab' &&\n\t\t\t\tevent.key !== 'Home' &&\n\t\t\t\tevent.key !== 'End' &&\n\t\t\t\tevent.key !== ' '\n\t\t\t) {\n\t\t\t\t// If it's a character key and we are NOT type-to-searching (because search has focus)\n\t\t\t\t// then let the input field handle it for its own value.\n\t\t\t\t// The search module's 'input' event will handle filtering based on the input's value.\n\t\t\t\tbuffer.clear(); // Clear type-to-search buffer when typing in search field\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// For Enter specifically in search input, we might want to select the focused option or submit search.\n\t\t\t// This is handled later in the switch.\n\t\t}\n\n\t\t// Ignore modifier keys (except for specific combinations if added later)\n\t\tif (event.altKey || event.ctrlKey || event.metaKey) return;\n\n\t\t// Type-to-search: only for single char keys, when search input does not have focus\n\t\tif (\n\t\t\tevent.key.length === 1 &&\n\t\t\t!event.repeat &&\n\t\t\t!event.key.match(/\\s/) &&\n\t\t\tdocument.activeElement !== this._searchInputElement\n\t\t) {\n\t\t\tbuffer.push(event.key);\n\t\t\tconst str = buffer.getBuffer();\n\t\t\tif (isOpen) {\n\t\t\t\tfocusManager.focusByString(str);\n\t\t\t} else {\n\t\t\t\t// If closed, type-to-search could potentially open and select.\n\t\t\t\t// For now, let's assume it only works when open or opens it first.\n\t\t\t\t// Or, we could find the matching option and set it directly without opening.\n\t\t\t}\n\t\t\treturn; // Type-to-search handles the event\n\t\t}\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (!isOpen) {\n\t\t\t\t\tthis.openDropdown();\n\t\t\t\t} else {\n\t\t\t\t\tfocusManager.focusNext();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (!isOpen) {\n\t\t\t\t\tthis.openDropdown();\n\t\t\t\t} else {\n\t\t\t\t\tfocusManager.focusPrevious();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (isOpen) focusManager.focusFirst();\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (isOpen) focusManager.focusLast();\n\t\t\t\tbreak;\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': // Space\n\t\t\t\tif (isOpen) {\n\t\t\t\t\tconst focusedOptionEl = this._focusManager.getFocusedOption();\n\t\t\t\t\tif (focusedOptionEl) {\n\t\t\t\t\t\tconst val = focusedOptionEl.dataset.value;\n\t\t\t\t\t\t// If single select, and the item is already selected, just close.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tval !== undefined &&\n\t\t\t\t\t\t\t!this._config.multiple &&\n\t\t\t\t\t\t\tthis._state.isSelected(val)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.closeDropdown();\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Proceed with selection if not handled above\n\t\t\t\t\tthis.selectFocusedOption();\n\n\t\t\t\t\t// Close dropdown only for single select mode (for new selections)\n\t\t\t\t\t// Keep dropdown open for multiple select mode to allow additional selections\n\t\t\t\t\tif (!this._config.multiple) {\n\t\t\t\t\t\t// This will also be true for the case handled above, but closeDropdown is idempotent.\n\t\t\t\t\t\t// However, the break above prevents this from being reached for that specific case.\n\t\t\t\t\t\tthis.closeDropdown();\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault(); // Prevent form submission or other default actions\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tthis.openDropdown();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Escape':\n\t\t\t\tif (isOpen) {\n\t\t\t\t\tthis.closeDropdown();\n\t\t\t\t\t(event.target as HTMLElement).blur();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Tab':\n\t\t\t\t// Let Tab propagate for normal focus movement\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpublic renderDisplayTemplateForSelected(selectedValues: string[]): string {\n\t\tconst optionsConfig = (this._config.optionsConfig as any) || {};\n\t\tconst displaySeparator = this._config.displaySeparator || ', ';\n\t\tconst contentArray = Array.from(\n\t\t\tnew Set(\n\t\t\t\tselectedValues\n\t\t\t\t\t.map((value) => {\n\t\t\t\t\t\tconst option = Array.from(this._options).find(\n\t\t\t\t\t\t\t(opt) => opt.getAttribute('data-value') === value,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!option) return '';\n\n\t\t\t\t\t\tlet displayTemplate = this._config.displayTemplate;\n\t\t\t\t\t\tconst text = option.getAttribute('data-text') || '';\n\n\t\t\t\t\t\t// Replace all {{varname}} in option.innerHTML with values from _config\n\t\t\t\t\t\tObject.entries(optionsConfig[value] || {}).forEach(([key, val]) => {\n\t\t\t\t\t\t\tif (['string', 'number', 'boolean'].includes(typeof val)) {\n\t\t\t\t\t\t\t\tdisplayTemplate = displayTemplate.replace(\n\t\t\t\t\t\t\t\t\tnew RegExp(`{{${key}}}`, 'g'),\n\t\t\t\t\t\t\t\t\tString(val),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn renderTemplateString(displayTemplate, {\n\t\t\t\t\t\t\tselectedCount: selectedValues.length || 0,\n\t\t\t\t\t\t\tselectedTexts: this.getSelectedOptionsText() || '',\n\t\t\t\t\t\t\ttext,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.filter(Boolean),\n\t\t\t),\n\t\t);\n\t\treturn contentArray.join(displaySeparator);\n\t}\n\n\tpublic getDisplayElement(): HTMLElement {\n\t\treturn this._displayElement;\n\t}\n\n\tprivate _observeNativeSelect() {\n\t\tif (this._mutationObserver) return; // Prevent double observers\n\t\tthis._mutationObserver = new MutationObserver((mutations) => {\n\t\t\tlet needsRebuild = false;\n\t\t\tlet needsSelectionSync = false;\n\n\t\t\tfor (const mutation of mutations) {\n\t\t\t\tif (mutation.type === 'childList') {\n\t\t\t\t\t// Option(s) added or removed\n\t\t\t\t\tneedsRebuild = true;\n\t\t\t\t} else if (\n\t\t\t\t\tmutation.type === 'attributes' &&\n\t\t\t\t\tmutation.target instanceof HTMLOptionElement\n\t\t\t\t) {\n\t\t\t\t\tif (mutation.attributeName === 'selected') {\n\t\t\t\t\t\tneedsSelectionSync = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (needsRebuild) {\n\t\t\t\t// Rebuild the custom dropdown options\n\t\t\t\tthis._rebuildOptionsFromNative();\n\t\t\t}\n\t\t\tif (needsSelectionSync) {\n\t\t\t\tthis._syncSelectionFromNative();\n\t\t\t}\n\t\t});\n\n\t\tthis._mutationObserver.observe(this._element, {\n\t\t\tchildList: true,\n\t\t\tattributes: true,\n\t\t\tsubtree: true,\n\t\t\tattributeFilter: ['selected'],\n\t\t});\n\t}\n\n\tprivate _rebuildOptionsFromNative() {\n\t\t// Remove and rebuild the custom dropdown options from the native select\n\t\tif (this._dropdownContentElement) {\n\t\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t\t'[data-kt-select-options]',\n\t\t\t);\n\t\t\tif (optionsContainer) {\n\t\t\t\toptionsContainer.innerHTML = '';\n\t\t\t\tconst options = Array.from(this._element.querySelectorAll('option'));\n\t\t\t\toptions.forEach((optionElement) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\toptionElement.value === '' &&\n\t\t\t\t\t\toptionElement.textContent.trim() === ''\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst selectOption = new KTSelectOption(optionElement, this._config);\n\t\t\t\t\tconst renderedOption = selectOption.render();\n\t\t\t\t\toptionsContainer.appendChild(renderedOption);\n\t\t\t\t});\n\t\t\t\t// Update internal references\n\t\t\t\tthis._options = this._dropdownContentElement.querySelectorAll(\n\t\t\t\t\t'[data-kt-select-option]',\n\t\t\t\t) as NodeListOf<HTMLElement>;\n\t\t\t}\n\t\t}\n\t\t// Sync selection after rebuilding\n\t\tthis._syncSelectionFromNative();\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._updateSelectedOptionClass();\n\t}\n\n\tprivate _syncSelectionFromNative() {\n\t\t// Sync internal state from the native select's selected options\n\t\tconst selected = Array.from(\n\t\t\tthis._element.querySelectorAll('option:checked'),\n\t\t).map((opt) => (opt as HTMLOptionElement).value);\n\t\tthis._state.setSelectedOptions(\n\t\t\tthis._config.multiple ? selected : selected[0] || '',\n\t\t);\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._updateSelectedOptionClass();\n\t\tthis.updateSelectAllButtonState();\n\t}\n\n\tprivate _handleSelectAllClick(event: Event): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tconst visibleOptions = this._focusManager\n\t\t\t.getVisibleOptions()\n\t\t\t.filter((opt) => opt.getAttribute('aria-disabled') !== 'true');\n\t\tif (visibleOptions.length === 0) return;\n\n\t\tconst visibleValues = visibleOptions.map(\n\t\t\t(opt) => opt.dataset.value as string,\n\t\t);\n\t\tconst selectedValues = new Set(this.getSelectedOptions());\n\t\tconst isAllSelected = visibleOptions.every((opt) =>\n\t\t\tselectedValues.has(opt.dataset.value as string),\n\t\t);\n\n\t\tif (isAllSelected) {\n\t\t\t// Deselect all visible\n\t\t\tvisibleValues.forEach((value) => selectedValues.delete(value));\n\t\t} else {\n\t\t\t// Select all visible\n\t\t\tvisibleValues.forEach((value) => selectedValues.add(value));\n\t\t}\n\n\t\tthis._state.setSelectedOptions(Array.from(selectedValues));\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._updateSelectedOptionClass();\n\t\tthis.updateSelectAllButtonState();\n\n\t\tthis._dispatchEvent('change');\n\t\tthis._fireEvent('change');\n\t}\n\n\tpublic updateSelectAllButtonState(): void {\n\t\tif (\n\t\t\t!this._config.multiple ||\n\t\t\t!this._config.enableSelectAll ||\n\t\t\t!this._selectAllButtonToggle\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst visibleOptions = this._focusManager\n\t\t\t.getVisibleOptions()\n\t\t\t.filter((opt) => opt.getAttribute('aria-disabled') !== 'true');\n\n\t\tif (visibleOptions.length === 0) {\n\t\t\tthis._selectAllButton.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\tthis._selectAllButton.style.display = '';\n\n\t\tconst selectedValues = new Set(this.getSelectedOptions());\n\t\tconst isAllSelected = visibleOptions.every((opt) =>\n\t\t\tselectedValues.has(opt.dataset.value as string),\n\t\t);\n\n\t\tthis._selectAllButtonToggle.textContent = isAllSelected\n\t\t\t? this._config.clearAllText\n\t\t\t: this._config.selectAllText;\n\t}\n\n\t/**\n\t * Destroy the component and clean up resources\n\t */\n\tpublic destroy(): void {\n\t\t// Remove from global dropdown registry\n\t\tKTSelect.openDropdowns.delete(this);\n\n\t\t// Close dropdown if open\n\t\tif (this._dropdownIsOpen) {\n\t\t\tthis.closeDropdown();\n\t\t}\n\n\t\t// Call parent dispose method\n\t\tsuper.dispose();\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTTooltip } from './tooltip';\nexport type { KTTooltipConfigInterface, KTTooltipInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTDom from './helpers/dom';\nimport KTUtils from './helpers/utils';\nimport KTEventHandler from './helpers/event-handler';\nimport { KTDropdown } from './components/dropdown';\nimport { KTModal } from './components/modal';\nimport { KTDrawer } from './components/drawer';\nimport { KTCollapse } from './components/collapse';\nimport { KTDismiss } from './components/dismiss';\nimport { KTTabs } from './components/tabs';\nimport { KTAccordion } from './components/accordion';\nimport { KTScrollspy } from './components/scrollspy';\nimport { KTScrollable } from './components/scrollable';\nimport { KTScrollto } from './components/scrollto';\nimport { KTSticky } from './components/sticky';\nimport { KTReparent } from './components/reparent';\nimport { KTToggle } from './components/toggle';\nimport { KTTooltip } from './components/tooltip';\nimport { KTStepper } from './components/stepper';\nimport { KTThemeSwitch } from './components/theme-switch';\nimport { KTImageInput } from './components/image-input';\nimport { KTTogglePassword } from './components/toggle-password';\nimport { KTDataTable } from './components/datatable';\nimport { KTSelect } from './components/select';\nimport { KTToast } from './components/toast';\n\nexport { KTDropdown } from './components/dropdown';\nexport { KTModal } from './components/modal';\nexport { KTDrawer } from './components/drawer';\nexport { KTCollapse } from './components/collapse';\nexport { KTDismiss } from './components/dismiss';\nexport { KTTabs } from './components/tabs';\nexport { KTAccordion } from './components/accordion';\nexport { KTScrollspy } from './components/scrollspy';\nexport { KTScrollable } from './components/scrollable';\nexport { KTScrollto } from './components/scrollto';\nexport { KTSticky } from './components/sticky';\nexport { KTReparent } from './components/reparent';\nexport { KTToggle } from './components/toggle';\nexport { KTTooltip } from './components/tooltip';\nexport { KTStepper } from './components/stepper';\nexport { KTThemeSwitch } from './components/theme-switch';\nexport { KTImageInput } from './components/image-input';\nexport { KTTogglePassword } from './components/toggle-password';\nexport { KTDataTable } from './components/datatable';\nexport { KTSelect } from './components/select';\nexport { KTToast } from './components/toast';\n\nconst KTComponents = {\n\tinit(): void {\n\t\tKTDropdown.init();\n\t\tKTModal.init();\n\t\tKTDrawer.init();\n\t\tKTCollapse.init();\n\t\tKTDismiss.init();\n\t\tKTTabs.init();\n\t\tKTAccordion.init();\n\t\tKTScrollspy.init();\n\t\tKTScrollable.init();\n\t\tKTScrollto.init();\n\t\tKTSticky.init();\n\t\tKTReparent.init();\n\t\tKTToggle.init();\n\t\tKTTooltip.init();\n\t\tKTStepper.init();\n\t\tKTThemeSwitch.init();\n\t\tKTImageInput.init();\n\t\tKTTogglePassword.init();\n\t\tKTDataTable.init();\n\t\tKTSelect.init();\n\t\tKTToast.init();\n\t},\n};\n\ndeclare global {\n\tinterface Window {\n\t\tKTUtils: typeof KTUtils;\n\t\tKTDom: typeof KTDom;\n\t\tKTEventHandler: typeof KTEventHandler;\n\t\tKTDropdown: typeof KTDropdown;\n\t\tKTModal: typeof KTModal;\n\t\tKTDrawer: typeof KTDrawer;\n\t\tKTCollapse: typeof KTCollapse;\n\t\tKTDismiss: typeof KTDismiss;\n\t\tKTTabs: typeof KTTabs;\n\t\tKTAccordion: typeof KTAccordion;\n\t\tKTScrollspy: typeof KTScrollspy;\n\t\tKTScrollable: typeof KTScrollable;\n\t\tKTScrollto: typeof KTScrollto;\n\t\tKTSticky: typeof KTSticky;\n\t\tKTReparent: typeof KTReparent;\n\t\tKTToggle: typeof KTToggle;\n\t\tKTTooltip: typeof KTTooltip;\n\t\tKTStepper: typeof KTStepper;\n\t\tKTThemeSwitch: typeof KTThemeSwitch;\n\t\tKTImageInput: typeof KTImageInput;\n\t\tKTTogglePassword: typeof KTTogglePassword;\n\t\tKTDataTable: typeof KTDataTable;\n\t\tKTSelect: typeof KTSelect;\n\t\tKTToast: typeof KTToast;\n\t\tKTComponents: typeof KTComponents;\n\t}\n}\n\nexport default KTComponents;\n\nKTDom.ready(() => {\n\tKTComponents.init();\n});\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTCollapse } from './collapse';\nexport type { KTCollapseConfigInterface, KTCollapseInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport {\n\tInstance as PopperInstance,\n\tcreatePopper,\n\tPlacement,\n\tVirtualElement,\n} from '@popperjs/core';\nimport KTDom from '../../helpers/dom';\nimport KTData from '../../helpers/data';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTDropdownConfigInterface, KTDropdownInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_DROPDOWN_INITIALIZED: boolean;\n\t\tKTDropdown: typeof KTDropdown;\n\t}\n}\n\nexport class KTDropdown extends KTComponent implements KTDropdownInterface {\n\tprotected override _name: string = 'dropdown';\n\tprotected override _defaultConfig: KTDropdownConfigInterface = {\n\t\tzindex: 105,\n\t\thoverTimeout: 200,\n\t\tplacement: 'bottom-start',\n\t\tplacementRtl: 'bottom-end',\n\t\tpermanent: false,\n\t\tdismiss: false,\n\t\tkeyboard: true,\n\t\ttrigger: 'click',\n\t\tattach: '',\n\t\toffset: '0px, 5px',\n\t\toffsetRtl: '0px, 5px',\n\t\thiddenClass: 'hidden',\n\t\tcontainer: '',\n\t};\n\tprotected override _config: KTDropdownConfigInterface = this._defaultConfig;\n\tprotected _disabled: boolean = false;\n\tprotected _toggleElement: HTMLElement;\n\tprotected _menuElement: HTMLElement;\n\tprotected _isTransitioning: boolean = false;\n\tprotected _isOpen: boolean = false;\n\n\tconstructor(element: HTMLElement, config?: KTDropdownConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._toggleElement = this._element.querySelector(\n\t\t\t'[data-kt-dropdown-toggle]',\n\t\t) as HTMLElement;\n\t\tif (!this._toggleElement) return;\n\t\tthis._menuElement = this._element.querySelector(\n\t\t\t'[data-kt-dropdown-menu]',\n\t\t) as HTMLElement;\n\t\tif (!this._menuElement) return;\n\n\t\tKTData.set(this._menuElement, 'dropdownElement', this._element);\n\t\tthis._setupNestedDropdowns();\n\t\tthis._handleContainer();\n\t}\n\n\tprotected _handleContainer(): void {\n\t\tif (this._getOption('container')) {\n\t\t\tif (this._getOption('container') === 'body') {\n\t\t\t\tdocument.body.appendChild(this._menuElement);\n\t\t\t} else {\n\t\t\t\tdocument\n\t\t\t\t\t.querySelector(this._getOption('container') as string)\n\t\t\t\t\t?.appendChild(this._menuElement);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _setupNestedDropdowns(): void {\n\t\tconst subDropdowns = this._menuElement.querySelectorAll(\n\t\t\t'[data-kt-dropdown-toggle]',\n\t\t);\n\t\tsubDropdowns.forEach((subToggle) => {\n\t\t\tconst subItem = subToggle.closest(\n\t\t\t\t'[data-kt-dropdown-item]',\n\t\t\t) as HTMLElement;\n\t\t\tconst subMenu = subToggle\n\t\t\t\t.closest('.kt-menu-item')\n\t\t\t\t?.querySelector('[data-kt-dropdown-menu]');\n\t\t\tif (subItem && subMenu) {\n\t\t\t\tnew KTDropdown(subItem);\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _click(event: Event): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif (this._disabled) return;\n\n\t\tif (this._getOption('trigger') !== 'click') return;\n\n\t\tthis._toggle();\n\t}\n\n\tprotected _mouseover(event: MouseEvent): void {\n\t\tif (this._disabled) return;\n\n\t\tif (this._getOption('trigger') !== 'hover') return;\n\n\t\tif (KTData.get(this._element, 'hover') === '1') {\n\t\t\tclearTimeout(KTData.get(this._element, 'timeout') as number);\n\t\t\tKTData.remove(this._element, 'hover');\n\t\t\tKTData.remove(this._element, 'timeout');\n\t\t}\n\n\t\tthis._show();\n\t}\n\n\tprotected _mouseout(event: MouseEvent): void {\n\t\tif (this._disabled) return;\n\n\t\tif (this._getOption('trigger') !== 'hover') return;\n\n\t\tconst relatedTarget = event.relatedTarget as HTMLElement;\n\t\tconst isWithinDropdown = this._element.contains(relatedTarget);\n\n\t\tif (isWithinDropdown) return;\n\n\t\tconst timeout = setTimeout(\n\t\t\t() => {\n\t\t\t\tif (KTData.get(this._element, 'hover') === '1') {\n\t\t\t\t\tthis._hide();\n\t\t\t\t}\n\t\t\t},\n\t\t\tparseInt(this._getOption('hoverTimeout') as string),\n\t\t);\n\n\t\tKTData.set(this._element, 'hover', '1');\n\t\tKTData.set(this._element, 'timeout', timeout);\n\t}\n\n\tprotected _toggle(): void {\n\t\tif (this._isOpen) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show();\n\t\t}\n\t}\n\n\tprotected _show(): void {\n\t\tif (this._isOpen || this._isTransitioning) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel) return;\n\n\t\tKTDropdown.hide(this._element);\n\n\t\tlet zIndex: number = parseInt(this._getOption('zindex') as string);\n\t\tconst parentZindex: number = KTDom.getHighestZindex(this._element);\n\n\t\tif (parentZindex !== null && parentZindex >= zIndex) {\n\t\t\tzIndex = parentZindex + 1;\n\t\t}\n\t\tif (zIndex > 0) {\n\t\t\tthis._menuElement.style.zIndex = zIndex.toString();\n\t\t}\n\n\t\tthis._menuElement.style.display = 'block';\n\t\tthis._menuElement.style.opacity = '0';\n\t\tKTDom.reflow(this._menuElement);\n\t\tthis._menuElement.style.opacity = '1';\n\n\t\tthis._menuElement.classList.remove(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._toggleElement.classList.add('active');\n\t\tthis._menuElement.classList.add('open');\n\t\tthis._element.classList.add('open');\n\n\t\tthis._initPopper();\n\n\t\tKTDom.transitionEnd(this._menuElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(): void {\n\t\tif (!this._isOpen || this._isTransitioning) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel) return;\n\n\t\tthis._menuElement.style.opacity = '1';\n\t\tKTDom.reflow(this._menuElement);\n\t\tthis._menuElement.style.opacity = '0';\n\t\tthis._menuElement.classList.remove('open');\n\t\tthis._toggleElement.classList.remove('active');\n\t\tthis._element.classList.remove('open');\n\n\t\tKTDom.transitionEnd(this._menuElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\n\t\t\tthis._menuElement.classList.add(this._getOption('hiddenClass') as string);\n\t\t\tthis._menuElement.style.display = '';\n\t\t\tthis._menuElement.style.zIndex = '';\n\n\t\t\tthis._destroyPopper();\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _initPopper(): void {\n\t\tconst isRtl = KTDom.isRTL();\n\t\tlet reference: HTMLElement;\n\t\tconst attach = this._getOption('attach') as string;\n\n\t\tif (attach) {\n\t\t\treference =\n\t\t\t\tattach === 'parent'\n\t\t\t\t\t? (this._toggleElement.parentNode as HTMLElement)\n\t\t\t\t\t: (document.querySelector(attach) as HTMLElement);\n\t\t} else {\n\t\t\treference = this._toggleElement;\n\t\t}\n\n\t\tif (reference) {\n\t\t\tconst popper = createPopper(\n\t\t\t\treference as Element | VirtualElement,\n\t\t\t\tthis._menuElement,\n\t\t\t\tthis._getPopperConfig(),\n\t\t\t);\n\t\t\tKTData.set(this._element, 'popper', popper);\n\t\t}\n\t}\n\n\tprotected _destroyPopper(): void {\n\t\tif (KTData.has(this._element, 'popper')) {\n\t\t\t(KTData.get(this._element, 'popper') as PopperInstance).destroy();\n\t\t\tKTData.remove(this._element, 'popper');\n\t\t}\n\t}\n\n\tprotected _isDropdownOpen(): boolean {\n\t\treturn (\n\t\t\tthis._element.classList.contains('open') &&\n\t\t\tthis._menuElement.classList.contains('open')\n\t\t);\n\t}\n\n\tprotected _getPopperConfig(): object {\n\t\tconst isRtl = KTDom.isRTL();\n\t\tlet placement = this._getOption('placement') as Placement;\n\t\tif (isRtl && this._getOption('placementRtl')) {\n\t\t\tplacement = this._getOption('placementRtl') as Placement;\n\t\t}\n\n\t\tlet offsetValue = this._getOption('offset');\n\t\tif (isRtl && this._getOption('offsetRtl')) {\n\t\t\toffsetValue = this._getOption('offsetRtl') as Placement;\n\t\t}\n\t\tconst offset = offsetValue\n\t\t\t? offsetValue\n\t\t\t\t\t.toString()\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.map((value) => parseInt(value.trim(), 10))\n\t\t\t: [0, 0];\n\n\t\tconst strategy =\n\t\t\tthis._getOption('overflow') === true ? 'absolute' : 'fixed';\n\t\tconst altAxis = this._getOption('flip') !== false;\n\t\treturn {\n\t\t\tplacement: placement,\n\t\t\tstrategy: strategy,\n\t\t\tmodifiers: [\n\t\t\t\t{\n\t\t\t\t\tname: 'offset',\n\t\t\t\t\toptions: { offset: offset },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'preventOverflow',\n\t\t\t\t\toptions: { altAxis: altAxis },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'flip',\n\t\t\t\t\toptions: { flipVariations: false },\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\n\tprotected _getToggleElement(): HTMLElement {\n\t\treturn this._toggleElement;\n\t}\n\n\tprotected _getContentElement(): HTMLElement {\n\t\treturn this._menuElement;\n\t}\n\n\t// General Methods\n\tpublic click(event: Event): void {\n\t\tthis._click(event);\n\t}\n\n\tpublic mouseover(event: MouseEvent): void {\n\t\tthis._mouseover(event);\n\t}\n\n\tpublic mouseout(event: MouseEvent): void {\n\t\tthis._mouseout(event);\n\t}\n\n\tpublic show(): void {\n\t\tthis._show();\n\t}\n\n\tpublic hide(): void {\n\t\tthis._hide();\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic getToggleElement(): HTMLElement {\n\t\treturn this._toggleElement;\n\t}\n\n\tpublic getContentElement(): HTMLElement {\n\t\treturn this._menuElement;\n\t}\n\n\tpublic isPermanent(): boolean {\n\t\treturn this._getOption('permanent') as boolean;\n\t}\n\n\tpublic disable(): void {\n\t\tthis._disabled = true;\n\t}\n\n\tpublic enable(): void {\n\t\tthis._disabled = false;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isDropdownOpen();\n\t}\n\n\t// Static Methods\n\tpublic static getElement(reference: HTMLElement): HTMLElement {\n\t\tif (reference && reference.hasAttribute('data-kt-dropdown-initialized'))\n\t\t\treturn reference;\n\n\t\tconst findElement =\n\t\t\treference &&\n\t\t\t(reference.closest('[data-kt-dropdown-initialized]') as HTMLElement);\n\t\tif (findElement) return findElement;\n\n\t\tif (\n\t\t\treference &&\n\t\t\treference.hasAttribute('data-kt-dropdown-menu') &&\n\t\t\tKTData.has(reference, 'dropdownElement')\n\t\t) {\n\t\t\treturn KTData.get(reference, 'dropdownElement') as HTMLElement;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTDropdown {\n\t\telement = this.getElement(element);\n\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'dropdown')) {\n\t\t\treturn KTData.get(element, 'dropdown') as KTDropdown;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-dropdown-initialized') === 'true') {\n\t\t\treturn new KTDropdown(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTDropdownConfigInterface,\n\t): KTDropdown {\n\t\treturn this.getInstance(element) || new KTDropdown(element, config);\n\t}\n\n\tpublic static update(): void {\n\t\tdocument\n\t\t\t.querySelectorAll('.open[data-kt-dropdown-initialized]')\n\t\t\t.forEach((item) => {\n\t\t\t\tif (KTData.has(item as HTMLElement, 'popper')) {\n\t\t\t\t\t(\n\t\t\t\t\t\tKTData.get(item as HTMLElement, 'popper') as PopperInstance\n\t\t\t\t\t).forceUpdate();\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tpublic static hide(skipElement?: HTMLElement): void {\n\t\tdocument\n\t\t\t.querySelectorAll(\n\t\t\t\t'.open[data-kt-dropdown-initialized]:not([data-kt-dropdown-permanent=\"true\"])',\n\t\t\t)\n\t\t\t.forEach((item) => {\n\t\t\t\tif (skipElement && (skipElement === item || item.contains(skipElement)))\n\t\t\t\t\treturn;\n\n\t\t\t\tconst dropdown = KTDropdown.getInstance(item as HTMLElement);\n\t\t\t\tif (dropdown) dropdown.hide();\n\t\t\t});\n\t}\n\n\tpublic static handleClickAway(): void {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tdocument\n\t\t\t\t.querySelectorAll(\n\t\t\t\t\t'.open[data-kt-dropdown-initialized]:not([data-kt-dropdown-permanent=\"true\"])',\n\t\t\t\t)\n\t\t\t\t.forEach((element) => {\n\t\t\t\t\tconst dropdown = KTDropdown.getInstance(element as HTMLElement);\n\t\t\t\t\tif (!dropdown) return;\n\n\t\t\t\t\tconst contentElement = dropdown.getContentElement();\n\t\t\t\t\tconst toggleElement = dropdown.getToggleElement();\n\n\t\t\t\t\tif (\n\t\t\t\t\t\ttoggleElement === event.target ||\n\t\t\t\t\t\ttoggleElement.contains(event.target as HTMLElement) ||\n\t\t\t\t\t\tcontentElement === event.target ||\n\t\t\t\t\t\tcontentElement.contains(event.target as HTMLElement)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdropdown.hide();\n\t\t\t\t});\n\t\t});\n\t}\n\n\tpublic static handleKeyboard(): void {\n\t\tdocument.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst dropdownEl = document.querySelector(\n\t\t\t\t'.open[data-kt-dropdown-initialized]',\n\t\t\t);\n\t\t\tconst dropdown = KTDropdown.getInstance(dropdownEl as HTMLElement);\n\t\t\tif (!dropdown || !dropdown._getOption('keyboard')) return;\n\n\t\t\tif (\n\t\t\t\tevent.key === 'Escape' &&\n\t\t\t\t!(event.ctrlKey || event.altKey || event.shiftKey)\n\t\t\t) {\n\t\t\t\tdropdown.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleMouseover(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-toggle], [data-kt-dropdown-menu]',\n\t\t\t'mouseover',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown && dropdown._getOption('trigger') === 'hover') {\n\t\t\t\t\tdropdown.mouseover(event as MouseEvent);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleMouseout(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-toggle], [data-kt-dropdown-menu]',\n\t\t\t'mouseout',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown && dropdown._getOption('trigger') === 'hover') {\n\t\t\t\t\tdropdown.mouseout(event as MouseEvent);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleClick(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown) {\n\t\t\t\t\tdropdown.click(event);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleDismiss(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-dismiss]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown) {\n\t\t\t\t\tdropdown.hide();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static initHandlers(): void {\n\t\tthis.handleClickAway();\n\t\tthis.handleKeyboard();\n\t\tthis.handleMouseover();\n\t\tthis.handleMouseout();\n\t\tthis.handleClick();\n\t\tthis.handleDismiss();\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-dropdown]');\n\t\telements.forEach((element) => {\n\t\t\tnew KTDropdown(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTDropdown.createInstances();\n\n\t\tif (window.KT_DROPDOWN_INITIALIZED !== true) {\n\t\t\tKTDropdown.initHandlers();\n\t\t\twindow.KT_DROPDOWN_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTDropdown = KTDropdown;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTDrawer } from './drawer';\nexport type { KTDrawerConfigInterface, KTDrawerInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nconst KTElementMap = new Map();\n\nconst KTData = {\n\tset(element: HTMLElement, key: string, value: unknown): void {\n\t\tif (!KTElementMap.has(element)) {\n\t\t\tKTElementMap.set(element, new Map());\n\t\t}\n\n\t\tconst valueMap = KTElementMap.get(element);\n\n\t\tvalueMap.set(key, value);\n\t},\n\n\tget(element: HTMLElement, key: string): unknown {\n\t\tif (KTElementMap.has(element)) {\n\t\t\treturn KTElementMap.get(element).get(key) || null;\n\t\t}\n\n\t\treturn null;\n\t},\n\n\thas(element: HTMLElement, key: string): boolean {\n\t\treturn KTElementMap.has(element) && KTElementMap.get(element).has(key);\n\t},\n\n\tremove(element: HTMLElement, key: string): void {\n\t\tif (!KTElementMap.has(element) || !KTElementMap.get(element).has(key)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst valueMap = KTElementMap.get(element);\n\n\t\tvalueMap.delete(key);\n\n\t\tif (valueMap.size === 0) {\n\t\t\tKTElementMap.delete(element);\n\t\t}\n\t},\n};\n\nexport default KTData;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTSelectConfigInterface } from './config';\nimport { KTSelect } from './select';\nimport { defaultTemplates } from './templates';\nimport { EventManager } from './utils';\n\n/**\n * KTSelectTags - Handles tags-specific functionality for KTSelect\n */\nexport class KTSelectTags {\n\tprivate _select: KTSelect;\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _valueDisplayElement: HTMLElement;\n\tprivate _eventManager: EventManager;\n\n\t/**\n\t * Constructor: Initializes the tags component\n\t */\n\tconstructor(select: KTSelect) {\n\t\tthis._select = select;\n\t\tthis._config = select.getConfig();\n\t\tthis._valueDisplayElement = select.getValueDisplayElement();\n\t\tthis._eventManager = new EventManager();\n\n\t}\n\n\t/**\n\t * Update selected tags display\n\t * Renders selected options as tags in the display element\n\t */\n\tpublic updateTagsDisplay(selectedOptions: string[]): void {\n\t\t// Remove any existing tag elements\n\t\tconst wrapper = this._valueDisplayElement.parentElement;\n\t\tif (!wrapper) return;\n\n\t\t// If no options selected, ensure placeholder is shown\n\t\tif (selectedOptions.length === 0) {\n\t\t\t// Clear any existing content and show placeholder\n\t\t\tthis._valueDisplayElement.innerHTML = '';\n\t\t\tconst placeholderEl = defaultTemplates.placeholder(this._config);\n\t\t\tthis._valueDisplayElement.appendChild(placeholderEl);\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear all existing content before adding tags\n\t\tthis._valueDisplayElement.innerHTML = '';\n\n\t\t// Insert each tag before the display element\n\t\tselectedOptions.forEach((optionValue) => {\n\t\t\t// Find the original option element (in dropdown or select)\n\t\t\tlet optionElement: HTMLOptionElement | null = null;\n\t\t\tconst optionElements = this._select.getOptionsElement();\n\t\t\tfor (const opt of Array.from(optionElements)) {\n\t\t\t\tif ((opt as HTMLElement).dataset.value === optionValue) {\n\t\t\t\t\toptionElement = opt as HTMLOptionElement;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!optionElement) {\n\t\t\t\tconst originalOptions = this._select\n\t\t\t\t\t.getElement()\n\t\t\t\t\t.querySelectorAll('option');\n\t\t\t\tfor (const opt of Array.from(originalOptions)) {\n\t\t\t\t\tif ((opt as HTMLOptionElement).value === optionValue) {\n\t\t\t\t\t\toptionElement = opt as HTMLOptionElement;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst tag = defaultTemplates.tag(optionElement, this._config);\n\n\t\t\t// Add event listener to the close button\n\t\t\tconst closeButton = tag.querySelector(\n\t\t\t\t'[data-kt-select-remove-button]',\n\t\t\t) as HTMLElement;\n\t\t\tif (closeButton) {\n\t\t\t\tthis._eventManager.addListener(closeButton, 'click', (event: Event) => {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\tthis._removeTag(optionValue);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Insert tag inside the display element\n\t\t\tthis._valueDisplayElement.appendChild(tag);\n\t\t});\n\t}\n\n\t/**\n\t * Remove a tag and its selection\n\t */\n\tprivate _removeTag(optionValue: string): void {\n\t\t// Delegate to the select component to handle state changes\n\t\tthis._select.toggleSelection(optionValue);\n\t}\n\n\t/**\n\t * Clean up resources used by this module\n\t */\n\tpublic destroy(): void {\n\t\tthis._eventManager.removeAllListeners(null);\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTComponent from '../component';\nimport KTData from '../../helpers/data';\nimport {\n\tKTToastOptions,\n\tKTToastConfig,\n\tKTToastInstance,\n\tKTToastPosition,\n} from './types';\n\nconst DEFAULT_CONFIG: KTToastConfig = {\n\tposition: 'top-end',\n\tduration: 4000,\n\tclassName: '',\n\tmaxToasts: 5,\n\toffset: 15,\n\tgap: 10,\n};\n\nconst DEFAULT_TOAST_OPTIONS: KTToastOptions = {\n\tappearance: 'solid',\n\tprogress: false,\n\tsize: 'md',\n\taction: false,\n\tcancel: false,\n\tdismiss: true,\n};\n\nimport type { KTToastConfigInterface, KTToastInterface } from './types';\n\nexport class KTToast extends KTComponent implements KTToastInterface {\n\tprotected override _name: string = 'toast';\n\tprotected override _defaultConfig: KTToastConfigInterface = DEFAULT_CONFIG;\n\tprotected override _config: KTToastConfigInterface = DEFAULT_CONFIG;\n\tprotected _defaultToastOptions: KTToastOptions = DEFAULT_TOAST_OPTIONS;\n\tprivate static containerMap: Map<KTToastPosition, HTMLElement> = new Map();\n\tprivate static toasts: Map<string, KTToastInstance> = new Map();\n\tprivate static globalConfig: KTToastConfig = { ...DEFAULT_CONFIG };\n\n\t/**\n\t * Creates a new KTToast instance for a specific element (not commonly used; most use static API).\n\t * @param element The target HTML element.\n\t * @param config Optional toast config for this instance.\n\t */\n\tconstructor(element: HTMLElement, config?: Partial<KTToastConfigInterface>) {\n\t\tsuper();\n\t\tif (KTData.has(element, this._name)) return;\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tKTData.set(element, this._name, this);\n\t}\n\n\t/**\n\t * Generates the HTML content for a toast based on the provided options.\n\t * @param options Toast options (message, icon, actions, etc).\n\t * @returns The toast's HTML markup as a string.\n\t */\n\tstatic getContent(options?: KTToastOptions) {\n\t\tconst classNames = {\n\t\t\t...((this.globalConfig.classNames as any) || {}),\n\t\t\t...((options?.classNames as any) || {}),\n\t\t};\n\n\t\tif (options?.content) {\n\t\t\tif (typeof options.content === 'string') {\n\t\t\t\treturn options.content;\n\t\t\t} else if (typeof options.content === 'function') {\n\t\t\t\tconst node = options.content();\n\t\t\t\tif (node instanceof HTMLElement) {\n\t\t\t\t\treturn node.outerHTML;\n\t\t\t\t}\n\t\t\t} else if (options.content instanceof HTMLElement) {\n\t\t\t\treturn options.content.outerHTML;\n\t\t\t}\n\t\t}\n\n\t\tlet template = '';\n\n\t\tif (options?.icon) {\n\t\t\ttemplate +=\n\t\t\t\t'<div class=\"kt-alert-icon ' +\n\t\t\t\t(classNames.icon || '') +\n\t\t\t\t'\">' +\n\t\t\t\toptions.icon +\n\t\t\t\t'</div>';\n\t\t}\n\n\t\tif (options?.message) {\n\t\t\ttemplate +=\n\t\t\t\t'<div class=\"kt-alert-title ' +\n\t\t\t\t(classNames.message || '') +\n\t\t\t\t'\">' +\n\t\t\t\toptions.message +\n\t\t\t\t'</div>';\n\t\t}\n\n\t\tif (\n\t\t\toptions?.action !== false ||\n\t\t\toptions?.dismiss !== false ||\n\t\t\toptions?.cancel !== false\n\t\t) {\n\t\t\ttemplate +=\n\t\t\t\t'<div class=\"kt-alert-toolbar ' + (classNames.toolbar || '') + '\">';\n\t\t\ttemplate +=\n\t\t\t\t'<div class=\"kt-alert-actions ' + (classNames.actions || '') + '\">';\n\n\t\t\tif (options?.action && typeof options.action === 'object') {\n\t\t\t\ttemplate +=\n\t\t\t\t\t'<button data-kt-toast-action=\"true\" class=\"' +\n\t\t\t\t\t(options.action.className || '') +\n\t\t\t\t\t'\">' +\n\t\t\t\t\toptions.action.label +\n\t\t\t\t\t'</button>';\n\t\t\t}\n\n\t\t\tif (options?.cancel && typeof options.cancel === 'object') {\n\t\t\t\ttemplate +=\n\t\t\t\t\t'<button data-kt-toast-cancel=\"true\" class=\"' +\n\t\t\t\t\t(options.cancel.className || '') +\n\t\t\t\t\t'\">' +\n\t\t\t\t\toptions.cancel.label +\n\t\t\t\t\t'</button>';\n\t\t\t}\n\n\t\t\tif (options?.dismiss !== false) {\n\t\t\t\ttemplate +=\n\t\t\t\t\t'<button data-kt-toast-dismiss=\"true\" class=\"kt-alert-close\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg></button>';\n\t\t\t}\n\n\t\t\ttemplate += '</div>';\n\t\t\ttemplate += '</div>';\n\t\t}\n\n\t\ttemplate += '</div>';\n\n\t\treturn template;\n\t}\n\n\t/**\n\t * Update all toasts in the container with smooth animation.\n\t *\n\t * @param container The toast container element.\n\t * @param offset Optional offset from the edge.\n\t */\n\tstatic update(container: HTMLElement | null, offset?: number) {\n\t\tif (!container) return;\n\t\toffset =\n\t\t\ttypeof offset === 'number' ? offset : (this.globalConfig.offset ?? 15);\n\t\trequestAnimationFrame(() => {\n\t\t\tconst gap = this.globalConfig.gap ?? 8;\n\t\t\t// Group toasts by alignment (top/bottom)\n\t\t\tconst positionGroups: Record<string, HTMLElement[]> = {\n\t\t\t\ttop: [],\n\t\t\t\tbottom: [],\n\t\t\t};\n\t\t\tconst toasts = Array.from(container.children) as HTMLElement[];\n\t\t\ttoasts.forEach((toast) => {\n\t\t\t\tif (\n\t\t\t\t\ttoast.classList.contains('kt-toast-top-end') ||\n\t\t\t\t\ttoast.classList.contains('kt-toast-top-center') ||\n\t\t\t\t\ttoast.classList.contains('kt-toast-top-start')\n\t\t\t\t) {\n\t\t\t\t\tpositionGroups.top.push(toast);\n\t\t\t\t} else {\n\t\t\t\t\tpositionGroups.bottom.push(toast);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Stack top toasts from the top down\n\t\t\tlet currentOffset = offset;\n\t\t\tpositionGroups.top.forEach((toast) => {\n\t\t\t\ttoast.style.top = `${currentOffset}px`;\n\t\t\t\ttoast.style.bottom = '';\n\t\t\t\ttoast.style.transition =\n\t\t\t\t\t'top 0.28s cubic-bezier(.4,0,.2,1), opacity 0.28s cubic-bezier(.4,0,.2,1)';\n\t\t\t\tcurrentOffset += toast.offsetHeight + gap;\n\n\t\t\t\tif (toast.classList.contains('kt-toast-top-start')) {\n\t\t\t\t\ttoast.style.insetInlineStart = `${offset}px`;\n\t\t\t\t}\n\n\t\t\t\tif (toast.classList.contains('kt-toast-top-end')) {\n\t\t\t\t\ttoast.style.insetInlineEnd = `${offset}px`;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Stack bottom toasts from the bottom up\n\t\t\tcurrentOffset = offset;\n\t\t\tfor (let i = positionGroups.bottom.length - 1; i >= 0; i--) {\n\t\t\t\tconst toast = positionGroups.bottom[i];\n\t\t\t\ttoast.style.bottom = `${currentOffset}px`;\n\t\t\t\ttoast.style.top = '';\n\t\t\t\ttoast.style.transition =\n\t\t\t\t\t'bottom 0.28s cubic-bezier(.4,0,.2,1), opacity 0.28s cubic-bezier(.4,0,.2,1)';\n\t\t\t\tcurrentOffset += toast.offsetHeight + gap;\n\n\t\t\t\tif (toast.classList.contains('kt-toast-bottom-start')) {\n\t\t\t\t\ttoast.style.insetInlineStart = `${offset}px`;\n\t\t\t\t}\n\n\t\t\t\tif (toast.classList.contains('kt-toast-bottom-end')) {\n\t\t\t\t\ttoast.style.insetInlineEnd = `${offset}px`;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Set global toast configuration options.\n\t * @param options Partial toast config to merge with global config.\n\t */\n\tstatic config(options: Partial<KTToastConfig>) {\n\t\tthis.globalConfig = { ...this.globalConfig, ...options };\n\t}\n\n\t/**\n\t * Show a toast notification.\n\t * @param inputOptions Toast options (message, duration, variant, etc).\n\t * @returns Toast instance with dismiss method, or undefined if invalid input.\n\t */\n\tstatic show(\n\t\tinputOptions?: KTToastOptions,\n\t): (KTToastInstance & { dismiss: () => void }) | undefined {\n\t\tconst options = { ...DEFAULT_TOAST_OPTIONS, ...inputOptions };\n\n\t\tif (!options || (!options.message && !options.content)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Always resolve the id once and use it everywhere\n\t\tconst id = `kt-toast-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n\t\tconst position =\n\t\t\toptions.position || this.globalConfig.position || 'top-end';\n\n\t\tconst classNames = {\n\t\t\t...((this.globalConfig.classNames as any) || {}),\n\t\t\t...((options.classNames as any) || {}),\n\t\t};\n\n\t\tlet container = this.containerMap.get(position);\n\n\t\tif (!container) {\n\t\t\tcontainer = document.createElement('div');\n\t\t\tconst classNames = {\n\t\t\t\t...((this.globalConfig.classNames as any) || {}),\n\t\t\t\t...((options.classNames as any) || {}),\n\t\t\t};\n\t\t\t// Fallback to default hardcoded classes if not provided in options or globalConfig\n\t\t\tcontainer.className =\n\t\t\t\tclassNames.container || `kt-toast-container ${position}`;\n\t\t\tdocument.body.appendChild(container);\n\t\t\tthis.containerMap.set(position, container);\n\t\t}\n\n\t\t// Enforce maxToasts\n\t\tif (\n\t\t\tcontainer.children.length >=\n\t\t\t(this.globalConfig.maxToasts || DEFAULT_CONFIG.maxToasts)\n\t\t) {\n\t\t\tconst firstToast = container.firstElementChild;\n\t\t\tif (firstToast) {\n\t\t\t\tfirstToast.classList.add('kt-toast-closing');\n\t\t\t\tfirstToast.addEventListener('animationend', () => {\n\t\t\t\t\tfirstToast.remove();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Create toast element\n\t\tconst variantMap = {\n\t\t\tinfo: 'kt-alert-info',\n\t\t\tsuccess: 'kt-alert-success',\n\t\t\terror: 'kt-alert-error',\n\t\t\twarning: 'kt-alert-warning',\n\t\t\tprimary: 'kt-alert-primary',\n\t\t\tsecondary: 'kt-alert-secondary',\n\t\t\tdestructive: 'kt-alert-destructive',\n\t\t\tmono: 'kt-alert-mono',\n\t\t};\n\n\t\tconst appearanceMap = {\n\t\t\tsolid: 'kt-alert-solid',\n\t\t\toutline: 'kt-alert-outline',\n\t\t\tlight: 'kt-alert-light',\n\t\t};\n\n\t\tconst sizeMap = {\n\t\t\tsm: 'kt-alert-sm',\n\t\t\tmd: 'kt-alert-md',\n\t\t\tlg: 'kt-alert-lg',\n\t\t};\n\n\t\tconst toast = document.createElement('div');\n\t\ttoast.className = `kt-toast kt-alert ${variantMap[options.variant] || ''} ${appearanceMap[options.appearance] || ''} ${sizeMap[options.size] || ''} ${options.className || ''} ${classNames.toast || ''}`;\n\t\t// ARIA support\n\t\ttoast.setAttribute('role', options.role || 'status');\n\t\ttoast.setAttribute('aria-live', 'polite');\n\t\ttoast.setAttribute('aria-atomic', 'true');\n\t\ttoast.setAttribute('tabindex', '0');\n\n\t\t// Always resolve the id once and use it everywhere\n\t\t// Always resolve id ONCE at the top, use everywhere\n\t\t// (Move this up to replace the previous const id = ... assignment)\n\n\t\t// Populate content via getContent\n\t\tconst contentHtml = KTToast.getContent(options);\n\t\ttoast.innerHTML = contentHtml;\n\n\t\t// Assign event handlers to buttons by data attribute\n\t\tconst actionBtn = toast.querySelector(\n\t\t\t'[data-kt-toast-action]',\n\t\t) as HTMLButtonElement | null;\n\n\t\tif (\n\t\t\tactionBtn &&\n\t\t\toptions.action &&\n\t\t\ttypeof options.action === 'object' &&\n\t\t\toptions.action.onClick\n\t\t) {\n\t\t\tactionBtn.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tif (typeof options.action === 'object' && options.action.onClick) {\n\t\t\t\t\toptions.action.onClick(id);\n\t\t\t\t\tKTToast.close(id);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst cancelBtn = toast.querySelector(\n\t\t\t'[data-kt-toast-cancel]',\n\t\t) as HTMLButtonElement | null;\n\n\t\tif (cancelBtn && options.cancel && typeof options.cancel === 'object') {\n\t\t\tcancelBtn.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tif (typeof options.cancel === 'object' && options.cancel.onClick) {\n\t\t\t\t\toptions.cancel.onClick(id);\n\t\t\t\t\tKTToast.close(id);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Dismiss button handler\n\t\tconst dismissBtn = toast.querySelector(\n\t\t\t'[data-kt-toast-dismiss]',\n\t\t) as HTMLButtonElement | null;\n\n\t\tif (dismissBtn && options.dismiss !== false) {\n\t\t\tdismissBtn.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tKTToast.close(id);\n\t\t\t});\n\t\t}\n\n\t\t// If modal-like, set aria-modal\n\t\tif (options.important) toast.setAttribute('aria-modal', 'true');\n\t\ttoast.style.pointerEvents = 'auto';\n\n\t\t// Progress line\n\t\tconst duration = options.important\n\t\t\t? null\n\t\t\t: (options.duration ??\n\t\t\t\tthis.globalConfig.duration ??\n\t\t\t\tDEFAULT_CONFIG.duration);\n\n\t\tif (duration && options.progress) {\n\t\t\tconst progress = document.createElement('div');\n\t\t\tprogress.className = 'kt-toast-progress ' + (classNames.progress || '');\n\t\t\tprogress.style.animationDuration = duration + 'ms';\n\t\t\tprogress.setAttribute('data-kt-toast-progress', 'true');\n\t\t\ttoast.appendChild(progress);\n\t\t}\n\n\t\t// Assign direction class to the toast itself, not the container\n\t\tconst directionClassMap: Record<string, string> = {\n\t\t\t'top-end': 'kt-toast-top-end',\n\t\t\t'top-center': 'kt-toast-top-center',\n\t\t\t'top-start': 'kt-toast-top-start',\n\t\t\t'bottom-end': 'kt-toast-bottom-end',\n\t\t\t'bottom-center': 'kt-toast-bottom-center',\n\t\t\t'bottom-start': 'kt-toast-bottom-start',\n\t\t};\n\t\tObject.values(directionClassMap).forEach((cls) =>\n\t\t\ttoast.classList.remove(cls),\n\t\t);\n\t\tconst dirClass = directionClassMap[position] || 'kt-toast-top-end';\n\t\ttoast.classList.add(dirClass);\n\n\t\t// Enforce maxToasts: remove oldest if needed\n\t\tconst maxToasts =\n\t\t\toptions.maxToasts ??\n\t\t\tthis.globalConfig.maxToasts ??\n\t\t\tDEFAULT_CONFIG.maxToasts;\n\t\tconst currentToasts = Array.from(container.children) as HTMLElement[];\n\t\tif (currentToasts.length >= maxToasts && currentToasts.length > 0) {\n\t\t\tconst oldestToast = currentToasts[currentToasts.length - 1];\n\t\t\tconst oldestId = oldestToast.getAttribute('data-kt-toast-id');\n\t\t\tif (oldestId) {\n\t\t\t\tKTToast.close(oldestId);\n\t\t\t} else {\n\t\t\t\toldestToast.remove();\n\t\t\t}\n\t\t}\n\n\t\t// Insert toast at the top\n\t\tcontainer.insertBefore(toast, container.firstChild);\n\t\tKTToast.update(container);\n\n\t\t// Play beep if requested\n\t\tif (options.beep) {\n\t\t\ttry {\n\t\t\t\t// Use Web Audio API for a short beep\n\t\t\t\tconst ctx = new (window.AudioContext ||\n\t\t\t\t\t(window as any).webkitAudioContext)();\n\t\t\t\tconst o = ctx.createOscillator();\n\t\t\t\tconst g = ctx.createGain();\n\t\t\t\to.type = 'sine';\n\t\t\t\to.frequency.value = 880;\n\t\t\t\tg.gain.value = 0.09;\n\t\t\t\to.connect(g);\n\t\t\t\tg.connect(ctx.destination);\n\t\t\t\to.start();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\to.stop();\n\t\t\t\t\tctx.close();\n\t\t\t\t}, 120);\n\t\t\t} catch (e) {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t}\n\n\t\tKTToast._fireEventOnElement(toast, 'show', { id });\n\t\tKTToast._dispatchEventOnElement(toast, 'show', { id });\n\t\tconst instance: KTToastInstance = { id, element: toast, timeoutId: 0 };\n\t\tKTToast.toasts.set(id, instance);\n\n\t\t// Auto-dismiss\n\t\tlet timeoutId: number | undefined = undefined;\n\t\tlet remaining = duration;\n\t\tlet startTime: number | undefined;\n\t\tlet paused = false;\n\t\tlet progressEl: HTMLElement | null = null;\n\t\tif (duration) {\n\t\t\tconst startTimer = (ms: number) => {\n\t\t\t\tstartTime = Date.now();\n\t\t\t\ttimeoutId = window.setTimeout(() => {\n\t\t\t\t\toptions.onAutoClose?.(id);\n\t\t\t\t\tKTToast.close(id);\n\t\t\t\t}, ms);\n\t\t\t\tinstance.timeoutId = timeoutId;\n\t\t\t};\n\t\t\tstartTimer(duration);\n\n\t\t\tif (options.pauseOnHover) {\n\t\t\t\tprogressEl = toast.querySelector('[data-kt-toast-progress]');\n\t\t\t\tlet progressPausedAt = 0;\n\t\t\t\tconst pause = () => {\n\t\t\t\t\tif (!paused && timeoutId) {\n\t\t\t\t\t\tpaused = true;\n\t\t\t\t\t\twindow.clearTimeout(timeoutId);\n\t\t\t\t\t\tif (startTime) {\n\t\t\t\t\t\t\tremaining -= Date.now() - startTime;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Pause progress bar\n\t\t\t\t\t\tif (progressEl) {\n\t\t\t\t\t\t\tconst computedStyle = window.getComputedStyle(progressEl);\n\t\t\t\t\t\t\tconst matrix = computedStyle.transform;\n\t\t\t\t\t\t\tlet scaleX = 1;\n\t\t\t\t\t\t\tif (matrix && matrix !== 'none') {\n\t\t\t\t\t\t\t\tconst values = matrix.match(/matrix\\(([^)]+)\\)/);\n\t\t\t\t\t\t\t\tif (values && values[1]) {\n\t\t\t\t\t\t\t\t\tscaleX = parseFloat(values[1].split(',')[0]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tprogressPausedAt = scaleX;\n\t\t\t\t\t\t\tprogressEl.style.animation = 'none';\n\t\t\t\t\t\t\tprogressEl.style.transition = 'none';\n\t\t\t\t\t\t\tprogressEl.style.transform = `scaleX(${scaleX})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst resume = () => {\n\t\t\t\t\tif (paused && remaining > 0) {\n\t\t\t\t\t\tpaused = false;\n\t\t\t\t\t\tstartTimer(remaining);\n\t\t\t\t\t\t// Resume progress bar\n\t\t\t\t\t\tif (progressEl) {\n\t\t\t\t\t\t\tprogressEl.style.transition = 'transform 0ms';\n\t\t\t\t\t\t\tprogressEl.style.transform = `scaleX(${progressPausedAt})`;\n\t\t\t\t\t\t\tprogressEl.offsetHeight; // force reflow\n\t\t\t\t\t\t\tprogressEl.style.transition = `transform ${remaining}ms linear`;\n\t\t\t\t\t\t\tprogressEl.style.transform = 'scaleX(0)';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttoast.addEventListener('mouseenter', pause);\n\t\t\t\ttoast.addEventListener('mouseleave', resume);\n\t\t\t}\n\t\t}\n\n\t\tKTToast._fireEventOnElement(toast, 'shown', { id });\n\t\tKTToast._dispatchEventOnElement(toast, 'shown', { id });\n\n\t\treturn {\n\t\t\t...instance,\n\t\t\tdismiss: () => KTToast.close(id),\n\t\t};\n\t}\n\n\t/**\n\t * Close and remove all active toasts.\n\t */\n\tstatic clearAll(clearContainers: boolean = false) {\n\t\tfor (const id of Array.from(this.toasts.keys())) {\n\t\t\tconsole.log('clearAll:', id);\n\t\t\tthis.close(id);\n\t\t}\n\t\tif (clearContainers) {\n\t\t\t// Remove all containers from the DOM.\n\t\t\tthis.containerMap.forEach((container, position) => {\n\t\t\t\tcontainer.remove();\n\t\t\t\tconsole.log('clearAll: removed container for position', position);\n\t\t\t});\n\t\t\t// Clear containerMap to prevent stale references.\n\t\t\tthis.containerMap.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Close a toast by ID or instance.\n\t * @param idOrInstance Toast ID string or KTToastInstance.\n\t */\n\tstatic close(idOrInstance?: string | KTToastInstance) {\n\t\tlet inst: (KTToastInstance & { _closing?: boolean }) | undefined;\n\t\tlet id: string | undefined;\n\t\tif (!idOrInstance) return;\n\t\tif (typeof idOrInstance === 'string') {\n\t\t\tid = idOrInstance;\n\t\t\tinst = this.toasts.get(id);\n\t\t} else if (typeof idOrInstance === 'object' && idOrInstance.id) {\n\t\t\tid = idOrInstance.id;\n\t\t\tinst = idOrInstance as KTToastInstance & { _closing?: boolean };\n\t\t}\n\n\t\tif (!inst || !id) return;\n\t\tif (inst._closing) return; // Prevent double-close\n\t\tinst._closing = true;\n\n\t\tclearTimeout(inst.timeoutId);\n\n\t\tKTToast._fireEventOnElement(inst.element, 'hide', { id });\n\t\tKTToast._dispatchEventOnElement(inst.element, 'hide', { id });\n\t\t// Remove progress bar instantly if present\n\t\tconst progressEl = inst.element.querySelector('[data-kt-toast-progress]');\n\t\tif (progressEl) progressEl.remove();\n\t\tinst.element.style.animation = 'kt-toast-out 0.25s forwards';\n\n\t\tsetTimeout(() => {\n\t\t\tconst parent = inst?.element.parentElement as HTMLElement | null;\n\t\t\tinst?.element.remove();\n\t\t\tKTToast.toasts.delete(id!);\n\t\t\t// Try to call onDismiss if available in the toast instance (if stored)\n\t\t\tif (typeof (inst as any).options?.onDismiss === 'function') {\n\t\t\t\t(inst as any).options.onDismiss(id);\n\t\t\t}\n\t\t\tKTToast._fireEventOnElement(inst.element, 'hidden', { id });\n\t\t\tKTToast._dispatchEventOnElement(inst.element, 'hidden', { id });\n\t\t\t// update toasts asynchronously after DOM update\n\t\t\tsetTimeout(() => {\n\t\t\t\tKTToast.update(parent);\n\t\t\t}, 0);\n\t\t}, 250);\n\t}\n\n\t/**\n\t * Dispatches a custom 'kt.toast.{eventType}' event on the given element.\n\t * @param element The toast element.\n\t * @param eventType The event type (e.g. 'show', 'hide').\n\t * @param payload Optional event detail payload.\n\t */\n\tprivate static _fireEventOnElement(\n\t\telement: HTMLElement,\n\t\teventType: string,\n\t\tpayload?: object,\n\t) {\n\t\tconst event = new CustomEvent(`kt.toast.${eventType}`, { detail: payload });\n\t\telement.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Dispatches a custom event (not namespaced) on the given element.\n\t * @param element The toast element.\n\t * @param eventType The event type.\n\t * @param payload Optional event detail payload.\n\t */\n\tprivate static _dispatchEventOnElement(\n\t\telement: HTMLElement,\n\t\teventType: string,\n\t\tpayload?: object,\n\t) {\n\t\tconst event = new CustomEvent(eventType, { detail: payload });\n\t\telement.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Initialize toast system (placeholder for future use).\n\t */\n\tpublic static init(): void {}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n/* eslint-disable max-len */\nimport KTUtils from './utils';\nimport { KTOffsetType, KTOptionType, KTViewPortType } from '../types';\n\nconst KTDom = {\n\tisRTL(): boolean {\n\t\tconst htmlTag = document.documentElement; // Access the <html> tag\n\n\t\t// Check if the \"dir\" attribute is present and its value is \"rtl\"\n\t\tconst dir = htmlTag.getAttribute('dir');\n\n\t\treturn dir === 'rtl';\n\t},\n\n\tisElement(element: HTMLElement): boolean {\n\t\tif (element && element instanceof HTMLElement) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n\n\tgetElement(element: HTMLElement | string): HTMLElement {\n\t\tif (this.isElement(element)) {\n\t\t\treturn element as HTMLElement;\n\t\t}\n\n\t\tif (element && (element as string).length > 0) {\n\t\t\treturn document.querySelector(KTUtils.parseSelector(element as string));\n\t\t}\n\n\t\treturn null;\n\t},\n\n\tremove(element: HTMLElement): void {\n\t\tif (this.isElement(element) && element.parentNode) {\n\t\t\telement.parentNode.removeChild(element);\n\t\t}\n\t},\n\n\thasClass(element: HTMLElement, className: string): boolean {\n\t\t// Split classNames string into an array of individual class names\n\t\tconst classes = className.split(' ');\n\n\t\t// Loop through each class name\n\t\tfor (const className of classes) {\n\t\t\t// Check if the element has the current class name\n\t\t\tif (!element.classList.contains(className)) {\n\t\t\t\t// Return false if any class is missing\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Return true if all classes are present\n\t\treturn true;\n\t},\n\n\taddClass(element: HTMLElement, className: string): void {\n\t\tconst classNames = className.split(' ');\n\n\t\tif (element.classList) {\n\t\t\tfor (let i = 0; i < classNames.length; i++) {\n\t\t\t\tif (classNames[i] && classNames[i].length > 0) {\n\t\t\t\t\telement.classList.add(classNames[i].trim());\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!this.hasClass(element, className)) {\n\t\t\tfor (let x = 0; x < classNames.length; x++) {\n\t\t\t\telement.className += ' ' + classNames[x].trim();\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveClass(element: HTMLElement, className: string): void {\n\t\tconst classNames = className.split(' ');\n\n\t\tif (element.classList) {\n\t\t\tfor (let i = 0; i < classNames.length; i++) {\n\t\t\t\telement.classList.remove(classNames[i].trim());\n\t\t\t}\n\t\t} else if (this.hasClass(element, className)) {\n\t\t\tfor (let x = 0; x < classNames.length; x++) {\n\t\t\t\telement.className = element.className.replace(\n\t\t\t\t\tnew RegExp('\\\\b' + classNames[x].trim() + '\\\\b', 'g'),\n\t\t\t\t\t'',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\tgetCssProp(element: HTMLElement, prop: string): string {\n\t\treturn (\n\t\t\telement ? window.getComputedStyle(element).getPropertyValue(prop) : ''\n\t\t).replace(' ', '');\n\t},\n\n\tsetCssProp(element: HTMLElement, prop: string, value: string) {\n\t\tif (element) {\n\t\t\twindow.getComputedStyle(element).setProperty(prop, value);\n\t\t}\n\t},\n\n\toffset(element: HTMLElement): KTOffsetType {\n\t\tif (!element) return { top: 0, left: 0, right: 0, bottom: 0 };\n\n\t\tconst rect = element.getBoundingClientRect();\n\n\t\treturn {\n\t\t\ttop: rect.top,\n\t\t\tleft: rect.left,\n\t\t\tright: window.innerWidth - rect.right,\n\t\t\tbottom: window.innerHeight - rect.top,\n\t\t};\n\t},\n\n\tgetIndex(element: HTMLElement): number {\n\t\tconst children = Array.from(element.parentNode?.children || []);\n\t\treturn children.indexOf(element);\n\t},\n\n\tparents(element: HTMLElement, selector: string): Array<HTMLElement> {\n\t\tconst parents: Array<HTMLElement> = [];\n\n\t\t// Push each parent element to the array\n\t\tfor (\n\t\t\telement && element !== document.documentElement;\n\t\t\t(element = element.parentElement as HTMLElement);\n\n\t\t) {\n\t\t\tif (selector) {\n\t\t\t\tif (element.matches(selector)) {\n\t\t\t\t\tparents.push(element as HTMLElement);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tparents.push(element as HTMLElement);\n\t\t}\n\n\t\t// Return our parent array\n\t\treturn parents;\n\t},\n\n\tsiblings(element: HTMLElement) {\n\t\tconst parent = element.parentNode;\n\t\tif (!parent) return [];\n\t\treturn Array.from(parent.children).filter((child) => child !== element);\n\t},\n\n\tchildren(element: HTMLElement, selector: string): Array<HTMLElement> {\n\t\tif (!element || !element.childNodes) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst result: Array<HTMLElement> = [];\n\t\tconst l = element.childNodes.length;\n\t\tlet i = 0;\n\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tif (\n\t\t\t\telement.childNodes[i].nodeType == 1 &&\n\t\t\t\t(element.childNodes[i] as HTMLElement).matches(selector)\n\t\t\t) {\n\t\t\t\tresult.push(element.childNodes[i] as HTMLElement);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tchild(element: HTMLElement, selector: string): HTMLElement {\n\t\tconst children = KTDom.children(element, selector);\n\n\t\treturn children ? children[0] : null;\n\t},\n\n\tisVisible(element: HTMLElement): boolean {\n\t\tif (!this.isElement(element) || element.getClientRects().length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line max-len\n\t\treturn (\n\t\t\tgetComputedStyle(element).getPropertyValue('visibility') === 'visible'\n\t\t);\n\t},\n\n\tisDisabled(\n\t\telement: HTMLInputElement | HTMLSelectElement | HTMLButtonElement,\n\t): boolean {\n\t\tif (!element || element.nodeType !== Node.ELEMENT_NODE) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (element.classList.contains('disabled')) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (typeof element.disabled !== 'undefined') {\n\t\t\treturn element.disabled;\n\t\t}\n\n\t\treturn (\n\t\t\telement.hasAttribute('disabled') &&\n\t\t\telement.getAttribute('disabled') !== 'false'\n\t\t);\n\t},\n\n\ttransitionEnd(element: HTMLElement, callback: CallableFunction): void {\n\t\tconst duration: number = this.getCSSTransitionDuration(element);\n\n\t\tsetTimeout(() => {\n\t\t\tcallback();\n\t\t}, duration);\n\t},\n\n\tanimationEnd(element: HTMLElement, callback: CallableFunction): void {\n\t\tconst duration: number = this.getCSSAnimationDuration(element);\n\n\t\tsetTimeout(() => {\n\t\t\tcallback();\n\t\t}, duration);\n\t},\n\n\tgetCSSTransitionDuration(element: HTMLElement): number {\n\t\treturn (\n\t\t\tparseFloat(window.getComputedStyle(element).transitionDuration) * 1000\n\t\t);\n\t},\n\n\tgetCSSAnimationDuration(element: HTMLElement): number {\n\t\treturn (\n\t\t\tparseFloat(window.getComputedStyle(element).animationDuration) * 1000\n\t\t);\n\t},\n\n\treflow(element: HTMLElement): void {\n\t\telement.offsetHeight;\n\t},\n\n\tinsertAfter(element: HTMLElement, referenceNode: HTMLElement) {\n\t\tconst parentNode = referenceNode.parentNode;\n\t\tif (parentNode) {\n\t\t\tparentNode.insertBefore(element, referenceNode.nextSibling);\n\t\t}\n\t},\n\n\tgetHighestZindex(element: HTMLElement): number {\n\t\tlet position: string, value: number;\n\n\t\twhile (element && element !== document.documentElement) {\n\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\tposition = element.style.position;\n\n\t\t\tif (\n\t\t\t\tposition === 'absolute' ||\n\t\t\t\tposition === 'relative' ||\n\t\t\t\tposition === 'fixed'\n\t\t\t) {\n\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t// other browsers return a string\n\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\t\tvalue = parseInt(element.style.zIndex);\n\n\t\t\t\tif (!isNaN(value) && value !== 0) {\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telement = element.parentNode as HTMLElement;\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\tisParentOrElementHidden(element: HTMLElement): boolean {\n\t\tif (!element) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst computedStyle = window.getComputedStyle(element);\n\n\t\tif (computedStyle.display === 'none') {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn this.isParentOrElementHidden(element.parentElement);\n\t},\n\n\tgetViewPort(): KTViewPortType {\n\t\treturn {\n\t\t\twidth: window.innerWidth,\n\t\t\theight: window.innerHeight,\n\t\t};\n\t},\n\n\tgetScrollTop() {\n\t\treturn (document.scrollingElement || document.documentElement).scrollTop;\n\t},\n\n\tisInViewport(element: HTMLElement): boolean {\n\t\tconst rect = element.getBoundingClientRect();\n\n\t\treturn (\n\t\t\trect.top >= 0 &&\n\t\t\trect.left >= 0 &&\n\t\t\trect.bottom <=\n\t\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t\t);\n\t},\n\n\tisPartiallyInViewport(element: HTMLElement): boolean {\n\t\tconst x = element.getBoundingClientRect().left;\n\t\tconst y = element.getBoundingClientRect().top;\n\t\tconst ww = Math.max(\n\t\t\tdocument.documentElement.clientWidth,\n\t\t\twindow.innerWidth || 0,\n\t\t);\n\t\tconst hw = Math.max(\n\t\t\tdocument.documentElement.clientHeight,\n\t\t\twindow.innerHeight || 0,\n\t\t);\n\t\tconst w = element.clientWidth;\n\t\tconst h = element.clientHeight;\n\n\t\treturn y < hw && y + h > 0 && x < ww && x + w > 0;\n\t},\n\n\tisVisibleInParent(child: HTMLElement, parent: HTMLElement): boolean {\n\t\tconst childRect = child.getBoundingClientRect();\n\t\tconst parentRect = parent.getBoundingClientRect();\n\n\t\t// Check if the child element is visible\n\t\tif (\n\t\t\tchild.offsetParent === null ||\n\t\t\tgetComputedStyle(child).visibility === 'hidden' ||\n\t\t\tgetComputedStyle(child).display === 'none'\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if the child is within the vertical bounds of the parent\n\t\tconst isVisibleVertically =\n\t\t\tchildRect.top >= parentRect.top && childRect.bottom <= parentRect.bottom;\n\n\t\t// Check if the child is within the horizontal bounds of the parent\n\t\tconst isVisibleHorizontally =\n\t\t\tchildRect.left >= parentRect.left && childRect.right <= parentRect.right;\n\n\t\treturn isVisibleVertically && isVisibleHorizontally;\n\t},\n\n\tgetRelativeTopPosition(child: HTMLElement, parent: HTMLElement): number {\n\t\tconst childRect = child.getBoundingClientRect();\n\t\tconst parentRect = parent.getBoundingClientRect();\n\n\t\t// Calculate the relative top position\n\t\tconst relativeTop = childRect.top - parentRect.top;\n\n\t\treturn relativeTop;\n\t},\n\n\tgetDataAttributes(element: HTMLElement, prefix: string): object {\n\t\tif (!element) {\n\t\t\treturn {};\n\t\t}\n\n\t\tprefix = KTUtils.camelCase(prefix);\n\n\t\tconst attributes: { [key: string]: KTOptionType } = {};\n\t\tconst keys = Object.keys(element.dataset).filter((key) =>\n\t\t\tkey.startsWith(prefix),\n\t\t);\n\n\t\tfor (const key of keys) {\n\t\t\tlet normalizedKey = key.replace(prefix, '');\n\t\t\tnormalizedKey = KTUtils.uncapitalize(normalizedKey);\n\t\t\tattributes[normalizedKey] = KTUtils.parseDataAttribute(\n\t\t\t\telement.dataset[key],\n\t\t\t);\n\t\t}\n\n\t\treturn attributes;\n\t},\n\n\tready(callback: CallableFunction): void {\n\t\tif (document.readyState === 'loading') {\n\t\t\tdocument.addEventListener('DOMContentLoaded', () => {\n\t\t\t\tcallback();\n\t\t\t});\n\t\t} else {\n\t\t\tcallback();\n\t\t}\n\t},\n};\n\nexport default KTDom;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n// utils.ts\n\nimport { defaultTemplates } from './templates';\nimport { KTSelectConfigInterface } from './config';\n\n/**\n * Format a number as a currency string\n */\nexport function formatCurrency(value: number): string {\n\treturn new Intl.NumberFormat('en-US', {\n\t\tstyle: 'currency',\n\t\tcurrency: 'USD',\n\t}).format(value);\n}\n\n/**\n * Filter options based on a search query\n */\nexport function filterOptions(\n\toptions: HTMLElement[],\n\tquery: string,\n\tconfig: KTSelectConfigInterface,\n\tdropdownElement: HTMLElement,\n\tonVisibleCount?: (count: number) => void,\n): number {\n\tlet visibleOptionsCount = 0;\n\n\t// For empty query, make all options visible\n\t// The KTSelectSearch class is now responsible for restoring original content before calling this.\n\tif (!query || query.trim() === '') {\n\t\tfor (const option of options) {\n\t\t\toption.classList.remove('hidden');\n\t\t\t// Remove inline display style if it was used to hide\n\t\t\tif (option.style.display === 'none') {\n\t\t\t\toption.style.display = '';\n\t\t\t}\n\t\t\t// At this point, option.innerHTML should be its original.\n\t\t\tvisibleOptionsCount++;\n\t\t}\n\n\t\tif (onVisibleCount) {\n\t\t\tonVisibleCount(visibleOptionsCount);\n\t\t}\n\t\treturn visibleOptionsCount;\n\t}\n\n\tconst queryLower = query.toLowerCase();\n\n\tfor (const option of options) {\n\t\t// Use data-text for matching if available, otherwise fall back to textContent\n\t\tconst optionText = (\n\t\t\toption.dataset.text ||\n\t\t\toption.textContent ||\n\t\t\t''\n\t\t).toLowerCase();\n\t\tconst isMatch = optionText.includes(queryLower);\n\n\t\tif (isMatch) {\n\t\t\toption.classList.remove('hidden');\n\t\t\tif (option.style.display === 'none') option.style.display = ''; // Ensure visible\n\t\t\tvisibleOptionsCount++;\n\t\t} else {\n\t\t\toption.classList.add('hidden');\n\t\t}\n\n\t\t// Early exit if maxItems limit is reached (optional)\n\t\t// if (config.searchMaxItems && visibleOptionsCount >= config.searchMaxItems) {\n\t\t// \tbreak;\n\t\t// }\n\t}\n\n\tif (onVisibleCount) {\n\t\tonVisibleCount(visibleOptionsCount);\n\t}\n\n\treturn visibleOptionsCount;\n}\n\n/**\n * Focus manager for keyboard navigation\n * Consolidates redundant focus management logic into shared functions\n */\nexport class FocusManager {\n\tprivate _element: HTMLElement;\n\tprivate _optionsSelector: string;\n\tprivate _focusedOptionIndex: number | null = null;\n\tprivate _focusClass: string;\n\tprivate _hoverClass: string;\n\tprivate _eventManager: EventManager;\n\tprivate _onFocusChange:\n\t\t| ((option: HTMLElement | null, index: number | null) => void)\n\t\t| null = null;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\toptionsSelector: string = '[data-kt-select-option]',\n\t\tconfig?: KTSelectConfigInterface,\n\t) {\n\t\tthis._element = element;\n\t\tthis._optionsSelector = optionsSelector;\n\t\tthis._eventManager = new EventManager();\n\n\t\t// Add click handler to update focus state when options are clicked\n\t\tthis._setupOptionClickHandlers();\n\n\t\tthis._focusClass = 'focus'; // or whatever your intended class is\n\t\tthis._hoverClass = 'hover'; // or your intended class\n\t}\n\n\t/**\n\t * Set up click handlers for all options to update focus state\n\t */\n\tprivate _setupOptionClickHandlers(): void {\n\t\t// Add click handler to the options container\n\t\tthis._eventManager.addListener(this._element, 'click', (e: Event) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst optionElement = target.closest(this._optionsSelector);\n\n\t\t\tif (optionElement) {\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Get all visible options\n\t */\n\tpublic getVisibleOptions(): HTMLElement[] {\n\t\treturn Array.from(\n\t\t\tthis._element.querySelectorAll(this._optionsSelector),\n\t\t).filter((option) => {\n\t\t\tconst element = option as HTMLElement;\n\t\t\t// Check only for hidden class\n\t\t\tif (element.classList.contains('hidden')) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Also check inline styles for backward compatibility\n\t\t\tif (element.style.display === 'none') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}) as HTMLElement[];\n\t}\n\n\t/**\n\t * Focus the first visible option\n\t */\n\tpublic focusFirst(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\t\tfor (let i = 0; i < options.length; i++) {\n\t\t\tconst option = options[i];\n\t\t\tif (\n\t\t\t\t!option.classList.contains('disabled') &&\n\t\t\t\toption.getAttribute('aria-disabled') !== 'true'\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = i;\n\t\t\t\tthis.applyFocus(option);\n\t\t\t\tthis.scrollIntoView(option);\n\t\t\t\treturn option;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Focus the last visible option\n\t */\n\tpublic focusLast(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\t\tfor (let i = options.length - 1; i >= 0; i--) {\n\t\t\tconst option = options[i];\n\t\t\tif (\n\t\t\t\t!option.classList.contains('disabled') &&\n\t\t\t\toption.getAttribute('aria-disabled') !== 'true'\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = i;\n\t\t\t\tthis.applyFocus(option);\n\t\t\t\tthis.scrollIntoView(option);\n\t\t\t\treturn option;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Focus the next visible option that matches the search string\n\t */\n\tpublic focusByString(str: string): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\t\tconst lowerStr = str.toLowerCase();\n\t\tconst startIdx = (this._focusedOptionIndex ?? -1) + 1;\n\t\tfor (let i = 0; i < options.length; i++) {\n\t\t\tconst idx = (startIdx + i) % options.length;\n\t\t\tconst option = options[idx];\n\t\t\tif (\n\t\t\t\t!option.classList.contains('disabled') &&\n\t\t\t\toption.getAttribute('aria-disabled') !== 'true' &&\n\t\t\t\t(option.textContent?.toLowerCase().startsWith(lowerStr) ||\n\t\t\t\t\toption.dataset.value?.toLowerCase().startsWith(lowerStr))\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = idx;\n\t\t\t\tthis.applyFocus(option);\n\t\t\t\tthis.scrollIntoView(option);\n\t\t\t\treturn option;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Focus the next visible option\n\t */\n\tpublic focusNext(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\t\tlet idx =\n\t\t\tthis._focusedOptionIndex === null\n\t\t\t\t? 0\n\t\t\t\t: (this._focusedOptionIndex + 1) % options.length;\n\t\tlet startIdx = idx;\n\t\tdo {\n\t\t\tconst option = options[idx];\n\t\t\tif (\n\t\t\t\t!option.classList.contains('disabled') &&\n\t\t\t\toption.getAttribute('aria-disabled') !== 'true'\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = idx;\n\t\t\t\tthis.applyFocus(option);\n\t\t\t\tthis.scrollIntoView(option);\n\t\t\t\treturn option;\n\t\t\t}\n\t\t\tidx = (idx + 1) % options.length;\n\t\t} while (idx !== startIdx);\n\t\treturn null;\n\t}\n\n\t/**\n\t * Focus the previous visible option\n\t */\n\tpublic focusPrevious(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\t\tlet idx =\n\t\t\tthis._focusedOptionIndex === null\n\t\t\t\t? options.length - 1\n\t\t\t\t: (this._focusedOptionIndex - 1 + options.length) % options.length;\n\t\tlet startIdx = idx;\n\t\tdo {\n\t\t\tconst option = options[idx];\n\t\t\tif (\n\t\t\t\t!option.classList.contains('disabled') &&\n\t\t\t\toption.getAttribute('aria-disabled') !== 'true'\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = idx;\n\t\t\t\tthis.applyFocus(option);\n\t\t\t\tthis.scrollIntoView(option);\n\t\t\t\treturn option;\n\t\t\t}\n\t\t\tidx = (idx - 1 + options.length) % options.length;\n\t\t} while (idx !== startIdx);\n\t\treturn null;\n\t}\n\n\t/**\n\t * Apply focus to a specific option\n\t */\n\tpublic applyFocus(option: HTMLElement): void {\n\t\tif (!option) return;\n\t\t// Ensure it's not disabled\n\t\tif (\n\t\t\toption.classList.contains('disabled') ||\n\t\t\toption.getAttribute('aria-disabled') === 'true'\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\t// DO NOT CALL resetFocus() here. Caller's responsibility.\n\t\toption.classList.add(this._focusClass);\n\t\toption.classList.add(this._hoverClass);\n\t\t// _triggerFocusChange needs _focusedOptionIndex to be set by the caller before this.\n\t\tthis._triggerFocusChange();\n\t}\n\n\t/**\n\t * Reset focus on all options\n\t */\n\tpublic resetFocus(): void {\n\t\tconst focusedElements = this._element.querySelectorAll(\n\t\t\t`.${this._focusClass}, .${this._hoverClass}`,\n\t\t);\n\n\t\t// Remove focus and hover classes from all options\n\t\tfocusedElements.forEach((element) => {\n\t\t\telement.classList.remove(this._focusClass, this._hoverClass);\n\t\t});\n\n\t\tthis._focusedOptionIndex = null; // Always reset the index\n\t}\n\n\t/**\n\t * Ensure the focused option is visible in the scrollable container\n\t */\n\tpublic scrollIntoView(option: HTMLElement): void {\n\t\tif (!option) return;\n\n\t\tconst container = this._element.querySelector('[data-kt-select-options]');\n\t\tif (!container) return;\n\n\t\tconst optionRect = option.getBoundingClientRect();\n\t\tconst containerRect = container.getBoundingClientRect();\n\n\t\t// Check if option is below the visible area\n\t\tif (optionRect.bottom > containerRect.bottom) {\n\t\t\toption.scrollIntoView({ block: 'end', behavior: 'smooth' });\n\t\t}\n\t\t// Check if option is above the visible area\n\t\telse if (optionRect.top < containerRect.top) {\n\t\t\toption.scrollIntoView({ block: 'start', behavior: 'smooth' });\n\t\t}\n\t}\n\n\t/**\n\t * Focus a specific option by its value\n\t */\n\tpublic focusOptionByValue(value: string): boolean {\n\t\tconst options = this.getVisibleOptions();\n\t\tconst index = options.findIndex((option) => option.dataset.value === value);\n\n\t\tif (index >= 0) {\n\t\t\tconst optionToFocus = options[index];\n\t\t\tif (\n\t\t\t\t!optionToFocus.classList.contains('disabled') &&\n\t\t\t\toptionToFocus.getAttribute('aria-disabled') !== 'true'\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = index;\n\t\t\t\tthis.applyFocus(optionToFocus);\n\t\t\t\tthis.scrollIntoView(optionToFocus);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Get the currently focused option\n\t */\n\tpublic getFocusedOption(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\n\t\tif (\n\t\t\tthis._focusedOptionIndex !== null &&\n\t\t\tthis._focusedOptionIndex < options.length\n\t\t) {\n\t\t\treturn options[this._focusedOptionIndex];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get the index of the currently focused option\n\t */\n\tpublic getFocusedIndex(): number | null {\n\t\treturn this._focusedOptionIndex;\n\t}\n\n\t/**\n\t * Set the focused option index directly\n\t */\n\tpublic setFocusedIndex(index: number | null): void {\n\t\tthis._focusedOptionIndex = index;\n\t}\n\n\t/**\n\t * Set a callback to be called when focus changes\n\t */\n\tpublic setOnFocusChange(\n\t\tcb: (option: HTMLElement | null, index: number | null) => void,\n\t) {\n\t\tthis._onFocusChange = cb;\n\t}\n\n\tprivate _triggerFocusChange() {\n\t\tif (this._onFocusChange) {\n\t\t\tthis._onFocusChange(this.getFocusedOption(), this._focusedOptionIndex);\n\t\t}\n\t}\n\n\t/**\n\t * Clean up event listeners\n\t */\n\tpublic dispose(): void {\n\t\tif (this._eventManager) {\n\t\t\tthis._eventManager.removeAllListeners(this._element);\n\t\t}\n\t}\n}\n\n/**\n * Centralized event listener management\n */\nexport class EventManager {\n\tprivate _boundHandlers: Map<\n\t\tstring,\n\t\tMap<EventListenerOrEventListenerObject, EventListenerOrEventListenerObject>\n\t> = new Map();\n\n\t/**\n\t * Add an event listener with a bound context\n\t */\n\tpublic addListener(\n\t\telement: HTMLElement,\n\t\tevent: string,\n\t\thandler: EventListenerOrEventListenerObject,\n\t\tcontext?: any,\n\t): void {\n\t\tif (!element) return;\n\n\t\t// Create a bound version of the handler if context provided\n\t\tconst boundHandler: EventListenerOrEventListenerObject =\n\t\t\tcontext && typeof handler === 'function'\n\t\t\t\t? handler.bind(context)\n\t\t\t\t: handler;\n\n\t\t// Store the relationship between original and bound handler\n\t\tif (!this._boundHandlers.has(event)) {\n\t\t\tthis._boundHandlers.set(event, new Map());\n\t\t}\n\n\t\tconst eventMap = this._boundHandlers.get(event)!;\n\t\teventMap.set(handler, boundHandler);\n\n\t\t// Add the event listener\n\t\telement.addEventListener(event, boundHandler);\n\t}\n\n\t/**\n\t * Remove an event listener\n\t */\n\tpublic removeListener(\n\t\telement: HTMLElement,\n\t\tevent: string,\n\t\thandler: EventListenerOrEventListenerObject,\n\t): void {\n\t\tif (!element) return;\n\n\t\tconst eventMap = this._boundHandlers.get(event);\n\t\tif (!eventMap) return;\n\n\t\t// Get the bound version of the handler\n\t\tconst boundHandler = eventMap.get(handler);\n\t\tif (!boundHandler) return;\n\n\t\t// Remove the event listener\n\t\telement.removeEventListener(event, boundHandler);\n\n\t\t// Clean up the map\n\t\teventMap.delete(handler);\n\t\tif (eventMap.size === 0) {\n\t\t\tthis._boundHandlers.delete(event);\n\t\t}\n\t}\n\n\t/**\n\t * Remove all event listeners\n\t */\n\tpublic removeAllListeners(element: HTMLElement): void {\n\t\tif (!element) return;\n\n\t\t// Go through each event type\n\t\tthis._boundHandlers.forEach((eventMap, event) => {\n\t\t\t// For each event type, go through each handler\n\t\t\teventMap.forEach((boundHandler) => {\n\t\t\t\telement.removeEventListener(event, boundHandler);\n\t\t\t});\n\t\t});\n\n\t\t// Clear the maps\n\t\tthis._boundHandlers.clear();\n\t}\n}\n\n/**\n * Debounce function to limit how often a function can be called\n */\nexport function debounce(\n\tfunc: (...args: any[]) => void,\n\tdelay: number,\n): (...args: any[]) => void {\n\tlet timeout: ReturnType<typeof setTimeout>;\n\n\treturn function (...args: any[]) {\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(() => func(...args), delay);\n\t};\n}\n\n/**\n * Replaces all {{key}} in the template with the corresponding value from the data object.\n * If a key is missing in data, replaces with an empty string.\n */\nexport function renderTemplateString(\n\ttemplate: string,\n\tdata: Record<string, any>,\n): string {\n\treturn template.replace(/{{(\\w+)}}/g, (_, key) =>\n\t\tdata[key] !== undefined && data[key] !== null ? String(data[key]) : '',\n\t);\n}\n\n// Type-to-search buffer utility for keyboard navigation\nexport class TypeToSearchBuffer {\n\tprivate buffer: string = '';\n\tprivate lastTime: number = 0;\n\tprivate timeout: number;\n\n\tconstructor(timeout: number = 500) {\n\t\tthis.timeout = timeout;\n\t}\n\n\tpublic push(char: string) {\n\t\tconst now = Date.now();\n\t\tif (now - this.lastTime > this.timeout) {\n\t\t\tthis.buffer = '';\n\t\t}\n\t\tthis.buffer += char;\n\t\tthis.lastTime = now;\n\t}\n\n\tpublic getBuffer() {\n\t\treturn this.buffer;\n\t}\n\n\tpublic clear() {\n\t\tthis.buffer = '';\n\t}\n}\n\nexport function stringToElement(html: string): HTMLElement {\n\tconst template = document.createElement('template');\n\ttemplate.innerHTML = html.trim();\n\treturn template.content.firstElementChild as HTMLElement;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTImageInput } from './image-input';\nexport type {\n\tKTImageInputConfigInterface,\n\tKTImageInputInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTSelectConfigInterface, KTSelectOption } from './config';\nimport { renderTemplateString } from './utils';\n\n/**\n * Default HTML string templates for KTSelect. All UI structure is defined here.\n * Users can override any template by providing a matching key in the config.templates object.\n */\nexport const coreTemplateStrings = {\n\tdropdown: `<div data-kt-select-dropdown class=\"kt-select-dropdown hidden {{class}}\" style=\"z-index: {{zindex}};\"></div>`,\n\toptions: `<ul role=\"listbox\" aria-label=\"{{label}}\" class=\"kt-select-options {{class}}\" data-kt-select-options=\"true\"></ul>`,\n\terror: `<li class=\"kt-select-error\" role=\"alert\"></li>`,\n\twrapper: `<div data-kt-select-wrapper class=\"kt-select-wrapper {{class}}\"></div>`,\n\tcombobox: `\n\t\t<div data-kt-select-combobox data-kt-select-display class=\"kt-select-combobox {{class}}\">\n\t\t\t<div data-kt-select-combobox-values=\"true\" class=\"kt-select-combobox-values\"></div>\n\t\t\t<input class=\"kt-input kt-select-combobox-input\" data-kt-select-search=\"true\" type=\"text\" placeholder=\"{{placeholder}}\" role=\"searchbox\" aria-label=\"{{label}}\" {{disabled}} />\n\t\t\t<button type=\"button\" data-kt-select-clear-button=\"true\" class=\"kt-select-combobox-clear-btn\" aria-label=\"Clear selection\">\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n\t\t\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t</div>\n\t`,\n\tplaceholder: `<div data-kt-select-placeholder class=\"kt-select-placeholder {{class}}\"></div>`,\n\tdisplay: `\n\t\t<div data-kt-select-display class=\"kt-select-display {{class}}\" tabindex=\"{{tabindex}}\" role=\"button\" data-selected=\"0\" aria-haspopup=\"listbox\" aria-expanded=\"false\" aria-label=\"{{label}}\" {{disabled}}>\n\t\t\t<div class=\"kt-select-option-text\" data-kt-text-container=\"true\">{{text}}</div>\n\t\t</div>\n\t`,\n\toption: `\n\t\t<li data-kt-select-option data-value=\"{{value}}\" data-text=\"{{text}}\" class=\"kt-select-option {{class}}\" role=\"option\" {{selected}} {{disabled}}>\n\t\t\t<div class=\"kt-select-option-text\" data-kt-text-container=\"true\">{{text}}</div><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"size-3.5 ms-auto hidden text-primary kt-select-option-selected:block\"><path d=\"M20 6 9 17l-5-5\"/></svg>\n\t\t</li>\n\t`,\n\tsearch: `<div data-kt-select-search class=\"kt-select-search {{class}}\"><input type=\"text\" data-kt-select-search=\"true\" placeholder=\"{{searchPlaceholder}}\" class=\"kt-input kt-input-ghost\" role=\"searchbox\" aria-label=\"{{searchPlaceholder}}\"/></div>`,\n\tsearchEmpty: `<div data-kt-select-search-empty class=\"kt-select-search-empty {{class}}\"></div>`,\n\tloading: `<li class=\"kt-select-loading {{class}}\" role=\"status\" aria-live=\"polite\"></li>`,\n\ttag: `<div data-kt-select-tag=\"true\" class=\"kt-select-tag {{class}}\"></div>`,\n\tloadMore: `<li class=\"kt-select-load-more {{class}}\" data-kt-select-load-more=\"true\"></li>`,\n\tselectAll: `<div data-kt-select-select-all class=\"kt-select-select-all\"><button type=\"button\" class=\"kt-select-select-all-button\">{{text}}</button></div>`,\n\ttagRemoveButton: `<button type=\"button\" data-kt-select-remove-button class=\"kt-select-tag-remove\" aria-label=\"Remove tag\" tabindex=\"0\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"3\" y1=\"3\" x2=\"9\" y2=\"9\"/><line x1=\"9\" y1=\"3\" x2=\"3\" y2=\"9\"/></svg></button>`,\n};\n\n/**\n * Template interface for KTSelect component\n * Each method returns an HTML string or HTMLElement\n */\nexport interface KTSelectTemplateInterface {\n\t/**\n\t * Renders the dropdown content container\n\t */\n\tdropdown: (\n\t\tconfig: KTSelectConfigInterface & { zindex?: number; content?: string },\n\t) => HTMLElement;\n\t/**\n\t * Renders the options container\n\t */\n\toptions: (\n\t\tconfig: KTSelectConfigInterface & { options?: string },\n\t) => HTMLElement;\n\t/**\n\t * Renders the load more button for pagination\n\t */\n\tloadMore: (config: KTSelectConfigInterface) => HTMLElement;\n\t/**\n\t * Renders an error message in the dropdown\n\t */\n\terror: (\n\t\tconfig: KTSelectConfigInterface & { errorMessage: string },\n\t) => HTMLElement;\n\n\t// Main components\n\twrapper: (config: KTSelectConfigInterface) => HTMLElement;\n\tdisplay: (config: KTSelectConfigInterface) => HTMLElement;\n\n\t// Option rendering\n\toption: (\n\t\toption: KTSelectOption | HTMLOptionElement,\n\t\tconfig: KTSelectConfigInterface,\n\t) => HTMLElement;\n\n\t// Search and empty states\n\tsearch: (config: KTSelectConfigInterface) => HTMLElement;\n\tsearchEmpty: (config: KTSelectConfigInterface) => HTMLElement;\n\tloading: (\n\t\tconfig: KTSelectConfigInterface,\n\t\tloadingMessage: string,\n\t) => HTMLElement;\n\n\t// Multi-select\n\ttag: (\n\t\toption: HTMLOptionElement,\n\t\tconfig: KTSelectConfigInterface,\n\t) => HTMLElement;\n\n\tplaceholder: (config: KTSelectConfigInterface) => HTMLElement;\n\tselectAll: (config: KTSelectConfigInterface) => HTMLElement;\n}\n\n/**\n * Default templates for KTSelect component\n */\nfunction stringToElement(html: string): HTMLElement {\n\tconst template = document.createElement('template');\n\ttemplate.innerHTML = html.trim();\n\treturn template.content.firstElementChild as HTMLElement;\n}\n\n/**\n * User-supplied template overrides. Use setTemplateStrings() to add or update.\n */\nlet userTemplateStrings: Partial<typeof coreTemplateStrings> = {};\n\n/**\n * Register or update user template overrides.\n * @param templates Partial template object to merge with defaults.\n */\nexport function setTemplateStrings(\n\ttemplates: Partial<typeof coreTemplateStrings>,\n): void {\n\tuserTemplateStrings = { ...userTemplateStrings, ...templates };\n}\n\n/**\n * Get the complete template set, merging defaults, user overrides, and config templates.\n * @param config Optional config object with a \"templates\" property.\n */\nexport function getTemplateStrings(\n\tconfig?: KTSelectConfigInterface,\n): typeof coreTemplateStrings {\n\tconst templates =\n\t\tconfig && typeof config === 'object' && 'templates' in config\n\t\t\t? (config as any).templates\n\t\t\t: undefined;\n\n\tif (templates) {\n\t\treturn { ...coreTemplateStrings, ...userTemplateStrings, ...templates };\n\t}\n\n\treturn { ...coreTemplateStrings, ...userTemplateStrings };\n}\n\n/**\n * Default templates for KTSelect component\n */\nexport const defaultTemplates: KTSelectTemplateInterface = {\n\t/**\n\t * Renders the dropdown content\n\t */\n\tdropdown: (\n\t\tconfig: KTSelectConfigInterface & { zindex?: number; content?: string },\n\t) => {\n\t\tlet template = getTemplateStrings(config).dropdown;\n\t\t// If a custom dropdownTemplate is provided, it's responsible for its own content.\n\t\t// Otherwise, the base template is used, and content is appended later.\n\t\tif (config.dropdownTemplate) {\n\t\t\tconst renderedCustomTemplate = renderTemplateString(\n\t\t\t\tconfig.dropdownTemplate,\n\t\t\t\t{\n\t\t\t\t\tzindex: config.zindex ? String(config.zindex) : '',\n\t\t\t\t\t// content: config.content || '', // No longer pass content to custom template directly here\n\t\t\t\t\tclass: config.dropdownClass || '',\n\t\t\t\t},\n\t\t\t);\n\t\t\t// The custom template IS the dropdown element\n\t\t\tconst customDropdownEl = stringToElement(renderedCustomTemplate);\n\t\t\tif (config.zindex) customDropdownEl.style.zIndex = String(config.zindex);\n\t\t\tif (config.dropdownClass)\n\t\t\t\tcustomDropdownEl.classList.add(...config.dropdownClass.split(' '));\n\t\t\treturn customDropdownEl;\n\t\t}\n\n\t\tconst html = template\n\t\t\t.replace('{{zindex}}', config.zindex ? String(config.zindex) : '')\n\t\t\t// .replace('{{content}}', '') // Content is no longer part of the base template string\n\t\t\t.replace('{{class}}', config.dropdownClass || '');\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the options container for the dropdown\n\t */\n\toptions: (config: KTSelectConfigInterface & { options?: string }) => {\n\t\tconst template = getTemplateStrings(config).options;\n\t\tconst html = template\n\t\t\t.replace('{{label}}', config.label || 'Options')\n\t\t\t.replace('{{height}}', config.height ? String(config.height) : '250')\n\t\t\t// .replace('{{options}}', '') // Options are now appended dynamically\n\t\t\t.replace('{{class}}', config.optionsClass || '');\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the load more button for pagination\n\t */\n\tloadMore: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config)\n\t\t\t.loadMore // .replace('{{loadMoreText}}', config.loadMoreText || 'Load more...') // Content is no longer in template string\n\t\t\t.replace('{{class}}', config.loadMoreClass || '');\n\t\tconst element = stringToElement(html);\n\t\telement.textContent = config.loadMoreText || 'Load more...';\n\t\treturn element;\n\t},\n\t/**\n\t * Renders an error message in the dropdown\n\t */\n\terror: (\n\t\tconfig: KTSelectConfigInterface & { errorMessage: string },\n\t): HTMLElement => {\n\t\t// Changed return type to HTMLElement\n\t\tconst template = getTemplateStrings(config).error;\n\t\tconst html = template\n\t\t\t// .replace('{{errorMessage}}', config.errorMessage || 'An error occurred') // Content is no longer in template string\n\t\t\t.replace('{{class}}', config.errorClass || '');\n\t\tconst element = stringToElement(html);\n\t\telement.textContent = config.errorMessage || 'An error occurred';\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders the main container for the select component\n\t */\n\twrapper: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tconst html = getTemplateStrings(config).wrapper.replace(\n\t\t\t'{{class}}',\n\t\t\tconfig.wrapperClass || '',\n\t\t);\n\t\tconst element = stringToElement(html);\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders the display element (trigger) for the select\n\t */\n\tdisplay: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config)\n\t\t\t.display.replace('{{tabindex}}', config.disabled ? '-1' : '0')\n\t\t\t.replace('{{label}}', config.label || config.placeholder || 'Select...')\n\t\t\t.replace('{{disabled}}', config.disabled ? 'aria-disabled=\"true\"' : '')\n\t\t\t.replace('{{placeholder}}', config.placeholder || 'Select...')\n\t\t\t.replace('{{class}}', config.displayClass || '');\n\n\t\tconst element = stringToElement(html);\n\n\t\t// Add data-multiple attribute if in multiple select mode\n\t\tif (config.multiple) {\n\t\t\telement.setAttribute('data-multiple', 'true');\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders a single option\n\t */\n\toption: (\n\t\toption: KTSelectOption | HTMLOptionElement,\n\t\tconfig: KTSelectConfigInterface,\n\t): HTMLElement => {\n\t\tconst isHtmlOption = option instanceof HTMLOptionElement;\n\t\tlet optionData: Record<string, any>;\n\n\t\tif (isHtmlOption) {\n\t\t\t// If it's a plain HTMLOptionElement, construct data similarly to how KTSelectOption would\n\t\t\t// This branch might be less common if KTSelectOption instances are always used for rendering.\n\t\t\tconst el = option as HTMLOptionElement;\n\t\t\tconst textContent = el.textContent || '';\n\t\t\toptionData = {\n\t\t\t\tvalue: el.value,\n\t\t\t\ttext: textContent,\n\t\t\t\tselected: el.selected,\n\t\t\t\tdisabled: el.disabled, // This captures original disabled state\n\t\t\t\tcontent: textContent, // Default content to text\n\t\t\t\t// Attempt to get custom config for this specific option value if available\n\t\t\t\t...(config.optionsConfig?.[el.value] || {}),\n\t\t\t};\n\t\t} else {\n\t\t\t// If it's a KTSelectOption class instance (from './option')\n\t\t\t// which should have the getOptionDataForTemplate method.\n\t\t\toptionData = (\n\t\t\t\toption as import('./option').KTSelectOption\n\t\t\t).getOptionDataForTemplate();\n\t\t}\n\n\t\tlet content = optionData?.text?.trim(); // Default content to option's text\n\n\t\tif (config.optionTemplate) {\n\t\t\t// Use the user-provided template string, rendering with the full optionData.\n\t\t\t// renderTemplateString will replace {{key}} with values from optionData.\n\t\t\tcontent = renderTemplateString(config.optionTemplate, optionData);\n\t\t} else {\n\t\t\tcontent = optionData.text || optionData.content; // Prefer explicit text, fallback to content\n\t\t}\n\n\t\t// Use the core option template string as the base structure.\n\t\tconst baseTemplate = getTemplateStrings(config).option;\n\n\t\tconst optionClasses = [config.optionClass || ''];\n\t\tif (optionData.disabled) {\n\t\t\toptionClasses.push('disabled');\n\t\t}\n\n\t\t// Populate the base template for the <li> attributes.\n\t\t// The actual display content (text or custom HTML) will be set on the inner span later.\n\t\tconst html = renderTemplateString(baseTemplate, {\n\t\t\t...optionData, // Pass all data for {{value}}, {{text}}, {{selected}}, {{disabled}}, etc.\n\t\t\tclass: optionClasses.join(' ').trim() || '',\n\t\t\tselected: optionData.selected\n\t\t\t\t? 'aria-selected=\"true\"'\n\t\t\t\t: 'aria-selected=\"false\"',\n\t\t\tdisabled: optionData.disabled ? 'aria-disabled=\"true\"' : '',\n\t\t\tcontent: content, // This is for the {{content}} placeholder within the option template string itself\n\t\t});\n\n\t\tconst element = stringToElement(html);\n\n\t\t// If a custom option template is provided, replace the element's innerHTML with the content.\n\t\tif (config.optionTemplate) {\n\t\t\telement.innerHTML = content;\n\t\t}\n\n\t\t// Ensure data-text attribute is set to the original, clean text for searching/filtering\n\t\telement.setAttribute('data-text', optionData?.text?.trim() || '');\n\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders the search input\n\t */\n\tsearch: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config)\n\t\t\t.search.replace(\n\t\t\t\t'{{searchPlaceholder}}',\n\t\t\t\tconfig.searchPlaceholder || 'Search...',\n\t\t\t)\n\t\t\t.replace('{{class}}', config.searchClass || '');\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the no results message\n\t */\n\tsearchEmpty: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config).searchEmpty.replace(\n\t\t\t'{{class}}',\n\t\t\tconfig.searchEmptyClass || '',\n\t\t);\n\n\t\tlet content = config.searchEmpty || 'No results';\n\n\t\tif (config.searchEmptyTemplate) {\n\t\t\tcontent = renderTemplateString(config.searchEmptyTemplate, {\n\t\t\t\tclass: config.searchEmptyClass || '',\n\t\t\t});\n\t\t\tconst element = stringToElement(html);\n\t\t\telement.innerHTML = content; // For templates, content can be HTML\n\t\t\treturn element;\n\t\t} else {\n\t\t\tconst element = stringToElement(html);\n\t\t\telement.textContent = content; // For simple text, use textContent\n\t\t\treturn element;\n\t\t}\n\t},\n\n\t/**\n\t * Renders the loading state\n\t */\n\tloading: (\n\t\tconfig: KTSelectConfigInterface,\n\t\tloadingMessage: string,\n\t): HTMLElement => {\n\t\tlet html = getTemplateStrings(config).loading.replace(\n\t\t\t'{{class}}',\n\t\t\tconfig.loadingClass || '',\n\t\t);\n\t\tconst element = stringToElement(html);\n\t\telement.textContent = loadingMessage || 'Loading options...';\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders a tag for multi-select\n\t */\n\ttag: (\n\t\toption: HTMLOptionElement,\n\t\tconfig: KTSelectConfigInterface,\n\t): HTMLElement => {\n\t\tlet template = getTemplateStrings(config).tag;\n\t\tlet preparedContent =\n\t\t\toption.textContent || option.innerText || option.value || ''; // Default content is the option's text\n\n\t\tif (config.tagTemplate) {\n\t\t\tlet tagTemplateString = config.tagTemplate;\n\t\t\tconst optionValue = option.getAttribute('data-value') || option.value;\n\n\t\t\t// Replace all {{varname}} in option.innerHTML with values from _config.optionsConfig\n\t\t\tObject.entries(\n\t\t\t\t(config.optionsConfig as any)?.[optionValue] || {},\n\t\t\t).forEach(([key, val]) => {\n\t\t\t\tif (\n\t\t\t\t\ttypeof val === 'string' ||\n\t\t\t\t\ttypeof val === 'number' ||\n\t\t\t\t\ttypeof val === 'boolean'\n\t\t\t\t) {\n\t\t\t\t\ttagTemplateString = tagTemplateString.replace(\n\t\t\t\t\t\tnew RegExp(`{{${key}}}`, 'g'),\n\t\t\t\t\t\tString(val),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Render the custom tag template with option data\n\t\t\tpreparedContent = renderTemplateString(tagTemplateString, {\n\t\t\t\ttitle: option.title,\n\t\t\t\tid: option.id,\n\t\t\t\tclass: config.tagClass || '', // This class is for content, not the main tag div\n\t\t\t\t// content: option.innerHTML, // Avoid direct innerHTML from option due to potential XSS\n\t\t\t\ttext: option.innerText || option.textContent || '',\n\t\t\t\tvalue: optionValue,\n\t\t\t});\n\t\t}\n\n\t\t// Append the remove button HTML string to the prepared content\n\t\tpreparedContent += getTemplateStrings(config).tagRemoveButton;\n\n\t\tconst html = template\n\t\t\t// .replace('{{title}}', option.title) // Title is part of preparedContent if using custom template\n\t\t\t// .replace('{{id}}', option.id) // ID is part of preparedContent if using custom template\n\t\t\t.replace('{{class}}', config.tagClass || ''); // Class for the main tag div\n\n\t\tconst element = stringToElement(html);\n\t\telement.innerHTML = preparedContent; // Set the fully prepared content (text/HTML + remove button)\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders the placeholder for the select\n\t */\n\tplaceholder: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config).placeholder.replace(\n\t\t\t'{{class}}',\n\t\t\tconfig.placeholderClass || '',\n\t\t);\n\n\t\tlet content = config.placeholder || 'Select...';\n\n\t\tif (config.placeholderTemplate) {\n\t\t\tcontent = renderTemplateString(config.placeholderTemplate, {\n\t\t\t\tplaceholder: config.placeholder || 'Select...',\n\t\t\t\tclass: config.placeholderClass || '',\n\t\t\t});\n\t\t\tconst element = stringToElement(html);\n\t\t\telement.innerHTML = content; // For templates, content can be HTML\n\t\t\treturn element;\n\t\t} else {\n\t\t\tconst element = stringToElement(html);\n\t\t\telement.textContent = content; // For simple text, use textContent\n\t\t\treturn element;\n\t\t}\n\t},\n\n\tselectAll: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tconst template = getTemplateStrings(config).selectAll;\n\t\tconst element = stringToElement(\n\t\t\ttemplate.replace('{{text}}', config.selectAllText || 'Select All'),\n\t\t);\n\t\treturn element;\n\t},\n};\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTThemeSwitch } from './theme-switch';\nexport type {\n\tKTThemeSwitchConfigInterface,\n\tKTThemeSwitchInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { coreTemplateStrings } from './templates';\n\nexport const DefaultConfig: KTSelectConfigInterface = {\n\t// ...other config options\n\tloadMoreText: 'Load more...',\n\t// General Display\n\tdebug: false,\n\tplaceholder: 'Select an option', // Default placeholder text when no option is selected\n\n\t// Data Handling\n\titems: [], // Static list of options\n\tisLoading: false, // Indicates if options are being loaded asynchronously\n\tonFetch: null, // Callback function to fetch options asynchronously\n\n\t// Remote Data Configuration\n\tremote: false, // Enable/disable remote data fetching\n\tdataUrl: null, // URL to fetch options from\n\tapiDataProperty: null, // Property in the response object that contains the options\n\tremoteErrorMessage: 'Failed to load data', // Error message to display if remote data fetch fails\n\n\t// Field Mapping\n\tdataValueField: null, // Property in the option object that contains the value (default: 'id')\n\tdataFieldText: null, // Property in the option object that contains the text (default: 'title')\n\n\t// Search Configuration\n\tsearchParam: '', // Query parameter for API search requests\n\tsearchDebounce: 300, // Debounce delay for search (in ms)\n\n\t// Pagination Configuration\n\tpagination: false, // Enable/disable pagination for remote data\n\tpaginationLimit: 10, // Items per page\n\tpaginationPageParam: 'page', // Parameter name for page number\n\tpaginationLimitParam: 'limit', // Parameter name for items per page\n\tpaginationTotalParam: 'total', // Parameter name for total items\n\n\t// Selection Behavior\n\tallowClear: false, // Allow clearing the selection (if true, an empty value can be set)\n\tmultiple: false, // Enable/disable multi-select\n\tmaxSelections: null, // Maximum number of selections allowed in multi-select mode (null for unlimited)\n\tdisabled: false, // Disable the select component\n\tisRequired: false, // Make selection required\n\n\t// Search Functionality\n\tenableSearch: false, // Enable/disable search functionality within the dropdown\n\tsearchPlaceholder: 'Search...', // Placeholder text for the search input\n\tsearchAutofocus: true, // Autofocus on search input when dropdown opens\n\tsearchMinLength: 0, // Minimum characters required to trigger search\n\tsearchMaxItems: 50, // Maximum number of search results to display\n\tsearchEmpty: 'No results', // Text to display when no search results are found\n\tclearSearchOnClose: false, // Clear search input when dropdown closes (default: false to persist search text)\n\tcloseOnEnter: true, // Close dropdown when Enter is pressed in search input\n\n\t// Multi-Select Display\n\tselectAllText: 'Select all', // Text for the \"Select All\" option (if implemented)\n\tclearAllText: 'Clear all', // Text for the \"Clear All\" option (if implemented)\n\tenableSelectAll: false, // Enable/disable \"Select All\" button for multi-select\n\tshowSelectedCount: true, // Show the number of selected options in multi-select mode\n\trenderSelected: null, // Custom function to render the selected value(s) in the display area\n\n\t// Accessibility & Usability\n\tlabel: 'Select an option', // Label for the select component (for screen readers)\n\theight: 250, // Maximum height of the dropdown menu in pixels (if exceeded, a scrollbar will appear)\n\n\t// Dropdown Configuration\n\tdropdownZindex: 105, // Initial z-index value for the dropdown\n\tdropdownContainer: null, // Container element for the dropdown\n\tdropdownPlacement: null,\n\tdropdownFlip: false,\n\tdropdownPreventOverflow: false,\n\tdropdownStrategy: null,\n\tdropdownWidth: null, // Custom width for dropdown (e.g., '300px'), null to match toggle element width\n\tcloseOnOtherOpen: true, // Close other open dropdowns when this one opens\n\tdispatchGlobalEvents: true, // Dispatch events on document for global listeners (jQuery compatibility)\n\n\t// New Config\n\tdropdownTemplate: '',\n};\n\nexport interface KTSelectConfigInterface {\n\t// ...other config options\n\tloadMoreText?: string;\n\t// General Display\n\tdebug?: boolean;\n\tplaceholder?: string;\n\n\t// Selection Behavior\n\tallowClear?: boolean;\n\tmultiple?: boolean;\n\tmaxSelections?: number | null;\n\tdisabled?: boolean;\n\tisRequired?: boolean;\n\n\t// Search Functionality\n\tenableSearch?: boolean;\n\tsearchEmpty?: string;\n\tsearchPlaceholder?: string;\n\tsearchAutofocus?: boolean;\n\tsearchMinLength?: number;\n\tsearchMaxItems?: number;\n\tsearchDebounce?: number;\n\tsearchParam?: string;\n\tclearSearchOnClose?: boolean;\n\tcloseOnEnter?: boolean;\n\n\t// Multi-Select Display\n\tselectAllText?: string;\n\tclearAllText?: string;\n\tenableSelectAll?: boolean;\n\tshowSelectedCount?: boolean;\n\trenderSelected?: (selectedOptions: any[]) => string; // Assuming any[] for now, adjust based on your option data structure\n\n\t// Accessibility & Usability\n\tlabel?: string;\n\theight: number;\n\n\t// Data Handling\n\titems?: KTSelectOption[];\n\tisLoading?: boolean;\n\tonFetch?: (query?: string) => Promise<KTSelectOption[]>;\n\n\t// Remote Data Configuration\n\tremote?: boolean;\n\tdataUrl?: string;\n\tapiDataProperty?: string;\n\tremoteErrorMessage?: string;\n\n\t// Field Mapping\n\tdataValueField?: string;\n\tdataFieldText?: string;\n\n\t// Pagination Configuration\n\tpagination?: boolean;\n\tpaginationLimit?: number;\n\tpaginationPageParam?: string;\n\tpaginationLimitParam?: string;\n\tpaginationTotalParam?: string;\n\n\t// Dropdown Configuration\n\tdropdownZindex?: number | null;\n\tdropdownContainer?: string | null;\n\tdropdownPlacement?: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';\n\tdropdownFlip?: boolean;\n\tdropdownPreventOverflow?: boolean;\n\tdropdownStrategy?: 'fixed' | 'absolute';\n\tdropdownWidth?: string | null; // Custom width for dropdown, null to match toggle element width\n\tcloseOnOtherOpen?: boolean;\n\tdispatchGlobalEvents?: boolean;\n\n\t// Styling\n\tdropdownClass?: string;\n\tdisplayClass?: string;\n\toptionsClass?: string;\n\tsearchClass?: string;\n\tsearchEmptyClass?: string;\n\tloadingClass?: string;\n\ttagClass?: string;\n\tloadMoreClass?: string;\n\twrapperClass?: string;\n\terrorClass?: string;\n\n\t// New Config\n\ttags?: boolean;\n\tcombobox?: boolean;\n\tmaxSelection?: number;\n\tplaceholderClass?: string;\n\tplaceholderTemplate?: string;\n\tdisplaySeparator?: string;\n\tdisplayTemplate?: string;\n\tdisplayMaxSelected?: number;\n\toptionTemplate?: string;\n\toptionClass?: string;\n\ttagTemplate?: string;\n\tdropdownTemplate?: string;\n\tsearchEmptyTemplate?: string;\n\n\ttemplates?: Partial<typeof coreTemplateStrings>;\n\n\t// Option Configuration\n\tconfig?: KTSelectConfigInterface; // config from data-kt-select-config attribute\n\toptionsConfig?: Record<string, KTSelectConfigInterface>;\n}\n\nexport interface KTSelectOption {\n\tid: string;\n\ttitle: string;\n\tselected?: boolean;\n\tdisabled?: boolean;\n}\n\nexport class KTSelectState {\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _selectedOptions: string[] = [];\n\n\tconstructor(config?: KTSelectConfigInterface) {\n\t\tthis._config = this._initDefaultConfig(config);\n\t}\n\n\tprivate _initDefaultConfig(\n\t\tconfig: KTSelectConfigInterface,\n\t): KTSelectConfigInterface {\n\t\treturn {\n\t\t\t...DefaultConfig,\n\t\t\t...config,\n\t\t\t...config.config,\n\t\t};\n\t}\n\n\tpublic setItems(items?: any[], query?: string): Promise<void> {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tif (items) {\n\t\t\t\tthis._config.items = items;\n\t\t\t\tresolve();\n\t\t\t} else if (this._config.dataUrl) {\n\t\t\t\tthis._fetchRemoteData(query)\n\t\t\t\t\t.then(resolve) // Resolve after _fetchRemoteData completes\n\t\t\t\t\t.catch(reject);\n\t\t\t} else if (this._config.onFetch) {\n\t\t\t\tthis._config.isLoading = true;\n\t\t\t\tthis._config\n\t\t\t\t\t.onFetch(query)\n\t\t\t\t\t.then((items) => {\n\t\t\t\t\t\tthis._config.items = items;\n\t\t\t\t\t\tresolve(); // Resolve after onFetch completes\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tconsole.error('Error fetching data:', error);\n\t\t\t\t\t\treject(error); // Reject on error\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tthis._config.isLoading = false;\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _fetchRemoteData(query?: string): Promise<void> {\n\t\tthis._config.isLoading = true; // Show loading indicator\n\n\t\tlet url = this._config.dataUrl!;\n\t\tif (query) {\n\t\t\turl += `?${this._config.searchParam}=${encodeURIComponent(query)}`;\n\t\t}\n\n\t\treturn fetch(url)\n\t\t\t.then((response) => response.json())\n\t\t\t.then((data) => {\n\t\t\t\tif (this._config.apiDataProperty) {\n\t\t\t\t\t// Extract the data property from the response\n\t\t\t\t\tif (this._config.apiDataProperty in data) {\n\t\t\t\t\t\tdata = data[this._config.apiDataProperty];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t'Error fetching data:',\n\t\t\t\t\t\t\t`Property '${this._config.apiDataProperty}' not found in response`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis._config.items = data;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error fetching data:', error);\n\t\t\t\t// Handle error (e.g., display an error message)\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis._config.isLoading = false; // Hide loading indicator\n\t\t\t});\n\t}\n\n\tpublic getItems(): KTSelectOption[] {\n\t\treturn this._config.items || [];\n\t}\n\n\tpublic setItemsFromOptions(options: HTMLOptionElement[]): void {\n\t\tthis._config.items = options.map((option) => {\n\t\t\tconst item: KTSelectOption = {\n\t\t\t\tid: option.value,\n\t\t\t\ttitle: option.textContent || option.value, // Use value as fallback for title\n\t\t\t\t// 'selected' property will be definitively set by _preSelectOptions\n\t\t\t\tdisabled: option.disabled,\n\t\t\t};\n\t\t\treturn item;\n\t\t});\n\t\t// The 'selected' status of these items and the overall component selection state\n\t\t// are now fully managed by _preSelectOptions in KTSelect during initialization.\n\t}\n\n\tpublic getConfig(): KTSelectConfigInterface {\n\t\treturn this._config;\n\t}\n\n\tpublic setSelectedOptions(value: string | string[]): void {\n\t\t// Handle empty array case first to prevent undefined elements\n\t\tif (Array.isArray(value) && value.length === 0) {\n\t\t\tthis._selectedOptions = [];\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tthis._config.multiple &&\n\t\t\ttypeof value === 'string' &&\n\t\t\t!this._selectedOptions.includes(value)\n\t\t) {\n\t\t\tthis._selectedOptions.push(value);\n\t\t} else if (!this._config.multiple) {\n\t\t\t// For single select, replace the previous selection with the new one\n\t\t\tthis._selectedOptions = typeof value === 'string' ? [value] : [value[0]];\n\t\t} else if (this._config.multiple && Array.isArray(value)) {\n\t\t\t// For multiple select with array input, use the provided array\n\t\t\tthis._selectedOptions = [...value];\n\t\t}\n\t}\n\n\tpublic toggleSelectedOptions(value: string): void {\n\t\tif (!this._config.multiple) {\n\t\t\t// For non-multiple, always set the new value\n\t\t\tthis._selectedOptions = [value];\n\t\t\treturn;\n\t\t}\n\n\t\t// For multiple selection, toggle the value\n\t\tconst index = this._selectedOptions.indexOf(value);\n\t\tif (index > -1) {\n\t\t\tthis._selectedOptions.splice(index, 1);\n\t\t} else {\n\t\t\tthis._selectedOptions.push(value);\n\t\t}\n\t}\n\n\tpublic getSelectedOptions(): string[] {\n\t\treturn this._selectedOptions;\n\t}\n\n\tpublic isSelected(value: string): boolean {\n\t\treturn this._selectedOptions.includes(value);\n\t}\n\n\tpublic modifyConfig(config: Partial<KTSelectConfigInterface>): void {\n\t\tthis._config = { ...this._config, ...config };\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTScrollspyInterface, KTScrollspyConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_SCROLLSPY_INITIALIZED: boolean;\n\t\tKTScrollspy: typeof KTScrollspy;\n\t}\n}\n\nexport class KTScrollspy extends KTComponent implements KTScrollspyInterface {\n\tprotected override _name: string = 'scrollspy';\n\tprotected override _defaultConfig: KTScrollspyConfigInterface = {\n\t\ttarget: 'body',\n\t\toffset: 0,\n\t\tsmooth: true,\n\t};\n\tprotected override _config: KTScrollspyConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement | Document | null = null;\n\tprotected _anchorElements: NodeListOf<HTMLElement> | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTScrollspyConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\n\t\tconst targetElement =\n\t\t\tthis._getTarget() === 'body'\n\t\t\t\t? document\n\t\t\t\t: KTDom.getElement(this._getTarget());\n\t\tif (!targetElement) return;\n\n\t\tthis._targetElement = targetElement;\n\n\t\tthis._anchorElements = this._element.querySelectorAll(\n\t\t\t'[data-kt-scrollspy-anchor]',\n\t\t);\n\n\t\tif (!this._anchorElements) return;\n\n\t\tthis._handlers();\n\t\tthis._update();\n\t}\n\n\tprivate _getTarget(): string {\n\t\treturn (\n\t\t\t(this._element.getAttribute('data-kt-scrollspy-target') as string) ||\n\t\t\t(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._anchorElements) return;\n\n\t\tthis._targetElement.addEventListener('scroll', () => {\n\t\t\tthis._anchorElements.forEach((anchorElement) => {\n\t\t\t\tthis._updateAnchor(anchorElement);\n\t\t\t});\n\t\t});\n\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-scrollspy-anchor]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._scrollTo(target);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _scrollTo(anchorElement: HTMLElement): void {\n\t\tif (!anchorElement) return;\n\n\t\tconst sectionElement = KTDom.getElement(anchorElement.getAttribute('href'));\n\t\tif (!sectionElement) return;\n\n\t\tconst targetElement =\n\t\t\tthis._targetElement === document ? window : this._targetElement;\n\t\tif (!targetElement) return;\n\n\t\tlet offset = parseInt(this._getOption('offset') as string);\n\t\tif (anchorElement.getAttribute('data-kt-scrollspy-anchor-offset')) {\n\t\t\toffset = parseInt(\n\t\t\t\tanchorElement.getAttribute('data-kt-scrollspy-anchor-offset') as string,\n\t\t\t);\n\t\t}\n\n\t\tconst scrollTop = sectionElement.offsetTop - offset;\n\n\t\tif ('scrollTo' in targetElement) {\n\t\t\ttargetElement.scrollTo({\n\t\t\t\ttop: scrollTop,\n\t\t\t\tleft: 0,\n\t\t\t\tbehavior: this._getOption('smooth') ? 'smooth' : 'instant',\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _updateAnchor(anchorElement: HTMLElement): void {\n\t\tconst sectionElement = KTDom.getElement(anchorElement.getAttribute('href'));\n\t\tif (!sectionElement) return;\n\n\t\tif (!KTDom.isVisible(anchorElement)) return;\n\n\t\tif (!this._anchorElements) return;\n\n\t\tconst scrollPosition =\n\t\t\tthis._targetElement === document\n\t\t\t\t? document.documentElement.scrollTop || document.body.scrollTop\n\t\t\t\t: (this._targetElement as HTMLElement).scrollTop;\n\n\t\tlet offset = parseInt(this._getOption('offset') as string);\n\t\tif (anchorElement.getAttribute('data-kt-scrollspy-anchor-offset')) {\n\t\t\toffset = parseInt(\n\t\t\t\tanchorElement.getAttribute('data-kt-scrollspy-anchor-offset') as string,\n\t\t\t);\n\t\t}\n\n\t\tconst offsetTop = sectionElement.offsetTop;\n\n\t\tif (scrollPosition + offset >= offsetTop) {\n\t\t\tthis._anchorElements.forEach((anchorElement) => {\n\t\t\t\tanchorElement.classList.remove('active');\n\t\t\t});\n\n\t\t\tconst payload = { element: anchorElement };\n\t\t\tthis._fireEvent('activate', payload);\n\t\t\tthis._dispatchEvent('activate', payload);\n\n\t\t\tanchorElement.classList.add('active');\n\n\t\t\tconst parentAnchorElements = KTDom.parents(\n\t\t\t\tanchorElement,\n\t\t\t\t'[data-kt-scrollspy-group]',\n\t\t\t);\n\t\t\tif (parentAnchorElements) {\n\t\t\t\tparentAnchorElements.forEach((parentAnchorElement) => {\n\t\t\t\t\tparentAnchorElement\n\t\t\t\t\t\t.querySelector('[data-kt-scrollspy-anchor]')\n\t\t\t\t\t\t?.classList.add('active');\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _update() {\n\t\tif (!this._anchorElements) return;\n\n\t\tthis._anchorElements.forEach((anchorElement) => {\n\t\t\tthis._updateAnchor(anchorElement);\n\t\t});\n\t}\n\n\tprotected _isActive(anchorElement: HTMLElement): boolean {\n\t\treturn anchorElement.classList.contains('active');\n\t}\n\n\tpublic updateAnchor(anchorElement: HTMLElement): void {\n\t\tthis._updateAnchor(anchorElement);\n\t}\n\n\tpublic isActive(anchorElement: HTMLElement): boolean {\n\t\treturn this._isActive(anchorElement);\n\t}\n\n\tpublic update(): void {\n\t\tthis.update();\n\t}\n\n\tpublic scrollTo(anchorElement: HTMLElement): void {\n\t\tthis._scrollTo(anchorElement);\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTScrollspy {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'scrollspy')) {\n\t\t\treturn KTData.get(element, 'scrollspy') as KTScrollspy;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-scrollspy')) {\n\t\t\treturn new KTScrollspy(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTScrollspyConfigInterface,\n\t): KTScrollspy {\n\t\treturn this.getInstance(element) || new KTScrollspy(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-scrollspy]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTScrollspy(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTScrollspy.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTScrollspy = KTScrollspy;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(8156);\n"],"names":["root","factory","exports","module","define","amd","a","i","self","KTSelect","KTSelectRemote","KTSelectCombobox","KTSelectSearch","KTSelectTags","KTSelectDropdown","filterOptions","FocusManager","EventManager","TypeToSearchBuffer","element","config","_name","_defaultConfig","mode","target","has","_init","_buildConfig","_update","this","_element","_getOption","targetEl","getElement","parentNode","prepend","append","update","handleResize","window","addEventListener","throttle","timer","document","querySelectorAll","forEach","reparent","KTReparent","getInstance","console","log","get","getOrCreateInstance","createInstances","init","KT_REPARENT_INITIALIZED","zindex","enable","class","shownClass","hiddenClass","backdrop","backdropClass","backdropStatic","keyboard","disableScroll","persistent","container","focus","_config","_isOpen","_isTransitioning","_backdropElement","_relatedTarget","_handleClose","_handleContainer","on","_hide","_toggle","relatedTarget","payload","cancel","_fireEvent","_dispatchEvent","_show","KTDrawer","hide","_createBackdrop","classList","remove","add","setAttribute","parseInt","style","zIndex","body","overflow","reflow","transitionEnd","_autoFocus","removeAttribute","_deleteBackdrop","length","isEnabled","addClass","removeClass","appendChild","querySelector","input","createElement","toString","event","preventDefault","opacity","_isEnabled","stringToBoolean","toggle","show","getRelatedTarget","isOpen","getAttribute","drawer","handleToggle","stopPropagation","selector","drawerEl","handleDismiss","modalElement","closest","modal","handleClickAway","getOption","contains","handleKeyword","key","ctrlKey","altKey","shiftKey","code","metaKey","KT_DRAWER_INITIALIZED","KTSticky","activeStep","_activeStep","_nextElement","_backElement","_go","_handlers","_goNext","_goBack","error","state","_getTotalSteps","_getItemElements","index","contentElement","numberElement","innerHTML","String","elements","isVisible","push","step","_goTo","itemElement","_getStep","_getItemElement","_goLast","_goFirst","_isLast","_isFirst","isLast","isFirst","go","goTo","goFirst","goLast","goNext","goBack","getStep","getItemElement","getTotalSteps","getItemElements","KTStepper","activeClass","attribute","_targetElement","_getTargetElement","_isActive","hasClass","hasAttribute","isActive","KTToggle","_currentTabElement","_currentContentElement","_lastTabElement","_lastContentElement","_tabElements","tabElement","_isShown","_getDropdownToggleElement","containerElement","isShown","keyboardArrow","keyboardJump","handleAccessibility","KTTabs","KT_TABS_INITIALIZED","_isAnimating","_expand","height","scrollHeight","_collapse","expand","collapse","KTCollapse","trigger","placement","placementRtl","strategy","offset","offsetRtl","delayShow","delayHide","permanent","_transitioning","_timeout","clearTimeout","setTimeout","_createPopper","_setZindex","_popper","destroy","isRtl","isRTL","offsetValue","split","map","value","trim","createPopper","modifiers","name","options","getCssProp","getHighestZindex","getContentElement","getTriggerOption","isPermanent","initHandlers","tooltipElement","tooltip","KTTooltip","KT_TOOLTIP_INITIALIZED","KTScrollable","KTTogglePassword","KTUtils","geUID","prefix","Math","floor","random","Date","getTime","getCssVar","variable","hex","getComputedStyle","documentElement","getPropertyValue","parseDataAttribute","Number","parseJson","JSON","parse","decodeURIComponent","parseSelector","CSS","escape","replace","match","id","capitalize","charAt","toUpperCase","slice","uncapitalize","toLowerCase","camelCase","letter","camelReverseCase","str","htmlElement","Boolean","func","delay","checksum","hash","charCodeAt","cleanedStr","stringToObject","parsed","Array","isArray","stringToInteger","isNaN","num","stringToFloat","parseFloat","KTDataTable","_dataOptionPrefix","_uid","_events","Map","set","eventType","callbacks","Promise","all","from","values","filter","callable","resolve","CustomEvent","detail","bubbles","cancelable","composed","dispatchEvent","_getGlobalConfig","KTGlobalComponentsConfig","getDataAttributes","dispose","callback","eventId","off","delete","KTAccordion","_previewUrl","_selectedFile","_inputElement","_hiddenElement","_removeElement","_previewElement","click","_change","_remove","reader","FileReader","onload","backgroundImage","result","readAsDataURL","files","_lastMode","_setPreviewUrl","_getPreviewUrl","url","isEmpty","isChanged","setPreviewUrl","getPreviewUrl","getSelectedFile","KTImageInput","top","middle","bottom","start","center","end","width","reverse","release","activate","_releaseElement","_activateElement","_wrapperElement","_attributeRoot","_eventTriggerState","_lastScrollTop","targetElement","_getTarget","_process","_getOffset","_disable","st","getScrollTop","scrollTop","isPartiallyInViewport","_enable","active","activateElement","abs","offsetTop","_calculateHeight","getViewPort","round","insetBlockStart","insetBlockEnd","insetInlineStart","offsetLeft","left","offsetRight","right","insetInlineEnd","position","KTModal","_isLoading","_hasError","_errorMessage","_currentPage","_totalPages","_lastQuery","fetchData","query","page","_buildUrl","fetch","then","response","ok","Error","status","json","data","_processData","catch","remoteErrorMessage","finally","eventName","isLoading","hasError","errorMessage","dataUrl","params","URLSearchParams","searchParam","pagination","limitParam","paginationLimitParam","pageParam","paginationPageParam","limit","paginationLimit","paramsString","includes","processedData","apiDataProperty","total_pages","total","ceil","item","mappedItem","_mapItemToOption","dataValueField","nestedValue","part","expectedValue","warn","valueField","labelField","dataFieldText","getValue","obj","path","parts","field","undefined","substr","title","selected","disabled","loadNextPage","hasMorePages","getErrorMessage","reset","setElement","smooth","parent","_scroll","pos","scrollTo","behavior","scroll","KTScrollto","auto","basePlacements","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","concat","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isElement","Element","isHTMLElement","HTMLElement","isShadowRoot","ShadowRoot","enabled","phase","fn","_ref","Object","keys","styles","attributes","assign","effect","_ref2","initialStyles","margin","arrow","hasOwnProperty","property","requires","getBasePlacement","max","min","getUAString","uaData","navigator","userAgentData","brands","brand","version","join","userAgent","isLayoutViewport","test","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","offsetHeight","visualViewport","addVisualOffsets","x","y","getLayoutRect","child","rootNode","getRootNode","next","isSameNode","host","isTableElement","indexOf","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mergePaddingObject","paddingObject","expandToHashMap","hashMap","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","len","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","instance","_options$scroll","_options$resize","resize","scrollParents","scrollParent","removeEventListener","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflowX","overflowY","getScrollParent","listScrollParents","list","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","direction","getDocumentRect","getClippingRect","boundary","rootBoundary","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","flipVariations","allowedAutoPlacements","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","placements","_options$allowedAutoP","allowedPlacements","overflows","sort","b","computeAutoPlacement","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","find","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","v","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","order","visited","Set","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","arguments","args","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref$options","cleanupFn","noopFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","onFirstUpdate","eventListeners","_globalConfig","optionsConfig","getHTMLOptionElement","textContent","getOptionDataForTemplate","el","text","content","render","defaultTemplates","option","KTSelectOption","_mode","_currentMode","_setMode","localStorage","getItem","currentMode","_getSystemMode","_bindMode","_updateState","setItem","_getMode","matchMedia","matches","checked","getMode","setMode","KTThemeSwitch","save","dependencies","wrappers","_elementId","_setupHeight","_setupState","heightType","_getHeightType","_getHeight","setProperty","stateEnabled","elementIdExists","storedPosition","_getHeightOption","_getAutoHeight","_getElementSpacing","_getElementHeight","computedStyle","marginTop","marginBottom","borderTopWidth","borderBottomWidth","spacing","paddingTop","paddingBottom","getHeight","KT_SCROLLABLE_INITIALIZED","KTDropdown","KTDelegatedEventHandlers","KTEventHandler","handler","targets","j","call","expandAll","accordionElement","toggleElement","_hideSiblings","siblings","sibling","theadElement","getState","setState","fireEvent","updateData","toggleSortOrder","currentField","currentOrder","newField","setSortIcon","sortField","sortOrder","sortClass","classes","asc","desc","th","sortElement","base","className","initSort","header","cellIndex","sortData","aText","bText","compareValues","KTScrollspy","select","_select","getConfig","displayElement","getDisplayElement","_searchInputElement","_clearButtonElement","_valuesContainerElement","_boundInputHandler","_handleComboboxInput","bind","_boundClearHandler","_handleClearButtonClick","_attachEventListeners","multiple","displayTemplate","updateDisplay","getSelectedOptions","_toggleClearButtonVisibility","_removeEventListeners","isDropdownOpen","openDropdown","_filterOptionsForCombobox","clearSelection","showAllOptions","inputValue","hasSelectedItems","getOptionsElement","dropdownElement","getDropdownElement","_focusManager","focusFirst","selectedOptions","tags","optionElement","tagElement","tag","placeholder","renderDisplayTemplateForSelected","optionEl","selectedValue","headerChecked","headerCheckElement","targetElements","preserveSelection","checkbox","getSelectedRows","_state","selectedRows","setSelectedRows","rows","checkboxListener","checkboxToggle","isChecked","change","updateHeaderCheckboxState","reapplyCheckedStates","row","checkedClass","indeterminate","wasChecked","isNowChecked","handleRowCheckboxChange","uncheck","getChecked","updateState","KTToast","_originalTbodyClass","_originalTrClasses","_originalTheadClass","_originalTdClasses","_originalThClasses","_data","_isFetching","_abortController","_requestId","_initDefaultConfig","_initElements","_checkbox","createCheckboxHandler","eventData","_sortHandler","createSortHandler","_theadElement","_updateData","stateSave","_deleteState","_loadState","requestMethod","requestHeaders","info","infoEmpty","pageSizes","pageSize","pageMore","pageMoreLimit","number","previous","more","search","loading","template","table","size","spinner","loadingClass","_tableElement","_tbodyElement","tBodies","createTBody","tHead","_storeOriginalClasses","_infoElement","_sizeElement","_paginationElement","thElements","originalRows","rowIndex","tdElements","td","_showSpinner","apiEndpoint","_fetchDataFromLocal","_finalize","_fetchDataFromServer","_attachSearchEvent","_hideSpinner","tableId","_tableId","searchElement","_debouncedSearch","debouncedSearch","_debounce","originalData","_tableConfigInvalidate","_localTableHeaderInvalidate","_localTableContentInvalidate","_localExtractTableContent","originalDataAttributes","_temp","endIndex","startIndex","totalItems","_draw","stringify","_contentChecksum","restConfig","_configChecksum","ths","dataRow","colName","currentRequestId","queryParams","_getQueryParamsForFetchRequest","_performFetchRequest","responseData","statusText","mapResponse","totalCount","filters","column","type","mapRequest","requestBody","abort","AbortController","apiEndpointWithQueryParams","_createUrl","method","headers","requestCredentials","credentials","signal","reject","_noticeOnTable","pathOrUrl","baseUrl","location","origin","URL","normalizedPath","startsWith","totalPages","_dispose","_updateTable","_updatePagination","_saveState","removeChild","tbodyElement","_updateTableContent","fragment","createDocumentFragment","columns","colIndex","columnDef","DocumentFragment","createdCell","prototype","attr","message","cell","insertRow","insertCell","colSpan","_removeChildElements","_createPageSizeControls","_createPaginationControls","firstChild","onchange","_reloadPageSize","_setPaginationInfoText","paginationContainer","_createPaginationContainer","_createPaginationButtons","currentPage","createButton","handleClick","button","onclick","_paginateData","pageMoreEnabled","maxButtons","_calculatePageRange","startPage","endPage","halfMaxButtons","isInteger","_createSpinner","display","ns","_tableNamespace","stateString","removeItem","stateNamespace","replaceWith","cloneNode","wait","timeout","goPage","setPageSize","reload","redraw","showSpinner","hideSpinner","setFilter","f","_instances","currentTarget","getTargetElement","KT_MODAL_INITIALIZED","ktSelectInstance","_popperInstance","_toggleElement","_dropdownElement","_ktSelectInstance","modalParent","_getModalContainer","isCenteredModal","_resolveDropdownContainer","parentElement","_eventManager","_setupEventListeners","addListener","_handleToggleClick","_handleOutsideClick","closeDropdown","_setDropdownWidth","dropdownWidth","toggleWidth","_getModalBoundary","_getPositioningStrategy","dropdownStrategy","_initPopper","_destroyPopper","dropdownPlacement","dropdownPreventOverflow","flip","dropdownFlip","_parseOffset","updatePosition","open","zIndexToApply","dropdownZindex","currentDropdownZIndexStr","currentDropdownZIndex","toggleParentContextZindex","close","transitionComplete","fallbackTimer","completeTransition","removeAllListeners","containerSelector","dropdownContainer","debug","interrupt","_dismiss","dismiss","KTDismiss","_triggerElement","_isVisible","_setVisible","flag","setVisible","_noResultsElement","_originalOptionContents","_searchInput","getSearchInput","handleSearchInput","_handleSearchInput","_cacheOriginalOptionContents","enableSearch","_handleSearchKeyDown","_resetAllOptions","clearSearch","remote","resetFocus","refreshOptionCache","getWrapperElement","clearSearchOnClose","_clearNoResultsMessage","closeOnEnter","_filterOptions","searchAutofocus","_focusSearchInputWithRetry","updateSelectAllButtonState","attempt","focusAttempt","activeElement","focusNext","focusPrevious","firstAvailableOption","optionValue","toggleSelection","clear","_restoreOptionContentsBeforeFilter","originalContent","searchMinLength","count","_handleNoResults","visibleOptionsCount","_showNoResultsMessage","searchEmpty","optionsContainer","optionsToClear","refreshAfterSearch","_optionsContainer","_dropdownIsOpen","_comboboxModule","_tagsModule","_dropdownModule","_loadMoreIndicator","_selectAllButton","_selectAllButtonToggle","_typeToSearchBuffer","_mutationObserver","_preSelectedValues","_searchDebounceTimeout","_originalOptionsHtml","KTSelectState","_remoteModule","_initializeRemoteData","setItems","_setupComponent","globalConfig","dispatchGlobalEvents","namespacedEventType","globalEvent","_createHtmlStructure","_setupElementReferences","_renderLoadingState","items","_clearExistingOptions","_generateOptionsHtml","_updateDropdownWithNewOptions","_completeRemoteSetup","_addLoadMoreButton","_renderErrorState","opt","_renderOptionsInDropdown","optionsData","clearContainer","_dropdownContentElement","optionData","HTMLOptionElement","dataItem","renderedOption","_preSelectOptions","validPreSelectedValues","valuesToSelect","existingSelections","setSelectedOptions","updateSelectedOptionDisplay","_updateSelectedOptionClass","_applyInitialDisabledState","_initializeSearchModule","combobox","_displayElement","_updateDisplayAndAriaAttributes","_setAriaAttributes","_focusSelectedOption","_observeNativeSelect","_showDropdownMessage","loadMore","_handleLoadMore","newItems","existingItems","getItems","_updateOptionsInDropdown","loadMoreText","loadMoreButton","selectOption","insertBefore","wrapperElement","wrapper","originalClasses","classesForWrapper","classesForDisplay","dropdown","enableSelectAll","selectAllElement","selectAll","after","nextElementSibling","searchWrapper","_handleDocumentClick","_handleDropdownOptionClick","_handleSelectAllClick","_handleKeyboardEvent","_searchModule","_handleRemoteSearch","extractedValue","_getValueByKey","label","extractedLabel","o","k","_selectOption","preSelectedValues","closeOnOtherOpen","openDropdowns","otherSelect","isOther","dropdownShowEvent","dropdownCloseEvent","updateDropdownPosition","focusOptionByValue","_isOptionDisabled","isSelected","toggleSelectedOptions","_syncNativeSelectValue","tagsEnabled","valueDisplayEl","getValueDisplayElement","updateTagsDisplay","renderSelected","placeholderEl","replaceChildren","getSelectedOptionsText","_isOptionOriginallyDisabled","originalOption","allOptions","selectedValues","maxReached","maxSelections","isOriginallyDisabled","selectFocusedOption","focusedOption","getFocusedOption","dataset","titleElement","_handleOptionClick","clickedOption","styleAttr","enableMultiSelect","modifyConfig","disableMultiSelect","disable","newOptions","currentlySelected","availableValues","validSelections","_rebuildOptionsFromNative","_syncSelectionFromNative","refresh","_restoreOriginalOptions","_renderSearchLoadingState","_updateSearchResults","_renderSearchErrorState","searchDebounce","_updateOriginalSelectWithSearchResults","noResultsElement","displaySeparator","dropdownOption","isDropdownDisabled","isNativeDisabled","defaultPrevented","focusManager","buffer","repeat","focusLast","focusedOptionEl","val","blur","getBuffer","focusByString","entries","RegExp","renderTemplateString","selectedCount","selectedTexts","MutationObserver","mutations","needsRebuild","needsSelectionSync","mutation","attributeName","observe","childList","subtree","attributeFilter","visibleOptions","getVisibleOptions","visibleValues","isAllSelected","clearAllText","selectAllText","KTComponents","ready","hoverTimeout","attach","_disabled","_menuElement","_setupNestedDropdowns","subToggle","subItem","subMenu","_click","_mouseover","_mouseout","parentZindex","_getPopperConfig","_isDropdownOpen","_getToggleElement","_getContentElement","mouseover","mouseout","getToggleElement","findElement","skipElement","handleKeyboard","dropdownEl","handleMouseover","handleMouseout","KT_DROPDOWN_INITIALIZED","KTElementMap","KTData","valueMap","_valueDisplayElement","optionElements","originalOptions","closeButton","_removeTag","DEFAULT_CONFIG","duration","maxToasts","gap","DEFAULT_TOAST_OPTIONS","appearance","progress","action","_defaultToastOptions","getContent","classNames","outerHTML","icon","toolbar","actions","requestAnimationFrame","positionGroups","children","toast","currentOffset","transition","inputOptions","now","containerMap","firstElementChild","success","warning","primary","secondary","destructive","mono","variant","solid","outline","light","sm","md","lg","role","contentHtml","actionBtn","onClick","e","cancelBtn","dismissBtn","important","pointerEvents","animationDuration","directionClassMap","cls","dirClass","currentToasts","oldestToast","oldestId","beep","AudioContext","webkitAudioContext","createOscillator","g","createGain","frequency","gain","connect","destination","stop","_fireEventOnElement","_dispatchEventOnElement","timeoutId","toasts","startTime","remaining","paused","progressEl","ms","onAutoClose","pauseOnHover","matrix","animation","clearAll","clearContainers","idOrInstance","inst","_closing","onDismiss","KTDom","prop","setCssProp","innerWidth","innerHeight","getIndex","parents","childNodes","l","nodeType","getClientRects","isDisabled","Node","ELEMENT_NODE","getCSSTransitionDuration","animationEnd","getCSSAnimationDuration","transitionDuration","insertAfter","referenceNode","nextSibling","isParentOrElementHidden","scrollingElement","isInViewport","ww","hw","w","h","isVisibleInParent","childRect","parentRect","visibility","isVisibleVertically","isVisibleHorizontally","getRelativeTopPosition","normalizedKey","readyState","Intl","NumberFormat","currency","format","onVisibleCount","queryLower","_","optionsSelector","_focusedOptionIndex","_onFocusChange","_optionsSelector","_setupOptionClickHandlers","_focusClass","_hoverClass","applyFocus","scrollIntoView","lowerStr","startIdx","idx","_triggerFocusChange","optionRect","containerRect","block","findIndex","optionToFocus","getFocusedIndex","setFocusedIndex","setOnFocusChange","cb","_boundHandlers","context","boundHandler","removeListener","eventMap","lastTime","char","templates","userTemplateStrings","stringToElement","coreTemplateStrings","tagRemoveButton","getTemplateStrings","dropdownTemplate","customDropdownEl","dropdownClass","optionsClass","loadMoreClass","errorClass","wrapperClass","displayClass","optionTemplate","baseTemplate","optionClasses","optionClass","searchPlaceholder","searchClass","searchEmptyClass","searchEmptyTemplate","loadingMessage","preparedContent","innerText","tagTemplate","tagClass","placeholderClass","placeholderTemplate","DefaultConfig","onFetch","paginationTotalParam","allowClear","isRequired","searchMaxItems","showSelectedCount","_selectedOptions","_fetchRemoteData","encodeURIComponent","setItemsFromOptions","splice","_anchorElements","anchorElement","_updateAnchor","_scrollTo","sectionElement","scrollPosition","parentAnchorElements","parentAnchorElement","updateAnchor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","d","definition","defineProperty","enumerable","r","Symbol","toStringTag"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"ktui.min.js","mappings":"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","sources":["webpack://@keenthemes/ktui/webpack/universalModuleDefinition","webpack://@keenthemes/ktui/./src/components/select/index.ts","webpack://@keenthemes/ktui/./src/components/reparent/reparent.ts","webpack://@keenthemes/ktui/./src/components/drawer/drawer.ts","webpack://@keenthemes/ktui/./src/components/sticky/index.ts","webpack://@keenthemes/ktui/./src/components/stepper/stepper.ts","webpack://@keenthemes/ktui/./src/components/toggle/toggle.ts","webpack://@keenthemes/ktui/./src/components/tabs/tabs.ts","webpack://@keenthemes/ktui/./src/components/collapse/collapse.ts","webpack://@keenthemes/ktui/./src/components/tooltip/tooltip.ts","webpack://@keenthemes/ktui/./src/components/scrollable/index.ts","webpack://@keenthemes/ktui/./src/components/toggle-password/index.ts","webpack://@keenthemes/ktui/./src/helpers/utils.ts","webpack://@keenthemes/ktui/./src/components/datatable/index.ts","webpack://@keenthemes/ktui/./src/components/component.ts","webpack://@keenthemes/ktui/./src/components/accordion/index.ts","webpack://@keenthemes/ktui/./src/components/image-input/image-input.ts","webpack://@keenthemes/ktui/./src/components/sticky/sticky.ts","webpack://@keenthemes/ktui/./src/components/modal/index.ts","webpack://@keenthemes/ktui/./src/components/select/remote.ts","webpack://@keenthemes/ktui/./src/components/scrollto/scrollto.ts","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/enums.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/math.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/within.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/createPopper.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/popper.js","webpack://@keenthemes/ktui/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://@keenthemes/ktui/./src/components/scrollto/index.ts","webpack://@keenthemes/ktui/./src/components/reparent/index.ts","webpack://@keenthemes/ktui/./src/components/select/option.ts","webpack://@keenthemes/ktui/./src/components/theme-switch/theme-switch.ts","webpack://@keenthemes/ktui/./src/components/scrollable/scrollable.ts","webpack://@keenthemes/ktui/./src/components/dropdown/index.ts","webpack://@keenthemes/ktui/./src/helpers/event-handler.ts","webpack://@keenthemes/ktui/./src/components/accordion/accordion.ts","webpack://@keenthemes/ktui/./src/components/datatable/datatable-sort.ts","webpack://@keenthemes/ktui/./src/components/scrollspy/index.ts","webpack://@keenthemes/ktui/./src/components/select/combobox.ts","webpack://@keenthemes/ktui/./src/components/datatable/datatable-checkbox.ts","webpack://@keenthemes/ktui/./src/components/tabs/index.ts","webpack://@keenthemes/ktui/./src/components/toggle/index.ts","webpack://@keenthemes/ktui/./src/components/stepper/index.ts","webpack://@keenthemes/ktui/./src/components/toast/index.ts","webpack://@keenthemes/ktui/./src/components/datatable/datatable.ts","webpack://@keenthemes/ktui/./src/components/modal/modal.ts","webpack://@keenthemes/ktui/./src/components/select/dropdown.ts","webpack://@keenthemes/ktui/./src/components/dismiss/dismiss.ts","webpack://@keenthemes/ktui/./src/components/toggle-password/toggle-password.ts","webpack://@keenthemes/ktui/./src/components/dismiss/index.ts","webpack://@keenthemes/ktui/./src/components/select/search.ts","webpack://@keenthemes/ktui/./src/components/select/select.ts","webpack://@keenthemes/ktui/./src/components/tooltip/index.ts","webpack://@keenthemes/ktui/./src/index.ts","webpack://@keenthemes/ktui/./src/components/collapse/index.ts","webpack://@keenthemes/ktui/./src/components/dropdown/dropdown.ts","webpack://@keenthemes/ktui/./src/components/drawer/index.ts","webpack://@keenthemes/ktui/./src/helpers/data.ts","webpack://@keenthemes/ktui/./src/components/select/tags.ts","webpack://@keenthemes/ktui/./src/components/toast/toast.ts","webpack://@keenthemes/ktui/./src/helpers/dom.ts","webpack://@keenthemes/ktui/./src/components/select/utils.ts","webpack://@keenthemes/ktui/./src/components/image-input/index.ts","webpack://@keenthemes/ktui/./src/components/select/templates.ts","webpack://@keenthemes/ktui/./src/components/theme-switch/index.ts","webpack://@keenthemes/ktui/./src/components/select/config.ts","webpack://@keenthemes/ktui/./src/components/scrollspy/scrollspy.ts","webpack://@keenthemes/ktui/webpack/bootstrap","webpack://@keenthemes/ktui/webpack/runtime/define property getters","webpack://@keenthemes/ktui/webpack/runtime/hasOwnProperty shorthand","webpack://@keenthemes/ktui/webpack/runtime/make namespace object","webpack://@keenthemes/ktui/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTSelect } from './select';\nexport { KTSelectRemote } from './remote';\nexport { KTSelectCombobox } from './combobox';\nexport { KTSelectSearch } from './search';\nexport { KTSelectTags } from './tags';\nexport { KTSelectDropdown } from './dropdown';\nexport {\n\tfilterOptions,\n\tFocusManager,\n\tEventManager,\n\tTypeToSearchBuffer,\n} from './utils';\nexport { KTSelectConfigInterface, KTSelectOption } from './config';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTReparentInterface, KTReparentConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_REPARENT_INITIALIZED: boolean;\n\t\tKTReparent: typeof KTReparent;\n\t}\n}\n\nexport class KTReparent extends KTComponent implements KTReparentInterface {\n\tprotected override _name: string = 'reparent';\n\tprotected override _defaultConfig: KTReparentConfigInterface = {\n\t\tmode: '',\n\t\ttarget: '',\n\t};\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTReparentConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._update();\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._element) return;\n\t\tconst target = this._getOption('target') as string;\n\t\tconst targetEl = KTDom.getElement(target);\n\t\tconst mode = this._getOption('mode');\n\n\t\tif (targetEl && this._element.parentNode !== targetEl) {\n\t\t\tif (mode === 'prepend') {\n\t\t\t\ttargetEl.prepend(this._element);\n\t\t\t} else if (mode === 'append') {\n\t\t\t\ttargetEl.append(this._element);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic static handleResize(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\t() => {\n\t\t\t\t\tdocument\n\t\t\t\t\t\t.querySelectorAll('[data-kt-reparent-initialized]')\n\t\t\t\t\t\t.forEach((element) => {\n\t\t\t\t\t\t\tconst reparent = KTReparent.getInstance(element as HTMLElement);\n\t\t\t\t\t\t\tconsole.log('reparent update');\n\t\t\t\t\t\t\treparent?.update();\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTReparent {\n\t\treturn KTData.get(element, 'reparent') as KTReparent;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTReparentConfigInterface,\n\t): KTReparent {\n\t\treturn this.getInstance(element) || new KTReparent(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-reparent]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTReparent(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTReparent.createInstances();\n\n\t\tif (window.KT_REPARENT_INITIALIZED !== true) {\n\t\t\tKTReparent.handleResize();\n\t\t\twindow.KT_REPARENT_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTReparent = KTReparent;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTDrawerInterface, KTDrawerConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_DRAWER_INITIALIZED: boolean;\n\t\tKTDrawer: typeof KTDrawer;\n\t}\n}\n\nexport class KTDrawer extends KTComponent implements KTDrawerInterface {\n\tprotected override _name: string = 'drawer';\n\tprotected override _defaultConfig: KTDrawerConfigInterface = {\n\t\tzindex: '100',\n\t\tenable: true,\n\t\tclass: '',\n\t\tshownClass: 'flex',\n\t\thiddenClass: 'hidden',\n\t\tbackdrop: true,\n\t\tbackdropClass: 'kt-drawer-backdrop',\n\t\tbackdropStatic: false,\n\t\tkeyboard: true,\n\t\tdisableScroll: true,\n\t\tpersistent: false,\n\t\tcontainer: '',\n\t\tfocus: true,\n\t};\n\tprotected override _config: KTDrawerConfigInterface = this._defaultConfig;\n\tprotected _isOpen: boolean = false;\n\tprotected _isTransitioning: boolean = false;\n\tprotected _backdropElement: HTMLElement | null = null;\n\tprotected _relatedTarget: HTMLElement | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTDrawerConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._handleClose();\n\t\tthis._update();\n\t\tthis._handleContainer();\n\n\t}\n\n\tprotected _handleClose(): void {\n\t\tif (!this._element) return;\n\t\tKTEventHandler.on(this._element, '[data-kt-drawer-hide]', 'click', () => {\n\t\t\tthis._hide();\n\t\t});\n\t}\n\n\tprotected _toggle(relatedTarget?: HTMLElement): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen === true) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show(relatedTarget);\n\t\t}\n\t}\n\n\tprotected _show(relatedTarget?: HTMLElement): void {\n\t\tif (this._isOpen || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tKTDrawer.hide();\n\n\t\t// If drawer needs to be in front of backdrop, ensure it's in body (for proper z-index stacking)\n\t\t// This ensures the drawer and backdrop are in the same stacking context\n\t\tif (this._getOption('container') === 'body' && this._element.parentElement !== document.body) {\n\t\t\t// Store original parent for restoration when hiding\n\t\t\tif (!this._element.hasAttribute('data-kt-drawer-original-parent-id')) {\n\t\t\t\tconst originalParent = this._element.parentElement;\n\t\t\t\tif (originalParent && originalParent !== document.body) {\n\t\t\t\t\tthis._element.setAttribute('data-kt-drawer-original-parent-id', originalParent.id || '');\n\t\t\t\t\t// Store a reference to find the parent later (using closest to find Livewire component or header)\n\t\t\t\t\tconst livewireComponent = originalParent.closest('[wire\\\\:id]');\n\t\t\t\t\tconst header = originalParent.closest('header#header');\n\t\t\t\t\tif (livewireComponent) {\n\t\t\t\t\t\tthis._element.setAttribute('data-kt-drawer-original-wire-id', (livewireComponent as HTMLElement).getAttribute('wire:id') || '');\n\t\t\t\t\t}\n\t\t\t\t\tif (header) {\n\t\t\t\t\t\tthis._element.setAttribute('data-kt-drawer-original-in-header', 'true');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tdocument.body.appendChild(this._element);\n\t\t}\n\n\t\tif (this._getOption('backdrop') === true) this._createBackdrop();\n\n\t\tif (relatedTarget) this._relatedTarget = relatedTarget;\n\n\t\tif (!this._element) return;\n\t\tthis._isTransitioning = true;\n\t\tthis._element.classList.remove(this._getOption('hiddenClass') as string);\n\t\tthis._element.classList.add(this._getOption('shownClass') as string);\n\t\tthis._element.setAttribute('role', 'dialog');\n\t\tthis._element.setAttribute('aria-modal', 'true');\n\t\tthis._element.setAttribute('tabindex', '-1');\n\n\t\tconst zindex: number = parseInt(this._getOption('zindex') as string);\n\t\tif (zindex > 0) {\n\t\t\tthis._element.style.zIndex = `${zindex}`;\n\t\t}\n\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = 'hidden';\n\t\t}\n\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.add('open');\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\tif (this._getOption('focus') === true) {\n\t\t\t\tthis._autoFocus();\n\t\t\t}\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(): void {\n\t\tif (!this._element) return;\n\t\tif (this._isOpen === false || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isTransitioning = true;\n\t\tthis._element.removeAttribute('role');\n\t\tthis._element.removeAttribute('aria-modal');\n\t\tthis._element.removeAttribute('tabindex');\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = '';\n\t\t}\n\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.remove('open');\n\n\t\tif (this._getOption('backdrop') === true) {\n\t\t\tthis._deleteBackdrop();\n\t\t}\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tif (!this._element) return;\n\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\t\t\tthis._element.classList.add(this._getOption('hiddenClass') as string);\n\t\t\tthis._element.classList.remove(this._getOption('shownClass') as string);\n\t\t\tthis._element.style.zIndex = '';\n\n\t\t\t// Note: We don't move drawer back to original location here\n\t\t\t// Livewire will handle DOM structure on next navigation, and drawer will be reinitialized\n\t\t\t// in its original location from the persisted component HTML\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _update(): void {\n\t\tif ((this._getOption('class') as string)?.length > 0) {\n\t\t\tif (this.isEnabled()) {\n\t\t\t\tKTDom.addClass(this._element, this._getOption('class') as string);\n\t\t\t} else {\n\t\t\t\tKTDom.removeClass(this._element, this._getOption('class') as string);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _handleContainer(): void {\n\t\tif (this._getOption('container')) {\n\t\t\tif (this._getOption('container') === 'body') {\n\t\t\t\t// Check if drawer is in a persisted Livewire component (like header with @persist)\n\t\t\t\t// If so, don't move it to body - keep it in place so Livewire can preserve it\n\t\t\t\t// This follows the same pattern as dropdowns/menus which work with wire:navigate\n\t\t\t\tconst originalParent = this._element.parentNode;\n\t\t\t\tconst isInPersistedComponent = originalParent &&\n\t\t\t\t\t((originalParent as HTMLElement).closest('[wire\\\\:id]') !== null ||\n\t\t\t\t\t (originalParent as HTMLElement).closest('header#header') !== null);\n\n\t\t\t\tif (isInPersistedComponent) {\n\t\t\t\t\t// Don't move to body - keep in original location for Livewire persistence\n\t\t\t\t\t// Use fixed positioning to achieve the same visual effect\n\t\t\t\t\t// Ensure drawer has fixed positioning to work from its current location\n\t\t\t\t\tif (!this._element.style.position || this._element.style.position === 'static') {\n\t\t\t\t\t\tthis._element.style.position = 'fixed';\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Not in persisted component - safe to move to body (follows original behavior)\n\t\t\t\t\tdocument.body.appendChild(this._element);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdocument\n\t\t\t\t\t.querySelector(this._getOption('container') as string)\n\t\t\t\t\t?.appendChild(this._element);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _autoFocus(): void {\n\t\tif (!this._element) return;\n\t\tconst input: HTMLInputElement | null = this._element.querySelector(\n\t\t\t'[data-kt-drawer-focus]',\n\t\t);\n\t\tif (!input) return;\n\t\telse input.focus();\n\t}\n\n\tprotected _createBackdrop(): void {\n\t\tif (!this._element) return;\n\n\t\tconst zindex: number = parseInt(this._getOption('zindex') as string);\n\n\t\tthis._backdropElement = document.createElement('DIV');\n\t\tthis._backdropElement.style.zIndex = (zindex - 1).toString();\n\t\tthis._backdropElement.setAttribute('data-kt-drawer-backdrop', 'true');\n\t\tdocument.body.append(this._backdropElement);\n\t\tKTDom.reflow(this._backdropElement);\n\t\tKTDom.addClass(\n\t\t\tthis._backdropElement,\n\t\t\tthis._getOption('backdropClass') as string,\n\t\t);\n\n\t\tthis._backdropElement.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\t\t\tif (this._getOption('backdropStatic') === false) {\n\t\t\t\tthis._hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _deleteBackdrop(): void {\n\t\tif (!this._backdropElement) return;\n\n\t\tKTDom.reflow(this._backdropElement);\n\t\tthis._backdropElement.style.opacity = '0';\n\n\t\tKTDom.transitionEnd(this._backdropElement, () => {\n\t\t\tif (!this._backdropElement) return;\n\t\t\tKTDom.remove(this._backdropElement);\n\t\t});\n\t}\n\n\tprotected _isEnabled(): boolean {\n\t\treturn KTUtils.stringToBoolean(this._getOption('enable'));\n\t}\n\n\tpublic toggle(): void {\n\t\treturn this._toggle();\n\t}\n\n\tpublic show(relatedTarget?: HTMLElement): void {\n\t\treturn this._show(relatedTarget);\n\t}\n\n\tpublic hide(): void {\n\t\treturn this._hide();\n\t}\n\n\tpublic update(): void {\n\t\treturn this._update();\n\t}\n\n\tpublic getRelatedTarget(): HTMLElement | null {\n\t\treturn this._relatedTarget;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\tpublic isEnabled(): boolean {\n\t\treturn this._isEnabled();\n\t}\n\n\tpublic static getElement(reference: HTMLElement): HTMLElement {\n\t\tif (reference && reference.hasAttribute('data-kt-drawer-initialized'))\n\t\t\treturn reference;\n\n\t\tconst findElement =\n\t\t\treference &&\n\t\t\t(reference.closest('[data-kt-drawer-initialized]') as HTMLElement);\n\t\tif (findElement) return findElement;\n\n\t\t// Fallback: look for parent with data-kt-drawer attribute\n\t\tif (reference) {\n\t\t\tconst drawerContainer = reference.closest('[data-kt-drawer]') as HTMLElement;\n\t\t\tif (drawerContainer) return drawerContainer;\n\t\t}\n\n\t\t// If reference is a toggle button with a selector, find the drawer by selector\n\t\t// This handles cases where the toggle button is not a child of the drawer\n\t\tif (reference && reference.hasAttribute('data-kt-drawer-toggle')) {\n\t\t\tconst selector = reference.getAttribute('data-kt-drawer-toggle');\n\t\t\tif (selector) {\n\t\t\t\t// Check both document and body (drawers with container=\"body\" are moved to body)\n\t\t\t\tconst drawerElInDoc = document.querySelector(selector);\n\t\t\t\tconst drawerElInBody = document.body.querySelector(selector);\n\t\t\t\tconst drawerEl = drawerElInDoc || drawerElInBody;\n\t\t\t\tif (drawerEl) return drawerEl as HTMLElement;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Wait for an element to appear in the DOM using polling with MutationObserver fallback\n\t * Useful for persisted Livewire components that may not be in DOM immediately\n\t */\n\tpublic static waitForElement(selector: string, timeout: number = 2000): Promise<HTMLElement | null> {\n\t\treturn new Promise((resolve) => {\n\t\t\tlet resolved = false;\n\n\t\t\tconst doResolve = (element: HTMLElement | null) => {\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tresolved = true;\n\t\t\t\t\tresolve(element);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Check if element already exists\n\t\t\tconst existing = document.querySelector(selector) || document.body.querySelector(selector);\n\t\t\tif (existing) {\n\t\t\t\tdoResolve(existing as HTMLElement);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Use polling for faster detection (check every 50ms)\n\t\t\tlet attempts = 0;\n\t\t\tconst maxAttempts = timeout / 50;\n\t\t\tconst pollInterval = setInterval(() => {\n\t\t\t\tif (resolved) {\n\t\t\t\t\tclearInterval(pollInterval);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tattempts++;\n\t\t\t\tconst element = document.querySelector(selector) || document.body.querySelector(selector);\n\t\t\t\tif (element) {\n\t\t\t\t\tclearInterval(pollInterval);\n\t\t\t\t\tdoResolve(element as HTMLElement);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (attempts >= maxAttempts) {\n\t\t\t\t\tclearInterval(pollInterval);\n\t\t\t\t\tdoResolve(null);\n\t\t\t\t}\n\t\t\t}, 50);\n\n\t\t\t// Also use MutationObserver as backup for immediate detection\n\t\t\tconst observer = new MutationObserver(() => {\n\t\t\t\tif (resolved) {\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst element = document.querySelector(selector) || document.body.querySelector(selector);\n\t\t\t\tif (element) {\n\t\t\t\t\tclearInterval(pollInterval);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\tdoResolve(element as HTMLElement);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tobserver.observe(document.body, {\n\t\t\t\tchildList: true,\n\t\t\t\tsubtree: true,\n\t\t\t});\n\n\t\t\t// Cleanup on timeout\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tclearInterval(pollInterval);\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\tdoResolve(null);\n\t\t\t\t}\n\t\t\t}, timeout);\n\t\t});\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTDrawer {\n\t\tif (!element) return null;\n\n\t\tconst drawerElement = KTDrawer.getElement(element);\n\t\tif (!drawerElement) {\n\t\t\t// If element is a toggle button and drawer element wasn't found, return null\n\t\t\t// The handleToggle() will handle waiting for the element to appear\n\t\t\tif (element.hasAttribute('data-kt-drawer-toggle')) {\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tif (KTData.has(drawerElement, 'drawer')) {\n\t\t\treturn KTData.get(drawerElement, 'drawer') as KTDrawer;\n\t\t}\n\n\t\tif (drawerElement.getAttribute('data-kt-drawer-initialized') === 'true') {\n\t\t\treturn new KTDrawer(drawerElement);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTDrawerConfigInterface,\n\t): KTDrawer {\n\t\treturn this.getInstance(element) || new KTDrawer(element, config);\n\t}\n\n\tpublic static hide(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-drawer-initialized]');\n\n\t\telements.forEach((element) => {\n\t\t\tconst drawer = KTDrawer.getInstance(element as HTMLElement);\n\n\t\t\tif (drawer && drawer.isOpen()) {\n\t\t\t\tdrawer.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleResize(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\t() => {\n\t\t\t\t\tdocument\n\t\t\t\t\t\t.querySelectorAll('[data-kt-drawer-initialized]')\n\t\t\t\t\t\t.forEach((element) => {\n\t\t\t\t\t\t\tconst drawer = KTDrawer.getInstance(element as HTMLElement);\n\t\t\t\t\t\t\tdrawer.update();\n\n\t\t\t\t\t\t\tif (drawer && drawer.isOpen() && !drawer.isEnabled()) {\n\t\t\t\t\t\t\t\tdrawer.hide();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static handleToggle(): void {\n\n\t\t// Add raw click listener to document.body to track all clicks\n\t\tdocument.body.addEventListener('click', (rawEvent: MouseEvent) => {\n\t\t\tconst target = rawEvent.target as HTMLElement;\n\t\t\tif (target && target.hasAttribute('data-kt-drawer-toggle')) {\n\t\t\t}\n\t\t}, true); // Use capture phase to catch before any stopPropagation\n\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-drawer-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst selector = target.getAttribute('data-kt-drawer-toggle');\n\t\t\t\tif (!selector) return;\n\n\t\t\t\t// Try to get instance immediately\n\t\t\t\tconst drawer = KTDrawer.getInstance(target);\n\n\t\t\t\tif (drawer) {\n\t\t\t\t\tdrawer.toggle();\n\t\t\t\t} else {\n\t\t\t\t\t// Drawer element not found - wait for it to appear (handles persisted Livewire components)\n\t\t\t\t\t// Check if drawer exists in persisted components (might be in header that's persisted)\n\t\t\t\t\tconst persistedHeader = document.querySelector('[wire\\\\:id]')?.closest('[wire\\\\:id]') || document.querySelector('header#header');\n\t\t\t\t\tconst drawerInPersisted = persistedHeader ? persistedHeader.querySelector(selector) : null;\n\n\t\t\t\t\t// Wait longer for persisted components that may take time to render\n\t\t\t\t\t// Also check if drawer exists in persisted header component\n\t\t\t\t\tKTDrawer.waitForElement(selector, 5000).then((drawerElement) => {\n\t\t\t\t\t\tif (drawerElement) {\n\t\t\t\t\t\t\t// Initialize the drawer if not already initialized\n\t\t\t\t\t\t\tif (!KTData.has(drawerElement, 'drawer')) {\n\t\t\t\t\t\t\t\tnew KTDrawer(drawerElement);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Get instance and toggle\n\t\t\t\t\t\t\tconst drawerInstance = KTDrawer.getInstance(drawerElement);\n\t\t\t\t\t\t\tif (drawerInstance) {\n\t\t\t\t\t\t\t\tdrawerInstance.toggle();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Drawer never appeared - trigger a reinit to see if it helps\n\t\t\t\t\t\t\t// This handles cases where drawers are in persisted components that haven't rendered yet\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tKTDrawer.reinit();\n\t\t\t\t\t\t\t\t// Try one more time after reinit\n\t\t\t\t\t\t\t\tconst drawerAfterReinit = document.querySelector(selector) || document.body.querySelector(selector);\n\t\t\t\t\t\t\t\tif (drawerAfterReinit) {\n\t\t\t\t\t\t\t\t\tif (!KTData.has(drawerAfterReinit as HTMLElement, 'drawer')) {\n\t\t\t\t\t\t\t\t\t\tnew KTDrawer(drawerAfterReinit as HTMLElement);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst drawerInstance = KTDrawer.getInstance(drawerAfterReinit as HTMLElement);\n\t\t\t\t\t\t\t\t\tif (drawerInstance) {\n\t\t\t\t\t\t\t\t\t\tdrawerInstance.toggle();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}, 500);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleDismiss(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-drawer-dismiss]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst modalElement = target.closest(\n\t\t\t\t\t'[data-kt-drawer=\"true\"]',\n\t\t\t\t) as HTMLElement;\n\t\t\t\tif (modalElement) {\n\t\t\t\t\tconst modal = KTDrawer.getInstance(modalElement);\n\t\t\t\t\tif (modal) {\n\t\t\t\t\t\tmodal.hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleClickAway() {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tconst drawerEl = document.querySelector(\n\t\t\t\t'.open[data-kt-drawer-initialized]',\n\t\t\t);\n\t\t\tif (!drawerEl) return;\n\n\t\t\tconst drawer = KTDrawer.getInstance(drawerEl as HTMLElement);\n\t\t\tif (!drawer) return;\n\n\t\t\tif (drawer.getOption('persistent')) return;\n\n\t\t\tif (drawer.getOption('backdrop')) return;\n\n\t\t\tif (\n\t\t\t\tdrawerEl !== event.target &&\n\t\t\t\tdrawer.getRelatedTarget() !== event.target &&\n\t\t\t\tdrawerEl.contains(event.target as HTMLElement) === false\n\t\t\t) {\n\t\t\t\tdrawer.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleKeyword() {\n\t\tdocument.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst drawerEl = document.querySelector(\n\t\t\t\t'.open[data-kt-drawer-initialized]',\n\t\t\t);\n\t\t\tconst drawer = KTDrawer.getInstance(drawerEl as HTMLElement);\n\t\t\tif (!drawer) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// if esc key was not pressed in combination with ctrl or alt or shift\n\t\t\tif (\n\t\t\t\tevent.key === 'Escape' &&\n\t\t\t\t!(event.ctrlKey || event.altKey || event.shiftKey)\n\t\t\t) {\n\t\t\t\tdrawer.hide();\n\t\t\t}\n\n\t\t\tif (event.code === 'Tab' && !event.metaKey) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static createInstances(): void {\n\t\t// Find all drawer elements - check both document and body (drawers with container=\"body\" are moved there)\n\t\tconst elementsInDoc = document.querySelectorAll('[data-kt-drawer]');\n\t\tconst elementsInBody = document.body.querySelectorAll('[data-kt-drawer]');\n\t\t// Combine and deduplicate\n\t\tconst allElements = new Set([...Array.from(elementsInDoc), ...Array.from(elementsInBody)]);\n\t\tconst elements = Array.from(allElements);\n\t\telements.forEach((element) => {\n\t\t\tnew KTDrawer(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTDrawer.createInstances();\n\n\t\tif (window.KT_DRAWER_INITIALIZED !== true) {\n\t\t\tKTDrawer.handleToggle();\n\t\t\tKTDrawer.handleDismiss();\n\t\t\tKTDrawer.handleResize();\n\t\t\tKTDrawer.handleClickAway();\n\t\t\tKTDrawer.handleKeyword();\n\t\t\twindow.KT_DRAWER_INITIALIZED = true;\n\t\t}\n\t}\n\n\t/**\n\t * Force reinitialization of drawers by clearing KTData entries.\n\t * Useful for Livewire wire:navigate where persisted elements need reinitialization.\n\t */\n\tpublic static reinit(): void {\n\t\t// Follow the same simple pattern as KTDropdown.reinit()\n\t\t// Find all drawer elements - check both document and body (some may be moved to body)\n\t\tconst elementsInDoc = document.querySelectorAll('[data-kt-drawer]');\n\t\tconst elementsInBody = document.body.querySelectorAll('[data-kt-drawer]');\n\t\t// Combine and deduplicate\n\t\tconst allElements = new Set([...Array.from(elementsInDoc), ...Array.from(elementsInBody)]);\n\t\tconst elements = Array.from(allElements);\n\n\n\t\t// Clean up existing instances\n\t\telements.forEach((element) => {\n\t\t\ttry {\n\t\t\t\t// Get existing instance to clean up\n\t\t\t\tconst instance = KTDrawer.getInstance(element as HTMLElement);\n\t\t\t\tif (instance && typeof instance.hide === 'function') {\n\t\t\t\t\tinstance.hide(); // This will clean up backdrop and state\n\t\t\t\t}\n\t\t\t\t// Clear KTData entries\n\t\t\t\tconst hadDrawer = KTData.has(element as HTMLElement, 'drawer');\n\t\t\t\tKTData.remove(element as HTMLElement, 'drawer');\n\t\t\t\t// Remove initialization attribute to allow fresh initialization\n\t\t\t\telement.removeAttribute('data-kt-drawer-initialized');\n\t\t\t} catch (e) {\n\t\t\t\t// Ignore errors for individual elements\n\t\t\t}\n\t\t});\n\n\t\t// Now create fresh instances\n\t\tKTDrawer.createInstances();\n\n\t\t// Always ensure handlers are set up (similar to KTMenu.init() behavior)\n\t\t// Event handlers use delegation so they persist, but we ensure they're attached\n\t\tKTDrawer.handleToggle();\n\t\tKTDrawer.handleDismiss();\n\t\tKTDrawer.handleResize();\n\t\tKTDrawer.handleClickAway();\n\t\tKTDrawer.handleKeyword();\n\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTDrawer = KTDrawer;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTSticky } from './sticky';\nexport type { KTStickyConfigInterface, KTStickyInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTStepperInterface, KTStepperConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_STEPPER_INITIALIZED: boolean;\n\t\tKTStepper: typeof KTStepper;\n\t}\n}\n\nexport class KTStepper extends KTComponent implements KTStepperInterface {\n\tprotected override _name: string = 'stepper';\n\tprotected override _defaultConfig: KTStepperConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tactiveStep: 1,\n\t};\n\tprotected override _config: KTStepperConfigInterface = this._defaultConfig;\n\tprotected _activeStep: number = 0;\n\tprotected _nextElement: HTMLElement | null = null;\n\tprotected _backElement: HTMLElement | null = null;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTStepperConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\t\tthis._nextElement = this._element.querySelector('[data-kt-stepper-next]');\n\t\tthis._backElement = this._element.querySelector('[data-kt-stepper-back]');\n\n\t\tthis._activeStep = 1;\n\t\tif (this._getOption('activeStep') !== this._activeStep) {\n\t\t\tthis._go(this._getOption('activeStep') as number);\n\t\t}\n\n\t\tthis._update();\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._nextElement) {\n\t\t\tconsole.error('data-kt-stepper-next not found');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._nextElement) {\n\t\t\tthis._nextElement.addEventListener('click', (event: Event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._goNext();\n\t\t\t});\n\t\t}\n\n\t\tif (this._backElement) {\n\t\t\tthis._backElement.addEventListener('click', (event: Event) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._goBack();\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._element) return;\n\t\tlet state = '';\n\n\t\tif (this._activeStep === this._getTotalSteps()) {\n\t\t\tstate = 'last';\n\t\t} else if (this._activeStep === 1) {\n\t\t\tstate = 'first';\n\t\t} else {\n\t\t\tstate = 'between';\n\t\t}\n\n\t\tthis._element.classList.remove('first');\n\t\tthis._element.classList.remove('last');\n\t\tthis._element.classList.remove('between');\n\t\tthis._element.classList.add(state);\n\n\t\tthis._getItemElements().forEach((element, index) => {\n\t\t\tconst contentElement = KTDom.getElement(\n\t\t\t\telement.getAttribute('data-kt-stepper-item'),\n\t\t\t);\n\t\t\tif (!contentElement) return;\n\n\t\t\telement.classList.remove('active');\n\t\t\telement.classList.remove('completed');\n\t\t\telement.classList.remove('pending');\n\n\t\t\tconst numberElement = element.querySelector('[data-kt-stepper-number]');\n\t\t\tif (numberElement) numberElement.innerHTML = String(index + 1);\n\n\t\t\tif (index + 1 == this._activeStep) {\n\t\t\t\telement.classList.add('active');\n\t\t\t\tcontentElement.classList.remove(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcontentElement.classList.add(this._getOption('hiddenClass') as string);\n\t\t\t\tif (index + 1 < this._activeStep) {\n\t\t\t\t\telement.classList.add('completed');\n\t\t\t\t} else {\n\t\t\t\t\telement.classList.add('pending');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _getItemElements(): Array<HTMLElement> {\n\t\tconst elements: Array<HTMLElement> = [];\n\n\t\tthis._element\n\t\t\t.querySelectorAll('[data-kt-stepper-item]')\n\t\t\t.forEach((element) => {\n\t\t\t\tif (KTDom.isVisible(element as HTMLElement)) {\n\t\t\t\t\telements.push(element as HTMLElement);\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn elements;\n\t}\n\n\tprotected async _go(step: number): Promise<void> {\n\t\tif (step === this._activeStep || step > this._getTotalSteps() || step < 0)\n\t\t\treturn;\n\n\t\tconst payload = { step: step, cancel: false };\n\t\tawait this._fireEvent('change', payload);\n\t\tthis._dispatchEvent('change', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._activeStep = step;\n\t\tthis._update();\n\n\t\tthis._fireEvent('changed');\n\t\tthis._dispatchEvent('changed');\n\t}\n\n\tprotected _goTo(itemElement: HTMLElement): void {\n\t\tconst step = this._getStep(itemElement);\n\t\tthis._go(step);\n\t}\n\n\tprotected _getStep(itemElement: HTMLElement): number {\n\t\tlet step = -1;\n\n\t\tthis._getItemElements().forEach((element, index) => {\n\t\t\tif (element === itemElement) {\n\t\t\t\tstep = index + 1;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\n\t\treturn step;\n\t}\n\n\tprotected _getItemElement(step: number) {\n\t\treturn this._getItemElements()[step - 1];\n\t}\n\n\tprotected _getTotalSteps(): number {\n\t\treturn this._getItemElements().length;\n\t}\n\n\tprotected _goNext(): void {\n\t\tlet step;\n\n\t\tif (this._getTotalSteps() >= this._activeStep + 1) {\n\t\t\tstep = this._activeStep + 1;\n\t\t} else {\n\t\t\tstep = this._getTotalSteps();\n\t\t}\n\n\t\tthis._go(step);\n\t}\n\n\tprotected _goBack(): void {\n\t\tlet step;\n\n\t\tif (this._activeStep - 1 > 1) {\n\t\t\tstep = this._activeStep - 1;\n\t\t} else {\n\t\t\tstep = 1;\n\t\t}\n\n\t\tthis._go(step);\n\t}\n\n\tprotected _goLast(): void {\n\t\tconst step = this._getTotalSteps();\n\t\tthis._go(step);\n\t}\n\n\tprotected _goFirst(): void {\n\t\tconst step = 1;\n\t\tthis._go(step);\n\t}\n\n\tprotected _isLast(): boolean {\n\t\treturn this._getTotalSteps() === this._activeStep + 1;\n\t}\n\n\tprotected _isFirst(): boolean {\n\t\treturn this._activeStep === 1;\n\t}\n\n\tpublic isLast(): boolean {\n\t\treturn this._isLast();\n\t}\n\n\tpublic isFirst(): boolean {\n\t\treturn this._isFirst();\n\t}\n\n\tpublic go(step: number): void {\n\t\tthis._go(step);\n\t}\n\n\tpublic goTo(itemElement: HTMLElement): void {\n\t\tthis.goTo(itemElement);\n\t}\n\n\tpublic goFirst(): void {\n\t\tthis._goFirst();\n\t}\n\n\tpublic goLast(): void {\n\t\tthis._goLast();\n\t}\n\n\tpublic goNext(): void {\n\t\tthis._goNext();\n\t}\n\n\tpublic goBack(): void {\n\t\tthis._goBack();\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic getStep(itemElement: HTMLElement): number {\n\t\treturn this._getStep(itemElement);\n\t}\n\n\tpublic getItemElement(step: number): HTMLElement {\n\t\treturn this._getItemElement(step);\n\t}\n\n\tpublic getTotalSteps(): number {\n\t\treturn this._getTotalSteps();\n\t}\n\n\tpublic getItemElements(): Array<HTMLElement> {\n\t\treturn this._getItemElements();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTStepper {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'stepper')) {\n\t\t\treturn KTData.get(element, 'stepper') as KTStepper;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-stepper')) {\n\t\t\treturn new KTStepper(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTStepperConfigInterface,\n\t): KTStepper | null {\n\t\treturn this.getInstance(element) || new KTStepper(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-stepper]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTStepper(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTStepper.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTStepper = KTStepper;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTToggleConfigInterface, KTToggleInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKTToggle: typeof KTToggle;\n\t}\n}\n\nexport class KTToggle extends KTComponent implements KTToggleInterface {\n\tprotected override _name: string = 'toggle';\n\tprotected override _defaultConfig: KTToggleConfigInterface = {\n\t\ttarget: '',\n\t\tactiveClass: 'active',\n\t\tclass: '',\n\t\tremoveClass: '',\n\t\tattribute: '',\n\t};\n\tprotected override _config: KTToggleConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTToggleConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.addEventListener('click', () => {\n\t\t\tthis._toggle();\n\t\t});\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-toggle') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _toggle(): void {\n\t\tif (!this._element) return;\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element.classList.toggle(this._getOption('activeClass') as string);\n\t\tthis._update();\n\n\t\tthis._fireEvent('toggled');\n\t\tthis._dispatchEvent('toggled');\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._targetElement) return;\n\n\t\tif (this._getOption('removeClass')) {\n\t\t\tKTDom.removeClass(\n\t\t\t\tthis._targetElement,\n\t\t\t\tthis._getOption('removeClass') as string,\n\t\t\t);\n\t\t}\n\n\t\tif (!this._isActive()) {\n\t\t\tif (this._getOption('class')) {\n\t\t\t\tKTDom.addClass(this._targetElement, this._getOption('class') as string);\n\t\t\t}\n\n\t\t\tif (this._getOption('attribute')) {\n\t\t\t\tthis._targetElement.setAttribute(\n\t\t\t\t\tthis._getOption('attribute') as string,\n\t\t\t\t\t'true',\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\tif (this._getOption('class')) {\n\t\t\t\tKTDom.removeClass(\n\t\t\t\t\tthis._targetElement,\n\t\t\t\t\tthis._getOption('class') as string,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (this._getOption('attribute')) {\n\t\t\t\tthis._targetElement.removeAttribute(\n\t\t\t\t\tthis._getOption('attribute') as string,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _isActive(): boolean {\n\t\tif (!this._element) return false;\n\n\t\treturn (\n\t\t\tKTDom.hasClass(this._targetElement, this._getOption('class') as string) ||\n\t\t\tthis._targetElement.hasAttribute(this._getOption('attribute') as string)\n\t\t);\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic isActive(): boolean {\n\t\treturn this._isActive();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTToggle {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'toggle')) {\n\t\t\treturn KTData.get(element, 'toggle') as KTToggle;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-toggle')) {\n\t\t\treturn new KTToggle(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTToggleConfigInterface,\n\t): KTToggle {\n\t\treturn this.getInstance(element) || new KTToggle(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-toggle]');\n\t\telements.forEach((element) => {\n\t\t\tnew KTToggle(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTToggle.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTToggle = KTToggle;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTTabsInterface, KTTabsConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_TABS_INITIALIZED: boolean;\n\t\tKTTabs: typeof KTTabs;\n\t}\n}\n\nexport class KTTabs extends KTComponent implements KTTabsInterface {\n\tprotected override _name: string = 'tabs';\n\tprotected override _defaultConfig: KTTabsConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t};\n\tprotected override _config: KTTabsConfigInterface = this._defaultConfig;\n\tprotected _currentTabElement: HTMLElement | null = null;\n\tprotected _currentContentElement: HTMLElement | null = null;\n\tprotected _lastTabElement: HTMLElement | null = null;\n\tprotected _lastContentElement: HTMLElement | null = null;\n\tprotected _tabElements: NodeListOf<HTMLElement> | null = null;\n\tprotected _isTransitioning: boolean = false;\n\n\tconstructor(element: HTMLElement, config?: KTTabsConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\t\tthis._tabElements = this._element.querySelectorAll('[data-kt-tab-toggle]');\n\t\tthis._currentTabElement = this._element.querySelector(\n\t\t\t'.active[data-kt-tab-toggle]',\n\t\t);\n\t\tthis._currentContentElement =\n\t\t\t(this._currentTabElement &&\n\t\t\t\t(KTDom.getElement(\n\t\t\t\t\tthis._currentTabElement.getAttribute('data-kt-tab-toggle'),\n\t\t\t\t) ||\n\t\t\t\t\tKTDom.getElement(this._currentTabElement.getAttribute('href')))) ||\n\t\t\tnull;\n\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-tab-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._show(target);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _show(tabElement: HTMLElement): void {\n\t\tif (this._isShown(tabElement) || this._isTransitioning) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._currentTabElement?.classList.remove('active');\n\t\tthis._currentTabElement?.classList.remove('selected');\n\t\tthis._currentContentElement?.classList.add(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._lastTabElement = this._currentTabElement;\n\t\tthis._getDropdownToggleElement(this._lastTabElement)?.classList.remove(\n\t\t\t'active',\n\t\t);\n\n\t\tthis._lastContentElement = this._currentContentElement;\n\t\tthis._currentTabElement = tabElement;\n\t\tthis._currentContentElement =\n\t\t\tKTDom.getElement(tabElement.getAttribute('data-kt-tab-toggle')) ||\n\t\t\tKTDom.getElement(tabElement.getAttribute('href'));\n\t\tthis._currentTabElement?.classList.add('active');\n\t\tthis._currentTabElement?.classList.add('selected');\n\t\tthis._currentContentElement?.classList.remove(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._getDropdownToggleElement(this._currentTabElement)?.classList.add(\n\t\t\t'active',\n\t\t);\n\n\t\tthis._currentContentElement.style.opacity = '0';\n\t\tKTDom.reflow(this._currentContentElement);\n\t\tthis._currentContentElement.style.opacity = '1';\n\n\t\tKTDom.transitionEnd(this._currentContentElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._currentContentElement.style.opacity = '';\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _getDropdownToggleElement(element: HTMLElement): HTMLElement {\n\t\tconst containerElement = element.closest(\n\t\t\t'[data-kt-dropdown-initialized],[data-kt-menu-initialized]',\n\t\t) as HTMLElement;\n\n\t\tif (containerElement) {\n\t\t\treturn containerElement.querySelector(\n\t\t\t\t'[data-kt-dropdown-toggle], [data-kt-menu-toggle]',\n\t\t\t);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprotected _isShown(tabElement: HTMLElement): boolean {\n\t\treturn tabElement.classList.contains('active');\n\t}\n\n\tpublic isShown(tabElement: HTMLElement): boolean {\n\t\treturn this._isShown(tabElement);\n\t}\n\n\tpublic show(tabElement: HTMLElement): void {\n\t\treturn this._show(tabElement);\n\t}\n\n\tpublic static keyboardArrow(): void {}\n\n\tpublic static keyboardJump(): void {}\n\n\tpublic static handleAccessibility(): void {}\n\n\tpublic static getInstance(element: HTMLElement): KTTabs {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'tabs')) {\n\t\t\treturn KTData.get(element, 'tabs') as KTTabs;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-tabs')) {\n\t\t\treturn new KTTabs(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTTabsConfigInterface,\n\t): KTTabs {\n\t\treturn this.getInstance(element) || new KTTabs(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-tabs]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTTabs(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTTabs.createInstances();\n\n\t\tif (window.KT_TABS_INITIALIZED !== true) {\n\t\t\tKTTabs.handleAccessibility();\n\t\t\twindow.KT_TABS_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTTabs = KTTabs;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTCollapseInterface, KTCollapseConfigInterface } from './types';\n\nexport class KTCollapse extends KTComponent implements KTCollapseInterface {\n\tprotected override _name: string = 'collapse';\n\tprotected override _defaultConfig: KTCollapseConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tactiveClass: 'active',\n\t\ttarget: '',\n\t};\n\tprotected override _config: KTCollapseConfigInterface = this._defaultConfig;\n\tprotected _isAnimating: boolean = false;\n\tprotected _targetElement: HTMLElement;\n\n\tconstructor(element: HTMLElement, config?: KTCollapseConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-collapse') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _isOpen(): boolean {\n\t\treturn this._targetElement.classList.contains(\n\t\t\tthis._getOption('activeClass') as string,\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tthis._toggle();\n\t\t});\n\t}\n\n\tprotected _expand(): void {\n\t\tif (this._isAnimating || this._isOpen()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('expand', payload);\n\t\tthis._dispatchEvent('expand', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._element) {\n\t\t\tthis._element.setAttribute('aria-expanded', 'true');\n\t\t\tthis._element.classList.add(this._getOption('activeClass') as string);\n\t\t}\n\t\tthis._targetElement.classList.remove(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._targetElement.classList.add(this._getOption('activeClass') as string);\n\n\t\tthis._targetElement.style.height = '0px';\n\t\tthis._targetElement.style.overflow = 'hidden';\n\t\tKTDom.reflow(this._targetElement);\n\t\tthis._targetElement.style.height = `${this._targetElement.scrollHeight}px`;\n\t\tthis._isAnimating = true;\n\n\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\tthis._isAnimating = false;\n\t\t\tthis._targetElement.style.height = '';\n\t\t\tthis._targetElement.style.overflow = '';\n\n\t\t\tthis._fireEvent('expanded');\n\t\t\tthis._dispatchEvent('expanded');\n\t\t});\n\t}\n\n\tprotected _collapse(): void {\n\t\tif (this._isAnimating || !this._isOpen()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('collapse', payload);\n\t\tthis._dispatchEvent('collapse', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._element) return;\n\t\tthis._element.setAttribute('aria-expanded', 'false');\n\t\tthis._element.classList.remove(this._getOption('activeClass') as string);\n\t\tthis._targetElement.classList.remove(\n\t\t\tthis._getOption('activeClass') as string,\n\t\t);\n\n\t\tthis._targetElement.style.height = `${this._targetElement.scrollHeight}px`;\n\t\tKTDom.reflow(this._targetElement);\n\t\tthis._targetElement.style.height = `0px`;\n\t\tthis._targetElement.style.overflow = 'hidden';\n\t\tthis._isAnimating = true;\n\n\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\tthis._isAnimating = false;\n\t\t\tthis._targetElement.classList.add(\n\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t);\n\t\t\tthis._targetElement.style.overflow = '';\n\n\t\t\tthis._fireEvent('collapsed');\n\t\t\tthis._dispatchEvent('collapsed');\n\t\t});\n\t}\n\n\tprotected _toggle(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen()) {\n\t\t\tthis._collapse();\n\t\t} else {\n\t\t\tthis._expand();\n\t\t}\n\t}\n\n\tpublic expand(): void {\n\t\treturn this._expand();\n\t}\n\n\tpublic collapse(): void {\n\t\treturn this._collapse();\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTCollapse {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'collapse')) {\n\t\t\treturn KTData.get(element, 'collapse') as KTCollapse;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-collapse')) {\n\t\t\treturn new KTCollapse(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTCollapseConfigInterface,\n\t): KTCollapse {\n\t\treturn this.getInstance(element) || new KTCollapse(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-collapse]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTCollapse(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTCollapse.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTCollapse = KTCollapse;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTTooltipInterface, KTTooltipConfigInterface } from './types';\nimport {\n\tcreatePopper,\n\tPositioningStrategy,\n\tInstance,\n\tPlacement,\n} from '@popperjs/core';\nimport { KTTooltipTriggerType } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_TOOLTIP_INITIALIZED: boolean;\n\t\tKTTooltip: typeof KTTooltip;\n\t}\n}\n\nexport class KTTooltip extends KTComponent implements KTTooltipInterface {\n\tprotected override _name: string = 'tooltip';\n\tprotected override _defaultConfig: KTTooltipConfigInterface = {\n\t\ttarget: '',\n\t\thiddenClass: 'hidden',\n\t\ttrigger: 'hover',\n\t\tplacement: 'top',\n\t\tplacementRtl: 'top',\n\t\tcontainer: '',\n\t\tstrategy: 'fixed',\n\t\toffset: '0, 5px',\n\t\toffsetRtl: '0, 5px',\n\t\tdelayShow: 0,\n\t\tdelayHide: 0,\n\t\tpermanent: false,\n\t\tzindex: '100',\n\t};\n\tprotected override _config: KTTooltipConfigInterface = this._defaultConfig;\n\tprotected _isOpen: boolean = false;\n\tprotected _targetElement: HTMLElement;\n\tprotected _popper!: Instance;\n\tprotected _transitioning: boolean = false;\n\tprotected _timeout!: ReturnType<typeof setTimeout>;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTTooltipConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-tooltip') as string,\n\t\t\t) ||\n\t\t\tthis._element.querySelector('[data-kt-tooltip-content]') ||\n\t\t\tKTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tif (this._getOption('trigger') === 'click') {\n\t\t\tthis._element.addEventListener('click', () => this._toggle());\n\t\t}\n\n\t\tif (this._getOption('trigger') === 'focus') {\n\t\t\tthis._element.addEventListener('focus', () => this._toggle());\n\t\t\tthis._element.addEventListener('blur', () => this._hide());\n\t\t}\n\n\t\tif (this._getOption('trigger') === 'hover') {\n\t\t\tthis._element.addEventListener('mouseenter', () => this._show());\n\t\t\tthis._element.addEventListener('mouseleave', () => this._hide());\n\t\t}\n\t}\n\n\tprotected _show(): void {\n\t\tif (this._timeout) {\n\t\t\tclearTimeout(this._timeout);\n\t\t}\n\n\t\tif (this._isOpen) return;\n\n\t\tthis._timeout = setTimeout(\n\t\t\t() => {\n\t\t\t\tconst payload = { cancel: false };\n\t\t\t\tthis._fireEvent('show', payload);\n\t\t\t\tthis._dispatchEvent('show', payload);\n\t\t\t\tif (payload.cancel === true) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!this._targetElement) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!this._element) return;\n\n\t\t\t\tthis._createPopper();\n\t\t\t\tthis._handleContainer();\n\t\t\t\tthis._setZindex();\n\n\t\t\t\tthis._targetElement.classList.add('show');\n\t\t\t\tthis._targetElement.classList.remove(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\t\t\t\tthis._targetElement.style.opacity = '0';\n\t\t\t\tKTDom.reflow(this._targetElement);\n\t\t\t\tthis._targetElement.style.opacity = '1';\n\t\t\t\tthis._transitioning = true;\n\t\t\t\tthis._isOpen = true;\n\n\t\t\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\t\t\tthis._targetElement.style.opacity = '';\n\t\t\t\t\tthis._transitioning = false;\n\t\t\t\t\tthis._fireEvent('shown');\n\t\t\t\t\tthis._dispatchEvent('shown');\n\t\t\t\t});\n\t\t\t},\n\t\t\tthis._getOption('delayShow') as number,\n\t\t);\n\t}\n\n\tprotected _hide(): void {\n\t\tif (this._timeout) {\n\t\t\tclearTimeout(this._timeout);\n\t\t}\n\n\t\tif (!this._isOpen) return;\n\n\t\tthis._timeout = setTimeout(\n\t\t\t() => {\n\t\t\t\tconst payload = { cancel: false };\n\t\t\t\tthis._fireEvent('hide', payload);\n\t\t\t\tthis._dispatchEvent('hide', payload);\n\t\t\t\tif (payload.cancel === true) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!this._targetElement) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis._targetElement.style.opacity = '1';\n\t\t\t\tKTDom.reflow(this._targetElement);\n\t\t\t\tthis._targetElement.style.opacity = '0';\n\t\t\t\tthis._transitioning = true;\n\t\t\t\tthis._isOpen = false;\n\n\t\t\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\t\t\tthis._popper.destroy();\n\t\t\t\t\tthis._targetElement.classList.remove('show');\n\t\t\t\t\tthis._targetElement.classList.add(\n\t\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t\t);\n\t\t\t\t\tthis._targetElement.style.opacity = '';\n\t\t\t\t\tthis._transitioning = false;\n\t\t\t\t\tthis._fireEvent('hidden');\n\t\t\t\t\tthis._dispatchEvent('hidden');\n\t\t\t\t});\n\t\t\t},\n\t\t\tthis._getOption('delayHide') as number,\n\t\t);\n\t}\n\n\tprotected _toggle(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show();\n\t\t}\n\t}\n\n\tprotected _createPopper(): void {\n\t\tif (!this._element) return;\n\n\t\tconst isRtl = KTDom.isRTL();\n\n\t\t// Placement\n\t\tlet placement = this._getOption('placement') as Placement;\n\t\tif (isRtl && this._getOption('placementRtl')) {\n\t\t\tplacement = this._getOption('placementRtl') as Placement;\n\t\t}\n\n\t\t// Offset\n\t\tlet offsetValue = this._getOption('offset');\n\t\tif (isRtl && this._getOption('offsetRtl')) {\n\t\t\toffsetValue = this._getOption('offsetRtl') as Placement;\n\t\t}\n\t\tconst offset = offsetValue\n\t\t\t? offsetValue\n\t\t\t\t\t.toString()\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.map((value) => parseInt(value.trim(), 10))\n\t\t\t: [0, 0];\n\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._popper = createPopper(this._element, this._targetElement, {\n\t\t\tplacement: placement,\n\t\t\tstrategy: this._getOption('strategy') as PositioningStrategy,\n\t\t\tmodifiers: [\n\t\t\t\t{\n\t\t\t\t\tname: 'offset',\n\t\t\t\t\toptions: {\n\t\t\t\t\t\toffset,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n\n\tprotected _handleContainer(): void {\n\t\tif (this._getOption('container')) {\n\t\t\tif (this._getOption('container') === 'body') {\n\t\t\t\tdocument.body.appendChild(this._targetElement);\n\t\t\t} else {\n\t\t\t\tdocument\n\t\t\t\t\t.querySelector(this._getOption('container') as string)\n\t\t\t\t\t?.appendChild(this._targetElement);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _setZindex(): void {\n\t\tlet zindex: number = parseInt(this._getOption('zindex') as string);\n\n\t\tif (parseInt(KTDom.getCssProp(this._element, 'z-index')) > zindex) {\n\t\t\tzindex = parseInt(KTDom.getCssProp(this._element, 'z-index'));\n\t\t}\n\n\t\tif (KTDom.getHighestZindex(this._element) > zindex) {\n\t\t\tzindex = KTDom.getHighestZindex(this._element) + 1;\n\t\t}\n\n\t\tthis._targetElement.style.zIndex = String(zindex);\n\t}\n\n\tpublic show(): void {\n\t\tthis._show();\n\t}\n\n\tpublic hide(): void {\n\t\tthis._hide();\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic getContentElement(): HTMLElement | null {\n\t\treturn this._targetElement;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\tpublic getTriggerOption(): KTTooltipTriggerType {\n\t\treturn this._getOption('trigger') as KTTooltipTriggerType;\n\t}\n\n\tpublic isPermanent(): boolean {\n\t\treturn this._getOption('permanent') as boolean;\n\t}\n\n\tpublic static initHandlers(): void {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tdocument\n\t\t\t\t.querySelectorAll('[data-kt-tooltip-initialized]')\n\t\t\t\t.forEach((tooltipElement) => {\n\t\t\t\t\tconst tooltip = KTTooltip.getInstance(tooltipElement as HTMLElement);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\ttooltip &&\n\t\t\t\t\t\ttooltip.isOpen() &&\n\t\t\t\t\t\ttooltip.getTriggerOption() !== 'hover' &&\n\t\t\t\t\t\t!tooltip.isPermanent()\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst contentElement = tooltip.getContentElement();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcontentElement &&\n\t\t\t\t\t\t\t(contentElement === event.target ||\n\t\t\t\t\t\t\t\tcontentElement.contains(event.target as HTMLElement))\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttooltip.hide();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t});\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTTooltip {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'tooltip')) {\n\t\t\treturn KTData.get(element, 'tooltip') as KTTooltip;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-tooltip')) {\n\t\t\treturn new KTTooltip(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTTooltipConfigInterface,\n\t): KTTooltip {\n\t\treturn this.getInstance(element) || new KTTooltip(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tdocument.querySelectorAll('[data-kt-tooltip]').forEach((element) => {\n\t\t\tnew KTTooltip(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTTooltip.createInstances();\n\n\t\tif (window.KT_TOOLTIP_INITIALIZED !== true) {\n\t\t\tKTTooltip.initHandlers();\n\t\t\twindow.KT_TOOLTIP_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTTooltip = KTTooltip;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTScrollable } from './scrollable';\nexport type {\n\tKTScrollableConfigInterface,\n\tKTScrollableInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTTogglePassword } from './toggle-password';\nexport type {\n\tKTTogglePasswordConfigInterface,\n\tKTTogglePasswordInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTOptionType } from '../types';\n\nconst KTUtils = {\n\tgeUID(prefix: string = ''): string {\n\t\treturn prefix + Math.floor(Math.random() * new Date().getTime());\n\t},\n\n\tgetCssVar(variable: string): string {\n\t\tlet hex = getComputedStyle(document.documentElement).getPropertyValue(\n\t\t\tvariable,\n\t\t);\n\n\t\tif (hex && hex.length > 0) {\n\t\t\thex = hex.trim();\n\t\t}\n\n\t\treturn hex;\n\t},\n\n\tparseDataAttribute(value: string): KTOptionType {\n\t\tif (value === 'true') {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (value === 'false') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (value === Number(value).toString()) {\n\t\t\treturn Number(value);\n\t\t}\n\n\t\tif (value === '' || value === 'null') {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (typeof value !== 'string') {\n\t\t\treturn value;\n\t\t}\n\n\t\ttry {\n\t\t\treturn KTUtils.parseJson(value) as object;\n\t\t} catch {\n\t\t\treturn value;\n\t\t}\n\t},\n\n\tparseJson(value: string): JSON {\n\t\treturn value && value.length > 0\n\t\t\t? JSON.parse(decodeURIComponent(value))\n\t\t\t: null;\n\t},\n\n\tparseSelector(selector: string): string {\n\t\tif (selector && window.CSS && window.CSS.escape) {\n\t\t\t// Escape any IDs in the selector using CSS.escape\n\t\t\tselector = selector.replace(\n\t\t\t\t/#([^\\s\"#']+)/g,\n\t\t\t\t(match, id) => `#${window.CSS.escape(id)}`,\n\t\t\t);\n\t\t}\n\n\t\treturn selector;\n\t},\n\n\tcapitalize(value: string): string {\n\t\treturn value.charAt(0).toUpperCase() + value.slice(1);\n\t},\n\n\tuncapitalize(value: string): string {\n\t\treturn value.charAt(0).toLowerCase() + value.slice(1);\n\t},\n\n\tcamelCase(value: string): string {\n\t\treturn value.replace(/-([a-z])/g, (match, letter) => {\n\t\t\treturn letter.toUpperCase();\n\t\t});\n\t},\n\n\tcamelReverseCase(str: string): string {\n\t\treturn str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\t},\n\n\tisRTL(): boolean {\n\t\tconst htmlElement = document.querySelector('html');\n\t\treturn Boolean(\n\t\t\thtmlElement && htmlElement.getAttribute('direction') === 'rtl',\n\t\t);\n\t},\n\n\tthrottle(\n\t\ttimer: undefined | ReturnType<typeof setTimeout>,\n\t\tfunc: CallableFunction,\n\t\tdelay: number,\n\t): void {\n\t\t// If setTimeout is already scheduled, no need to do anything\n\t\tif (timer) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Schedule a setTimeout after delay seconds\n\t\ttimer = setTimeout(() => {\n\t\t\tfunc();\n\n\t\t\t// Once setTimeout function execution is finished, timerId = undefined so that in <br>\n\t\t\t// the next scroll event function execution can be scheduled by the setTimeout\n\t\t\tclearTimeout(timer);\n\t\t}, delay);\n\t},\n\n\tchecksum(value: string): string {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\thash = ((hash << 5) - hash + value.charCodeAt(i)) | 0;\n\t\t}\n\n\t\treturn ('0000000' + (hash >>> 0).toString(16)).slice(-8);\n\t},\n\n\tstringToBoolean: (value: KTOptionType): boolean | null => {\n\t\tif (typeof value === 'boolean') return value;\n\t\tif (typeof value !== 'string') return null;\n\n\t\tconst cleanedStr = value.toLowerCase().trim();\n\t\tif (cleanedStr === 'true') return true;\n\t\tif (cleanedStr === 'false') return false;\n\t\treturn null;\n\t},\n\n\tstringToObject: <T>(value: KTOptionType): T | null => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(value.toString() as string);\n\t\t\tif (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n\t\t\t\treturn parsed as T;\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\tstringToInteger: (value: KTOptionType | number): number | null => {\n\t\t// If already a number, return it as an integer\n\t\tif (typeof value === 'number' && !isNaN(value)) {\n\t\t\treturn Math.floor(value);\n\t\t}\n\n\t\t// If not a string, return null\n\t\tif (typeof value !== 'string') return null;\n\n\t\tconst cleanedStr = value.trim();\n\t\tconst num = parseInt(cleanedStr, 10);\n\t\tif (!isNaN(num) && cleanedStr !== '') {\n\t\t\treturn num;\n\t\t}\n\t\treturn null;\n\t},\n\n\tstringToFloat: (value: KTOptionType | number): number | null => {\n\t\t// If already a number, return it as is\n\t\tif (typeof value === 'number' && !isNaN(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// If not a string, return null\n\t\tif (typeof value !== 'string') return null;\n\n\t\tconst cleanedStr = value.trim();\n\t\tconst num = parseFloat(cleanedStr);\n\t\tif (!isNaN(num) && cleanedStr !== '') {\n\t\t\treturn num;\n\t\t}\n\t\treturn null;\n\t},\n};\n\nexport default KTUtils;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTDataTable } from './datatable';\nexport type {\n\tKTDataTableSortOrderInterface,\n\tKTDataTableDataInterface,\n\tKTDataTableStateInterface as KTDataTableState,\n\tKTDataTableInterface,\n\tKTDataTableResponseDataInterface,\n\tKTDataTableConfigInterface,\n\tKTDataTableColumnFilterTypeInterface,\n\tKTDataTableColumnFilterInterface,\n\tKTDataTableCheckConfigInterface,\n\tKTDataTableCheckInterface,\n\tKTDataTableCheckChangePayloadInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n/* eslint-disable guard-for-in */\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\ndeclare global {\n\tinterface Window {\n\t\tKTGlobalComponentsConfig: object;\n\t}\n}\n\nimport KTData from '../helpers/data';\nimport KTDom from '../helpers/dom';\nimport KTUtils from '../helpers/utils';\nimport { KTOptionType } from '../types';\n\nexport default class KTComponent {\n\tprotected _dataOptionPrefix: string = 'kt-';\n\tprotected _name: string;\n\tprotected _defaultConfig: object;\n\tprotected _config: object;\n\tprotected _events: Map<string, Map<string, CallableFunction>>;\n\tprotected _uid: string | null = null;\n\tprotected _element: HTMLElement | null = null;\n\n\t/**\n\t * Check if component should skip initialization\n\t * Returns true if element already has an instance and is still connected to DOM\n\t * Returns false if element should be initialized (no instance or disconnected)\n\t * @param element The element to check\n\t * @returns true if initialization should be skipped, false otherwise\n\t */\n\tprotected _shouldSkipInit(element: HTMLElement): boolean {\n\t\tif (!KTData.has(element, this._name)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst existingInstance = KTData.get(element, this._name) as KTComponent;\n\n\t\t// If element is not connected to DOM, dispose old instance and allow reinitialization\n\t\tif (element.isConnected === false) {\n\t\t\tif (existingInstance && typeof existingInstance.dispose === 'function') {\n\t\t\t\texistingInstance.dispose();\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// Element is connected and has instance, skip initialization\n\t\treturn true;\n\t}\n\n\tprotected _init(element: HTMLElement | null) {\n\t\telement = KTDom.getElement(element);\n\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element = element;\n\t\tthis._events = new Map();\n\t\tthis._uid = KTUtils.geUID(this._name);\n\n\t\tthis._element.setAttribute(`data-kt-${this._name}-initialized`, 'true');\n\n\t\tKTData.set(this._element, this._name, this);\n\t}\n\n\tprotected async _fireEvent(\n\t\teventType: string,\n\t\tpayload: object = null,\n\t): Promise<void> {\n\t\tconst callbacks = this._events.get(eventType);\n\n\t\tif (callbacks instanceof Map == false) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait Promise.all(\n\t\t\tArray.from(callbacks.values())\n\t\t\t\t.filter((callable) => {\n\t\t\t\t\treturn typeof callable === 'function';\n\t\t\t\t})\n\t\t\t\t.map((callable) => {\n\t\t\t\t\treturn Promise.resolve(callable(payload));\n\t\t\t\t}),\n\t\t);\n\t}\n\n\tprotected _dispatchEvent(eventType: string, payload: object = null): void {\n\t\tconst event = new CustomEvent(eventType, {\n\t\t\tdetail: { payload },\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t\tcomposed: false,\n\t\t});\n\n\t\tif (!this._element) return;\n\t\tthis._element.dispatchEvent(event);\n\t}\n\n\tprotected _getOption(name: string): KTOptionType {\n\t\tconst value = this._config[name as keyof object];\n\t\tconst reponsiveValue = KTDom.getCssProp(\n\t\t\tthis._element,\n\t\t\t`--kt-${this._name}-${KTUtils.camelReverseCase(name)}`,\n\t\t);\n\n\t\treturn reponsiveValue || value;\n\t}\n\n\tprotected _getGlobalConfig(): object {\n\t\tif (\n\t\t\twindow.KTGlobalComponentsConfig &&\n\t\t\t(window.KTGlobalComponentsConfig as object)[this._name as keyof object]\n\t\t) {\n\t\t\treturn (window.KTGlobalComponentsConfig as object)[\n\t\t\t\tthis._name as keyof object\n\t\t\t] as object;\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t}\n\n\tprotected _buildConfig(config: object = {}): void {\n\t\tif (!this._element) return;\n\n\t\tthis._config = {\n\t\t\t...this._defaultConfig,\n\t\t\t...this._getGlobalConfig(),\n\t\t\t...KTDom.getDataAttributes(\n\t\t\t\tthis._element,\n\t\t\t\tthis._dataOptionPrefix + this._name,\n\t\t\t),\n\t\t\t...config,\n\t\t};\n\t}\n\n\tpublic dispose(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.removeAttribute(`data-kt-${this._name}-initialized`);\n\t\tKTData.remove(this._element, this._name);\n\t}\n\n\tpublic on(eventType: string, callback: CallableFunction): string {\n\t\tconst eventId = KTUtils.geUID();\n\n\t\tif (!this._events.get(eventType)) {\n\t\t\tthis._events.set(eventType, new Map());\n\t\t}\n\n\t\tthis._events.get(eventType).set(eventId, callback);\n\n\t\treturn eventId;\n\t}\n\n\tpublic off(eventType: string, eventId: string): void {\n\t\tthis._events.get(eventType)?.delete(eventId);\n\t}\n\n\tpublic getOption(name: string): KTOptionType {\n\t\treturn this._getOption(name as keyof object);\n\t}\n\n\tpublic getElement(): HTMLElement {\n\t\tif (!this._element) return null;\n\t\treturn this._element;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTAccordion } from './accordion';\nexport type { KTAccordionConfigInterface, KTAccordionInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTImageInputInterface, KTImageInputConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_IMAGE_INPUT_INITIALIZED: boolean;\n\t\tKTImageInput: typeof KTImageInput;\n\t}\n}\n\nexport class KTImageInput extends KTComponent implements KTImageInputInterface {\n\tprotected override _name: string = 'image-input';\n\tprotected override _defaultConfig: KTImageInputConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t};\n\tprotected _inputElement: HTMLInputElement;\n\tprotected _hiddenElement: HTMLInputElement;\n\tprotected _removeElement: HTMLElement;\n\tprotected _previewElement: HTMLElement;\n\tprotected _previewUrl: string = '';\n\tprotected _lastMode: string;\n\tprotected _selectedFile: File | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTImageInputConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._inputElement = this._element.querySelector('input[type=\"file\"]')!;\n\t\tthis._hiddenElement = this._element.querySelector('input[type=\"hidden\"]')!;\n\t\tthis._removeElement = this._element.querySelector(\n\t\t\t'[data-kt-image-input-remove]',\n\t\t)!;\n\t\tthis._previewElement = this._element.querySelector(\n\t\t\t'[data-kt-image-input-preview]',\n\t\t)!;\n\n\t\tthis._update();\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-image-input-placeholder]',\n\t\t\t'click',\n\t\t\t(event: Event) => {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tthis._inputElement.click();\n\t\t\t},\n\t\t);\n\n\t\tthis._inputElement.addEventListener('change', () => {\n\t\t\tthis._change();\n\t\t});\n\n\t\tthis._removeElement.addEventListener('click', () => {\n\t\t\tthis._remove();\n\t\t});\n\t}\n\n\tprotected _change(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('change', payload);\n\t\tthis._dispatchEvent('change', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst reader = new FileReader();\n\n\t\treader.onload = () => {\n\t\t\tthis._previewElement.style.backgroundImage = `url(${reader.result})`;\n\t\t};\n\n\t\treader.readAsDataURL(this._inputElement.files[0]);\n\t\tthis._selectedFile = this._inputElement.files[0];\n\t\tthis._lastMode = 'new';\n\n\t\tthis._element.classList.add('changed');\n\t\tthis._removeElement.classList.remove('hidden');\n\t\tthis._element.classList.remove('empty');\n\n\t\tthis._fireEvent('changed');\n\t\tthis._dispatchEvent('changed');\n\t}\n\n\tprotected _remove(): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('remove', payload);\n\t\tthis._dispatchEvent('remove', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element.classList.remove('empty');\n\t\tthis._element.classList.remove('changed');\n\n\t\tif (this._lastMode == 'new') {\n\t\t\tif (this._previewUrl == '')\n\t\t\t\tthis._removeElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\n\t\t\tif (this._previewUrl) {\n\t\t\t\tthis._previewElement.style.backgroundImage = `url(${this._previewUrl})`;\n\t\t\t} else {\n\t\t\t\tthis._previewElement.style.backgroundImage = 'none';\n\t\t\t\tthis._element.classList.add('empty');\n\t\t\t}\n\n\t\t\tthis._inputElement.value = '';\n\t\t\tthis._hiddenElement.value = '';\n\t\t\tthis._selectedFile = null;\n\n\t\t\tthis._lastMode = 'saved';\n\t\t} else if (this._lastMode == 'saved') {\n\t\t\tif (this._previewUrl == '')\n\t\t\t\tthis._removeElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\n\t\t\tthis._previewElement.style.backgroundImage = 'none';\n\t\t\tthis._element.classList.add('empty');\n\n\t\t\tthis._hiddenElement.value = '1';\n\t\t\tthis._inputElement.value = '';\n\t\t\tthis._selectedFile = null;\n\n\t\t\tthis._lastMode = 'placeholder';\n\t\t} else if (this._lastMode == 'placeholder') {\n\t\t\tif (this._previewUrl == '')\n\t\t\t\tthis._removeElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\n\t\t\tif (this._previewUrl) {\n\t\t\t\tthis._previewElement.style.backgroundImage = `url(${this._previewUrl})`;\n\t\t\t} else {\n\t\t\t\tthis._element.classList.add('empty');\n\t\t\t}\n\n\t\t\tthis._inputElement.value = '';\n\t\t\tthis._hiddenElement.value = '';\n\t\t\tthis._selectedFile = null;\n\n\t\t\tthis._lastMode = 'saved';\n\t\t}\n\n\t\tthis._fireEvent('remove');\n\t\tthis._dispatchEvent('remove');\n\t}\n\n\tprotected _update() {\n\t\tif (this._previewElement.style.backgroundImage) {\n\t\t\tthis._setPreviewUrl(this._previewElement.style.backgroundImage);\n\t\t\tthis._removeElement.classList.remove(\n\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t);\n\t\t\tthis._lastMode = 'saved';\n\t\t} else {\n\t\t\tthis._removeElement.classList.add(\n\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t);\n\t\t\tthis._element.classList.add('empty');\n\t\t\tthis._lastMode = 'placeholder';\n\t\t}\n\t}\n\n\tprotected _getPreviewUrl(): string {\n\t\treturn this._previewUrl;\n\t}\n\n\tprotected _setPreviewUrl(url: string): void {\n\t\tthis._previewUrl = url.replace(/(url\\(|\\)|\")/g, '');\n\t}\n\n\tpublic isEmpty(): boolean {\n\t\treturn this._selectedFile === null;\n\t}\n\n\tpublic isChanged(): boolean {\n\t\treturn this._selectedFile !== null;\n\t}\n\n\tpublic remove(): void {\n\t\tthis._remove();\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic setPreviewUrl(url: string): void {\n\t\tthis._setPreviewUrl(url);\n\t}\n\n\tpublic getPreviewUrl(): string {\n\t\treturn this._getPreviewUrl();\n\t}\n\n\tpublic getSelectedFile(): File | null {\n\t\treturn this._selectedFile;\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTImageInput | null {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'image-input')) {\n\t\t\treturn KTData.get(element, 'image-input') as KTImageInput;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-image-input')) {\n\t\t\treturn new KTImageInput(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTImageInputConfigInterface,\n\t): KTImageInput {\n\t\treturn this.getInstance(element) || new KTImageInput(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-image-input]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTImageInput(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTImageInput.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTImageInput = KTImageInput;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTStickyInterface, KTStickyConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_STICKY_INITIALIZED: boolean;\n\t\tKTSticky: typeof KTSticky;\n\t}\n}\n\nexport class KTSticky extends KTComponent implements KTStickyInterface {\n\tprotected override _name: string = 'sticky';\n\tprotected override _defaultConfig: KTStickyConfigInterface = {\n\t\ttarget: 'body',\n\t\tname: '',\n\t\tclass: '',\n\t\ttop: '',\n\t\tmiddle: false,\n\t\tbottom: '',\n\t\tstart: '',\n\t\tcenter: false,\n\t\tend: '',\n\t\twidth: '',\n\t\tzindex: '',\n\t\toffset: 0,\n\t\treverse: false,\n\t\trelease: '',\n\t\tactivate: '',\n\t};\n\tprotected override _config: KTStickyConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement | Document | null = null;\n\n\tprotected _attributeRoot: string;\n\tprotected _eventTriggerState: boolean;\n\tprotected _lastScrollTop: number;\n\tprotected _releaseElement: HTMLElement;\n\tprotected _activateElement: HTMLElement;\n\tprotected _wrapperElement: HTMLElement;\n\tprivate _resizeHandler: (() => void) | null = null;\n\tprivate _scrollHandler: (() => void) | null = null;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTStickyConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\t// Check if element already has an instance and is still connected\n\t\tif (this._shouldSkipInit(element)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._releaseElement = KTDom.getElement(\n\t\t\tthis._getOption('release') as string,\n\t\t);\n\t\tthis._activateElement = KTDom.getElement(\n\t\t\tthis._getOption('activate') as string,\n\t\t);\n\t\tthis._wrapperElement = this._element.closest('[data-kt-sticky-wrapper]');\n\t\tthis._attributeRoot = `data-kt-sticky-${this._getOption('name')}`;\n\t\tthis._eventTriggerState = true;\n\t\tthis._lastScrollTop = 0;\n\n\t\tconst targetElement =\n\t\t\tthis._getTarget() === 'body'\n\t\t\t\t? document\n\t\t\t\t: KTDom.getElement(this._getTarget());\n\t\tif (!targetElement) return;\n\n\t\tthis._targetElement = targetElement;\n\n\t\tthis._handlers();\n\t\tthis._process();\n\t\tthis._update();\n\t}\n\n\tprivate _getTarget(): string {\n\t\treturn (\n\t\t\t(this._element.getAttribute('data-kt-sticky-target') as string) ||\n\t\t\t(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\t// Store resize handler reference for cleanup\n\t\tthis._resizeHandler = () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\t() => {\n\t\t\t\t\tthis._update();\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t};\n\n\t\twindow.addEventListener('resize', this._resizeHandler);\n\n\t\t// Store scroll handler reference for cleanup\n\t\tthis._scrollHandler = () => {\n\t\t\tthis._process();\n\t\t};\n\n\t\tif (this._targetElement) {\n\t\t\tif (this._targetElement === document) {\n\t\t\t\twindow.addEventListener('scroll', this._scrollHandler);\n\t\t\t} else {\n\t\t\t\t(this._targetElement as HTMLElement).addEventListener(\n\t\t\t\t\t'scroll',\n\t\t\t\t\tthis._scrollHandler,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _process(): void {\n\t\tconst reverse = this._getOption('reverse');\n\t\tconst offset = this._getOffset();\n\n\t\tif (offset < 0) {\n\t\t\tthis._disable();\n\t\t\treturn;\n\t\t}\n\n\t\tconst st =\n\t\t\tthis._getTarget() === 'body'\n\t\t\t\t? KTDom.getScrollTop()\n\t\t\t\t: (this._targetElement as HTMLElement).scrollTop;\n\t\tconst release =\n\t\t\tthis._releaseElement && KTDom.isPartiallyInViewport(this._releaseElement);\n\n\t\t// Release on reverse scroll mode\n\t\tif (reverse === true) {\n\t\t\t// Forward scroll mode\n\t\t\tif (st > offset && !release) {\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === false) {\n\t\t\t\t\tif (this._enable() === false) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdocument.body.setAttribute(this._attributeRoot, 'on');\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === true) {\n\t\t\t\t\tconst payload = { active: true };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = false;\n\t\t\t\t}\n\t\t\t\t// Back scroll mode\n\t\t\t} else {\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === true) {\n\t\t\t\t\tthis._disable();\n\t\t\t\t\tif (release) {\n\t\t\t\t\t\tthis._element.classList.add('release');\n\t\t\t\t\t}\n\t\t\t\t\tdocument.body.removeAttribute(this._attributeRoot);\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === false) {\n\t\t\t\t\tconst payload = { active: false };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._lastScrollTop = st;\n\t\t\t// Classic scroll mode\n\t\t} else {\n\t\t\t// Forward scroll mode\n\t\t\tif (st > offset && !release) {\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === false) {\n\t\t\t\t\tif (this._enable() === false) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdocument.body.setAttribute(this._attributeRoot, 'on');\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === true) {\n\t\t\t\t\tconst payload = { active: true };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = false;\n\t\t\t\t}\n\t\t\t\t// Back scroll mode\n\t\t\t} else {\n\t\t\t\t// back scroll mode\n\t\t\t\tif (document.body.hasAttribute(this._attributeRoot) === true) {\n\t\t\t\t\tthis._disable();\n\t\t\t\t\tif (release) {\n\t\t\t\t\t\tthis._element.classList.add('release');\n\t\t\t\t\t}\n\t\t\t\t\tdocument.body.removeAttribute(this._attributeRoot);\n\t\t\t\t}\n\n\t\t\t\tif (this._eventTriggerState === false) {\n\t\t\t\t\tconst payload = { active: false };\n\t\t\t\t\tthis._fireEvent('change', payload);\n\t\t\t\t\tthis._dispatchEvent('change', payload);\n\t\t\t\t\tthis._eventTriggerState = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _getOffset(): number {\n\t\tlet offset = parseInt(this._getOption('offset') as string);\n\t\tconst activateElement = KTDom.getElement(\n\t\t\tthis._getOption('activate') as string,\n\t\t);\n\n\t\tif (activateElement) {\n\t\t\toffset = Math.abs(offset - activateElement.offsetTop);\n\t\t}\n\n\t\treturn offset;\n\t}\n\n\tprotected _enable(): boolean {\n\t\tif (!this._element) return false;\n\n\t\tlet width = this._getOption('width') as string;\n\t\tconst top = this._getOption('top') as string;\n\t\tconst middle = this._getOption('middle') as boolean;\n\t\tconst bottom = this._getOption('bottom') as string;\n\t\tconst start = this._getOption('start') as string;\n\t\tconst center = this._getOption('center') as boolean;\n\t\tconst end = this._getOption('end') as string;\n\t\tconst height = this._calculateHeight();\n\t\tconst zindex = this._getOption('zindex') as string;\n\t\tconst classList = this._getOption('class') as string;\n\n\t\tif (height + parseInt(top) > KTDom.getViewPort().height) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (width) {\n\t\t\tconst targetElement = document.querySelector(width) as HTMLElement;\n\t\t\tif (targetElement) {\n\t\t\t\twidth = KTDom.getCssProp(targetElement, 'width');\n\t\t\t} else if (width == 'auto') {\n\t\t\t\twidth = KTDom.getCssProp(this._element, 'width');\n\t\t\t}\n\n\t\t\tthis._element.style.width = `${Math.round(parseFloat(width))}px`;\n\t\t}\n\n\t\tif (middle === true) {\n\t\t\tthis._element.style.insetBlockStart = `50%`;\n\t\t} else {\n\t\t\tif (top) {\n\t\t\t\tif (top === 'auto') {\n\t\t\t\t\tthis._element.style.insetBlockStart = `0px`;\n\t\t\t\t} else {\n\t\t\t\t\tthis._element.style.insetBlockStart = `${top}px`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (bottom) {\n\t\t\t\t\tif (bottom === 'auto') {\n\t\t\t\t\t\tthis._element.style.insetBlockEnd = `0px`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._element.style.insetBlockEnd = `${bottom}px`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (center === true) {\n\t\t\tthis._element.style.insetInlineStart = `50%`;\n\t\t} else {\n\t\t\tif (start) {\n\t\t\t\tif (start === 'auto') {\n\t\t\t\t\tconst offsetLeft = KTDom.offset(this._element).left;\n\t\t\t\t\tif (offsetLeft >= 0) {\n\t\t\t\t\t\tthis._element.style.insetInlineStart = `${offsetLeft}px`;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis._element.style.insetInlineStart = `${start}px`;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (end) {\n\t\t\t\t\tif (end === 'auto') {\n\t\t\t\t\t\tconst offsetRight = KTDom.offset(this._element).right;\n\t\t\t\t\t\tif (offsetRight >= 0) {\n\t\t\t\t\t\t\tthis._element.style.insetInlineEnd = `${offsetRight}px`;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._element.style.insetInlineEnd = `${end}px`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (zindex) {\n\t\t\tthis._element.style.zIndex = zindex;\n\t\t\tthis._element.style.position = 'fixed';\n\t\t}\n\n\t\tif (classList) {\n\t\t\tKTDom.addClass(this._element, classList);\n\t\t}\n\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.style.height = `${height}px`;\n\t\t}\n\n\t\tthis._element.classList.add('active');\n\t\tthis._element.classList.remove('release');\n\n\t\treturn true;\n\t}\n\n\tprotected _disable(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.style.top = '';\n\t\tthis._element.style.bottom = '';\n\t\tthis._element.style.insetInlineStart = '';\n\t\tthis._element.style.insetInlineEnd = '';\n\t\tthis._element.style.insetBlockStart = '';\n\t\tthis._element.style.insetBlockEnd = '';\n\t\tthis._element.style.width = '';\n\t\tthis._element.style.left = '';\n\t\tthis._element.style.right = '';\n\t\tthis._element.style.zIndex = '';\n\t\tthis._element.style.position = '';\n\n\t\tconst classList = this._getOption('class') as string;\n\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.style.height = '';\n\t\t}\n\n\t\tif (classList) {\n\t\t\tKTDom.removeClass(this._element, classList);\n\t\t}\n\n\t\tthis._element.classList.remove('active');\n\t}\n\n\tprotected _update(): void {\n\t\tif (this._isActive()) {\n\t\t\tthis._disable();\n\t\t\tthis._enable();\n\t\t} else {\n\t\t\tthis._disable();\n\t\t}\n\t}\n\n\tprotected _calculateHeight(): number {\n\t\tif (!this._element) return 0;\n\n\t\tlet height = parseFloat(KTDom.getCssProp(this._element, 'height'));\n\t\theight += parseFloat(KTDom.getCssProp(this._element, 'margin-top'));\n\t\theight += parseFloat(KTDom.getCssProp(this._element, 'margin-bottom'));\n\n\t\tif (KTDom.getCssProp(this._element, 'border-top')) {\n\t\t\theight =\n\t\t\t\theight + parseFloat(KTDom.getCssProp(this._element, 'border-top'));\n\t\t}\n\n\t\tif (KTDom.getCssProp(this._element, 'border-bottom')) {\n\t\t\theight =\n\t\t\t\theight + parseFloat(KTDom.getCssProp(this._element, 'border-bottom'));\n\t\t}\n\n\t\treturn height;\n\t}\n\n\tprotected _isActive(): boolean {\n\t\treturn this._element.classList.contains('active');\n\t}\n\n\tpublic update(): void {\n\t\tthis._update();\n\t}\n\n\tpublic isActive(): boolean {\n\t\treturn this._isActive();\n\t}\n\n\tpublic override dispose(): void {\n\t\t// Remove resize event listener\n\t\tif (this._resizeHandler) {\n\t\t\twindow.removeEventListener('resize', this._resizeHandler);\n\t\t\tthis._resizeHandler = null;\n\t\t}\n\n\t\t// Remove scroll event listener\n\t\tif (this._scrollHandler) {\n\t\t\tif (this._targetElement === document) {\n\t\t\t\twindow.removeEventListener('scroll', this._scrollHandler);\n\t\t\t} else if (this._targetElement) {\n\t\t\t\t(this._targetElement as HTMLElement).removeEventListener(\n\t\t\t\t\t'scroll',\n\t\t\t\t\tthis._scrollHandler,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis._scrollHandler = null;\n\t\t}\n\n\t\t// Clean up state\n\t\tthis._disable();\n\t\tif (this._attributeRoot && document.body.hasAttribute(this._attributeRoot)) {\n\t\t\tdocument.body.removeAttribute(this._attributeRoot);\n\t\t}\n\n\t\t// Call parent dispose to clean up data attributes and KTData\n\t\tsuper.dispose();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTSticky {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'sticky')) {\n\t\t\treturn KTData.get(element, 'sticky') as KTSticky;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-sticky')) {\n\t\t\treturn new KTSticky(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTStickyConfigInterface,\n\t): KTSticky {\n\t\treturn this.getInstance(element) || new KTSticky(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-sticky]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTSticky(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTSticky.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTSticky = KTSticky;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTModal } from './modal';\nexport type { KTModalConfigInterface, KTModalInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport {\n\tKTSelectConfigInterface,\n\tKTSelectOption as KTSelectOptionData,\n} from './config';\n\n/**\n * KTSelectRemote class\n * Handles fetching remote data for the KTSelect component\n */\nexport class KTSelectRemote {\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _isLoading: boolean = false;\n\tprivate _hasError: boolean = false;\n\tprivate _errorMessage: string = '';\n\tprivate _currentPage: number = 1;\n\tprivate _totalPages: number = 1;\n\tprivate _lastQuery: string = '';\n\tprivate _element: HTMLElement | null = null;\n\n\t/**\n\t * Constructor\n\t * @param config KTSelect configuration\n\t * @param element The select element\n\t */\n\tconstructor(config: KTSelectConfigInterface, element?: HTMLElement) {\n\t\tthis._config = config;\n\t\tthis._element = element || null;\n\t}\n\n\t/**\n\t * Fetch data from remote URL\n\t * @param query Optional search query\n\t * @param page Page number for pagination\n\t * @returns Promise with fetched items\n\t */\n\tpublic fetchData(\n\t\tquery?: string,\n\t\tpage: number = 1,\n\t): Promise<KTSelectOptionData[]> {\n\t\tthis._isLoading = true;\n\t\tthis._hasError = false;\n\t\tthis._errorMessage = '';\n\t\tthis._lastQuery = query || '';\n\t\tthis._currentPage = page;\n\n\t\tlet url = this._buildUrl(query, page);\n\n\t\t// Dispatch search start event\n\t\tthis._dispatchEvent('remoteSearchStart');\n\n\t\treturn fetch(url)\n\t\t\t.then((response: Response): Promise<any> => {\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`HTTP error! Status: ${response.status}`);\n\t\t\t\t}\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.then((data: any): KTSelectOptionData[] => {\n\t\t\t\t// Process the data\n\t\t\t\treturn this._processData(data);\n\t\t\t})\n\t\t\t.catch((error: Error): KTSelectOptionData[] => {\n\t\t\t\tconsole.error('Error fetching remote data:', error);\n\t\t\t\tthis._hasError = true;\n\t\t\t\tthis._errorMessage =\n\t\t\t\t\tthis._config.remoteErrorMessage || 'Failed to load data';\n\t\t\t\treturn [];\n\t\t\t})\n\t\t\t.finally((): void => {\n\t\t\t\tthis._isLoading = false;\n\t\t\t\t// Dispatch search end event\n\t\t\t\tthis._dispatchEvent('remoteSearchEnd');\n\t\t\t});\n\t}\n\n\t/**\n\t * Dispatch custom events to notify about search state changes\n\t * @param eventName Name of the event to dispatch\n\t */\n\tprivate _dispatchEvent(eventName: string): void {\n\t\tif (!this._element) return;\n\n\t\tconst event = new CustomEvent(`ktselect.${eventName}`, {\n\t\t\tbubbles: true,\n\t\t\tdetail: {\n\t\t\t\tquery: this._lastQuery,\n\t\t\t\tisLoading: this._isLoading,\n\t\t\t\thasError: this._hasError,\n\t\t\t\terrorMessage: this._errorMessage,\n\t\t\t},\n\t\t});\n\n\t\tthis._element.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Build the URL for the API request\n\t * @param query Search query\n\t * @param page Page number\n\t * @returns Fully formed URL\n\t */\n\tprivate _buildUrl(query?: string, page: number = 1): string {\n\t\tlet url = this._config.dataUrl;\n\n\t\tif (!url) {\n\t\t\tconsole.error('No URL specified for remote data');\n\t\t\treturn '';\n\t\t}\n\n\t\t// Add parameters\n\t\tconst params = new URLSearchParams();\n\n\t\t// Add search parameter if provided\n\t\tif (query && this._config.searchParam) {\n\t\t\tparams.append(this._config.searchParam, query);\n\t\t}\n\n\t\t// Add pagination parameters if enabled\n\t\tif (this._config.pagination) {\n\t\t\tconst limitParam = this._config.paginationLimitParam || 'limit';\n\t\t\tconst pageParam = this._config.paginationPageParam || 'page';\n\t\t\tconst limit = this._config.paginationLimit || 10;\n\n\t\t\tparams.append(limitParam, limit.toString());\n\t\t\tparams.append(pageParam, page.toString());\n\t\t}\n\n\t\t// Append parameters to URL if there are any\n\t\tconst paramsString = params.toString();\n\t\tif (paramsString) {\n\t\t\turl += (url.includes('?') ? '&' : '?') + paramsString;\n\t\t}\n\n\t\treturn url;\n\t}\n\n\t/**\n\t * Process the API response data\n\t * @param data API response data\n\t * @returns Array of KTSelectOptionData\n\t */\n\tprivate _processData(data: any): KTSelectOptionData[] {\n\t\ttry {\n\n\t\t\tlet processedData = data;\n\n\t\t\t// Extract data from the API property if specified\n\t\t\tif (this._config.apiDataProperty && data[this._config.apiDataProperty]) {\n\n\t\t\t\t// If pagination metadata is available, extract it\n\t\t\t\tif (this._config.pagination) {\n\t\t\t\t\tif (data.total_pages) {\n\t\t\t\t\t\tthis._totalPages = data.total_pages;\n\t\t\t\t\t}\n\t\t\t\t\tif (data.total) {\n\t\t\t\t\t\tthis._totalPages = Math.ceil(\n\t\t\t\t\t\t\tdata.total / (this._config.paginationLimit || 10),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tprocessedData = data[this._config.apiDataProperty];\n\t\t\t}\n\n\t\t\t// Ensure data is an array\n\t\t\tif (!Array.isArray(processedData)) {\n\t\t\t\tconsole.warn('Remote data is not an array:', processedData);\n\t\t\t\treturn [];\n\t\t\t}\n\n\n\t\t\t// Map data to KTSelectOptionData format\n\t\t\tconst mappedData = processedData.map((item: any): KTSelectOptionData => {\n\t\t\t\tconst mappedItem = this._mapItemToOption(item);\n\n\t\t\t\t// Add logging to trace data path extraction\n\t\t\t\tif (\n\t\t\t\t\tthis._config.dataValueField &&\n\t\t\t\t\tthis._config.dataValueField.includes('.')\n\t\t\t\t) {\n\t\t\t\t\t// For nested paths, verify extraction worked\n\t\t\t\t\tconst parts = this._config.dataValueField.split('.');\n\t\t\t\t\tlet nestedValue = item;\n\n\t\t\t\t\t// Try to navigate to the value manually for verification\n\t\t\t\t\tfor (const part of parts) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnestedValue &&\n\t\t\t\t\t\t\ttypeof nestedValue === 'object' &&\n\t\t\t\t\t\t\tpart in nestedValue\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnestedValue = nestedValue[part];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnestedValue = null;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we found a value, verify it matches what was extracted\n\t\t\t\t\tif (nestedValue !== null && nestedValue !== undefined) {\n\t\t\t\t\t\tconst expectedValue = String(nestedValue);\n\n\t\t\t\t\t\tif (mappedItem.id !== expectedValue && expectedValue) {\n\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t`Value mismatch! Path: ${this._config.dataValueField}, Expected: ${expectedValue}, Got: ${mappedItem.id}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn mappedItem;\n\t\t\t});\n\n\t\t\treturn mappedData;\n\t\t} catch (error) {\n\t\t\tconsole.error('Error processing remote data:', error);\n\t\t\tthis._hasError = true;\n\t\t\tthis._errorMessage = 'Error processing data';\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Map a data item to KTSelectOptionData format\n\t * @param item Data item from API\n\t * @returns KTSelectOptionData object\n\t */\n\tprivate _mapItemToOption(item: any): KTSelectOptionData {\n\t\t// Get the field mapping from config with fallbacks for common field names\n\t\tconst valueField = this._config.dataValueField || 'id';\n\t\tconst labelField = this._config.dataFieldText || 'title';\n\n\n\t\t// Extract values using improved getValue function\n\t\tconst getValue = (obj: any, path: string): any => {\n\t\t\tif (!path || !obj) return null;\n\n\t\t\ttry {\n\t\t\t\t// Handle dot notation to access nested properties\n\t\t\t\tconst parts = path.split('.');\n\t\t\t\tlet result = obj;\n\n\t\t\t\tfor (const part of parts) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tresult === null ||\n\t\t\t\t\t\tresult === undefined ||\n\t\t\t\t\t\ttypeof result !== 'object'\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tresult = result[part];\n\t\t\t\t}\n\n\n\t\t\t\treturn result;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`Error extracting path ${path}:`, error);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\n\t\t// Get ID and ensure it's a string\n\t\tlet id = getValue(item, valueField);\n\t\tif (id === null || id === undefined) {\n\t\t\t// Try common fallback fields for ID\n\t\t\tconst fallbackFields = ['id', 'value', 'key', 'pk'];\n\t\t\tfor (const field of fallbackFields) {\n\t\t\t\tif (item[field] !== null && item[field] !== undefined) {\n\t\t\t\t\tid = String(item[field]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tid = String(id);\n\t\t}\n\n\t\t// If still no ID, generate one\n\t\tif (!id) {\n\t\t\tid = `option-${Math.random().toString(36).substr(2, 9)}`;\n\t\t}\n\n\t\t// Get label with proper fallbacks\n\t\tlet title = getValue(item, labelField);\n\t\tif (!title) {\n\t\t\t// Try common fallback fields for title\n\t\t\tconst fallbackFields = [\n\t\t\t\t'name',\n\t\t\t\t'title',\n\t\t\t\t'label',\n\t\t\t\t'text',\n\t\t\t\t'displayName',\n\t\t\t\t'description',\n\t\t\t];\n\t\t\tfor (const field of fallbackFields) {\n\t\t\t\tif (item[field] !== null && item[field] !== undefined) {\n\t\t\t\t\ttitle = String(item[field]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\ttitle = String(title);\n\t\t}\n\n\t\t// If still no title, use ID as fallback\n\t\tif (!title) {\n\t\t\ttitle = `Option ${id}`;\n\t\t}\n\n\t\t// Create the option object with consistent structure\n\t\tconst result: KTSelectOptionData = {\n\t\t\tid: id,\n\t\t\ttitle: title,\n\t\t\tselected: Boolean(item.selected),\n\t\t\tdisabled: Boolean(item.disabled),\n\t\t};\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Load the next page of results\n\t * @returns Promise with fetched items\n\t */\n\tpublic loadNextPage(): Promise<KTSelectOptionData[]> {\n\t\tif (this._currentPage < this._totalPages) {\n\t\t\treturn this.fetchData(this._lastQuery, this._currentPage + 1);\n\t\t}\n\t\treturn Promise.resolve([]);\n\t}\n\n\t/**\n\t * Check if there are more pages available\n\t * @returns Boolean indicating if more pages exist\n\t */\n\tpublic hasMorePages(): boolean {\n\t\treturn this._currentPage < this._totalPages;\n\t}\n\n\t/**\n\t * Get loading state\n\t * @returns Boolean indicating if data is loading\n\t */\n\tpublic isLoading(): boolean {\n\t\treturn this._isLoading;\n\t}\n\n\t/**\n\t * Get error state\n\t * @returns Boolean indicating if there was an error\n\t */\n\tpublic hasError(): boolean {\n\t\treturn this._hasError;\n\t}\n\n\t/**\n\t * Get error message\n\t * @returns Error message\n\t */\n\tpublic getErrorMessage(): string {\n\t\treturn this._errorMessage;\n\t}\n\n\t/**\n\t * Reset the remote data state\n\t */\n\tpublic reset(): void {\n\t\tthis._isLoading = false;\n\t\tthis._hasError = false;\n\t\tthis._errorMessage = '';\n\t\tthis._currentPage = 1;\n\t\tthis._totalPages = 1;\n\t\tthis._lastQuery = '';\n\t}\n\n\t/**\n\t * Set the select element for event dispatching\n\t * @param element The select element\n\t */\n\tpublic setElement(element: HTMLElement): void {\n\t\tthis._element = element;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTScrolltoInterface, KTScrolltoConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_SCROLLTO_INITIALIZED: boolean;\n\t\tKTScrollto: typeof KTScrollto;\n\t}\n}\n\nexport class KTScrollto extends KTComponent implements KTScrolltoInterface {\n\tprotected override _name: string = 'scrollto';\n\tprotected override _defaultConfig: KTScrolltoConfigInterface = {\n\t\tsmooth: true,\n\t\tparent: 'body',\n\t\ttarget: '',\n\t\toffset: 0,\n\t};\n\tprotected override _config: KTScrolltoConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement;\n\n\tconstructor(element: HTMLElement, config?: KTScrolltoConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\n\t\tthis._targetElement = this._getTargetElement();\n\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-scrollto') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\t\t\tthis._scroll();\n\t\t});\n\t}\n\n\tprotected _scroll(): void {\n\t\tconst pos =\n\t\t\tthis._targetElement.offsetTop +\n\t\t\tparseInt(this._getOption('offset') as string);\n\n\t\tlet parent: HTMLElement | Window = KTDom.getElement(\n\t\t\tthis._getOption('parent') as string,\n\t\t);\n\n\t\tif (!parent || parent === document.body) {\n\t\t\tparent = window;\n\t\t}\n\n\t\tparent.scrollTo({\n\t\t\ttop: pos,\n\t\t\tbehavior: (this._getOption('smooth') as boolean) ? 'smooth' : 'instant',\n\t\t});\n\t}\n\n\tpublic scroll(): void {\n\t\tthis._scroll();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTScrollto {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'scrollto')) {\n\t\t\treturn KTData.get(element, 'scrollto') as KTScrollto;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-scrollto')) {\n\t\t\treturn new KTScrollto(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTScrolltoConfigInterface,\n\t): KTScrollto {\n\t\treturn this.getInstance(element) || new KTScrollto(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-scrollto]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTScrollto(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTScrollto.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTScrollto = KTScrollto;\n}\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTScrollto } from './scrollto';\nexport type { KTScrolltoConfigInterface, KTScrolltoInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTReparent } from './reparent';\nexport type { KTReparentConfigInterface, KTReparentInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTComponent from '../component';\nimport { KTSelectConfigInterface } from './config';\nimport { defaultTemplates } from './templates';\n\nexport class KTSelectOption extends KTComponent {\n\tprotected override readonly _name: string = 'select-option';\n\tprotected override readonly _dataOptionPrefix: string = 'kt-'; // Use 'kt-' prefix to support data-kt-select-option attributes\n\tprotected override readonly _config: KTSelectConfigInterface; // Holds option-specific data from data-kt-*\n\tprivate _globalConfig: KTSelectConfigInterface; // Main select's config\n\n\tconstructor(element: HTMLElement, config?: KTSelectConfigInterface) {\n\t\tsuper();\n\n\t\t// Always initialize a new option instance\n\t\tthis._init(element);\n\t\tthis._globalConfig = config;\n\t\tthis._buildConfig();\n\n\t\t// Clean the config\n\t\tthis._config = (this._config as any)[''] || {};\n\n\t\t// Add the option config to the global config\n\t\t// Ensure optionsConfig is initialized\n\t\tif (this._globalConfig) {\n\t\t\tthis._globalConfig.optionsConfig = this._globalConfig.optionsConfig || {};\n\t\t\tthis._globalConfig.optionsConfig[(element as HTMLInputElement).value] =\n\t\t\t\tthis._config;\n\t\t\t// console.log('[KTSelectOption] Populating _globalConfig.optionsConfig for value', (element as HTMLInputElement).value, 'with:', JSON.parse(JSON.stringify(this._config)));\n\t\t\t// console.log('[KTSelectOption] _globalConfig.optionsConfig is now:', JSON.parse(JSON.stringify(this._globalConfig.optionsConfig)));\n\t\t} else {\n\t\t\t// Handle case where _globalConfig might be undefined, though constructor expects it.\n\t\t\t// This might indicate a need to ensure config is always passed or has a default.\n\t\t\tconsole.warn(\n\t\t\t\t'KTSelectOption: _globalConfig is undefined during constructor.',\n\t\t\t);\n\t\t}\n\n\t\t// Don't store in KTData to avoid Singleton pattern issues\n\t\t// Each option should be a unique instance\n\t\t(element as any).instance = this;\n\t}\n\n\tpublic get id(): string {\n\t\treturn this.getHTMLOptionElement().value;\n\t}\n\n\tpublic get title(): string {\n\t\treturn this.getHTMLOptionElement().textContent || '';\n\t}\n\n\tpublic getHTMLOptionElement(): HTMLOptionElement {\n\t\treturn this._element as HTMLOptionElement;\n\t}\n\n\t/**\n\t * Gathers all necessary data for rendering this option,\n\t * including standard HTML attributes and custom data-kt-* attributes.\n\t */\n\tpublic getOptionDataForTemplate(): Record<string, any> {\n\t\tconst el = this.getHTMLOptionElement();\n\t\tconst text = el.textContent || '';\n\t\treturn {\n\t\t\t// Custom data from data-kt-select-option attributes (parsed into this._config)\n\t\t\t...this._config,\n\t\t\t// Standard HTMLOptionElement properties\n\t\t\tvalue: el.value,\n\t\t\ttext: text, // Original text\n\t\t\tselected: el.selected,\n\t\t\tdisabled: el.disabled,\n\t\t\t// Provide 'content' for convenience in templates, defaulting to text.\n\t\t\t// User's optionTemplate can then use {{content}} or specific fields like {{text}}, {{icon}}, etc.\n\t\t\tcontent: text,\n\t\t};\n\t}\n\n\tpublic render(): HTMLElement {\n\t\t// 'this' is the KTSelectOption instance.\n\t\t// defaultTemplates.option will handle using this instance's data along with _globalConfig.\n\t\treturn defaultTemplates.option(this, this._globalConfig);\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n/* eslint-disable max-len */\n/* eslint-disable require-jsdoc */\n\nimport KTData from '../../helpers/data';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTThemeSwitchInterface, KTThemeSwitchConfigInterface } from './types';\nimport { KTThemeSwitchModeType } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_STICKY_INITIALIZED: boolean;\n\t\tKTThemeSwitch: typeof KTThemeSwitch;\n\t}\n}\n\nexport class KTThemeSwitch\n\textends KTComponent\n\timplements KTThemeSwitchInterface\n{\n\tprotected override _name: string = 'theme-swtich';\n\tprotected override _defaultConfig: KTThemeSwitchConfigInterface = {\n\t\tmode: 'light',\n\t};\n\tprotected _mode: KTThemeSwitchModeType | null = null;\n\tprotected _currentMode: KTThemeSwitchModeType | null = null;\n\n\tconstructor(\n\t\telement: HTMLElement | HTMLHtmlElement,\n\t\tconfig: KTThemeSwitchConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement | HTMLHtmlElement, this._name))\n\t\t\treturn;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._setMode(\n\t\t\t(localStorage.getItem('kt-theme') ||\n\t\t\t\tthis._getOption('mode')) as KTThemeSwitchModeType,\n\t\t);\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-theme-switch-toggle]',\n\t\t\t'click',\n\t\t\t() => {\n\t\t\t\tthis._toggle();\n\t\t\t},\n\t\t);\n\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-theme-switch-set]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst mode = target.getAttribute(\n\t\t\t\t\t'data-kt-theme-switch-set',\n\t\t\t\t) as KTThemeSwitchModeType;\n\t\t\t\tthis._setMode(mode);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _toggle() {\n\t\tconst mode = this._currentMode === 'light' ? 'dark' : 'light';\n\n\t\tthis._setMode(mode);\n\t}\n\n\tprotected _setMode(mode: KTThemeSwitchModeType): void {\n\t\tif (!this._element) return;\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('change', payload);\n\t\tthis._dispatchEvent('change', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet currentMode: KTThemeSwitchModeType = mode;\n\t\tif (mode === 'system') {\n\t\t\tcurrentMode = this._getSystemMode();\n\t\t}\n\n\t\tthis._mode = mode;\n\t\tthis._currentMode = currentMode;\n\t\tthis._bindMode();\n\t\tthis._updateState();\n\t\tlocalStorage.setItem('kt-theme', this._mode);\n\t\tthis._element.setAttribute('data-kt-theme-switch-mode', mode);\n\n\t\tthis._fireEvent('changed', {});\n\t\tthis._dispatchEvent('changed', {});\n\t}\n\n\tprotected _getMode(): KTThemeSwitchModeType {\n\t\treturn (\n\t\t\t(localStorage.getItem('kt-theme') as KTThemeSwitchModeType) || this._mode\n\t\t);\n\t}\n\n\tprotected _getSystemMode(): KTThemeSwitchModeType {\n\t\treturn window.matchMedia('(prefers-color-scheme: dark)').matches\n\t\t\t? 'dark'\n\t\t\t: 'light';\n\t}\n\n\tprotected _bindMode(): void {\n\t\tif (!this._currentMode || !this._element) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._element.classList.remove('dark');\n\t\tthis._element.classList.remove('light');\n\t\tthis._element.removeAttribute(this._getOption('attribute') as string);\n\t\tthis._element.classList.add(this._currentMode);\n\t}\n\n\tprotected _updateState() {\n\t\tconst elements = document.querySelectorAll<HTMLInputElement>(\n\t\t\t'input[type=\"checkbox\"][data-kt-theme-switch-state]',\n\t\t);\n\t\telements.forEach((element) => {\n\t\t\tif (element.getAttribute('data-kt-theme-switch-state') === this._mode) {\n\t\t\t\telement.checked = true;\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic getMode(): KTThemeSwitchModeType {\n\t\treturn this._getMode();\n\t}\n\n\tpublic setMode(mode: KTThemeSwitchModeType) {\n\t\tthis.setMode(mode);\n\t}\n\n\tpublic static getInstance(): KTThemeSwitch {\n\t\tconst root = document.documentElement;\n\n\t\tif (KTData.has(root, 'theme-switch')) {\n\t\t\treturn KTData.get(root, 'theme-switch') as KTThemeSwitch;\n\t\t}\n\n\t\tif (root) {\n\t\t\treturn new KTThemeSwitch(root);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst root = document.documentElement;\n\t\tif (root) new KTThemeSwitch(root);\n\t}\n\n\tpublic static init(): void {\n\t\tKTThemeSwitch.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTThemeSwitch = KTThemeSwitch;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTScrollableInterface, KTScrollableConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_SCROLLABLE_INITIALIZED: boolean;\n\t\tKTScrollable: typeof KTScrollable;\n\t}\n}\n\nexport class KTScrollable extends KTComponent implements KTScrollableInterface {\n\tprotected override _name: string = 'scrollable';\n\tprotected override _defaultConfig: KTScrollableConfigInterface = {\n\t\tsave: true,\n\t\tdependencies: '',\n\t\twrappers: '',\n\t\toffset: '',\n\t};\n\tprotected override _config: KTScrollableConfigInterface = this._defaultConfig;\n\tprotected _elementId: string | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTScrollableConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\t\tthis._elementId = this._element.getAttribute('id');\n\t\tthis._handlers();\n\t\tthis._update();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\t\tthis._element.addEventListener('scroll', () => {\n\t\t\tif (!this._element) return;\n\t\t\tlocalStorage.setItem(\n\t\t\t\t`${this._elementId}st`,\n\t\t\t\tthis._element.scrollTop.toString(),\n\t\t\t);\n\t\t});\n\t}\n\n\tprotected _update(): void {\n\t\tthis._setupHeight();\n\t\tthis._setupState();\n\t}\n\n\tprotected _setupHeight(): void {\n\t\tif (!this._element) return;\n\n\t\tconst heightType = this._getHeightType();\n\t\tconst height = this._getHeight();\n\n\t\t// Set height\n\t\tif (height && height != '0' && height.length > 0) {\n\t\t\tthis._element.style.setProperty(heightType, height);\n\t\t} else {\n\t\t\tthis._element.style.setProperty(heightType, '');\n\t\t}\n\t}\n\n\tprotected _setupState(): void {\n\t\tif (!this._element) return;\n\t\tconst stateEnabled = this._getOption('state') === true;\n\t\tconst elementIdExists = Boolean(this._elementId);\n\n\t\tif (stateEnabled && elementIdExists) {\n\t\t\tconst storedPosition = localStorage.getItem(this._elementId + 'st');\n\n\t\t\tif (storedPosition) {\n\t\t\t\tconst pos = parseInt(storedPosition);\n\n\t\t\t\tif (pos > 0) {\n\t\t\t\t\tthis._element.scroll({\n\t\t\t\t\t\ttop: pos,\n\t\t\t\t\t\tbehavior: 'instant',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _getHeight(): string {\n\t\tconst height = this._getHeightOption();\n\n\t\tif (\n\t\t\theight !== null &&\n\t\t\ttypeof height === 'string' &&\n\t\t\theight.toLowerCase() === 'auto'\n\t\t) {\n\t\t\treturn this._getAutoHeight();\n\t\t} else if (height) {\n\t\t\treturn parseInt(height).toString() + 'px';\n\t\t} else {\n\t\t\treturn '0';\n\t\t}\n\t}\n\n\tprotected _getAutoHeight(): string {\n\t\tif (!this._element) return '';\n\t\tlet height = KTDom.getViewPort().height;\n\t\tconst dependencies = this._getOption('dependencies') as string;\n\t\tconst wrappers = this._getOption('wrappers') as string;\n\t\tconst offset = this._getOption('offset') as string;\n\t\theight -= this._getElementSpacing(this._element);\n\n\t\tif (dependencies && dependencies.length > 0) {\n\t\t\tconst elements = document.querySelectorAll(dependencies);\n\t\t\telements.forEach((element) => {\n\t\t\t\tif (KTDom.getCssProp(element as HTMLElement, 'display') === 'none') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\theight -= this._getElementHeight(element as HTMLElement);\n\t\t\t});\n\t\t}\n\n\t\tif (wrappers && wrappers.length > 0) {\n\t\t\tconst elements = document.querySelectorAll(wrappers);\n\t\t\telements.forEach((element) => {\n\t\t\t\tif (KTDom.getCssProp(element as HTMLElement, 'display') === 'none') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\theight -= this._getElementSpacing(element as HTMLElement);\n\t\t\t});\n\t\t}\n\n\t\tif (offset && offset.length > 0) {\n\t\t\theight -= parseInt(offset);\n\t\t}\n\n\t\treturn height.toString() + 'px';\n\t}\n\n\tprotected _getElementHeight(element: HTMLElement): number {\n\t\tlet height = 0;\n\n\t\tif (!element) {\n\t\t\treturn height;\n\t\t}\n\n\t\tconst computedStyle = window.getComputedStyle(element);\n\t\tif (computedStyle.height) {\n\t\t\theight += parseInt(computedStyle.height);\n\t\t}\n\t\tif (computedStyle.marginTop) {\n\t\t\theight += parseInt(computedStyle.marginTop);\n\t\t}\n\t\tif (computedStyle.marginBottom) {\n\t\t\theight += parseInt(computedStyle.marginBottom);\n\t\t}\n\t\tif (computedStyle.borderTopWidth) {\n\t\t\theight += parseInt(computedStyle.borderTopWidth);\n\t\t}\n\t\tif (computedStyle.borderBottomWidth) {\n\t\t\theight += parseInt(computedStyle.borderBottomWidth);\n\t\t}\n\n\t\treturn height;\n\t}\n\n\tprotected _getElementSpacing(element: HTMLElement): number {\n\t\tlet spacing: number = 0;\n\n\t\tif (!element) {\n\t\t\treturn spacing;\n\t\t}\n\n\t\tconst computedStyle = window.getComputedStyle(element);\n\t\tif (computedStyle.marginTop) {\n\t\t\tspacing += parseInt(computedStyle.marginTop);\n\t\t}\n\t\tif (computedStyle.marginBottom) {\n\t\t\tspacing += parseInt(computedStyle.marginBottom);\n\t\t}\n\t\tif (computedStyle.paddingTop) {\n\t\t\tspacing += parseInt(computedStyle.paddingTop);\n\t\t}\n\t\tif (computedStyle.paddingBottom) {\n\t\t\tspacing += parseInt(computedStyle.paddingBottom);\n\t\t}\n\t\tif (computedStyle.borderTopWidth) {\n\t\t\tspacing += parseInt(computedStyle.borderTopWidth);\n\t\t}\n\t\tif (computedStyle.borderBottomWidth) {\n\t\t\tspacing += parseInt(computedStyle.borderBottomWidth);\n\t\t}\n\n\t\treturn spacing;\n\t}\n\n\tprotected _getHeightType(): string {\n\t\tif (this._getOption('minHeight')) {\n\t\t\treturn 'min-height';\n\t\t}\n\t\tif (this._getOption('maxHeight')) {\n\t\t\treturn 'max-height';\n\t\t} else {\n\t\t\treturn 'height';\n\t\t}\n\t}\n\n\tprotected _getHeightOption(): string {\n\t\tconst heightType = this._getHeightType();\n\n\t\tif (heightType == 'min-height') {\n\t\t\treturn this._getOption('minHeight') as string;\n\t\t}\n\t\tif (heightType == 'max-height') {\n\t\t\treturn this._getOption('maxHeight') as string;\n\t\t} else {\n\t\t\treturn this._getOption('height') as string;\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\treturn this._update();\n\t}\n\n\tpublic getHeight(): string {\n\t\treturn this._getHeight();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTScrollable {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'scrollable')) {\n\t\t\treturn KTData.get(element, 'scrollable') as KTScrollable;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-scrollable')) {\n\t\t\treturn new KTScrollable(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTScrollableConfigInterface,\n\t): KTScrollable {\n\t\treturn this.getInstance(element) || new KTScrollable(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-scrollable]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTScrollable(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static handleResize(): void {\n\t\twindow.addEventListener('resize', () => {\n\t\t\tlet timer;\n\n\t\t\tKTUtils.throttle(\n\t\t\t\ttimer,\n\t\t\t\tfunction () {\n\t\t\t\t\t// Locate and update scrollable instances on window resize\n\t\t\t\t\tconst elements = document.querySelectorAll(\n\t\t\t\t\t\t'[data-kt-scrollable-initialized]',\n\t\t\t\t\t);\n\t\t\t\t\telements.forEach((element) => {\n\t\t\t\t\t\tKTScrollable.getInstance(element as HTMLElement)?.update();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t200,\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTScrollable.createInstances();\n\n\t\tif (window.KT_SCROLLABLE_INITIALIZED !== true) {\n\t\t\tKTScrollable.handleResize();\n\n\t\t\twindow.KT_SCROLLABLE_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTScrollable = KTScrollable;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTDropdown } from './dropdown';\nexport type { KTDropdownConfigInterface, KTDropdownInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTCallableType } from '../types';\nimport KTUtils from './utils';\n\nexport interface KTDelegatedEventHandlersInterface {\n\t[key: string]: KTCallableType;\n}\n\nconst KTDelegatedEventHandlers: KTDelegatedEventHandlersInterface = {};\n\nconst KTEventHandler = {\n\ton: function (\n\t\telement: HTMLElement,\n\t\tselector: string,\n\t\teventName: string,\n\t\thandler: KTCallableType,\n\t): string {\n\t\tif (element === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst eventId = KTUtils.geUID('event');\n\n\t\tKTDelegatedEventHandlers[eventId] = (\n\t\t\tevent: Event & { target: HTMLElement },\n\t\t) => {\n\t\t\t// Fix: Check selector dynamically instead of pre-computing targets\n\t\t\t// This allows event delegation to work with dynamically added elements\n\t\t\tlet target = event.target as HTMLElement;\n\n\t\t\twhile (target && target !== element) {\n\t\t\t\t// Check if current target matches the selector\n\t\t\t\tif (target.matches && target.matches(selector)) {\n\t\t\t\t\thandler.call(this, event, target);\n\t\t\t\t\treturn; // Stop bubbling once we've handled it\n\t\t\t\t}\n\n\t\t\t\ttarget = target.parentNode as HTMLElement;\n\t\t\t}\n\t\t};\n\n\t\telement.addEventListener(eventName, KTDelegatedEventHandlers[eventId]);\n\n\t\treturn eventId;\n\t},\n\n\toff(element: HTMLElement, eventName: string, eventId: string) {\n\t\tif (!element || KTDelegatedEventHandlers[eventId] === null) {\n\t\t\treturn;\n\t\t}\n\n\t\telement.removeEventListener(eventName, KTDelegatedEventHandlers[eventId]);\n\n\t\tdelete KTDelegatedEventHandlers[eventId];\n\t},\n};\n\nexport default KTEventHandler;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTAccordionInterface, KTAccordionConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_ACCORDION_INITIALIZED: boolean;\n\t\tKTAccordion: typeof KTAccordion;\n\t}\n}\n\nexport class KTAccordion extends KTComponent implements KTAccordionInterface {\n\tprotected override _name: string = 'accordion';\n\tprotected override _defaultConfig: KTAccordionConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tactiveClass: 'active',\n\t\texpandAll: false,\n\t};\n\tprotected override _config: KTAccordionConfigInterface = this._defaultConfig;\n\tprotected _accordionElements: NodeListOf<HTMLElement>;\n\n\tconstructor(element: HTMLElement, config?: KTAccordionConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-accordion-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst accordionElement = target.closest(\n\t\t\t\t\t'[data-kt-accordion-item]',\n\t\t\t\t) as HTMLElement;\n\n\t\t\t\tif (accordionElement) this._toggle(accordionElement);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _toggle(accordionElement: HTMLElement): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (accordionElement.classList.contains('active')) {\n\t\t\tthis._hide(accordionElement);\n\t\t} else {\n\t\t\tthis._show(accordionElement);\n\t\t}\n\t}\n\n\tprotected _show(accordionElement: HTMLElement): void {\n\t\tif (\n\t\t\taccordionElement.hasAttribute('animating') ||\n\t\t\taccordionElement.classList.contains(\n\t\t\t\tthis._getOption('activeClass') as string,\n\t\t\t)\n\t\t)\n\t\t\treturn;\n\n\t\tconst toggleElement = KTDom.child(\n\t\t\taccordionElement,\n\t\t\t'[data-kt-accordion-toggle]',\n\t\t);\n\t\tif (!toggleElement) return;\n\n\t\tconst contentElement = KTDom.getElement(\n\t\t\t`#${toggleElement.getAttribute('aria-controls')}`,\n\t\t);\n\t\tif (!contentElement) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ((this._getOption('expandAll') as boolean) === false) {\n\t\t\tthis._hideSiblings(accordionElement);\n\t\t}\n\n\t\taccordionElement.setAttribute('aria-expanded', 'true');\n\t\taccordionElement.classList.add(this._getOption('activeClass') as string);\n\n\t\taccordionElement.setAttribute('animating', 'true');\n\t\tcontentElement.classList.remove(this._getOption('hiddenClass') as string);\n\t\tcontentElement.style.height = `0px`;\n\t\tKTDom.reflow(contentElement);\n\t\tcontentElement.style.height = `${contentElement.scrollHeight}px`;\n\n\t\tKTDom.transitionEnd(contentElement, () => {\n\t\t\taccordionElement.removeAttribute('animating');\n\t\t\tcontentElement.style.height = '';\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(accordionElement: HTMLElement): void {\n\t\tif (\n\t\t\taccordionElement.hasAttribute('animating') ||\n\t\t\t!accordionElement.classList.contains(\n\t\t\t\tthis._getOption('activeClass') as string,\n\t\t\t)\n\t\t)\n\t\t\treturn;\n\n\t\tconst toggleElement = KTDom.child(\n\t\t\taccordionElement,\n\t\t\t'[data-kt-accordion-toggle]',\n\t\t);\n\t\tif (!toggleElement) return;\n\n\t\tconst contentElement = KTDom.getElement(\n\t\t\t`#${toggleElement.getAttribute('aria-controls')}`,\n\t\t);\n\t\tif (!contentElement) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\taccordionElement.setAttribute('aria-expanded', 'false');\n\n\t\tcontentElement.style.height = `${contentElement.scrollHeight}px`;\n\t\tKTDom.reflow(contentElement);\n\t\tcontentElement.style.height = '0px';\n\t\taccordionElement.setAttribute('animating', 'true');\n\n\t\tKTDom.transitionEnd(contentElement, () => {\n\t\t\taccordionElement.removeAttribute('animating');\n\t\t\taccordionElement.classList.remove(\n\t\t\t\tthis._getOption('activeClass') as string,\n\t\t\t);\n\t\t\tcontentElement.classList.add(this._getOption('hiddenClass') as string);\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _hideSiblings(accordionElement: HTMLElement): void {\n\t\tconst siblings = KTDom.siblings(accordionElement);\n\n\t\tsiblings?.forEach((sibling) => {\n\t\t\tthis._hide(sibling as HTMLElement);\n\t\t});\n\t}\n\n\tpublic show(accordionElement: HTMLElement): void {\n\t\tthis._show(accordionElement);\n\t}\n\n\tpublic hide(accordionElement: HTMLElement): void {\n\t\tthis._hide(accordionElement);\n\t}\n\n\tpublic toggle(accordionElement: HTMLElement): void {\n\t\tthis._toggle(accordionElement);\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTAccordion {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'accordion')) {\n\t\t\treturn KTData.get(element, 'accordion') as KTAccordion;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-accordion-initialized') === 'true') {\n\t\t\treturn new KTAccordion(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTAccordionConfigInterface,\n\t): KTAccordion {\n\t\treturn this.getInstance(element) || new KTAccordion(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-accordion]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTAccordion(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTAccordion.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTAccordion = KTAccordion;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n// Sorting logic for KTDataTable\n\nimport {\n\tKTDataTableConfigInterface,\n\tKTDataTableSortOrderInterface,\n\tKTDataTableDataInterface,\n} from './types';\n\nexport interface KTDataTableSortAPI<T = KTDataTableDataInterface> {\n\tinitSort(): void;\n\tsortData(\n\t\tdata: T[],\n\t\tsortField: keyof T | number,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): T[];\n\ttoggleSortOrder(\n\t\tcurrentField: keyof T | number,\n\t\tcurrentOrder: KTDataTableSortOrderInterface,\n\t\tnewField: keyof T | number,\n\t): KTDataTableSortOrderInterface;\n\tsetSortIcon(\n\t\tsortField: keyof T,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): void;\n}\n\nexport function createSortHandler<T = KTDataTableDataInterface>(\n\tconfig: KTDataTableConfigInterface,\n\ttheadElement: HTMLTableSectionElement,\n\tgetState: () => {\n\t\tsortField: keyof T | number;\n\t\tsortOrder: KTDataTableSortOrderInterface;\n\t},\n\tsetState: (\n\t\tfield: keyof T | number,\n\t\torder: KTDataTableSortOrderInterface,\n\t) => void,\n\tfireEvent: (eventName: string, eventData?: any) => void,\n\tdispatchEvent: (eventName: string, eventData?: any) => void,\n\tupdateData: () => void,\n): KTDataTableSortAPI<T> {\n\t// Helper to compare values for sorting\n\tfunction compareValues(\n\t\ta: unknown,\n\t\tb: unknown,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): number {\n\t\tconst aText = String(a).replace(/<[^>]*>| /g, '');\n\t\tconst bText = String(b).replace(/<[^>]*>| /g, '');\n\t\treturn aText > bText\n\t\t\t? sortOrder === 'asc'\n\t\t\t\t? 1\n\t\t\t\t: -1\n\t\t\t: aText < bText\n\t\t\t\t? sortOrder === 'asc'\n\t\t\t\t\t? -1\n\t\t\t\t\t: 1\n\t\t\t\t: 0;\n\t}\n\n\tfunction sortData(\n\t\tdata: T[],\n\t\tsortField: keyof T | number,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): T[] {\n\t\treturn data.sort((a, b) => {\n\t\t\tconst aValue = a[sortField as keyof T] as unknown;\n\t\t\tconst bValue = b[sortField as keyof T] as unknown;\n\t\t\treturn compareValues(aValue, bValue, sortOrder);\n\t\t});\n\t}\n\n\tfunction toggleSortOrder(\n\t\tcurrentField: keyof T | number,\n\t\tcurrentOrder: KTDataTableSortOrderInterface,\n\t\tnewField: keyof T | number,\n\t): KTDataTableSortOrderInterface {\n\t\tif (currentField === newField) {\n\t\t\tswitch (currentOrder) {\n\t\t\t\tcase 'asc':\n\t\t\t\t\treturn 'desc';\n\t\t\t\tcase 'desc':\n\t\t\t\t\treturn '';\n\t\t\t\tdefault:\n\t\t\t\t\treturn 'asc';\n\t\t\t}\n\t\t}\n\t\treturn 'asc';\n\t}\n\n\tfunction setSortIcon(\n\t\tsortField: keyof T,\n\t\tsortOrder: KTDataTableSortOrderInterface,\n\t): void {\n\t\tconst sortClass = sortOrder\n\t\t\t? sortOrder === 'asc'\n\t\t\t\t? config.sort?.classes?.asc || ''\n\t\t\t\t: config.sort?.classes?.desc || ''\n\t\t\t: '';\n\t\tconst th =\n\t\t\ttypeof sortField === 'number'\n\t\t\t\t? theadElement.querySelectorAll('th')[sortField]\n\t\t\t\t: (theadElement.querySelector(\n\t\t\t\t\t\t`th[data-kt-datatable-column=\"${String(sortField)}\"], th[data-kt-datatable-column-sort=\"${String(sortField)}\"]`,\n\t\t\t\t\t) as HTMLElement);\n\t\tif (th) {\n\t\t\tconst sortElement = th.querySelector(\n\t\t\t\t`.${config.sort?.classes?.base}`,\n\t\t\t) as HTMLElement;\n\t\t\tif (sortElement) {\n\t\t\t\tsortElement.className =\n\t\t\t\t\t`${config.sort?.classes?.base} ${sortClass}`.trim();\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction initSort(): void {\n\t\tif (!theadElement) return;\n\t\t// Set the initial sort icon\n\t\tsetSortIcon(getState().sortField as keyof T, getState().sortOrder);\n\t\t// Get all the table headers\n\t\tconst headers = Array.from(theadElement.querySelectorAll('th'));\n\t\theaders.forEach((header) => {\n\t\t\t// If the sort class is not found, it's not a sortable column\n\t\t\tif (!header.querySelector(`.${config.sort?.classes?.base}`)) return;\n\n\t\t\t// Check if sorting is disabled for this column\n\t\t\tconst sortDisabled =\n\t\t\t\theader.getAttribute('data-kt-datatable-column-sort') === 'false';\n\t\t\tif (sortDisabled) return;\n\n\t\t\tconst sortAttribute =\n\t\t\t\theader.getAttribute('data-kt-datatable-column-sort') ||\n\t\t\t\theader.getAttribute('data-kt-datatable-column');\n\t\t\tconst sortField = sortAttribute\n\t\t\t\t? (sortAttribute as keyof T)\n\t\t\t\t: (header.cellIndex as keyof T);\n\t\t\theader.addEventListener('click', () => {\n\t\t\t\tconst state = getState();\n\t\t\t\tconst sortOrder = toggleSortOrder(\n\t\t\t\t\tstate.sortField,\n\t\t\t\t\tstate.sortOrder,\n\t\t\t\t\tsortField,\n\t\t\t\t);\n\t\t\t\tsetSortIcon(sortField, sortOrder);\n\t\t\t\tsetState(sortField, sortOrder);\n\t\t\t\tfireEvent('sort', { field: sortField, order: sortOrder });\n\t\t\t\tdispatchEvent('sort', { field: sortField, order: sortOrder });\n\t\t\t\tupdateData();\n\t\t\t});\n\t\t});\n\t}\n\n\treturn { initSort, sortData, toggleSortOrder, setSortIcon };\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTScrollspy } from './scrollspy';\nexport type { KTScrollspyConfigInterface, KTScrollspyInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTSelectConfigInterface } from './config';\nimport { KTSelect } from './select';\nimport { filterOptions, renderTemplateString, stringToElement } from './utils';\nimport { defaultTemplates } from './templates';\n\n/**\n * KTSelectCombobox - Handles combobox-specific functionality for KTSelect\n */\nexport class KTSelectCombobox {\n\tprivate _select: KTSelect;\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _searchInputElement: HTMLInputElement;\n\tprivate _clearButtonElement: HTMLElement | null;\n\tprivate _boundInputHandler: (event: Event) => void;\n\tprivate _boundClearHandler: (event: MouseEvent) => void;\n\tprivate _valuesContainerElement: HTMLElement | null; // For tags or displayTemplate output\n\n\tconstructor(select: KTSelect) {\n\t\tthis._select = select;\n\t\tthis._config = select.getConfig();\n\n\t\tconst displayElement = select.getDisplayElement(); // KTSelect's main display element for combobox\n\n\t\tthis._searchInputElement = displayElement.querySelector(\n\t\t\t'input[data-kt-select-search]',\n\t\t);\n\t\tthis._clearButtonElement = displayElement.querySelector(\n\t\t\t'[data-kt-select-clear-button]',\n\t\t);\n\t\tthis._valuesContainerElement = displayElement.querySelector(\n\t\t\t'[data-kt-select-combobox-values]',\n\t\t);\n\n\t\tthis._boundInputHandler = this._handleComboboxInput.bind(this);\n\t\tthis._boundClearHandler = this._handleClearButtonClick.bind(this);\n\n\t\tthis._attachEventListeners();\n\n\t\tthis._select.getElement().addEventListener('dropdown.close', () => {\n\t\t\t// When dropdown closes, if not multi-select and not using displayTemplate,\n\t\t\t// ensure input shows the selected value or placeholder.\n\t\t\tif (!this._config.multiple && !this._config.displayTemplate) {\n\t\t\t\tthis.updateDisplay(this._select.getSelectedOptions());\n\t\t\t} else {\n\t\t\t\t// For tags or displayTemplate, the input should be clear for typing.\n\t\t\t\tthis._searchInputElement.value = '';\n\t\t\t}\n\t\t\tthis._toggleClearButtonVisibility(this._searchInputElement.value);\n\t\t\t// this._select.showAllOptions(); // showAllOptions might be too broad, filtering is managed by typing.\n\t\t});\n\n\t}\n\n\t/**\n\t * Attach event listeners specific to combobox\n\t */\n\tprivate _attachEventListeners(): void {\n\t\tthis._removeEventListeners();\n\t\tif (this._searchInputElement) {\n\t\t\t// Ensure element exists\n\t\t\tthis._searchInputElement.addEventListener(\n\t\t\t\t'input',\n\t\t\t\tthis._boundInputHandler,\n\t\t\t);\n\t\t}\n\t\tif (this._clearButtonElement) {\n\t\t\tthis._clearButtonElement.addEventListener(\n\t\t\t\t'click',\n\t\t\t\tthis._boundClearHandler,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove event listeners to prevent memory leaks or duplicates\n\t */\n\tprivate _removeEventListeners(): void {\n\t\tif (this._searchInputElement) {\n\t\t\tthis._searchInputElement.removeEventListener(\n\t\t\t\t'input',\n\t\t\t\tthis._boundInputHandler,\n\t\t\t);\n\t\t}\n\t\tif (this._clearButtonElement) {\n\t\t\tthis._clearButtonElement.removeEventListener(\n\t\t\t\t'click',\n\t\t\t\tthis._boundClearHandler,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Handle combobox input events\n\t */\n\tprivate _handleComboboxInput(event: Event): void {\n\t\tconst inputElement = event.target as HTMLInputElement;\n\t\tconst query = inputElement.value;\n\n\t\tthis._toggleClearButtonVisibility(query);\n\n\t\tif (!(this._select as any).isDropdownOpen()) {\n\t\t\t// Use public getter\n\t\t\tthis._select.openDropdown();\n\t\t}\n\t\t// For single select without displayTemplate, if user types, they are essentially clearing the previous selection text\n\t\t// The actual selection state isn't cleared until they pick a new option or clear explicitly.\n\t\t// For multi-select or with displayTemplate, the input is purely for search.\n\t\tif (this._config.multiple || this._config.displayTemplate) {\n\t\t\t// Values are in _valuesContainerElement, input is for search\n\t\t} else {\n\t\t\t// Single select, no displayTemplate: If user types, it implies they might be changing selection.\n\t\t\t// We don't clear the actual _select state here, just the visual in input.\n\t\t}\n\n\t\tthis._filterOptionsForCombobox(query);\n\t}\n\n\t/**\n\t * Handle clear button click\n\t */\n\tprivate _handleClearButtonClick(event: MouseEvent): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tthis._searchInputElement.value = '';\n\t\tthis._toggleClearButtonVisibility('');\n\t\tif (this._valuesContainerElement) {\n\t\t\tthis._valuesContainerElement.innerHTML = '';\n\t\t}\n\t\tthis._select.clearSelection(); // This will also trigger updateSelectedOptionDisplay\n\t\tthis._select.showAllOptions(); // Show all options after clearing\n\t\tthis._select.openDropdown();\n\t\tthis._searchInputElement.focus();\n\t}\n\n\t/**\n\t * Toggle clear button visibility based on input value and selection state.\n\t * Clear button should be visible if there's text in input OR if there are selected items (for multi/displayTemplate modes).\n\t */\n\tprivate _toggleClearButtonVisibility(inputValue: string): void {\n\t\tif (!this._clearButtonElement) return;\n\t\tconst hasSelectedItems = this._select.getSelectedOptions().length > 0;\n\n\t\tif (\n\t\t\tinputValue.length > 0 ||\n\t\t\t(hasSelectedItems &&\n\t\t\t\t(this._config.multiple || this._config.displayTemplate))\n\t\t) {\n\t\t\tthis._clearButtonElement.classList.remove('hidden');\n\t\t} else {\n\t\t\tthis._clearButtonElement.classList.add('hidden');\n\t\t}\n\t}\n\n\t/**\n\t * Filter options for combobox based on input query\n\t */\n\tprivate _filterOptionsForCombobox(query: string): void {\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\t\tconst config = this._select.getConfig();\n\t\tconst dropdownElement = this._select.getDropdownElement();\n\t\tfilterOptions(options, query, config, dropdownElement);\n\t\t// After filtering, focusManager in KTSelectSearch (if search is also enabled there)\n\t\t// or the main FocusManager should adjust focus if needed.\n\t\t// For combobox, this filtering is the primary search mechanism.\n\t\t// We might need to tell select's focus manager to focus first option.\n\t\t(this._select as any)._focusManager.focusFirst(); // Consider if this is always right\n\t}\n\n\t/**\n\t * Updates the combobox display (input field or values container) based on selection.\n\t */\n\tpublic updateDisplay(selectedOptions: string[]): void {\n\t\tif (!this._searchInputElement) return;\n\n\t\t// Always clear the values container first if it exists\n\t\tif (this._valuesContainerElement) {\n\t\t\tthis._valuesContainerElement.innerHTML = '';\n\t\t}\n\n\t\tif (this._config.tags && this._valuesContainerElement) {\n\t\t\t// Combobox + Tags\n\t\t\tselectedOptions.forEach((value) => {\n\t\t\t\t// Ensure value is properly escaped for querySelector\n\t\t\t\tconst optionElement = this._select\n\t\t\t\t\t.getElement()\n\t\t\t\t\t.querySelector(\n\t\t\t\t\t\t`option[value=\"${CSS.escape(value)}\"]`,\n\t\t\t\t\t) as HTMLOptionElement;\n\t\t\t\tif (optionElement) {\n\t\t\t\t\tconst tagElement = defaultTemplates.tag(optionElement, this._config);\n\t\t\t\t\tthis._valuesContainerElement.appendChild(tagElement);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis._searchInputElement.value = ''; // Input field is for typing new searches\n\t\t\tthis._searchInputElement.placeholder =\n\t\t\t\tselectedOptions.length > 0\n\t\t\t\t\t? ''\n\t\t\t\t\t: this._config.placeholder || 'Select...';\n\t\t} else if (this._config.displayTemplate && this._valuesContainerElement) {\n\t\t\t// Combobox + DisplayTemplate (no tags)\n\t\t\tthis._valuesContainerElement.innerHTML =\n\t\t\t\tthis._select.renderDisplayTemplateForSelected(selectedOptions);\n\t\t\tthis._searchInputElement.value = ''; // Input field is for typing new searches\n\t\t\tthis._searchInputElement.placeholder =\n\t\t\t\tselectedOptions.length > 0\n\t\t\t\t\t? ''\n\t\t\t\t\t: this._config.placeholder || 'Select...';\n\t\t} else if (this._config.multiple && this._valuesContainerElement) {\n\t\t\t// Combobox + Multiple (no tags, no display template)\n\t\t\t// For simplicity, join text. A proper tag implementation would be more complex here.\n\t\t\tthis._valuesContainerElement.innerHTML = selectedOptions\n\t\t\t\t.map((value) => {\n\t\t\t\t\tconst optionEl = this._select\n\t\t\t\t\t\t.getElement()\n\t\t\t\t\t\t.querySelector(`option[value=\"${CSS.escape(value)}\"]`);\n\t\t\t\t\treturn optionEl ? optionEl.textContent : '';\n\t\t\t\t})\n\t\t\t\t.join(', '); // Basic comma separation\n\t\t\tthis._searchInputElement.value = '';\n\t\t\tthis._searchInputElement.placeholder =\n\t\t\t\tselectedOptions.length > 0\n\t\t\t\t\t? ''\n\t\t\t\t\t: this._config.placeholder || 'Select...';\n\t\t} else if (!this._config.multiple && selectedOptions.length > 0) {\n\t\t\t// Single select combobox: display selected option's text in the input\n\t\t\tconst selectedValue = selectedOptions[0];\n\t\t\tconst optionElement = this._select\n\t\t\t\t.getElement()\n\t\t\t\t.querySelector(`option[value=\"${CSS.escape(selectedValue)}\"]`);\n\t\t\tthis._searchInputElement.value = optionElement\n\t\t\t\t? optionElement.textContent || ''\n\t\t\t\t: '';\n\t\t\t// placeholder is implicitly handled by input value for single select\n\t\t} else {\n\t\t\t// No selection or not fitting above categories (e.g. single select, no items)\n\t\t\tthis._searchInputElement.value = '';\n\t\t\tthis._searchInputElement.placeholder =\n\t\t\t\tthis._config.placeholder || 'Select...';\n\t\t\t// _valuesContainerElement is already cleared if it exists\n\t\t}\n\t\tthis._toggleClearButtonVisibility(this._searchInputElement.value);\n\t}\n\n\t/**\n\t * Destroy the combobox component and clean up event listeners\n\t */\n\tpublic destroy(): void {\n\t\tthis._removeEventListeners();\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n// Checkbox logic for KTDataTable\n\nimport {\n\tKTDataTableConfigInterface,\n\tKTDataTableCheckChangePayloadInterface,\n} from './types';\nimport KTEventHandler from '../../helpers/event-handler';\n\nexport interface KTDataTableCheckboxAPI {\n\tinit(): void;\n\tcheck(): void;\n\tuncheck(): void;\n\ttoggle(): void;\n\tisChecked(): boolean;\n\tgetChecked(): string[];\n\tupdateState(): void;\n}\n\n// Main function to create checkbox logic for a datatable instance\nexport function createCheckboxHandler(\n\telement: HTMLElement,\n\tconfig: KTDataTableConfigInterface,\n\tfireEvent: (eventName: string, eventData?: any) => void,\n): KTDataTableCheckboxAPI {\n\tlet headerChecked = false;\n\tlet headerCheckElement: HTMLInputElement | null = null;\n\tlet targetElements: NodeListOf<HTMLInputElement> = null;\n\n\t// Default: preserve selection across all pages\n\tconst preserveSelection = config.checkbox?.preserveSelection !== false;\n\n\t// Helper: get selectedRows from state, always as string[]\n\tfunction getSelectedRows(): string[] {\n\t\tif (!config._state) config._state = {} as any;\n\t\tif (!Array.isArray(config._state.selectedRows))\n\t\t\tconfig._state.selectedRows = [];\n\t\treturn config._state.selectedRows.map(String);\n\t}\n\n\t// Helper: set selectedRows in state\n\tfunction setSelectedRows(rows: string[]) {\n\t\tif (!config._state) config._state = {} as any;\n\t\tconfig._state.selectedRows = Array.from(new Set(rows.map(String)));\n\t}\n\n\t// Helper: get all visible row IDs (values)\n\tfunction getVisibleRowIds(): string[] {\n\t\tif (!targetElements) return [];\n\t\treturn Array.from(targetElements)\n\t\t\t.map((el) => el.value)\n\t\t\t.filter((v) => v != null && v !== '');\n\t}\n\n\t// Listener for header checkbox\n\tconst checkboxListener = (event: MouseEvent) => {\n\t\tcheckboxToggle(event);\n\t};\n\n\tfunction init() {\n\t\theaderCheckElement = element.querySelector<HTMLInputElement>(\n\t\t\tconfig.attributes.check,\n\t\t);\n\t\tif (!headerCheckElement) return;\n\t\theaderChecked = headerCheckElement.checked;\n\t\ttargetElements = element.querySelectorAll(\n\t\t\tconfig.attributes.checkbox,\n\t\t) as NodeListOf<HTMLInputElement>;\n\t\tcheckboxHandler();\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction checkboxHandler() {\n\t\tif (!headerCheckElement) return;\n\t\theaderCheckElement.addEventListener('click', checkboxListener);\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\tconfig.attributes.checkbox,\n\t\t\t'input',\n\t\t\t(event: Event) => {\n\t\t\t\thandleRowCheckboxChange(event as InputEvent);\n\t\t\t},\n\t\t);\n\t}\n\n\t// When a row checkbox is changed\n\tfunction handleRowCheckboxChange(event: Event) {\n\t\tconst input = event.target as HTMLInputElement;\n\t\tif (!input) return;\n\t\tconst value = input.value;\n\t\tlet selectedRows = getSelectedRows();\n\t\tconst wasChecked = selectedRows.includes(value);\n\t\tconst isNowChecked = input.checked;\n\n\t\t// Update state first\n\t\tif (isNowChecked) {\n\t\t\tif (!wasChecked) selectedRows.push(value);\n\t\t} else {\n\t\t\tselectedRows = selectedRows.filter((v) => v !== value);\n\t\t}\n\t\tsetSelectedRows(selectedRows);\n\t\tupdateHeaderCheckboxState();\n\n\t\t// Fire specific checked/unchecked events after state is updated\n\t\tif (isNowChecked && !wasChecked) {\n\t\t\tfireEvent('checked');\n\t\t} else if (!isNowChecked && wasChecked) {\n\t\t\tfireEvent('unchecked');\n\t\t}\n\n\t\t// Always fire changed event for backward compatibility\n\t\tfireEvent('changed');\n\t}\n\n\t// When the header checkbox is toggled\n\tfunction checkboxToggle(event?: Event) {\n\t\tconst checked = !isChecked();\n\t\t// Update state first, then fire events\n\t\tchange(checked);\n\t\t// Fire checked/unchecked events after state is updated\n\t\tconst eventType = checked ? 'checked' : 'unchecked';\n\t\tfireEvent(eventType);\n\t}\n\n\t// Change all visible checkboxes and update selectedRows\n\tfunction change(checked: boolean) {\n\t\tconst payload: KTDataTableCheckChangePayloadInterface = { cancel: false };\n\t\tfireEvent('change', payload);\n\t\tif (payload.cancel === true) return;\n\t\theaderChecked = checked;\n\t\tif (headerCheckElement) headerCheckElement.checked = checked;\n\t\tif (targetElements) {\n\t\t\tconst visibleIds = getVisibleRowIds();\n\t\t\tlet selectedRows = getSelectedRows();\n\t\t\tif (checked) {\n\t\t\t\t// Add all visible IDs to selectedRows\n\t\t\t\tselectedRows = preserveSelection\n\t\t\t\t\t? Array.from(new Set([...selectedRows, ...visibleIds]))\n\t\t\t\t\t: visibleIds;\n\t\t\t} else {\n\t\t\t\t// Remove all visible IDs from selectedRows\n\t\t\t\tselectedRows = preserveSelection\n\t\t\t\t\t? selectedRows.filter((v) => !visibleIds.includes(v))\n\t\t\t\t\t: [];\n\t\t\t}\n\t\t\tsetSelectedRows(selectedRows);\n\t\t\t// Update visible checkboxes\n\t\t\ttargetElements.forEach((element: HTMLInputElement) => {\n\t\t\t\tif (element) {\n\t\t\t\t\telement.checked = checked;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tupdateHeaderCheckboxState();\n\t\tfireEvent('changed');\n\t}\n\n\t// Reapply checked state to visible checkboxes based on selectedRows\n\tfunction reapplyCheckedStates() {\n\t\tconst selectedRows = getSelectedRows();\n\t\tif (!targetElements) return;\n\t\ttargetElements.forEach((element: HTMLInputElement) => {\n\t\t\tif (!element) return;\n\t\t\tconst value = element.value;\n\t\t\telement.checked = selectedRows.includes(value);\n\t\t\t// Update row class\n\t\t\tconst row = element.closest('tr');\n\t\t\tif (row && config.checkbox?.checkedClass) {\n\t\t\t\tif (element.checked) {\n\t\t\t\t\trow.classList.add(config.checkbox.checkedClass);\n\t\t\t\t} else {\n\t\t\t\t\trow.classList.remove(config.checkbox.checkedClass);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t// Update header checkbox state (checked/indeterminate/unchecked)\n\tfunction updateHeaderCheckboxState() {\n\t\tif (!headerCheckElement || !targetElements) return;\n\t\tconst total = targetElements.length;\n\t\tlet checked = 0;\n\t\tfor (let i = 0; i < total; i++) {\n\t\t\tif (targetElements[i].checked) checked++;\n\t\t}\n\t\tif (checked === 0) {\n\t\t\theaderCheckElement.indeterminate = false;\n\t\t\theaderCheckElement.checked = false;\n\t\t\theaderChecked = false;\n\t\t} else if (checked > 0 && checked < total) {\n\t\t\theaderCheckElement.indeterminate = true;\n\t\t\theaderCheckElement.checked = false;\n\t\t\theaderChecked = false;\n\t\t} else if (checked === total) {\n\t\t\theaderCheckElement.indeterminate = false;\n\t\t\theaderCheckElement.checked = true;\n\t\t\theaderChecked = true;\n\t\t}\n\t}\n\n\t// Fix: isChecked() implementation\n\tfunction isChecked(): boolean {\n\t\treturn headerChecked;\n\t}\n\n\tfunction getChecked(): string[] {\n\t\treturn getSelectedRows();\n\t}\n\n\tfunction check() {\n\t\tchange(true);\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction uncheck() {\n\t\tchange(false);\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction toggle() {\n\t\tcheckboxToggle();\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\tfunction updateState() {\n\t\t// Called after redraw/pagination\n\t\ttargetElements = element.querySelectorAll(\n\t\t\tconfig.attributes.checkbox,\n\t\t) as NodeListOf<HTMLInputElement>;\n\t\treapplyCheckedStates();\n\t\tupdateHeaderCheckboxState();\n\t}\n\n\treturn {\n\t\tinit,\n\t\tcheck,\n\t\tuncheck,\n\t\ttoggle,\n\t\tisChecked,\n\t\tgetChecked,\n\t\tupdateState,\n\t};\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTTabs } from './tabs';\nexport type { KTTabsConfigInterface, KTTabsInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTToggle } from './toggle';\nexport type { KTToggleConfigInterface, KTToggleInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTStepper } from './stepper';\nexport type { KTStepperConfigInterface, KTStepperInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTToast } from './toast';\nexport type { KTToastConfigInterface, KTToastInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTComponent from '../component';\nimport {\n\tKTDataTableDataInterface,\n\tKTDataTableInterface,\n\tKTDataTableConfigInterface as KTDataTableConfigInterface,\n\tKTDataTableSortOrderInterface,\n\tKTDataTableStateInterface,\n\tKTDataTableColumnFilterInterface,\n\tKTDataTableAttributeInterface,\n} from './types';\nimport KTUtils from '../../helpers/utils';\nimport KTComponents from '../../index';\nimport KTData from '../../helpers/data';\nimport {\n\tcreateCheckboxHandler,\n\tKTDataTableCheckboxAPI,\n} from './datatable-checkbox';\nimport { createSortHandler, KTDataTableSortAPI } from './datatable-sort';\n\n/**\n * Custom DataTable plugin class with server-side API, pagination, and sorting\n * @classdesc A custom KTComponent class that integrates server-side API, pagination, and sorting functionality into a table.\n * It supports fetching data from a server-side API, pagination, and sorting of the fetched data.\n * @class\n * @extends {KTComponent}\n * @param {HTMLElement} element The table element\n * @param {KTDataTableConfigInterface} [config] Additional configuration options\n */\nexport class KTDataTable<T extends KTDataTableDataInterface>\n\textends KTComponent\n\timplements KTDataTableInterface\n{\n\tprotected override _name: string = 'datatable';\n\tprotected override _config: KTDataTableConfigInterface;\n\tprotected override _defaultConfig: KTDataTableConfigInterface;\n\n\tprivate _tableElement: HTMLTableElement;\n\tprivate _tbodyElement: HTMLTableSectionElement;\n\tprivate _theadElement: HTMLTableSectionElement;\n\tprivate _originalTbodyClass: string = ''; // Store original tbody class\n\tprivate _originalTrClasses: string[] = []; // Store original tr classes\n\tprivate _originalTheadClass: string = ''; // Store original thead class\n\tprivate _originalTdClasses: string[][] = []; // Store original td classes as a 2D array [row][col]\n\tprivate _originalThClasses: string[] = []; // Store original th classes\n\n\tprivate _infoElement: HTMLElement;\n\tprivate _sizeElement: HTMLSelectElement;\n\tprivate _paginationElement: HTMLElement;\n\n\tprivate _checkbox: KTDataTableCheckboxAPI;\n\tprivate _sortHandler: KTDataTableSortAPI<T>;\n\n\tprivate _data: T[] = [];\n\tprivate _isFetching: boolean = false;\n\n\t/**\n\t * AbortController for cancelling previous fetch requests\n\t * Used to prevent race conditions when multiple requests are triggered rapidly\n\t */\n\tprivate _abortController: AbortController | null = null;\n\n\t/**\n\t * Request ID counter for tracking request sequence\n\t * Used to detect and ignore stale responses from older requests\n\t */\n\tprivate _requestId: number = 0;\n\n\tconstructor(element: HTMLElement, config?: KTDataTableConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._defaultConfig = this._initDefaultConfig(config);\n\n\t\tthis._init(element);\n\t\tthis._buildConfig();\n\n\t\t// Store the instance directly on the element\n\t\t(element as any).instance = this;\n\n\t\tthis._initElements();\n\n\t\t// Initialize checkbox handler\n\t\tthis._checkbox = createCheckboxHandler(\n\t\t\tthis._element,\n\t\t\tthis._config,\n\t\t\t(eventName: string, eventData?: any) => {\n\t\t\t\tthis._fireEvent(eventName, eventData);\n\t\t\t\tthis._dispatchEvent(eventName, eventData);\n\t\t\t},\n\t\t);\n\n\t\t// Initialize sort handler\n\t\tthis._sortHandler = createSortHandler(\n\t\t\tthis._config,\n\t\t\tthis._theadElement,\n\t\t\t() => ({\n\t\t\t\tsortField: this.getState().sortField,\n\t\t\t\tsortOrder: this.getState().sortOrder,\n\t\t\t}),\n\t\t\t(field, order) => {\n\t\t\t\tthis._config._state.sortField = field as never;\n\t\t\t\tthis._config._state.sortOrder = order;\n\t\t\t},\n\t\t\tthis._fireEvent.bind(this),\n\t\t\tthis._dispatchEvent.bind(this),\n\t\t\tthis._updateData.bind(this),\n\t\t);\n\n\t\tthis._sortHandler.initSort();\n\n\t\tif (this._config.stateSave === false) {\n\t\t\tthis._deleteState();\n\t\t}\n\n\t\tif (this._config.stateSave) {\n\t\t\tthis._loadState();\n\t\t}\n\n\t\tthis._updateData();\n\n\t\tthis._fireEvent('init');\n\t\tthis._dispatchEvent('init');\n\t}\n\n\t/**\n\t * Initialize default configuration for the datatable\n\t * @param config User-provided configuration options\n\t * @returns Default configuration merged with user-provided options\n\t */\n\tprivate _initDefaultConfig(\n\t\tconfig?: KTDataTableConfigInterface,\n\t): KTDataTableConfigInterface {\n\t\treturn {\n\t\t\t/**\n\t\t\t * HTTP method for server-side API call\n\t\t\t */\n\t\t\trequestMethod: 'GET',\n\t\t\t/**\n\t\t\t * Custom HTTP headers for the API request\n\t\t\t */\n\t\t\trequestHeaders: {\n\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Pagination info template\n\t\t\t */\n\t\t\tinfo: '{start}-{end} of {total}',\n\t\t\t/**\n\t\t\t * Info text when there is no data\n\t\t\t */\n\t\t\tinfoEmpty: 'No records found',\n\t\t\t/**\n\t\t\t * Available page sizes\n\t\t\t */\n\t\t\tpageSizes: [5, 10, 20, 30, 50],\n\t\t\t/**\n\t\t\t * Default page size\n\t\t\t */\n\t\t\tpageSize: 10,\n\t\t\t/**\n\t\t\t * Enable or disable pagination more button\n\t\t\t */\n\t\t\tpageMore: true,\n\t\t\t/**\n\t\t\t * Maximum number of pages before enabling pagination more button\n\t\t\t */\n\t\t\tpageMoreLimit: 3,\n\t\t\t/**\n\t\t\t * Pagination button templates\n\t\t\t */\n\t\t\tpagination: {\n\t\t\t\tnumber: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the pagination button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the pagination button\n\t\t\t\t\t */\n\t\t\t\t\ttext: '{page}',\n\t\t\t\t},\n\t\t\t\tprevious: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the previous pagination button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button kt-datatable-pagination-prev',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the previous pagination button\n\t\t\t\t\t */\n\t\t\t\t\ttext: `\n\t\t\t\t\t\t<svg class=\"rtl:transform rtl:rotate-180 size-3.5 shrink-0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t\t<path d=\"M8.86501 16.7882V12.8481H21.1459C21.3724 12.8481 21.5897 12.7581 21.7498 12.5979C21.91 12.4378 22 12.2205 22 11.994C22 11.7675 21.91 11.5503 21.7498 11.3901C21.5897 11.2299 21.3724 11.1399 21.1459 11.1399H8.86501V7.2112C8.86628 7.10375 8.83517 6.9984 8.77573 6.90887C8.7163 6.81934 8.63129 6.74978 8.53177 6.70923C8.43225 6.66869 8.32283 6.65904 8.21775 6.68155C8.11267 6.70405 8.0168 6.75766 7.94262 6.83541L2.15981 11.6182C2.1092 11.668 2.06901 11.7274 2.04157 11.7929C2.01413 11.8584 2 11.9287 2 11.9997C2 12.0707 2.01413 12.141 2.04157 12.2065C2.06901 12.272 2.1092 12.3314 2.15981 12.3812L7.94262 17.164C8.0168 17.2417 8.11267 17.2953 8.21775 17.3178C8.32283 17.3403 8.43225 17.3307 8.53177 17.2902C8.63129 17.2496 8.7163 17.18 8.77573 17.0905C8.83517 17.001 8.86628 16.8956 8.86501 16.7882Z\" fill=\"currentColor\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t},\n\t\t\t\tnext: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the next pagination button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button kt-datatable-pagination-next',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the next pagination button\n\t\t\t\t\t */\n\t\t\t\t\ttext: `\n\t\t\t\t\t\t<svg class=\"rtl:transform rtl:rotate-180 size-3.5 shrink-0\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t\t<path d=\"M15.135 7.21144V11.1516H2.85407C2.62756 11.1516 2.41032 11.2415 2.25015 11.4017C2.08998 11.5619 2 11.7791 2 12.0056C2 12.2321 2.08998 12.4494 2.25015 12.6096C2.41032 12.7697 2.62756 12.8597 2.85407 12.8597H15.135V16.7884C15.1337 16.8959 15.1648 17.0012 15.2243 17.0908C15.2837 17.1803 15.3687 17.2499 15.4682 17.2904C15.5677 17.3309 15.6772 17.3406 15.7822 17.3181C15.8873 17.2956 15.9832 17.242 16.0574 17.1642L21.8402 12.3814C21.8908 12.3316 21.931 12.2722 21.9584 12.2067C21.9859 12.1412 22 12.0709 22 11.9999C22 11.9289 21.9859 11.8586 21.9584 11.7931C21.931 11.7276 21.8908 11.6683 21.8402 11.6185L16.0574 6.83565C15.9832 6.75791 15.8873 6.70429 15.7822 6.68179C15.6772 6.65929 15.5677 6.66893 15.4682 6.70948C15.3687 6.75002 15.2837 6.81959 15.2243 6.90911C15.1648 6.99864 15.1337 7.10399 15.135 7.21144Z\" fill=\"currentColor\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t`,\n\t\t\t\t},\n\t\t\t\tmore: {\n\t\t\t\t\t/**\n\t\t\t\t\t * CSS classes to be added to the pagination more button\n\t\t\t\t\t */\n\t\t\t\t\tclass: 'kt-datatable-pagination-button kt-datatable-pagination-more',\n\t\t\t\t\t/**\n\t\t\t\t\t * Text to be displayed in the pagination more button\n\t\t\t\t\t */\n\t\t\t\t\ttext: '...',\n\t\t\t\t},\n\t\t\t},\n\t\t\t/**\n\t\t\t * Sorting options\n\t\t\t */\n\t\t\tsort: {\n\t\t\t\t/**\n\t\t\t\t * CSS classes to be added to the sortable headers\n\t\t\t\t */\n\t\t\t\tclasses: {\n\t\t\t\t\tbase: 'kt-table-col',\n\t\t\t\t\tasc: 'asc',\n\t\t\t\t\tdesc: 'desc',\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * Local sorting callback function\n\t\t\t\t * Sorts the data array based on the sort field and order\n\t\t\t\t * @param data Data array to be sorted\n\t\t\t\t * @param sortField Property name of the data object to be sorted by\n\t\t\t\t * @param sortOrder Sorting order (ascending or descending)\n\t\t\t\t * @returns Sorted data array\n\t\t\t\t */\n\t\t\t\tcallback: (\n\t\t\t\t\tdata: T[],\n\t\t\t\t\tsortField: keyof T | number,\n\t\t\t\t\tsortOrder: KTDataTableSortOrderInterface,\n\t\t\t\t): T[] => {\n\t\t\t\t\treturn this._sortHandler\n\t\t\t\t\t\t? this._sortHandler.sortData(data, sortField, sortOrder)\n\t\t\t\t\t\t: data;\n\t\t\t\t},\n\t\t\t},\n\t\t\tsearch: {\n\t\t\t\t/**\n\t\t\t\t * Delay in milliseconds before the search function is applied to the data array\n\t\t\t\t * @default 500\n\t\t\t\t */\n\t\t\t\tdelay: 500, // ms\n\t\t\t\t/**\n\t\t\t\t * Local search callback function\n\t\t\t\t * Filters the data array based on the search string\n\t\t\t\t * @param data Data array to be filtered\n\t\t\t\t * @param search Search string used to filter the data array\n\t\t\t\t * @returns Filtered data array\n\t\t\t\t */\n\t\t\t\tcallback: (data: T[], search: string): T[] => {\n\t\t\t\t\tif (!data || !search) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\treturn data.filter((item: T) => {\n\t\t\t\t\t\tif (!item) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn Object.values(item).some(\n\t\t\t\t\t\t\t(value: string | number | boolean) => {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\ttypeof value !== 'string' &&\n\t\t\t\t\t\t\t\t\ttypeof value !== 'number' &&\n\t\t\t\t\t\t\t\t\ttypeof value !== 'boolean'\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst valueText = String(value)\n\t\t\t\t\t\t\t\t\t.replace(/<[^>]*>| /g, '')\n\t\t\t\t\t\t\t\t\t.toLowerCase();\n\t\t\t\t\t\t\t\treturn valueText.includes(search.toLowerCase());\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t/**\n\t\t\t * Loading spinner options\n\t\t\t */\n\t\t\tloading: {\n\t\t\t\t/**\n\t\t\t\t * Template to be displayed during data fetching process\n\t\t\t\t */\n\t\t\t\ttemplate: `\n\t\t\t\t\t<div class=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\">\n\t\t\t\t\t\t<div class=\"kt-datatable-loading\">\n\t\t\t\t\t\t\t<svg class=\"animate-spin -ml-1 h-5 w-5 text-gray-600\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t\t<circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"3\"></circle>\n\t\t\t\t\t\t\t\t<path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t\t/**\n\t\t\t\t * Loading text to be displayed in the template\n\t\t\t\t */\n\t\t\t\tcontent: 'Loading...',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Selectors of the elements to be targeted\n\t\t\t */\n\t\t\tattributes: {\n\t\t\t\t/**\n\t\t\t\t * Data table element\n\t\t\t\t */\n\t\t\t\ttable: 'table[data-kt-datatable-table=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Pagination info element\n\t\t\t\t */\n\t\t\t\tinfo: '[data-kt-datatable-info=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Page size dropdown element\n\t\t\t\t */\n\t\t\t\tsize: '[data-kt-datatable-size=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Pagination element\n\t\t\t\t */\n\t\t\t\tpagination: '[data-kt-datatable-pagination=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Spinner element\n\t\t\t\t */\n\t\t\t\tspinner: '[data-kt-datatable-spinner=\"true\"]',\n\t\t\t\t/**\n\t\t\t\t * Checkbox element\n\t\t\t\t */\n\t\t\t\tcheck: '[data-kt-datatable-check=\"true\"]',\n\t\t\t\tcheckbox: '[data-kt-datatable-row-check=\"true\"]',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Enable or disable state saving\n\t\t\t */\n\t\t\tstateSave: true,\n\t\t\tcheckbox: {\n\t\t\t\tcheckedClass: 'checked',\n\t\t\t},\n\t\t\t/**\n\t\t\t * Private properties\n\t\t\t */\n\t\t\t_state: {} as KTDataTableStateInterface,\n\t\t\tloadingClass: 'loading',\n\t\t\t...config,\n\t\t} as KTDataTableConfigInterface;\n\t}\n\n\t/**\n\t * Initialize table, tbody, thead, info, size, and pagination elements\n\t * @returns {void}\n\t */\n\tprivate _initElements(): void {\n\t\t/**\n\t\t * Data table element\n\t\t */\n\t\tthis._tableElement = this._element.querySelector<HTMLTableElement>(\n\t\t\tthis._config.attributes.table,\n\t\t)!;\n\t\t/**\n\t\t * Table body element\n\t\t */\n\t\tthis._tbodyElement =\n\t\t\tthis._tableElement.tBodies[0] || this._tableElement.createTBody();\n\t\t/**\n\t\t * Table head element\n\t\t */\n\t\tthis._theadElement = this._tableElement.tHead!;\n\n\t\t// Store original classes\n\t\tthis._storeOriginalClasses();\n\n\t\t/**\n\t\t * Pagination info element\n\t\t */\n\t\tthis._infoElement = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.info,\n\t\t)!;\n\t\t/**\n\t\t * Page size dropdown element\n\t\t */\n\t\tthis._sizeElement = this._element.querySelector<HTMLSelectElement>(\n\t\t\tthis._config.attributes.size,\n\t\t)!;\n\t\t/**\n\t\t * Pagination element\n\t\t */\n\t\tthis._paginationElement = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.pagination,\n\t\t)!;\n\t}\n\n\t/**\n\t * Store original classes from table elements\n\t * @returns {void}\n\t */\n\tprivate _storeOriginalClasses(): void {\n\t\t// Store tbody class\n\t\tif (this._tbodyElement) {\n\t\t\tthis._originalTbodyClass = this._tbodyElement.className || '';\n\t\t}\n\n\t\t// Store thead class and th classes\n\t\tif (this._theadElement) {\n\t\t\tthis._originalTheadClass = this._theadElement.className || '';\n\n\t\t\t// Store th classes\n\t\t\tconst thElements =\n\t\t\t\tthis._theadElement.querySelectorAll<HTMLTableCellElement>('th');\n\t\t\tthis._originalThClasses = Array.from(thElements).map(\n\t\t\t\t(th) => th.className || '',\n\t\t\t);\n\t\t}\n\n\t\t// Store tr and td classes\n\t\tif (this._tbodyElement) {\n\t\t\tconst originalRows =\n\t\t\t\tthis._tbodyElement.querySelectorAll<HTMLTableRowElement>('tr');\n\t\t\tthis._originalTrClasses = Array.from(originalRows).map(\n\t\t\t\t(row) => row.className || '',\n\t\t\t);\n\n\t\t\t// Store td classes as a 2D array\n\t\t\tthis._originalTdClasses = [];\n\t\t\tArray.from(originalRows).forEach((row, rowIndex) => {\n\t\t\t\tconst tdElements = row.querySelectorAll<HTMLTableCellElement>('td');\n\t\t\t\tthis._originalTdClasses[rowIndex] = Array.from(tdElements).map(\n\t\t\t\t\t(td) => td.className || '',\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Fetch data from the server or from the DOM if `apiEndpoint` is not defined.\n\t * @returns {Promise<void>} Promise which is resolved after data has been fetched and checkbox plugin initialized.\n\t */\n\tprivate async _updateData(): Promise<void> {\n\t\tif (this._isFetching) return; // Prevent duplicate fetches\n\t\tthis._isFetching = true;\n\t\ttry {\n\t\t\tthis._showSpinner(); // Show spinner before fetching data\n\n\t\t\t// Fetch data and finalize - properly await to ensure finally block runs after completion\n\t\t\tif (typeof this._config.apiEndpoint === 'undefined') {\n\t\t\t\tawait this._fetchDataFromLocal();\n\t\t\t\tawait this._finalize();\n\t\t\t} else {\n\t\t\t\tawait this._fetchDataFromServer();\n\t\t\t\tawait this._finalize();\n\t\t\t}\n\t\t} finally {\n\t\t\t// Finally block now correctly executes after promises resolve, not immediately\n\t\t\tthis._isFetching = false;\n\t\t}\n\t}\n\n\t/**\n\t * Finalize data table after data has been fetched\n\t * @returns {void}\n\t */\n\tprivate _finalize(): void {\n\t\tthis._element.classList.add('datatable-initialized');\n\n\t\t// Initialize checkbox logic\n\t\tthis._checkbox.init();\n\n\t\t// Re-initialize sort handler to restore click listeners after table redraw\n\t\tif (this._sortHandler) {\n\t\t\tthis._sortHandler.initSort();\n\t\t}\n\n\t\tthis._attachSearchEvent();\n\n\t\tif (typeof KTComponents !== 'undefined') {\n\t\t\tKTComponents.init();\n\t\t}\n\n\t\t/**\n\t\t * Hide spinner\n\t\t */\n\t\tthis._hideSpinner();\n\t}\n\n\t/**\n\t * Attach search event to the search input element\n\t * @returns {void}\n\t */\n\tprivate _attachSearchEvent(): void {\n\t\tconst tableId: string = this._tableId();\n\t\tconst searchElement: HTMLInputElement | null =\n\t\t\tdocument.querySelector<HTMLInputElement>(\n\t\t\t\t`[data-kt-datatable-search=\"#${tableId}\"]`,\n\t\t\t);\n\n\t\t// Get search state\n\t\tconst { search } = this.getState();\n\t\t// Set search value\n\t\tif (searchElement) {\n\t\t\tsearchElement.value =\n\t\t\t\tsearch === undefined || search === null\n\t\t\t\t\t? ''\n\t\t\t\t\t: typeof search === 'string'\n\t\t\t\t\t\t? search\n\t\t\t\t\t\t: String(search);\n\t\t}\n\n\t\tif (searchElement) {\n\t\t\t// Check if a debounced search function already exists\n\t\t\tif ((searchElement as any)._debouncedSearch) {\n\t\t\t\t// Remove the existing debounced event listener\n\t\t\t\tsearchElement.removeEventListener(\n\t\t\t\t\t'keyup',\n\t\t\t\t\t(searchElement as any)._debouncedSearch,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Create a new debounced search function\n\t\t\tconst debouncedSearch = this._debounce(() => {\n\t\t\t\tthis.search(searchElement.value);\n\t\t\t}, this._config.search.delay);\n\n\t\t\t// Store the new debounced function as a property of the element\n\t\t\t(searchElement as any)._debouncedSearch = debouncedSearch;\n\n\t\t\t// Add the new debounced event listener\n\t\t\tsearchElement.addEventListener('keyup', debouncedSearch);\n\t\t}\n\t}\n\n\t/**\n\t * Fetch data from the DOM\n\t * Fetch data from the table element and save it to the `originalData` state property.\n\t * This method is used when the data is not fetched from the server via an API endpoint.\n\t */\n\tprivate async _fetchDataFromLocal(): Promise<void> {\n\t\tthis._fireEvent('fetch');\n\t\tthis._dispatchEvent('fetch');\n\n\t\tconst { sortField, sortOrder, page, pageSize, search } = this.getState();\n\t\tlet { originalData } = this.getState();\n\n\t\t// If the table element or the original data is not defined, bail\n\t\tif (\n\t\t\t!this._tableElement ||\n\t\t\toriginalData === undefined ||\n\t\t\tthis._tableConfigInvalidate() ||\n\t\t\tthis._localTableHeaderInvalidate() ||\n\t\t\tthis._localTableContentInvalidate()\n\t\t) {\n\t\t\tthis._deleteState();\n\n\t\t\tconst { originalData, originalDataAttributes } =\n\t\t\t\tthis._localExtractTableContent();\n\n\t\t\tthis._config._state.originalData = originalData;\n\t\t\tthis._config._state.originalDataAttributes = originalDataAttributes;\n\t\t}\n\n\t\t// Update the original data variable\n\t\toriginalData = this.getState().originalData;\n\n\t\t// Clone the original data\n\t\tlet _temp = (this._data = [...originalData] as T[]);\n\n\t\tif (search) {\n\t\t\t_temp = this._data = this._config.search.callback.call(\n\t\t\t\tthis,\n\t\t\t\tthis._data,\n\t\t\t\tsearch,\n\t\t\t) as T[];\n\t\t}\n\n\t\t// If sorting is defined, sort the data\n\t\tif (\n\t\t\tsortField !== undefined &&\n\t\t\tsortOrder !== undefined &&\n\t\t\tsortOrder !== ''\n\t\t) {\n\t\t\tif (typeof this._config.sort.callback === 'function') {\n\t\t\t\tthis._data = this._config.sort.callback.call(\n\t\t\t\t\tthis,\n\t\t\t\t\tthis._data,\n\t\t\t\t\tsortField as string,\n\t\t\t\t\tsortOrder,\n\t\t\t\t) as T[];\n\t\t\t}\n\t\t}\n\n\t\t// If there is data, slice it to the current page size\n\t\tif (this._data?.length > 0) {\n\t\t\t// Calculate the start and end indices for the current page\n\t\t\tconst startIndex = (page - 1) * pageSize;\n\t\t\tconst endIndex = startIndex + pageSize;\n\n\t\t\tthis._data = this._data.slice(startIndex, endIndex) as T[];\n\t\t}\n\n\t\t// Determine number of total rows\n\t\tthis._config._state.totalItems = _temp.length;\n\n\t\t// Draw the data\n\t\tawait this._draw();\n\t\tthis._fireEvent('fetched');\n\t\tthis._dispatchEvent('fetched');\n\t}\n\n\t/**\n\t * Checks if the table content has been invalidated by comparing the current checksum of the table body\n\t * with the stored checksum in the state. If the checksums are different, the state is updated with the\n\t * new checksum and `true` is returned. Otherwise, `false` is returned.\n\t *\n\t * @returns {boolean} `true` if the table content has been invalidated, `false` otherwise.\n\t */\n\tprivate _localTableContentInvalidate(): boolean {\n\t\tconst checksum: string = KTUtils.checksum(\n\t\t\tJSON.stringify(this._tbodyElement.innerHTML),\n\t\t);\n\t\tif (this.getState()._contentChecksum !== checksum) {\n\t\t\tthis._config._state._contentChecksum = checksum;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate _tableConfigInvalidate(): boolean {\n\t\t// Remove _data and _state from config\n\t\tconst { _data, _state, ...restConfig } = this._config;\n\t\tconst checksum: string = KTUtils.checksum(JSON.stringify(restConfig));\n\t\tif (_state._configChecksum !== checksum) {\n\t\t\tthis._config._state._configChecksum = checksum;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extract the table content and returns it as an object containing an array of original data and an array of original data attributes.\n\t *\n\t * @returns {{originalData: T[], originalDataAttributes: KTDataTableAttributeInterface[]}} - An object containing an array of original data and an array of original data attributes.\n\t */\n\tprivate _localExtractTableContent(): {\n\t\toriginalData: T[];\n\t\toriginalDataAttributes: KTDataTableAttributeInterface[];\n\t} {\n\t\tconst originalData: T[] = [];\n\t\tconst originalDataAttributes: KTDataTableAttributeInterface[] = [];\n\n\t\tthis._storeOriginalClasses();\n\n\t\tconst rows = this._tbodyElement.querySelectorAll<HTMLTableRowElement>('tr');\n\t\t\n\t\t// Filter th elements to only include those with data-kt-datatable-column attribute\n\t\tconst allThs: NodeListOf<HTMLTableCellElement> = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th')\n\t\t\t: ([] as unknown as NodeListOf<HTMLTableCellElement>);\n\t\t\n\t\tconst ths: HTMLTableCellElement[] = Array.from(allThs).filter(th => \n\t\t\tth.hasAttribute('data-kt-datatable-column')\n\t\t);\n\n\t\trows.forEach((row: HTMLTableRowElement) => {\n\t\t\tconst dataRow: T = {} as T;\n\t\t\tconst dataRowAttribute: KTDataTableAttributeInterface =\n\t\t\t\t{} as KTDataTableAttributeInterface;\n\n\t\t\trow.querySelectorAll<HTMLTableCellElement>('td').forEach((td, index) => {\n\t\t\t\tconst colName = ths[index]?.getAttribute('data-kt-datatable-column');\n\t\t\t\tif (colName) {\n\t\t\t\t\tdataRow[colName as keyof T] = td.innerHTML?.trim() as T[keyof T];\n\t\t\t\t} else {\n\t\t\t\t\t// Store the original HTML for fallback\n\t\t\t\t\tdataRow[index as keyof T] = td.innerHTML?.trim() as T[keyof T];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (Object.keys(dataRow).length > 0) {\n\t\t\t\toriginalData.push(dataRow);\n\t\t\t\toriginalDataAttributes.push(dataRowAttribute);\n\t\t\t}\n\t\t});\n\n\t\treturn { originalData, originalDataAttributes };\n\t}\n\n\t/**\n\t * Check if the table header is invalidated\n\t * @returns {boolean} - Returns true if the table header is invalidated, false otherwise\n\t */\n\tprivate _localTableHeaderInvalidate(): boolean {\n\t\tconst { originalData } = this.getState();\n\t\t\n\t\t// Count only th elements with data-kt-datatable-column attribute\n\t\tconst allThs: NodeListOf<HTMLTableCellElement> = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th')\n\t\t\t: ([] as unknown as NodeListOf<HTMLTableCellElement>);\n\t\tconst currentTableHeaders = Array.from(allThs).filter(th => \n\t\t\tth.hasAttribute('data-kt-datatable-column')\n\t\t).length;\n\t\t\n\t\tconst totalColumns = originalData.length\n\t\t\t? Object.keys(originalData[0]).length\n\t\t\t: 0;\n\n\t\treturn currentTableHeaders !== totalColumns;\n\t}\n\n\t/**\n\t * Fetch data from the server\n\t */\n\tprivate async _fetchDataFromServer(): Promise<void> {\n\t\t// Increment request ID to track this specific request\n\t\tconst currentRequestId = ++this._requestId;\n\n\t\tthis._fireEvent('fetch');\n\t\tthis._dispatchEvent('fetch');\n\n\t\tconst queryParams = this._getQueryParamsForFetchRequest();\n\n\t\tlet response: Response;\n\t\ttry {\n\t\t\tresponse = await this._performFetchRequest(queryParams);\n\t\t} catch (error) {\n\t\t\t// Silently ignore AbortError - request was cancelled\n\t\t\tif ((error as Error).name === 'AbortError') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\n\t\t// Check if this response is stale (a newer request has been initiated)\n\t\tif (currentRequestId !== this._requestId) {\n\t\t\t// Ignore stale response - a more recent request is in progress or has completed\n\t\t\treturn;\n\t\t}\n\n\t\tlet responseData = null;\n\n\t\ttry {\n\t\t\tresponseData = await response.json();\n\t\t} catch (error) {\n\t\t\t// Fire event with complete error context for application handling\n\t\t\tthis._fireEvent('parseError', {\n\t\t\t\tresponse,\n\t\t\t\terror: String(error),\n\t\t\t\tstatus: response.status,\n\t\t\t\tstatusText: response.statusText\n\t\t\t});\n\t\t\tthis._dispatchEvent('parseError', {\n\t\t\t\tresponse,\n\t\t\t\terror: String(error),\n\t\t\t\tstatus: response.status,\n\t\t\t\tstatusText: response.statusText\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Double-check request ID after JSON parsing (additional safety)\n\t\tif (currentRequestId !== this._requestId) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._fireEvent('fetched', { response: responseData });\n\t\tthis._dispatchEvent('fetched', { response: responseData });\n\n\t\t// Use the mapResponse function to transform the data if provided\n\t\tif (typeof this._config.mapResponse === 'function') {\n\t\t\tresponseData = this._config.mapResponse.call(this, responseData);\n\t\t}\n\n\t\tthis._data = responseData.data;\n\n\t\tthis._config._state.totalItems = responseData.totalCount;\n\n\t\tawait this._draw();\n\t\tthis._fireEvent('fetched');\n\t\tthis._dispatchEvent('fetched');\n\t}\n\n\t/**\n\t * Get the query params for a fetch request\n\t * @returns The query params for the fetch request\n\t */\n\tprivate _getQueryParamsForFetchRequest(): URLSearchParams {\n\t\t// Get the current state of the datatable\n\t\tconst { page, pageSize, sortField, sortOrder, filters, search } =\n\t\t\tthis.getState();\n\n\t\t// Create a new URLSearchParams object to store the query params\n\t\tlet queryParams = new URLSearchParams();\n\n\t\t// Add the current page number and page size to the query params\n\t\tqueryParams.set('page', String(page));\n\t\tqueryParams.set('size', String(pageSize));\n\n\t\t// If there is a sort order and field set, add them to the query params\n\t\tif (sortOrder !== undefined) {\n\t\t\tqueryParams.set('sortOrder', String(sortOrder));\n\t\t}\n\n\t\tif (sortField !== undefined) {\n\t\t\tqueryParams.set('sortField', String(sortField));\n\t\t}\n\n\t\t// If there are any filters set, add them to the query params\n\t\tif (Array.isArray(filters) && filters.length) {\n\t\t\tqueryParams.set(\n\t\t\t\t'filters',\n\t\t\t\tJSON.stringify(\n\t\t\t\t\tfilters.map((filter: KTDataTableColumnFilterInterface) => ({\n\t\t\t\t\t\t// Map the filter object to a simpler object with just the necessary properties\n\t\t\t\t\t\tcolumn: filter.column,\n\t\t\t\t\t\ttype: filter.type,\n\t\t\t\t\t\tvalue: filter.value,\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (search) {\n\t\t\tqueryParams.set(\n\t\t\t\t'search',\n\t\t\t\ttypeof search === 'object' ? JSON.stringify(search) : search,\n\t\t\t);\n\t\t}\n\n\t\t// If a mapRequest function is provided, call it with the query params object\n\t\tif (typeof this._config.mapRequest === 'function') {\n\t\t\tqueryParams = this._config.mapRequest.call(this, queryParams);\n\t\t}\n\n\t\t// Return the query params object\n\t\treturn queryParams;\n\t}\n\n\tprivate async _performFetchRequest(\n\t\tqueryParams: URLSearchParams,\n\t): Promise<Response> {\n\t\tlet requestMethod: RequestInit['method'] = this._config.requestMethod;\n\t\tlet requestBody: RequestInit['body'] | undefined = undefined;\n\n\t\t// Cancel previous request to prevent race conditions\n\t\tif (this._abortController) {\n\t\t\tthis._abortController.abort();\n\t\t}\n\n\t\t// Create new AbortController for this request\n\t\tthis._abortController = new AbortController();\n\n\t\t// If the request method is POST, send the query params as the request body\n\t\tif (requestMethod === 'POST') {\n\t\t\trequestBody = queryParams;\n\t\t} else if (requestMethod === 'GET') {\n\t\t\t// If the request method is GET, append the query params to the API endpoint\n\t\t\tconst apiEndpointWithQueryParams = this._createUrl(\n\t\t\t\tthis._config.apiEndpoint,\n\t\t\t);\n\t\t\tapiEndpointWithQueryParams.search = queryParams.toString();\n\t\t\tthis._config.apiEndpoint = apiEndpointWithQueryParams.toString();\n\t\t}\n\n\t\treturn fetch(this._config.apiEndpoint, {\n\t\t\tmethod: requestMethod,\n\t\t\tbody: requestBody,\n\t\t\theaders: this._config.requestHeaders,\n\t\t\t...(this._config.requestCredentials && {\n\t\t\t\tcredentials: this._config.requestCredentials,\n\t\t\t}),\n\t\t\t// Add abort signal if available\n\t\t\t...(this._abortController && { signal: this._abortController.signal }),\n\t\t}).catch((error) => {\n\t\t\t// Silently ignore AbortError - this is expected when requests are cancelled\n\t\t\tif (error.name === 'AbortError') {\n\t\t\t\treturn Promise.reject(error);\n\t\t\t}\n\n\t\t\t// Trigger an error event for non-abort errors\n\t\t\tthis._fireEvent('error', { error });\n\t\t\tthis._dispatchEvent('error', { error });\n\n\t\t\tthis._noticeOnTable('Error performing fetch request: ' + String(error));\n\t\t\tthrow error;\n\t\t});\n\t}\n\n\t/**\n\t * Creates a complete URL from a relative path or a full URL.\n\t *\n\t * This method accepts a string that can be either a relative path or a full URL.\n\t * If the string is a complete URL (i.e., it contains a valid protocol), a URL\n\t * object based on that string is returned. Otherwise, it ensures the path starts\n\t * with a \"/\" and combines it with the provided base URL (or the current window's origin)\n\t * to form a complete URL.\n\t *\n\t * @param {string} pathOrUrl - The path or URL to process.\n\t * @param {string | null} [baseUrl=window.location.origin] - The base URL for resolving the relative path.\n\t * Defaults to the current window's origin.\n\t * @returns {URL} The resulting URL object.\n\t */\n\n\tprivate _createUrl(\n\t\tpathOrUrl: string,\n\t\tbaseUrl: string | null = window.location.origin,\n\t): URL {\n\t\t// Regular expression to check if the input is a full URL\n\t\tconst isFullUrl = /^[a-zA-Z][a-zA-Z\\d+\\-.]*:\\/\\//.test(pathOrUrl);\n\n\t\tif (isFullUrl) {\n\t\t\treturn new URL(pathOrUrl); // Return full URL as URL object\n\t\t}\n\n\t\t// Ensure path starts with a slash to avoid incorrect concatenation\n\t\tconst normalizedPath = pathOrUrl.startsWith('/')\n\t\t\t? pathOrUrl\n\t\t\t: `/${pathOrUrl}`;\n\n\t\treturn new URL(normalizedPath, baseUrl);\n\t}\n\n\t/**\n\t * Update the table and pagination controls with new data\n\t * @returns {Promise<void>} A promise that resolves when the table and pagination controls are updated\n\t */\n\tprivate async _draw(): Promise<void> {\n\t\tthis._config._state.totalPages =\n\t\t\tMath.ceil(this.getState().totalItems / this.getState().pageSize) || 0;\n\n\t\tthis._fireEvent('draw');\n\t\tthis._dispatchEvent('draw');\n\n\t\tthis._dispose();\n\n\t\t// Update the table and pagination controls\n\t\tif (this._theadElement && this._tbodyElement) {\n\t\t\tthis._updateTable();\n\t\t}\n\n\t\tif (this._infoElement && this._paginationElement) {\n\t\t\tthis._updatePagination();\n\t\t}\n\n\t\tthis._fireEvent('drew');\n\t\tthis._dispatchEvent('drew');\n\n\t\t// Spinner is hidden in _finalize() to ensure it stays visible until the entire request completes\n\t\t// Removed duplicate _hideSpinner() call here to prevent premature hiding\n\n\t\tif (this._config.stateSave) {\n\t\t\tthis._saveState();\n\t\t}\n\t}\n\n\t/**\n\t * Update the HTML table with new data\n\t * @returns {HTMLTableSectionElement} The new table body element\n\t */\n\tprivate _updateTable(): HTMLTableSectionElement {\n\t\t// Clear the existing table contents using a more efficient method\n\t\twhile (this._tableElement.tBodies.length) {\n\t\t\tthis._tableElement.removeChild(this._tableElement.tBodies[0]);\n\t\t}\n\n\t\t// Create the table body with the new data\n\t\tconst tbodyElement =\n\t\t\tthis._tableElement.createTBody() as HTMLTableSectionElement;\n\n\t\t// Apply the original class to the new tbody element\n\t\tif (this._originalTbodyClass) {\n\t\t\ttbodyElement.className = this._originalTbodyClass;\n\t\t}\n\n\t\tthis._updateTableContent(tbodyElement);\n\n\t\treturn tbodyElement;\n\t}\n\n\t/**\n\t * Update the table content\n\t * @param tbodyElement The table body element\n\t * @returns {HTMLTableSectionElement} The updated table body element\n\t */\n\tprivate _updateTableContent(\n\t\ttbodyElement: HTMLTableSectionElement,\n\t): HTMLTableSectionElement {\n\t\tconst fragment = document.createDocumentFragment();\n\n\t\ttbodyElement.textContent = ''; // Clear the tbody element\n\n\t\tif (this._data.length === 0) {\n\t\t\tthis._noticeOnTable(this._config.infoEmpty || '');\n\t\t\treturn tbodyElement;\n\t\t}\n\n\t\t// Filter th elements to only include those with data-kt-datatable-column attribute\n\t\t// This prevents creating blank td elements for merged header cells (colspan/rowspan)\n\t\tconst allThs: NodeListOf<HTMLTableCellElement> = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th')\n\t\t\t: ([] as unknown as NodeListOf<HTMLTableCellElement>);\n\t\t\n\t\tconst ths: HTMLTableCellElement[] = Array.from(allThs).filter(th => \n\t\t\tth.hasAttribute('data-kt-datatable-column')\n\t\t);\n\n\t\tthis._data.forEach((item: T, rowIndex: number) => {\n\t\t\tconst row = document.createElement('tr');\n\n\t\t\t// Apply original tr class if available\n\t\t\tif (this._originalTrClasses && this._originalTrClasses[rowIndex]) {\n\t\t\t\trow.className = this._originalTrClasses[rowIndex];\n\t\t\t}\n\n\t\t\tif (!this._config.columns) {\n\t\t\t\tconst dataRowAttributes = this.getState().originalDataAttributes\n\t\t\t\t\t? this.getState().originalDataAttributes[rowIndex]\n\t\t\t\t\t: null;\n\n\t\t\t\t// Use the order of <th> elements with data-kt-datatable-column to render <td>s in the correct order\n\t\t\t\tths.forEach((th, colIndex) => {\n\t\t\t\t\tconst colName = th.getAttribute('data-kt-datatable-column');\n\t\t\t\t\tconst td = document.createElement('td');\n\t\t\t\t\tlet value: any;\n\t\t\t\t\tif (colName && Object.prototype.hasOwnProperty.call(item, colName)) {\n\t\t\t\t\t\tvalue = item[colName as keyof T];\n\t\t\t\t\t} else if (Object.prototype.hasOwnProperty.call(item, colIndex)) {\n\t\t\t\t\t\tvalue = item[colIndex as keyof T];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = '';\n\t\t\t\t\t}\n\t\t\t\t\ttd.innerHTML = value as string;\n\n\t\t\t\t\t// Apply original td class if available\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis._originalTdClasses &&\n\t\t\t\t\t\tthis._originalTdClasses[rowIndex] &&\n\t\t\t\t\t\tthis._originalTdClasses[rowIndex][colIndex]\n\t\t\t\t\t) {\n\t\t\t\t\t\ttd.className = this._originalTdClasses[rowIndex][colIndex];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dataRowAttributes && dataRowAttributes[colIndex]) {\n\t\t\t\t\t\tfor (const attr in dataRowAttributes[colIndex]) {\n\t\t\t\t\t\t\ttd.setAttribute(attr, dataRowAttributes[colIndex][attr]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\trow.appendChild(td);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tObject.keys(this._config.columns).forEach(\n\t\t\t\t\t(key: keyof T, colIndex: number) => {\n\t\t\t\t\t\tconst td = document.createElement('td');\n\t\t\t\t\t\tconst columnDef = this._config.columns[key as string];\n\n\t\t\t\t\t\t// Apply original td class if available\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis._originalTdClasses &&\n\t\t\t\t\t\t\tthis._originalTdClasses[rowIndex] &&\n\t\t\t\t\t\t\tthis._originalTdClasses[rowIndex][colIndex]\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttd.className = this._originalTdClasses[rowIndex][colIndex];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof columnDef.render === 'function') {\n\t\t\t\t\t\t\tconst result = columnDef.render.call(this, item[key], item, this);\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tresult instanceof HTMLElement ||\n\t\t\t\t\t\t\t\tresult instanceof DocumentFragment\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\ttd.appendChild(result);\n\t\t\t\t\t\t\t} else if (typeof result === 'string') {\n\t\t\t\t\t\t\t\ttd.innerHTML = result as string;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttd.textContent = item[key] as string;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (typeof columnDef.createdCell === 'function') {\n\t\t\t\t\t\t\tcolumnDef.createdCell.call(this, td, item[key], item, row);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trow.appendChild(td);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfragment.appendChild(row);\n\t\t});\n\n\t\ttbodyElement.appendChild(fragment);\n\t\treturn tbodyElement;\n\t}\n\n\t/**\n\t * Show a notice on the table\n\t * @param message The message to show. If empty, the message will be removed\n\t * @returns {void}\n\t */\n\tprivate _noticeOnTable(message: string = ''): void {\n\t\tconst row = this._tableElement.tBodies[0].insertRow();\n\t\tconst cell = row.insertCell();\n\t\tcell.colSpan = this._theadElement\n\t\t\t? this._theadElement.querySelectorAll('th').length\n\t\t\t: 0;\n\t\tcell.innerHTML = message;\n\t}\n\n\tprivate _updatePagination(): void {\n\t\tthis._removeChildElements(this._sizeElement);\n\t\tthis._createPageSizeControls(this._sizeElement);\n\n\t\tthis._removeChildElements(this._paginationElement);\n\t\tthis._createPaginationControls(this._infoElement, this._paginationElement);\n\t}\n\n\t/**\n\t * Removes all child elements from the given container element.\n\t * @param container The container element to remove the child elements from.\n\t */\n\tprivate _removeChildElements(container: HTMLElement): void {\n\t\tif (!container) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Loop through all child elements of the container and remove them one by one\n\t\twhile (container.firstChild) {\n\t\t\t// Remove the first child element (which is the first element in the list of child elements)\n\t\t\tcontainer.removeChild(container.firstChild);\n\t\t}\n\t}\n\n\t/**\n\t * Creates a container element for the items per page selector.\n\t * @param _sizeElement The element to create the page size controls in.\n\t * @returns The container element.\n\t */\n\tprivate _createPageSizeControls(\n\t\t_sizeElement: HTMLSelectElement,\n\t): HTMLSelectElement {\n\t\t// If no element is provided, return early\n\t\tif (!_sizeElement) {\n\t\t\treturn _sizeElement;\n\t\t}\n\n\t\t// Wait for the element to be attached to the DOM\n\t\tsetTimeout(() => {\n\t\t\t// Create <option> elements for each page size option\n\t\t\tconst options = this._config.pageSizes.map((size: number) => {\n\t\t\t\tconst option = document.createElement('option') as HTMLOptionElement;\n\t\t\t\toption.value = String(size);\n\t\t\t\toption.text = String(size);\n\t\t\t\toption.selected = this.getState().pageSize === size;\n\t\t\t\treturn option;\n\t\t\t});\n\n\t\t\t// Add the <option> elements to the provided element\n\t\t\t_sizeElement.append(...options);\n\t\t}, 100);\n\n\t\t// Create an event listener for the \"change\" event on the element\n\t\tconst _pageSizeControlsEvent = (event: Event) => {\n\t\t\t// When the element changes, reload the page with the new page size and page number 1\n\t\t\tthis._reloadPageSize(\n\t\t\t\tNumber((event.target as HTMLSelectElement).value),\n\t\t\t\t1,\n\t\t\t);\n\t\t};\n\n\t\t// Bind the event listener to the component instance\n\t\t_sizeElement.onchange = _pageSizeControlsEvent.bind(this);\n\n\t\t// Return the element\n\t\treturn _sizeElement;\n\t}\n\n\t/**\n\t * Reloads the data with the specified page size and optional page number.\n\t * @param pageSize The new page size.\n\t * @param page The new page number (optional, defaults to 1).\n\t */\n\tprivate _reloadPageSize(pageSize: number, page: number = 1): void {\n\t\t// Update the page size and page number in the state\n\t\tthis._config._state.pageSize = pageSize;\n\t\tthis._config._state.page = page;\n\n\t\t// Update the data with the new page size and page number\n\t\tthis._updateData();\n\t}\n\n\t/**\n\t * Creates the pagination controls for the component.\n\t * @param _infoElement The element to set the info text in.\n\t * @param _paginationElement The element to create the pagination controls in.\n\t * @return {HTMLElement} The element containing the pagination controls.\n\t */\n\tprivate _createPaginationControls(\n\t\t_infoElement: HTMLElement,\n\t\t_paginationElement: HTMLElement,\n\t): HTMLElement {\n\t\tif (!_infoElement || !_paginationElement || this._data.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tthis._setPaginationInfoText(_infoElement);\n\t\tconst paginationContainer =\n\t\t\tthis._createPaginationContainer(_paginationElement);\n\n\t\tif (paginationContainer) {\n\t\t\tthis._createPaginationButtons(paginationContainer);\n\t\t}\n\n\t\treturn paginationContainer;\n\t}\n\n\t/**\n\t * Sets the info text for the pagination controls.\n\t * @param _infoElement The element to set the info text in.\n\t */\n\tprivate _setPaginationInfoText(_infoElement: HTMLElement): void {\n\t\t_infoElement.textContent = this._config.info\n\t\t\t.replace(\n\t\t\t\t'{start}',\n\t\t\t\t(this.getState().page - 1) * this.getState().pageSize + 1 + '',\n\t\t\t)\n\t\t\t.replace(\n\t\t\t\t'{end}',\n\t\t\t\tMath.min(\n\t\t\t\t\tthis.getState().page * this.getState().pageSize,\n\t\t\t\t\tthis.getState().totalItems,\n\t\t\t\t) + '',\n\t\t\t)\n\t\t\t.replace('{total}', this.getState().totalItems + '');\n\t}\n\n\t/**\n\t * Creates the container element for the pagination controls.\n\t * @param _paginationElement The element to create the pagination controls in.\n\t * @return {HTMLElement} The container element.\n\t */\n\tprivate _createPaginationContainer(\n\t\t_paginationElement: HTMLElement,\n\t): HTMLElement {\n\t\t// No longer create a wrapping div. Just return the pagination element itself.\n\t\treturn _paginationElement;\n\t}\n\n\t/**\n\t * Creates the pagination buttons for the component.\n\t * @param paginationContainer The container element for the pagination controls.\n\t */\n\tprivate _createPaginationButtons(paginationContainer: HTMLElement): void {\n\t\tconst { page: currentPage, totalPages } = this.getState();\n\t\tconst { previous, next, number, more } = this._config.pagination;\n\n\t\t// Helper function to create a button\n\t\tconst createButton = (\n\t\t\ttext: string,\n\t\t\tclassName: string,\n\t\t\tdisabled: boolean,\n\t\t\thandleClick: () => void,\n\t\t): HTMLButtonElement => {\n\t\t\tconst button = document.createElement('button') as HTMLButtonElement;\n\t\t\tbutton.className = className;\n\t\t\tbutton.innerHTML = text;\n\t\t\tbutton.disabled = disabled;\n\t\t\tbutton.onclick = handleClick;\n\t\t\treturn button;\n\t\t};\n\n\t\t// Add Previous Button\n\t\tpaginationContainer.appendChild(\n\t\t\tcreateButton(\n\t\t\t\tprevious.text,\n\t\t\t\t`${previous.class}${currentPage === 1 ? ' disabled' : ''}`,\n\t\t\t\tcurrentPage === 1,\n\t\t\t\t() => this._paginateData(currentPage - 1),\n\t\t\t),\n\t\t);\n\n\t\t// Calculate range of pages\n\t\tconst pageMoreEnabled = this._config.pageMore;\n\n\t\tif (pageMoreEnabled) {\n\t\t\tconst maxButtons = this._config.pageMoreLimit;\n\t\t\tconst range = this._calculatePageRange(\n\t\t\t\tcurrentPage,\n\t\t\t\ttotalPages,\n\t\t\t\tmaxButtons,\n\t\t\t);\n\n\t\t\t// Add start ellipsis\n\t\t\tif (range.start > 1) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(more.text, more.class, false, () =>\n\t\t\t\t\t\tthis._paginateData(Math.max(1, range.start - 1)),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Add page buttons\n\t\t\tfor (let i = range.start; i <= range.end; i++) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(\n\t\t\t\t\t\tnumber.text.replace('{page}', i.toString()),\n\t\t\t\t\t\t`${number.class}${currentPage === i ? ' active disabled' : ''}`,\n\t\t\t\t\t\tcurrentPage === i,\n\t\t\t\t\t\t() => this._paginateData(i),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Add end ellipsis\n\t\t\tif (pageMoreEnabled && range.end < totalPages) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(more.text, more.class, false, () =>\n\t\t\t\t\t\tthis._paginateData(Math.min(totalPages, range.end + 1)),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// Add page buttons\n\t\t\tfor (let i = 1; i <= totalPages; i++) {\n\t\t\t\tpaginationContainer.appendChild(\n\t\t\t\t\tcreateButton(\n\t\t\t\t\t\tnumber.text.replace('{page}', i.toString()),\n\t\t\t\t\t\t`${number.class}${currentPage === i ? ' active disabled' : ''}`,\n\t\t\t\t\t\tcurrentPage === i,\n\t\t\t\t\t\t() => this._paginateData(i),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Add Next Button\n\t\tpaginationContainer.appendChild(\n\t\t\tcreateButton(\n\t\t\t\tnext.text,\n\t\t\t\t`${next.class}${currentPage === totalPages ? ' disabled' : ''}`,\n\t\t\t\tcurrentPage === totalPages,\n\t\t\t\t() => this._paginateData(currentPage + 1),\n\t\t\t),\n\t\t);\n\t}\n\n\t// New helper method to calculate page range\n\tprivate _calculatePageRange(\n\t\tcurrentPage: number,\n\t\ttotalPages: number,\n\t\tmaxButtons: number,\n\t): { start: number; end: number } {\n\t\tlet startPage: number, endPage: number;\n\t\tconst halfMaxButtons = Math.floor(maxButtons / 2);\n\n\t\tif (totalPages <= maxButtons) {\n\t\t\tstartPage = 1;\n\t\t\tendPage = totalPages;\n\t\t} else {\n\t\t\tstartPage = Math.max(currentPage - halfMaxButtons, 1);\n\t\t\tendPage = Math.min(startPage + maxButtons - 1, totalPages);\n\t\t\tif (endPage - startPage < maxButtons - 1) {\n\t\t\t\tstartPage = Math.max(endPage - maxButtons + 1, 1);\n\t\t\t}\n\t\t}\n\n\t\treturn { start: startPage, end: endPage };\n\t}\n\n\t/**\n\t * Method for handling pagination\n\t * @param page - The page number to navigate to\n\t */\n\tprivate _paginateData(page: number): void {\n\t\tif (page < 1 || !Number.isInteger(page)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._fireEvent('pagination', { page: page });\n\t\tthis._dispatchEvent('pagination', { page: page });\n\n\t\tif (page >= 1 && page <= this.getState().totalPages) {\n\t\t\tthis._config._state.page = page;\n\t\t\tthis._updateData();\n\t\t}\n\t}\n\n\t// Method to show the loading spinner\n\tprivate _showSpinner(): void {\n\t\tconst spinner =\n\t\t\tthis._element.querySelector<HTMLElement>(\n\t\t\t\tthis._config.attributes.spinner,\n\t\t\t) || this._createSpinner();\n\t\tif (spinner) {\n\t\t\tspinner.style.display = 'block';\n\t\t}\n\t\tthis._element.classList.add(this._config.loadingClass);\n\t}\n\n\t// Method to hide the loading spinner\n\tprivate _hideSpinner(): void {\n\t\tconst spinner = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.spinner,\n\t\t);\n\t\tif (spinner) {\n\t\t\tspinner.style.display = 'none';\n\t\t}\n\t\tthis._element.classList.remove(this._config.loadingClass);\n\t}\n\n\t// Method to create a spinner element if it doesn't exist\n\tprivate _createSpinner(): HTMLElement {\n\t\tif (typeof this._config.loading === 'undefined') {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst template = document.createElement('template');\n\t\ttemplate.innerHTML = this._config.loading.template\n\t\t\t.trim()\n\t\t\t.replace('{content}', this._config.loading.content);\n\t\tconst spinner = template.content.firstChild as HTMLElement;\n\t\tspinner.setAttribute('data-kt-datatable-spinner', 'true');\n\n\t\tthis._tableElement.appendChild(spinner);\n\n\t\treturn spinner;\n\t}\n\n\t/**\n\t * Saves the current state of the table to local storage.\n\t * @returns {void}\n\t */\n\tprivate _saveState(): void {\n\t\tthis._fireEvent('stateSave');\n\t\tthis._dispatchEvent('stateSave');\n\n\t\tconst ns: string = this._tableNamespace();\n\n\t\tif (ns) {\n\t\t\tlocalStorage.setItem(\n\t\t\t\tns,\n\t\t\t\tJSON.stringify(this.getState() as KTDataTableStateInterface),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Loads the saved state of the table from local storage, if it exists.\n\t * @returns {Object} The saved state of the table, or null if no saved state exists.\n\t */\n\tprivate _loadState(): KTDataTableStateInterface | null {\n\t\tconst stateString = localStorage.getItem(this._tableNamespace());\n\t\tif (!stateString) return null;\n\n\t\ttry {\n\t\t\tconst state = JSON.parse(stateString) as KTDataTableStateInterface;\n\t\t\tif (state) this._config._state = state;\n\t\t\treturn state;\n\t\t} catch {} // eslint-disable-line no-empty\n\n\t\treturn null;\n\t}\n\n\tprivate _deleteState(): void {\n\t\tconst ns = this._tableNamespace();\n\n\t\tif (ns) {\n\t\t\tlocalStorage.removeItem(ns);\n\t\t}\n\t}\n\n\t/**\n\t * Gets the namespace for the table's state.\n\t * If a namespace is specified in the config, it is used.\n\t * Otherwise, if the table element has an ID, it is used.\n\t * Otherwise, if the component element has an ID, it is used.\n\t * Finally, the component's UID is used.\n\t * @returns {string} The namespace for the table's state.\n\t */\n\tprivate _tableNamespace(): string {\n\t\t// Use the specified namespace, if one is given\n\t\tif (this._config.stateNamespace) {\n\t\t\treturn this._config.stateNamespace;\n\t\t}\n\n\t\t// Fallback to the component's UID\n\t\treturn this._tableId() ?? this._name;\n\t}\n\n\tprivate _tableId(): string {\n\t\tlet id: string = null;\n\t\t// If the table element has an ID, use that\n\t\tif (this._tableElement?.getAttribute('id')) {\n\t\t\tid = this._tableElement.getAttribute('id') as string;\n\t\t}\n\n\t\t// If the component element has an ID, use that\n\t\tif (this._element?.getAttribute('id')) {\n\t\t\tid = this._element.getAttribute('id') as string;\n\t\t}\n\n\t\treturn id;\n\t}\n\n\t/**\n\t * Clean up all event listeners, handlers, and DOM nodes created by this instance.\n\t * This method is called before re-rendering or when disposing the component.\n\t */\n\tprivate _dispose() {\n\t\t// --- 1. Remove search input event listener (debounced) ---\n\t\tconst tableId: string = this._tableId();\n\t\tconst searchElement: HTMLInputElement | null =\n\t\t\tdocument.querySelector<HTMLInputElement>(\n\t\t\t\t`[data-kt-datatable-search=\"#${tableId}\"]`,\n\t\t\t);\n\t\tif (searchElement && (searchElement as any)._debouncedSearch) {\n\t\t\tsearchElement.removeEventListener(\n\t\t\t\t'keyup',\n\t\t\t\t(searchElement as any)._debouncedSearch,\n\t\t\t);\n\t\t\tdelete (searchElement as any)._debouncedSearch;\n\t\t}\n\n\t\t// --- 2. Remove page size dropdown event listener ---\n\t\tif (this._sizeElement && this._sizeElement.onchange) {\n\t\t\tthis._sizeElement.onchange = null;\n\t\t}\n\n\t\t// --- 3. Remove all pagination button event listeners ---\n\t\tif (this._paginationElement) {\n\t\t\t// Remove all child nodes (buttons) to ensure no lingering listeners\n\t\t\twhile (this._paginationElement.firstChild) {\n\t\t\t\tthis._paginationElement.removeChild(this._paginationElement.firstChild);\n\t\t\t}\n\t\t}\n\n\t\t// --- 4. Dispose of handler objects (checkbox, sort) ---\n\t\t// KTDataTableCheckboxAPI does not have a dispose method, but we can remove header checkbox listener\n\t\tif (\n\t\t\tthis._checkbox &&\n\t\t\ttypeof (this._checkbox as any).dispose === 'function'\n\t\t) {\n\t\t\t(this._checkbox as any).dispose();\n\t\t} else {\n\t\t\t// Remove header checkbox event listener if possible\n\t\t\tconst headerCheckElement = this._element.querySelector<HTMLInputElement>(\n\t\t\t\tthis._config.attributes.check,\n\t\t\t);\n\t\t\tif (headerCheckElement) {\n\t\t\t\theaderCheckElement.replaceWith(headerCheckElement.cloneNode(true));\n\t\t\t}\n\t\t}\n\t\t// KTDataTableSortAPI does not have a dispose method, but we can remove th click listeners by replacing them\n\t\tif (this._theadElement) {\n\t\t\tconst ths = this._theadElement.querySelectorAll('th');\n\t\t\tths.forEach((th) => {\n\t\t\t\tth.replaceWith(th.cloneNode(true));\n\t\t\t});\n\t\t}\n\n\t\t// --- 5. Remove spinner DOM node if it exists ---\n\t\tconst spinner = this._element.querySelector<HTMLElement>(\n\t\t\tthis._config.attributes.spinner,\n\t\t);\n\t\tif (spinner && spinner.parentNode) {\n\t\t\tspinner.parentNode.removeChild(spinner);\n\t\t}\n\t\tthis._element.classList.remove(this._config.loadingClass);\n\n\t\t// --- 6. Remove instance reference from the DOM element ---\n\t\tif ((this._element as any).instance) {\n\t\t\tdelete (this._element as any).instance;\n\t\t}\n\n\t\t// --- 7. (Optional) Clear localStorage state ---\n\t\t// Uncomment the following line if you want to clear state on dispose:\n\t\t// this._deleteState();\n\t}\n\n\tprivate _debounce(func: Function, wait: number) {\n\t\tlet timeout: number | undefined;\n\t\treturn function (...args: any[]) {\n\t\t\tconst later = () => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tfunc(...args);\n\t\t\t};\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = window.setTimeout(later, wait);\n\t\t};\n\t}\n\n\t/**\n\t * Gets the current state of the table.\n\t * @returns {KTDataTableStateInterface} The current state of the table.\n\t */\n\tpublic getState(): KTDataTableStateInterface {\n\t\treturn {\n\t\t\t/**\n\t\t\t * The current page number.\n\t\t\t */\n\t\t\tpage: 1,\n\t\t\t/**\n\t\t\t * The field that the data is sorted by.\n\t\t\t */\n\t\t\tsortField: null,\n\t\t\t/**\n\t\t\t * The sort order (ascending or descending).\n\t\t\t */\n\t\t\tsortOrder: '',\n\t\t\t/**\n\t\t\t * The number of rows to display per page.\n\t\t\t */\n\t\t\tpageSize: this._config.pageSize,\n\n\t\t\tfilters: [],\n\n\t\t\t/**\n\t\t\t * Any additional state that may have been stored in the config.\n\t\t\t */\n\t\t\t...this._config._state,\n\t\t};\n\t}\n\n\t/**\n\t * Sorts the data in the table by the specified field.\n\t * @param field The field to sort by.\n\t */\n\tpublic sort(field: keyof T | number): void {\n\t\t// Use the sort handler to update state and trigger sorting\n\t\tconst state = this.getState();\n\t\tconst sortOrder = this._sortHandler.toggleSortOrder(\n\t\t\tstate.sortField,\n\t\t\tstate.sortOrder,\n\t\t\tfield,\n\t\t);\n\t\tthis._sortHandler.setSortIcon(field as keyof T, sortOrder);\n\t\tthis._config._state.sortField = field as never;\n\t\tthis._config._state.sortOrder = sortOrder;\n\t\tthis._fireEvent('sort', { field, order: sortOrder });\n\t\tthis._dispatchEvent('sort', { field, order: sortOrder });\n\t\tthis._updateData();\n\t}\n\n\t/**\n\t * Navigates to the specified page in the data table.\n\t * @param page The page number to navigate to.\n\t */\n\tpublic goPage(page: number): void {\n\t\tif (page < 1 || !Number.isInteger(page)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Navigate to the specified page\n\t\tthis._paginateData(page);\n\t}\n\n\t/**\n\t * Set the page size of the data table.\n\t * @param pageSize The new page size.\n\t */\n\tpublic setPageSize(pageSize: number): void {\n\t\tif (!Number.isInteger(pageSize)) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Reload the page size of the data table.\n\t\t * @param pageSize The new page size.\n\t\t */\n\t\tthis._reloadPageSize(pageSize);\n\t}\n\n\t/**\n\t * Reloads the data from the server and updates the table.\n\t * Triggers the 'reload' event and the 'kt.datatable.reload' custom event.\n\t */\n\tpublic reload(): void {\n\t\tthis._fireEvent('reload');\n\t\tthis._dispatchEvent('reload');\n\n\t\t// Fetch the data from the server using the current sort and filter settings\n\t\tthis._updateData();\n\t}\n\n\tpublic redraw(page: number = 1): void {\n\t\tthis._fireEvent('redraw');\n\t\tthis._dispatchEvent('redraw');\n\n\t\tthis._paginateData(page);\n\t}\n\n\t/**\n\t * Show the loading spinner of the data table.\n\t */\n\tpublic showSpinner(): void {\n\t\t/**\n\t\t * Show the loading spinner of the data table.\n\t\t */\n\t\tthis._showSpinner();\n\t}\n\n\t/**\n\t * Hide the loading spinner of the data table.\n\t */\n\tpublic hideSpinner(): void {\n\t\t/**\n\t\t * Hide the loading spinner of the data table.\n\t\t */\n\t\tthis._hideSpinner();\n\t}\n\n\t/**\n\t * Filter data using the specified filter object.\n\t * Replaces the existing filter object for the column with the new one.\n\t * @param filter Filter object containing the column name and its value.\n\t * @returns The KTDataTable instance.\n\t * @throws Error if the filter object is null or undefined.\n\t */\n\tpublic setFilter(filter: KTDataTableColumnFilterInterface): KTDataTable<T> {\n\t\tthis._config._state.filters = [\n\t\t\t...(this.getState().filters || []).filter(\n\t\t\t\t(f) => f.column !== filter.column,\n\t\t\t),\n\t\t\tfilter,\n\t\t];\n\t\tthis._config._state.page = 1;\n\t\treturn this;\n\t}\n\n\tpublic override dispose(): void {\n\t\tthis._dispose();\n\t}\n\n\tpublic search(query: string | object): void {\n\t\tthis._config._state.search = query;\n\t\tthis._config._state.page = 1;\n\t\tthis.reload();\n\t}\n\n\t/**\n\t * Static variables\n\t */\n\tprivate static _instances = new Map<\n\t\tHTMLElement,\n\t\tKTDataTable<KTDataTableDataInterface>\n\t>();\n\n\t/**\n\t * Create KTDataTable instances for all elements with a data-kt-datatable=\"true\" attribute.\n\t * This function is now browser-guarded and must be called explicitly.\n\t */\n\tpublic static createInstances(): void {\n\t\tif (typeof document === 'undefined') return;\n\t\tconst elements = document.querySelectorAll<HTMLElement>(\n\t\t\t'[data-kt-datatable=\"true\"]',\n\t\t);\n\n\t\telements.forEach((element) => {\n\t\t\tif (\n\t\t\t\telement.hasAttribute('data-kt-datatable') &&\n\t\t\t\t!element.classList.contains('datatable-initialized')\n\t\t\t) {\n\t\t\t\t/**\n\t\t\t\t * Create an instance of KTDataTable for the given element\n\t\t\t\t * @param element The element to create an instance for\n\t\t\t\t */\n\t\t\t\tconst instance = new KTDataTable(element);\n\t\t\t\tthis._instances.set(element, instance);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Get the KTDataTable instance for a given element.\n\t *\n\t * @param element The element to retrieve the instance for\n\t * @returns The KTDataTable instance or undefined if not found\n\t */\n\tpublic static getInstance(\n\t\telement: HTMLElement,\n\t): KTDataTable<KTDataTableDataInterface> | undefined {\n\t\t// First check the static Map (for instances created via createInstances)\n\t\tconst instanceFromMap = this._instances.get(element);\n\t\tif (instanceFromMap) {\n\t\t\treturn instanceFromMap;\n\t\t}\n\n\t\t// Fallback to element's instance property (for manually created instances)\n\t\treturn (element as any).instance;\n\t}\n\n\t/**\n\t * Initializes all KTDataTable instances on the page.\n\t * This function is now browser-guarded and must be called explicitly.\n\t */\n\tpublic static init(): void {\n\t\tif (typeof document === 'undefined') return;\n\t\t// Create instances of KTDataTable for all elements with a\n\t\t// data-kt-datatable=\"true\" attribute\n\t\tKTDataTable.createInstances();\n\t}\n\n\t/**\n\t * Check if all visible rows are checked (header checkbox state)\n\t * @returns {boolean}\n\t */\n\tpublic isChecked(): boolean {\n\t\treturn this._checkbox.isChecked();\n\t}\n\n\t/**\n\t * Toggle all visible row checkboxes (header checkbox)\n\t * @returns {void}\n\t */\n\tpublic toggle(): void {\n\t\tthis._checkbox.toggle();\n\t}\n\n\t/**\n\t * Check all visible row checkboxes\n\t * @returns {void}\n\t */\n\tpublic check(): void {\n\t\tthis._checkbox.check();\n\t\tthis._fireEvent('checked');\n\t\tthis._dispatchEvent('checked');\n\t}\n\n\t/**\n\t * Uncheck all visible row checkboxes\n\t * @returns {void}\n\t */\n\tpublic uncheck(): void {\n\t\tthis._checkbox.uncheck();\n\t\tthis._fireEvent('unchecked');\n\t\tthis._dispatchEvent('unchecked');\n\t}\n\n\t/**\n\t * Get all checked row IDs (across all pages if preserveSelection is true)\n\t * @returns {string[]}\n\t */\n\tpublic getChecked(): string[] {\n\t\treturn this._checkbox.getChecked();\n\t}\n\n\t/**\n\t * Reapply checked state to visible checkboxes (after redraw/pagination)\n\t * @returns {void}\n\t */\n\tpublic update(): void {\n\t\tthis._checkbox.updateState();\n\t}\n\n\t// Other plugin methods can be added here\n}\n\n/**\n * NOTE: This module is now PURE. No side effects or DOM/global assignments occur on import.\n * To auto-initialize all datatables on the page, call the exported `initAllDataTables()` function explicitly in the browser.\n */\n\nexport function initAllDataTables(): void {\n\tif (typeof document !== 'undefined') {\n\t\tKTDataTable.createInstances();\n\t\t// Optionally assign to window for legacy support\n\t\twindow.KTDataTable = KTDataTable;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTUtils from '../../helpers/utils';\nimport KTComponent from '../component';\nimport { KTModalInterface, KTModalConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_MODAL_INITIALIZED: boolean;\n\t\tKTModal: typeof KTModal;\n\t}\n}\n\nexport class KTModal extends KTComponent implements KTModalInterface {\n\tprotected override _name: string = 'modal';\n\tprotected override _defaultConfig: KTModalConfigInterface = {\n\t\tzindex: '90',\n\t\tbackdrop: true,\n\t\tbackdropClass: 'kt-modal-backdrop',\n\t\tbackdropStatic: false,\n\t\tkeyboard: true,\n\t\tdisableScroll: true,\n\t\tpersistent: false,\n\t\tfocus: true,\n\t\thiddenClass: 'hidden',\n\t};\n\tprotected override _config: KTModalConfigInterface = this._defaultConfig;\n\tprotected _isOpen: boolean = false;\n\tprotected _isTransitioning: boolean = false;\n\tprotected _backdropElement: HTMLElement | null = null;\n\tprotected _targetElement: HTMLElement | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTModalConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers() {\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tconst target = event.target as HTMLElement;\n\t\t\tconst currentTarget = event.currentTarget as HTMLElement;\n\n\t\t\t// Only proceed if clicking directly on the backdrop (modal element itself)\n\t\t\t// This prevents closing when clicking inside modal content or any child elements\n\t\t\t// (including dropdowns rendered via dropdownContainer pointing to modal)\n\t\t\tif (target !== currentTarget) {\n\t\t\t\t// Stop propagation for clicks inside dropdowns to prevent dropdown from closing\n\t\t\t\t// Check if click is inside a dropdown element (KT Select dropdown)\n\t\t\t\tconst dropdownElement = target.closest('[data-kt-select-dropdown]');\n\t\t\t\tif (dropdownElement) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Only hide if both backdropStatic is false AND persistent is false\n\t\t\tif (\n\t\t\t\tthis._getOption('backdropStatic') === false &&\n\t\t\t\tKTUtils.stringToBoolean(this._getOption('persistent')) === false\n\t\t\t) {\n\t\t\t\tthis._hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _toggle(targetElement?: HTMLElement): void {\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isOpen === true) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show(targetElement);\n\t\t}\n\t}\n\n\tprotected _show(targetElement?: HTMLElement): void {\n\t\tif (this._isOpen || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (targetElement) this._targetElement = targetElement;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tKTModal.hide();\n\n\t\tif (!this._element) return;\n\t\tthis._isTransitioning = true;\n\t\tthis._element.setAttribute('role', 'dialog');\n\t\tthis._element.setAttribute('aria-modal', 'true');\n\t\tthis._element.setAttribute('tabindex', '-1');\n\n\t\tthis._setZindex();\n\t\tif (this._getOption('backdrop') === true) this._createBackdrop();\n\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = 'hidden';\n\t\t}\n\n\t\tthis._element.style.display = 'block';\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.add('open');\n\t\tthis._element.classList.remove(this._getOption('hiddenClass') as string);\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\tif (this._getOption('focus') === true) {\n\t\t\t\tthis._autoFocus();\n\t\t\t}\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(): void {\n\t\tif (!this._element) return;\n\t\tif (this._isOpen === false || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isTransitioning = true;\n\t\tthis._element.removeAttribute('role');\n\t\tthis._element.removeAttribute('aria-modal');\n\t\tthis._element.removeAttribute('tabindex');\n\t\tif (this._getOption('disableScroll')) {\n\t\t\tdocument.body.style.overflow = '';\n\t\t}\n\n\t\tKTDom.reflow(this._element);\n\t\tthis._element.classList.remove('open');\n\n\t\tif (this._getOption('backdrop') === true) {\n\t\t\tthis._deleteBackdrop();\n\t\t}\n\n\t\tKTDom.transitionEnd(this._element, () => {\n\t\t\tif (!this._element) return;\n\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\t\t\tthis._element.style.display = '';\n\t\t\tthis._element.classList.add(this._getOption('hiddenClass') as string);\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _setZindex(): void {\n\t\tlet zindex: number = parseInt(this._getOption('zindex') as string);\n\n\t\tif (parseInt(KTDom.getCssProp(this._element, 'z-index')) > zindex) {\n\t\t\tzindex = parseInt(KTDom.getCssProp(this._element, 'z-index'));\n\t\t}\n\n\t\tif (KTDom.getHighestZindex(this._element) > zindex) {\n\t\t\tzindex = KTDom.getHighestZindex(this._element) + 1;\n\t\t}\n\n\t\tthis._element.style.zIndex = String(zindex);\n\t}\n\n\tprotected _autoFocus(): void {\n\t\tif (!this._element) return;\n\t\tconst input: HTMLInputElement | null = this._element.querySelector(\n\t\t\t'[data-kt-modal-input-focus]',\n\t\t);\n\t\tif (!input) return;\n\t\telse input.focus();\n\t}\n\n\tprotected _createBackdrop(): void {\n\t\tif (!this._element) return;\n\t\tconst zindex: number = parseInt(KTDom.getCssProp(this._element, 'z-index'));\n\t\tthis._backdropElement = document.createElement('DIV');\n\t\tthis._backdropElement.setAttribute('data-kt-modal-backdrop', 'true');\n\t\tthis._backdropElement.style.zIndex = (zindex - 1).toString();\n\t\tdocument.body.append(this._backdropElement);\n\t\tKTDom.reflow(this._backdropElement);\n\t\tKTDom.addClass(\n\t\t\tthis._backdropElement,\n\t\t\tthis._getOption('backdropClass') as string,\n\t\t);\n\t}\n\n\tprotected _deleteBackdrop(): void {\n\t\tif (!this._backdropElement) return;\n\n\t\tKTDom.reflow(this._backdropElement);\n\t\tthis._backdropElement.style.opacity = '0';\n\n\t\tKTDom.transitionEnd(this._backdropElement, () => {\n\t\t\tif (!this._backdropElement) return;\n\t\t\tKTDom.remove(this._backdropElement);\n\t\t});\n\t}\n\n\tpublic toggle(targetElement?: HTMLElement): void {\n\t\treturn this._toggle(targetElement);\n\t}\n\n\tpublic show(targetElement?: HTMLElement): void {\n\t\treturn this._show(targetElement);\n\t}\n\n\tpublic hide(): void {\n\t\treturn this._hide();\n\t}\n\n\tpublic getTargetElement(): HTMLElement | null {\n\t\treturn this._targetElement;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTModal {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'modal')) {\n\t\t\treturn KTData.get(element, 'modal') as KTModal;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-modal')) {\n\t\t\treturn new KTModal(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTModalConfigInterface,\n\t): KTModal {\n\t\treturn this.getInstance(element) || new KTModal(element, config);\n\t}\n\n\tpublic static hide(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-modal-initialized]');\n\n\t\telements.forEach((element) => {\n\t\t\tconst modal = KTModal.getInstance(element as HTMLElement);\n\n\t\t\tif (modal && modal.isOpen()) {\n\t\t\t\tmodal.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleToggle(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-modal-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst selector = target.getAttribute('data-kt-modal-toggle');\n\t\t\t\tif (!selector) return;\n\n\t\t\t\tconst modalElement = document.querySelector(selector);\n\t\t\t\tconst modal = KTModal.getInstance(modalElement as HTMLElement);\n\t\t\t\tif (modal) {\n\t\t\t\t\tmodal.toggle(target);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleDismiss(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-modal-dismiss]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tconst modalElement = target.closest(\n\t\t\t\t\t'[data-kt-modal-initialized]',\n\t\t\t\t) as HTMLElement;\n\t\t\t\tif (modalElement) {\n\t\t\t\t\tconst modal = KTModal.getInstance(modalElement);\n\t\t\t\t\tif (modal) {\n\t\t\t\t\t\tmodal.hide();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleClickAway() {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tconst modalElement = document.querySelector(\n\t\t\t\t'.open[data-kt-modal-initialized]',\n\t\t\t);\n\t\t\tif (!modalElement) return;\n\n\t\t\tconst modal = KTModal.getInstance(modalElement as HTMLElement);\n\t\t\tif (!modal) return;\n\n\t\t\tif (KTUtils.stringToBoolean(modal.getOption('persistent')) === true)\n\t\t\t\treturn;\n\n\t\t\tif (KTUtils.stringToBoolean(modal.getOption('backdrop')) === true) return;\n\n\t\t\tif (\n\t\t\t\tmodalElement !== event.target &&\n\t\t\t\tmodal.getTargetElement() !== event.target &&\n\t\t\t\tmodalElement.contains(event.target as HTMLElement) === false\n\t\t\t) {\n\t\t\t\tmodal.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleKeyword() {\n\t\tdocument.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst modalElement = document.querySelector(\n\t\t\t\t'.open[data-kt-modal-initialized]',\n\t\t\t);\n\t\t\tconst modal = KTModal.getInstance(modalElement as HTMLElement);\n\t\t\tif (!modal) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// if esc key was not pressed in combination with ctrl or alt or shift\n\t\t\tif (\n\t\t\t\tevent.key === 'Escape' &&\n\t\t\t\t!(event.ctrlKey || event.altKey || event.shiftKey)\n\t\t\t) {\n\t\t\t\tmodal.hide();\n\t\t\t}\n\n\t\t\tif (event.code === 'Tab' && !event.metaKey) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-modal]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTModal(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTModal.createInstances();\n\n\t\tif (window.KT_MODAL_INITIALIZED !== true) {\n\t\t\tKTModal.handleToggle();\n\t\t\tKTModal.handleDismiss();\n\t\t\tKTModal.handleClickAway();\n\t\t\tKTModal.handleKeyword();\n\t\t\twindow.KT_MODAL_INITIALIZED = true;\n\t\t}\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTModal = KTModal;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport {\n\tInstance as PopperInstance,\n\tcreatePopper,\n\tPlacement,\n} from '@popperjs/core';\nimport KTDom from '../../helpers/dom';\nimport KTData from '../../helpers/data';\nimport KTComponent from '../component';\nimport { KTSelectConfigInterface } from './config';\nimport { FocusManager, EventManager } from './utils';\nimport { KTSelect } from './select'; // Added import\n\n/**\n * KTSelectDropdown\n *\n * A specialized dropdown implementation for the KTSelect component.\n * This module handles the dropdown functionality for the select component,\n * including positioning and showing/hiding.\n */\nexport class KTSelectDropdown extends KTComponent {\n\tprotected override readonly _name: string = 'select-dropdown';\n\tprotected override readonly _config: KTSelectConfigInterface;\n\n\t// DOM Elements\n\tprotected _element: HTMLElement;\n\tprivate _toggleElement: HTMLElement;\n\tprivate _dropdownElement: HTMLElement;\n\n\t// State\n\tprivate _isOpen: boolean = false;\n\tprivate _isTransitioning: boolean = false;\n\tprivate _popperInstance: PopperInstance | null = null;\n\tprivate _eventManager: EventManager;\n\tprivate _focusManager: FocusManager;\n\tprivate _ktSelectInstance: KTSelect; // Added instance variable\n\n\t/**\n\t * Constructor\n\t * @param element The parent element (select wrapper)\n\t * @param toggleElement The element that triggers the dropdown\n\t * @param dropdownElement The dropdown content element\n\t * @param config The configuration options\n\t */\n\tconstructor(\n\t\telement: HTMLElement,\n\t\ttoggleElement: HTMLElement,\n\t\tdropdownElement: HTMLElement,\n\t\tconfig: KTSelectConfigInterface,\n\t\tktSelectInstance: KTSelect, // Added parameter\n\t) {\n\t\tsuper();\n\n\t\tthis._element = element;\n\t\tthis._toggleElement = toggleElement;\n\t\tthis._dropdownElement = dropdownElement;\n\t\tthis._config = config;\n\t\tthis._ktSelectInstance = ktSelectInstance; // Assign instance\n\n\t\t// For centered modals, don't move dropdown to container to preserve positioning context\n\t\t// For other cases, move to container if specified\n\t\tconst modalParent = this._getModalContainer();\n\t\tconst isCenteredModal =\n\t\t\tmodalParent && modalParent.classList.contains('kt-modal-center');\n\n\t\t// Only move dropdown if not in centered modal (regardless of strategy override)\n\t\t// This prevents the positioning bug even if user sets dropdownStrategy: 'fixed'\n\t\tconst container = this._resolveDropdownContainer();\n\t\tif (container && !isCenteredModal) {\n\t\t\tif (container !== this._dropdownElement.parentElement) {\n\t\t\t\tcontainer.appendChild(this._dropdownElement);\n\t\t\t}\n\t\t}\n\n\t\tthis._eventManager = new EventManager();\n\t\tthis._focusManager = new FocusManager(\n\t\t\tdropdownElement,\n\t\t\t'[data-kt-select-option]',\n\t\t\tconfig,\n\t\t);\n\n\t\tthis._setupEventListeners();\n\t}\n\n\t/**\n\t * Set up event listeners for the dropdown\n\t */\n\tprivate _setupEventListeners(): void {\n\t\t// Toggle click\n\t\tthis._eventManager.addListener(\n\t\t\tthis._toggleElement,\n\t\t\t'click',\n\t\t\tthis._handleToggleClick.bind(this),\n\t\t);\n\n\t\t// Close on outside click\n\t\tthis._eventManager.addListener(\n\t\t\tdocument as unknown as HTMLElement,\n\t\t\t'click',\n\t\t\tthis._handleOutsideClick.bind(this),\n\t\t);\n\t}\n\n\t/**\n\t * Handle toggle element click\n\t */\n\tprivate _handleToggleClick(event: Event): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif (this._config.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Call KTSelect's methods\n\t\tif (this._ktSelectInstance.isDropdownOpen()) {\n\t\t\tthis._ktSelectInstance.closeDropdown();\n\t\t} else {\n\t\t\tthis._ktSelectInstance.openDropdown();\n\t\t}\n\t}\n\n\t/**\n\t * Handle clicks outside the dropdown\n\t */\n\tprivate _handleOutsideClick(event: MouseEvent): void {\n\t\tif (!this._isOpen) return;\n\n\t\tconst target = event.target as HTMLElement;\n\n\t\tif (\n\t\t\t!this._element.contains(target) &&\n\t\t\t!this._dropdownElement.contains(target)\n\t\t) {\n\t\t\t// Call KTSelect's closeDropdown method\n\t\t\tthis._ktSelectInstance.closeDropdown();\n\t\t}\n\t}\n\n\t/**\n\t * Set width of dropdown based on toggle element\n\t */\n\tprivate _setDropdownWidth(): void {\n\t\tif (!this._dropdownElement || !this._toggleElement) return;\n\n\t\t// Check if width is configured\n\t\tif (this._config.dropdownWidth) {\n\t\t\t// If custom width is set, use that\n\t\t\tthis._dropdownElement.style.width = this._config.dropdownWidth;\n\t\t} else {\n\t\t\t// Otherwise, match toggle element width for a cleaner appearance\n\t\t\tconst toggleWidth = this._toggleElement.offsetWidth;\n\t\t\tthis._dropdownElement.style.width = `${toggleWidth}px`;\n\t\t}\n\t}\n\n\t/**\n\t * Detect if the select is inside a modal container\n\t * @returns The modal element if found, null otherwise\n\t */\n\tprivate _getModalContainer(): HTMLElement | null {\n\t\treturn this._element.closest(\n\t\t\t'[data-kt-modal], .kt-modal, .kt-modal-center',\n\t\t) as HTMLElement | null;\n\t}\n\n\t/**\n\t * Get the appropriate boundary element for Popper positioning\n\t * For centered modals, use .kt-modal-content to avoid transform calculation issues\n\t * @returns The boundary element, or null if no modal found\n\t */\n\tprivate _getModalBoundary(): HTMLElement | null {\n\t\tconst modalParent = this._getModalContainer();\n\t\tif (!modalParent) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// For centered modals, use .kt-modal-content as boundary to avoid transform issues\n\t\tif (modalParent.classList.contains('kt-modal-center')) {\n\t\t\tconst modalContent = modalParent.querySelector(\n\t\t\t\t'.kt-modal-content',\n\t\t\t) as HTMLElement | null;\n\t\t\treturn modalContent || modalParent;\n\t\t}\n\n\t\t// For non-centered modals, use the modal element itself\n\t\treturn modalParent;\n\t}\n\n\t/**\n\t * Get the appropriate positioning strategy based on context\n\t * @returns 'fixed' if inside non-centered modal, 'absolute' for centered modals or no modal\n\t */\n\tprivate _getPositioningStrategy(): 'fixed' | 'absolute' {\n\t\t// Check if config explicitly sets strategy\n\t\tif (this._config.dropdownStrategy) {\n\t\t\treturn this._config.dropdownStrategy as 'fixed' | 'absolute';\n\t\t}\n\n\t\t// For centered modals, use absolute positioning to avoid transform calculation issues\n\t\t// For non-centered modals, use fixed positioning\n\t\tconst modalParent = this._getModalContainer();\n\t\tif (modalParent && modalParent.classList.contains('kt-modal-center')) {\n\t\t\treturn 'absolute';\n\t\t}\n\n\t\t// Use fixed positioning for non-centered modals\n\t\treturn modalParent ? 'fixed' : 'absolute';\n\t}\n\n\t/**\n\t * Initialize the Popper instance for dropdown positioning\n\t */\n\tprivate _initPopper(): void {\n\t\t// Destroy existing popper instance if it exists\n\t\tthis._destroyPopper();\n\n\t\t// Default offset\n\t\tconst offsetValue = '0, 5';\n\n\t\t// Get configuration options\n\t\tconst placement = this._config.dropdownPlacement || 'bottom-start';\n\t\tconst strategy = this._getPositioningStrategy();\n\t\tconst preventOverflow = this._config.dropdownPreventOverflow !== false;\n\t\tconst flip = this._config.dropdownFlip !== false;\n\n\t\t// Get appropriate boundary element for modal context\n\t\tconst boundary = this._getModalBoundary() || 'clippingParents';\n\n\t\t// Create new popper instance\n\t\tthis._popperInstance = createPopper(\n\t\t\tthis._toggleElement,\n\t\t\tthis._dropdownElement,\n\t\t\t{\n\t\t\t\tplacement: placement as Placement,\n\t\t\t\tstrategy: strategy,\n\t\t\t\tmodifiers: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'offset',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\toffset: this._parseOffset(offsetValue),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'preventOverflow',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tboundary: boundary,\n\t\t\t\t\t\t\taltAxis: preventOverflow,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'flip',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tenabled: flip,\n\t\t\t\t\t\t\tfallbackPlacements: ['top-start', 'bottom-end', 'top-end'],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'sameWidth',\n\t\t\t\t\t\tenabled: !this._config.dropdownWidth,\n\t\t\t\t\t\tphase: 'beforeWrite',\n\t\t\t\t\t\trequires: ['computeStyles'],\n\t\t\t\t\t\tfn: ({ state }) => {\n\t\t\t\t\t\t\tstate.styles.popper.width = `${state.rects.reference.width}px`;\n\t\t\t\t\t\t},\n\t\t\t\t\t\teffect: ({ state }) => {\n\t\t\t\t\t\t\t// Add type guard for HTMLElement\n\t\t\t\t\t\t\tconst reference = state.elements.reference as HTMLElement;\n\t\t\t\t\t\t\tif (reference && 'offsetWidth' in reference) {\n\t\t\t\t\t\t\t\tstate.elements.popper.style.width = `${reference.offsetWidth}px`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t);\n\t}\n\n\t/**\n\t * Parse offset string into an array of numbers\n\t */\n\tprivate _parseOffset(offset: string): number[] {\n\t\treturn offset.split(',').map((value) => parseInt(value.trim(), 10));\n\t}\n\n\t/**\n\t * Destroy the Popper instance\n\t */\n\tprivate _destroyPopper(): void {\n\t\tif (this._popperInstance) {\n\t\t\tthis._popperInstance.destroy();\n\t\t\tthis._popperInstance = null;\n\t\t}\n\t}\n\n\t/**\n\t * Update dropdown position\n\t */\n\tpublic updatePosition(): void {\n\t\tif (this._popperInstance) {\n\t\t\tthis._popperInstance.update();\n\t\t}\n\t}\n\n\t/**\n\t * Open the dropdown\n\t */\n\tpublic open(): void {\n\t\tif (this._config.disabled) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._isOpen || this._isTransitioning) return;\n\n\t\t// Begin opening transition\n\t\tthis._isTransitioning = true;\n\n\t\t// Set initial styles\n\t\tthis._dropdownElement.classList.remove('hidden');\n\t\tthis._dropdownElement.style.opacity = '0';\n\n\t\t// Set dropdown width\n\t\tthis._setDropdownWidth();\n\n\t\t// Reflow\n\t\tKTDom.reflow(this._dropdownElement);\n\n\t\t// Apply z-index\n\t\tlet zIndexToApply: number | null = null;\n\n\t\tif (this._config.dropdownZindex) {\n\t\t\tzIndexToApply = this._config.dropdownZindex;\n\t\t}\n\n\t\t// Consider the dropdown's current z-index if it's already set and higher\n\t\tconst currentDropdownZIndexStr = KTDom.getCssProp(\n\t\t\tthis._dropdownElement,\n\t\t\t'z-index',\n\t\t);\n\t\tif (currentDropdownZIndexStr && currentDropdownZIndexStr !== 'auto') {\n\t\t\tconst currentDropdownZIndex = parseInt(currentDropdownZIndexStr);\n\t\t\tif (\n\t\t\t\t!isNaN(currentDropdownZIndex) &&\n\t\t\t\tcurrentDropdownZIndex > (zIndexToApply || 0)\n\t\t\t) {\n\t\t\t\tzIndexToApply = currentDropdownZIndex;\n\t\t\t}\n\t\t}\n\n\t\t// Ensure dropdown is above elements within its original toggle's parent context\n\t\tconst toggleParentContextZindex = KTDom.getHighestZindex(this._element); // _element is the select wrapper\n\t\tif (\n\t\t\ttoggleParentContextZindex !== null &&\n\t\t\ttoggleParentContextZindex >= (zIndexToApply || 0)\n\t\t) {\n\t\t\tzIndexToApply = toggleParentContextZindex + 1;\n\t\t}\n\n\t\tif (zIndexToApply !== null) {\n\t\t\tthis._dropdownElement.style.zIndex = zIndexToApply.toString();\n\t\t}\n\n\t\t// Initialize popper\n\t\tthis._initPopper();\n\n\t\t// Add active classes for visual state\n\t\tthis._dropdownElement.classList.add('open');\n\t\tthis._toggleElement.classList.add('active');\n\t\t// ARIA attributes will be handled by KTSelect\n\n\t\t// Start transition\n\t\tthis._dropdownElement.style.opacity = '1';\n\n\t\t// Handle transition end\n\t\tKTDom.transitionEnd(this._dropdownElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\t\t\t// Focus and events will be handled by KTSelect\n\t\t});\n\t}\n\n\t/**\n\t * Close the dropdown\n\t */\n\tpublic close(): void {\n\t\tif (!this._isOpen || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Events and ARIA will be handled by KTSelect\n\n\t\tthis._isTransitioning = true;\n\n\t\tthis._dropdownElement.style.opacity = '0';\n\n\t\tlet transitionComplete = false;\n\t\tconst fallbackTimer = setTimeout(() => {\n\t\t\tif (!transitionComplete) {\n\t\t\t\tcompleteTransition();\n\t\t\t}\n\t\t}, 300);\n\n\t\tconst completeTransition = () => {\n\t\t\tif (transitionComplete) return;\n\t\t\ttransitionComplete = true;\n\t\t\tclearTimeout(fallbackTimer);\n\n\n\t\t\tthis._dropdownElement.classList.add('hidden');\n\t\t\tthis._dropdownElement.classList.remove('open');\n\t\t\tthis._toggleElement.classList.remove('active');\n\t\t\t// ARIA attributes will be handled by KTSelect\n\n\t\t\tthis._destroyPopper();\n\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\n\t\t\t// Events will be handled by KTSelect\n\n\t\t};\n\n\t\tKTDom.transitionEnd(this._dropdownElement, completeTransition);\n\n\t\tif (\n\t\t\tKTDom.getCssProp(this._dropdownElement, 'transition-duration') === '0s'\n\t\t) {\n\t\t\tcompleteTransition();\n\t\t}\n\t}\n\n\t/**\n\t * Check if dropdown is open\n\t */\n\tpublic isOpen(): boolean {\n\t\treturn this._isOpen;\n\t}\n\n\t/**\n\t * Clean up component\n\t */\n\tpublic override dispose(): void {\n\t\t// Destroy popper\n\t\tthis._destroyPopper();\n\n\t\t// Remove event listeners\n\t\tthis._eventManager.removeAllListeners(this._element);\n\t\tthis._eventManager.removeAllListeners(this._toggleElement);\n\t\tthis._eventManager.removeAllListeners(document as unknown as HTMLElement);\n\n\t\t// Clean up focus manager\n\t\tif (\n\t\t\tthis._focusManager &&\n\t\t\ttypeof this._focusManager.dispose === 'function'\n\t\t) {\n\t\t\tthis._focusManager.dispose();\n\t\t}\n\n\t\t// Clean up state\n\t\tthis._isOpen = false;\n\t\tthis._isTransitioning = false;\n\n\t\t// Remove data reference\n\t\tKTData.remove(this._element, this._name);\n\t}\n\n\tprivate _resolveDropdownContainer(): HTMLElement | null {\n\t\tconst containerSelector = this._config.dropdownContainer;\n\t\tif (containerSelector) {\n\t\t\tconst containerElement = document.querySelector(\n\t\t\t\tcontainerSelector,\n\t\t\t) as HTMLElement | null;\n\t\t\tif (!containerElement && this._config.debug) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`KTSelectDropdown: dropdownContainer selector \"${containerSelector}\" not found. Dropdown will remain in its default position.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn containerElement;\n\t\t}\n\t\treturn null;\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport { KTDismissInterface, KTDismissConfigInterface } from './types';\nimport { KTDismissModeType } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_DISMISS_INITIALIZED: boolean;\n\t\tKTDismiss: typeof KTDismiss;\n\t}\n}\n\nexport class KTDismiss extends KTComponent implements KTDismissInterface {\n\tprotected override _name: string = 'dismiss';\n\tprotected override _defaultConfig: KTDismissConfigInterface = {\n\t\thiddenClass: 'hidden',\n\t\tmode: 'remove',\n\t\tinterrupt: true,\n\t\ttarget: '',\n\t};\n\tprotected override _config: KTDismissConfigInterface = this._defaultConfig;\n\tprotected _isAnimating: boolean = false;\n\tprotected _targetElement: HTMLElement | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTDismissConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._config['mode'] = this._config['mode'] as KTDismissModeType;\n\n\t\tif (!this._element) return;\n\n\t\tthis._targetElement = this._getTargetElement();\n\t\tif (!this._targetElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprivate _getTargetElement(): HTMLElement | null {\n\t\treturn (\n\t\t\tKTDom.getElement(\n\t\t\t\tthis._element.getAttribute('data-kt-dismiss') as string,\n\t\t\t) || KTDom.getElement(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._element.addEventListener('click', (event: Event) => {\n\t\t\tevent.preventDefault();\n\n\t\t\tif ((this._getOption('interrupt') as boolean) === true) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\n\t\t\tthis._dismiss();\n\t\t});\n\t}\n\n\tprotected _dismiss(): void {\n\t\tif (this._isAnimating) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('dismiss', payload);\n\t\tthis._dispatchEvent('dismiss', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._targetElement) return;\n\t\tthis._targetElement.style.opacity = '0';\n\t\tKTDom.reflow(this._targetElement);\n\t\tthis._isAnimating = true;\n\n\t\tKTDom.transitionEnd(this._targetElement, () => {\n\t\t\tif (!this._targetElement) return;\n\t\t\tthis._isAnimating = false;\n\t\t\tthis._targetElement.style.opacity = '';\n\n\t\t\tif (this._getOption('mode').toString().toLowerCase() === 'hide') {\n\t\t\t\tthis._targetElement.classList.add(\n\t\t\t\t\tthis._getOption('hiddenClass') as string,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tKTDom.remove(this._targetElement);\n\t\t\t}\n\n\t\t\tthis._fireEvent('dismissed');\n\t\t\tthis._dispatchEvent('dismissed');\n\t\t});\n\t}\n\n\tpublic getTargetElement(): HTMLElement {\n\t\treturn this._targetElement;\n\t}\n\n\tpublic dismiss(): void {\n\t\tthis._dismiss();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTDismiss {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'dismiss')) {\n\t\t\treturn KTData.get(element, 'dismiss') as KTDismiss;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-dismiss')) {\n\t\t\treturn new KTDismiss(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTDismissConfigInterface,\n\t): KTDismiss {\n\t\treturn this.getInstance(element) || new KTDismiss(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-dismiss]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTDismiss(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTDismiss.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTDismiss = KTDismiss;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport {\n\tKTTogglePasswordConfigInterface,\n\tKTTogglePasswordInterface,\n} from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKTTogglePassword: typeof KTTogglePassword;\n\t}\n}\n\nexport class KTTogglePassword\n\textends KTComponent\n\timplements KTTogglePasswordInterface\n{\n\tprotected override _name: string = 'toggle-password';\n\tprotected override _defaultConfig: KTTogglePasswordConfigInterface = {\n\t\tpermanent: false,\n\t};\n\tprotected override _config: KTTogglePasswordConfigInterface =\n\t\tthis._defaultConfig;\n\tprotected _triggerElement: HTMLElement;\n\tprotected _inputElement: HTMLInputElement;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\tconfig: KTTogglePasswordConfigInterface | null = null,\n\t) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._triggerElement = this._element.querySelector(\n\t\t\t'[data-kt-toggle-password-trigger]',\n\t\t);\n\t\tthis._inputElement = this._element.querySelector('input');\n\n\t\tif (!this._triggerElement || !this._inputElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._handlers();\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._element) return;\n\n\t\tthis._triggerElement.addEventListener('click', () => {\n\t\t\tthis._toggle();\n\t\t});\n\n\t\tthis._inputElement.addEventListener('input', () => {\n\t\t\tthis._update();\n\t\t});\n\t}\n\n\tprotected _toggle(): void {\n\t\tif (!this._element) return;\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('toggle', payload);\n\t\tthis._dispatchEvent('toggle', payload);\n\t\tif (payload.cancel === true) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isVisible()) {\n\t\t\tthis._element.classList.remove('active');\n\t\t\tthis._setVisible(false);\n\t\t} else {\n\t\t\tthis._element.classList.add('active');\n\t\t\tthis._setVisible(true);\n\t\t}\n\n\t\tthis._fireEvent('toggled');\n\t\tthis._dispatchEvent('toggled');\n\t}\n\n\tprotected _update(): void {\n\t\tif (!this._element) return;\n\n\t\tif ((this._getOption('permanent') as boolean) === false) {\n\t\t\tif (this._isVisible()) {\n\t\t\t\tthis._setVisible(false);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic _isVisible(): boolean {\n\t\treturn this._inputElement.getAttribute('type') === 'text';\n\t}\n\n\tpublic _setVisible(flag: boolean) {\n\t\tif (flag) {\n\t\t\tthis._inputElement.setAttribute('type', 'text');\n\t\t} else {\n\t\t\tthis._inputElement.setAttribute('type', 'password');\n\t\t}\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic setVisible(flag: boolean): void {\n\t\tthis._setVisible(flag);\n\t}\n\n\tpublic isVisible(): boolean {\n\t\treturn this._isVisible();\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTTogglePassword {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'toggle-password')) {\n\t\t\treturn KTData.get(element, 'toggle-password') as KTTogglePassword;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-toggle-password')) {\n\t\t\treturn new KTTogglePassword(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTTogglePasswordConfigInterface,\n\t): KTTogglePassword {\n\t\treturn this.getInstance(element) || new KTTogglePassword(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-toggle-password]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTTogglePassword(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTTogglePassword.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTTogglePassword = KTTogglePassword;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTDismiss } from './dismiss';\nexport type { KTDismissConfigInterface, KTDismissInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTSelectConfigInterface } from './config';\nimport { KTSelect } from './select';\nimport { defaultTemplates } from './templates';\nimport { filterOptions, FocusManager, EventManager } from './utils';\n\nexport class KTSelectSearch {\n\tprivate _select: KTSelect;\n\tprivate _searchInput: HTMLInputElement;\n\tprivate _noResultsElement: HTMLElement | null = null;\n\tprivate _originalOptionContents = new Map<string, string>();\n\tprivate _eventManager: EventManager;\n\tprivate _focusManager: FocusManager;\n\tprivate _config: KTSelectConfigInterface;\n\n\t// Public handler for search input (made public for event binding)\n\tpublic handleSearchInput: (...args: any[]) => void;\n\n\tconstructor(select: KTSelect) {\n\t\tthis._select = select;\n\t\tthis._searchInput = select.getSearchInput();\n\t\tthis._eventManager = new EventManager();\n\t\tthis._focusManager = new FocusManager(\n\t\t\tthis._select.getDropdownElement(),\n\t\t\t'[data-kt-select-option]',\n\t\t\tselect.getConfig(),\n\t\t);\n\t\tthis.handleSearchInput = this._handleSearchInput.bind(this);\n\t\tthis._config = select.getConfig();\n\t\tthis._cacheOriginalOptionContents();\n\t}\n\n\tinit() {\n\t\tif (this._select.getConfig().enableSearch) {\n\t\t\tthis._searchInput = this._select.getSearchInput();\n\n\t\t\tif (this._searchInput) {\n\n\t\t\t\t// First remove any existing listeners to prevent duplicates\n\t\t\t\tthis._removeEventListeners();\n\n\t\t\t\t// Add the input event listener for filtering\n\t\t\t\tthis._eventManager.addListener(\n\t\t\t\t\tthis._searchInput,\n\t\t\t\t\t'input',\n\t\t\t\t\tthis.handleSearchInput,\n\t\t\t\t);\n\n\t\t\t\t// Add keydown event listener for navigation, selection, and escape\n\t\t\t\tthis._eventManager.addListener(\n\t\t\t\t\tthis._searchInput,\n\t\t\t\t\t'keydown',\n\t\t\t\t\tthis._handleSearchKeyDown.bind(this),\n\t\t\t\t);\n\n\t\t\t\t// Add blur event listener to ensure highlights are cleared when focus is lost\n\t\t\t\tthis._eventManager.addListener(this._searchInput, 'blur', () => {\n\t\t\t\t\t// Small delay to prevent race conditions with selection\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tif (!this._searchInput.value) {\n\t\t\t\t\t\t\tthis._resetAllOptions();\n\t\t\t\t\t\t\tthis.clearSearch();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 100);\n\t\t\t\t});\n\n\t\t\t\t// Listen for remote search events to coordinate with remote search functionality\n\t\t\t\tif (\n\t\t\t\t\tthis._select.getConfig().remote &&\n\t\t\t\t\tthis._select.getConfig().searchParam\n\t\t\t\t) {\n\t\t\t\t\tthis._select\n\t\t\t\t\t\t.getElement()\n\t\t\t\t\t\t.addEventListener('remoteSearchStart', () => {\n\t\t\t\t\t\t\t// Reset focused option when remote search starts\n\t\t\t\t\t\t\tthis._focusManager.resetFocus();\n\t\t\t\t\t\t});\n\n\t\t\t\t\tthis._select.getElement().addEventListener('remoteSearchEnd', () => {\n\t\t\t\t\t\t// After remote search completes, refresh our option cache\n\t\t\t\t\t\tthis.refreshOptionCache();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Listen for dropdown close to reset options - ATTACH TO WRAPPER\n\t\t\t\tthis._select\n\t\t\t\t\t.getWrapperElement()\n\t\t\t\t\t.addEventListener('dropdown.close', () => {\n\t\t\t\t\t\tthis._focusManager.resetFocus();\n\t\t\t\t\t\tconst config = this._select.getConfig();\n\n\t\t\t\t\t\t// Clear highlights from current options (always do this)\n\t\t\t\t\t\tthis.clearSearch();\n\n\t\t\t\t\t\t// Respect clearSearchOnClose config option\n\t\t\t\t\t\tif (config.clearSearchOnClose) {\n\t\t\t\t\t\t\t// Clear the search input field\n\t\t\t\t\t\t\tthis._searchInput.value = '';\n\t\t\t\t\t\t\t// Reset all options to their original state\n\t\t\t\t\t\t\tthis._resetAllOptions();\n\t\t\t\t\t\t\t// Clear any \"no results\" message\n\t\t\t\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// When clearSearchOnClose is false, preserve search text\n\t\t\t\t\t\t\t// The search input value is already preserved by KTSelect's closeDropdown method\n\t\t\t\t\t\t\t// Reset options visibility to show all (they will be re-filtered when dropdown reopens)\n\t\t\t\t\t\t\tthis._resetAllOptions();\n\t\t\t\t\t\t\t// Clear any \"no results\" message\n\t\t\t\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t\t\t\t\t// Note: The search input value is preserved, so when dropdown reopens,\n\t\t\t\t\t\t\t// the dropdown.show listener will detect it and re-filter options accordingly\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t// Clear highlights when an option is selected - ATTACH TO ORIGINAL SELECT (standard 'change' event)\n\t\t\t\tthis._select.getElement().addEventListener('change', () => {\n\t\t\t\t\tthis.clearSearch();\n\n\t\t\t\t\t// Close dropdown only for single select mode, and only if closeOnEnter is not false\n\t\t\t\t\t// Keep dropdown open for multiple select mode to allow additional selections\n\t\t\t\t\t// Also respect closeOnEnter config when it's explicitly set to false\n\t\t\t\t\tconst config = this._select.getConfig();\n\t\t\t\t\tif (!config.multiple && config.closeOnEnter !== false) {\n\t\t\t\t\t\tthis._select.closeDropdown();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Consolidated 'dropdown.show' event listener - ATTACH TO WRAPPER\n\t\t\t\tthis._select\n\t\t\t\t\t.getWrapperElement()\n\t\t\t\t\t.addEventListener('dropdown.show', () => {\n\t\t\t\t\t\tthis._focusManager.resetFocus(); // Always clear previous focus state\n\n\t\t\t\t\t\tif (this._searchInput?.value) {\n\t\t\t\t\t\t\t// If there's an existing search term:\n\t\t\t\t\t\t\t// 1. Re-filter options. This ensures the display (hidden/visible) is correct\n\t\t\t\t\t\t\t// and \"no results\" message is handled if query yields nothing.\n\t\t\t\t\t\t\tthis._filterOptions(this._searchInput.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// If search input is empty:\n\t\t\t\t\t\t\t// 1. Reset all options to their full, unfiltered, original state.\n\t\t\t\t\t\t\tthis._resetAllOptions(); // Shows all, clears highlights from options, restores original text\n\t\t\t\t\t\t\t// 2. Clear any \"no results\" message.\n\t\t\t\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Handle autofocus for the search input with retry mechanism\n\t\t\t\t\t\tif (this._select.getConfig().searchAutofocus) {\n\t\t\t\t\t\t\tthis._focusSearchInputWithRetry();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._select.updateSelectAllButtonState();\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Remove event listeners to prevent memory leaks or duplicates\n\t */\n\tprivate _removeEventListeners(): void {\n\t\tif (this._searchInput) {\n\t\t\tthis._eventManager.removeAllListeners(this._searchInput);\n\t\t}\n\t}\n\n\t/**\n\t * Focus the search input with retry mechanism for reliability\n\t * Retries up to 3 times with exponential backoff (50ms, 100ms, 200ms)\n\t */\n\tprivate _focusSearchInputWithRetry(attempt: number = 0): void {\n\t\tif (!this._searchInput) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst maxAttempts = 3;\n\t\tconst delays = [0, 50, 100, 200]; // Initial attempt + 3 retries\n\n\t\tif (attempt > maxAttempts) {\n\t\t\tif (this._config.debug) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'KTSelect: Failed to focus search input after',\n\t\t\t\t\tmaxAttempts,\n\t\t\t\t\t'attempts',\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst delay = delays[attempt] || 200;\n\t\tconst focusAttempt = () => {\n\t\t\ttry {\n\t\t\t\tthis._searchInput?.focus();\n\t\t\t\t// Check if focus was successful\n\t\t\t\tconst isFocused = document.activeElement === this._searchInput || this._searchInput === document.activeElement;\n\t\t\t\tif (isFocused) {\n\t\t\t\t\t// Focus successful\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Focus failed, retry if we haven't exceeded max attempts\n\t\t\t\tif (attempt < maxAttempts) {\n\t\t\t\t\tthis._focusSearchInputWithRetry(attempt + 1);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\t// Focus failed with error, retry if we haven't exceeded max attempts\n\t\t\t\tif (attempt < maxAttempts) {\n\t\t\t\t\tthis._focusSearchInputWithRetry(attempt + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (delay === 0) {\n\t\t\tfocusAttempt();\n\t\t} else {\n\t\t\tsetTimeout(focusAttempt, delay);\n\t\t}\n\t}\n\n\t/**\n\t * Handles keydown events on the search input for navigation and actions.\n\t */\n\tprivate _handleSearchKeyDown(event: KeyboardEvent): void {\n\t\tconst key = event.key;\n\n\t\tswitch (key) {\n\t\t\tcase ' ': // Spacebar\n\t\t\t\t// Do nothing, allow space to be typed into the input\n\t\t\t\t// Stop propagation to prevent parent handlers from processing this event\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._focusManager.focusNext();\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._focusManager.focusPrevious();\n\t\t\t\tbreak;\n\t\t\tcase 'Enter':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst firstAvailableOption = this._focusManager.focusFirst();\n\n\t\t\t\tif (firstAvailableOption) {\n\t\t\t\t\tconst optionValue = firstAvailableOption.getAttribute('data-value');\n\t\t\t\t\tif (optionValue) {\n\t\t\t\t\t\tconst config = this._select.getConfig();\n\t\t\t\t\t\tconst isAlreadySelected = !config.multiple && this._select.getSelectedOptions().includes(optionValue);\n\t\t\t\t\t\tconst shouldClose = !config.multiple && config.closeOnEnter !== false;\n\n\t\t\t\t\t\tif (isAlreadySelected && shouldClose) {\n\t\t\t\t\t\t\tthis._select.closeDropdown();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._select.toggleSelection(optionValue);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Focus display element after closing so user can press Enter again\n\t\t\t\t\t\tif (shouldClose) {\n\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\tthis._select.getDisplayElement()?.focus();\n\t\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._searchInput.value = '';\n\t\t\t\tthis.clearSearch();\n\t\t\t\tthis._resetAllOptions();\n\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t\tthis._focusManager.focusFirst();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Store original HTML content of all options for later restoration\n\t * This prevents losing formatting when clearing search\n\t */\n\tprivate _cacheOriginalOptionContents() {\n\t\t// Wait for options to be initialized\n\t\tsetTimeout(() => {\n\t\t\tthis._originalOptionContents.clear(); // Clear before re-caching\n\t\t\tconst options = Array.from(this._select.getOptionsElement());\n\t\t\toptions.forEach((option) => {\n\t\t\t\tconst value = option.getAttribute('data-value');\n\t\t\t\tif (value) {\n\t\t\t\t\t// Store the full innerHTML as the original content\n\t\t\t\t\tthis._originalOptionContents.set(value, option.innerHTML);\n\t\t\t\t}\n\t\t\t});\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Restores the innerHTML of all options from the cache if they have been modified.\n\t * This is typically called before applying new filters/highlights.\n\t */\n\tprivate _restoreOptionContentsBeforeFilter(): void {\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\t\toptions.forEach((option) => {\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value && this._originalOptionContents.has(value)) {\n\t\t\t\tconst originalContent = this._originalOptionContents.get(value)!;\n\t\t\t\t// Only restore if current content is different, to avoid unnecessary DOM manipulation\n\t\t\t\tif (option.innerHTML !== originalContent) {\n\t\t\t\t\toption.innerHTML = originalContent;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _handleSearchInput(event: Event) {\n\t\tconst query = (event.target as HTMLInputElement).value;\n\t\tconst config = this._select.getConfig();\n\n\t\t// Reset focused option when search changes\n\t\tthis._focusManager.resetFocus();\n\n\t\t// Restore original content for all options before filtering/highlighting again\n\t\tthis._restoreOptionContentsBeforeFilter();\n\n\t\tif (query.trim() === '') {\n\t\t\tthis._resetAllOptions();\n\t\t\tthis._focusManager.focusFirst(); // Focus first option when search is cleared\n\t\t\treturn;\n\t\t}\n\n\t\t// For remote search, KTSelect component handles it.\n\t\t// KTSelect will call refreshAfterSearch on this module when remote data is updated.\n\t\tif (config.remote && config.searchParam) {\n\t\t\tif (query.length < config.searchMinLength) {\n\t\t\t\tthis._resetAllOptions();\n\t\t\t\tthis._clearNoResultsMessage();\n\t\t\t\tthis._focusManager.focusFirst(); // Focus first if query too short\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// For local search\n\t\tif (query.length >= config.searchMinLength) {\n\t\t\tthis._filterOptions(query);\n\t\t\tthis._focusManager.focusFirst(); // Focus first visible option after local filtering\n\t\t} else {\n\t\t\tthis._resetAllOptions();\n\t\t\tthis._clearNoResultsMessage();\n\t\t\tthis._focusManager.focusFirst(); // Focus first if query too short and not remote\n\t\t}\n\t}\n\n\tprivate _filterOptions(query: string) {\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\t\tconst config = this._select.getConfig();\n\t\tconst dropdownElement = this._select.getDropdownElement();\n\n\t\t// Cache original option HTML if not already cached\n\t\tif (this._originalOptionContents.size === 0) {\n\t\t\tthis._cacheOriginalOptionContents();\n\t\t}\n\n\t\t// Restore original content before filtering, so highlighting is applied fresh.\n\t\tthis._restoreOptionContentsBeforeFilter();\n\n\t\tconst visibleCount = filterOptions(\n\t\t\toptions,\n\t\t\tquery,\n\t\t\tconfig,\n\t\t\tdropdownElement,\n\t\t\t(count) => this._handleNoResults(count),\n\t\t);\n\n\t\tthis._select.updateSelectAllButtonState();\n\t}\n\n\t/**\n\t * Reset all options to their original state\n\t */\n\tprivate _resetAllOptions() {\n\t\t// Show all options\n\t\tconst options = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\n\t\t// Ensure the cache is populated if it's somehow empty here\n\t\tif (this._originalOptionContents.size === 0) {\n\t\t\tthis._cacheOriginalOptionContents();\n\t\t}\n\n\t\toptions.forEach((option) => {\n\t\t\toption.classList.remove('hidden');\n\t\t\tif (option.style.display === 'none') option.style.display = ''; // Ensure visible\n\n\t\t\t// Restore original HTML content (remove highlights)\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value && this._originalOptionContents.has(value)) {\n\t\t\t\tconst originalContent = this._originalOptionContents.get(value)!;\n\t\t\t\t// Only update if different, to minimize DOM changes\n\t\t\t\tif (option.innerHTML !== originalContent) {\n\t\t\t\t\toption.innerHTML = originalContent;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis._clearNoResultsMessage(); // Ensure no results message is cleared when resetting\n\t\tthis._select.updateSelectAllButtonState();\n\t}\n\n\tprivate _handleNoResults(visibleOptionsCount: number) {\n\t\tif (visibleOptionsCount === 0 && this._searchInput?.value?.trim() !== '') {\n\t\t\tthis._showNoResultsMessage();\n\t\t} else {\n\t\t\tthis._clearNoResultsMessage();\n\t\t}\n\t}\n\n\tprivate _showNoResultsMessage() {\n\t\tthis._clearNoResultsMessage();\n\n\t\tconst config = this._select.getConfig();\n\t\tthis._noResultsElement = defaultTemplates.searchEmpty(config);\n\n\t\tconst dropdownElement = this._select.getDropdownElement();\n\t\tconst optionsContainer = dropdownElement.querySelector(\n\t\t\t'[data-kt-select-options]',\n\t\t);\n\t\tif (optionsContainer) {\n\t\t\toptionsContainer.appendChild(this._noResultsElement);\n\t\t} else {\n\t\t\tdropdownElement.appendChild(this._noResultsElement);\n\t\t}\n\t}\n\n\tprivate _clearNoResultsMessage() {\n\t\tif (this._noResultsElement && this._noResultsElement.parentNode) {\n\t\t\tthis._noResultsElement.parentNode.removeChild(this._noResultsElement);\n\t\t\tthis._noResultsElement = null;\n\t\t}\n\t}\n\n\t/**\n\t * Public method to explicitly clear all search highlights\n\t * This is called when search is reset or selection changes\n\t */\n\tpublic clearSearch() {\n\t\t// Restore original option content (removes highlighting)\n\t\tconst optionsToClear = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\n\t\t// Ensure cache is available\n\t\tif (this._originalOptionContents.size === 0 && optionsToClear.length > 0) {\n\t\t\tthis._cacheOriginalOptionContents();\n\t\t}\n\n\t\toptionsToClear.forEach((option) => {\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value && this._originalOptionContents.has(value)) {\n\t\t\t\tconst originalContent = this._originalOptionContents.get(value)!;\n\t\t\t\t// Only restore if different\n\t\t\t\tif (option.innerHTML !== originalContent) {\n\t\t\t\t\toption.innerHTML = originalContent;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * This ensures that search highlighting works correctly with new options\n\t */\n\tpublic refreshOptionCache(): void {\n\t\t// Re-cache all option contents\n\t\tthis._originalOptionContents.clear();\n\t\tconst currentOptions = Array.from(\n\t\t\tthis._select.getOptionsElement(),\n\t\t) as HTMLElement[];\n\n\t\tcurrentOptions.forEach((option) => {\n\t\t\tconst value = option.getAttribute('data-value');\n\t\t\tif (value) {\n\t\t\t\tthis._originalOptionContents.set(value, option.innerHTML);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Called after search (local or remote via KTSelect) to reset focus.\n\t */\n\tpublic refreshAfterSearch(): void {\n\t\tthis._focusManager.resetFocus();\n\t\tthis._focusManager.focusFirst();\n\t\t// Re-cache original contents as options might have changed (especially after remote search)\n\t\tthis.refreshOptionCache();\n\t}\n\n\t/**\n\t * Clean up all resources used by the search module\n\t */\n\tpublic destroy(): void {\n\t\t// Remove all event listeners\n\t\tthis._removeEventListeners();\n\n\t\t// Clear all references\n\t\tif (this._focusManager) {\n\t\t\tthis._focusManager.dispose();\n\t\t}\n\n\t\t// Clear cached content\n\t\tthis._originalOptionContents.clear();\n\n\t\t// Clear highlight elements\n\t\tthis.clearSearch();\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTComponent from '../component';\nimport {\n\tKTSelectConfigInterface,\n\tKTSelectState,\n\tKTSelectOption as KTSelectOptionData,\n} from './config';\nimport { KTSelectOption } from './option';\nimport { KTSelectRemote } from './remote';\nimport { KTSelectSearch } from './search';\nimport { defaultTemplates } from './templates';\nimport { KTSelectCombobox } from './combobox';\nimport { KTSelectDropdown } from './dropdown';\nimport {\n\tFocusManager,\n\tEventManager,\n\trenderTemplateString,\n\tTypeToSearchBuffer,\n} from './utils';\nimport { KTSelectTags } from './tags';\n\nexport class KTSelect extends KTComponent {\n\t// Core properties\n\tprotected override readonly _name: string = 'select';\n\tprotected override readonly _dataOptionPrefix: string = 'kt-'; // Use 'kt-' prefix to support data-kt-select-option attributes\n\tprotected override readonly _config: KTSelectConfigInterface;\n\tprotected override _defaultConfig: KTSelectConfigInterface;\n\n\t// Static global configuration\n\tprivate static globalConfig: Partial<KTSelectConfigInterface> = {};\n\n\t// Static registry for tracking open dropdowns (global dropdown management)\n\tprivate static openDropdowns: Set<KTSelect> = new Set();\n\n\t// DOM elements\n\tprivate _wrapperElement: HTMLElement;\n\tprivate _displayElement: HTMLElement;\n\tprivate _dropdownContentElement: HTMLElement;\n\tprivate _searchInputElement: HTMLInputElement | null;\n\tprivate _options: NodeListOf<HTMLElement>;\n\n\t// Cached DOM references for performance\n\tprivate _optionsContainer: HTMLElement | null = null;\n\n\t// State\n\tprivate _dropdownIsOpen: boolean = false;\n\tprivate _state: KTSelectState;\n\tprivate _searchModule: KTSelectSearch;\n\tprivate _remoteModule: KTSelectRemote;\n\tprivate _comboboxModule: KTSelectCombobox | null = null;\n\tprivate _tagsModule: KTSelectTags | null = null;\n\tprivate _dropdownModule: KTSelectDropdown | null = null;\n\tprivate _loadMoreIndicator: HTMLElement | null = null;\n\tprivate _selectAllButton: HTMLElement | null = null;\n\tprivate _selectAllButtonToggle: HTMLButtonElement | null = null;\n\tprivate _focusManager: FocusManager;\n\tprivate _eventManager: EventManager;\n\tprivate _typeToSearchBuffer: TypeToSearchBuffer = new TypeToSearchBuffer();\n\tprivate _mutationObserver: MutationObserver | null = null;\n\tprivate _preSelectedValues: string[] = [];\n\n\t/**\n\t * Constructor: Initializes the select component\n\t */\n\tconstructor(element: HTMLElement, config?: KTSelectConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element, this._name)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._state = new KTSelectState(this._config);\n\t\tthis._config = this._state.getConfig();\n\n\t\t(element as any).instance = this;\n\n\t\t// Initialize event manager\n\t\tthis._eventManager = new EventManager();\n\n\t\t// Initialize remote module if remote data is enabled\n\t\tif (this._config.remote) {\n\t\t\tthis._remoteModule = new KTSelectRemote(this._config, this._element);\n\t\t\tthis._initializeRemoteData();\n\t\t} else {\n\t\t\tthis._state\n\t\t\t\t.setItems()\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis._setupComponent();\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Error setting items:', error);\n\t\t\t\t\t// Handle the error, e.g., display an error message to the user\n\t\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set global select configuration options.\n\t * This allows setting default configuration that will be applied to all new KTSelect instances.\n\t * @param options Partial select config to merge with global config.\n\t * @example\n\t * KTSelect.config({\n\t * enableSearch: true,\n\t * searchPlaceholder: 'Type to search...',\n\t * dropdownZindex: 9999,\n\t * height: 300\n\t * });\n\t */\n\tstatic config(options: Partial<KTSelectConfigInterface>): void {\n\t\tthis.globalConfig = { ...this.globalConfig, ...options };\n\t}\n\n\t/**\n\t * Override _buildConfig to include static globalConfig in the merge chain\n\t */\n\tprotected override _buildConfig(config: object = {}): void {\n\t\tif (!this._element) return;\n\n\t\t// Cast to writable to allow assignment (config is readonly but needs initialization)\n\t\t(this._config as any) = {\n\t\t\t...this._defaultConfig,\n\t\t\t...KTSelect.globalConfig,\n\t\t\t...this._getGlobalConfig(),\n\t\t\t...KTDom.getDataAttributes(\n\t\t\t\tthis._element,\n\t\t\t\tthis._dataOptionPrefix + this._name,\n\t\t\t),\n\t\t\t...config,\n\t\t} as KTSelectConfigInterface;\n\t}\n\n\t/**\n\t * Override _dispatchEvent to also dispatch on document for global listeners (jQuery compatibility)\n\t */\n\tprotected override _dispatchEvent(eventType: string, payload: object = null): void {\n\t\t// Call parent method to dispatch on element (existing behavior)\n\t\tsuper._dispatchEvent(eventType, payload);\n\n\t\t// Also dispatch on document if configured\n\t\tconst dispatchGlobalEvents =\n\t\t\tthis._config.dispatchGlobalEvents !== false; // Default to true\n\t\tif (dispatchGlobalEvents) {\n\t\t\t// Create event detail structure\n\t\t\tconst eventDetail = {\n\t\t\t\tpayload,\n\t\t\t\tinstance: this, // Include component instance reference\n\t\t\t\telement: this._element, // Include element reference\n\t\t\t};\n\n\t\t\t// Dispatch non-namespaced event on document (for jQuery compatibility: $(document).on('show', ...))\n\t\t\tconst nonNamespacedEvent = new CustomEvent(eventType, {\n\t\t\t\tdetail: eventDetail,\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tcomposed: true, // Allow event to cross shadow DOM boundaries\n\t\t\t});\n\t\t\tdocument.dispatchEvent(nonNamespacedEvent);\n\n\t\t\t// Also dispatch namespaced event on document (for namespaced listeners: $(document).on('kt-select:show', ...))\n\t\t\tconst namespacedEventType = `kt-select:${eventType}`;\n\t\t\tconst namespacedEvent = new CustomEvent(namespacedEventType, {\n\t\t\t\tdetail: eventDetail,\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tcomposed: true, // Allow event to cross shadow DOM boundaries\n\t\t\t});\n\t\t\tdocument.dispatchEvent(namespacedEvent);\n\t\t}\n\t}\n\n\t/**\n\t * Initialize remote data fetching\n\t */\n\tprivate _initializeRemoteData() {\n\t\tif (!this._remoteModule || !this._config.remote) return;\n\n\n\t\t// For remote data, we need to create the HTML structure first\n\t\t// so that the component can be properly initialized\n\t\tthis._createHtmlStructure();\n\t\tthis._setupElementReferences();\n\n\t\t// Show loading state\n\t\tthis._renderLoadingState();\n\n\t\t// Fetch remote data\n\t\tthis._remoteModule\n\t\t\t.fetchData()\n\t\t\t.then((items) => {\n\n\t\t\t\t// Remove placeholder/loading options before setting new items\n\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t// Update state with fetched items\n\t\t\t\tthis._state\n\t\t\t\t\t.setItems(items)\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t// Generate options from the fetched data\n\t\t\t\t\t\tthis._generateOptionsHtml(this._element);\n\n\n\t\t\t\t\t\t// Update the dropdown to show the new options\n\t\t\t\t\t\tthis._updateDropdownWithNewOptions();\n\n\t\t\t\t\t\t// Complete the component setup with the fetched data\n\t\t\t\t\t\tthis._completeRemoteSetup();\n\n\t\t\t\t\t\t// Add pagination \"Load More\" button if needed\n\t\t\t\t\t\tif (this._config.pagination && this._remoteModule.hasMorePages()) {\n\t\t\t\t\t\t\tthis._addLoadMoreButton();\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tconsole.error('Error setting items:', error);\n\t\t\t\t\t\tthis._renderErrorState(error.message || 'Failed to load data');\n\t\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error fetching remote data:', error);\n\t\t\t\tthis._renderErrorState(\n\t\t\t\t\tthis._remoteModule.getErrorMessage() || 'Failed to load data',\n\t\t\t\t);\n\t\t\t});\n\t}\n\n\t/**\n\t * Clear existing options from the select element\n\t */\n\tprivate _clearExistingOptions() {\n\t\t// Capture pre-selected values before clearing (for remote data)\n\t\tconst selectedOptions = Array.from(\n\t\t\tthis._element.querySelectorAll('option[selected]:not([value=\"\"])'),\n\t\t) as HTMLOptionElement[];\n\n\t\tif (selectedOptions.length > 0) {\n\t\t\tthis._preSelectedValues = selectedOptions.map((opt) => opt.value);\n\t\t}\n\n\t\t// Keep only the empty/placeholder option and remove the rest\n\t\tconst options = Array.from(\n\t\t\tthis._element.querySelectorAll('option:not([value=\"\"])'),\n\t\t);\n\t\toptions.forEach((option) => option.remove());\n\t}\n\n\t/**\n\t * Unified method to render options in dropdown - eliminates code duplication\n\t */\n\tprivate _renderOptionsInDropdown(\n\t\toptionsData: KTSelectOptionData[] | HTMLOptionElement[],\n\t\tclearContainer: boolean = true,\n\t): void {\n\t\tif (!this._dropdownContentElement) return;\n\n\t\t// Use cached options container for better performance\n\t\tconst optionsContainer =\n\t\t\tthis._optionsContainer ||\n\t\t\tthis._dropdownContentElement.querySelector('[data-kt-select-options]');\n\t\tif (!optionsContainer) return;\n\n\t\t// Clear container if requested\n\t\tif (clearContainer) {\n\t\t\toptionsContainer.innerHTML = '';\n\t\t}\n\n\t\t// Use DocumentFragment for efficient DOM manipulation\n\t\tconst fragment = document.createDocumentFragment();\n\n\t\t// Process options data\n\t\toptionsData.forEach((optionData) => {\n\t\t\tlet optionElement: HTMLOptionElement;\n\n\t\t\t// Handle different input types\n\t\t\tif (optionData instanceof HTMLOptionElement) {\n\t\t\t\t// Skip empty placeholder options\n\t\t\t\tif (optionData.value === '' && optionData.textContent.trim() === '') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\toptionElement = optionData;\n\t\t\t} else {\n\t\t\t\t// Handle KTSelectOptionData objects - cast to ensure type safety\n\t\t\t\tconst dataItem = optionData as KTSelectOptionData;\n\t\t\t\toptionElement = document.createElement('option');\n\t\t\t\toptionElement.value = dataItem.id || '';\n\t\t\t\toptionElement.textContent = dataItem.title || '';\n\n\t\t\t\tif (dataItem.selected) {\n\t\t\t\t\toptionElement.setAttribute('selected', 'selected');\n\t\t\t\t}\n\t\t\t\tif (dataItem.disabled) {\n\t\t\t\t\toptionElement.setAttribute('disabled', 'disabled');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create KTSelectOption instance for proper rendering\n\t\t\tconst selectOption = new KTSelectOption(optionElement, this._config);\n\t\t\tconst renderedOption = selectOption.render();\n\n\t\t\t// Add to fragment for batch DOM operation\n\t\t\tfragment.appendChild(renderedOption);\n\t\t});\n\n\t\t// Batch append all options at once\n\t\toptionsContainer.appendChild(fragment);\n\n\t\t// Update options NodeList\n\t\tthis._options = this._dropdownContentElement.querySelectorAll(\n\t\t\t'[data-kt-select-option]',\n\t\t) as NodeListOf<HTMLElement>;\n\n\t}\n\n\t/**\n\t * Update dropdown with new options from the original select element\n\t */\n\tprivate _updateDropdownWithNewOptions() {\n\t\t// Get all options from the original select element\n\t\tconst options = Array.from(this._element.querySelectorAll('option'));\n\n\t\t// Use unified renderer\n\t\tthis._renderOptionsInDropdown(options, true);\n\t}\n\n\t/**\n\t * Complete the setup for remote data after HTML structure is created\n\t */\n\tprivate _completeRemoteSetup() {\n\t\t// Initialize options\n\t\tthis._preSelectOptions(this._element);\n\n\t\t// Prevent browser auto-selection when placeholder is configured\n\t\tif (\n\t\t\tthis._config.placeholder &&\n\t\t\tthis._state.getSelectedOptions().length === 0 &&\n\t\t\tthis._preSelectedValues.length === 0\n\t\t) {\n\t\t\t(this._element as HTMLSelectElement).value = '';\n\t\t}\n\n\t\t// Apply pre-selected values captured before remote data was loaded\n\t\tif (this._preSelectedValues.length > 0) {\n\n\t\t\t// Get all available option values from the loaded remote data\n\t\t\tconst availableValues = Array.from(\n\t\t\t\tthis._element.querySelectorAll('option'),\n\t\t\t).map((opt) => (opt as HTMLOptionElement).value);\n\n\t\t\t// Filter pre-selected values to only those that exist in remote data\n\t\t\tconst validPreSelectedValues = this._preSelectedValues.filter((value) =>\n\t\t\t\tavailableValues.includes(value),\n\t\t\t);\n\n\t\t\tif (validPreSelectedValues.length > 0) {\n\t\t\t\t// For single-select mode, only use the first value\n\t\t\t\tconst valuesToSelect = this._config.multiple\n\t\t\t\t\t? validPreSelectedValues\n\t\t\t\t\t: [validPreSelectedValues[0]];\n\n\n\t\t\t\t// Get any existing selections from _preSelectOptions (e.g., data-kt-select-pre-selected)\n\t\t\t\tconst existingSelections = this._state.getSelectedOptions();\n\n\t\t\t\t// Merge existing selections with native pre-selected values (no duplicates)\n\t\t\t\tconst allSelections = this._config.multiple\n\t\t\t\t\t? Array.from(new Set([...existingSelections, ...valuesToSelect]))\n\t\t\t\t\t: valuesToSelect;\n\n\t\t\t\t// Set all selections at once to avoid toggling issues\n\t\t\t\tthis._state.setSelectedOptions(allSelections);\n\n\t\t\t\t// Update the native select element to match\n\t\t\t\tArray.from(this._element.querySelectorAll('option')).forEach((opt) => {\n\t\t\t\t\t(opt as HTMLOptionElement).selected = allSelections.includes(\n\t\t\t\t\t\topt.value,\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\t// Update the visual display\n\t\t\t\tthis.updateSelectedOptionDisplay();\n\t\t\t\tthis._updateSelectedOptionClass();\n\t\t\t}\n\n\t\t\t// Clear the pre-selected values array after processing\n\t\t\tthis._preSelectedValues = [];\n\t\t}\n\n\t\t// Apply disabled state if needed\n\t\tthis._applyInitialDisabledState();\n\n\t\t// Initialize search if enabled\n\t\tif (this._config.enableSearch) {\n\t\t\tthis._initializeSearchModule();\n\t\t}\n\n\t\t// Initialize combobox if enabled\n\t\tif (this._config.combobox) {\n\t\t\tthis._comboboxModule = new KTSelectCombobox(this);\n\t\t}\n\n\t\t// Initialize tags if enabled\n\t\tif (this._config.tags) {\n\t\t\tthis._tagsModule = new KTSelectTags(this);\n\t\t}\n\n\t\t// Initialize focus manager after dropdown element is created\n\t\tthis._focusManager = new FocusManager(\n\t\t\tthis._dropdownContentElement,\n\t\t\t'[data-kt-select-option]',\n\t\t\tthis._config,\n\t\t);\n\n\t\t// Initialize dropdown module after all elements are created\n\t\tthis._dropdownModule = new KTSelectDropdown(\n\t\t\tthis._wrapperElement,\n\t\t\tthis._displayElement,\n\t\t\tthis._dropdownContentElement,\n\t\t\tthis._config,\n\t\t\tthis, // Pass the KTSelect instance to KTSelectDropdown\n\t\t);\n\n\t\t// Update display and set ARIA attributes\n\t\tthis._updateDisplayAndAriaAttributes();\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._setAriaAttributes();\n\n\t\t// Update select all button state\n\t\tthis.updateSelectAllButtonState();\n\n\t\t// Focus the first selected option or first option if nothing selected\n\t\tthis._focusSelectedOption();\n\n\t\t// Attach event listeners after all modules are initialized\n\t\tthis._attachEventListeners();\n\n\t\tthis._observeNativeSelect();\n\t}\n\n\t/**\n\t * Helper to show a dropdown message (error, loading, noResults)\n\t */\n\tprivate _showDropdownMessage(\n\t\ttype: 'error' | 'loading' | 'empty',\n\t\tmessage?: string,\n\t) {\n\t\tif (!this._dropdownContentElement) return;\n\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t'[data-kt-select-options]',\n\t\t);\n\t\tif (!optionsContainer) return;\n\n\t\t// Clear previous messages\n\t\toptionsContainer.innerHTML = '';\n\n\t\tswitch (type) {\n\t\t\tcase 'error':\n\t\t\t\toptionsContainer.appendChild(\n\t\t\t\t\tdefaultTemplates.error({\n\t\t\t\t\t\t...this._config,\n\t\t\t\t\t\terrorMessage: message,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'loading':\n\t\t\t\toptionsContainer.appendChild(\n\t\t\t\t\tdefaultTemplates.loading(this._config, message || 'Loading...'),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase 'empty':\n\t\t\t\toptionsContainer.appendChild(\n\t\t\t\t\tdefaultTemplates.searchEmpty(this._config),\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Render loading state in dropdown\n\t */\n\tprivate _renderLoadingState() {\n\t\tif (this._element.querySelectorAll('option').length <= 1) {\n\t\t\tconst existingLoadingOptions = this._element.querySelectorAll(\n\t\t\t\t'option[disabled][selected][value=\"\"]',\n\t\t\t);\n\t\t\texistingLoadingOptions.forEach((option) => option.remove());\n\t\t\tthis._showDropdownMessage('loading', 'Loading options...');\n\t\t}\n\t}\n\n\t/**\n\t * Render error state\n\t * @param message Error message\n\t */\n\tprivate _renderErrorState(message: string) {\n\t\t// If dropdown is already created, show error message there\n\t\tthis._showDropdownMessage('error', message);\n\n\t\tif (!this._wrapperElement) {\n\t\t\tthis._setupComponent();\n\t\t}\n\t}\n\n\t/**\n\t * Add \"Load More\" button for pagination\n\t */\n\tprivate _addLoadMoreButton() {\n\t\tif (!this._dropdownContentElement || !this._config.pagination) return;\n\n\t\t// Remove existing button if any\n\t\tif (this._loadMoreIndicator) {\n\t\t\tthis._loadMoreIndicator.remove();\n\t\t\tthis._loadMoreIndicator = null;\n\t\t}\n\n\t\t// Create load more button using template\n\t\tthis._loadMoreIndicator = defaultTemplates.loadMore(this._config);\n\n\t\t// Add to dropdown\n\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t'[data-kt-select-options]',\n\t\t);\n\t\tif (optionsContainer) {\n\t\t\toptionsContainer.appendChild(this._loadMoreIndicator);\n\t\t} else {\n\t\t\tthis._dropdownContentElement.appendChild(this._loadMoreIndicator);\n\t\t}\n\n\t\t// Add event listener\n\t\tthis._loadMoreIndicator.addEventListener(\n\t\t\t'click',\n\t\t\tthis._handleLoadMore.bind(this),\n\t\t);\n\t}\n\n\t/**\n\t * Handle load more button click\n\t */\n\tprivate _handleLoadMore() {\n\t\tif (!this._remoteModule || !this._config.pagination) return;\n\n\t\t// Show loading state\n\t\tif (this._loadMoreIndicator) {\n\t\t\tthis._loadMoreIndicator.textContent = 'Loading...';\n\t\t}\n\n\t\t// Fetch next page\n\t\tthis._remoteModule\n\t\t\t.loadNextPage()\n\t\t\t.then((newItems) => {\n\t\t\t\t// Get existing items\n\t\t\t\tconst existingItems = this._state.getItems();\n\n\t\t\t\t// Combine new items with existing items\n\t\t\t\tthis._state\n\t\t\t\t\t.setItems([...existingItems, ...newItems])\n\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t// Update options in the dropdown\n\t\t\t\t\t\tthis._updateOptionsInDropdown(newItems);\n\n\t\t\t\t\t\t// Check if there are more pages\n\t\t\t\t\t\tif (this._remoteModule.hasMorePages()) {\n\t\t\t\t\t\t\t// Reset load more button\n\t\t\t\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\t\t\t\tthis._loadMoreIndicator.textContent =\n\t\t\t\t\t\t\t\t\tthis._config.loadMoreText || 'Load more...';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Remove load more button if no more pages\n\t\t\t\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\t\t\t\tthis._loadMoreIndicator.remove();\n\t\t\t\t\t\t\t\tthis._loadMoreIndicator = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tconsole.error('Error updating items:', error);\n\n\t\t\t\t\t\t// Reset load more button\n\t\t\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\t\t\tthis._loadMoreIndicator.textContent = 'Error loading more items';\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error loading more items:', error);\n\n\t\t\t\t// Reset load more button\n\t\t\t\tif (this._loadMoreIndicator) {\n\t\t\t\t\tthis._loadMoreIndicator.textContent = 'Error loading more items';\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t/**\n\t * Update options in the dropdown\n\t * @param newItems New items to add to the dropdown\n\t */\n\tprivate _updateOptionsInDropdown(newItems: KTSelectOptionData[]) {\n\t\tif (!this._dropdownContentElement || !newItems.length) return;\n\n\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t`[data-kt-select-options]`,\n\t\t);\n\t\tif (!optionsContainer) return;\n\n\t\t// Get the load more button\n\t\tconst loadMoreButton = optionsContainer.querySelector(\n\t\t\t`[data-kt-select-load-more]`,\n\t\t);\n\n\t\t// Process each new item\n\t\tnewItems.forEach((item) => {\n\t\t\t// Create option for the original select\n\t\t\tconst selectOption = document.createElement('option');\n\t\t\tselectOption.value = item.id || '';\n\n\t\t\t// Add to dropdown container\n\t\t\tif (loadMoreButton) {\n\t\t\t\t// Insert before the load more button\n\t\t\t\toptionsContainer.insertBefore(selectOption, loadMoreButton);\n\t\t\t} else {\n\t\t\t\t// Append to the end\n\t\t\t\toptionsContainer.appendChild(selectOption);\n\t\t\t}\n\t\t});\n\n\t\t// Update options NodeList to include the new options\n\t\tthis._options = this._dropdownContentElement.querySelectorAll(\n\t\t\t`[data-kt-select-option]`,\n\t\t) as NodeListOf<HTMLElement>;\n\n\t}\n\n\t/**\n\t * ========================================================================\n\t * INITIALIZATION METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Set up the component after everything is initialized\n\t */\n\tprivate _setupComponent() {\n\t\t// Setup HTML structure\n\t\tthis._createHtmlStructure();\n\t\tthis._setupElementReferences();\n\n\t\t// Initialize options\n\t\tthis._preSelectOptions(this._element);\n\n\t\t// Prevent browser auto-selection when placeholder is configured\n\t\tif (\n\t\t\tthis._config.placeholder &&\n\t\t\tthis._state.getSelectedOptions().length === 0\n\t\t) {\n\t\t\t(this._element as HTMLSelectElement).value = '';\n\t\t}\n\n\t\t// Apply disabled state if needed\n\t\tthis._applyInitialDisabledState();\n\n\t\t// Initialize search if enabled\n\t\tif (this._config.enableSearch) {\n\t\t\tthis._initializeSearchModule();\n\t\t}\n\n\t\t// Initialize combobox if enabled\n\t\tif (this._config.combobox) {\n\t\t\tthis._comboboxModule = new KTSelectCombobox(this);\n\t\t}\n\n\t\t// Initialize tags if enabled\n\t\tif (this._config.tags) {\n\t\t\tthis._tagsModule = new KTSelectTags(this);\n\t\t}\n\n\t\t// Initialize focus manager after dropdown element is created\n\t\tthis._focusManager = new FocusManager(\n\t\t\tthis._dropdownContentElement,\n\t\t\t'[data-kt-select-option]',\n\t\t\tthis._config,\n\t\t);\n\n\t\t// Initialize dropdown module after all elements are created\n\t\tthis._dropdownModule = new KTSelectDropdown(\n\t\t\tthis._wrapperElement,\n\t\t\tthis._displayElement,\n\t\t\tthis._dropdownContentElement,\n\t\t\tthis._config,\n\t\t\tthis, // Pass the KTSelect instance to KTSelectDropdown\n\t\t);\n\n\t\t// Update display and set ARIA attributes\n\t\tthis._updateDisplayAndAriaAttributes();\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._setAriaAttributes();\n\n\t\t// Update select all button state\n\t\tthis.updateSelectAllButtonState();\n\n\t\t// Focus the first selected option or first option if nothing selected\n\t\tthis._focusSelectedOption();\n\n\t\t// Attach event listeners after all modules are initialized\n\t\tthis._attachEventListeners();\n\n\t\tthis._observeNativeSelect();\n\t}\n\n\t/**\n\t * Creates the HTML structure for the select component\n\t */\n\tprivate _createHtmlStructure() {\n\t\tconst options = Array.from(this._element.querySelectorAll('option'));\n\n\t\t// Create wrapper and display elements\n\t\tconst wrapperElement = defaultTemplates.wrapper(this._config);\n\n\t\tconst displayElement = defaultTemplates.display(this._config);\n\n\t\t// Add the display element to the wrapper\n\t\twrapperElement.appendChild(displayElement);\n\n\t\t// Move classes from original select to wrapper and display elements\n\t\tif (this._element.classList.length > 0) {\n\t\t\tconst originalClasses = Array.from(this._element.classList);\n\t\t\tconst displaySpecificClasses = [\n\t\t\t\t'kt-select',\n\t\t\t\t'kt-select-sm',\n\t\t\t\t'kt-select-lg',\n\t\t\t];\n\n\t\t\tconst classesForWrapper = originalClasses.filter(\n\t\t\t\t(className) => !displaySpecificClasses.includes(className),\n\t\t\t);\n\t\t\tif (classesForWrapper.length > 0) {\n\t\t\t\twrapperElement.classList.add(...classesForWrapper);\n\t\t\t}\n\n\t\t\t// Move display-specific classes to display element\n\t\t\tconst classesForDisplay = originalClasses.filter((className) =>\n\t\t\t\tdisplaySpecificClasses.includes(className),\n\t\t\t);\n\t\t\tif (classesForDisplay.length > 0) {\n\t\t\t\tdisplayElement.classList.add(...classesForDisplay);\n\t\t\t}\n\n\t\t\tthis._element.className = ''; // Clear classes from original select element\n\t\t}\n\n\t\t// Create an empty dropdown first (without options) using template\n\t\tconst dropdownElement = defaultTemplates.dropdown({\n\t\t\t...this._config,\n\t\t\tzindex: this._config.dropdownZindex,\n\t\t});\n\n\t\t// Add search input if needed\n\t\tif (this._config.enableSearch) {\n\t\t\tconst searchElement = defaultTemplates.search(this._config);\n\t\t\tdropdownElement.appendChild(searchElement);\n\t\t}\n\n\t\t// Add select all button if needed\n\t\tif (this._config.multiple && this._config.enableSelectAll) {\n\t\t\tconst selectAllElement = defaultTemplates.selectAll(this._config);\n\t\t\tdropdownElement.appendChild(selectAllElement);\n\t\t}\n\n\t\t// Create options container using template\n\t\tconst optionsContainer = defaultTemplates.options(this._config);\n\n\t\t// Add each option directly to the container (only if options exist)\n\t\toptions.forEach((optionElement) => {\n\t\t\t// Skip empty placeholder options (only if BOTH value AND text are empty)\n\t\t\t// This allows options with empty value but visible text to display in dropdown\n\t\t\tif (\n\t\t\t\toptionElement.value === '' &&\n\t\t\t\toptionElement.textContent.trim() === ''\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create new KTSelectOption instance for each option\n\t\t\tconst selectOption = new KTSelectOption(optionElement, this._config);\n\t\t\tconst renderedOption = selectOption.render();\n\n\t\t\t// Append directly to options container\n\t\t\toptionsContainer.appendChild(renderedOption);\n\t\t});\n\n\t\t// Add options container to dropdown\n\t\tdropdownElement.appendChild(optionsContainer);\n\n\t\t// Add dropdown to wrapper\n\t\twrapperElement.appendChild(dropdownElement);\n\n\t\t// Insert after the original element\n\t\tthis._element.after(wrapperElement);\n\t\tthis._element.classList.add('hidden');\n\t}\n\n\t/**\n\t * Setup all element references after DOM is created\n\t */\n\tprivate _setupElementReferences() {\n\t\tthis._wrapperElement = this._element.nextElementSibling as HTMLElement;\n\n\t\t// Safety check - ensure wrapper element exists\n\t\tif (!this._wrapperElement) {\n\t\t\tconsole.error(\n\t\t\t\t'KTSelect: Wrapper element not found. HTML structure may not be created properly.',\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Get display element\n\t\tthis._displayElement = this._wrapperElement.querySelector(\n\t\t\t`[data-kt-select-display]`,\n\t\t) as HTMLElement;\n\n\t\t// Get dropdown content element - this is critical for dropdown functionality\n\t\tthis._dropdownContentElement = this._wrapperElement.querySelector(\n\t\t\t`[data-kt-select-dropdown]`,\n\t\t) as HTMLElement;\n\n\t\tif (!this._dropdownContentElement) {\n\t\t\tconsole.error(\n\t\t\t\t'KTSelect: Dropdown content element not found',\n\t\t\t\tthis._wrapperElement,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Get search input element - this is used for the search functionality\n\t\t// First try to find the actual input element (not the wrapper div)\n\t\tthis._searchInputElement = this._dropdownContentElement.querySelector(\n\t\t\t`input[data-kt-select-search]`,\n\t\t) as HTMLInputElement;\n\n\t\t// If not found, try the wrapper selector (for backward compatibility)\n\t\tif (!this._searchInputElement) {\n\t\t\tconst searchWrapper = this._dropdownContentElement.querySelector(\n\t\t\t\t`[data-kt-select-search]`,\n\t\t\t) as HTMLElement;\n\t\t\tif (searchWrapper) {\n\t\t\t\tthis._searchInputElement = searchWrapper.querySelector(\n\t\t\t\t\t'input',\n\t\t\t\t) as HTMLInputElement;\n\t\t\t}\n\t\t}\n\n\t\t// If still not found in dropdown, check if it's the display element itself (combobox mode)\n\t\tif (!this._searchInputElement) {\n\t\t\tthis._searchInputElement = this._displayElement.querySelector(\n\t\t\t\t'input[data-kt-select-search]',\n\t\t\t) as HTMLInputElement;\n\t\t}\n\n\t\tthis._selectAllButton = this._wrapperElement.querySelector(\n\t\t\t'[data-kt-select-select-all]',\n\t\t) as HTMLElement;\n\n\t\t// Cache the options container for performance\n\t\tthis._optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t'[data-kt-select-options]',\n\t\t) as HTMLElement;\n\n\t\tthis._options = this._dropdownContentElement.querySelectorAll(\n\t\t\t`[data-kt-select-option]`,\n\t\t) as NodeListOf<HTMLElement>;\n\t}\n\n\t/**\n\t * Attach all event listeners to elements\n\t */\n\tprivate _attachEventListeners() {\n\t\t// Document level event listeners\n\t\tdocument.addEventListener('click', this._handleDocumentClick.bind(this));\n\n\t\t// Dropdown option click events\n\t\tthis._eventManager.addListener(\n\t\t\tthis._dropdownContentElement,\n\t\t\t'click',\n\t\t\tthis._handleDropdownOptionClick.bind(this),\n\t\t);\n\n\t\tif (this._selectAllButton) {\n\t\t\tthis._selectAllButtonToggle =\n\t\t\t\tthis._selectAllButton.querySelector('button');\n\t\t\tif (this._selectAllButtonToggle) {\n\t\t\t\tthis._eventManager.addListener(\n\t\t\t\t\tthis._selectAllButtonToggle,\n\t\t\t\t\t'click',\n\t\t\t\t\tthis._handleSelectAllClick.bind(this),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Attach centralized keyboard handler to the wrapper element.\n\t\t// Events from focusable children like _displayElement or _searchInputElement (if present) will bubble up.\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.addEventListener(\n\t\t\t\t'keydown',\n\t\t\t\tthis._handleKeyboardEvent.bind(this),\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Initialize search module if search is enabled\n\t */\n\tprivate _initializeSearchModule() {\n\t\tif (this._config.enableSearch) {\n\t\t\tthis._searchModule = new KTSelectSearch(this);\n\t\t\tthis._searchModule.init();\n\n\t\t\t// If remote search is enabled, add event listener for search input\n\t\t\tif (\n\t\t\t\tthis._config.remote &&\n\t\t\t\tthis._config.searchParam &&\n\t\t\t\tthis._searchInputElement\n\t\t\t) {\n\t\t\t\tthis._searchInputElement.addEventListener(\n\t\t\t\t\t'input',\n\t\t\t\t\tthis._handleRemoteSearch.bind(this),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Apply ARIA attributes and update display\n\t */\n\tprivate _updateDisplayAndAriaAttributes() {\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._setAriaAttributes();\n\t}\n\n\t/**\n\t * Apply initial disabled state if configured\n\t */\n\tprivate _applyInitialDisabledState() {\n\t\tif (this._config.disabled) {\n\t\t\tthis.getElement().classList.add('disabled');\n\t\t\tthis.getElement().setAttribute('disabled', 'disabled');\n\t\t\tthis._wrapperElement.classList.add('disabled');\n\t\t}\n\t}\n\n\t/**\n\t * Generate options HTML from data items\n\t */\n\tprivate _generateOptionsHtml(element: HTMLElement) {\n\t\tconst items = this._state.getItems() || [];\n\n\n\t\t// Only modify options if we have items to replace them with\n\t\tif (items && items.length > 0) {\n\t\t\t// Clear existing options except the first empty one\n\t\t\tconst options = element.querySelectorAll('option:not(:first-child)');\n\t\t\toptions.forEach((option) => option.remove());\n\n\t\t\t// Generate options from data\n\t\t\titems.forEach((item) => {\n\t\t\t\tconst optionElement = document.createElement('option');\n\n\t\t\t\t// Get value - use item.id directly if available, otherwise try dataValueField\n\t\t\t\tlet value = '';\n\t\t\t\tif (item.id !== undefined) {\n\t\t\t\t\tvalue = String(item.id);\n\t\t\t\t} else if (this._config.dataValueField) {\n\t\t\t\t\tconst extractedValue = this._getValueByKey(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tthis._config.dataValueField,\n\t\t\t\t\t);\n\t\t\t\t\tvalue = extractedValue !== null ? String(extractedValue) : '';\n\t\t\t\t}\n\n\t\t\t\t// Get label - use item.title directly if available, otherwise try dataFieldText\n\t\t\t\tlet label = '';\n\t\t\t\tif (item.title !== undefined) {\n\t\t\t\t\tlabel = String(item.title);\n\t\t\t\t} else if (this._config.dataFieldText) {\n\t\t\t\t\tconst extractedLabel = this._getValueByKey(\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tthis._config.dataFieldText,\n\t\t\t\t\t);\n\t\t\t\t\tlabel =\n\t\t\t\t\t\textractedLabel !== null ? String(extractedLabel) : 'Unnamed option';\n\t\t\t\t}\n\n\n\t\t\t\t// Set option attributes\n\t\t\t\toptionElement.value = value;\n\t\t\t\toptionElement.textContent = label || 'Unnamed option';\n\n\t\t\t\tif (item.selected) {\n\t\t\t\t\toptionElement.setAttribute('selected', 'selected');\n\t\t\t\t}\n\n\t\t\t\telement.appendChild(optionElement);\n\t\t\t});\n\n\t\t}\n\t}\n\n\t/**\n\t * Extract nested property value from object using dot notation\n\t */\n\tprivate _getValueByKey(obj: any, key: string): any {\n\t\tif (!key || !obj) return null;\n\n\t\t// Use reduce to walk through the object by splitting the key on dots\n\t\tconst result = key\n\t\t\t.split('.')\n\t\t\t.reduce((o, k) => (o && o[k] !== undefined ? o[k] : null), obj);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Pre-select options that have the selected attribute\n\t */\n\tprivate _preSelectOptions(element: HTMLElement) {\n\t\t// Handle options with selected attribute\n\t\tArray.from(element.querySelectorAll('option[selected]')).forEach(\n\t\t\t(option) => {\n\t\t\t\tconst value = (option as HTMLOptionElement).value;\n\t\t\t\tthis._selectOption(value);\n\t\t\t},\n\t\t);\n\n\t\t// Handle data-kt-select-pre-selected attribute for React compatibility\n\t\tconst preSelectedValues = element.getAttribute(\n\t\t\t'data-kt-select-pre-selected',\n\t\t);\n\t\tif (preSelectedValues) {\n\t\t\tconst values = preSelectedValues.split(',').map((v) => v.trim());\n\t\t\tvalues.forEach((value) => {\n\t\t\t\tif (value) {\n\t\t\t\t\tthis._selectOption(value);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * DROPDOWN MANAGEMENT\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Open the dropdown\n\t */\n\tpublic openDropdown() {\n\t\tif (this._config.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._dropdownModule) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Don't open dropdown if the select is disabled\n\t\tif (this._config.disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Global dropdown management: close other open dropdowns if configured\n\t\tconst closeOnOtherOpen =\n\t\t\tthis._config.closeOnOtherOpen !== false; // Default to true\n\t\tif (closeOnOtherOpen) {\n\t\t\t// Close all other open dropdowns\n\t\t\tconst otherSelectsToClose: KTSelect[] = [];\n\t\t\tKTSelect.openDropdowns.forEach((otherSelect) => {\n\t\t\t\tconst isOther = otherSelect !== this;\n\t\t\t\tconst isOpen = otherSelect._dropdownIsOpen;\n\t\t\t\tif (isOther && isOpen) {\n\t\t\t\t\totherSelectsToClose.push(otherSelect);\n\t\t\t\t}\n\t\t\t});\n\t\t\totherSelectsToClose.forEach((otherSelect) => {\n\t\t\t\totherSelect.closeDropdown();\n\t\t\t});\n\t\t}\n\n\n\t\t// Set our internal flag to match what we're doing\n\t\tthis._dropdownIsOpen = true;\n\n\t\t// Add to registry\n\t\tKTSelect.openDropdowns.add(this);\n\n\t\t// Open the dropdown via the module\n\t\tthis._dropdownModule.open();\n\n\t\t// Dispatch custom events\n\t\tthis._dispatchEvent('show');\n\t\tthis._fireEvent('show');\n\n\t\t// Dispatch dropdown.show event on wrapper for search module\n\t\tconst dropdownShowEvent = new CustomEvent('dropdown.show', {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t});\n\t\tthis._wrapperElement.dispatchEvent(dropdownShowEvent);\n\n\t\t// Update ARIA states\n\t\tthis._setAriaAttributes();\n\n\t\t// Update select all button state\n\t\tthis.updateSelectAllButtonState();\n\n\t\t// Focus the first selected option or first option if nothing selected\n\t\t// BUT: Skip this if search autofocus is enabled, as we want search input to get focus\n\t\tif (!(this._config.enableSearch && this._config.searchAutofocus)) {\n\t\t\tthis._focusSelectedOption();\n\t\t}\n\n\t\t// Dispatch dropdown.show event on the wrapper element for search module\n\t\t// Use requestAnimationFrame to ensure dropdown is visible and transition has started\n\t\trequestAnimationFrame(() => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (this._wrapperElement) {\n\t\t\t\t\tconst dropdownShowEvent = new CustomEvent('dropdown.show', {\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcancelable: true,\n\t\t\t\t\t});\n\t\t\t\t\tthis._wrapperElement.dispatchEvent(dropdownShowEvent);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Close the dropdown\n\t */\n\tpublic closeDropdown() {\n\t\t// Only check if dropdown module exists, not dropdownIsOpen flag\n\t\tif (!this._dropdownModule) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear search input if the dropdown is closing\n\t\tif (this._searchModule && this._searchInputElement) {\n\t\t\t// Clear search input if configured to do so\n\t\t\tif (this._config.clearSearchOnClose) {\n\t\t\t\tthis._searchInputElement.value = '';\n\t\t\t}\n\n\t\t\t// Clear search input when dropdown closes\n\t\t\tthis._searchModule.clearSearch();\n\t\t}\n\n\t\t// Set our internal flag to match what we're doing\n\t\tthis._dropdownIsOpen = false;\n\n\t\t// Remove from registry\n\t\tKTSelect.openDropdowns.delete(this);\n\n\t\t// Call the dropdown module's close method\n\t\tthis._dropdownModule.close();\n\n\t\t// Reset all focus states\n\t\tif (this._focusManager) {\n\t\t\tthis._focusManager.resetFocus();\n\t\t}\n\n\t\t// Dispatch custom events on the select element\n\t\tthis._dispatchEvent('close');\n\t\tthis._fireEvent('close');\n\n\t\t// Dispatch dropdown.close event on wrapper for search module\n\t\tconst dropdownCloseEvent = new CustomEvent('dropdown.close', {\n\t\t\tbubbles: true,\n\t\t\tcancelable: true,\n\t\t});\n\t\tthis._wrapperElement.dispatchEvent(dropdownCloseEvent);\n\n\t\t// Update ARIA states\n\t\tthis._setAriaAttributes();\n\t}\n\n\t/**\n\t * Update dropdown position\n\t */\n\tpublic updateDropdownPosition() {\n\t\tif (this._dropdownModule) {\n\t\t\tthis._dropdownModule.updatePosition();\n\t\t}\n\t}\n\n\t/**\n\t * Focus on the first selected option if any exists in the dropdown\n\t */\n\tprivate _focusSelectedOption() {\n\t\t// Get selected options\n\t\tconst selectedOptions = this.getSelectedOptions();\n\t\tif (selectedOptions.length === 0) return;\n\n\t\t// Iterate through selected options and focus the first one that is visible\n\t\tfor (const value of selectedOptions) {\n\t\t\tif (this._focusManager && this._focusManager.focusOptionByValue(value)) {\n\t\t\t\tbreak; // Stop after focusing the first found selected and visible option\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * SELECTION MANAGEMENT\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Select an option by value\n\t */\n\tprivate _selectOption(value: string) {\n\t\t// Prevent selection if the option is disabled (in dropdown or original select)\n\t\tif (this._isOptionDisabled(value)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get current selection state\n\t\tconst isSelected = this._state.isSelected(value);\n\n\t\t// Toggle selection in state\n\t\tif (this._config.multiple) {\n\t\t\t// Toggle in multiple mode\n\t\t\tthis._state.toggleSelectedOptions(value);\n\t\t} else {\n\t\t\t// Set as only selection in single mode\n\t\t\tthis._state.setSelectedOptions(value);\n\t\t}\n\n\t\t// Update the original select element's option selected state\n\t\tconst optionEl = Array.from(this._element.querySelectorAll('option')).find(\n\t\t\t(opt) => opt.value === value,\n\t\t) as HTMLOptionElement;\n\n\t\tif (optionEl) {\n\t\t\tif (this._config.multiple) {\n\t\t\t\t// Toggle the selection for multiple select\n\t\t\t\toptionEl.selected = !isSelected;\n\t\t\t} else {\n\t\t\t\t// Set as only selection for single select\n\t\t\t\tArray.from(this._element.querySelectorAll('option')).forEach((opt) => {\n\t\t\t\t\t(opt as HTMLOptionElement).selected = opt.value === value;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Update the visual display of selected options\n\t\tthis.updateSelectedOptionDisplay();\n\n\t\t// Update option classes without re-rendering the dropdown content\n\t\tthis._updateSelectedOptionClass();\n\n\t\t// Dispatch standard and custom change events\n\t\tthis._dispatchEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t\tthis._fireEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t}\n\n\t/**\n\t * Sync native select value attribute for FormData support\n\t */\n\tprivate _syncNativeSelectValue(): void {\n\t\tconst selectedOptions = this.getSelectedOptions();\n\n\t\tif (this._config.multiple) {\n\t\t\t// For multiple select, the selected options are marked via option.selected\n\t\t\t// The native select's value property will return the first selected option's value\n\t\t\t// FormData will include all selected values automatically\n\t\t} else {\n\t\t\t// For single select, set the value attribute explicitly\n\t\t\tconst selectedValue =\n\t\t\t\tselectedOptions.length > 0 ? selectedOptions[0] : '';\n\t\t\t(this._element as HTMLSelectElement).value = selectedValue;\n\t\t}\n\t}\n\n\t/**\n\t * Update selected option display value\n\t */\n\tpublic updateSelectedOptionDisplay() {\n\t\tconst selectedOptions = this.getSelectedOptions();\n\t\tconst tagsEnabled = this._config.tags && this._tagsModule;\n\t\tconst valueDisplayEl = this.getValueDisplayElement();\n\n\t\t// Sync native select value for FormData support\n\t\tthis._syncNativeSelectValue();\n\n\t\tif (tagsEnabled) {\n\t\t\t// Tags module will render tags if selectedOptions > 0, or clear them if selectedOptions === 0.\n\t\t\tthis._tagsModule.updateTagsDisplay(selectedOptions);\n\t\t}\n\n\t\t// Guard against valueDisplayEl being null due to template modifications\n\t\tif (!valueDisplayEl) {\n\t\t\tif (this._config.debug) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'KTSelect: Value display element is null. Cannot update display or placeholder. Check template for [data-kt-select-value].',\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn; // Nothing to display on if the element is missing\n\t\t}\n\n\t\tif (typeof this._config.renderSelected === 'function') {\n\t\t\tvalueDisplayEl.innerHTML = this._config.renderSelected(selectedOptions);\n\t\t} else {\n\t\t\tif (selectedOptions.length === 0) {\n\t\t\t\t// No options selected: display placeholder.\n\t\t\t\t// This runs if tags are off, OR if tags are on but no items are selected (tags module would have cleared tags).\n\t\t\t\tconst placeholderEl = defaultTemplates.placeholder(this._config);\n\t\t\t\tvalueDisplayEl.replaceChildren(placeholderEl);\n\t\t\t} else {\n\t\t\t\t// Options are selected.\n\t\t\t\tif (tagsEnabled) {\n\t\t\t\t\t// Tags are enabled AND options are selected: tags module has rendered them.\n\t\t\t\t\t// Completely clear all content to avoid redundancy with tags\n\t\t\t\t\t// Don't touch the innerHTML here as tags module manages it\n\t\t\t\t\t// Just ensure no text content is generated\n\t\t\t\t\treturn; // Exit early to prevent any text generation\n\t\t\t\t} else {\n\t\t\t\t\t// Tags are not enabled AND options are selected: render normal text display.\n\t\t\t\t\t// Wrap content in .kt-select-option-text so long text truncates in single-select (see Asana #1212821478465094).\n\t\t\t\t\tconst wrapper = document.createElement('div');\n\t\t\t\t\twrapper.className = 'kt-select-option-text';\n\t\t\t\t\twrapper.setAttribute('data-kt-text-container', 'true');\n\t\t\t\t\tif (this._config.displayTemplate) {\n\t\t\t\t\t\twrapper.innerHTML = this.renderDisplayTemplateForSelected(\n\t\t\t\t\t\t\tthis.getSelectedOptions(),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\twrapper.textContent = this.getSelectedOptionsText();\n\t\t\t\t\t}\n\t\t\t\t\tvalueDisplayEl.replaceChildren(wrapper);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check if an option was originally disabled in the HTML\n\t */\n\tprivate _isOptionOriginallyDisabled(value: string): boolean {\n\t\tconst originalOption = Array.from(\n\t\t\tthis._element.querySelectorAll('option'),\n\t\t).find((opt) => opt.value === value) as HTMLOptionElement;\n\t\treturn originalOption ? originalOption.disabled : false;\n\t}\n\n\t/**\n\t * Update CSS classes for selected options\n\t */\n\tprivate _updateSelectedOptionClass(): void {\n\t\tconst allOptions = this._dropdownContentElement.querySelectorAll(\n\t\t\t`[data-kt-select-option]`,\n\t\t);\n\t\tconst selectedValues = this._state.getSelectedOptions();\n\t\tconst maxReached =\n\t\t\ttypeof this._config.maxSelections === 'number' &&\n\t\t\tselectedValues.length >= this._config.maxSelections;\n\n\n\t\tallOptions.forEach((option) => {\n\t\t\tconst optionValue = option.getAttribute('data-value');\n\t\t\tif (!optionValue) return;\n\n\t\t\tconst isSelected = selectedValues.includes(optionValue);\n\t\t\tconst isOriginallyDisabled =\n\t\t\t\tthis._isOptionOriginallyDisabled(optionValue);\n\n\t\t\tif (isSelected) {\n\t\t\t\toption.classList.add('selected');\n\t\t\t\toption.setAttribute('aria-selected', 'true');\n\t\t\t\t// Selected options should not be visually hidden or disabled by maxSelections logic\n\t\t\t\toption.classList.remove('hidden');\n\t\t\t\toption.classList.remove('disabled');\n\t\t\t\toption.removeAttribute('aria-disabled');\n\t\t\t} else {\n\t\t\t\toption.classList.remove('selected');\n\t\t\t\toption.setAttribute('aria-selected', 'false');\n\n\t\t\t\t// An option should be disabled if it was originally disabled OR if maxSelections is reached\n\t\t\t\tif (isOriginallyDisabled || maxReached) {\n\t\t\t\t\toption.classList.add('disabled');\n\t\t\t\t\toption.setAttribute('aria-disabled', 'true');\n\t\t\t\t} else {\n\t\t\t\t\toption.classList.remove('disabled');\n\t\t\t\t\toption.removeAttribute('aria-disabled');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Clear all selected options\n\t */\n\tpublic clearSelection() {\n\t\t// Clear the current selection\n\t\tthis._state.setSelectedOptions([]);\n\n\t\t// Clear all native select options\n\t\tArray.from(this._element.querySelectorAll('option')).forEach((opt) => {\n\t\t\t(opt as HTMLOptionElement).selected = false;\n\t\t});\n\n\t\t// Clear native select value\n\t\t(this._element as HTMLSelectElement).value = '';\n\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._updateSelectedOptionClass();\n\n\t\t// Update select all button state\n\t\tthis.updateSelectAllButtonState();\n\n\t\t// Dispatch change event\n\t\tthis._dispatchEvent('change');\n\t\tthis._fireEvent('change');\n\t}\n\n\t/**\n\t * Deselect a specific option by value\n\t * @param value The value of the option to deselect\n\t * @public\n\t */\n\tpublic deselectOption(value: string): void {\n\t\t// Check if the option is currently selected\n\t\tif (!this._state.isSelected(value)) {\n\t\t\treturn; // Already deselected\n\t\t}\n\n\t\t// For single-select mode, check if clearing is allowed\n\t\tif (!this._config.multiple && !this._config.allowClear) {\n\t\t\treturn; // Cannot deselect in single-select mode unless allowClear is true\n\t\t}\n\n\t\t// Remove from selected options\n\t\tif (this._config.multiple) {\n\t\t\t// For multiple select, just toggle it off\n\t\t\tthis._state.toggleSelectedOptions(value);\n\t\t} else {\n\t\t\t// For single select, clear all selections\n\t\t\tthis._state.setSelectedOptions([]);\n\t\t}\n\n\t\t// Update the native select element\n\t\tconst optionEl = Array.from(this._element.querySelectorAll('option')).find(\n\t\t\t(opt) => opt.value === value,\n\t\t) as HTMLOptionElement;\n\n\t\tif (optionEl) {\n\t\t\toptionEl.selected = false;\n\t\t}\n\n\t\t// For single select, clear the native select value\n\t\tif (!this._config.multiple) {\n\t\t\t(this._element as HTMLSelectElement).value = '';\n\t\t}\n\n\t\t// Update the display\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._updateSelectedOptionClass();\n\n\t\t// Update select all button state\n\t\tthis.updateSelectAllButtonState();\n\n\t\t// Dispatch change event\n\t\tthis._dispatchEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: false,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t\tthis._fireEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: false,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t}\n\n\t/**\n\t * Set selected options programmatically\n\t */\n\tpublic setSelectedOptions(options: HTMLOptionElement[]) {\n\t\tconst values = Array.from(options).map((option) => option.value);\n\t\tthis._state.setSelectedOptions(values);\n\t}\n\n\t/**\n\t * Select the currently focused option\n\t */\n\tpublic selectFocusedOption() {\n\t\tconst focusedOption = this._focusManager.getFocusedOption();\n\n\t\tif (focusedOption) {\n\t\t\tconst selectedValue = focusedOption.dataset.value;\n\n\t\t\t// Extract just the title text, not including description\n\t\t\tlet selectedText = '';\n\t\t\tconst titleElement = focusedOption.querySelector(\n\t\t\t\t'[data-kt-option-title]',\n\t\t\t);\n\t\t\tif (titleElement) {\n\t\t\t\t// If it has a structured content with title element\n\t\t\t\tselectedText = titleElement.textContent?.trim() || '';\n\t\t\t} else {\n\t\t\t\t// Fallback to the whole text content\n\t\t\t\tselectedText = focusedOption.textContent?.trim() || '';\n\t\t\t}\n\n\t\t\t// First trigger the selection to ensure state is updated properly\n\t\t\tif (selectedValue) {\n\t\t\t\tthis._selectOption(selectedValue);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * EVENT HANDLERS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Handle click within the dropdown\n\t */\n\tprivate _handleDropdownOptionClick(event: Event) {\n\t\tconst optionElement = (event.target as HTMLElement).closest(\n\t\t\t`[data-kt-select-option]`,\n\t\t);\n\n\t\t// If an option is clicked, handle the option click\n\t\tif (optionElement) {\n\t\t\tthis._handleOptionClick(event);\n\t\t}\n\t}\n\n\t/**\n\t * Handle clicking on an option in the dropdown\n\t */\n\tprivate _handleOptionClick(event: Event) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\t// Find the clicked option element\n\t\tconst clickedOption = (event.target as HTMLElement).closest(\n\t\t\t`[data-kt-select-option]`,\n\t\t) as HTMLElement;\n\n\t\tif (!clickedOption) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if the option is disabled\n\t\tif (clickedOption.getAttribute('aria-disabled') === 'true') {\n\t\t\treturn;\n\t\t}\n\n\t\t// Use dataset.value to get the option value\n\t\tconst optionValue = clickedOption.dataset.value;\n\t\tif (optionValue === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If in single-select mode and the clicked option is already selected, just close the dropdown.\n\t\tif (!this._config.multiple && this._state.isSelected(optionValue)) {\n\t\t\tthis.closeDropdown();\n\t\t\treturn;\n\t\t}\n\n\t\t// Use toggleSelection instead of _selectOption to prevent re-rendering\n\t\tthis.toggleSelection(optionValue);\n\t}\n\n\t/**\n\t * Handle document click for closing dropdown\n\t */\n\tprivate _handleDocumentClick(event: MouseEvent) {\n\t\tconst targetElement = event.target as HTMLElement;\n\t\t// Check if the click is outside the dropdown and the display element\n\t\tif (!this._wrapperElement.contains(targetElement)) {\n\t\t\tthis.closeDropdown();\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * ACCESSIBILITY METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Set ARIA attributes for accessibility\n\t */\n\tprivate _setAriaAttributes() {\n\t\tthis._displayElement.setAttribute(\n\t\t\t'aria-expanded',\n\t\t\tthis._dropdownIsOpen.toString(),\n\t\t);\n\t}\n\n\t/**\n\t * ========================================================================\n\t * PUBLIC API\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Get the search input element\n\t */\n\tpublic getSearchInput(): HTMLInputElement {\n\t\treturn this._searchInputElement;\n\t}\n\n\t/**\n\t * Get selected options\n\t */\n\tpublic getSelectedOptions() {\n\t\treturn this._state.getSelectedOptions();\n\t}\n\n\t/**\n\t * Get configuration\n\t */\n\tpublic getConfig(): KTSelectConfigInterface {\n\t\treturn this._config;\n\t}\n\n\t/**\n\t * Get option elements\n\t */\n\tpublic getOptionsElement(): NodeListOf<HTMLElement> {\n\t\treturn this._options;\n\t}\n\n\t/**\n\t * Get dropdown element\n\t */\n\tpublic getDropdownElement() {\n\t\treturn this._dropdownContentElement;\n\t}\n\n\t/**\n\t * Get value display element\n\t */\n\tpublic getValueDisplayElement() {\n\t\treturn this._displayElement;\n\t}\n\n\t/**\n\t * Get wrapper element\n\t */\n\tpublic getWrapperElement(): HTMLElement {\n\t\treturn this._wrapperElement;\n\t}\n\n\t/**\n\t * Show all options in the dropdown\n\t */\n\tpublic showAllOptions() {\n\t\t// Get all options in the dropdown\n\t\tconst options = Array.from(\n\t\t\tthis._dropdownContentElement.querySelectorAll(`[data-kt-select-option]`),\n\t\t);\n\n\t\t// Show all options by removing the hidden class and any inline styles\n\t\toptions.forEach((option) => {\n\t\t\t// Remove hidden class\n\t\t\toption.classList.remove('hidden');\n\n\t\t\t// Clean up any existing inline styles for backward compatibility\n\t\t\tif (option.hasAttribute('style')) {\n\t\t\t\tconst styleAttr = option.getAttribute('style');\n\n\t\t\t\tif (styleAttr.includes('display:')) {\n\t\t\t\t\t// If style only contains display property, remove the entire attribute\n\t\t\t\t\tif (\n\t\t\t\t\t\tstyleAttr.trim() === 'display: none;' ||\n\t\t\t\t\t\tstyleAttr.trim() === 'display: block;'\n\t\t\t\t\t) {\n\t\t\t\t\t\toption.removeAttribute('style');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Otherwise, remove just the display property\n\t\t\t\t\t\toption.setAttribute(\n\t\t\t\t\t\t\t'style',\n\t\t\t\t\t\t\tstyleAttr?.replace(/display:\\s*[^;]+;?/gi, '')?.trim(),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// If search input exists, clear it\n\t\tif (this._searchInputElement) {\n\t\t\tthis._searchInputElement.value = '';\n\t\t\t// If we have a search module, clear any search filtering\n\t\t\tif (this._searchModule) {\n\t\t\t\tthis._searchModule.clearSearch();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Toggle multi-select functionality\n\t */\n\tpublic enableMultiSelect() {\n\t\tthis._state.modifyConfig({ multiple: true });\n\t}\n\n\t/**\n\t * Disable multi-select functionality\n\t */\n\tpublic disableMultiSelect() {\n\t\tthis._state.modifyConfig({ multiple: false });\n\t}\n\n\t/**\n\t * Toggle the selection of an option\n\t */\n\tpublic toggleSelection(value: string): void {\n\t\t// Prevent selection if the option is disabled (in dropdown or original select)\n\t\tif (this._isOptionDisabled(value)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get current selection state\n\t\tconst isSelected = this._state.isSelected(value);\n\n\t\t// If already selected in single select mode, allow deselecting only if allowClear is true\n\t\tif (isSelected && !this._config.multiple) {\n\t\t\tif (this._config.allowClear) {\n\t\t\t\t// Use the deselectOption method to handle clearing\n\t\t\t\tthis.deselectOption(value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn; // Can't deselect in single select mode when allowClear is false\n\t\t}\n\n\t\t// Ensure any search input is cleared when selection changes\n\t\tif (this._searchModule) {\n\t\t\tthis._searchModule.clearSearch();\n\t\t}\n\n\t\t// Toggle the selection in the state\n\t\tthis._state.toggleSelectedOptions(value);\n\n\t\t// Update the original select element's option selected state\n\t\tconst optionEl = Array.from(this._element.querySelectorAll('option')).find(\n\t\t\t(opt) => opt.value === value,\n\t\t) as HTMLOptionElement;\n\n\t\tif (optionEl) {\n\t\t\t// For multiple select, toggle the 'selected' attribute\n\t\t\tif (this._config.multiple) {\n\t\t\t\toptionEl.selected = !isSelected;\n\t\t\t} else {\n\t\t\t\t// For single select, deselect all other options and select this one\n\t\t\t\tArray.from(this._element.querySelectorAll('option')).forEach((opt) => {\n\t\t\t\t\t(opt as HTMLOptionElement).selected = opt.value === value;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Update the display element value\n\t\tthis.updateSelectedOptionDisplay();\n\n\t\t// Update option classes without re-rendering the dropdown content\n\t\tthis._updateSelectedOptionClass();\n\n\t\t// For single select mode, close the dropdown after selection unless closeOnEnter is false\n\t\t// For multiple select mode, keep the dropdown open to allow multiple selections\n\t\tif (!this._config.multiple) {\n\t\t\t// Check if we should close based on closeOnEnter config\n\t\t\t// closeOnEnter only applies to Enter key selections, but for backward compatibility,\n\t\t\t// we'll respect it for all selections when explicitly set to false\n\t\t\tconst shouldClose =\n\t\t\t\tthis._config.closeOnEnter !== false; // Default to true\n\t\t\tif (shouldClose) {\n\t\t\t\tthis.closeDropdown();\n\t\t\t} else {\n\t\t\t\tthis.updateSelectAllButtonState();\n\t\t\t}\n\t\t} else {\n\t\t\t// Don't close dropdown in multiple select mode to allow multiple selections\n\t\t\tthis.updateSelectAllButtonState();\n\t\t}\n\n\t\t// Dispatch custom change event with additional data\n\t\tthis._dispatchEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t\tthis._fireEvent('change', {\n\t\t\tvalue: value,\n\t\t\tselected: !isSelected,\n\t\t\tselectedOptions: this.getSelectedOptions(),\n\t\t});\n\t}\n\n\t/**\n\t * Clean up all resources when the component is destroyed\n\t * This overrides the parent dispose method\n\t */\n\tpublic override dispose(): void {\n\t\t// Clean up event listeners\n\t\tthis._eventManager.removeAllListeners(null);\n\n\t\t// Dispose modules\n\t\tif (this._dropdownModule) {\n\t\t\tthis._dropdownModule.dispose();\n\t\t}\n\n\t\tif (this._comboboxModule) {\n\t\t\tif (typeof this._comboboxModule.destroy === 'function') {\n\t\t\t\tthis._comboboxModule.destroy();\n\t\t\t}\n\t\t}\n\n\t\tif (this._tagsModule) {\n\t\t\tif (typeof this._tagsModule.destroy === 'function') {\n\t\t\t\tthis._tagsModule.destroy();\n\t\t\t}\n\t\t}\n\n\t\tif (this._searchModule) {\n\t\t\tif (typeof this._searchModule.destroy === 'function') {\n\t\t\t\tthis._searchModule.destroy();\n\t\t\t}\n\t\t}\n\n\t\t// Remove DOM elements\n\t\tif (this._wrapperElement && this._wrapperElement.parentNode) {\n\t\t\tthis._wrapperElement.parentNode.removeChild(this._wrapperElement);\n\t\t}\n\n\t\t// Call parent dispose to clean up data\n\t\tsuper.dispose();\n\t}\n\n\t/**\n\t * ========================================================================\n\t * DYNAMIC CONTROL METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Programmatically enable the select component\n\t * @public\n\t */\n\tpublic enable(): void {\n\t\t// Update config state\n\t\tthis._config.disabled = false;\n\n\t\t// Remove disabled attribute from native select\n\t\tthis._element.removeAttribute('disabled');\n\t\tthis._element.classList.remove('disabled');\n\n\t\t// Remove disabled state from wrapper and display elements\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.classList.remove('disabled');\n\t\t}\n\n\t\tif (this._displayElement) {\n\t\t\tthis._displayElement.removeAttribute('aria-disabled');\n\t\t}\n\n\t\t// Dispatch enabled event\n\t\tthis._dispatchEvent('enabled');\n\t\tthis._fireEvent('enabled');\n\t}\n\n\t/**\n\t * Programmatically disable the select component\n\t * @public\n\t */\n\tpublic disable(): void {\n\t\t// Update config state\n\t\tthis._config.disabled = true;\n\n\t\t// Close dropdown if currently open\n\t\tif (this._dropdownIsOpen) {\n\t\t\tthis.closeDropdown();\n\t\t}\n\n\t\t// Add disabled attribute to native select\n\t\tthis._element.setAttribute('disabled', 'disabled');\n\t\tthis._element.classList.add('disabled');\n\n\t\t// Add disabled state to wrapper and display elements\n\t\tif (this._wrapperElement) {\n\t\t\tthis._wrapperElement.classList.add('disabled');\n\t\t}\n\n\t\tif (this._displayElement) {\n\t\t\tthis._displayElement.setAttribute('aria-disabled', 'true');\n\t\t}\n\n\t\t// Dispatch disabled event\n\t\tthis._dispatchEvent('disabled');\n\t\tthis._fireEvent('disabled');\n\t}\n\n\t/**\n\t * Update the dropdown to sync with native select element changes\n\t * For remote selects, refetches data from the server and preserves selections\n\t * Optionally accepts new options to replace existing ones (static selects only)\n\t *\n\t * @param newOptions Optional array of new options [{value, text}, ...] (static selects only)\n\t * @public\n\t * @remarks\n\t * - For static selects: rebuilds dropdown from native select or new options\n\t * - For remote selects: fetches fresh data, preserves matching selections\n\t * - Selections are preserved if their values exist in new remote data\n\t * - Selections are cleared if their values don't exist in new data\n\t * @fires updated - After update completes successfully\n\t * @fires updateError - If remote data fetch fails\n\t */\n\tpublic update(newOptions?: Array<{ value: string; text: string }>): void {\n\t\t// For remote selects, refetch data\n\t\tif (this._config.remote && this._remoteModule) {\n\t\t\tthis._remoteModule\n\t\t\t\t.fetchData()\n\t\t\t\t.then((items) => {\n\t\t\t\t\t// Capture currently selected values before clearing\n\t\t\t\t\tconst currentlySelected = this._state.getSelectedOptions();\n\n\t\t\t\t\t// Clear existing options (also captures to _preSelectedValues)\n\t\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t\t// Get all available values from new remote data\n\t\t\t\t\tconst availableValues = items.map((item) => item.id);\n\n\t\t\t\t\t// Filter to only values that exist in new data\n\t\t\t\t\tconst validSelections = currentlySelected.filter((value) =>\n\t\t\t\t\t\tavailableValues.includes(value),\n\t\t\t\t\t);\n\n\n\t\t\t\t\t// Add new options from remote data and restore selection state\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\t\toption.value = item.id;\n\t\t\t\t\t\toption.textContent = item.title;\n\t\t\t\t\t\tif (item.disabled) option.disabled = true;\n\n\t\t\t\t\t\t// Restore selected attribute for preserved selections\n\t\t\t\t\t\tif (validSelections.includes(item.id)) {\n\t\t\t\t\t\t\toption.selected = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._element.appendChild(option);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Rebuild dropdown\n\t\t\t\t\tthis._rebuildOptionsFromNative();\n\n\t\t\t\t\t// Sync selection state from native select (now has selected attributes)\n\t\t\t\t\tthis._syncSelectionFromNative();\n\n\t\t\t\t\t// Dispatch updated event\n\t\t\t\t\tthis._dispatchEvent('updated');\n\t\t\t\t\tthis._fireEvent('updated');\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Error updating remote data:', error);\n\t\t\t\t\tthis._dispatchEvent('updateError');\n\t\t\t\t\tthis._fireEvent('updateError');\n\t\t\t\t});\n\t\t} else {\n\t\t\t// For static selects, handle new options\n\t\t\tif (newOptions) {\n\t\t\t\t// Clear existing options except placeholder\n\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t// Add new options to native select\n\t\t\t\tnewOptions.forEach((opt) => {\n\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\toption.value = opt.value;\n\t\t\t\t\toption.textContent = opt.text;\n\t\t\t\t\tthis._element.appendChild(option);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Rebuild dropdown from native select\n\t\t\tthis._rebuildOptionsFromNative();\n\n\t\t\t// Dispatch updated event\n\t\t\tthis._dispatchEvent('updated');\n\t\t\tthis._fireEvent('updated');\n\t\t}\n\t}\n\n\t/**\n\t * Reload remote data and rebuild the dropdown\n\t * Only works with remote data enabled\n\t * @returns Promise that resolves when reload completes\n\t * @public\n\t */\n\tpublic reload(): Promise<void> {\n\t\t// Guard clause: only works with remote data\n\t\tif (!this._config.remote || !this._remoteModule) {\n\t\t\tconsole.warn('reload() only works with remote data enabled');\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\t// Dispatch reload start event\n\t\tthis._dispatchEvent('reloadStart');\n\t\tthis._fireEvent('reloadStart');\n\n\t\t// Capture currently selected values before clearing\n\t\tconst currentlySelected = this._state.getSelectedOptions();\n\n\t\t// Fetch fresh remote data\n\t\treturn this._remoteModule\n\t\t\t.fetchData()\n\t\t\t.then((items) => {\n\t\t\t\t// Clear existing options (captures to _preSelectedValues)\n\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t// Update state with new items\n\t\t\t\treturn this._state.setItems(items).then(() => {\n\t\t\t\t\t// Generate new options HTML\n\t\t\t\t\tthis._generateOptionsHtml(this._element);\n\n\t\t\t\t\t// Preserve selections by marking matching options as selected\n\t\t\t\t\tconst availableValues = items.map((item) =>\n\t\t\t\t\t\titem.id !== undefined ? String(item.id) : '',\n\t\t\t\t\t);\n\t\t\t\t\tconst validSelections = currentlySelected.filter((value) =>\n\t\t\t\t\t\tavailableValues.includes(value),\n\t\t\t\t\t);\n\n\n\t\t\t\t\t// Mark preserved selections on new options\n\t\t\t\t\tvalidSelections.forEach((value) => {\n\t\t\t\t\t\tconst option = Array.from(\n\t\t\t\t\t\t\tthis._element.querySelectorAll('option'),\n\t\t\t\t\t\t).find((opt) => opt.value === value) as HTMLOptionElement;\n\t\t\t\t\t\tif (option) {\n\t\t\t\t\t\t\toption.selected = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Update the dropdown\n\t\t\t\t\tthis._updateDropdownWithNewOptions();\n\n\t\t\t\t\t// Sync selection state from native select (now has selected attributes)\n\t\t\t\t\tthis._syncSelectionFromNative();\n\n\t\t\t\t\t// Update visual display\n\t\t\t\t\tthis.updateSelectedOptionDisplay();\n\t\t\t\t\tthis._updateSelectedOptionClass();\n\n\t\t\t\t\t// Update select all button state if applicable\n\t\t\t\t\tif (this._config.multiple && this._config.enableSelectAll) {\n\t\t\t\t\t\tthis.updateSelectAllButtonState();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Dispatch reload complete event\n\t\t\t\t\tthis._dispatchEvent('reloadComplete');\n\t\t\t\t\tthis._fireEvent('reloadComplete');\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error reloading remote data:', error);\n\n\t\t\t\t// Dispatch reload error event with error details\n\t\t\t\tthis._dispatchEvent('reloadError', { error });\n\t\t\t\tthis._fireEvent('reloadError', { error });\n\n\t\t\t\t// Re-throw error so caller can handle it\n\t\t\t\tthrow error;\n\t\t\t});\n\t}\n\n\t/**\n\t * Refresh the visual display and state without rebuilding options\n\t * For remote selects, refetches data from the server and preserves selections\n\t * that exist in the newly fetched data\n\t *\n\t * @public\n\t * @remarks\n\t * - For static selects: syncs visual state with native select\n\t * - For remote selects: fetches fresh data, preserves matching selections\n\t * - Selections are preserved if their values exist in new remote data\n\t * - Selections are cleared if their values don't exist in new data\n\t * @fires refreshed - After refresh completes successfully\n\t * @fires refreshError - If remote data fetch fails\n\t */\n\tpublic refresh(): void {\n\t\t// For remote selects, refetch data\n\t\tif (this._config.remote && this._remoteModule) {\n\t\t\tthis._remoteModule\n\t\t\t\t.fetchData()\n\t\t\t\t.then((items) => {\n\t\t\t\t\t// Capture currently selected values before clearing\n\t\t\t\t\tconst currentlySelected = this._state.getSelectedOptions();\n\n\t\t\t\t\t// Clear existing options (also captures to _preSelectedValues)\n\t\t\t\t\tthis._clearExistingOptions();\n\n\t\t\t\t\t// Get all available values from new remote data\n\t\t\t\t\tconst availableValues = items.map((item) => item.id);\n\n\t\t\t\t\t// Filter to only values that exist in new data\n\t\t\t\t\tconst validSelections = currentlySelected.filter((value) =>\n\t\t\t\t\t\tavailableValues.includes(value),\n\t\t\t\t\t);\n\n\n\t\t\t\t\t// Add new options and restore selection state\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\t\toption.value = item.id;\n\t\t\t\t\t\toption.textContent = item.title;\n\t\t\t\t\t\tif (item.disabled) option.disabled = true;\n\n\t\t\t\t\t\t// Restore selected attribute for preserved selections\n\t\t\t\t\t\tif (validSelections.includes(item.id)) {\n\t\t\t\t\t\t\toption.selected = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._element.appendChild(option);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Rebuild dropdown\n\t\t\t\t\tthis._rebuildOptionsFromNative();\n\n\t\t\t\t\t// Sync selection state from native select (now has selected attributes)\n\t\t\t\t\tthis._syncSelectionFromNative();\n\n\t\t\t\t\t// Reapply ARIA attributes\n\t\t\t\t\tthis._setAriaAttributes();\n\n\t\t\t\t\t// Dispatch refreshed event\n\t\t\t\t\tthis._dispatchEvent('refreshed');\n\t\t\t\t\tthis._fireEvent('refreshed');\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Error refreshing remote data:', error);\n\t\t\t\t\tthis._dispatchEvent('refreshError');\n\t\t\t\t\tthis._fireEvent('refreshError');\n\t\t\t\t});\n\t\t} else {\n\t\t\t// For static selects, just sync visual state\n\t\t\tthis._syncSelectionFromNative();\n\n\t\t\t// Reapply ARIA attributes\n\t\t\tthis._setAriaAttributes();\n\n\t\t\t// Dispatch refreshed event\n\t\t\tthis._dispatchEvent('refreshed');\n\t\t\tthis._fireEvent('refreshed');\n\t\t}\n\t}\n\n\t/**\n\t * ========================================================================\n\t * STATIC METHODS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * Create instances of KTSelect for all matching elements\n\t */\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll<HTMLElement>('[data-kt-select]');\n\n\t\telements.forEach((element) => {\n\t\t\tif (\n\t\t\t\telement.hasAttribute('data-kt-select') &&\n\t\t\t\t!element.classList.contains('data-kt-select-initialized')\n\t\t\t) {\n\t\t\t\tnew KTSelect(element);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Initialize all KTSelect instances\n\t */\n\tpublic static init(): void {\n\t\tKTSelect.createInstances();\n\t}\n\n\t/**\n\t * Get an existing KTSelect instance from an element\n\t */\n\tpublic static getInstance(element: HTMLElement): KTSelect | null {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'select')) {\n\t\t\treturn KTData.get(element, 'select') as KTSelect;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-select')) {\n\t\t\treturn new KTSelect(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get an existing KTSelect instance or create a new one\n\t */\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTSelectConfigInterface,\n\t): KTSelect {\n\t\treturn this.getInstance(element) || new KTSelect(element, config);\n\t}\n\n\t/**\n\t * Handle remote search\n\t * @param event Input event\n\t */\n\tprivate _handleRemoteSearch(event: Event) {\n\t\tif (\n\t\t\t!this._remoteModule ||\n\t\t\t!this._config.remote ||\n\t\t\t!this._config.searchParam\n\t\t)\n\t\t\treturn;\n\n\t\tconst query = (event.target as HTMLInputElement).value;\n\n\t\t// Check if the query is long enough\n\t\tif (query.length < (this._config.searchMinLength || 0)) {\n\t\t\t// Restore original options if query is too short\n\t\t\tthis._restoreOriginalOptions();\n\t\t\treturn;\n\t\t}\n\n\t\t// Debounce the search\n\t\tif (this._searchDebounceTimeout) {\n\t\t\tclearTimeout(this._searchDebounceTimeout);\n\t\t}\n\n\t\tthis._searchDebounceTimeout = window.setTimeout(() => {\n\t\t\t// Show loading state\n\t\t\tthis._renderSearchLoadingState();\n\n\t\t\t// Fetch remote data with search query\n\t\t\tthis._remoteModule\n\t\t\t\t.fetchData(query)\n\t\t\t\t.then((items) => {\n\t\t\t\t\t// Update state with fetched items\n\t\t\t\t\tthis._state\n\t\t\t\t\t\t.setItems(items)\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\t// Update options in the dropdown\n\t\t\t\t\t\t\tthis._updateSearchResults(items);\n\n\t\t\t\t\t\t\t// Refresh the search module to update focus and cache\n\t\t\t\t\t\t\tif (this._searchModule) {\n\t\t\t\t\t\t\t\tthis._searchModule.refreshAfterSearch();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.updateSelectAllButtonState();\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\t\tconsole.error('Error updating search results:', error);\n\t\t\t\t\t\t\tthis._renderSearchErrorState(\n\t\t\t\t\t\t\t\terror.message || 'Failed to load search results',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error('Error fetching search results:', error);\n\t\t\t\t\tthis._renderSearchErrorState(\n\t\t\t\t\t\tthis._remoteModule.getErrorMessage() ||\n\t\t\t\t\t\t\t'Failed to load search results',\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}, this._config.searchDebounce || 300);\n\t}\n\n\t// Search debounce timeout\n\tprivate _searchDebounceTimeout: number | null = null;\n\n\t/**\n\t * Render loading state for search\n\t */\n\tprivate _renderSearchLoadingState() {\n\t\tif (!this._originalOptionsHtml && this._dropdownContentElement) {\n\t\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t\t'[data-kt-select-options]',\n\t\t\t);\n\t\t\tif (optionsContainer) {\n\t\t\t\tthis._originalOptionsHtml = optionsContainer.innerHTML;\n\t\t\t}\n\t\t}\n\t\tthis._showDropdownMessage('loading', 'Searching...');\n\t}\n\n\t// Store original options HTML for restoring after search\n\tprivate _originalOptionsHtml: string | null = null;\n\n\t/**\n\t * Render error state for search\n\t * @param message Error message\n\t */\n\tprivate _renderSearchErrorState(message: string) {\n\t\tthis._showDropdownMessage('error', message);\n\n\t\t// Restore original options after error with a delay\n\t\tsetTimeout(() => {\n\t\t\tthis._restoreOriginalOptions();\n\t\t}, 2000);\n\t}\n\n\t/**\n\t * Restore original options when search is cleared\n\t */\n\tprivate _restoreOriginalOptions() {\n\t\tif (!this._dropdownContentElement || !this._originalOptionsHtml) return;\n\n\t\t// Use cached options container for better performance\n\t\tconst optionsContainer =\n\t\t\tthis._optionsContainer ||\n\t\t\tthis._dropdownContentElement.querySelector('[data-kt-select-options]');\n\t\tif (!optionsContainer) return;\n\n\t\t// Restore original options\n\t\toptionsContainer.innerHTML = this._originalOptionsHtml;\n\n\t\t// Update options NodeList\n\t\tthis._options = this._dropdownContentElement.querySelectorAll(\n\t\t\t'[data-kt-select-option]',\n\t\t) as NodeListOf<HTMLElement>;\n\n\t\t// Refresh search module\n\t\tif (this._searchModule) {\n\t\t\tthis._searchModule.refreshAfterSearch();\n\t\t}\n\t\tthis.updateSelectAllButtonState();\n\n\t}\n\n\t/**\n\t * Update search results in the dropdown\n\t * @param items Search result items\n\t */\n\tprivate _updateSearchResults(items: KTSelectOptionData[]) {\n\t\tif (!this._dropdownContentElement) return;\n\n\t\t// Use cached options container for better performance\n\t\tconst optionsContainer =\n\t\t\tthis._optionsContainer ||\n\t\t\tthis._dropdownContentElement.querySelector('[data-kt-select-options]');\n\t\tif (!optionsContainer) return;\n\n\t\t// Handle empty results\n\t\tif (items.length === 0) {\n\t\t\toptionsContainer.innerHTML = '';\n\t\t\tconst noResultsElement = defaultTemplates.searchEmpty(this._config);\n\t\t\toptionsContainer.appendChild(noResultsElement);\n\t\t\treturn;\n\t\t}\n\n\t\t// First update the original select element with search results\n\t\tthis._updateOriginalSelectWithSearchResults(items);\n\n\t\t// Then update dropdown using the standard flow\n\t\tthis._updateDropdownWithNewOptions();\n\n\t\t// Add pagination \"Load More\" button if needed\n\t\tif (this._config.pagination && this._remoteModule.hasMorePages()) {\n\t\t\tthis._addLoadMoreButton();\n\t\t}\n\t}\n\n\t/**\n\t * Update original select element with search results\n\t * @param items Search result items\n\t */\n\tprivate _updateOriginalSelectWithSearchResults(items: KTSelectOptionData[]) {\n\t\t// Clear existing options except placeholder\n\t\tthis._clearExistingOptions();\n\n\t\t// Add search result items to original select element\n\t\titems.forEach((item) => {\n\t\t\tconst optionElement = document.createElement('option');\n\t\t\toptionElement.value = item.id || '';\n\t\t\toptionElement.textContent = item.title || '';\n\n\t\t\tif (item.selected) {\n\t\t\t\toptionElement.setAttribute('selected', 'selected');\n\t\t\t}\n\t\t\tif (item.disabled) {\n\t\t\t\toptionElement.setAttribute('disabled', 'disabled');\n\t\t\t}\n\n\t\t\tthis._element.appendChild(optionElement);\n\t\t});\n\n\t}\n\n\t/**\n\t * Check if dropdown is open\n\t */\n\tpublic isDropdownOpen(): boolean {\n\t\treturn this._dropdownIsOpen;\n\t}\n\n\tpublic getSelectedOptionsText(): string {\n\t\tconst selectedValues = this.getSelectedOptions();\n\t\tconst displaySeparator = this._config.displaySeparator || ', ';\n\t\tconst texts = selectedValues\n\t\t\t.map((value) => {\n\t\t\t\tconst option = Array.from(this._options).find(\n\t\t\t\t\t(opt) => opt.getAttribute('data-value') === value,\n\t\t\t\t);\n\t\t\t\treturn option?.getAttribute('data-text') || '';\n\t\t\t})\n\t\t\t.filter(Boolean);\n\t\treturn texts.join(displaySeparator);\n\t}\n\n\t/**\n\t * Check if an option is disabled (either in dropdown or original select)\n\t */\n\tprivate _isOptionDisabled(value: string): boolean {\n\t\tconst dropdownOption = Array.from(this._options).find(\n\t\t\t(opt) => opt.getAttribute('data-value') === value,\n\t\t);\n\t\tconst isDropdownDisabled =\n\t\t\tdropdownOption &&\n\t\t\t(dropdownOption.classList.contains('disabled') ||\n\t\t\t\tdropdownOption.getAttribute('aria-disabled') === 'true');\n\t\tconst selectOption = Array.from(\n\t\t\tthis._element.querySelectorAll('option'),\n\t\t).find((opt) => opt.value === value) as HTMLOptionElement;\n\t\tconst isNativeDisabled = selectOption && selectOption.disabled;\n\t\treturn Boolean(isDropdownDisabled || isNativeDisabled);\n\t}\n\n\t/**\n\t * Centralized keyboard event handler for all select modes\n\t */\n\tprivate _handleKeyboardEvent(event: KeyboardEvent) {\n\t\t// If the event target is the search input and the event was already handled (defaultPrevented),\n\t\t// then return early to avoid duplicate processing by this broader handler.\n\t\tif (event.target === this._searchInputElement && event.defaultPrevented) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isOpen = this._dropdownIsOpen;\n\t\tconst config = this._config;\n\t\tconst focusManager = this._focusManager;\n\t\tconst buffer = this._typeToSearchBuffer;\n\n\t\t// If the event target is the search input, let it handle most typing keys naturally.\n\t\tif (event.target === this._searchInputElement) {\n\t\t\t// Allow navigation keys like ArrowDown, ArrowUp, Escape, Enter (for search/selection) to be handled by the logic below.\n\t\t\t// For other keys (characters, space, backspace, delete), let the input field process them.\n\t\t\tif (\n\t\t\t\tevent.key !== 'ArrowDown' &&\n\t\t\t\tevent.key !== 'ArrowUp' &&\n\t\t\t\tevent.key !== 'Escape' &&\n\t\t\t\tevent.key !== 'Enter' &&\n\t\t\t\tevent.key !== 'Tab' &&\n\t\t\t\tevent.key !== 'Home' &&\n\t\t\t\tevent.key !== 'End' &&\n\t\t\t\tevent.key !== ' '\n\t\t\t) {\n\t\t\t\t// If it's a character key and we are NOT type-to-searching (because search has focus)\n\t\t\t\t// then let the input field handle it for its own value.\n\t\t\t\t// The search module's 'input' event will handle filtering based on the input's value.\n\t\t\t\tbuffer.clear(); // Clear type-to-search buffer when typing in search field\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// For Enter specifically in search input, we might want to select the focused option or submit search.\n\t\t\t// This is handled later in the switch.\n\t\t}\n\n\t\t// Ignore modifier keys (except for specific combinations if added later)\n\t\tif (event.altKey || event.ctrlKey || event.metaKey) return;\n\n\t\t// Type-to-search: only for single char keys, when search input does not have focus\n\t\tif (\n\t\t\tevent.key.length === 1 &&\n\t\t\t!event.repeat &&\n\t\t\t!event.key.match(/\\s/) &&\n\t\t\tdocument.activeElement !== this._searchInputElement\n\t\t) {\n\t\t\tbuffer.push(event.key);\n\t\t\tconst str = buffer.getBuffer();\n\t\t\tif (isOpen) {\n\t\t\t\tfocusManager.focusByString(str);\n\t\t\t} else {\n\t\t\t\t// If closed, type-to-search could potentially open and select.\n\t\t\t\t// For now, let's assume it only works when open or opens it first.\n\t\t\t\t// Or, we could find the matching option and set it directly without opening.\n\t\t\t}\n\t\t\treturn; // Type-to-search handles the event\n\t\t}\n\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (!isOpen) {\n\t\t\t\t\tthis.openDropdown();\n\t\t\t\t} else {\n\t\t\t\t\tfocusManager.focusNext();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (!isOpen) {\n\t\t\t\t\tthis.openDropdown();\n\t\t\t\t} else {\n\t\t\t\t\tfocusManager.focusPrevious();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (isOpen) focusManager.focusFirst();\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (isOpen) focusManager.focusLast();\n\t\t\t\tbreak;\n\t\t\tcase 'Enter':\n\t\t\tcase ' ': // Space\n\t\t\t\tif (isOpen) {\n\t\t\t\t\tconst focusedOptionEl = this._focusManager.getFocusedOption();\n\t\t\t\t\tif (focusedOptionEl) {\n\t\t\t\t\t\tconst val = focusedOptionEl.dataset.value;\n\t\t\t\t\t\t// If single select, and the item is already selected, just close.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tval !== undefined &&\n\t\t\t\t\t\t\t!this._config.multiple &&\n\t\t\t\t\t\t\tthis._state.isSelected(val)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthis.closeDropdown();\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Proceed with selection if not handled above\n\t\t\t\t\tthis.selectFocusedOption();\n\n\t\t\t\t\t// Close dropdown only for single select mode (for new selections)\n\t\t\t\t\t// Keep dropdown open for multiple select mode to allow additional selections\n\t\t\t\t\tif (!this._config.multiple) {\n\t\t\t\t\t\t// This will also be true for the case handled above, but closeDropdown is idempotent.\n\t\t\t\t\t\t// However, the break above prevents this from being reached for that specific case.\n\t\t\t\t\t\tthis.closeDropdown();\n\t\t\t\t\t}\n\t\t\t\t\tevent.preventDefault(); // Prevent form submission or other default actions\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tthis.openDropdown();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Escape':\n\t\t\t\tif (isOpen) {\n\t\t\t\t\tthis.closeDropdown();\n\t\t\t\t\t(event.target as HTMLElement).blur();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Tab':\n\t\t\t\t// Let Tab propagate for normal focus movement\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tpublic renderDisplayTemplateForSelected(selectedValues: string[]): string {\n\t\tconst optionsConfig = (this._config.optionsConfig as any) || {};\n\t\tconst displaySeparator = this._config.displaySeparator || ', ';\n\t\tconst contentArray = Array.from(\n\t\t\tnew Set(\n\t\t\t\tselectedValues\n\t\t\t\t\t.map((value) => {\n\t\t\t\t\t\tconst option = Array.from(this._options).find(\n\t\t\t\t\t\t\t(opt) => opt.getAttribute('data-value') === value,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!option) return '';\n\n\t\t\t\t\t\tlet displayTemplate = this._config.displayTemplate;\n\t\t\t\t\t\tconst text = option.getAttribute('data-text') || '';\n\n\t\t\t\t\t\t// Replace all {{varname}} in option.innerHTML with values from _config\n\t\t\t\t\t\tObject.entries(optionsConfig[value] || {}).forEach(([key, val]) => {\n\t\t\t\t\t\t\tif (['string', 'number', 'boolean'].includes(typeof val)) {\n\t\t\t\t\t\t\t\tdisplayTemplate = displayTemplate.replace(\n\t\t\t\t\t\t\t\t\tnew RegExp(`{{${key}}}`, 'g'),\n\t\t\t\t\t\t\t\t\tString(val),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn renderTemplateString(displayTemplate, {\n\t\t\t\t\t\t\tselectedCount: selectedValues.length || 0,\n\t\t\t\t\t\t\tselectedTexts: this.getSelectedOptionsText() || '',\n\t\t\t\t\t\t\ttext,\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t\t.filter(Boolean),\n\t\t\t),\n\t\t);\n\t\treturn contentArray.join(displaySeparator);\n\t}\n\n\tpublic getDisplayElement(): HTMLElement {\n\t\treturn this._displayElement;\n\t}\n\n\tprivate _observeNativeSelect() {\n\t\tif (this._mutationObserver) return; // Prevent double observers\n\t\tthis._mutationObserver = new MutationObserver((mutations) => {\n\t\t\tlet needsRebuild = false;\n\t\t\tlet needsSelectionSync = false;\n\n\t\t\tfor (const mutation of mutations) {\n\t\t\t\tif (mutation.type === 'childList') {\n\t\t\t\t\t// Option(s) added or removed\n\t\t\t\t\tneedsRebuild = true;\n\t\t\t\t} else if (\n\t\t\t\t\tmutation.type === 'attributes' &&\n\t\t\t\t\tmutation.target instanceof HTMLOptionElement\n\t\t\t\t) {\n\t\t\t\t\tif (mutation.attributeName === 'selected') {\n\t\t\t\t\t\tneedsSelectionSync = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (needsRebuild) {\n\t\t\t\t// Rebuild the custom dropdown options\n\t\t\t\tthis._rebuildOptionsFromNative();\n\t\t\t}\n\t\t\tif (needsSelectionSync) {\n\t\t\t\tthis._syncSelectionFromNative();\n\t\t\t}\n\t\t});\n\n\t\tthis._mutationObserver.observe(this._element, {\n\t\t\tchildList: true,\n\t\t\tattributes: true,\n\t\t\tsubtree: true,\n\t\t\tattributeFilter: ['selected'],\n\t\t});\n\t}\n\n\tprivate _rebuildOptionsFromNative() {\n\t\t// Remove and rebuild the custom dropdown options from the native select\n\t\tif (this._dropdownContentElement) {\n\t\t\tconst optionsContainer = this._dropdownContentElement.querySelector(\n\t\t\t\t'[data-kt-select-options]',\n\t\t\t);\n\t\t\tif (optionsContainer) {\n\t\t\t\toptionsContainer.innerHTML = '';\n\t\t\t\tconst options = Array.from(this._element.querySelectorAll('option'));\n\t\t\t\toptions.forEach((optionElement) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\toptionElement.value === '' &&\n\t\t\t\t\t\toptionElement.textContent.trim() === ''\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst selectOption = new KTSelectOption(optionElement, this._config);\n\t\t\t\t\tconst renderedOption = selectOption.render();\n\t\t\t\t\toptionsContainer.appendChild(renderedOption);\n\t\t\t\t});\n\t\t\t\t// Update internal references\n\t\t\t\tthis._options = this._dropdownContentElement.querySelectorAll(\n\t\t\t\t\t'[data-kt-select-option]',\n\t\t\t\t) as NodeListOf<HTMLElement>;\n\t\t\t}\n\t\t}\n\t\t// Sync selection after rebuilding\n\t\tthis._syncSelectionFromNative();\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._updateSelectedOptionClass();\n\t}\n\n\tprivate _syncSelectionFromNative() {\n\t\t// Sync internal state from the native select's selected options\n\t\tconst selected = Array.from(\n\t\t\tthis._element.querySelectorAll('option:checked'),\n\t\t).map((opt) => (opt as HTMLOptionElement).value);\n\t\tthis._state.setSelectedOptions(\n\t\t\tthis._config.multiple ? selected : selected[0] || '',\n\t\t);\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._updateSelectedOptionClass();\n\t\tthis.updateSelectAllButtonState();\n\t}\n\n\tprivate _handleSelectAllClick(event: Event): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tconst visibleOptions = this._focusManager\n\t\t\t.getVisibleOptions()\n\t\t\t.filter((opt) => opt.getAttribute('aria-disabled') !== 'true');\n\t\tif (visibleOptions.length === 0) return;\n\n\t\tconst visibleValues = visibleOptions.map(\n\t\t\t(opt) => opt.dataset.value as string,\n\t\t);\n\t\tconst selectedValues = new Set(this.getSelectedOptions());\n\t\tconst isAllSelected = visibleOptions.every((opt) =>\n\t\t\tselectedValues.has(opt.dataset.value as string),\n\t\t);\n\n\t\tif (isAllSelected) {\n\t\t\t// Deselect all visible\n\t\t\tvisibleValues.forEach((value) => selectedValues.delete(value));\n\t\t} else {\n\t\t\t// Select all visible\n\t\t\tvisibleValues.forEach((value) => selectedValues.add(value));\n\t\t}\n\n\t\tthis._state.setSelectedOptions(Array.from(selectedValues));\n\t\tthis.updateSelectedOptionDisplay();\n\t\tthis._updateSelectedOptionClass();\n\t\tthis.updateSelectAllButtonState();\n\n\t\tthis._dispatchEvent('change');\n\t\tthis._fireEvent('change');\n\t}\n\n\tpublic updateSelectAllButtonState(): void {\n\t\tif (\n\t\t\t!this._config.multiple ||\n\t\t\t!this._config.enableSelectAll ||\n\t\t\t!this._selectAllButtonToggle\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst visibleOptions = this._focusManager\n\t\t\t.getVisibleOptions()\n\t\t\t.filter((opt) => opt.getAttribute('aria-disabled') !== 'true');\n\n\t\tif (visibleOptions.length === 0) {\n\t\t\tthis._selectAllButton.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\tthis._selectAllButton.style.display = '';\n\n\t\tconst selectedValues = new Set(this.getSelectedOptions());\n\t\tconst isAllSelected = visibleOptions.every((opt) =>\n\t\t\tselectedValues.has(opt.dataset.value as string),\n\t\t);\n\n\t\tthis._selectAllButtonToggle.textContent = isAllSelected\n\t\t\t? this._config.clearAllText\n\t\t\t: this._config.selectAllText;\n\t}\n\n\t/**\n\t * Destroy the component and clean up resources\n\t */\n\tpublic destroy(): void {\n\t\t// Remove from global dropdown registry\n\t\tKTSelect.openDropdowns.delete(this);\n\n\t\t// Close dropdown if open\n\t\tif (this._dropdownIsOpen) {\n\t\t\tthis.closeDropdown();\n\t\t}\n\n\t\t// Call parent dispose method\n\t\tsuper.dispose();\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTTooltip } from './tooltip';\nexport type { KTTooltipConfigInterface, KTTooltipInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTDom from './helpers/dom';\nimport KTUtils from './helpers/utils';\nimport KTEventHandler from './helpers/event-handler';\nimport KTData from './helpers/data';\nimport { KTDropdown } from './components/dropdown';\nimport { KTModal } from './components/modal';\nimport { KTDrawer } from './components/drawer';\nimport { KTCollapse } from './components/collapse';\nimport { KTDismiss } from './components/dismiss';\nimport { KTTabs } from './components/tabs';\nimport { KTAccordion } from './components/accordion';\nimport { KTScrollspy } from './components/scrollspy';\nimport { KTScrollable } from './components/scrollable';\nimport { KTScrollto } from './components/scrollto';\nimport { KTSticky } from './components/sticky';\nimport { KTReparent } from './components/reparent';\nimport { KTToggle } from './components/toggle';\nimport { KTTooltip } from './components/tooltip';\nimport { KTStepper } from './components/stepper';\nimport { KTThemeSwitch } from './components/theme-switch';\nimport { KTImageInput } from './components/image-input';\nimport { KTTogglePassword } from './components/toggle-password';\nimport { KTDataTable } from './components/datatable';\nimport { KTSelect } from './components/select';\nimport { KTToast } from './components/toast';\n\nexport { KTDropdown } from './components/dropdown';\nexport { KTModal } from './components/modal';\nexport { KTDrawer } from './components/drawer';\nexport { KTCollapse } from './components/collapse';\nexport { KTDismiss } from './components/dismiss';\nexport { KTTabs } from './components/tabs';\nexport { KTAccordion } from './components/accordion';\nexport { KTScrollspy } from './components/scrollspy';\nexport { KTScrollable } from './components/scrollable';\nexport { KTScrollto } from './components/scrollto';\nexport { KTSticky } from './components/sticky';\nexport { KTReparent } from './components/reparent';\nexport { KTToggle } from './components/toggle';\nexport { KTTooltip } from './components/tooltip';\nexport { KTStepper } from './components/stepper';\nexport { KTThemeSwitch } from './components/theme-switch';\nexport { KTImageInput } from './components/image-input';\nexport { KTTogglePassword } from './components/toggle-password';\nexport { KTDataTable } from './components/datatable';\nexport { KTSelect } from './components/select';\nexport { KTToast } from './components/toast';\n\nconst KTComponents = {\n\tinit(): void {\n\t\tKTDropdown.init();\n\t\tKTModal.init();\n\t\tKTDrawer.init();\n\t\tKTCollapse.init();\n\t\tKTDismiss.init();\n\t\tKTTabs.init();\n\t\tKTAccordion.init();\n\t\tKTScrollspy.init();\n\t\tKTScrollable.init();\n\t\tKTScrollto.init();\n\t\tKTSticky.init();\n\t\tKTReparent.init();\n\t\tKTToggle.init();\n\t\tKTTooltip.init();\n\t\tKTStepper.init();\n\t\tKTThemeSwitch.init();\n\t\tKTImageInput.init();\n\t\tKTTogglePassword.init();\n\t\tKTDataTable.init();\n\t\tKTSelect.init();\n\t\tKTToast.init();\n\t},\n};\n\ndeclare global {\n\tinterface Window {\n\t\tKTUtils: typeof KTUtils;\n\t\tKTDom: typeof KTDom;\n\t\tKTEventHandler: typeof KTEventHandler;\n\t\tKTData: typeof KTData;\n\t\tKTDropdown: typeof KTDropdown;\n\t\tKTModal: typeof KTModal;\n\t\tKTDrawer: typeof KTDrawer;\n\t\tKTCollapse: typeof KTCollapse;\n\t\tKTDismiss: typeof KTDismiss;\n\t\tKTTabs: typeof KTTabs;\n\t\tKTAccordion: typeof KTAccordion;\n\t\tKTScrollspy: typeof KTScrollspy;\n\t\tKTScrollable: typeof KTScrollable;\n\t\tKTScrollto: typeof KTScrollto;\n\t\tKTSticky: typeof KTSticky;\n\t\tKTReparent: typeof KTReparent;\n\t\tKTToggle: typeof KTToggle;\n\t\tKTTooltip: typeof KTTooltip;\n\t\tKTStepper: typeof KTStepper;\n\t\tKTThemeSwitch: typeof KTThemeSwitch;\n\t\tKTImageInput: typeof KTImageInput;\n\t\tKTTogglePassword: typeof KTTogglePassword;\n\t\tKTDataTable: typeof KTDataTable;\n\t\tKTSelect: typeof KTSelect;\n\t\tKTToast: typeof KTToast;\n\t\tKTComponents: typeof KTComponents;\n\t}\n}\n\nexport default KTComponents;\n\nKTDom.ready(() => {\n\tKTComponents.init();\n});\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTCollapse } from './collapse';\nexport type { KTCollapseConfigInterface, KTCollapseInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport {\n\tInstance as PopperInstance,\n\tcreatePopper,\n\tPlacement,\n\tVirtualElement,\n} from '@popperjs/core';\nimport KTDom from '../../helpers/dom';\nimport KTData from '../../helpers/data';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTDropdownConfigInterface, KTDropdownInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_DROPDOWN_INITIALIZED: boolean;\n\t\tKTDropdown: typeof KTDropdown;\n\t}\n}\n\nexport class KTDropdown extends KTComponent implements KTDropdownInterface {\n\tprotected override _name: string = 'dropdown';\n\tprotected override _defaultConfig: KTDropdownConfigInterface = {\n\t\tzindex: 105,\n\t\thoverTimeout: 200,\n\t\tplacement: 'bottom-start',\n\t\tplacementRtl: 'bottom-end',\n\t\tpermanent: false,\n\t\tdismiss: false,\n\t\tkeyboard: true,\n\t\ttrigger: 'click',\n\t\tattach: '',\n\t\toffset: '0px, 5px',\n\t\toffsetRtl: '0px, 5px',\n\t\thiddenClass: 'hidden',\n\t\tcontainer: '',\n\t};\n\tprotected override _config: KTDropdownConfigInterface = this._defaultConfig;\n\tprotected _disabled: boolean = false;\n\tprotected _toggleElement: HTMLElement;\n\tprotected _menuElement: HTMLElement;\n\tprotected _isTransitioning: boolean = false;\n\tprotected _isOpen: boolean = false;\n\n\tconstructor(element: HTMLElement, config?: KTDropdownConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tthis._toggleElement = this._element.querySelector(\n\t\t\t'[data-kt-dropdown-toggle]',\n\t\t) as HTMLElement;\n\t\tif (!this._toggleElement) {\n\t\t\treturn;\n\t\t}\n\t\tthis._menuElement = this._element.querySelector(\n\t\t\t'[data-kt-dropdown-menu]',\n\t\t) as HTMLElement;\n\t\tif (!this._menuElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tKTData.set(this._menuElement, 'dropdownElement', this._element);\n\t\tthis._setupNestedDropdowns();\n\t\tthis._handleContainer();\n\t}\n\n\tprotected _handleContainer(): void {\n\t\tif (this._getOption('container')) {\n\t\t\tif (this._getOption('container') === 'body') {\n\t\t\t\tdocument.body.appendChild(this._menuElement);\n\t\t\t} else {\n\t\t\t\tdocument\n\t\t\t\t\t.querySelector(this._getOption('container') as string)\n\t\t\t\t\t?.appendChild(this._menuElement);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _setupNestedDropdowns(): void {\n\t\tconst subDropdowns = this._menuElement.querySelectorAll(\n\t\t\t'[data-kt-dropdown-toggle]',\n\t\t);\n\t\tsubDropdowns.forEach((subToggle) => {\n\t\t\tconst subItem = subToggle.closest(\n\t\t\t\t'[data-kt-dropdown-item]',\n\t\t\t) as HTMLElement;\n\t\t\tconst subMenu = subToggle\n\t\t\t\t.closest('.kt-menu-item')\n\t\t\t\t?.querySelector('[data-kt-dropdown-menu]');\n\t\t\tif (subItem && subMenu) {\n\t\t\t\tnew KTDropdown(subItem);\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected _click(event: Event): void {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif (this._disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._getOption('trigger') !== 'click') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._toggle();\n\t}\n\n\tprotected _mouseover(event: MouseEvent): void {\n\t\tif (this._disabled) return;\n\n\t\tif (this._getOption('trigger') !== 'hover') return;\n\n\t\tif (KTData.get(this._element, 'hover') === '1') {\n\t\t\tclearTimeout(KTData.get(this._element, 'timeout') as number);\n\t\t\tKTData.remove(this._element, 'hover');\n\t\t\tKTData.remove(this._element, 'timeout');\n\t\t}\n\n\t\tthis._show();\n\t}\n\n\tprotected _mouseout(event: MouseEvent): void {\n\t\tif (this._disabled) return;\n\n\t\tif (this._getOption('trigger') !== 'hover') return;\n\n\t\tconst relatedTarget = event.relatedTarget as HTMLElement;\n\t\tconst isWithinDropdown = this._element.contains(relatedTarget);\n\n\t\tif (isWithinDropdown) return;\n\n\t\tconst timeout = setTimeout(\n\t\t\t() => {\n\t\t\t\tif (KTData.get(this._element, 'hover') === '1') {\n\t\t\t\t\tthis._hide();\n\t\t\t\t}\n\t\t\t},\n\t\t\tparseInt(this._getOption('hoverTimeout') as string),\n\t\t);\n\n\t\tKTData.set(this._element, 'hover', '1');\n\t\tKTData.set(this._element, 'timeout', timeout);\n\t}\n\n\tprotected _toggle(): void {\n\t\tif (this._isOpen) {\n\t\t\tthis._hide();\n\t\t} else {\n\t\t\tthis._show();\n\t\t}\n\t}\n\n\tprotected _show(): void {\n\t\tif (this._isOpen || this._isTransitioning) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('show', payload);\n\t\tthis._dispatchEvent('show', payload);\n\t\tif (payload.cancel) return;\n\n\t\tKTDropdown.hide(this._element);\n\n\t\tlet zIndex: number = parseInt(this._getOption('zindex') as string);\n\t\tconst parentZindex: number = KTDom.getHighestZindex(this._element);\n\n\t\tif (parentZindex !== null && parentZindex >= zIndex) {\n\t\t\tzIndex = parentZindex + 1;\n\t\t}\n\t\tif (zIndex > 0) {\n\t\t\tthis._menuElement.style.zIndex = zIndex.toString();\n\t\t}\n\n\t\tthis._menuElement.style.display = 'block';\n\t\tthis._menuElement.style.opacity = '0';\n\t\tKTDom.reflow(this._menuElement);\n\t\tthis._menuElement.style.opacity = '1';\n\n\t\tthis._menuElement.classList.remove(\n\t\t\tthis._getOption('hiddenClass') as string,\n\t\t);\n\t\tthis._toggleElement.classList.add('active');\n\t\tthis._menuElement.classList.add('open');\n\t\tthis._element.classList.add('open');\n\n\t\tthis._initPopper();\n\n\t\tKTDom.transitionEnd(this._menuElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = true;\n\n\t\t\tthis._fireEvent('shown');\n\t\t\tthis._dispatchEvent('shown');\n\t\t});\n\t}\n\n\tprotected _hide(): void {\n\t\tif (!this._isOpen || this._isTransitioning) return;\n\n\t\tconst payload = { cancel: false };\n\t\tthis._fireEvent('hide', payload);\n\t\tthis._dispatchEvent('hide', payload);\n\t\tif (payload.cancel) return;\n\n\t\tthis._menuElement.style.opacity = '1';\n\t\tKTDom.reflow(this._menuElement);\n\t\tthis._menuElement.style.opacity = '0';\n\t\tthis._menuElement.classList.remove('open');\n\t\tthis._toggleElement.classList.remove('active');\n\t\tthis._element.classList.remove('open');\n\n\t\tKTDom.transitionEnd(this._menuElement, () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tthis._isOpen = false;\n\n\t\t\tthis._menuElement.classList.add(this._getOption('hiddenClass') as string);\n\t\t\tthis._menuElement.style.display = '';\n\t\t\tthis._menuElement.style.zIndex = '';\n\n\t\t\tthis._destroyPopper();\n\n\t\t\tthis._fireEvent('hidden');\n\t\t\tthis._dispatchEvent('hidden');\n\t\t});\n\t}\n\n\tprotected _initPopper(): void {\n\t\tconst isRtl = KTDom.isRTL();\n\t\tlet reference: HTMLElement;\n\t\tconst attach = this._getOption('attach') as string;\n\n\t\tif (attach) {\n\t\t\treference =\n\t\t\t\tattach === 'parent'\n\t\t\t\t\t? (this._toggleElement.parentNode as HTMLElement)\n\t\t\t\t\t: (document.querySelector(attach) as HTMLElement);\n\t\t} else {\n\t\t\treference = this._toggleElement;\n\t\t}\n\n\t\tif (reference) {\n\t\t\tconst popper = createPopper(\n\t\t\t\treference as Element | VirtualElement,\n\t\t\t\tthis._menuElement,\n\t\t\t\tthis._getPopperConfig(),\n\t\t\t);\n\t\t\tKTData.set(this._element, 'popper', popper);\n\t\t}\n\t}\n\n\tprotected _destroyPopper(): void {\n\t\tif (KTData.has(this._element, 'popper')) {\n\t\t\t(KTData.get(this._element, 'popper') as PopperInstance).destroy();\n\t\t\tKTData.remove(this._element, 'popper');\n\t\t}\n\t}\n\n\tprotected _isDropdownOpen(): boolean {\n\t\treturn (\n\t\t\tthis._element.classList.contains('open') &&\n\t\t\tthis._menuElement.classList.contains('open')\n\t\t);\n\t}\n\n\tprotected _getPopperConfig(): object {\n\t\tconst isRtl = KTDom.isRTL();\n\t\tlet placement = this._getOption('placement') as Placement;\n\t\tif (isRtl && this._getOption('placementRtl')) {\n\t\t\tplacement = this._getOption('placementRtl') as Placement;\n\t\t}\n\n\t\tlet offsetValue = this._getOption('offset');\n\t\tif (isRtl && this._getOption('offsetRtl')) {\n\t\t\toffsetValue = this._getOption('offsetRtl') as Placement;\n\t\t}\n\t\tconst offset = offsetValue\n\t\t\t? offsetValue\n\t\t\t\t\t.toString()\n\t\t\t\t\t.split(',')\n\t\t\t\t\t.map((value) => parseInt(value.trim(), 10))\n\t\t\t: [0, 0];\n\n\t\tconst strategy =\n\t\t\tthis._getOption('overflow') === true ? 'absolute' : 'fixed';\n\t\tconst altAxis = this._getOption('flip') !== false;\n\t\treturn {\n\t\t\tplacement: placement,\n\t\t\tstrategy: strategy,\n\t\t\tmodifiers: [\n\t\t\t\t{\n\t\t\t\t\tname: 'offset',\n\t\t\t\t\toptions: { offset: offset },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'preventOverflow',\n\t\t\t\t\toptions: { altAxis: altAxis },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'flip',\n\t\t\t\t\toptions: { flipVariations: false },\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\n\tprotected _getToggleElement(): HTMLElement {\n\t\treturn this._toggleElement;\n\t}\n\n\tprotected _getContentElement(): HTMLElement {\n\t\treturn this._menuElement;\n\t}\n\n\t// General Methods\n\tpublic click(event: Event): void {\n\t\tthis._click(event);\n\t}\n\n\tpublic mouseover(event: MouseEvent): void {\n\t\tthis._mouseover(event);\n\t}\n\n\tpublic mouseout(event: MouseEvent): void {\n\t\tthis._mouseout(event);\n\t}\n\n\tpublic show(): void {\n\t\tthis._show();\n\t}\n\n\tpublic hide(): void {\n\t\tthis._hide();\n\t}\n\n\tpublic toggle(): void {\n\t\tthis._toggle();\n\t}\n\n\tpublic getToggleElement(): HTMLElement {\n\t\treturn this._toggleElement;\n\t}\n\n\tpublic getContentElement(): HTMLElement {\n\t\treturn this._menuElement;\n\t}\n\n\tpublic isPermanent(): boolean {\n\t\treturn this._getOption('permanent') as boolean;\n\t}\n\n\tpublic disable(): void {\n\t\tthis._disabled = true;\n\t}\n\n\tpublic enable(): void {\n\t\tthis._disabled = false;\n\t}\n\n\tpublic isOpen(): boolean {\n\t\treturn this._isDropdownOpen();\n\t}\n\n\t// Static Methods\n\tpublic static getElement(reference: HTMLElement): HTMLElement {\n\t\tif (reference && reference.hasAttribute('data-kt-dropdown-initialized'))\n\t\t\treturn reference;\n\n\t\tconst findElement =\n\t\t\treference &&\n\t\t\t(reference.closest('[data-kt-dropdown-initialized]') as HTMLElement);\n\t\tif (findElement) return findElement;\n\n\t\t// Fallback: look for parent with data-kt-dropdown attribute\n\t\tif (reference) {\n\t\t\tconst dropdownContainer = reference.closest('[data-kt-dropdown]') as HTMLElement;\n\t\t\tif (dropdownContainer) return dropdownContainer;\n\t\t}\n\n\t\tif (\n\t\t\treference &&\n\t\t\treference.hasAttribute('data-kt-dropdown-menu') &&\n\t\t\tKTData.has(reference, 'dropdownElement')\n\t\t) {\n\t\t\treturn KTData.get(reference, 'dropdownElement') as HTMLElement;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTDropdown {\n\t\telement = this.getElement(element);\n\n\t\tif (!element) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (KTData.has(element, 'dropdown')) {\n\t\t\tconst instance = KTData.get(element, 'dropdown') as KTDropdown;\n\t\t\treturn instance;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-dropdown-initialized') === 'true') {\n\t\t\treturn new KTDropdown(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTDropdownConfigInterface,\n\t): KTDropdown {\n\t\treturn this.getInstance(element) || new KTDropdown(element, config);\n\t}\n\n\tpublic static update(): void {\n\t\tdocument\n\t\t\t.querySelectorAll('.open[data-kt-dropdown-initialized]')\n\t\t\t.forEach((item) => {\n\t\t\t\tif (KTData.has(item as HTMLElement, 'popper')) {\n\t\t\t\t\t(\n\t\t\t\t\t\tKTData.get(item as HTMLElement, 'popper') as PopperInstance\n\t\t\t\t\t).forceUpdate();\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tpublic static hide(skipElement?: HTMLElement): void {\n\t\tdocument\n\t\t\t.querySelectorAll(\n\t\t\t\t'.open[data-kt-dropdown-initialized]:not([data-kt-dropdown-permanent=\"true\"])',\n\t\t\t)\n\t\t\t.forEach((item) => {\n\t\t\t\tif (skipElement && (skipElement === item || item.contains(skipElement)))\n\t\t\t\t\treturn;\n\n\t\t\t\tconst dropdown = KTDropdown.getInstance(item as HTMLElement);\n\t\t\t\tif (dropdown) dropdown.hide();\n\t\t\t});\n\t}\n\n\tpublic static handleClickAway(): void {\n\t\tdocument.addEventListener('click', (event: Event) => {\n\t\t\tdocument\n\t\t\t\t.querySelectorAll(\n\t\t\t\t\t'.open[data-kt-dropdown-initialized]:not([data-kt-dropdown-permanent=\"true\"])',\n\t\t\t\t)\n\t\t\t\t.forEach((element) => {\n\t\t\t\t\tconst dropdown = KTDropdown.getInstance(element as HTMLElement);\n\t\t\t\t\tif (!dropdown) return;\n\n\t\t\t\t\tconst contentElement = dropdown.getContentElement();\n\t\t\t\t\tconst toggleElement = dropdown.getToggleElement();\n\n\t\t\t\t\tif (\n\t\t\t\t\t\ttoggleElement === event.target ||\n\t\t\t\t\t\ttoggleElement.contains(event.target as HTMLElement) ||\n\t\t\t\t\t\tcontentElement === event.target ||\n\t\t\t\t\t\tcontentElement.contains(event.target as HTMLElement)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdropdown.hide();\n\t\t\t\t});\n\t\t});\n\t}\n\n\tpublic static handleKeyboard(): void {\n\t\tdocument.addEventListener('keydown', (event: KeyboardEvent) => {\n\t\t\tconst dropdownEl = document.querySelector(\n\t\t\t\t'.open[data-kt-dropdown-initialized]',\n\t\t\t);\n\t\t\tconst dropdown = KTDropdown.getInstance(dropdownEl as HTMLElement);\n\t\t\tif (!dropdown || !dropdown._getOption('keyboard')) return;\n\n\t\t\tif (\n\t\t\t\tevent.key === 'Escape' &&\n\t\t\t\t!(event.ctrlKey || event.altKey || event.shiftKey)\n\t\t\t) {\n\t\t\t\tdropdown.hide();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic static handleMouseover(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-toggle], [data-kt-dropdown-menu]',\n\t\t\t'mouseover',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown && dropdown._getOption('trigger') === 'hover') {\n\t\t\t\t\tdropdown.mouseover(event as MouseEvent);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleMouseout(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-toggle], [data-kt-dropdown-menu]',\n\t\t\t'mouseout',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown && dropdown._getOption('trigger') === 'hover') {\n\t\t\t\t\tdropdown.mouseout(event as MouseEvent);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleClick(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-toggle]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown) {\n\t\t\t\t\tdropdown.click(event);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static handleDismiss(): void {\n\t\tKTEventHandler.on(\n\t\t\tdocument.body,\n\t\t\t'[data-kt-dropdown-dismiss]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tconst dropdown = KTDropdown.getInstance(target);\n\t\t\t\tif (dropdown) {\n\t\t\t\t\tdropdown.hide();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tpublic static initHandlers(): void {\n\t\tthis.handleClickAway();\n\t\tthis.handleKeyboard();\n\t\tthis.handleMouseover();\n\t\tthis.handleMouseout();\n\t\tthis.handleClick();\n\t\tthis.handleDismiss();\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-dropdown]');\n\t\telements.forEach((element) => {\n\t\t\tnew KTDropdown(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTDropdown.createInstances();\n\n\t\tif (window.KT_DROPDOWN_INITIALIZED !== true) {\n\t\t\tKTDropdown.initHandlers();\n\t\t\twindow.KT_DROPDOWN_INITIALIZED = true;\n\t\t}\n\t}\n\n\t/**\n\t * Force reinitialization of dropdowns by clearing KTData entries.\n\t * Useful for Livewire wire:navigate where persisted elements need reinitialization.\n\t */\n\tpublic static reinit(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-dropdown]');\n\t\telements.forEach((element) => {\n\t\t\ttry {\n\t\t\t\t// Get existing instance to clean up Popper\n\t\t\t\tconst instance = KTDropdown.getInstance(element as HTMLElement);\n\t\t\t\tif (instance && typeof instance.hide === 'function') {\n\t\t\t\t\tinstance.hide(); // This will destroy Popper\n\t\t\t\t}\n\t\t\t\t// Clear KTData entries\n\t\t\t\tKTData.remove(element as HTMLElement, 'dropdown');\n\t\t\t\tKTData.remove(element as HTMLElement, 'popper');\n\t\t\t\t// Remove initialization attribute to allow fresh initialization\n\t\t\t\telement.removeAttribute('data-kt-dropdown-initialized');\n\t\t\t\tconst menu = element.querySelector('[data-kt-dropdown-menu]');\n\t\t\t\tif (menu) {\n\t\t\t\t\tKTData.remove(menu as HTMLElement, 'dropdownElement');\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Ignore errors for individual elements\n\t\t\t}\n\t\t});\n\t\t// Now create fresh instances\n\t\tKTDropdown.createInstances();\n\n\t\t// Always ensure handlers are set up (similar to KTMenu.init() behavior)\n\t\t// Event handlers use delegation so they persist, but we ensure they're attached\n\t\tKTDropdown.initHandlers();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTDropdown = KTDropdown;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTDrawer } from './drawer';\nexport type { KTDrawerConfigInterface, KTDrawerInterface } from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nconst KTElementMap = new Map();\n\nconst KTData = {\n\tset(element: HTMLElement, key: string, value: unknown): void {\n\t\tif (!KTElementMap.has(element)) {\n\t\t\tKTElementMap.set(element, new Map());\n\t\t}\n\n\t\tconst valueMap = KTElementMap.get(element);\n\n\t\tvalueMap.set(key, value);\n\t},\n\n\tget(element: HTMLElement, key: string): unknown {\n\t\tif (KTElementMap.has(element)) {\n\t\t\treturn KTElementMap.get(element).get(key) || null;\n\t\t}\n\n\t\treturn null;\n\t},\n\n\thas(element: HTMLElement, key: string): boolean {\n\t\treturn KTElementMap.has(element) && KTElementMap.get(element).has(key);\n\t},\n\n\tremove(element: HTMLElement, key: string): void {\n\t\tif (!KTElementMap.has(element) || !KTElementMap.get(element).has(key)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst valueMap = KTElementMap.get(element);\n\n\t\tvalueMap.delete(key);\n\n\t\tif (valueMap.size === 0) {\n\t\t\tKTElementMap.delete(element);\n\t\t}\n\t},\n\n\t// Clear all data for a specific element (useful for reinitialization)\n\tclear(element: HTMLElement): void {\n\t\tKTElementMap.delete(element);\n\t},\n};\n\n// Expose KTData on window for external access (useful for Livewire wire:navigate)\nif (typeof window !== 'undefined') {\n\twindow.KTData = KTData;\n}\n\nexport default KTData;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTSelectConfigInterface } from './config';\nimport { KTSelect } from './select';\nimport { defaultTemplates } from './templates';\nimport { EventManager } from './utils';\n\n/**\n * KTSelectTags - Handles tags-specific functionality for KTSelect\n */\nexport class KTSelectTags {\n\tprivate _select: KTSelect;\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _valueDisplayElement: HTMLElement;\n\tprivate _eventManager: EventManager;\n\n\t/**\n\t * Constructor: Initializes the tags component\n\t */\n\tconstructor(select: KTSelect) {\n\t\tthis._select = select;\n\t\tthis._config = select.getConfig();\n\t\tthis._valueDisplayElement = select.getValueDisplayElement();\n\t\tthis._eventManager = new EventManager();\n\n\t}\n\n\t/**\n\t * Update selected tags display\n\t * Renders selected options as tags in the display element\n\t */\n\tpublic updateTagsDisplay(selectedOptions: string[]): void {\n\t\t// Remove any existing tag elements\n\t\tconst wrapper = this._valueDisplayElement.parentElement;\n\t\tif (!wrapper) return;\n\n\t\t// If no options selected, ensure placeholder is shown\n\t\tif (selectedOptions.length === 0) {\n\t\t\t// Clear any existing content and show placeholder\n\t\t\tthis._valueDisplayElement.innerHTML = '';\n\t\t\tconst placeholderEl = defaultTemplates.placeholder(this._config);\n\t\t\tthis._valueDisplayElement.appendChild(placeholderEl);\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear all existing content before adding tags\n\t\tthis._valueDisplayElement.innerHTML = '';\n\n\t\t// Insert each tag before the display element\n\t\tselectedOptions.forEach((optionValue) => {\n\t\t\t// Find the original option element (in dropdown or select)\n\t\t\tlet optionElement: HTMLOptionElement | null = null;\n\t\t\tconst optionElements = this._select.getOptionsElement();\n\t\t\tfor (const opt of Array.from(optionElements)) {\n\t\t\t\tif ((opt as HTMLElement).dataset.value === optionValue) {\n\t\t\t\t\toptionElement = opt as HTMLOptionElement;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!optionElement) {\n\t\t\t\tconst originalOptions = this._select\n\t\t\t\t\t.getElement()\n\t\t\t\t\t.querySelectorAll('option');\n\t\t\t\tfor (const opt of Array.from(originalOptions)) {\n\t\t\t\t\tif ((opt as HTMLOptionElement).value === optionValue) {\n\t\t\t\t\t\toptionElement = opt as HTMLOptionElement;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst tag = defaultTemplates.tag(optionElement, this._config);\n\n\t\t\t// Add event listener to the close button\n\t\t\tconst closeButton = tag.querySelector(\n\t\t\t\t'[data-kt-select-remove-button]',\n\t\t\t) as HTMLElement;\n\t\t\tif (closeButton) {\n\t\t\t\tthis._eventManager.addListener(closeButton, 'click', (event: Event) => {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\tthis._removeTag(optionValue);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Insert tag inside the display element\n\t\t\tthis._valueDisplayElement.appendChild(tag);\n\t\t});\n\t}\n\n\t/**\n\t * Remove a tag and its selection\n\t */\n\tprivate _removeTag(optionValue: string): void {\n\t\t// Delegate to the select component to handle state changes\n\t\tthis._select.toggleSelection(optionValue);\n\t}\n\n\t/**\n\t * Clean up resources used by this module\n\t */\n\tpublic destroy(): void {\n\t\tthis._eventManager.removeAllListeners(null);\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTComponent from '../component';\nimport KTData from '../../helpers/data';\nimport {\n\tKTToastOptions,\n\tKTToastConfig,\n\tKTToastInstance,\n\tKTToastPosition,\n} from './types';\n\nconst DEFAULT_CONFIG: KTToastConfig = {\n\tposition: 'top-end',\n\tduration: 4000,\n\tclassName: '',\n\tmaxToasts: 5,\n\toffset: 15,\n\tgap: 10,\n};\n\nconst DEFAULT_TOAST_OPTIONS: KTToastOptions = {\n\tappearance: 'solid',\n\tprogress: false,\n\tsize: 'md',\n\taction: false,\n\tcancel: false,\n\tdismiss: true,\n};\n\nimport type { KTToastConfigInterface, KTToastInterface } from './types';\n\nexport class KTToast extends KTComponent implements KTToastInterface {\n\tprotected override _name: string = 'toast';\n\tprotected override _defaultConfig: KTToastConfigInterface = DEFAULT_CONFIG;\n\tprotected override _config: KTToastConfigInterface = DEFAULT_CONFIG;\n\tprotected _defaultToastOptions: KTToastOptions = DEFAULT_TOAST_OPTIONS;\n\tprivate static containerMap: Map<KTToastPosition, HTMLElement> = new Map();\n\tprivate static toasts: Map<string, KTToastInstance> = new Map();\n\tprivate static globalConfig: KTToastConfig = { ...DEFAULT_CONFIG };\n\n\t/**\n\t * Creates a new KTToast instance for a specific element (not commonly used; most use static API).\n\t * @param element The target HTML element.\n\t * @param config Optional toast config for this instance.\n\t */\n\tconstructor(element: HTMLElement, config?: Partial<KTToastConfigInterface>) {\n\t\tsuper();\n\t\tif (KTData.has(element, this._name)) return;\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\t\tKTData.set(element, this._name, this);\n\t}\n\n\t/**\n\t * Generates the HTML content for a toast based on the provided options.\n\t * @param options Toast options (message, icon, actions, etc).\n\t * @returns The toast's HTML markup as a string.\n\t */\n\tstatic getContent(options?: KTToastOptions) {\n\t\tconst classNames = {\n\t\t\t...((this.globalConfig.classNames as any) || {}),\n\t\t\t...((options?.classNames as any) || {}),\n\t\t};\n\n\t\tif (options?.content) {\n\t\t\tif (typeof options.content === 'string') {\n\t\t\t\treturn options.content;\n\t\t\t} else if (typeof options.content === 'function') {\n\t\t\t\tconst node = options.content();\n\t\t\t\tif (node instanceof HTMLElement) {\n\t\t\t\t\treturn node.outerHTML;\n\t\t\t\t}\n\t\t\t} else if (options.content instanceof HTMLElement) {\n\t\t\t\treturn options.content.outerHTML;\n\t\t\t}\n\t\t}\n\n\t\tlet template = '';\n\n\t\tif (options?.icon) {\n\t\t\ttemplate +=\n\t\t\t\t'<div class=\"kt-alert-icon ' +\n\t\t\t\t(classNames.icon || '') +\n\t\t\t\t'\">' +\n\t\t\t\toptions.icon +\n\t\t\t\t'</div>';\n\t\t}\n\n\t\tif (options?.message) {\n\t\t\ttemplate +=\n\t\t\t\t'<div class=\"kt-alert-title ' +\n\t\t\t\t(classNames.message || '') +\n\t\t\t\t'\">' +\n\t\t\t\toptions.message +\n\t\t\t\t'</div>';\n\t\t}\n\n\t\tif (\n\t\t\toptions?.action !== false ||\n\t\t\toptions?.dismiss !== false ||\n\t\t\toptions?.cancel !== false\n\t\t) {\n\t\t\ttemplate +=\n\t\t\t\t'<div class=\"kt-alert-toolbar ' + (classNames.toolbar || '') + '\">';\n\t\t\ttemplate +=\n\t\t\t\t'<div class=\"kt-alert-actions ' + (classNames.actions || '') + '\">';\n\n\t\t\tif (options?.action && typeof options.action === 'object') {\n\t\t\t\ttemplate +=\n\t\t\t\t\t'<button data-kt-toast-action=\"true\" class=\"' +\n\t\t\t\t\t(options.action.className || '') +\n\t\t\t\t\t'\">' +\n\t\t\t\t\toptions.action.label +\n\t\t\t\t\t'</button>';\n\t\t\t}\n\n\t\t\tif (options?.cancel && typeof options.cancel === 'object') {\n\t\t\t\ttemplate +=\n\t\t\t\t\t'<button data-kt-toast-cancel=\"true\" class=\"' +\n\t\t\t\t\t(options.cancel.className || '') +\n\t\t\t\t\t'\">' +\n\t\t\t\t\toptions.cancel.label +\n\t\t\t\t\t'</button>';\n\t\t\t}\n\n\t\t\tif (options?.dismiss !== false) {\n\t\t\t\ttemplate +=\n\t\t\t\t\t'<button data-kt-toast-dismiss=\"true\" class=\"kt-alert-close\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg></button>';\n\t\t\t}\n\n\t\t\ttemplate += '</div>';\n\t\t\ttemplate += '</div>';\n\t\t}\n\n\t\ttemplate += '</div>';\n\n\t\treturn template;\n\t}\n\n\t/**\n\t * Update all toasts in the container with smooth animation.\n\t *\n\t * @param container The toast container element.\n\t * @param offset Optional offset from the edge.\n\t */\n\tstatic update(container: HTMLElement | null, offset?: number) {\n\t\tif (!container) return;\n\t\toffset =\n\t\t\ttypeof offset === 'number' ? offset : (this.globalConfig.offset ?? 15);\n\t\trequestAnimationFrame(() => {\n\t\t\tconst gap = this.globalConfig.gap ?? 8;\n\t\t\t// Group toasts by alignment (top/bottom)\n\t\t\tconst positionGroups: Record<string, HTMLElement[]> = {\n\t\t\t\ttop: [],\n\t\t\t\tbottom: [],\n\t\t\t};\n\t\t\tconst toasts = Array.from(container.children) as HTMLElement[];\n\t\t\ttoasts.forEach((toast) => {\n\t\t\t\tif (\n\t\t\t\t\ttoast.classList.contains('kt-toast-top-end') ||\n\t\t\t\t\ttoast.classList.contains('kt-toast-top-center') ||\n\t\t\t\t\ttoast.classList.contains('kt-toast-top-start')\n\t\t\t\t) {\n\t\t\t\t\tpositionGroups.top.push(toast);\n\t\t\t\t} else {\n\t\t\t\t\tpositionGroups.bottom.push(toast);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Stack top toasts from the top down\n\t\t\tlet currentOffset = offset;\n\t\t\tpositionGroups.top.forEach((toast) => {\n\t\t\t\ttoast.style.top = `${currentOffset}px`;\n\t\t\t\ttoast.style.bottom = '';\n\t\t\t\ttoast.style.transition =\n\t\t\t\t\t'top 0.28s cubic-bezier(.4,0,.2,1), opacity 0.28s cubic-bezier(.4,0,.2,1)';\n\t\t\t\tcurrentOffset += toast.offsetHeight + gap;\n\n\t\t\t\tif (toast.classList.contains('kt-toast-top-start')) {\n\t\t\t\t\ttoast.style.insetInlineStart = `${offset}px`;\n\t\t\t\t}\n\n\t\t\t\tif (toast.classList.contains('kt-toast-top-end')) {\n\t\t\t\t\ttoast.style.insetInlineEnd = `${offset}px`;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Stack bottom toasts from the bottom up\n\t\t\tcurrentOffset = offset;\n\t\t\tfor (let i = positionGroups.bottom.length - 1; i >= 0; i--) {\n\t\t\t\tconst toast = positionGroups.bottom[i];\n\t\t\t\ttoast.style.bottom = `${currentOffset}px`;\n\t\t\t\ttoast.style.top = '';\n\t\t\t\ttoast.style.transition =\n\t\t\t\t\t'bottom 0.28s cubic-bezier(.4,0,.2,1), opacity 0.28s cubic-bezier(.4,0,.2,1)';\n\t\t\t\tcurrentOffset += toast.offsetHeight + gap;\n\n\t\t\t\tif (toast.classList.contains('kt-toast-bottom-start')) {\n\t\t\t\t\ttoast.style.insetInlineStart = `${offset}px`;\n\t\t\t\t}\n\n\t\t\t\tif (toast.classList.contains('kt-toast-bottom-end')) {\n\t\t\t\t\ttoast.style.insetInlineEnd = `${offset}px`;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Set global toast configuration options.\n\t * @param options Partial toast config to merge with global config.\n\t */\n\tstatic config(options: Partial<KTToastConfig>) {\n\t\tthis.globalConfig = { ...this.globalConfig, ...options };\n\t}\n\n\t/**\n\t * Show a toast notification.\n\t * @param inputOptions Toast options (message, duration, variant, etc).\n\t * @returns Toast instance with dismiss method, or undefined if invalid input.\n\t */\n\tstatic show(\n\t\tinputOptions?: KTToastOptions,\n\t): (KTToastInstance & { dismiss: () => void }) | undefined {\n\t\tconst options = { ...DEFAULT_TOAST_OPTIONS, ...inputOptions };\n\n\t\tif (!options || (!options.message && !options.content)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Always resolve the id once and use it everywhere\n\t\tconst id = `kt-toast-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n\t\tconst position =\n\t\t\toptions.position || this.globalConfig.position || 'top-end';\n\n\t\tconst classNames = {\n\t\t\t...((this.globalConfig.classNames as any) || {}),\n\t\t\t...((options.classNames as any) || {}),\n\t\t};\n\n\t\tlet container = this.containerMap.get(position);\n\n\t\tif (!container) {\n\t\t\tcontainer = document.createElement('div');\n\t\t\tconst classNames = {\n\t\t\t\t...((this.globalConfig.classNames as any) || {}),\n\t\t\t\t...((options.classNames as any) || {}),\n\t\t\t};\n\t\t\t// Fallback to default hardcoded classes if not provided in options or globalConfig\n\t\t\tcontainer.className =\n\t\t\t\tclassNames.container || `kt-toast-container ${position}`;\n\t\t\tdocument.body.appendChild(container);\n\t\t\tthis.containerMap.set(position, container);\n\t\t}\n\n\t\t// Enforce maxToasts\n\t\tif (\n\t\t\tcontainer.children.length >=\n\t\t\t(this.globalConfig.maxToasts || DEFAULT_CONFIG.maxToasts)\n\t\t) {\n\t\t\tconst firstToast = container.firstElementChild;\n\t\t\tif (firstToast) {\n\t\t\t\tfirstToast.classList.add('kt-toast-closing');\n\t\t\t\tfirstToast.addEventListener('animationend', () => {\n\t\t\t\t\tfirstToast.remove();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Create toast element\n\t\tconst variantMap = {\n\t\t\tinfo: 'kt-alert-info',\n\t\t\tsuccess: 'kt-alert-success',\n\t\t\terror: 'kt-alert-error',\n\t\t\twarning: 'kt-alert-warning',\n\t\t\tprimary: 'kt-alert-primary',\n\t\t\tsecondary: 'kt-alert-secondary',\n\t\t\tdestructive: 'kt-alert-destructive',\n\t\t\tmono: 'kt-alert-mono',\n\t\t};\n\n\t\tconst appearanceMap = {\n\t\t\tsolid: 'kt-alert-solid',\n\t\t\toutline: 'kt-alert-outline',\n\t\t\tlight: 'kt-alert-light',\n\t\t};\n\n\t\tconst sizeMap = {\n\t\t\tsm: 'kt-alert-sm',\n\t\t\tmd: 'kt-alert-md',\n\t\t\tlg: 'kt-alert-lg',\n\t\t};\n\n\t\tconst toast = document.createElement('div');\n\t\ttoast.className = `kt-toast kt-alert ${variantMap[options.variant] || ''} ${appearanceMap[options.appearance] || ''} ${sizeMap[options.size] || ''} ${options.className || ''} ${classNames.toast || ''}`;\n\t\t// ARIA support\n\t\ttoast.setAttribute('role', options.role || 'status');\n\t\ttoast.setAttribute('aria-live', 'polite');\n\t\ttoast.setAttribute('aria-atomic', 'true');\n\t\ttoast.setAttribute('tabindex', '0');\n\n\t\t// Always resolve the id once and use it everywhere\n\t\t// Always resolve id ONCE at the top, use everywhere\n\t\t// (Move this up to replace the previous const id = ... assignment)\n\n\t\t// Populate content via getContent\n\t\tconst contentHtml = KTToast.getContent(options);\n\t\ttoast.innerHTML = contentHtml;\n\n\t\t// Assign event handlers to buttons by data attribute\n\t\tconst actionBtn = toast.querySelector(\n\t\t\t'[data-kt-toast-action]',\n\t\t) as HTMLButtonElement | null;\n\n\t\tif (\n\t\t\tactionBtn &&\n\t\t\toptions.action &&\n\t\t\ttypeof options.action === 'object' &&\n\t\t\toptions.action.onClick\n\t\t) {\n\t\t\tactionBtn.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tif (typeof options.action === 'object' && options.action.onClick) {\n\t\t\t\t\toptions.action.onClick(id);\n\t\t\t\t\tKTToast.close(id);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst cancelBtn = toast.querySelector(\n\t\t\t'[data-kt-toast-cancel]',\n\t\t) as HTMLButtonElement | null;\n\n\t\tif (cancelBtn && options.cancel && typeof options.cancel === 'object') {\n\t\t\tcancelBtn.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tif (typeof options.cancel === 'object' && options.cancel.onClick) {\n\t\t\t\t\toptions.cancel.onClick(id);\n\t\t\t\t\tKTToast.close(id);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Dismiss button handler\n\t\tconst dismissBtn = toast.querySelector(\n\t\t\t'[data-kt-toast-dismiss]',\n\t\t) as HTMLButtonElement | null;\n\n\t\tif (dismissBtn && options.dismiss !== false) {\n\t\t\tdismissBtn.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tKTToast.close(id);\n\t\t\t});\n\t\t}\n\n\t\t// If modal-like, set aria-modal\n\t\tif (options.important) toast.setAttribute('aria-modal', 'true');\n\t\ttoast.style.pointerEvents = 'auto';\n\n\t\t// Progress line\n\t\tconst duration = options.important\n\t\t\t? null\n\t\t\t: (options.duration ??\n\t\t\t\tthis.globalConfig.duration ??\n\t\t\t\tDEFAULT_CONFIG.duration);\n\n\t\tif (duration && options.progress) {\n\t\t\tconst progress = document.createElement('div');\n\t\t\tprogress.className = 'kt-toast-progress ' + (classNames.progress || '');\n\t\t\tprogress.style.animationDuration = duration + 'ms';\n\t\t\tprogress.setAttribute('data-kt-toast-progress', 'true');\n\t\t\ttoast.appendChild(progress);\n\t\t}\n\n\t\t// Assign direction class to the toast itself, not the container\n\t\tconst directionClassMap: Record<string, string> = {\n\t\t\t'top-end': 'kt-toast-top-end',\n\t\t\t'top-center': 'kt-toast-top-center',\n\t\t\t'top-start': 'kt-toast-top-start',\n\t\t\t'bottom-end': 'kt-toast-bottom-end',\n\t\t\t'bottom-center': 'kt-toast-bottom-center',\n\t\t\t'bottom-start': 'kt-toast-bottom-start',\n\t\t};\n\t\tObject.values(directionClassMap).forEach((cls) =>\n\t\t\ttoast.classList.remove(cls),\n\t\t);\n\t\tconst dirClass = directionClassMap[position] || 'kt-toast-top-end';\n\t\ttoast.classList.add(dirClass);\n\n\t\t// Enforce maxToasts: remove oldest if needed\n\t\tconst maxToasts =\n\t\t\toptions.maxToasts ??\n\t\t\tthis.globalConfig.maxToasts ??\n\t\t\tDEFAULT_CONFIG.maxToasts;\n\t\tconst currentToasts = Array.from(container.children) as HTMLElement[];\n\t\tif (currentToasts.length >= maxToasts && currentToasts.length > 0) {\n\t\t\tconst oldestToast = currentToasts[currentToasts.length - 1];\n\t\t\tconst oldestId = oldestToast.getAttribute('data-kt-toast-id');\n\t\t\tif (oldestId) {\n\t\t\t\tKTToast.close(oldestId);\n\t\t\t} else {\n\t\t\t\toldestToast.remove();\n\t\t\t}\n\t\t}\n\n\t\t// Insert toast at the top\n\t\tcontainer.insertBefore(toast, container.firstChild);\n\t\tKTToast.update(container);\n\n\t\t// Play beep if requested\n\t\tif (options.beep) {\n\t\t\ttry {\n\t\t\t\t// Use Web Audio API for a short beep\n\t\t\t\tconst ctx = new (window.AudioContext ||\n\t\t\t\t\t(window as any).webkitAudioContext)();\n\t\t\t\tconst o = ctx.createOscillator();\n\t\t\t\tconst g = ctx.createGain();\n\t\t\t\to.type = 'sine';\n\t\t\t\to.frequency.value = 880;\n\t\t\t\tg.gain.value = 0.09;\n\t\t\t\to.connect(g);\n\t\t\t\tg.connect(ctx.destination);\n\t\t\t\to.start();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\to.stop();\n\t\t\t\t\tctx.close();\n\t\t\t\t}, 120);\n\t\t\t} catch (e) {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t}\n\n\t\tKTToast._fireEventOnElement(toast, 'show', { id });\n\t\tKTToast._dispatchEventOnElement(toast, 'show', { id });\n\t\tconst instance: KTToastInstance = { id, element: toast, timeoutId: 0 };\n\t\tKTToast.toasts.set(id, instance);\n\n\t\t// Auto-dismiss\n\t\tlet timeoutId: number | undefined = undefined;\n\t\tlet remaining = duration;\n\t\tlet startTime: number | undefined;\n\t\tlet paused = false;\n\t\tlet progressEl: HTMLElement | null = null;\n\t\tif (duration) {\n\t\t\tconst startTimer = (ms: number) => {\n\t\t\t\tstartTime = Date.now();\n\t\t\t\ttimeoutId = window.setTimeout(() => {\n\t\t\t\t\toptions.onAutoClose?.(id);\n\t\t\t\t\tKTToast.close(id);\n\t\t\t\t}, ms);\n\t\t\t\tinstance.timeoutId = timeoutId;\n\t\t\t};\n\t\t\tstartTimer(duration);\n\n\t\t\tif (options.pauseOnHover) {\n\t\t\t\tprogressEl = toast.querySelector('[data-kt-toast-progress]');\n\t\t\t\tlet progressPausedAt = 0;\n\t\t\t\tconst pause = () => {\n\t\t\t\t\tif (!paused && timeoutId) {\n\t\t\t\t\t\tpaused = true;\n\t\t\t\t\t\twindow.clearTimeout(timeoutId);\n\t\t\t\t\t\tif (startTime) {\n\t\t\t\t\t\t\tremaining -= Date.now() - startTime;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Pause progress bar\n\t\t\t\t\t\tif (progressEl) {\n\t\t\t\t\t\t\tconst computedStyle = window.getComputedStyle(progressEl);\n\t\t\t\t\t\t\tconst matrix = computedStyle.transform;\n\t\t\t\t\t\t\tlet scaleX = 1;\n\t\t\t\t\t\t\tif (matrix && matrix !== 'none') {\n\t\t\t\t\t\t\t\tconst values = matrix.match(/matrix\\(([^)]+)\\)/);\n\t\t\t\t\t\t\t\tif (values && values[1]) {\n\t\t\t\t\t\t\t\t\tscaleX = parseFloat(values[1].split(',')[0]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tprogressPausedAt = scaleX;\n\t\t\t\t\t\t\tprogressEl.style.animation = 'none';\n\t\t\t\t\t\t\tprogressEl.style.transition = 'none';\n\t\t\t\t\t\t\tprogressEl.style.transform = `scaleX(${scaleX})`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst resume = () => {\n\t\t\t\t\tif (paused && remaining > 0) {\n\t\t\t\t\t\tpaused = false;\n\t\t\t\t\t\tstartTimer(remaining);\n\t\t\t\t\t\t// Resume progress bar\n\t\t\t\t\t\tif (progressEl) {\n\t\t\t\t\t\t\tprogressEl.style.transition = 'transform 0ms';\n\t\t\t\t\t\t\tprogressEl.style.transform = `scaleX(${progressPausedAt})`;\n\t\t\t\t\t\t\tprogressEl.offsetHeight; // force reflow\n\t\t\t\t\t\t\tprogressEl.style.transition = `transform ${remaining}ms linear`;\n\t\t\t\t\t\t\tprogressEl.style.transform = 'scaleX(0)';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\ttoast.addEventListener('mouseenter', pause);\n\t\t\t\ttoast.addEventListener('mouseleave', resume);\n\t\t\t}\n\t\t}\n\n\t\tKTToast._fireEventOnElement(toast, 'shown', { id });\n\t\tKTToast._dispatchEventOnElement(toast, 'shown', { id });\n\n\t\treturn {\n\t\t\t...instance,\n\t\t\tdismiss: () => KTToast.close(id),\n\t\t};\n\t}\n\n\t/**\n\t * Close and remove all active toasts.\n\t */\n\tstatic clearAll(clearContainers: boolean = false) {\n\t\tfor (const id of Array.from(this.toasts.keys())) {\n\t\t\tconsole.log('clearAll:', id);\n\t\t\tthis.close(id);\n\t\t}\n\t\tif (clearContainers) {\n\t\t\t// Remove all containers from the DOM.\n\t\t\tthis.containerMap.forEach((container, position) => {\n\t\t\t\tcontainer.remove();\n\t\t\t\tconsole.log('clearAll: removed container for position', position);\n\t\t\t});\n\t\t\t// Clear containerMap to prevent stale references.\n\t\t\tthis.containerMap.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Close a toast by ID or instance.\n\t * @param idOrInstance Toast ID string or KTToastInstance.\n\t */\n\tstatic close(idOrInstance?: string | KTToastInstance) {\n\t\tlet inst: (KTToastInstance & { _closing?: boolean }) | undefined;\n\t\tlet id: string | undefined;\n\t\tif (!idOrInstance) return;\n\t\tif (typeof idOrInstance === 'string') {\n\t\t\tid = idOrInstance;\n\t\t\tinst = this.toasts.get(id);\n\t\t} else if (typeof idOrInstance === 'object' && idOrInstance.id) {\n\t\t\tid = idOrInstance.id;\n\t\t\tinst = idOrInstance as KTToastInstance & { _closing?: boolean };\n\t\t}\n\n\t\tif (!inst || !id) return;\n\t\tif (inst._closing) return; // Prevent double-close\n\t\tinst._closing = true;\n\n\t\tclearTimeout(inst.timeoutId);\n\n\t\tKTToast._fireEventOnElement(inst.element, 'hide', { id });\n\t\tKTToast._dispatchEventOnElement(inst.element, 'hide', { id });\n\t\t// Remove progress bar instantly if present\n\t\tconst progressEl = inst.element.querySelector('[data-kt-toast-progress]');\n\t\tif (progressEl) progressEl.remove();\n\t\tinst.element.style.animation = 'kt-toast-out 0.25s forwards';\n\n\t\tsetTimeout(() => {\n\t\t\tconst parent = inst?.element.parentElement as HTMLElement | null;\n\t\t\tinst?.element.remove();\n\t\t\tKTToast.toasts.delete(id!);\n\t\t\t// Try to call onDismiss if available in the toast instance (if stored)\n\t\t\tif (typeof (inst as any).options?.onDismiss === 'function') {\n\t\t\t\t(inst as any).options.onDismiss(id);\n\t\t\t}\n\t\t\tKTToast._fireEventOnElement(inst.element, 'hidden', { id });\n\t\t\tKTToast._dispatchEventOnElement(inst.element, 'hidden', { id });\n\t\t\t// update toasts asynchronously after DOM update\n\t\t\tsetTimeout(() => {\n\t\t\t\tKTToast.update(parent);\n\t\t\t}, 0);\n\t\t}, 250);\n\t}\n\n\t/**\n\t * Dispatches a custom 'kt.toast.{eventType}' event on the given element.\n\t * @param element The toast element.\n\t * @param eventType The event type (e.g. 'show', 'hide').\n\t * @param payload Optional event detail payload.\n\t */\n\tprivate static _fireEventOnElement(\n\t\telement: HTMLElement,\n\t\teventType: string,\n\t\tpayload?: object,\n\t) {\n\t\tconst event = new CustomEvent(`kt.toast.${eventType}`, { detail: payload });\n\t\telement.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Dispatches a custom event (not namespaced) on the given element.\n\t * @param element The toast element.\n\t * @param eventType The event type.\n\t * @param payload Optional event detail payload.\n\t */\n\tprivate static _dispatchEventOnElement(\n\t\telement: HTMLElement,\n\t\teventType: string,\n\t\tpayload?: object,\n\t) {\n\t\tconst event = new CustomEvent(eventType, { detail: payload });\n\t\telement.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Initialize toast system (placeholder for future use).\n\t */\n\tpublic static init(): void {}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n/* eslint-disable max-len */\nimport KTUtils from './utils';\nimport { KTOffsetType, KTOptionType, KTViewPortType } from '../types';\n\nconst KTDom = {\n\tisRTL(): boolean {\n\t\tconst htmlTag = document.documentElement; // Access the <html> tag\n\n\t\t// Check if the \"dir\" attribute is present and its value is \"rtl\"\n\t\tconst dir = htmlTag.getAttribute('dir');\n\n\t\treturn dir === 'rtl';\n\t},\n\n\tisElement(element: HTMLElement): boolean {\n\t\tif (element && element instanceof HTMLElement) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n\n\tgetElement(element: HTMLElement | string): HTMLElement {\n\t\tif (this.isElement(element)) {\n\t\t\treturn element as HTMLElement;\n\t\t}\n\n\t\tif (element && (element as string).length > 0) {\n\t\t\treturn document.querySelector(KTUtils.parseSelector(element as string));\n\t\t}\n\n\t\treturn null;\n\t},\n\n\tremove(element: HTMLElement): void {\n\t\tif (this.isElement(element) && element.parentNode) {\n\t\t\telement.parentNode.removeChild(element);\n\t\t}\n\t},\n\n\thasClass(element: HTMLElement, className: string): boolean {\n\t\t// Split classNames string into an array of individual class names\n\t\tconst classes = className.split(' ');\n\n\t\t// Loop through each class name\n\t\tfor (const className of classes) {\n\t\t\t// Check if the element has the current class name\n\t\t\tif (!element.classList.contains(className)) {\n\t\t\t\t// Return false if any class is missing\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Return true if all classes are present\n\t\treturn true;\n\t},\n\n\taddClass(element: HTMLElement, className: string): void {\n\t\tconst classNames = className.split(' ');\n\n\t\tif (element.classList) {\n\t\t\tfor (let i = 0; i < classNames.length; i++) {\n\t\t\t\tif (classNames[i] && classNames[i].length > 0) {\n\t\t\t\t\telement.classList.add(classNames[i].trim());\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!this.hasClass(element, className)) {\n\t\t\tfor (let x = 0; x < classNames.length; x++) {\n\t\t\t\telement.className += ' ' + classNames[x].trim();\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveClass(element: HTMLElement, className: string): void {\n\t\tconst classNames = className.split(' ');\n\n\t\tif (element.classList) {\n\t\t\tfor (let i = 0; i < classNames.length; i++) {\n\t\t\t\telement.classList.remove(classNames[i].trim());\n\t\t\t}\n\t\t} else if (this.hasClass(element, className)) {\n\t\t\tfor (let x = 0; x < classNames.length; x++) {\n\t\t\t\telement.className = element.className.replace(\n\t\t\t\t\tnew RegExp('\\\\b' + classNames[x].trim() + '\\\\b', 'g'),\n\t\t\t\t\t'',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\tgetCssProp(element: HTMLElement, prop: string): string {\n\t\treturn (\n\t\t\telement ? window.getComputedStyle(element).getPropertyValue(prop) : ''\n\t\t).replace(' ', '');\n\t},\n\n\tsetCssProp(element: HTMLElement, prop: string, value: string) {\n\t\tif (element) {\n\t\t\twindow.getComputedStyle(element).setProperty(prop, value);\n\t\t}\n\t},\n\n\toffset(element: HTMLElement): KTOffsetType {\n\t\tif (!element) return { top: 0, left: 0, right: 0, bottom: 0 };\n\n\t\tconst rect = element.getBoundingClientRect();\n\n\t\treturn {\n\t\t\ttop: rect.top,\n\t\t\tleft: rect.left,\n\t\t\tright: window.innerWidth - rect.right,\n\t\t\tbottom: window.innerHeight - rect.top,\n\t\t};\n\t},\n\n\tgetIndex(element: HTMLElement): number {\n\t\tconst children = Array.from(element.parentNode?.children || []);\n\t\treturn children.indexOf(element);\n\t},\n\n\tparents(element: HTMLElement, selector: string): Array<HTMLElement> {\n\t\tconst parents: Array<HTMLElement> = [];\n\n\t\t// Push each parent element to the array\n\t\tfor (\n\t\t\telement && element !== document.documentElement;\n\t\t\t(element = element.parentElement as HTMLElement);\n\n\t\t) {\n\t\t\tif (selector) {\n\t\t\t\tif (element.matches(selector)) {\n\t\t\t\t\tparents.push(element as HTMLElement);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tparents.push(element as HTMLElement);\n\t\t}\n\n\t\t// Return our parent array\n\t\treturn parents;\n\t},\n\n\tsiblings(element: HTMLElement) {\n\t\tconst parent = element.parentNode;\n\t\tif (!parent) return [];\n\t\treturn Array.from(parent.children).filter((child) => child !== element);\n\t},\n\n\tchildren(element: HTMLElement, selector: string): Array<HTMLElement> {\n\t\tif (!element || !element.childNodes) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst result: Array<HTMLElement> = [];\n\t\tconst l = element.childNodes.length;\n\t\tlet i = 0;\n\n\t\tfor (i = 0; i < l; i++) {\n\t\t\tif (\n\t\t\t\telement.childNodes[i].nodeType == 1 &&\n\t\t\t\t(element.childNodes[i] as HTMLElement).matches(selector)\n\t\t\t) {\n\t\t\t\tresult.push(element.childNodes[i] as HTMLElement);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t},\n\n\tchild(element: HTMLElement, selector: string): HTMLElement {\n\t\tconst children = KTDom.children(element, selector);\n\n\t\treturn children ? children[0] : null;\n\t},\n\n\tisVisible(element: HTMLElement): boolean {\n\t\tif (!this.isElement(element) || element.getClientRects().length === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// eslint-disable-next-line max-len\n\t\treturn (\n\t\t\tgetComputedStyle(element).getPropertyValue('visibility') === 'visible'\n\t\t);\n\t},\n\n\tisDisabled(\n\t\telement: HTMLInputElement | HTMLSelectElement | HTMLButtonElement,\n\t): boolean {\n\t\tif (!element || element.nodeType !== Node.ELEMENT_NODE) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (element.classList.contains('disabled')) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (typeof element.disabled !== 'undefined') {\n\t\t\treturn element.disabled;\n\t\t}\n\n\t\treturn (\n\t\t\telement.hasAttribute('disabled') &&\n\t\t\telement.getAttribute('disabled') !== 'false'\n\t\t);\n\t},\n\n\ttransitionEnd(element: HTMLElement, callback: CallableFunction): void {\n\t\tconst duration: number = this.getCSSTransitionDuration(element);\n\n\t\tsetTimeout(() => {\n\t\t\tcallback();\n\t\t}, duration);\n\t},\n\n\tanimationEnd(element: HTMLElement, callback: CallableFunction): void {\n\t\tconst duration: number = this.getCSSAnimationDuration(element);\n\n\t\tsetTimeout(() => {\n\t\t\tcallback();\n\t\t}, duration);\n\t},\n\n\tgetCSSTransitionDuration(element: HTMLElement): number {\n\t\treturn (\n\t\t\tparseFloat(window.getComputedStyle(element).transitionDuration) * 1000\n\t\t);\n\t},\n\n\tgetCSSAnimationDuration(element: HTMLElement): number {\n\t\treturn (\n\t\t\tparseFloat(window.getComputedStyle(element).animationDuration) * 1000\n\t\t);\n\t},\n\n\treflow(element: HTMLElement): void {\n\t\telement.offsetHeight;\n\t},\n\n\tinsertAfter(element: HTMLElement, referenceNode: HTMLElement) {\n\t\tconst parentNode = referenceNode.parentNode;\n\t\tif (parentNode) {\n\t\t\tparentNode.insertBefore(element, referenceNode.nextSibling);\n\t\t}\n\t},\n\n\tgetHighestZindex(element: HTMLElement): number {\n\t\tlet position: string, value: number;\n\n\t\twhile (element && element !== document.documentElement) {\n\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t\t// This makes behavior of this function consistent across browsers\n\t\t\t// WebKit always returns auto if the element is positioned\n\t\t\tposition = element.style.position;\n\n\t\t\tif (\n\t\t\t\tposition === 'absolute' ||\n\t\t\t\tposition === 'relative' ||\n\t\t\t\tposition === 'fixed'\n\t\t\t) {\n\t\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t\t// other browsers return a string\n\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\t\tvalue = parseInt(element.style.zIndex);\n\n\t\t\t\tif (!isNaN(value) && value !== 0) {\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\telement = element.parentNode as HTMLElement;\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\tisParentOrElementHidden(element: HTMLElement): boolean {\n\t\tif (!element) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst computedStyle = window.getComputedStyle(element);\n\n\t\tif (computedStyle.display === 'none') {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn this.isParentOrElementHidden(element.parentElement);\n\t},\n\n\tgetViewPort(): KTViewPortType {\n\t\treturn {\n\t\t\twidth: window.innerWidth,\n\t\t\theight: window.innerHeight,\n\t\t};\n\t},\n\n\tgetScrollTop() {\n\t\treturn (document.scrollingElement || document.documentElement).scrollTop;\n\t},\n\n\tisInViewport(element: HTMLElement): boolean {\n\t\tconst rect = element.getBoundingClientRect();\n\n\t\treturn (\n\t\t\trect.top >= 0 &&\n\t\t\trect.left >= 0 &&\n\t\t\trect.bottom <=\n\t\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t\t);\n\t},\n\n\tisPartiallyInViewport(element: HTMLElement): boolean {\n\t\tconst x = element.getBoundingClientRect().left;\n\t\tconst y = element.getBoundingClientRect().top;\n\t\tconst ww = Math.max(\n\t\t\tdocument.documentElement.clientWidth,\n\t\t\twindow.innerWidth || 0,\n\t\t);\n\t\tconst hw = Math.max(\n\t\t\tdocument.documentElement.clientHeight,\n\t\t\twindow.innerHeight || 0,\n\t\t);\n\t\tconst w = element.clientWidth;\n\t\tconst h = element.clientHeight;\n\n\t\treturn y < hw && y + h > 0 && x < ww && x + w > 0;\n\t},\n\n\tisVisibleInParent(child: HTMLElement, parent: HTMLElement): boolean {\n\t\tconst childRect = child.getBoundingClientRect();\n\t\tconst parentRect = parent.getBoundingClientRect();\n\n\t\t// Check if the child element is visible\n\t\tif (\n\t\t\tchild.offsetParent === null ||\n\t\t\tgetComputedStyle(child).visibility === 'hidden' ||\n\t\t\tgetComputedStyle(child).display === 'none'\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if the child is within the vertical bounds of the parent\n\t\tconst isVisibleVertically =\n\t\t\tchildRect.top >= parentRect.top && childRect.bottom <= parentRect.bottom;\n\n\t\t// Check if the child is within the horizontal bounds of the parent\n\t\tconst isVisibleHorizontally =\n\t\t\tchildRect.left >= parentRect.left && childRect.right <= parentRect.right;\n\n\t\treturn isVisibleVertically && isVisibleHorizontally;\n\t},\n\n\tgetRelativeTopPosition(child: HTMLElement, parent: HTMLElement): number {\n\t\tconst childRect = child.getBoundingClientRect();\n\t\tconst parentRect = parent.getBoundingClientRect();\n\n\t\t// Calculate the relative top position\n\t\tconst relativeTop = childRect.top - parentRect.top;\n\n\t\treturn relativeTop;\n\t},\n\n\tgetDataAttributes(element: HTMLElement, prefix: string): object {\n\t\tif (!element) {\n\t\t\treturn {};\n\t\t}\n\n\t\tprefix = KTUtils.camelCase(prefix);\n\n\t\tconst attributes: { [key: string]: KTOptionType } = {};\n\t\tconst keys = Object.keys(element.dataset).filter((key) =>\n\t\t\tkey.startsWith(prefix),\n\t\t);\n\n\t\tfor (const key of keys) {\n\t\t\tlet normalizedKey = key.replace(prefix, '');\n\t\t\tnormalizedKey = KTUtils.uncapitalize(normalizedKey);\n\t\t\tattributes[normalizedKey] = KTUtils.parseDataAttribute(\n\t\t\t\telement.dataset[key],\n\t\t\t);\n\t\t}\n\n\t\treturn attributes;\n\t},\n\n\tready(callback: CallableFunction): void {\n\t\tif (document.readyState === 'loading') {\n\t\t\tdocument.addEventListener('DOMContentLoaded', () => {\n\t\t\t\tcallback();\n\t\t\t});\n\t\t} else {\n\t\t\tcallback();\n\t\t}\n\t},\n};\n\nexport default KTDom;\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\n// utils.ts\n\nimport { defaultTemplates } from './templates';\nimport { KTSelectConfigInterface } from './config';\n\n/**\n * Format a number as a currency string\n */\nexport function formatCurrency(value: number): string {\n\treturn new Intl.NumberFormat('en-US', {\n\t\tstyle: 'currency',\n\t\tcurrency: 'USD',\n\t}).format(value);\n}\n\n/**\n * Filter options based on a search query\n */\nexport function filterOptions(\n\toptions: HTMLElement[],\n\tquery: string,\n\tconfig: KTSelectConfigInterface,\n\tdropdownElement: HTMLElement,\n\tonVisibleCount?: (count: number) => void,\n): number {\n\tlet visibleOptionsCount = 0;\n\n\t// For empty query, make all options visible\n\t// The KTSelectSearch class is now responsible for restoring original content before calling this.\n\tif (!query || query.trim() === '') {\n\t\tfor (const option of options) {\n\t\t\toption.classList.remove('hidden');\n\t\t\t// Remove inline display style if it was used to hide\n\t\t\tif (option.style.display === 'none') {\n\t\t\t\toption.style.display = '';\n\t\t\t}\n\t\t\t// At this point, option.innerHTML should be its original.\n\t\t\tvisibleOptionsCount++;\n\t\t}\n\n\t\tif (onVisibleCount) {\n\t\t\tonVisibleCount(visibleOptionsCount);\n\t\t}\n\t\treturn visibleOptionsCount;\n\t}\n\n\tconst queryLower = query.toLowerCase();\n\n\tfor (const option of options) {\n\t\t// Use data-text for matching if available, otherwise fall back to textContent\n\t\tconst optionText = (\n\t\t\toption.dataset.text ||\n\t\t\toption.textContent ||\n\t\t\t''\n\t\t).toLowerCase();\n\t\tconst isMatch = optionText.includes(queryLower);\n\n\t\tif (isMatch) {\n\t\t\toption.classList.remove('hidden');\n\t\t\tif (option.style.display === 'none') option.style.display = ''; // Ensure visible\n\t\t\tvisibleOptionsCount++;\n\t\t} else {\n\t\t\toption.classList.add('hidden');\n\t\t}\n\n\t\t// Early exit if maxItems limit is reached (optional)\n\t\t// if (config.searchMaxItems && visibleOptionsCount >= config.searchMaxItems) {\n\t\t// \tbreak;\n\t\t// }\n\t}\n\n\tif (onVisibleCount) {\n\t\tonVisibleCount(visibleOptionsCount);\n\t}\n\n\treturn visibleOptionsCount;\n}\n\n/**\n * Focus manager for keyboard navigation\n * Consolidates redundant focus management logic into shared functions\n */\nexport class FocusManager {\n\tprivate _element: HTMLElement;\n\tprivate _optionsSelector: string;\n\tprivate _focusedOptionIndex: number | null = null;\n\tprivate _focusClass: string;\n\tprivate _hoverClass: string;\n\tprivate _eventManager: EventManager;\n\tprivate _onFocusChange:\n\t\t| ((option: HTMLElement | null, index: number | null) => void)\n\t\t| null = null;\n\n\tconstructor(\n\t\telement: HTMLElement,\n\t\toptionsSelector: string = '[data-kt-select-option]',\n\t\tconfig?: KTSelectConfigInterface,\n\t) {\n\t\tthis._element = element;\n\t\tthis._optionsSelector = optionsSelector;\n\t\tthis._eventManager = new EventManager();\n\n\t\t// Add click handler to update focus state when options are clicked\n\t\tthis._setupOptionClickHandlers();\n\n\t\tthis._focusClass = 'focus'; // or whatever your intended class is\n\t\tthis._hoverClass = 'hover'; // or your intended class\n\t}\n\n\t/**\n\t * Set up click handlers for all options to update focus state\n\t */\n\tprivate _setupOptionClickHandlers(): void {\n\t\t// Add click handler to the options container\n\t\tthis._eventManager.addListener(this._element, 'click', (e: Event) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst optionElement = target.closest(this._optionsSelector);\n\n\t\t\tif (optionElement) {\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Get all visible options\n\t */\n\tpublic getVisibleOptions(): HTMLElement[] {\n\t\treturn Array.from(\n\t\t\tthis._element.querySelectorAll(this._optionsSelector),\n\t\t).filter((option) => {\n\t\t\tconst element = option as HTMLElement;\n\t\t\t// Check only for hidden class\n\t\t\tif (element.classList.contains('hidden')) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Also check inline styles for backward compatibility\n\t\t\tif (element.style.display === 'none') {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}) as HTMLElement[];\n\t}\n\n\t/**\n\t * Focus the first visible option\n\t */\n\tpublic focusFirst(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\t\tfor (let i = 0; i < options.length; i++) {\n\t\t\tconst option = options[i];\n\t\t\tif (\n\t\t\t\t!option.classList.contains('disabled') &&\n\t\t\t\toption.getAttribute('aria-disabled') !== 'true'\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = i;\n\t\t\t\tthis.applyFocus(option);\n\t\t\t\tthis.scrollIntoView(option);\n\t\t\t\treturn option;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Focus the last visible option\n\t */\n\tpublic focusLast(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\t\tfor (let i = options.length - 1; i >= 0; i--) {\n\t\t\tconst option = options[i];\n\t\t\tif (\n\t\t\t\t!option.classList.contains('disabled') &&\n\t\t\t\toption.getAttribute('aria-disabled') !== 'true'\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = i;\n\t\t\t\tthis.applyFocus(option);\n\t\t\t\tthis.scrollIntoView(option);\n\t\t\t\treturn option;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Focus the next visible option that matches the search string\n\t */\n\tpublic focusByString(str: string): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\t\tconst lowerStr = str.toLowerCase();\n\t\tconst startIdx = (this._focusedOptionIndex ?? -1) + 1;\n\t\tfor (let i = 0; i < options.length; i++) {\n\t\t\tconst idx = (startIdx + i) % options.length;\n\t\t\tconst option = options[idx];\n\t\t\tif (\n\t\t\t\t!option.classList.contains('disabled') &&\n\t\t\t\toption.getAttribute('aria-disabled') !== 'true' &&\n\t\t\t\t(option.textContent?.toLowerCase().startsWith(lowerStr) ||\n\t\t\t\t\toption.dataset.value?.toLowerCase().startsWith(lowerStr))\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = idx;\n\t\t\t\tthis.applyFocus(option);\n\t\t\t\tthis.scrollIntoView(option);\n\t\t\t\treturn option;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Focus the next visible option\n\t */\n\tpublic focusNext(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\t\tlet idx =\n\t\t\tthis._focusedOptionIndex === null\n\t\t\t\t? 0\n\t\t\t\t: (this._focusedOptionIndex + 1) % options.length;\n\t\tlet startIdx = idx;\n\t\tdo {\n\t\t\tconst option = options[idx];\n\t\t\tif (\n\t\t\t\t!option.classList.contains('disabled') &&\n\t\t\t\toption.getAttribute('aria-disabled') !== 'true'\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = idx;\n\t\t\t\tthis.applyFocus(option);\n\t\t\t\tthis.scrollIntoView(option);\n\t\t\t\treturn option;\n\t\t\t}\n\t\t\tidx = (idx + 1) % options.length;\n\t\t} while (idx !== startIdx);\n\t\treturn null;\n\t}\n\n\t/**\n\t * Focus the previous visible option\n\t */\n\tpublic focusPrevious(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\t\tif (options.length === 0) return null;\n\t\tlet idx =\n\t\t\tthis._focusedOptionIndex === null\n\t\t\t\t? options.length - 1\n\t\t\t\t: (this._focusedOptionIndex - 1 + options.length) % options.length;\n\t\tlet startIdx = idx;\n\t\tdo {\n\t\t\tconst option = options[idx];\n\t\t\tif (\n\t\t\t\t!option.classList.contains('disabled') &&\n\t\t\t\toption.getAttribute('aria-disabled') !== 'true'\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = idx;\n\t\t\t\tthis.applyFocus(option);\n\t\t\t\tthis.scrollIntoView(option);\n\t\t\t\treturn option;\n\t\t\t}\n\t\t\tidx = (idx - 1 + options.length) % options.length;\n\t\t} while (idx !== startIdx);\n\t\treturn null;\n\t}\n\n\t/**\n\t * Apply focus to a specific option\n\t */\n\tpublic applyFocus(option: HTMLElement): void {\n\t\tif (!option) return;\n\t\t// Ensure it's not disabled\n\t\tif (\n\t\t\toption.classList.contains('disabled') ||\n\t\t\toption.getAttribute('aria-disabled') === 'true'\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\t// DO NOT CALL resetFocus() here. Caller's responsibility.\n\t\toption.classList.add(this._focusClass);\n\t\toption.classList.add(this._hoverClass);\n\t\t// _triggerFocusChange needs _focusedOptionIndex to be set by the caller before this.\n\t\tthis._triggerFocusChange();\n\t}\n\n\t/**\n\t * Reset focus on all options\n\t */\n\tpublic resetFocus(): void {\n\t\tconst focusedElements = this._element.querySelectorAll(\n\t\t\t`.${this._focusClass}, .${this._hoverClass}`,\n\t\t);\n\n\t\t// Remove focus and hover classes from all options\n\t\tfocusedElements.forEach((element) => {\n\t\t\telement.classList.remove(this._focusClass, this._hoverClass);\n\t\t});\n\n\t\tthis._focusedOptionIndex = null; // Always reset the index\n\t}\n\n\t/**\n\t * Ensure the focused option is visible in the scrollable container\n\t */\n\tpublic scrollIntoView(option: HTMLElement): void {\n\t\tif (!option) return;\n\n\t\tconst container = this._element.querySelector('[data-kt-select-options]');\n\t\tif (!container) return;\n\n\t\tconst optionRect = option.getBoundingClientRect();\n\t\tconst containerRect = container.getBoundingClientRect();\n\n\t\t// Check if option is below the visible area\n\t\tif (optionRect.bottom > containerRect.bottom) {\n\t\t\toption.scrollIntoView({ block: 'end', behavior: 'smooth' });\n\t\t}\n\t\t// Check if option is above the visible area\n\t\telse if (optionRect.top < containerRect.top) {\n\t\t\toption.scrollIntoView({ block: 'start', behavior: 'smooth' });\n\t\t}\n\t}\n\n\t/**\n\t * Focus a specific option by its value\n\t */\n\tpublic focusOptionByValue(value: string): boolean {\n\t\tconst options = this.getVisibleOptions();\n\t\tconst index = options.findIndex((option) => option.dataset.value === value);\n\n\t\tif (index >= 0) {\n\t\t\tconst optionToFocus = options[index];\n\t\t\tif (\n\t\t\t\t!optionToFocus.classList.contains('disabled') &&\n\t\t\t\toptionToFocus.getAttribute('aria-disabled') !== 'true'\n\t\t\t) {\n\t\t\t\tthis.resetFocus();\n\t\t\t\tthis._focusedOptionIndex = index;\n\t\t\t\tthis.applyFocus(optionToFocus);\n\t\t\t\tthis.scrollIntoView(optionToFocus);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Get the currently focused option\n\t */\n\tpublic getFocusedOption(): HTMLElement | null {\n\t\tconst options = this.getVisibleOptions();\n\n\t\tif (\n\t\t\tthis._focusedOptionIndex !== null &&\n\t\t\tthis._focusedOptionIndex < options.length\n\t\t) {\n\t\t\treturn options[this._focusedOptionIndex];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get the index of the currently focused option\n\t */\n\tpublic getFocusedIndex(): number | null {\n\t\treturn this._focusedOptionIndex;\n\t}\n\n\t/**\n\t * Set the focused option index directly\n\t */\n\tpublic setFocusedIndex(index: number | null): void {\n\t\tthis._focusedOptionIndex = index;\n\t}\n\n\t/**\n\t * Set a callback to be called when focus changes\n\t */\n\tpublic setOnFocusChange(\n\t\tcb: (option: HTMLElement | null, index: number | null) => void,\n\t) {\n\t\tthis._onFocusChange = cb;\n\t}\n\n\tprivate _triggerFocusChange() {\n\t\tif (this._onFocusChange) {\n\t\t\tthis._onFocusChange(this.getFocusedOption(), this._focusedOptionIndex);\n\t\t}\n\t}\n\n\t/**\n\t * Clean up event listeners\n\t */\n\tpublic dispose(): void {\n\t\tif (this._eventManager) {\n\t\t\tthis._eventManager.removeAllListeners(this._element);\n\t\t}\n\t}\n}\n\n/**\n * Centralized event listener management\n */\nexport class EventManager {\n\tprivate _boundHandlers: Map<\n\t\tstring,\n\t\tMap<EventListenerOrEventListenerObject, EventListenerOrEventListenerObject>\n\t> = new Map();\n\n\t/**\n\t * Add an event listener with a bound context\n\t */\n\tpublic addListener(\n\t\telement: HTMLElement,\n\t\tevent: string,\n\t\thandler: EventListenerOrEventListenerObject,\n\t\tcontext?: any,\n\t): void {\n\t\tif (!element) return;\n\n\t\t// Create a bound version of the handler if context provided\n\t\tconst boundHandler: EventListenerOrEventListenerObject =\n\t\t\tcontext && typeof handler === 'function'\n\t\t\t\t? handler.bind(context)\n\t\t\t\t: handler;\n\n\t\t// Store the relationship between original and bound handler\n\t\tif (!this._boundHandlers.has(event)) {\n\t\t\tthis._boundHandlers.set(event, new Map());\n\t\t}\n\n\t\tconst eventMap = this._boundHandlers.get(event)!;\n\t\teventMap.set(handler, boundHandler);\n\n\t\t// Add the event listener\n\t\telement.addEventListener(event, boundHandler);\n\t}\n\n\t/**\n\t * Remove an event listener\n\t */\n\tpublic removeListener(\n\t\telement: HTMLElement,\n\t\tevent: string,\n\t\thandler: EventListenerOrEventListenerObject,\n\t): void {\n\t\tif (!element) return;\n\n\t\tconst eventMap = this._boundHandlers.get(event);\n\t\tif (!eventMap) return;\n\n\t\t// Get the bound version of the handler\n\t\tconst boundHandler = eventMap.get(handler);\n\t\tif (!boundHandler) return;\n\n\t\t// Remove the event listener\n\t\telement.removeEventListener(event, boundHandler);\n\n\t\t// Clean up the map\n\t\teventMap.delete(handler);\n\t\tif (eventMap.size === 0) {\n\t\t\tthis._boundHandlers.delete(event);\n\t\t}\n\t}\n\n\t/**\n\t * Remove all event listeners\n\t */\n\tpublic removeAllListeners(element: HTMLElement): void {\n\t\tif (!element) return;\n\n\t\t// Go through each event type\n\t\tthis._boundHandlers.forEach((eventMap, event) => {\n\t\t\t// For each event type, go through each handler\n\t\t\teventMap.forEach((boundHandler) => {\n\t\t\t\telement.removeEventListener(event, boundHandler);\n\t\t\t});\n\t\t});\n\n\t\t// Clear the maps\n\t\tthis._boundHandlers.clear();\n\t}\n}\n\n/**\n * Debounce function to limit how often a function can be called\n */\nexport function debounce(\n\tfunc: (...args: any[]) => void,\n\tdelay: number,\n): (...args: any[]) => void {\n\tlet timeout: ReturnType<typeof setTimeout>;\n\n\treturn function (...args: any[]) {\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(() => func(...args), delay);\n\t};\n}\n\n/**\n * Replaces all {{key}} in the template with the corresponding value from the data object.\n * If a key is missing in data, replaces with an empty string.\n */\nexport function renderTemplateString(\n\ttemplate: string,\n\tdata: Record<string, any>,\n): string {\n\treturn template.replace(/{{(\\w+)}}/g, (_, key) =>\n\t\tdata[key] !== undefined && data[key] !== null ? String(data[key]) : '',\n\t);\n}\n\n// Type-to-search buffer utility for keyboard navigation\nexport class TypeToSearchBuffer {\n\tprivate buffer: string = '';\n\tprivate lastTime: number = 0;\n\tprivate timeout: number;\n\n\tconstructor(timeout: number = 500) {\n\t\tthis.timeout = timeout;\n\t}\n\n\tpublic push(char: string) {\n\t\tconst now = Date.now();\n\t\tif (now - this.lastTime > this.timeout) {\n\t\t\tthis.buffer = '';\n\t\t}\n\t\tthis.buffer += char;\n\t\tthis.lastTime = now;\n\t}\n\n\tpublic getBuffer() {\n\t\treturn this.buffer;\n\t}\n\n\tpublic clear() {\n\t\tthis.buffer = '';\n\t}\n}\n\nexport function stringToElement(html: string): HTMLElement {\n\tconst template = document.createElement('template');\n\ttemplate.innerHTML = html.trim();\n\treturn template.content.firstElementChild as HTMLElement;\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTImageInput } from './image-input';\nexport type {\n\tKTImageInputConfigInterface,\n\tKTImageInputInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { KTSelectConfigInterface, KTSelectOption } from './config';\nimport { renderTemplateString } from './utils';\n\n/**\n * Default HTML string templates for KTSelect. All UI structure is defined here.\n * Users can override any template by providing a matching key in the config.templates object.\n */\nexport const coreTemplateStrings = {\n\tdropdown: `<div data-kt-select-dropdown class=\"kt-select-dropdown hidden {{class}}\" style=\"z-index: {{zindex}};\"></div>`,\n\toptions: `<ul role=\"listbox\" aria-label=\"{{label}}\" class=\"kt-select-options {{class}}\" data-kt-select-options=\"true\"></ul>`,\n\terror: `<li class=\"kt-select-error\" role=\"alert\"></li>`,\n\twrapper: `<div data-kt-select-wrapper class=\"kt-select-wrapper {{class}}\"></div>`,\n\tcombobox: `\n\t\t<div data-kt-select-combobox data-kt-select-display class=\"kt-select-combobox {{class}}\">\n\t\t\t<div data-kt-select-combobox-values=\"true\" class=\"kt-select-combobox-values\"></div>\n\t\t\t<input class=\"kt-input kt-select-combobox-input\" data-kt-select-search=\"true\" type=\"text\" placeholder=\"{{placeholder}}\" role=\"searchbox\" aria-label=\"{{label}}\" {{disabled}} />\n\t\t\t<button type=\"button\" data-kt-select-clear-button=\"true\" class=\"kt-select-combobox-clear-btn\" aria-label=\"Clear selection\">\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n\t\t\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n\t\t\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t</div>\n\t`,\n\tplaceholder: `<div data-kt-select-placeholder class=\"kt-select-placeholder {{class}}\"></div>`,\n\tdisplay: `\n\t\t<div data-kt-select-display class=\"kt-select-display {{class}}\" tabindex=\"{{tabindex}}\" role=\"button\" data-selected=\"0\" aria-haspopup=\"listbox\" aria-expanded=\"false\" aria-label=\"{{label}}\" {{disabled}}>\n\t\t\t<div class=\"kt-select-option-text\" data-kt-text-container=\"true\">{{text}}</div>\n\t\t</div>\n\t`,\n\toption: `\n\t\t<li data-kt-select-option data-value=\"{{value}}\" data-text=\"{{text}}\" class=\"kt-select-option {{class}}\" role=\"option\" {{selected}} {{disabled}}>\n\t\t\t<div class=\"kt-select-option-text\" data-kt-text-container=\"true\">{{text}}</div><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"size-3.5 ms-auto hidden text-primary kt-select-option-selected:block\"><path d=\"M20 6 9 17l-5-5\"/></svg>\n\t\t</li>\n\t`,\n\tsearch: `<div data-kt-select-search class=\"kt-select-search {{class}}\"><input type=\"text\" data-kt-select-search=\"true\" placeholder=\"{{searchPlaceholder}}\" class=\"kt-input kt-input-ghost\" role=\"searchbox\" aria-label=\"{{searchPlaceholder}}\"/></div>`,\n\tsearchEmpty: `<div data-kt-select-search-empty class=\"kt-select-search-empty {{class}}\"></div>`,\n\tloading: `<li class=\"kt-select-loading {{class}}\" role=\"status\" aria-live=\"polite\"></li>`,\n\ttag: `<div data-kt-select-tag=\"true\" class=\"kt-select-tag {{class}}\"></div>`,\n\tloadMore: `<li class=\"kt-select-load-more {{class}}\" data-kt-select-load-more=\"true\"></li>`,\n\tselectAll: `<div data-kt-select-select-all class=\"kt-select-select-all\"><button type=\"button\" class=\"kt-select-select-all-button\">{{text}}</button></div>`,\n\ttagRemoveButton: `<button type=\"button\" data-kt-select-remove-button class=\"kt-select-tag-remove\" aria-label=\"Remove tag\" tabindex=\"0\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"3\" y1=\"3\" x2=\"9\" y2=\"9\"/><line x1=\"9\" y1=\"3\" x2=\"3\" y2=\"9\"/></svg></button>`,\n};\n\n/**\n * Template interface for KTSelect component\n * Each method returns an HTML string or HTMLElement\n */\nexport interface KTSelectTemplateInterface {\n\t/**\n\t * Renders the dropdown content container\n\t */\n\tdropdown: (\n\t\tconfig: KTSelectConfigInterface & { zindex?: number; content?: string },\n\t) => HTMLElement;\n\t/**\n\t * Renders the options container\n\t */\n\toptions: (\n\t\tconfig: KTSelectConfigInterface & { options?: string },\n\t) => HTMLElement;\n\t/**\n\t * Renders the load more button for pagination\n\t */\n\tloadMore: (config: KTSelectConfigInterface) => HTMLElement;\n\t/**\n\t * Renders an error message in the dropdown\n\t */\n\terror: (\n\t\tconfig: KTSelectConfigInterface & { errorMessage: string },\n\t) => HTMLElement;\n\n\t// Main components\n\twrapper: (config: KTSelectConfigInterface) => HTMLElement;\n\tdisplay: (config: KTSelectConfigInterface) => HTMLElement;\n\n\t// Option rendering\n\toption: (\n\t\toption: KTSelectOption | HTMLOptionElement,\n\t\tconfig: KTSelectConfigInterface,\n\t) => HTMLElement;\n\n\t// Search and empty states\n\tsearch: (config: KTSelectConfigInterface) => HTMLElement;\n\tsearchEmpty: (config: KTSelectConfigInterface) => HTMLElement;\n\tloading: (\n\t\tconfig: KTSelectConfigInterface,\n\t\tloadingMessage: string,\n\t) => HTMLElement;\n\n\t// Multi-select\n\ttag: (\n\t\toption: HTMLOptionElement,\n\t\tconfig: KTSelectConfigInterface,\n\t) => HTMLElement;\n\n\tplaceholder: (config: KTSelectConfigInterface) => HTMLElement;\n\tselectAll: (config: KTSelectConfigInterface) => HTMLElement;\n}\n\n/**\n * Default templates for KTSelect component\n */\nfunction stringToElement(html: string): HTMLElement {\n\tconst template = document.createElement('template');\n\ttemplate.innerHTML = html.trim();\n\treturn template.content.firstElementChild as HTMLElement;\n}\n\n/**\n * User-supplied template overrides. Use setTemplateStrings() to add or update.\n */\nlet userTemplateStrings: Partial<typeof coreTemplateStrings> = {};\n\n/**\n * Register or update user template overrides.\n * @param templates Partial template object to merge with defaults.\n */\nexport function setTemplateStrings(\n\ttemplates: Partial<typeof coreTemplateStrings>,\n): void {\n\tuserTemplateStrings = { ...userTemplateStrings, ...templates };\n}\n\n/**\n * Get the complete template set, merging defaults, user overrides, and config templates.\n * @param config Optional config object with a \"templates\" property.\n */\nexport function getTemplateStrings(\n\tconfig?: KTSelectConfigInterface,\n): typeof coreTemplateStrings {\n\tconst templates =\n\t\tconfig && typeof config === 'object' && 'templates' in config\n\t\t\t? (config as any).templates\n\t\t\t: undefined;\n\n\tif (templates) {\n\t\treturn { ...coreTemplateStrings, ...userTemplateStrings, ...templates };\n\t}\n\n\treturn { ...coreTemplateStrings, ...userTemplateStrings };\n}\n\n/**\n * Default templates for KTSelect component\n */\nexport const defaultTemplates: KTSelectTemplateInterface = {\n\t/**\n\t * Renders the dropdown content\n\t */\n\tdropdown: (\n\t\tconfig: KTSelectConfigInterface & { zindex?: number; content?: string },\n\t) => {\n\t\tlet template = getTemplateStrings(config).dropdown;\n\t\t// If a custom dropdownTemplate is provided, it's responsible for its own content.\n\t\t// Otherwise, the base template is used, and content is appended later.\n\t\tif (config.dropdownTemplate) {\n\t\t\tconst renderedCustomTemplate = renderTemplateString(\n\t\t\t\tconfig.dropdownTemplate,\n\t\t\t\t{\n\t\t\t\t\tzindex: config.zindex ? String(config.zindex) : '',\n\t\t\t\t\t// content: config.content || '', // No longer pass content to custom template directly here\n\t\t\t\t\tclass: config.dropdownClass || '',\n\t\t\t\t},\n\t\t\t);\n\t\t\t// The custom template IS the dropdown element\n\t\t\tconst customDropdownEl = stringToElement(renderedCustomTemplate);\n\t\t\tif (config.zindex) customDropdownEl.style.zIndex = String(config.zindex);\n\t\t\tif (config.dropdownClass)\n\t\t\t\tcustomDropdownEl.classList.add(...config.dropdownClass.split(' '));\n\t\t\treturn customDropdownEl;\n\t\t}\n\n\t\tconst html = template\n\t\t\t.replace('{{zindex}}', config.zindex ? String(config.zindex) : '')\n\t\t\t// .replace('{{content}}', '') // Content is no longer part of the base template string\n\t\t\t.replace('{{class}}', config.dropdownClass || '');\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the options container for the dropdown\n\t */\n\toptions: (config: KTSelectConfigInterface & { options?: string }) => {\n\t\tconst template = getTemplateStrings(config).options;\n\t\tconst html = template\n\t\t\t.replace('{{label}}', config.label || 'Options')\n\t\t\t.replace('{{height}}', config.height ? String(config.height) : '250')\n\t\t\t// .replace('{{options}}', '') // Options are now appended dynamically\n\t\t\t.replace('{{class}}', config.optionsClass || '');\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the load more button for pagination\n\t */\n\tloadMore: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config)\n\t\t\t.loadMore // .replace('{{loadMoreText}}', config.loadMoreText || 'Load more...') // Content is no longer in template string\n\t\t\t.replace('{{class}}', config.loadMoreClass || '');\n\t\tconst element = stringToElement(html);\n\t\telement.textContent = config.loadMoreText || 'Load more...';\n\t\treturn element;\n\t},\n\t/**\n\t * Renders an error message in the dropdown\n\t */\n\terror: (\n\t\tconfig: KTSelectConfigInterface & { errorMessage: string },\n\t): HTMLElement => {\n\t\t// Changed return type to HTMLElement\n\t\tconst template = getTemplateStrings(config).error;\n\t\tconst html = template\n\t\t\t// .replace('{{errorMessage}}', config.errorMessage || 'An error occurred') // Content is no longer in template string\n\t\t\t.replace('{{class}}', config.errorClass || '');\n\t\tconst element = stringToElement(html);\n\t\telement.textContent = config.errorMessage || 'An error occurred';\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders the main container for the select component\n\t */\n\twrapper: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tconst html = getTemplateStrings(config).wrapper.replace(\n\t\t\t'{{class}}',\n\t\t\tconfig.wrapperClass || '',\n\t\t);\n\t\tconst element = stringToElement(html);\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders the display element (trigger) for the select\n\t */\n\tdisplay: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config)\n\t\t\t.display.replace('{{tabindex}}', config.disabled ? '-1' : '0')\n\t\t\t.replace('{{label}}', config.label || config.placeholder || 'Select...')\n\t\t\t.replace('{{disabled}}', config.disabled ? 'aria-disabled=\"true\"' : '')\n\t\t\t.replace('{{placeholder}}', config.placeholder || 'Select...')\n\t\t\t.replace('{{class}}', config.displayClass || '');\n\n\t\tconst element = stringToElement(html);\n\n\t\t// Add data-multiple attribute if in multiple select mode\n\t\tif (config.multiple) {\n\t\t\telement.setAttribute('data-multiple', 'true');\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders a single option\n\t */\n\toption: (\n\t\toption: KTSelectOption | HTMLOptionElement,\n\t\tconfig: KTSelectConfigInterface,\n\t): HTMLElement => {\n\t\tconst isHtmlOption = option instanceof HTMLOptionElement;\n\t\tlet optionData: Record<string, any>;\n\n\t\tif (isHtmlOption) {\n\t\t\t// If it's a plain HTMLOptionElement, construct data similarly to how KTSelectOption would\n\t\t\t// This branch might be less common if KTSelectOption instances are always used for rendering.\n\t\t\tconst el = option as HTMLOptionElement;\n\t\t\tconst textContent = el.textContent || '';\n\t\t\toptionData = {\n\t\t\t\tvalue: el.value,\n\t\t\t\ttext: textContent,\n\t\t\t\tselected: el.selected,\n\t\t\t\tdisabled: el.disabled, // This captures original disabled state\n\t\t\t\tcontent: textContent, // Default content to text\n\t\t\t\t// Attempt to get custom config for this specific option value if available\n\t\t\t\t...(config.optionsConfig?.[el.value] || {}),\n\t\t\t};\n\t\t} else {\n\t\t\t// If it's a KTSelectOption class instance (from './option')\n\t\t\t// which should have the getOptionDataForTemplate method.\n\t\t\toptionData = (\n\t\t\t\toption as import('./option').KTSelectOption\n\t\t\t).getOptionDataForTemplate();\n\t\t}\n\n\t\tlet content = optionData?.text?.trim(); // Default content to option's text\n\n\t\tif (config.optionTemplate) {\n\t\t\t// Use the user-provided template string, rendering with the full optionData.\n\t\t\t// renderTemplateString will replace {{key}} with values from optionData.\n\t\t\tcontent = renderTemplateString(config.optionTemplate, optionData);\n\t\t} else {\n\t\t\tcontent = optionData.text || optionData.content; // Prefer explicit text, fallback to content\n\t\t}\n\n\t\t// Use the core option template string as the base structure.\n\t\tconst baseTemplate = getTemplateStrings(config).option;\n\n\t\tconst optionClasses = [config.optionClass || ''];\n\t\tif (optionData.disabled) {\n\t\t\toptionClasses.push('disabled');\n\t\t}\n\n\t\t// Populate the base template for the <li> attributes.\n\t\t// The actual display content (text or custom HTML) will be set on the inner span later.\n\t\tconst html = renderTemplateString(baseTemplate, {\n\t\t\t...optionData, // Pass all data for {{value}}, {{text}}, {{selected}}, {{disabled}}, etc.\n\t\t\tclass: optionClasses.join(' ').trim() || '',\n\t\t\tselected: optionData.selected\n\t\t\t\t? 'aria-selected=\"true\"'\n\t\t\t\t: 'aria-selected=\"false\"',\n\t\t\tdisabled: optionData.disabled ? 'aria-disabled=\"true\"' : '',\n\t\t\tcontent: content, // This is for the {{content}} placeholder within the option template string itself\n\t\t});\n\n\t\tconst element = stringToElement(html);\n\n\t\t// If a custom option template is provided, replace the element's innerHTML with the content.\n\t\tif (config.optionTemplate) {\n\t\t\telement.innerHTML = content;\n\t\t}\n\n\t\t// Ensure data-text attribute is set to the original, clean text for searching/filtering\n\t\telement.setAttribute('data-text', optionData?.text?.trim() || '');\n\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders the search input\n\t */\n\tsearch: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config)\n\t\t\t.search.replace(\n\t\t\t\t'{{searchPlaceholder}}',\n\t\t\t\tconfig.searchPlaceholder || 'Search...',\n\t\t\t)\n\t\t\t.replace('{{class}}', config.searchClass || '');\n\t\treturn stringToElement(html);\n\t},\n\n\t/**\n\t * Renders the no results message\n\t */\n\tsearchEmpty: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config).searchEmpty.replace(\n\t\t\t'{{class}}',\n\t\t\tconfig.searchEmptyClass || '',\n\t\t);\n\n\t\tlet content = config.searchEmpty || 'No results';\n\n\t\tif (config.searchEmptyTemplate) {\n\t\t\tcontent = renderTemplateString(config.searchEmptyTemplate, {\n\t\t\t\tclass: config.searchEmptyClass || '',\n\t\t\t});\n\t\t\tconst element = stringToElement(html);\n\t\t\telement.innerHTML = content; // For templates, content can be HTML\n\t\t\treturn element;\n\t\t} else {\n\t\t\tconst element = stringToElement(html);\n\t\t\telement.textContent = content; // For simple text, use textContent\n\t\t\treturn element;\n\t\t}\n\t},\n\n\t/**\n\t * Renders the loading state\n\t */\n\tloading: (\n\t\tconfig: KTSelectConfigInterface,\n\t\tloadingMessage: string,\n\t): HTMLElement => {\n\t\tlet html = getTemplateStrings(config).loading.replace(\n\t\t\t'{{class}}',\n\t\t\tconfig.loadingClass || '',\n\t\t);\n\t\tconst element = stringToElement(html);\n\t\telement.textContent = loadingMessage || 'Loading options...';\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders a tag for multi-select\n\t */\n\ttag: (\n\t\toption: HTMLOptionElement,\n\t\tconfig: KTSelectConfigInterface,\n\t): HTMLElement => {\n\t\tlet template = getTemplateStrings(config).tag;\n\t\tlet preparedContent =\n\t\t\toption.textContent || option.innerText || option.value || ''; // Default content is the option's text\n\n\t\tif (config.tagTemplate) {\n\t\t\tlet tagTemplateString = config.tagTemplate;\n\t\t\tconst optionValue = option.getAttribute('data-value') || option.value;\n\n\t\t\t// Replace all {{varname}} in option.innerHTML with values from _config.optionsConfig\n\t\t\tObject.entries(\n\t\t\t\t(config.optionsConfig as any)?.[optionValue] || {},\n\t\t\t).forEach(([key, val]) => {\n\t\t\t\tif (\n\t\t\t\t\ttypeof val === 'string' ||\n\t\t\t\t\ttypeof val === 'number' ||\n\t\t\t\t\ttypeof val === 'boolean'\n\t\t\t\t) {\n\t\t\t\t\ttagTemplateString = tagTemplateString.replace(\n\t\t\t\t\t\tnew RegExp(`{{${key}}}`, 'g'),\n\t\t\t\t\t\tString(val),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Render the custom tag template with option data\n\t\t\tpreparedContent = renderTemplateString(tagTemplateString, {\n\t\t\t\ttitle: option.title,\n\t\t\t\tid: option.id,\n\t\t\t\tclass: config.tagClass || '', // This class is for content, not the main tag div\n\t\t\t\t// content: option.innerHTML, // Avoid direct innerHTML from option due to potential XSS\n\t\t\t\ttext: option.innerText || option.textContent || '',\n\t\t\t\tvalue: optionValue,\n\t\t\t});\n\t\t}\n\n\t\t// Append the remove button HTML string to the prepared content\n\t\tpreparedContent += getTemplateStrings(config).tagRemoveButton;\n\n\t\tconst html = template\n\t\t\t// .replace('{{title}}', option.title) // Title is part of preparedContent if using custom template\n\t\t\t// .replace('{{id}}', option.id) // ID is part of preparedContent if using custom template\n\t\t\t.replace('{{class}}', config.tagClass || ''); // Class for the main tag div\n\n\t\tconst element = stringToElement(html);\n\t\telement.innerHTML = preparedContent; // Set the fully prepared content (text/HTML + remove button)\n\t\treturn element;\n\t},\n\n\t/**\n\t * Renders the placeholder for the select\n\t */\n\tplaceholder: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tlet html = getTemplateStrings(config).placeholder.replace(\n\t\t\t'{{class}}',\n\t\t\tconfig.placeholderClass || '',\n\t\t);\n\n\t\tlet content = config.placeholder || 'Select...';\n\n\t\tif (config.placeholderTemplate) {\n\t\t\tcontent = renderTemplateString(config.placeholderTemplate, {\n\t\t\t\tplaceholder: config.placeholder || 'Select...',\n\t\t\t\tclass: config.placeholderClass || '',\n\t\t\t});\n\t\t\tconst element = stringToElement(html);\n\t\t\telement.innerHTML = content; // For templates, content can be HTML\n\t\t\treturn element;\n\t\t} else {\n\t\t\tconst element = stringToElement(html);\n\t\t\telement.textContent = content; // For simple text, use textContent\n\t\t\treturn element;\n\t\t}\n\t},\n\n\tselectAll: (config: KTSelectConfigInterface): HTMLElement => {\n\t\tconst template = getTemplateStrings(config).selectAll;\n\t\tconst element = stringToElement(\n\t\t\ttemplate.replace('{{text}}', config.selectAllText || 'Select All'),\n\t\t);\n\t\treturn element;\n\t},\n};\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nexport { KTThemeSwitch } from './theme-switch';\nexport type {\n\tKTThemeSwitchConfigInterface,\n\tKTThemeSwitchInterface,\n} from './types';\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport { coreTemplateStrings } from './templates';\n\nexport const DefaultConfig: KTSelectConfigInterface = {\n\t// ...other config options\n\tloadMoreText: 'Load more...',\n\t// General Display\n\tdebug: false,\n\tplaceholder: 'Select an option', // Default placeholder text when no option is selected\n\n\t// Data Handling\n\titems: [], // Static list of options\n\tisLoading: false, // Indicates if options are being loaded asynchronously\n\tonFetch: null, // Callback function to fetch options asynchronously\n\n\t// Remote Data Configuration\n\tremote: false, // Enable/disable remote data fetching\n\tdataUrl: null, // URL to fetch options from\n\tapiDataProperty: null, // Property in the response object that contains the options\n\tremoteErrorMessage: 'Failed to load data', // Error message to display if remote data fetch fails\n\n\t// Field Mapping\n\tdataValueField: null, // Property in the option object that contains the value (default: 'id')\n\tdataFieldText: null, // Property in the option object that contains the text (default: 'title')\n\n\t// Search Configuration\n\tsearchParam: '', // Query parameter for API search requests\n\tsearchDebounce: 300, // Debounce delay for search (in ms)\n\n\t// Pagination Configuration\n\tpagination: false, // Enable/disable pagination for remote data\n\tpaginationLimit: 10, // Items per page\n\tpaginationPageParam: 'page', // Parameter name for page number\n\tpaginationLimitParam: 'limit', // Parameter name for items per page\n\tpaginationTotalParam: 'total', // Parameter name for total items\n\n\t// Selection Behavior\n\tallowClear: false, // Allow clearing the selection (if true, an empty value can be set)\n\tmultiple: false, // Enable/disable multi-select\n\tmaxSelections: null, // Maximum number of selections allowed in multi-select mode (null for unlimited)\n\tdisabled: false, // Disable the select component\n\tisRequired: false, // Make selection required\n\n\t// Search Functionality\n\tenableSearch: false, // Enable/disable search functionality within the dropdown\n\tsearchPlaceholder: 'Search...', // Placeholder text for the search input\n\tsearchAutofocus: true, // Autofocus on search input when dropdown opens\n\tsearchMinLength: 0, // Minimum characters required to trigger search\n\tsearchMaxItems: 50, // Maximum number of search results to display\n\tsearchEmpty: 'No results', // Text to display when no search results are found\n\tclearSearchOnClose: false, // Clear search input when dropdown closes (default: false to persist search text)\n\tcloseOnEnter: true, // Close dropdown when Enter is pressed in search input\n\n\t// Multi-Select Display\n\tselectAllText: 'Select all', // Text for the \"Select All\" option (if implemented)\n\tclearAllText: 'Clear all', // Text for the \"Clear All\" option (if implemented)\n\tenableSelectAll: false, // Enable/disable \"Select All\" button for multi-select\n\tshowSelectedCount: true, // Show the number of selected options in multi-select mode\n\trenderSelected: null, // Custom function to render the selected value(s) in the display area\n\n\t// Accessibility & Usability\n\tlabel: 'Select an option', // Label for the select component (for screen readers)\n\theight: 250, // Maximum height of the dropdown menu in pixels (if exceeded, a scrollbar will appear)\n\n\t// Dropdown Configuration\n\tdropdownZindex: 105, // Initial z-index value for the dropdown\n\tdropdownContainer: null, // Container element for the dropdown\n\tdropdownPlacement: null,\n\tdropdownFlip: false,\n\tdropdownPreventOverflow: false,\n\tdropdownStrategy: null,\n\tdropdownWidth: null, // Custom width for dropdown (e.g., '300px'), null to match toggle element width\n\tcloseOnOtherOpen: true, // Close other open dropdowns when this one opens\n\tdispatchGlobalEvents: true, // Dispatch events on document for global listeners (jQuery compatibility)\n\n\t// New Config\n\tdropdownTemplate: '',\n};\n\nexport interface KTSelectConfigInterface {\n\t// ...other config options\n\tloadMoreText?: string;\n\t// General Display\n\tdebug?: boolean;\n\tplaceholder?: string;\n\n\t// Selection Behavior\n\tallowClear?: boolean;\n\tmultiple?: boolean;\n\tmaxSelections?: number | null;\n\tdisabled?: boolean;\n\tisRequired?: boolean;\n\n\t// Search Functionality\n\tenableSearch?: boolean;\n\tsearchEmpty?: string;\n\tsearchPlaceholder?: string;\n\tsearchAutofocus?: boolean;\n\tsearchMinLength?: number;\n\tsearchMaxItems?: number;\n\tsearchDebounce?: number;\n\tsearchParam?: string;\n\tclearSearchOnClose?: boolean;\n\tcloseOnEnter?: boolean;\n\n\t// Multi-Select Display\n\tselectAllText?: string;\n\tclearAllText?: string;\n\tenableSelectAll?: boolean;\n\tshowSelectedCount?: boolean;\n\trenderSelected?: (selectedOptions: any[]) => string; // Assuming any[] for now, adjust based on your option data structure\n\n\t// Accessibility & Usability\n\tlabel?: string;\n\theight: number;\n\n\t// Data Handling\n\titems?: KTSelectOption[];\n\tisLoading?: boolean;\n\tonFetch?: (query?: string) => Promise<KTSelectOption[]>;\n\n\t// Remote Data Configuration\n\tremote?: boolean;\n\tdataUrl?: string;\n\tapiDataProperty?: string;\n\tremoteErrorMessage?: string;\n\n\t// Field Mapping\n\tdataValueField?: string;\n\tdataFieldText?: string;\n\n\t// Pagination Configuration\n\tpagination?: boolean;\n\tpaginationLimit?: number;\n\tpaginationPageParam?: string;\n\tpaginationLimitParam?: string;\n\tpaginationTotalParam?: string;\n\n\t// Dropdown Configuration\n\tdropdownZindex?: number | null;\n\tdropdownContainer?: string | null;\n\tdropdownPlacement?: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end';\n\tdropdownFlip?: boolean;\n\tdropdownPreventOverflow?: boolean;\n\tdropdownStrategy?: 'fixed' | 'absolute';\n\tdropdownWidth?: string | null; // Custom width for dropdown, null to match toggle element width\n\tcloseOnOtherOpen?: boolean;\n\tdispatchGlobalEvents?: boolean;\n\n\t// Styling\n\tdropdownClass?: string;\n\tdisplayClass?: string;\n\toptionsClass?: string;\n\tsearchClass?: string;\n\tsearchEmptyClass?: string;\n\tloadingClass?: string;\n\ttagClass?: string;\n\tloadMoreClass?: string;\n\twrapperClass?: string;\n\terrorClass?: string;\n\n\t// New Config\n\ttags?: boolean;\n\tcombobox?: boolean;\n\tmaxSelection?: number;\n\tplaceholderClass?: string;\n\tplaceholderTemplate?: string;\n\tdisplaySeparator?: string;\n\tdisplayTemplate?: string;\n\tdisplayMaxSelected?: number;\n\toptionTemplate?: string;\n\toptionClass?: string;\n\ttagTemplate?: string;\n\tdropdownTemplate?: string;\n\tsearchEmptyTemplate?: string;\n\n\ttemplates?: Partial<typeof coreTemplateStrings>;\n\n\t// Option Configuration\n\tconfig?: KTSelectConfigInterface; // config from data-kt-select-config attribute\n\toptionsConfig?: Record<string, KTSelectConfigInterface>;\n}\n\nexport interface KTSelectOption {\n\tid: string;\n\ttitle: string;\n\tselected?: boolean;\n\tdisabled?: boolean;\n}\n\nexport class KTSelectState {\n\tprivate _config: KTSelectConfigInterface;\n\tprivate _selectedOptions: string[] = [];\n\n\tconstructor(config?: KTSelectConfigInterface) {\n\t\tthis._config = this._initDefaultConfig(config);\n\t}\n\n\tprivate _initDefaultConfig(\n\t\tconfig: KTSelectConfigInterface,\n\t): KTSelectConfigInterface {\n\t\treturn {\n\t\t\t...DefaultConfig,\n\t\t\t...config,\n\t\t\t...config.config,\n\t\t};\n\t}\n\n\tpublic setItems(items?: any[], query?: string): Promise<void> {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tif (items) {\n\t\t\t\tthis._config.items = items;\n\t\t\t\tresolve();\n\t\t\t} else if (this._config.dataUrl) {\n\t\t\t\tthis._fetchRemoteData(query)\n\t\t\t\t\t.then(resolve) // Resolve after _fetchRemoteData completes\n\t\t\t\t\t.catch(reject);\n\t\t\t} else if (this._config.onFetch) {\n\t\t\t\tthis._config.isLoading = true;\n\t\t\t\tthis._config\n\t\t\t\t\t.onFetch(query)\n\t\t\t\t\t.then((items) => {\n\t\t\t\t\t\tthis._config.items = items;\n\t\t\t\t\t\tresolve(); // Resolve after onFetch completes\n\t\t\t\t\t})\n\t\t\t\t\t.catch((error) => {\n\t\t\t\t\t\tconsole.error('Error fetching data:', error);\n\t\t\t\t\t\treject(error); // Reject on error\n\t\t\t\t\t})\n\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\tthis._config.isLoading = false;\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _fetchRemoteData(query?: string): Promise<void> {\n\t\tthis._config.isLoading = true; // Show loading indicator\n\n\t\tlet url = this._config.dataUrl!;\n\t\tif (query) {\n\t\t\turl += `?${this._config.searchParam}=${encodeURIComponent(query)}`;\n\t\t}\n\n\t\treturn fetch(url)\n\t\t\t.then((response) => response.json())\n\t\t\t.then((data) => {\n\t\t\t\tif (this._config.apiDataProperty) {\n\t\t\t\t\t// Extract the data property from the response\n\t\t\t\t\tif (this._config.apiDataProperty in data) {\n\t\t\t\t\t\tdata = data[this._config.apiDataProperty];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t'Error fetching data:',\n\t\t\t\t\t\t\t`Property '${this._config.apiDataProperty}' not found in response`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis._config.items = data;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('Error fetching data:', error);\n\t\t\t\t// Handle error (e.g., display an error message)\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tthis._config.isLoading = false; // Hide loading indicator\n\t\t\t});\n\t}\n\n\tpublic getItems(): KTSelectOption[] {\n\t\treturn this._config.items || [];\n\t}\n\n\tpublic setItemsFromOptions(options: HTMLOptionElement[]): void {\n\t\tthis._config.items = options.map((option) => {\n\t\t\tconst item: KTSelectOption = {\n\t\t\t\tid: option.value,\n\t\t\t\ttitle: option.textContent || option.value, // Use value as fallback for title\n\t\t\t\t// 'selected' property will be definitively set by _preSelectOptions\n\t\t\t\tdisabled: option.disabled,\n\t\t\t};\n\t\t\treturn item;\n\t\t});\n\t\t// The 'selected' status of these items and the overall component selection state\n\t\t// are now fully managed by _preSelectOptions in KTSelect during initialization.\n\t}\n\n\tpublic getConfig(): KTSelectConfigInterface {\n\t\treturn this._config;\n\t}\n\n\tpublic setSelectedOptions(value: string | string[]): void {\n\t\t// Handle empty array case first to prevent undefined elements\n\t\tif (Array.isArray(value) && value.length === 0) {\n\t\t\tthis._selectedOptions = [];\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tthis._config.multiple &&\n\t\t\ttypeof value === 'string' &&\n\t\t\t!this._selectedOptions.includes(value)\n\t\t) {\n\t\t\tthis._selectedOptions.push(value);\n\t\t} else if (!this._config.multiple) {\n\t\t\t// For single select, replace the previous selection with the new one\n\t\t\tthis._selectedOptions = typeof value === 'string' ? [value] : [value[0]];\n\t\t} else if (this._config.multiple && Array.isArray(value)) {\n\t\t\t// For multiple select with array input, use the provided array\n\t\t\tthis._selectedOptions = [...value];\n\t\t}\n\t}\n\n\tpublic toggleSelectedOptions(value: string): void {\n\t\tif (!this._config.multiple) {\n\t\t\t// For non-multiple, always set the new value\n\t\t\tthis._selectedOptions = [value];\n\t\t\treturn;\n\t\t}\n\n\t\t// For multiple selection, toggle the value\n\t\tconst index = this._selectedOptions.indexOf(value);\n\t\tif (index > -1) {\n\t\t\tthis._selectedOptions.splice(index, 1);\n\t\t} else {\n\t\t\tthis._selectedOptions.push(value);\n\t\t}\n\t}\n\n\tpublic getSelectedOptions(): string[] {\n\t\treturn this._selectedOptions;\n\t}\n\n\tpublic isSelected(value: string): boolean {\n\t\treturn this._selectedOptions.includes(value);\n\t}\n\n\tpublic modifyConfig(config: Partial<KTSelectConfigInterface>): void {\n\t\tthis._config = { ...this._config, ...config };\n\t}\n}\n","/**\n * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes\n * Copyright 2025 by Keenthemes Inc\n */\n\nimport KTData from '../../helpers/data';\nimport KTDom from '../../helpers/dom';\nimport KTEventHandler from '../../helpers/event-handler';\nimport KTComponent from '../component';\nimport { KTScrollspyInterface, KTScrollspyConfigInterface } from './types';\n\ndeclare global {\n\tinterface Window {\n\t\tKT_SCROLLSPY_INITIALIZED: boolean;\n\t\tKTScrollspy: typeof KTScrollspy;\n\t}\n}\n\nexport class KTScrollspy extends KTComponent implements KTScrollspyInterface {\n\tprotected override _name: string = 'scrollspy';\n\tprotected override _defaultConfig: KTScrollspyConfigInterface = {\n\t\ttarget: 'body',\n\t\toffset: 0,\n\t\tsmooth: true,\n\t};\n\tprotected override _config: KTScrollspyConfigInterface = this._defaultConfig;\n\tprotected _targetElement: HTMLElement | Document | null = null;\n\tprotected _anchorElements: NodeListOf<HTMLElement> | null = null;\n\n\tconstructor(element: HTMLElement, config?: KTScrollspyConfigInterface) {\n\t\tsuper();\n\n\t\tif (KTData.has(element as HTMLElement, this._name)) return;\n\n\t\tthis._init(element);\n\t\tthis._buildConfig(config);\n\n\t\tif (!this._element) return;\n\n\t\tconst targetElement =\n\t\t\tthis._getTarget() === 'body'\n\t\t\t\t? document\n\t\t\t\t: KTDom.getElement(this._getTarget());\n\t\tif (!targetElement) return;\n\n\t\tthis._targetElement = targetElement;\n\n\t\tthis._anchorElements = this._element.querySelectorAll(\n\t\t\t'[data-kt-scrollspy-anchor]',\n\t\t);\n\n\t\tif (!this._anchorElements) return;\n\n\t\tthis._handlers();\n\t\tthis._update();\n\t}\n\n\tprivate _getTarget(): string {\n\t\treturn (\n\t\t\t(this._element.getAttribute('data-kt-scrollspy-target') as string) ||\n\t\t\t(this._getOption('target') as string)\n\t\t);\n\t}\n\n\tprotected _handlers(): void {\n\t\tif (!this._anchorElements) return;\n\n\t\tthis._targetElement.addEventListener('scroll', () => {\n\t\t\tthis._anchorElements.forEach((anchorElement) => {\n\t\t\t\tthis._updateAnchor(anchorElement);\n\t\t\t});\n\t\t});\n\n\t\tKTEventHandler.on(\n\t\t\tthis._element,\n\t\t\t'[data-kt-scrollspy-anchor]',\n\t\t\t'click',\n\t\t\t(event: Event, target: HTMLElement) => {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis._scrollTo(target);\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected _scrollTo(anchorElement: HTMLElement): void {\n\t\tif (!anchorElement) return;\n\n\t\tconst sectionElement = KTDom.getElement(anchorElement.getAttribute('href'));\n\t\tif (!sectionElement) return;\n\n\t\tconst targetElement =\n\t\t\tthis._targetElement === document ? window : this._targetElement;\n\t\tif (!targetElement) return;\n\n\t\tlet offset = parseInt(this._getOption('offset') as string);\n\t\tif (anchorElement.getAttribute('data-kt-scrollspy-anchor-offset')) {\n\t\t\toffset = parseInt(\n\t\t\t\tanchorElement.getAttribute('data-kt-scrollspy-anchor-offset') as string,\n\t\t\t);\n\t\t}\n\n\t\tconst scrollTop = sectionElement.offsetTop - offset;\n\n\t\tif ('scrollTo' in targetElement) {\n\t\t\ttargetElement.scrollTo({\n\t\t\t\ttop: scrollTop,\n\t\t\t\tleft: 0,\n\t\t\t\tbehavior: this._getOption('smooth') ? 'smooth' : 'instant',\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected _updateAnchor(anchorElement: HTMLElement): void {\n\t\tconst sectionElement = KTDom.getElement(anchorElement.getAttribute('href'));\n\t\tif (!sectionElement) return;\n\n\t\tif (!KTDom.isVisible(anchorElement)) return;\n\n\t\tif (!this._anchorElements) return;\n\n\t\tconst scrollPosition =\n\t\t\tthis._targetElement === document\n\t\t\t\t? document.documentElement.scrollTop || document.body.scrollTop\n\t\t\t\t: (this._targetElement as HTMLElement).scrollTop;\n\n\t\tlet offset = parseInt(this._getOption('offset') as string);\n\t\tif (anchorElement.getAttribute('data-kt-scrollspy-anchor-offset')) {\n\t\t\toffset = parseInt(\n\t\t\t\tanchorElement.getAttribute('data-kt-scrollspy-anchor-offset') as string,\n\t\t\t);\n\t\t}\n\n\t\tconst offsetTop = sectionElement.offsetTop;\n\n\t\tif (scrollPosition + offset >= offsetTop) {\n\t\t\tthis._anchorElements.forEach((anchorElement) => {\n\t\t\t\tanchorElement.classList.remove('active');\n\t\t\t});\n\n\t\t\tconst payload = { element: anchorElement };\n\t\t\tthis._fireEvent('activate', payload);\n\t\t\tthis._dispatchEvent('activate', payload);\n\n\t\t\tanchorElement.classList.add('active');\n\n\t\t\tconst parentAnchorElements = KTDom.parents(\n\t\t\t\tanchorElement,\n\t\t\t\t'[data-kt-scrollspy-group]',\n\t\t\t);\n\t\t\tif (parentAnchorElements) {\n\t\t\t\tparentAnchorElements.forEach((parentAnchorElement) => {\n\t\t\t\t\tparentAnchorElement\n\t\t\t\t\t\t.querySelector('[data-kt-scrollspy-anchor]')\n\t\t\t\t\t\t?.classList.add('active');\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected _update() {\n\t\tif (!this._anchorElements) return;\n\n\t\tthis._anchorElements.forEach((anchorElement) => {\n\t\t\tthis._updateAnchor(anchorElement);\n\t\t});\n\t}\n\n\tprotected _isActive(anchorElement: HTMLElement): boolean {\n\t\treturn anchorElement.classList.contains('active');\n\t}\n\n\tpublic updateAnchor(anchorElement: HTMLElement): void {\n\t\tthis._updateAnchor(anchorElement);\n\t}\n\n\tpublic isActive(anchorElement: HTMLElement): boolean {\n\t\treturn this._isActive(anchorElement);\n\t}\n\n\tpublic update(): void {\n\t\tthis.update();\n\t}\n\n\tpublic scrollTo(anchorElement: HTMLElement): void {\n\t\tthis._scrollTo(anchorElement);\n\t}\n\n\tpublic static getInstance(element: HTMLElement): KTScrollspy {\n\t\tif (!element) return null;\n\n\t\tif (KTData.has(element, 'scrollspy')) {\n\t\t\treturn KTData.get(element, 'scrollspy') as KTScrollspy;\n\t\t}\n\n\t\tif (element.getAttribute('data-kt-scrollspy')) {\n\t\t\treturn new KTScrollspy(element);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static getOrCreateInstance(\n\t\telement: HTMLElement,\n\t\tconfig?: KTScrollspyConfigInterface,\n\t): KTScrollspy {\n\t\treturn this.getInstance(element) || new KTScrollspy(element, config);\n\t}\n\n\tpublic static createInstances(): void {\n\t\tconst elements = document.querySelectorAll('[data-kt-scrollspy]');\n\n\t\telements.forEach((element) => {\n\t\t\tnew KTScrollspy(element as HTMLElement);\n\t\t});\n\t}\n\n\tpublic static init(): void {\n\t\tKTScrollspy.createInstances();\n\t}\n}\n\nif (typeof window !== 'undefined') {\n\twindow.KTScrollspy = KTScrollspy;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(8156);\n"],"names":["root","factory","exports","module","define","amd","a","i","self","KTSelect","KTSelectRemote","KTSelectCombobox","KTSelectSearch","KTSelectTags","KTSelectDropdown","filterOptions","FocusManager","EventManager","TypeToSearchBuffer","element","config","_name","_defaultConfig","mode","target","has","_init","_buildConfig","_update","this","_element","_getOption","targetEl","getElement","parentNode","prepend","append","update","handleResize","window","addEventListener","throttle","timer","document","querySelectorAll","forEach","reparent","KTReparent","getInstance","console","log","get","getOrCreateInstance","createInstances","init","KT_REPARENT_INITIALIZED","zindex","enable","class","shownClass","hiddenClass","backdrop","backdropClass","backdropStatic","keyboard","disableScroll","persistent","container","focus","_config","_isOpen","_isTransitioning","_backdropElement","_relatedTarget","_handleClose","_handleContainer","on","_hide","_toggle","relatedTarget","payload","cancel","_fireEvent","_dispatchEvent","_show","KTDrawer","hide","parentElement","body","hasAttribute","originalParent","setAttribute","id","livewireComponent","closest","header","getAttribute","appendChild","_createBackdrop","classList","remove","add","parseInt","style","zIndex","overflow","reflow","transitionEnd","_autoFocus","removeAttribute","_deleteBackdrop","length","isEnabled","addClass","removeClass","position","querySelector","input","createElement","toString","event","preventDefault","opacity","_isEnabled","stringToBoolean","toggle","show","getRelatedTarget","isOpen","reference","findElement","drawerContainer","selector","drawerElInDoc","drawerElInBody","drawerEl","waitForElement","timeout","Promise","resolve","resolved","doResolve","existing","attempts","maxAttempts","pollInterval","setInterval","clearInterval","observer","MutationObserver","disconnect","observe","childList","subtree","setTimeout","drawerElement","drawer","handleToggle","rawEvent","stopPropagation","persistedHeader","then","drawerInstance","reinit","drawerAfterReinit","handleDismiss","modalElement","modal","handleClickAway","getOption","contains","handleKeyword","key","ctrlKey","altKey","shiftKey","code","metaKey","elementsInDoc","elementsInBody","allElements","Set","Array","from","KT_DRAWER_INITIALIZED","instance","e","KTSticky","activeStep","_activeStep","_nextElement","_backElement","_go","_handlers","_goNext","_goBack","error","state","_getTotalSteps","_getItemElements","index","contentElement","numberElement","innerHTML","String","elements","isVisible","push","step","_goTo","itemElement","_getStep","_getItemElement","_goLast","_goFirst","_isLast","_isFirst","isLast","isFirst","go","goTo","goFirst","goLast","goNext","goBack","getStep","getItemElement","getTotalSteps","getItemElements","KTStepper","activeClass","attribute","_targetElement","_getTargetElement","_isActive","hasClass","isActive","KTToggle","_currentTabElement","_currentContentElement","_lastTabElement","_lastContentElement","_tabElements","tabElement","_isShown","_getDropdownToggleElement","containerElement","isShown","keyboardArrow","keyboardJump","handleAccessibility","KTTabs","KT_TABS_INITIALIZED","_isAnimating","_expand","height","scrollHeight","_collapse","expand","collapse","KTCollapse","trigger","placement","placementRtl","strategy","offset","offsetRtl","delayShow","delayHide","permanent","_transitioning","_timeout","clearTimeout","_createPopper","_setZindex","_popper","destroy","isRtl","isRTL","offsetValue","split","map","value","trim","createPopper","modifiers","name","options","getCssProp","getHighestZindex","getContentElement","getTriggerOption","isPermanent","initHandlers","tooltipElement","tooltip","KTTooltip","KT_TOOLTIP_INITIALIZED","KTScrollable","KTTogglePassword","KTUtils","geUID","prefix","Math","floor","random","Date","getTime","getCssVar","variable","hex","getComputedStyle","documentElement","getPropertyValue","parseDataAttribute","Number","parseJson","JSON","parse","decodeURIComponent","parseSelector","CSS","escape","replace","match","capitalize","charAt","toUpperCase","slice","uncapitalize","toLowerCase","camelCase","letter","camelReverseCase","str","htmlElement","Boolean","func","delay","checksum","hash","charCodeAt","cleanedStr","stringToObject","parsed","isArray","stringToInteger","isNaN","num","stringToFloat","parseFloat","KTDataTable","_dataOptionPrefix","_uid","_shouldSkipInit","existingInstance","isConnected","dispose","_events","Map","set","eventType","callbacks","all","values","filter","callable","CustomEvent","detail","bubbles","cancelable","composed","dispatchEvent","_getGlobalConfig","KTGlobalComponentsConfig","getDataAttributes","callback","eventId","off","delete","KTAccordion","_previewUrl","_selectedFile","_inputElement","_hiddenElement","_removeElement","_previewElement","click","_change","_remove","reader","FileReader","onload","backgroundImage","result","readAsDataURL","files","_lastMode","_setPreviewUrl","_getPreviewUrl","url","isEmpty","isChanged","setPreviewUrl","getPreviewUrl","getSelectedFile","KTImageInput","top","middle","bottom","start","center","end","width","reverse","release","activate","_resizeHandler","_scrollHandler","_releaseElement","_activateElement","_wrapperElement","_attributeRoot","_eventTriggerState","_lastScrollTop","targetElement","_getTarget","_process","_getOffset","_disable","st","getScrollTop","scrollTop","isPartiallyInViewport","_enable","active","activateElement","abs","offsetTop","_calculateHeight","getViewPort","round","insetBlockStart","insetBlockEnd","insetInlineStart","offsetLeft","left","offsetRight","right","insetInlineEnd","removeEventListener","KTModal","_isLoading","_hasError","_errorMessage","_currentPage","_totalPages","_lastQuery","fetchData","query","page","_buildUrl","fetch","response","ok","Error","status","json","data","_processData","catch","remoteErrorMessage","finally","eventName","isLoading","hasError","errorMessage","dataUrl","params","URLSearchParams","searchParam","pagination","limitParam","paginationLimitParam","pageParam","paginationPageParam","limit","paginationLimit","paramsString","includes","processedData","apiDataProperty","total_pages","total","ceil","item","mappedItem","_mapItemToOption","dataValueField","nestedValue","part","expectedValue","warn","valueField","labelField","dataFieldText","getValue","obj","path","parts","field","undefined","substr","title","selected","disabled","loadNextPage","hasMorePages","getErrorMessage","reset","setElement","smooth","parent","_scroll","pos","scrollTo","behavior","scroll","KTScrollto","auto","basePlacements","clippingParents","viewport","popper","variationPlacements","reduce","acc","concat","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isElement","Element","isHTMLElement","HTMLElement","isShadowRoot","ShadowRoot","enabled","phase","fn","_ref","Object","keys","styles","attributes","assign","effect","_ref2","initialStyles","margin","arrow","hasOwnProperty","property","requires","getBasePlacement","max","min","getUAString","uaData","navigator","userAgentData","brands","brand","version","join","userAgent","isLayoutViewport","test","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","offsetHeight","visualViewport","addVisualOffsets","x","y","getLayoutRect","child","rootNode","getRootNode","next","isSameNode","host","isTableElement","indexOf","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mergePaddingObject","paddingObject","expandToHashMap","hashMap","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","len","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","_options$scroll","_options$resize","resize","scrollParents","scrollParent","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflowX","overflowY","getScrollParent","listScrollParents","list","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","direction","getDocumentRect","getClippingRect","boundary","rootBoundary","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","flipVariations","allowedAutoPlacements","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","placements","_options$allowedAutoP","allowedPlacements","overflows","sort","b","computeAutoPlacement","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","find","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","v","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","order","visited","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","arguments","args","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","m","_ref$options","cleanupFn","noopFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","onFirstUpdate","eventListeners","_globalConfig","optionsConfig","getHTMLOptionElement","textContent","getOptionDataForTemplate","el","text","content","render","defaultTemplates","option","KTSelectOption","_mode","_currentMode","_setMode","localStorage","getItem","currentMode","_getSystemMode","_bindMode","_updateState","setItem","_getMode","matchMedia","matches","checked","getMode","setMode","KTThemeSwitch","save","dependencies","wrappers","_elementId","_setupHeight","_setupState","heightType","_getHeightType","_getHeight","setProperty","stateEnabled","elementIdExists","storedPosition","_getHeightOption","_getAutoHeight","_getElementSpacing","_getElementHeight","computedStyle","marginTop","marginBottom","borderTopWidth","borderBottomWidth","spacing","paddingTop","paddingBottom","getHeight","KT_SCROLLABLE_INITIALIZED","KTDropdown","KTDelegatedEventHandlers","KTEventHandler","handler","call","expandAll","accordionElement","toggleElement","_hideSiblings","siblings","sibling","theadElement","getState","setState","fireEvent","updateData","toggleSortOrder","currentField","currentOrder","newField","setSortIcon","sortField","sortOrder","sortClass","classes","asc","desc","th","sortElement","base","className","initSort","cellIndex","sortData","aText","bText","compareValues","KTScrollspy","select","_select","getConfig","displayElement","getDisplayElement","_searchInputElement","_clearButtonElement","_valuesContainerElement","_boundInputHandler","_handleComboboxInput","bind","_boundClearHandler","_handleClearButtonClick","_attachEventListeners","multiple","displayTemplate","updateDisplay","getSelectedOptions","_toggleClearButtonVisibility","_removeEventListeners","isDropdownOpen","openDropdown","_filterOptionsForCombobox","clearSelection","showAllOptions","inputValue","hasSelectedItems","getOptionsElement","dropdownElement","getDropdownElement","_focusManager","focusFirst","selectedOptions","tags","optionElement","tagElement","tag","placeholder","renderDisplayTemplateForSelected","optionEl","selectedValue","headerChecked","headerCheckElement","targetElements","preserveSelection","checkbox","getSelectedRows","_state","selectedRows","setSelectedRows","rows","checkboxListener","checkboxToggle","isChecked","change","updateHeaderCheckboxState","reapplyCheckedStates","row","checkedClass","indeterminate","wasChecked","isNowChecked","handleRowCheckboxChange","uncheck","getChecked","updateState","KTToast","_originalTbodyClass","_originalTrClasses","_originalTheadClass","_originalTdClasses","_originalThClasses","_data","_isFetching","_abortController","_requestId","_initDefaultConfig","_initElements","_checkbox","createCheckboxHandler","eventData","_sortHandler","createSortHandler","_theadElement","_updateData","stateSave","_deleteState","_loadState","requestMethod","requestHeaders","info","infoEmpty","pageSizes","pageSize","pageMore","pageMoreLimit","number","previous","more","search","loading","template","table","size","spinner","loadingClass","_tableElement","_tbodyElement","tBodies","createTBody","tHead","_storeOriginalClasses","_infoElement","_sizeElement","_paginationElement","thElements","originalRows","rowIndex","tdElements","td","_showSpinner","apiEndpoint","_fetchDataFromLocal","_finalize","_fetchDataFromServer","_attachSearchEvent","_hideSpinner","tableId","_tableId","searchElement","_debouncedSearch","debouncedSearch","_debounce","originalData","_tableConfigInvalidate","_localTableHeaderInvalidate","_localTableContentInvalidate","_localExtractTableContent","originalDataAttributes","_temp","endIndex","startIndex","totalItems","_draw","stringify","_contentChecksum","restConfig","_configChecksum","allThs","ths","dataRow","colName","currentRequestId","queryParams","_getQueryParamsForFetchRequest","_performFetchRequest","responseData","statusText","mapResponse","totalCount","filters","column","type","mapRequest","requestBody","abort","AbortController","apiEndpointWithQueryParams","_createUrl","method","headers","requestCredentials","credentials","signal","reject","_noticeOnTable","pathOrUrl","baseUrl","location","origin","URL","normalizedPath","startsWith","totalPages","_dispose","_updateTable","_updatePagination","_saveState","removeChild","tbodyElement","_updateTableContent","fragment","createDocumentFragment","columns","colIndex","columnDef","DocumentFragment","createdCell","prototype","attr","message","cell","insertRow","insertCell","colSpan","_removeChildElements","_createPageSizeControls","_createPaginationControls","firstChild","onchange","_reloadPageSize","_setPaginationInfoText","paginationContainer","_createPaginationContainer","_createPaginationButtons","currentPage","createButton","handleClick","button","onclick","_paginateData","pageMoreEnabled","maxButtons","_calculatePageRange","startPage","endPage","halfMaxButtons","isInteger","_createSpinner","display","ns","_tableNamespace","stateString","removeItem","stateNamespace","replaceWith","cloneNode","wait","goPage","setPageSize","reload","redraw","showSpinner","hideSpinner","setFilter","f","_instances","instanceFromMap","currentTarget","getTargetElement","KT_MODAL_INITIALIZED","ktSelectInstance","_popperInstance","_toggleElement","_dropdownElement","_ktSelectInstance","modalParent","_getModalContainer","isCenteredModal","_resolveDropdownContainer","_eventManager","_setupEventListeners","addListener","_handleToggleClick","_handleOutsideClick","closeDropdown","_setDropdownWidth","dropdownWidth","toggleWidth","_getModalBoundary","_getPositioningStrategy","dropdownStrategy","_initPopper","_destroyPopper","dropdownPlacement","dropdownPreventOverflow","flip","dropdownFlip","_parseOffset","updatePosition","open","zIndexToApply","dropdownZindex","currentDropdownZIndexStr","currentDropdownZIndex","toggleParentContextZindex","close","transitionComplete","fallbackTimer","completeTransition","removeAllListeners","containerSelector","dropdownContainer","debug","interrupt","_dismiss","dismiss","KTDismiss","_triggerElement","_isVisible","_setVisible","flag","setVisible","_noResultsElement","_originalOptionContents","_searchInput","getSearchInput","handleSearchInput","_handleSearchInput","_cacheOriginalOptionContents","enableSearch","_handleSearchKeyDown","_resetAllOptions","clearSearch","remote","resetFocus","refreshOptionCache","getWrapperElement","clearSearchOnClose","_clearNoResultsMessage","closeOnEnter","_filterOptions","searchAutofocus","_focusSearchInputWithRetry","updateSelectAllButtonState","attempt","focusAttempt","activeElement","focusNext","focusPrevious","firstAvailableOption","optionValue","isAlreadySelected","shouldClose","toggleSelection","clear","_restoreOptionContentsBeforeFilter","originalContent","searchMinLength","count","_handleNoResults","visibleOptionsCount","_showNoResultsMessage","searchEmpty","optionsContainer","optionsToClear","refreshAfterSearch","_optionsContainer","_dropdownIsOpen","_comboboxModule","_tagsModule","_dropdownModule","_loadMoreIndicator","_selectAllButton","_selectAllButtonToggle","_typeToSearchBuffer","_mutationObserver","_preSelectedValues","_searchDebounceTimeout","_originalOptionsHtml","KTSelectState","_remoteModule","_initializeRemoteData","setItems","_setupComponent","globalConfig","dispatchGlobalEvents","eventDetail","nonNamespacedEvent","namespacedEventType","namespacedEvent","_createHtmlStructure","_setupElementReferences","_renderLoadingState","items","_clearExistingOptions","_generateOptionsHtml","_updateDropdownWithNewOptions","_completeRemoteSetup","_addLoadMoreButton","_renderErrorState","opt","_renderOptionsInDropdown","optionsData","clearContainer","_dropdownContentElement","optionData","HTMLOptionElement","dataItem","renderedOption","_preSelectOptions","validPreSelectedValues","valuesToSelect","existingSelections","setSelectedOptions","updateSelectedOptionDisplay","_updateSelectedOptionClass","_applyInitialDisabledState","_initializeSearchModule","combobox","_displayElement","_updateDisplayAndAriaAttributes","_setAriaAttributes","_focusSelectedOption","_observeNativeSelect","_showDropdownMessage","loadMore","_handleLoadMore","newItems","existingItems","getItems","_updateOptionsInDropdown","loadMoreText","loadMoreButton","selectOption","insertBefore","wrapperElement","wrapper","originalClasses","classesForWrapper","classesForDisplay","dropdown","enableSelectAll","selectAllElement","selectAll","after","nextElementSibling","searchWrapper","_handleDocumentClick","_handleDropdownOptionClick","_handleSelectAllClick","_handleKeyboardEvent","_searchModule","_handleRemoteSearch","extractedValue","_getValueByKey","label","extractedLabel","o","k","_selectOption","preSelectedValues","closeOnOtherOpen","openDropdowns","otherSelect","isOther","dropdownShowEvent","requestAnimationFrame","dropdownCloseEvent","updateDropdownPosition","focusOptionByValue","_isOptionDisabled","isSelected","toggleSelectedOptions","_syncNativeSelectValue","tagsEnabled","valueDisplayEl","getValueDisplayElement","updateTagsDisplay","renderSelected","placeholderEl","replaceChildren","getSelectedOptionsText","_isOptionOriginallyDisabled","originalOption","allOptions","selectedValues","maxReached","maxSelections","isOriginallyDisabled","deselectOption","allowClear","selectFocusedOption","focusedOption","getFocusedOption","dataset","titleElement","_handleOptionClick","clickedOption","styleAttr","enableMultiSelect","modifyConfig","disableMultiSelect","disable","newOptions","currentlySelected","availableValues","validSelections","_rebuildOptionsFromNative","_syncSelectionFromNative","refresh","_restoreOriginalOptions","_renderSearchLoadingState","_updateSearchResults","_renderSearchErrorState","searchDebounce","_updateOriginalSelectWithSearchResults","noResultsElement","displaySeparator","dropdownOption","isDropdownDisabled","isNativeDisabled","defaultPrevented","focusManager","buffer","repeat","focusLast","focusedOptionEl","val","blur","getBuffer","focusByString","entries","RegExp","renderTemplateString","selectedCount","selectedTexts","mutations","needsRebuild","needsSelectionSync","mutation","attributeName","attributeFilter","visibleOptions","getVisibleOptions","visibleValues","isAllSelected","clearAllText","selectAllText","KTComponents","ready","hoverTimeout","attach","_disabled","_menuElement","_setupNestedDropdowns","subToggle","subItem","subMenu","_click","_mouseover","_mouseout","parentZindex","_getPopperConfig","_isDropdownOpen","_getToggleElement","_getContentElement","mouseover","mouseout","getToggleElement","skipElement","handleKeyboard","dropdownEl","handleMouseover","handleMouseout","KT_DROPDOWN_INITIALIZED","menu","KTElementMap","KTData","valueMap","_valueDisplayElement","optionElements","originalOptions","closeButton","_removeTag","DEFAULT_CONFIG","duration","maxToasts","gap","DEFAULT_TOAST_OPTIONS","appearance","progress","action","_defaultToastOptions","getContent","classNames","outerHTML","icon","toolbar","actions","positionGroups","children","toast","currentOffset","transition","inputOptions","now","containerMap","firstElementChild","success","warning","primary","secondary","destructive","mono","variant","solid","outline","light","sm","md","lg","role","contentHtml","actionBtn","onClick","cancelBtn","dismissBtn","important","pointerEvents","animationDuration","directionClassMap","cls","dirClass","currentToasts","oldestToast","oldestId","beep","AudioContext","webkitAudioContext","createOscillator","g","createGain","frequency","gain","connect","destination","stop","_fireEventOnElement","_dispatchEventOnElement","timeoutId","toasts","startTime","remaining","paused","progressEl","ms","onAutoClose","pauseOnHover","matrix","animation","clearAll","clearContainers","idOrInstance","inst","_closing","onDismiss","KTDom","prop","setCssProp","innerWidth","innerHeight","getIndex","parents","childNodes","l","nodeType","getClientRects","isDisabled","Node","ELEMENT_NODE","getCSSTransitionDuration","animationEnd","getCSSAnimationDuration","transitionDuration","insertAfter","referenceNode","nextSibling","isParentOrElementHidden","scrollingElement","isInViewport","ww","hw","w","h","isVisibleInParent","childRect","parentRect","visibility","isVisibleVertically","isVisibleHorizontally","getRelativeTopPosition","normalizedKey","readyState","Intl","NumberFormat","currency","format","onVisibleCount","queryLower","_","optionsSelector","_focusedOptionIndex","_onFocusChange","_optionsSelector","_setupOptionClickHandlers","_focusClass","_hoverClass","applyFocus","scrollIntoView","lowerStr","startIdx","idx","_triggerFocusChange","optionRect","containerRect","block","findIndex","optionToFocus","getFocusedIndex","setFocusedIndex","setOnFocusChange","cb","_boundHandlers","context","boundHandler","removeListener","eventMap","lastTime","char","templates","userTemplateStrings","stringToElement","coreTemplateStrings","tagRemoveButton","getTemplateStrings","dropdownTemplate","customDropdownEl","dropdownClass","optionsClass","loadMoreClass","errorClass","wrapperClass","displayClass","optionTemplate","baseTemplate","optionClasses","optionClass","searchPlaceholder","searchClass","searchEmptyClass","searchEmptyTemplate","loadingMessage","preparedContent","innerText","tagTemplate","tagClass","placeholderClass","placeholderTemplate","DefaultConfig","onFetch","paginationTotalParam","isRequired","searchMaxItems","showSelectedCount","_selectedOptions","_fetchRemoteData","encodeURIComponent","setItemsFromOptions","splice","_anchorElements","anchorElement","_updateAnchor","_scrollTo","sectionElement","scrollPosition","parentAnchorElements","parentAnchorElement","updateAnchor","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","d","definition","defineProperty","enumerable","r","Symbol","toStringTag"],"ignoreList":[],"sourceRoot":""}
|