{"version":3,"file":"index.umd.cjs","names":["$attrs","$slots","$attrs","$emit","$slots","$slots","$slots","$emit","$emit","$emit","$slots","$emit","$slots","$attrs","$emit","$slots","$attrs","$slots","$props","$slots","$slots","$attrs","$slots","$slots","$attrs","$props","$slots","$attrs","$slots","$attrs","$props","$slots","$attrs","$props","$attrs","$slots","$attrs","$props","$slots","$attrs","$emit","$attrs","$slots","$attrs","$props","$slots","$emit","$slots","$slots","$slots"],"sources":["../src/utils/helpers.ts","../src/utils/ssr.ts","../src/utils/plugins.ts","../src/utils/config.ts","../src/utils/icons.ts","../src/composables/unrefElement.ts","../src/composables/defineClasses.ts","../src/composables/useEventListener.ts","../src/composables/useMatchMedia.ts","../src/components/field/fieldInjection.ts","../src/composables/useInputHandler.ts","../src/composables/useDebounce.ts","../src/composables/useIndexer.ts","../src/composables/useParentProvider.ts","../src/composables/useClickOutside.ts","../src/composables/useOptions.ts","../src/composables/usePreventScrolling.ts","../src/composables/useScrollHelper.ts","../src/composables/useConfig.ts","../src/composables/useTrapFocus.ts","../src/components/icon/Icon.vue","../src/components/icon/Icon.vue","../src/components/input/Input.vue","../src/components/input/Input.vue","../src/components/dropdown/DropdownItem.vue","../src/components/dropdown/DropdownItem.vue","../src/components/utils/PositionWrapper.vue","../src/components/utils/PositionWrapper.vue","../src/components/dropdown/Dropdown.vue","../src/components/dropdown/Dropdown.vue","../src/components/autocomplete/Autocomplete.vue","../src/components/autocomplete/Autocomplete.vue","../src/components/autocomplete/index.ts","../src/components/breadcrumb/Breadcrumb.vue","../src/components/breadcrumb/Breadcrumb.vue","../src/components/breadcrumb/BreadcrumbItem.vue","../src/components/breadcrumb/BreadcrumbItem.vue","../src/components/breadcrumb/index.ts","../src/components/button/Button.vue","../src/components/button/Button.vue","../src/components/button/index.ts","../src/components/carousel/CarouselItem.vue","../src/components/carousel/CarouselItem.vue","../src/components/carousel/Carousel.vue","../src/components/carousel/Carousel.vue","../src/components/carousel/index.ts","../src/components/checkbox/Checkbox.vue","../src/components/checkbox/Checkbox.vue","../src/components/checkbox/index.ts","../src/components/collapse/Collapse.vue","../src/components/collapse/Collapse.vue","../src/components/collapse/index.ts","../src/components/select/Select.vue","../src/components/select/Select.vue","../src/components/utils/PickerWrapper.vue","../src/components/utils/PickerWrapper.vue","../src/components/datepicker/utils.ts","../src/components/datepicker/useDatepickerMixins.ts","../src/components/datepicker/DatepickerTableRow.vue","../src/components/datepicker/DatepickerTableRow.vue","../src/components/datepicker/DatepickerTable.vue","../src/components/datepicker/DatepickerTable.vue","../src/components/datepicker/DatepickerMonth.vue","../src/components/datepicker/DatepickerMonth.vue","../src/components/datepicker/Datepicker.vue","../src/components/datepicker/Datepicker.vue","../src/components/datepicker/index.ts","../src/components/timepicker/useTimepickerMixins.ts","../src/components/timepicker/Timepicker.vue","../src/components/timepicker/Timepicker.vue","../src/components/datetimepicker/useDatetimepickerMixin.ts","../src/components/datetimepicker/Datetimepicker.vue","../src/components/datetimepicker/Datetimepicker.vue","../src/components/datetimepicker/index.ts","../src/components/loading/Loading.vue","../src/components/loading/Loading.vue","../src/components/utils/CloseButton.vue","../src/components/utils/CloseButton.vue","../src/components/dialog/Dialog.vue","../src/components/dialog/Dialog.vue","../src/components/programmatic/InstanceRegistry.ts","../src/components/programmatic/ProgrammaticComponent.ts","../src/components/programmatic/useProgrammatic.ts","../src/components/programmatic/index.ts","../src/components/dialog/useDialogProgrammatic.ts","../src/components/dialog/index.ts","../src/components/dropdown/index.ts","../src/components/field/Field.vue","../src/components/field/Field.vue","../src/components/field/index.ts","../src/components/icon/index.ts","../src/components/input/index.ts","../src/components/listbox/ListItem.vue","../src/components/listbox/ListItem.vue","../src/components/listbox/Listbox.vue","../src/components/listbox/Listbox.vue","../src/components/listbox/index.ts","../src/components/loading/useLoadingProgrammatic.ts","../src/components/loading/index.ts","../src/components/utils/PlainButton.ts","../src/components/menu/MenuItem.vue","../src/components/menu/MenuItem.vue","../src/components/menu/Menu.vue","../src/components/menu/Menu.vue","../src/components/menu/index.ts","../src/components/modal/Modal.vue","../src/components/modal/Modal.vue","../src/components/modal/useModalProgrammatic.ts","../src/components/modal/index.ts","../src/components/notification/Notification.vue","../src/components/notification/Notification.vue","../src/components/notification/NotificationNotice.vue","../src/components/notification/NotificationNotice.vue","../src/components/notification/useNotificationProgrammatic.ts","../src/components/notification/index.ts","../src/components/pagination/Pagination.vue","../src/components/pagination/Pagination.vue","../src/components/pagination/index.ts","../src/components/radio/Radio.vue","../src/components/radio/Radio.vue","../src/components/radio/index.ts","../src/components/select/index.ts","../src/components/skeleton/Skeleton.vue","../src/components/skeleton/Skeleton.vue","../src/components/skeleton/index.ts","../src/components/sidebar/Sidebar.vue","../src/components/sidebar/Sidebar.vue","../src/components/sidebar/useSidebarProgrammatic.ts","../src/components/sidebar/index.ts","../src/components/tooltip/Tooltip.vue","../src/components/tooltip/Tooltip.vue","../src/components/slider/SliderThumb.vue","../src/components/slider/SliderThumb.vue","../src/components/slider/SliderTick.vue","../src/components/slider/SliderTick.vue","../src/components/slider/Slider.vue","../src/components/slider/Slider.vue","../src/components/slider/index.ts","../src/components/steps/StepItem.vue","../src/components/steps/StepItem.vue","../src/components/steps/Steps.vue","../src/components/steps/Steps.vue","../src/components/steps/index.ts","../src/components/switch/Switch.vue","../src/components/switch/Switch.vue","../src/components/switch/index.ts","../src/components/utils/SlotComponent.ts","../src/components/table/TableMobileSort.vue","../src/components/table/TableMobileSort.vue","../src/components/table/TableColumn.vue","../src/components/table/TableColumn.vue","../src/components/table/TablePagination.vue","../src/components/table/TablePagination.vue","../src/components/table/Table.vue","../src/components/table/Table.vue","../src/components/table/index.ts","../src/components/tabs/TabItem.vue","../src/components/tabs/TabItem.vue","../src/components/tabs/Tabs.vue","../src/components/tabs/Tabs.vue","../src/components/tabs/index.ts","../src/components/tag/Tag.vue","../src/components/tag/Tag.vue","../src/components/tag/index.ts","../src/components/taginput/Taginput.vue","../src/components/taginput/Taginput.vue","../src/components/taginput/index.ts","../src/components/timepicker/index.ts","../src/components/tooltip/index.ts","../src/components/tree/TreeItem.vue","../src/components/tree/TreeItem.vue","../src/components/tree/Tree.vue","../src/components/tree/Tree.vue","../src/components/tree/index.ts","../src/components/upload/Upload.vue","../src/components/upload/Upload.vue","../src/components/upload/index.ts","../src/components/plugins.ts","../src/index.ts"],"sourcesContent":["import { Comment, Fragment, Text } from \"vue\";\nimport type { DeepKeys, DeepType, Numberish } from \"@/types\";\n\n/**\n * +/- function to native math sign\n */\nfunction signPoly(value: number): number {\n    if (value < 0) return -1;\n    return value > 0 ? 1 : 0;\n}\nexport const sign = Math.sign || signPoly;\n\n/**\n * Native modulo bug with negative numbers\n * @param n\n * @param mod\n * @returns {number}\n */\nexport const mod = (n: number, mod: number): number => ((n % mod) + mod) % mod;\n\n/** add a prefix `0` to a 1 digit number */\nexport const pad = (value: number): string => (value < 10 ? \"0\" : \"\") + value;\n\n/**\n * Asserts a value is beetween min and max\n * @param val\n * @param min\n * @param max\n * @returns {number}\n */\nexport function bound(val: number, min: number, max: number): number {\n    return Math.max(min, Math.min(max, val));\n}\n\n/**\n * checks if the value is of type object\n */\nexport const isObject = (value: unknown): value is object =>\n    !!value && typeof value === \"object\" && !Array.isArray(value);\n\n/**\n * checks if the value is of type date\n */\nexport const isDate = (value: unknown): value is Date =>\n    !!value && value instanceof Date && !isNaN(value.getTime());\n\n/**\n * checks if the value is not null or undefined\n */\nexport const isDefined = <T>(value: T | undefined | null): value is T =>\n    value !== null && typeof value !== \"undefined\";\n\n/**\n * Determines if the value of a prop that is either present (true) or not\n * present (undefined). For example, the prop disabled should disable\n * by just existing, but what if it is set to the string \"false\" — then it\n * should not be disabled.\n *\n * @param value - Value to check for undefined.\n * @returns boolean\n */\nexport const isTrueish = (value: unknown): boolean =>\n    isDefined(value) && value !== \"false\" && value !== false;\n\nexport const blankIfUndefined = (value: string | null | undefined): string =>\n    isDefined(value) ? value : \"\";\n\nexport const defaultIfUndefined = <T>(\n    value: T | undefined,\n    defaultValue: T,\n): T => (isDefined(value) ? value : defaultValue);\n\nexport const toCssDimension = (\n    width: Numberish | undefined,\n    dimension: string = \"px\",\n): string | undefined =>\n    !isDefined(width)\n        ? undefined\n        : isNaN(width as number)\n          ? String(width)\n          : String(width) + dimension;\n\nexport function isEmpty(value: unknown): boolean {\n    return (\n        value === null ||\n        value === undefined ||\n        value === \"\" ||\n        (Array.isArray(value) && value.length === 0) ||\n        (!(value instanceof Date) &&\n            typeof value === \"object\" &&\n            Object.keys(value).length === 0)\n    );\n}\n\nexport function isPrintableCharacter(char: string = \"\"): boolean {\n    return !isEmpty(char) && char.length === 1 && !!char.match(/\\S| /);\n}\n\n/**\n * Reorders an array starting from a given index, alternating between\n * the next and previous elements in a zigzag pattern.\n *\n * For example, given [10, 20, 30, 40, 50, 60] and startIndex = 2,\n * the result will be: [30, 40, 20, 50, 10, 60]\n *\n * @param {Array} arr - The input array to reorder.\n * @param {number} startIndex - The index to start the reordering from.\n * @returns {Array} A new array reordered around the start index.\n */\nexport function alternateArray<T>(arr: T[], startIndex: number): T[] {\n    const result: T[] = [];\n    const len = arr.length;\n\n    for (let offset = 0; offset < len; offset++) {\n        const index =\n            offset % 2 === 0\n                ? startIndex + Math.floor(offset / 2)\n                : startIndex - Math.ceil(offset / 2);\n\n        if (index >= 0 && index < len) result.push(arr[index]);\n    }\n\n    return result;\n}\n\n/**\n * Sort an array by the given `key`.\n * The `key` can be a path to a nested property, when array items are objects.\n * A custom sort function can be provided.\n * By default the original array is not mutated. Set `mutate` to true to sort in place.\n * @param array - Array to sort.\n * @param key - Key or path to sort by.\n * @param fn - Custom sort function.\n * @param isAsc - Whether to sort in ascending order.\n * @param mutate - Whether to mutate the original array.\n * @returns Sorted array.\n */\nexport function sortBy<T extends object, K extends string = DeepKeys<T>>(\n    array: T[],\n    key: K,\n    fn?: (a: T, b: T, asc: boolean) => number,\n    isAsc: boolean = false,\n    mutate: boolean = false,\n): T[] {\n    // Sorting without mutating original data\n    if (fn && typeof fn === \"function\") {\n        return (mutate ? array : [...array]).sort((a, b) => fn(a, b, isAsc));\n    } else {\n        return (mutate ? array : [...array]).sort((a, b) => {\n            // Get nested values from objects\n            let newA: any = isObject(a) ? getValueByPath(a, key) : a;\n            let newB: any = isObject(b) ? getValueByPath(b, key) : b;\n\n            // sort boolean type\n            if (typeof newA === \"boolean\" && typeof newB === \"boolean\") {\n                return isAsc ? (newA > newB ? 1 : -1) : newA > newB ? -1 : 1;\n            }\n\n            if (!newA && newA !== 0) return 1;\n            if (!newB && newB !== 0) return -1;\n            if (newA === newB) return 0;\n\n            newA = typeof newA === \"string\" ? newA.toUpperCase() : newA;\n            newB = typeof newB === \"string\" ? newB.toUpperCase() : newB;\n\n            return isAsc ? (newA > newB ? 1 : -1) : newA > newB ? -1 : 1;\n        });\n    }\n}\n\n/**\n * Deeply check if two values are equal\n */\nexport function isEqual(valueA: unknown, valueB: unknown): boolean {\n    // Check if only one value is empty.\n    if ((!valueA && !!valueB) || (!!valueA && !valueB)) return false;\n\n    // If both objects are identical, return true.\n    if (valueA === valueB) return true;\n\n    // Check if both values are objecs.\n    if (isObject(valueA) && isObject(valueB)) {\n        // Get the keys of both objects.\n        const keys1 = Object.keys(valueA);\n        const keys2 = Object.keys(valueB);\n\n        // Check if the number of keys is the same.\n        if (keys1.length !== keys2.length) return false;\n\n        // Iterate through the keys and compare their values recursively.\n        for (const key of keys1) {\n            const val1 = valueA[key];\n            const val2 = valueB[key];\n            if (!isEqual(val1, val2)) return false;\n        }\n        // If all checks pass, the objects are deep equal.\n        return true;\n    }\n\n    // Check if both values are arrays.\n    if (Array.isArray(valueA) && Array.isArray(valueB)) {\n        // Check if the number of keys is the same.\n        if (valueA.length !== valueB.length) return false;\n        // Check if each value of the array is the same.\n        if (!valueA.every((val, index) => isEqual(val, valueB[index])))\n            return false;\n        // If all checks pass, the arrays are deep equal.\n        return true;\n    }\n\n    return false;\n}\n\n/**\n * Merge function to replace Object.assign with deep merging possibility\n */\nexport function merge(target: any, source: any, deep = false): any {\n    if (!isObject(target) || !isObject(source)) return source;\n    if (!deep) return Object.assign(target, source);\n    else return mergeDeep(target, source);\n}\n\n/**\n * Performs a deep merge of `source` into `target`.\n * Mutates `target` only but not its objects and arrays.\n *\n * @author inspired by [jhildenbiddle](https://stackoverflow.com/a/48218209).\n */\nexport function mergeDeep(target: any, source: any): any {\n    if (!isObject(target) || !isObject(source)) return source;\n\n    Object.getOwnPropertyNames(source).forEach((key) => {\n        const targetValue = target[key];\n        const sourceValue = source[key];\n\n        if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\n            target[key] = targetValue.concat(sourceValue);\n        } else if (isObject(targetValue) && isObject(sourceValue)) {\n            target[key] = mergeDeep(\n                Object.assign({}, targetValue),\n                sourceValue,\n            );\n        } else {\n            target[key] = sourceValue;\n        }\n    });\n\n    return target;\n}\n\n/**\n * Return display text for an option.\n * If option is an object, get the property from path based on given field, or else just the property.\n * Apply a formatter function to the property if given.\n * Return the display label.\n *\n * @param obj Object to get the label for\n * @param field  Property path of the object to use as display text\n * @param formatter Function to format the property to a string\n */\nexport function getPropertyValue<\n    O,\n    K extends DeepKeys<O>,\n    D extends DeepType<O, K>,\n>(obj: O, field?: K, formatter?: (value: D, option: O) => string): string {\n    if (!obj) return \"\";\n\n    const property = (field ? getValueByPath<O, K, D>(obj, field) : obj) as D;\n\n    const label =\n        typeof formatter === \"function\" ? formatter(property, obj) : property;\n\n    return String(label || \"\");\n}\n\n/**\n * Get a value of an object property/path even if it's nested\n */\nexport function getValueByPath<\n    O,\n    K extends DeepKeys<O>,\n    D extends DeepType<O, K>,\n>(obj: O, path: K | (string & {})): D | undefined;\nexport function getValueByPath<\n    O,\n    K extends DeepKeys<O>,\n    D extends DeepType<O, K>,\n>(obj: O, path: K | (string & {}), defaultValue: D): D;\nexport function getValueByPath<\n    O,\n    K extends DeepKeys<O>,\n    D extends DeepType<O, K>,\n>(obj: O, path: K | (string & {}), defaultValue?: D): D | undefined;\nexport function getValueByPath<\n    O,\n    K extends DeepKeys<O>,\n    D extends DeepType<O, K>,\n>(obj: O, path: K | (string & {}), defaultValue?: D): D | undefined {\n    if (!obj || typeof obj !== \"object\" || typeof path !== \"string\")\n        return defaultValue;\n\n    const value: any = path\n        .split(\".\")\n        .reduce((o, i) => (typeof o !== \"undefined\" ? o[i] : undefined), obj);\n\n    return typeof value !== \"undefined\" ? value : defaultValue;\n}\n\n/**\n * Set a value of an object property/path even if it's nested\n */\nexport function setValueByPath<O, K extends DeepKeys<O>>(\n    obj: O,\n    path: K,\n    value: DeepType<O, K>,\n): void {\n    if (typeof path !== \"string\") return;\n\n    const p = path.split(\".\");\n    if (p.length === 1) {\n        obj[p[0]] = value;\n        return;\n    }\n    const field = p[0];\n    if (typeof obj[field] === \"undefined\") obj[field] = {};\n    return setValueByPath(obj[field], p.slice(1).join(\".\"), value);\n}\n\nexport function removeElement(el: Element): void {\n    if (typeof el.remove !== \"undefined\") {\n        el.remove();\n    } else if (typeof el.parentNode !== \"undefined\" && el.parentNode !== null) {\n        el.parentNode.removeChild(el);\n    }\n}\n\n/**\n * Escape regex characters\n * http://stackoverflow.com/a/6969486\n */\nexport function escapeRegExpChars(value: string): string {\n    if (!value) return value;\n\n    // eslint-disable-next-line no-useless-escape\n    return value.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n}\n\n/**\n * Remove accents/diacritics in a string\n * https://stackoverflow.com/a/37511463\n */\nexport function removeDiacriticsFromString(value: string): string {\n    if (!value) return value;\n    return value.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\n}\n\n/** checks if a vue vnode is empty */\nexport function isVNodeEmpty(vnode): boolean {\n    if (!vnode) return true;\n    if (vnode.type === Comment) return true;\n    if (vnode.type === Text && !vnode.children.trim()) return true;\n    if (vnode.type === Fragment && isVNodeEmpty(vnode.children)) return true;\n    return false;\n}\n\n/**\n * Mobile detection\n * https://www.abeautifulsite.net/detecting-mobile-devices-with-javascript\n */\nexport const isMobileAgent = {\n    Android: (): boolean =>\n        typeof window !== \"undefined\" &&\n        !!window.navigator.userAgent.match(/Android/i),\n    BlackBerry: (): boolean =>\n        typeof window !== \"undefined\" &&\n        !!window.navigator.userAgent.match(/BlackBerry/i),\n    iOS: (): boolean =>\n        typeof window !== \"undefined\" &&\n        !!window.navigator.userAgent.match(/iPhone|iPad|iPod/i),\n    Opera: (): boolean =>\n        typeof window !== \"undefined\" &&\n        !!window.navigator.userAgent.match(/Opera Mini/i),\n    Windows: (): boolean =>\n        typeof window !== \"undefined\" &&\n        !!window.navigator.userAgent.match(/IEMobile/i),\n    any: (): boolean =>\n        isMobileAgent.Android() ||\n        isMobileAgent.BlackBerry() ||\n        isMobileAgent.iOS() ||\n        isMobileAgent.Opera() ||\n        isMobileAgent.Windows(),\n};\n","// Polyfills for SSR\n\nexport const isClient = typeof window !== \"undefined\";\n\nexport const HTMLElement = isClient ? window.HTMLElement : Object;\nexport const HTMLInputElement = isClient ? window.HTMLInputElement : Object;\nexport const File = isClient ? window.File : Object;\n","import type { App, defineComponent } from \"vue\";\nimport type { ProgrammaticFactory } from \"@/components/programmatic/useProgrammatic\";\nimport { type Oruga } from \"./config\";\n\n/**\n * Register a component to the vue app instance.\n * @internal\n */\nexport const registerComponent = (\n    app: App,\n    component: ReturnType<typeof defineComponent>, // type Component isn't correct since vue 3.5 any more\n): void => {\n    app.component(component.name, component);\n};\n\n/**\n * Register a global programmatic component factory interface to the oruga object.\n * @internal\n */\nexport const registerProgrammatic = (\n    oruga: Oruga,\n    component: string,\n    Factory: new () => ProgrammaticFactory,\n): void => {\n    // add new programmatic component factory to the programmatic oruga object\n    addProgrammatic(oruga, component, new Factory());\n};\n\n/**\n * Add components programmatic interfaces to the current oruga instance.\n * @internal\n */\nexport function addProgrammatic(\n    oruga: Oruga,\n    property: string,\n    component: object,\n): void {\n    // add the component on the property to the programmatic interface\n    oruga._programmatic[property] = component;\n}\n","import {\n    hasInjectionContext,\n    inject,\n    type App,\n    type InjectionKey,\n    type ObjectPlugin,\n} from \"vue\";\nimport { getValueByPath, merge, setValueByPath } from \"./helpers\";\nimport { isClient } from \"./ssr\";\nimport { addProgrammatic } from \"./plugins\";\nimport type { DeepKeys, DeepType, OrugaConfig } from \"@/types\";\n\n// extend the OrugaProgrammatic interface with `config` programmatic interface\ndeclare module \"../index\" {\n    interface OrugaProgrammatic {\n        config: typeof ConfigProgrammatic;\n    }\n}\n\n/** Interface of the programmtic component. interfaces.  */\nexport interface OrugaProgrammatic {\n    [key: string]: Record<string, any>;\n}\n\nexport type OrugaComponentPlugin = ObjectPlugin<{ oruga: Oruga }>;\n\n/** Oruga Vue Plugin Object */\nexport interface Oruga {\n    install(app: App, options?: OrugaConfig): void;\n\n    /**\n     * The vue instance oruga got registered into.\n     * @internal\n     */\n    _app: App;\n\n    /**\n     * The global config object for this instance.\n     * @internal\n     */\n    _config: OrugaConfig;\n\n    /**\n     * All registered components programmatic interfaces.\n     * @internal\n     */\n    _programmatic: OrugaProgrammatic;\n\n    /**\n     * Defines if this oruga instance is a testing instance.\n     * @internal\n     */\n    _testing?: boolean;\n\n    /**\n     * Adds a Oruga component plugin.\n     *\n     * @param plugin - Oruga component plugin to add\n     * @returns Oruga plugin instance\n     */\n    use(plugin: OrugaComponentPlugin): Oruga;\n    use(...plugins: OrugaComponentPlugin[]): Oruga;\n\n    /**\n     * Provides the oruga instance to the app context.\n     * This is useful when you need to use `useOruga()` in a different app instance than the one Oruga got installed in.\n     * @param app - The app instance to provide the oruga instance to.\n     */\n    provide(app: App): void;\n}\n\n/** provide/inject oruga key symbol */\nconst $ORUGA_SYMBOL = Symbol(\"$oruga\") as InjectionKey<Oruga>;\n\n/**\n * The global oruga instance  which allows colling `useOruga()` outside of a component setup\n * after the oruga plugin got installed.\n */\nlet globalOruga: Oruga | undefined;\n\nexport function setActiveOruga(oruga: Oruga | undefined): void {\n    globalOruga = oruga;\n}\n\n/**\n * Get the currently active oruga instance if there is any.\n */\nexport function getActiveOruga(): Oruga | undefined {\n    return (hasInjectionContext() && inject($ORUGA_SYMBOL)) || globalOruga;\n}\n\n/**\n * Create a new Oruga Vue plugin which sets the oruga config options.\n * @param config - Override or extend the default oruga config.\n * @param plugins - A list of component plugins to register them globally. By default, no components will be registered globally.\n * @returns A new Oruga instance.\n */\nexport function createOruga(\n    config: OrugaConfig = {},\n    plugins: OrugaComponentPlugin[] = [],\n): Oruga {\n    const _plugins: OrugaComponentPlugin[] = [];\n\n    const oruga: Oruga = {\n        // the vue instance Oruga gets installed in, it will be set in the install function\n        // @ts-expect-error it's actually empty here\n        _app: null,\n        // default config is defined here\n        _config: {\n            override: false,\n            iconPack: \"mdi\",\n            useHtml5Validation: true,\n            statusIcon: true,\n            transformClasses: undefined,\n            mobileBreakpoint: \"1023px\",\n            teleportTarget: () => (isClient ? document.body : \"body\"),\n            ...config,\n        },\n        // map of all registered programmatic interfaces\n        // @ts-expect-error it's empty at first\n        _programmatic: {},\n\n        // vue plugin install function\n        install(app: App, options: OrugaConfig = {}): void {\n            // set global vue instance for programmatic usage\n            oruga._app = app;\n            // merge additional options with the base config\n            oruga._config = merge(oruga._config, options, true);\n\n            // set the global oruga instance\n            setActiveOruga(oruga);\n\n            // provide the oruga instance to the app context\n            this.provide(app);\n\n            // register the programmatic config interface to the programmatic oruga object\n            addProgrammatic(oruga, \"config\", ConfigProgrammatic);\n\n            // register oruga component plugins\n            _plugins.forEach((p) => app.use(p, { oruga }));\n        },\n        // helper to register component plugins on install\n        use(...plugins: OrugaComponentPlugin[]): Oruga {\n            plugins.forEach((p) => _plugins.push(p));\n            return oruga;\n        },\n        // helper to provide the oruga instance to another app instance\n        provide(app: App): void {\n            // provide the oruga instance\n            app.provide($ORUGA_SYMBOL, oruga);\n            // set the oruga instance as globalProperties\n            app.config.globalProperties.$oruga = oruga;\n        },\n    };\n\n    // register global components\n    oruga.use(...plugins);\n\n    return oruga;\n}\n\n/**\n * Create a new oruga instance and set it as active even the plugin got not installed yet.\n * @param config - Override or extend the default oruga config.\n * @returns A new Oruga instance.\n */\nexport function createTestingOruga(config: OrugaConfig = {}): Oruga {\n    const oruga = createOruga(config);\n    oruga._testing = true;\n    setActiveOruga(oruga);\n    return oruga;\n}\n\n/**\n * Get the oruga instence by injecting from the current context.\n * Throws an error when no inject context or no oruga instance is available.\n * @internal\n */\nfunction getOruga(): Oruga {\n    // inject the current active oruga instance\n    const oruga = getActiveOruga();\n    if (!oruga)\n        throw new Error(\n            \"No Oruga instance available. Have you installed the Oruga plugin yet?\",\n        );\n\n    return oruga;\n}\n\n/**\n * Composable for internal and external usage of programmatic components.\n * It returns the programmatic interface of the current active oruga instance if there is any.\n */\nexport function useOruga(): OrugaProgrammatic {\n    return getActiveOruga()?._programmatic ?? ({} as OrugaProgrammatic);\n}\n\n/**\n * Get the config of the current active oruga instance if there is any.\n */\nexport function getConfig(): OrugaConfig {\n    return getActiveOruga()?._config ?? {};\n}\n\n/**\n * Override the config of the current active Oruga instance.\n * The given config will be mergen in the existing one.\n * Throws an error when no inject context or no oruga instance is available.\n *\n * @param config - The new config to be mergen into the existing one.\n */\nexport function setConfig(config: OrugaConfig): void {\n    const oruga = getOruga();\n    const _config = merge(oruga._config, config, true);\n    oruga._config = _config;\n}\n\n/**\n * Get a config option by an option path\n * with an optional default value as fallback when no config is set.\n */\nexport function getOption<\n    K extends DeepKeys<OrugaConfig>,\n    D extends DeepType<OrugaConfig, K>,\n>(path: K | (string & {}), defaultValue: D): D;\nexport function getOption<\n    K extends DeepKeys<OrugaConfig>,\n    D extends DeepType<OrugaConfig, K>,\n>(path: K | (string & {}), defaultValue?: D): D | undefined;\nexport function getOption<\n    K extends DeepKeys<OrugaConfig>,\n    D extends DeepType<OrugaConfig, K>,\n>(path: K | (string & {}), defaultValue?: D): D | undefined {\n    const config = getConfig();\n    return getValueByPath<OrugaConfig, K, D>(config, path, defaultValue);\n}\n\n/** Add a config option to the config object. */\nfunction setOption<K extends DeepKeys<OrugaConfig>>(\n    path: K,\n    value: DeepType<OrugaConfig, K>,\n): void {\n    const oruga = getOruga();\n    setValueByPath(oruga._config, path, value);\n}\n\n/**\n * Less type strict version of getOption for component props defaults.\n * @internal\n */\nexport function getDefault<T>(\n    path: DeepKeys<OrugaConfig>,\n    defaultValue?: T,\n): T {\n    const config = getConfig();\n    return getValueByPath(config, path, defaultValue) as T & {};\n}\n\n/**\n * less type strict version of getOption for component prop default with type function\n * @internal\n */\nexport function getDefaultFunction<T>(\n    path: DeepKeys<OrugaConfig>,\n    defaultValue?: T,\n): (...args) => any {\n    return (...args) => {\n        const f = getDefault(path, defaultValue);\n        if (typeof f === \"function\") return f(...args);\n    };\n}\n\nconst ConfigProgrammatic = {\n    getOption,\n    setOption,\n    getConfig,\n    setConfig,\n};\n\nexport function useConfigProgrammatic(): typeof ConfigProgrammatic {\n    return ConfigProgrammatic;\n}\n","import { getOption } from \"./config\";\nimport { merge } from \"./helpers\";\n\nexport type IconConfig = {\n    sizes?: { default: string; [key: string]: string };\n    iconPrefix?: string;\n    internalIcons?: Record<string, string>;\n};\n\nconst mdiIcons = {\n    iconPrefix: \"mdi-\",\n    sizes: {\n        default: \"mdi-24px\",\n        small: \"\",\n        medium: \"mdi-36px\",\n        large: \"mdi-48px\",\n    },\n} as const;\n\nfunction getFaIcons(): IconConfig {\n    const iconComponent = getOption(\"iconComponent\");\n    const faIconPrefix = iconComponent ? \"\" : \"fa-\";\n    return {\n        iconPrefix: faIconPrefix,\n        sizes: {\n            default: \"\",\n            small: \"sm\",\n            medium: \"lg\",\n            large: \"xl\",\n        },\n        internalIcons: {\n            check: \"check\",\n            information: \"info-circle\",\n            alert: \"exclamation-triangle\",\n            \"alert-circle\": \"exclamation-circle\",\n            \"arrow-up\": \"arrow-up\",\n            \"chevron-right\": \"angle-right\",\n            \"chevron-left\": \"angle-left\",\n            \"chevron-down\": \"angle-down\",\n            \"chevron-up\": \"angle-up\",\n            eye: \"eye\",\n            \"eye-off\": \"eye-slash\",\n            \"caret-down\": \"caret-down\",\n            \"caret-up\": \"caret-up\",\n            \"close-circle\": \"times-circle\",\n            close: \"times\",\n            loading: \"circle-notch\",\n            \"emoticon-sad\": \"frown\",\n        },\n    } as const;\n}\n\nfunction getIcons(): Record<string, IconConfig> {\n    const faIcons = getFaIcons();\n    let icons: Record<string, IconConfig> = {\n        mdi: mdiIcons,\n        fa: faIcons,\n        fas: faIcons,\n        far: faIcons,\n        fad: faIcons,\n        fab: faIcons,\n        fal: faIcons,\n    };\n\n    const customIconPacks = getOption(\"customIconPacks\");\n    if (customIconPacks) icons = merge(icons, customIconPacks, true);\n\n    return icons;\n}\n\nexport default getIcons;\n","import {\n    toValue,\n    type ComponentPublicInstance,\n    type MaybeRefOrGetter,\n    type MaybeRef,\n    type Component,\n} from \"vue\";\n\nexport type MaybeElement =\n    | HTMLElement\n    | Component\n    | ComponentPublicInstance\n    | undefined\n    | null;\n\nexport type UnRefElementReturn<T extends MaybeElement> = T extends\n    | ComponentPublicInstance\n    | Component\n    ? HTMLElement\n    : T;\n\n/** Get the dom element of a ref of element or Vue component instance */\nexport function unrefElement<T extends MaybeElement>(\n    elRef: MaybeRefOrGetter<T> | MaybeRef<T>,\n): UnRefElementReturn<T> {\n    const plain = toValue(elRef);\n    return (plain as ComponentPublicInstance)?.$el ?? plain;\n}\n\n/** Resolve an HTML element based on query selector or an explizit dom element */\nexport function resolveElement(\n    target: MaybeRefOrGetter<HTMLElement | string>,\n): HTMLElement | null {\n    const targetQuery = toValue(target);\n    // query element if target is a string\n    if (typeof targetQuery === \"string\")\n        return document.querySelector<HTMLElement>(targetQuery);\n    // else unwrap element\n    else return unrefElement(targetQuery);\n}\n","import {\n    ref,\n    watch,\n    isRef,\n    toValue,\n    getCurrentInstance,\n    effectScope,\n    onScopeDispose,\n    getCurrentScope,\n    type MaybeRefOrGetter,\n    type Ref,\n    type ComponentInternalInstance,\n    type EffectScope,\n} from \"vue\";\n\nimport { getConfig } from \"@/utils/config\";\nimport {\n    isDefined,\n    blankIfUndefined,\n    getValueByPath,\n    isTrueish,\n} from \"@/utils/helpers\";\n\nimport type { ClassBinding, ComponentClass, TransformFunction } from \"@/types\";\n\n// named tuple as prop definition\ntype ComputedClass = readonly [\n    className: string,\n    defaultClass: string,\n    suffix?: MaybeRefOrGetter<string | undefined> | null,\n    apply?: MaybeRefOrGetter<boolean> | null,\n];\n\n/** Helper function to get all active classes from a class binding list */\nexport const getActiveClasses = (\n    classes: MaybeRefOrGetter<ClassBinding[]>,\n): string[] => {\n    const values = toValue(classes);\n    if (!values) return [];\n    return values.flatMap((bind) =>\n        Object.keys(bind)\n            .filter((key) => key && bind[key])\n            .flatMap((v) => v.split(\" \")),\n    );\n};\n\ntype DefineClassesOptions = {\n    /**\n     * Pass a custom effect scope.\n     * By default a new effect scope is created.\n     * An error will be thrown if no current scope or a custom scope is given.\n     * @default effectScope()\n     */\n    scope?: EffectScope;\n    /**\n     * Pass a custom props object which will be watched on additionaly to the current component instance props.\n     * this will recompute the class bind property when the class property change.\n     * @default vm.proxy?.$props\n     */\n    props?: Record<string, any>;\n    /**\n     * Pass a custom component instance.\n     * By default the current component instance is used.\n     */\n    vm?: ComponentInternalInstance;\n};\n\nexport function defineClasses(\n    ...args: [...ComputedClass[], DefineClassesOptions]\n): Ref<ClassBinding[]>;\n\nexport function defineClasses(\n    ...args: [...ComputedClass[]]\n): Ref<ClassBinding[]>;\n\n/**\n * Calculate dynamic classes based on class definitions\n */\nexport function defineClasses(\n    ...args: ComputedClass[] | [...ComputedClass[], DefineClassesOptions]\n): Ref<ClassBinding[]> {\n    // extract last argument if its the option object\n    const options = Array.isArray(args[args.length - 1])\n        ? undefined\n        : (args[args.length - 1] as DefineClassesOptions);\n\n    // get class defintion list based on options are given or not\n    const classDefinitions = (\n        Array.isArray(args[args.length - 1]) ? args : args.slice(0, -1)\n    ) as ComputedClass[];\n\n    // getting a hold of the internal instance of the component in setup()\n    const vm = options?.vm || getCurrentInstance();\n    if (!vm)\n        throw new Error(\n            \"defineClasses must be called within a component setup function.\",\n        );\n    // check if there is no current active effect scope given\n    if (!getCurrentScope() && !options?.scope)\n        throw new Error(\n            \"defineClasses must be called within a current active effect scope.\",\n        );\n\n    // create an effect scope object to capture reactive effects\n    const scope = options?.scope || effectScope();\n\n    // check if there is a current active effect scope\n    if (getCurrentScope())\n        // Registers a dispose callback on the current active effect scope.\n        // The callback will be invoked when the associated effect scope is stopped.\n        onScopeDispose(() => {\n            // stop all effects when appropriate\n            if (scope) scope.stop();\n        });\n\n    // reactive classes container\n    const classes = ref<ClassBinding[]>([]);\n\n    classes.value = classDefinitions.map((defintion, index) => {\n        const className = defintion[0];\n        const defaultClass = defintion[1];\n        const suffix = defintion[2];\n        const apply = defintion[3];\n\n        function getClassBind(): ClassBinding {\n            // compute class based on definition parameter\n            const computedClass = computeClass(\n                vm!,\n                className,\n                defaultClass,\n                toValue(suffix) || undefined,\n            );\n\n            // if apply is not defined or true\n            const applied = !isDefined(apply) || toValue(apply);\n\n            // return class bind property\n            return { [computedClass]: applied };\n        }\n\n        // run all watcher and computed properties in an active effect scope\n        scope.run(() => {\n            // recompute the class bind property when the class property change\n            watch(\n                [\n                    () => vm.proxy?.$props[className],\n                    () => (options?.props ? options?.props[className] : null),\n                ],\n                () => {\n                    // recompute the class bind property\n                    const classBind = getClassBind();\n                    // update class binding property by class index\n                    classes.value[index] = classBind;\n                },\n            );\n\n            // if suffix is defined, watch suffix changed and recalculate class\n            if (isDefined(suffix) && isRef(suffix)) {\n                watch(suffix, (value, oldValue) => {\n                    // only recompute when value has really changed\n                    if (value === oldValue) return;\n                    // recompute the class bind property\n                    const classBind = getClassBind();\n                    // update class binding property by class index\n                    classes.value[index] = classBind;\n                });\n            }\n\n            // if apply is defined, watch apply changed and update apply state (no need of recalculation here)\n            if (isDefined(apply) && isRef(apply)) {\n                watch(apply, (applied, oldValue) => {\n                    // only change apply when value has really changed\n                    if (applied === oldValue) return;\n                    // get class binding property by class index\n                    const classBind = classes.value[index];\n                    // update the apply class binding state\n                    Object.keys(classBind).forEach(\n                        (key) => (classBind[key] = applied),\n                    );\n                    // update the class binding property by class index\n                    classes.value[index] = classBind;\n                });\n            }\n        });\n\n        // return computed class based on parameter\n        return getClassBind();\n    });\n\n    // return reactive classes\n    return classes;\n}\n\n/**\n * Compute a class by a field name\n */\nfunction computeClass(\n    vm: ComponentInternalInstance,\n    field: string,\n    defaultValue: string,\n    suffix = \"\",\n): string {\n    // get component instance props\n    const props = getProps(vm);\n\n    const componentKey: string = vm.proxy?.$options.configField;\n    if (!componentKey)\n        throw new Error(\"component must define the 'configField' option.\");\n\n    // get the component config if it's not overridden by current instance\n    const config = isTrueish(props.override) ? {} : getConfig();\n\n    // --- Override Definition ---\n\n    // define instance override\n    const instanceOverride: boolean = isTrueish(props.override);\n\n    // define config override\n    const configOverride =\n        // do not have to check if config is already overridden\n        instanceOverride ||\n        // check root config override property\n        getValueByPath(config, \"override\") ||\n        // check component field config override property\n        getValueByPath(config, `${componentKey}.${field}.override`) ||\n        // check component config override property\n        getValueByPath(config, `${componentKey}.override`);\n\n    // --- Class Definition ---\n\n    let instanceClassString: string | undefined = undefined;\n    let configClassString: string | undefined = undefined;\n    let defaultClassString: string | undefined = undefined;\n\n    // procsess instance class definition if available\n    const instanceClass: ComponentClass | undefined =\n        // get instance class definition\n        getValueByPath(props, field);\n    // compile instance class\n    instanceClassString = compileClass(instanceClass, props, suffix);\n\n    if (!instanceOverride) {\n        if (!configOverride) {\n            // process default class definition if not overridden by instance or config\n            defaultClassString = applySuffix(defaultValue, suffix);\n        }\n\n        // process config class definition if not overriden by instance\n        const configClass: ComponentClass | undefined =\n            // get config class definition\n            getValueByPath(config, `${componentKey}.${field}.class`) ||\n            getValueByPath(config, `${componentKey}.${field}`);\n        // compile config class\n        configClassString = compileClass(configClass, props, suffix);\n    }\n\n    // --- Define Applied Classes ---\n\n    // add default classes if available\n    // add config classes if available\n    // add instance classes if available\n    let appliedClasses = [\n        defaultClassString ?? \"\",\n        configClassString ?? \"\",\n        instanceClassString ?? \"\",\n    ]\n        .join(\" \")\n        .trim()\n        .replace(/\\s\\s+/g, \" \");\n\n    // --- Tranform Classes ---\n\n    // get component config transform function\n    let transformClasses: TransformFunction | undefined = getValueByPath(\n        config,\n        `${componentKey}.transformClasses`,\n    );\n    if (!transformClasses)\n        // get root config transform function\n        transformClasses = getValueByPath(config, \"transformClasses\");\n\n    // apply transform function if available\n    if (typeof transformClasses === \"function\")\n        appliedClasses = transformClasses(appliedClasses);\n\n    return appliedClasses;\n}\n\n/** Compile a component class definition into a string. */\nfunction compileClass(\n    classDefinition: ComponentClass | undefined,\n    props: ReturnType<typeof getProps>,\n    suffix: string,\n): string {\n    // if definiton is undefined return empty class string\n    if (typeof classDefinition === \"undefined\") return \"\";\n\n    let classBinding: ClassBinding | ClassBinding[];\n\n    if (typeof classDefinition === \"function\")\n        // call class definition function\n        classBinding = classDefinition(suffix, props) ?? \"\";\n    else classBinding = classDefinition;\n\n    let classString = \"\";\n    if (Array.isArray(classBinding)) {\n        classString = classBinding\n            // transform the classBinding into a string\n            .map(processClassBinding)\n            // join all classes into one string\n            .join(\" \");\n    } else if (classBinding) {\n        // transform the classBinding into a string\n        classString = processClassBinding(classBinding);\n    }\n\n    // if suffix is not already applied by the classFunction\n    if (typeof classDefinition !== \"function\")\n        // apply suffix to the class string\n        classString = applySuffix(classString, suffix);\n\n    return classString;\n}\n\n/** Transform a classBinding object into a string. */\nfunction processClassBinding(classBinding: ClassBinding): string {\n    if (typeof classBinding === \"string\") return classBinding;\n\n    if (typeof classBinding === \"object\")\n        return (\n            Object.keys(classBinding)\n                // filter by the truthiness of the data property\n                .filter((key) => classBinding[key])\n                // join all classes into one string\n                .join(\" \")\n        );\n\n    return \"\";\n}\n\n/** Add a suffix to each word of an input string. */\nfunction applySuffix(value: string, suffix: string): string {\n    return blankIfUndefined(value)\n        .split(\" \")\n        .map((cls) => {\n            if (cls.includes(\"{*}\")) {\n                return cls.replace(/\\{\\*\\}/g, blankIfUndefined(suffix));\n            } else {\n                return cls + blankIfUndefined(suffix);\n            }\n        })\n        .join(\" \");\n}\n\n/** Get all props form an component instance. */\nfunction getProps(vm: ComponentInternalInstance): Record<string, any> {\n    let props = vm.proxy?.$props || {};\n\n    // get all props which ends with \"Props\", these are compressed parent props\n    // append these parent props as root level prop\n    props = Object.keys(props)\n        .filter((key) => key.endsWith(\"Props\"))\n        .map((key) => props[key])\n        .reduce((a, b) => ({ ...a, ...b }), props);\n\n    return props;\n}\n","import {\n    onMounted,\n    watch,\n    getCurrentScope,\n    onScopeDispose,\n    type MaybeRefOrGetter,\n    type Component,\n    type WatchSource,\n    toValue,\n} from \"vue\";\nimport { isObject } from \"@/utils/helpers\";\nimport { unrefElement } from \"./unrefElement\";\n\nexport type EventTarget = Element | Document | Window | Component;\nexport type EventListenerOptions = AddEventListenerOptions & {\n    /** Register event listener immediate or on mounted hook. */\n    immediate?: boolean;\n    /** Trigger when the listener get registered and removed */\n    trigger?: WatchSource<boolean>;\n};\n\n/**\n * Register DOM events using addEventListener on mounted, and removeEventListener automatically on unmounted.\n * Adaption of {@link  https://vueuse.org/core/useEventListener}\n *\n * @param element DOM element to add the listener to\n * @param event Event name\n * @param handler Event handler function\n * @param options EventListenerOptions\n * @return stop function\n */\nexport function useEventListener(\n    element: MaybeRefOrGetter<EventTarget>,\n    event: string,\n    handler: (evt?: any) => void,\n    options?: EventListenerOptions,\n): () => void {\n    let cleanup: () => void;\n\n    const register = (): void => {\n        if (!element) return;\n\n        const target = unrefElement(element);\n        // create a clone of options, to avoid it being changed reactively on removal\n        const optionsClone = isObject(options) ? { ...options } : options;\n        // register listener with timeout to prevent animation collision\n        setTimeout(() => {\n            target.addEventListener(event, handler, optionsClone);\n            cleanup = (): void => {\n                target.removeEventListener(event, handler, optionsClone);\n            };\n        });\n    };\n\n    let stopWatch: () => void;\n\n    if (typeof options?.trigger !== \"undefined\") {\n        stopWatch = watch(\n            options.trigger,\n            (value) => {\n                // toggle listener\n                if (value) register();\n                else if (typeof cleanup === \"function\") cleanup();\n            },\n            { flush: \"post\" },\n        );\n    }\n\n    if (options?.immediate) register();\n    else if (getCurrentScope()) {\n        // register listener on mount\n        onMounted(() => {\n            if (\n                typeof options?.trigger === \"undefined\" ||\n                toValue(options.trigger)\n            )\n                register();\n        });\n    }\n\n    const stop = (): void => {\n        // remove listener before unmounting\n        if (typeof stopWatch === \"function\") stopWatch();\n        if (typeof cleanup === \"function\") cleanup();\n    };\n\n    if (getCurrentScope()) onScopeDispose(stop);\n\n    return stop;\n}\n","import { getCurrentInstance, ref, type Ref } from \"vue\";\nimport { getOption } from \"@/utils/config\";\nimport { isClient } from \"@/utils/ssr\";\nimport { useEventListener } from \"./useEventListener\";\n\n/**\n * Checks if the match media is mobile.\n * @param mobileBreakpoint px breakpoint\n */\nexport function useMatchMedia(mobileBreakpoint?: string): {\n    isMobile: Ref<boolean>;\n} {\n    const isMobile = ref(false);\n    const mediaQuery = ref<MediaQueryList>();\n\n    // getting a hold of the internal instance in setup()\n    const vm = getCurrentInstance();\n    if (!vm)\n        throw new Error(\n            \"useMatchMedia must be called within a component setup function.\",\n        );\n    // get component props\n    const props = vm.props;\n\n    const componentKey = vm.proxy?.$options.configField;\n    if (!componentKey)\n        throw new Error(\"component must define the 'configField' option.\");\n\n    // get mobileBreakpoint width value\n    let width = props.mobileBreakpoint;\n    if (!width) {\n        const defaultWidth = getOption(`mobileBreakpoint`, mobileBreakpoint);\n        width = getOption(`${componentKey}.mobileBreakpoint`, defaultWidth);\n    }\n    if (!width) return { isMobile };\n\n    // define match media query ref\n    mediaQuery.value = isClient\n        ? window.matchMedia(`(max-width: ${width})`)\n        : undefined;\n\n    if (mediaQuery.value) {\n        isMobile.value = mediaQuery.value.matches;\n        useEventListener(mediaQuery.value, \"change\", onMatchMedia);\n    } else {\n        isMobile.value = false;\n    }\n\n    function onMatchMedia(event: MediaQueryListEvent): void {\n        isMobile.value = event.matches;\n    }\n\n    return { isMobile };\n}\n","import {\n    computed,\n    inject,\n    provide,\n    type ComputedRef,\n    type InjectionKey,\n} from \"vue\";\n\nimport { getOption } from \"@/utils/config\";\nimport type { FieldProps } from \"./props\";\n\nexport type FieldData = {\n    $el: Element | null;\n    props: FieldProps;\n    hasInnerField: boolean;\n    variant?: string;\n    message?: string | string[];\n    labelId: string;\n    inputAttrs: object;\n    addInnerField: () => void;\n    setInputId: (value: string) => void;\n    setFocus: (value: boolean) => void;\n    setFilled: (value: boolean) => void;\n    setVariant: (value?: string) => void;\n    setMessage: (value?: string | string[]) => void;\n};\n\n/** provide/inject type */\ntype ProvidedField = ComputedRef<FieldData | undefined>;\n\n/** provide/inject key */\nconst $FieldKey: InjectionKey<ProvidedField> = Symbol(\"FielData\");\n\n/**\n * Provide field component data via dependency injection.\n * Provided data is a computed ref to ensure reactivity.\n */\nexport function provideField(data: ProvidedField): void {\n    provide($FieldKey, data);\n}\n\n/** Inject parent field component if used inside one. **/\nexport function injectField(): {\n    parentField: ComputedRef<FieldData | undefined>;\n    statusVariantIcon: ComputedRef<string>;\n    statusVariant: ComputedRef<string | undefined>;\n    statusMessage: ComputedRef<string | string[] | undefined>;\n} {\n    const parentField = inject(\n        $FieldKey,\n        computed(() => undefined),\n    );\n\n    /** Get the message prop from parent if it's a Field. */\n    const statusMessage = computed<string | string[] | undefined>(() => {\n        if (\n            (Array.isArray(parentField?.value?.message) &&\n                !parentField?.value?.message.length) ||\n            (!Array.isArray(parentField?.value?.message) &&\n                !parentField?.value?.message)\n        )\n            return undefined;\n        return parentField?.value.message;\n    });\n\n    /** Get the type prop from parent if it's a Field. */\n    const statusVariant = computed<string | undefined>(() => {\n        if (!parentField?.value?.variant) return undefined;\n        if (typeof parentField.value.variant === \"string\")\n            return parentField.value.variant;\n        if (Array.isArray(parentField.value.variant)) {\n            for (const key in parentField.value.variant as any) {\n                if (parentField.value.variant[key]) return key;\n            }\n        }\n        return undefined;\n    });\n\n    const statusVariantIconConfig = getOption(\"statusVariantIcon\", {\n        success: \"check\",\n        danger: \"alert-circle\",\n        info: \"information\",\n        warning: \"alert\",\n    });\n\n    /** Icon name based on the variant. */\n    const statusVariantIcon = computed<string>(() => {\n        if (!statusVariant.value || !statusVariantIconConfig) return \"\";\n        return statusVariantIconConfig[statusVariant.value] || \"\";\n    });\n\n    return {\n        parentField,\n        statusVariant,\n        statusVariantIcon,\n        statusMessage,\n    };\n}\n","import {\n    nextTick,\n    ref,\n    computed,\n    triggerRef,\n    watch,\n    watchEffect,\n    type ExtractPropTypes,\n    type MaybeRefOrGetter,\n    type Component,\n} from \"vue\";\nimport { injectField } from \"@/components/field/fieldInjection\";\nimport { getOption } from \"@/utils/config\";\nimport { isClient } from \"@/utils/ssr\";\nimport { isDefined } from \"@/utils/helpers\";\nimport { unrefElement } from \"./unrefElement\";\n\n// This should cover all types of HTML elements that have properties related to\n// HTML constraint validation, e.g. .form and .validity.\nconst validatableFormElementTypes = isClient\n    ? [\n          HTMLButtonElement,\n          HTMLFieldSetElement,\n          HTMLInputElement,\n          HTMLObjectElement,\n          HTMLOutputElement,\n          HTMLSelectElement,\n          HTMLTextAreaElement,\n      ]\n    : [];\n\nexport type ValidatableFormElement = InstanceType<\n    (typeof validatableFormElementTypes)[number]\n>;\n\nfunction asValidatableFormElement(el: unknown): ValidatableFormElement | null {\n    return validatableFormElementTypes.some((t) => el instanceof t)\n        ? (el as ValidatableFormElement)\n        : null;\n}\n\nconst constraintValidationAttributes = [\n    \"disabled\",\n    \"required\",\n    \"pattern\",\n    \"maxlength\",\n    \"minlength\",\n    \"max\",\n    \"min\",\n    \"step\",\n];\n\n/**\n * Form input handler functionalities\n */\nexport function useInputHandler<T extends ValidatableFormElement>(\n    /** input ref element - can be a html element or a vue component*/\n    inputRef: Readonly<MaybeRefOrGetter<T | Component>>,\n    /** emitted input events */\n    emits: {\n        /** on input focus event */\n        (e: \"focus\", value: Event): void;\n        /** on input blur event */\n        (e: \"blur\", value: Event): void;\n        /** on input invalid event */\n        (e: \"invalid\", value: Event): void;\n    },\n    /** validation configuration props */\n    props: Readonly<\n        ExtractPropTypes<{\n            modelValue?: unknown;\n            useHtml5Validation?: boolean;\n            customValidity?:\n                | string\n                | ((currentValue: any, v: ValidityState) => string);\n        }>\n    >,\n) {\n    // inject parent field component if used inside one\n    const { parentField } = injectField();\n\n    /// Allows access to the native element in cases where it might be missing,\n    /// e.g. because the component hasn't been mounted yet or has been suspended\n    /// by a <KeepAlive>\n    const maybeElement = computed<T | undefined>(() => {\n        const el = unrefElement<Component | HTMLElement>(inputRef);\n        if (!el) return undefined;\n\n        if (el.getAttribute(\"data-oruga-input\"))\n            // if element is the input element\n            return el as T;\n\n        const inputs = el.querySelector(\"[data-oruga-input]\");\n\n        if (!inputs) {\n            console.warn(\n                \"useInputHandler: Underlaying Oruga input component not found\",\n            );\n            return undefined;\n        }\n        // return underlaying the input element\n        return inputs as T;\n    });\n\n    /// Should be used for most accesses to the native element; we generally\n    /// expect it to be present, especially in event handlers.\n    const element = computed(() => {\n        const el = maybeElement.value;\n        if (!el) console.warn(\"useInputHandler: inputRef contains no element\");\n        return el;\n    });\n\n    // --- Input Focus Feature ---\n\n    const isFocused = ref(false);\n\n    /** Focus the underlaying input element. */\n    function setFocus(): void {\n        nextTick(() => {\n            if (element.value) element.value.focus();\n        });\n    }\n\n    /** Click the underlaying input element. */\n    function doClick(): void {\n        nextTick(() => {\n            if (element.value) element.value.click();\n        });\n    }\n\n    /** Unset focused and emit blur event. */\n    function onBlur(event?: Event): void {\n        isFocused.value = false;\n        if (parentField?.value) parentField.value.setFocus(false);\n        emits(\n            \"blur\",\n            event\n                ? event\n                : new FocusEvent(\"blur\", { relatedTarget: element.value }),\n        );\n        checkHtml5Validity();\n    }\n\n    /** Set focused and emit focus event. */\n    function onFocus(event?: Event): void {\n        isFocused.value = true;\n        if (parentField?.value) parentField.value.setFocus(true);\n        emits(\n            \"focus\",\n            event\n                ? event\n                : new FocusEvent(\"focus\", { relatedTarget: element.value }),\n        );\n    }\n\n    // --- Validation Feature ---\n\n    const isValid = ref(true);\n\n    function setFieldValidity(variant, message): void {\n        nextTick(() => {\n            if (parentField?.value) {\n                // Set type only if not defined\n                if (!parentField.value.props.variant)\n                    parentField.value.setVariant(variant);\n\n                // Set message only if not defined\n                if (!parentField.value.props.message)\n                    parentField.value.setMessage(message);\n            }\n        });\n    }\n\n    /**\n     * Check HTML5 validation, set isValid property.\n     * If validation fail, send 'danger' type,\n     * and error message to parent if it's a Field.\n     */\n    function checkHtml5Validity(): void {\n        if (!props.useHtml5Validation) return;\n        if (!element.value) return;\n\n        if (element.value.validity.valid) {\n            setFieldValidity(null, null);\n            isValid.value = true;\n        } else {\n            setInvalid();\n            isValid.value = false;\n        }\n    }\n\n    function setInvalid(): void {\n        const variant = \"danger\";\n        const message = element.value?.validationMessage;\n        setFieldValidity(variant, message);\n    }\n\n    function onInvalid(event: Event): void {\n        checkHtml5Validity();\n        const validatable = asValidatableFormElement(event.target);\n\n        if (validatable && parentField?.value && props.useHtml5Validation) {\n            // We provide our own error message on the field, so we should suppress the browser's default tooltip.\n            // We still want to focus the form's first invalid input, though.\n            event.preventDefault();\n\n            let isFirstInvalid = false;\n\n            if (validatable.form != null) {\n                const formElements = validatable.form.elements;\n                for (let i = 0; i < formElements.length; ++i) {\n                    const element = asValidatableFormElement(\n                        formElements.item(i),\n                    );\n                    if (element?.willValidate && !element.validity.valid) {\n                        isFirstInvalid = validatable === element;\n                        break;\n                    }\n                }\n            }\n\n            if (isFirstInvalid) {\n                const fieldElement = parentField.value.$el;\n                const invalidHandler = getOption(\"invalidHandler\");\n\n                if (invalidHandler instanceof Function) {\n                    invalidHandler(validatable, fieldElement ?? undefined);\n                } else {\n                    // We'll scroll to put the whole field in view, not just the element that triggered the event,\n                    // which should mean that the message will be visible onscreen.\n                    // scrollIntoViewIfNeeded() is a non-standard method (but a very common extension).\n                    // If we can't use it, we'll just fall back to focusing the field.\n                    const canScrollToField =\n                        fieldElement?.scrollIntoView != undefined;\n                    validatable.focus({ preventScroll: canScrollToField });\n                    if (canScrollToField && fieldElement) {\n                        fieldElement.scrollIntoView({ block: \"nearest\" });\n                    }\n                }\n            }\n        }\n        emits(\"invalid\", event);\n    }\n\n    if (isClient) {\n        /**\n         * Provides a way to force the watcher on `updateCustomValidationMessage` to re-run\n         *\n         * There are some cases (e.g. changes to the element's validation attributes) that can\n         * force changes to the element's `validityState`, which isn't a reactive property.\n         * Note that just calling the watcher's internal function directly (outside the watcher)\n         * wouldn't be a complete solution; the watcher would then miss any new reactive dependencies\n         * that show up, e.g. because `props.customValidity` starts taking a branch that the watcher\n         * hasn't seen before.\n         */\n        const forceValidationUpdate = ref(null);\n\n        // Propagate any custom constraint validation message to the underlying DOM element.\n        // Note that using watchEffect will implicitly pick up any reactive dependencies used\n        // inside props.customValidity, which should help the computed message stay up to date.\n        watchEffect((): void => {\n            // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n            forceValidationUpdate.value;\n            if (!(props.useHtml5Validation ?? true)) return;\n\n            const element = maybeElement.value;\n            if (!isDefined(element)) return;\n\n            const validity = props.customValidity ?? \"\";\n            if (typeof validity === \"string\") {\n                element.setCustomValidity(validity);\n            } else {\n                // The custom validation message may depend on `element.validity`,\n                // which isn't a reactive property. `element.validity` depends on\n                // the element's current value and the native constraint validation\n                // attributes. We can use `props.modelValue` as a reasonable proxy\n                // for the DOM element's value, and `props.modelValue` _is_ reactive,\n                // so we can read it to help solve that reactivity problem.\n                element.setCustomValidity(\n                    validity(props.modelValue, element.validity),\n                );\n            }\n\n            // Updates the user-visible validation message if necessary\n            if (!isValid.value) checkHtml5Validity();\n        });\n\n        // Clean up validation state if we stop controlling it.\n        watch(\n            [maybeElement, (): boolean => props.useHtml5Validation ?? true],\n            (newItems, oldItems) => {\n                const newElement = newItems[0];\n                const newUseValidation = newItems[1];\n                const oldElement = oldItems[0];\n                const oldUseValidation = oldItems[1];\n                if (newElement !== oldElement) {\n                    // Since we're no longer managing the element, we might\n                    // as well clean up any custom validity we set up.\n                    oldElement?.setCustomValidity(\"\");\n                } else if (oldUseValidation && !newUseValidation) {\n                    newElement?.setCustomValidity(\"\");\n                }\n            },\n        );\n\n        // Respond to attribute changes that could affect validation messages.\n        //\n        // Technically, having the `required` attribute on one element in a radio button\n        // group affects the validity of the entire group.\n        // See https://html.spec.whatwg.org/multipage/input.html#radio-button-group.\n        // We're not checking for that here because it would require more expensive logic.\n        // Because of that, this will only work properly if the `required` attributes of all radio\n        // buttons in the group are synchronized with each other, which is likely anyway.\n        // (We're also expecting the use of radio buttons with our default validation message handling\n        // to be fairly uncommon because the overall visual experience is clunky with such a configuration.)\n        const onAttributeChange = (): void => {\n            triggerRef(forceValidationUpdate);\n        };\n\n        let validationAttributeObserver: MutationObserver | null = null;\n\n        watch(\n            [\n                maybeElement,\n                isValid,\n                (): boolean => props.useHtml5Validation ?? true,\n                ():\n                    | string\n                    | ((s: ValidityState, v: any) => string)\n                    | undefined => props.customValidity,\n            ],\n            (newData, oldData) => {\n                // Not using destructuring assignment because browser support is just a little too weak at the moment\n                const el = newData[0];\n                const valid = newData[1];\n                const useValidation = newData[2];\n                const functionalValidation = newData[3] instanceof Function;\n                const oldEl = oldData[0];\n\n                const needWatcher =\n                    isDefined(el) &&\n                    useValidation &&\n                    // For inputs known to be invalid, changes in constraint validation properties\n                    // may make it so the field is now valid and the message needs to be hidden.\n                    // For browser-implemented constraint validation (e.g. the `required` attribute),\n                    // we just care about the message displayed to the user, which is hidden for valid inputs\n                    // until the next interaction with the control.\n                    (!valid ||\n                        // For inputs with complex custom validation, any changes to validation-related attributes\n                        // may affect the results of `props.customValidity`.\n                        functionalValidation);\n\n                // Clean up previous state.\n                if (\n                    (!needWatcher || el !== oldEl) &&\n                    validationAttributeObserver != null\n                ) {\n                    // Process any pending events.\n                    if (validationAttributeObserver.takeRecords().length > 0)\n                        onAttributeChange();\n                    validationAttributeObserver.disconnect();\n                    validationAttributeObserver = null;\n                }\n\n                // Update the watcher.\n                // Note that this branch is also used for the initial setup of the watcher.\n                // We're assuming that `maybeElement` will start out null when the watcher is created, which will\n                // cause the watcher to be triggered (with `oldEl == undefined`) once the component is mounted.\n                if (\n                    needWatcher &&\n                    isDefined(el) &&\n                    (validationAttributeObserver == null || el !== oldEl)\n                ) {\n                    if (validationAttributeObserver == null) {\n                        validationAttributeObserver = new MutationObserver(\n                            onAttributeChange,\n                        );\n                    }\n                    validationAttributeObserver.observe(el, {\n                        attributeFilter: constraintValidationAttributes,\n                    });\n\n                    // Note that this doesn't react to changes in the list of ancestors.\n                    // Based on testing, Vue seems to rarely, if ever, re-parent DOM nodes;\n                    // it generally prefers to create new ones under the new parent.\n                    // That means this simpler solution is likely good enough for now.\n                    let ancestor: Node | null = el;\n                    while ((ancestor = ancestor.parentNode)) {\n                        // Form controls can be disabled by their ancestor fieldsets.\n                        if (ancestor instanceof HTMLFieldSetElement) {\n                            validationAttributeObserver.observe(ancestor, {\n                                attributeFilter: [\"disabled\"],\n                            });\n                        }\n                    }\n                }\n            },\n        );\n    }\n\n    return {\n        input: element,\n        isFocused,\n        isValid,\n        setFocus,\n        doClick,\n        onFocus,\n        onBlur,\n        onInvalid,\n        checkHtml5Validity,\n    };\n}\n","import { toValue, type MaybeRefOrGetter } from \"vue\";\n\n/**\n * Debounce execution of a function to limit the rate at which it will be invoked.\n * @param fn A function to be executed after delay milliseconds debounced.\n * @param ms A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @returns A new, debounce, function to call.\n */\nexport function useDebounce<A extends Array<unknown>>(\n    fn: (...args: A) => void,\n    ms: MaybeRefOrGetter<number> = 0,\n): (...args: A) => void {\n    let timeout: ReturnType<typeof setTimeout> | undefined;\n\n    return (...args: A) => {\n        if (toValue(ms) <= 0) {\n            fn.apply(this, args);\n            return;\n        }\n\n        const debouncedFunc = (): void => {\n            timeout = undefined;\n            fn.apply(this, args);\n        };\n\n        // clear old timeout\n        if (timeout) clearTimeout(timeout);\n\n        // create new timeout to call debounced function\n        timeout = setTimeout(debouncedFunc, toValue(ms));\n    };\n}\n","export type Indexer = {\n    nextIndex: () => string;\n    index: Readonly<number>;\n};\n\n/** create a unique index sequencer */\nexport function useIndexer(start: number = 0): Indexer {\n    let index = start;\n\n    /** increase the unique index */\n    function nextIndex(): string {\n        return String(index++);\n    }\n\n    return {\n        nextIndex,\n        index,\n    };\n}\n","import {\n    computed,\n    getCurrentInstance,\n    inject,\n    onUnmounted,\n    provide,\n    ref,\n    watch,\n    type Component,\n    type ComputedRef,\n    type MaybeRefOrGetter,\n    type Ref,\n} from \"vue\";\nimport { unrefElement } from \"./unrefElement\";\nimport { useIndexer } from \"./useIndexer\";\n\nexport type ProviderItem<T = unknown> = {\n    /** The root element of the item component */\n    el: MaybeRefOrGetter<HTMLElement | null>;\n    /** The index of the item component in the parent */\n    index: number;\n    /** A unique identifier for the item component */\n    identifier: string;\n    /** Item component data */\n    data: T;\n};\n\ntype PovidedData<P, I = unknown> = {\n    registerItem: (\n        el: MaybeRefOrGetter<HTMLElement | null>,\n        data: MaybeRefOrGetter<I>,\n    ) => ProviderItem<I>;\n    unregisterItem: (item: ProviderItem) => void;\n    total: ComputedRef<number>;\n    data?: ComputedRef<P>;\n};\n\ntype ProviderParentOptions<T = unknown> = {\n    /**\n     * Root element of the provider component\n     */\n    rootRef?: MaybeRefOrGetter<HTMLElement | Component | null | undefined>;\n    /**\n     * Override the provide/inject key.\n     * Default is the component configField attribute\n     */\n    key?: string | symbol;\n    /**\n     * Additional data provided for the child to the item\n     */\n    data?: ComputedRef<T>;\n};\n\n/**\n * Provide functionalities and data to child components\n * @param options parent provider options\n */\nexport function useProviderParent<ItemData = undefined, ParentData = unknown>(\n    options?: ProviderParentOptions<ParentData>,\n): {\n    childItems: Readonly<Ref<ProviderItem<ItemData>[]>>;\n    itemsCount: ComputedRef<number>;\n} {\n    // getting a hold of the internal instance in setup()\n    const vm = getCurrentInstance();\n    if (!vm)\n        throw new Error(\n            \"useProviderChild must be called within a component setup function.\",\n        );\n\n    const configField = String(vm.proxy?.$options.configField);\n    const key =\n        (typeof options?.key === \"symbol\"\n            ? options.key?.toString()\n            : options?.key) || configField;\n\n    const childItems = ref<ProviderItem<ItemData>[]>([]);\n    const total = computed<number>(() => childItems.value.length);\n\n    if (options?.rootRef) {\n        /** Sort child items according to their DOM position */\n        function sortItems(items: typeof childItems.value): void {\n            const parent = unrefElement(options?.rootRef);\n            if (!parent) return;\n\n            // create a list of child item ids\n            const ids = items\n                .map((item) => `[data-id=\"${key}-${item.identifier}\"]`)\n                .join(\",\");\n\n            if (!ids) return;\n\n            // query all child items in the order of the DOM appearance\n            const children = parent.querySelectorAll(ids);\n\n            // create a list of ids ordered after the elements in DOM\n            const sortedIds = Array.from(children).map((el) =>\n                el.getAttribute(\"data-id\")?.replace(`${key}-`, \"\"),\n            );\n\n            // update the index attribute of the child items\n            items.forEach(\n                (item) =>\n                    (item.index = sortedIds.indexOf(`${item.identifier}`)),\n            );\n\n            // sort items according to their index position\n            items.sort((a, b) => a.index - b.index);\n        }\n\n        // sort items when child items list get updated (no deep change - only list update)\n        // use flush: \"post\" to ensure DOM is updated and batch updates by a Vue tick\n        watch(childItems, sortItems, { flush: \"post\" });\n    }\n\n    const { nextIndex } = useIndexer(1);\n\n    /** register a child item on the parent */\n    function registerItem(\n        el: MaybeRefOrGetter<HTMLElement | null>,\n        data: MaybeRefOrGetter<ItemData>,\n    ): ProviderItem<ItemData> {\n        const index = childItems.value.length;\n        const identifier = nextIndex();\n        const item = { el, index, identifier, data };\n        // add new item to the child list\n        // this unwraps all inner refs\n        childItems.value = [\n            ...childItems.value,\n            item,\n        ] as ProviderItem<ItemData>[];\n        return item as ProviderItem<ItemData>;\n    }\n\n    /** unregister a child item on the parent */\n    function unregisterItem(item: ProviderItem): void {\n        childItems.value = childItems.value.filter(\n            (i) => i.identifier !== item.identifier,\n        );\n    }\n\n    /** Provide functionality for child components via dependency injection. */\n    provide<PovidedData<ParentData, ItemData>>(\"$o-\" + key, {\n        registerItem,\n        unregisterItem,\n        total: total,\n        data: options?.data,\n    });\n\n    return {\n        childItems: childItems as Ref<ProviderItem<ItemData>[]>,\n        itemsCount: total,\n    };\n}\n\ntype ProviderChildOptions<T = unknown> = {\n    /**\n     * Override the provide/inject key.\n     * Default is the component configField attribute\n     */\n    key?: string | symbol;\n    /**\n     * Does the child need the be below the parent?\n     * @default true\n     */\n    needParent?: boolean;\n    /**\n     * Additional data appended to the item\n     */\n    data?: ComputedRef<T>;\n    /**\n     * Register child on parent\n     * @default true\n     */\n    register?: boolean;\n};\n\nexport function useProviderChild<ParentData = undefined, ItemData = unknown>(\n    el: MaybeRefOrGetter<HTMLElement | null>,\n    options: Omit<ProviderChildOptions<ItemData>, \"needParent\"> & {\n        needParent: true;\n    },\n): {\n    parent: ComputedRef<ParentData>;\n    item: Readonly<Ref<ProviderItem<ItemData> | undefined>>;\n    itemsCount: ComputedRef<number>;\n};\n\nexport function useProviderChild<ParentData = undefined, ItemData = unknown>(\n    el: MaybeRefOrGetter<HTMLElement | null>,\n    options: Omit<ProviderChildOptions<ItemData>, \"needParent\"> & {\n        needParent: false;\n    },\n): {\n    parent: ComputedRef<ParentData | undefined>;\n    item: Readonly<Ref<ProviderItem<ItemData> | undefined>>;\n    itemsCount: ComputedRef<number>;\n};\n\nexport function useProviderChild<ParentData = undefined, ItemData = unknown>(\n    el: MaybeRefOrGetter<HTMLElement | null>,\n    options: Omit<ProviderChildOptions<ItemData>, \"needParent\"> & {\n        register: false;\n    },\n): {\n    parent: ComputedRef<ParentData>;\n    item: Readonly<Ref<undefined>>;\n    itemsCount: ComputedRef<number>;\n};\n\nexport function useProviderChild<ParentData = undefined, ItemData = unknown>(\n    el: MaybeRefOrGetter<HTMLElement | null>,\n    options: Omit<ProviderChildOptions<ItemData>, \"needParent\" | \"register\"> & {\n        needParent: true;\n        register: true;\n    },\n): {\n    parent: ComputedRef<ParentData>;\n    item: Readonly<Ref<ProviderItem<ItemData>>>;\n    itemsCount: ComputedRef<number>;\n};\n\nexport function useProviderChild<ParentData = undefined, ItemData = undefined>(\n    el: MaybeRefOrGetter<HTMLElement | null>,\n    options?: Omit<ProviderChildOptions<ItemData>, \"needParent\" | \"register\">,\n): {\n    parent: ComputedRef<ParentData>;\n    item: Readonly<Ref<ProviderItem<ItemData>>>;\n    itemsCount: ComputedRef<number>;\n};\n\n/**\n * Inject functionalities and data from parent components\n * @param options additional options\n */\nexport function useProviderChild<ParentData = undefined, ItemData = unknown>(\n    el: MaybeRefOrGetter<HTMLElement | null>,\n    options?: ProviderChildOptions<ItemData>,\n): {\n    parent: ComputedRef<ParentData | undefined>;\n    item: Readonly<Ref<ProviderItem | undefined>>;\n    itemsCount: ComputedRef<number>;\n} {\n    options = Object.assign({ needParent: true, register: true }, options);\n\n    // getting a hold of the internal instance in setup()\n    const vm = getCurrentInstance();\n    if (!vm)\n        throw new Error(\n            \"useProviderChild must be called within a component setup function.\",\n        );\n\n    const configField = String(vm.proxy?.$options.configField);\n    const key =\n        (typeof options?.key === \"symbol\"\n            ? options.key.toString()\n            : options?.key) || configField;\n\n    /** Inject parent component functionality if used inside one **/\n    const parent = inject<PovidedData<ParentData, ItemData> | undefined>(\n        \"$o-\" + key,\n        undefined,\n    );\n\n    if (options.needParent && !parent)\n        throw new Error(\n            `You should wrap ${vm.proxy?.$options.name} in a ${key} component`,\n        );\n\n    const data = options.data ?? computed(() => undefined as ItemData);\n    const parentData = parent?.data ?? computed(() => undefined);\n    const total = parent?.total ?? computed(() => 0);\n\n    const item = ref<ProviderItem<ItemData>>();\n\n    // register item at parent\n    if (parent && options.register) item.value = parent.registerItem(el, data);\n\n    onUnmounted(() => {\n        // unregister item at parent on item unmount\n        if (parent && item.value) parent.unregisterItem(item.value);\n    });\n\n    return { parent: parentData, item: item, itemsCount: total };\n}\n","import { type MaybeRefOrGetter } from \"vue\";\nimport {\n    useEventListener,\n    type EventTarget,\n    type EventListenerOptions,\n} from \"./useEventListener\";\nimport { unrefElement } from \"./unrefElement\";\n\n/**\n * Listen for clicks outside of an element.\n * Adaption of {@link https://vueuse.org/core/onClickOutside}\n *\n * @param elements DOM elements to click outside\n * @param handler Event handler function\n * @param options ClickOutsideOptions\n * @return stop function\n */\nexport function useClickOutside(\n    elements:\n        | MaybeRefOrGetter<EventTarget>\n        | string\n        | (MaybeRefOrGetter<EventTarget> | string)[],\n    handler: (evt: PointerEvent) => void,\n    options?: EventListenerOptions,\n): () => void {\n    if (!window) return () => {};\n\n    // set default options\n    const listenerOptions = Object.assign({ ignore: [] }, options);\n\n    // convert elements to ignore list\n    const ignores = Array.isArray(elements) ? elements : [elements];\n\n    /**\n     * White-listed items that not emit event when clicked.\n     * All children from ignore prop.\n     */\n    const shouldIgnore = (event: PointerEvent): boolean => {\n        return ignores.some((target) => {\n            if (typeof target === \"string\") {\n                return Array.from(\n                    window.document.querySelectorAll(target),\n                ).some(\n                    (el) =>\n                        el === event.target ||\n                        event.composedPath().includes(el),\n                );\n            } else {\n                const el = unrefElement(target);\n                return (\n                    el &&\n                    (event.target === el || event.composedPath().includes(el))\n                );\n            }\n        });\n    };\n\n    function listener(event: PointerEvent): void {\n        if (shouldIgnore(event)) return;\n        handler(event);\n    }\n\n    const stop = useEventListener(window, \"click\", listener, listenerOptions);\n\n    return stop;\n}\n","import { toValue, type MaybeRefOrGetter } from \"vue\";\nimport { isEqual } from \"@/utils/helpers\";\nimport { type Indexer } from \"./useIndexer\";\n\n//  --- PUBLIC API ---\n\n/**\n * An real option item object which get passed by an options property.\n *\n * @public\n */\nexport type Option<T extends object> = {} & T & Record<string, any>;\n\n/**\n * Simplified types of options that can be passed to the options prop.\n *\n * @public\n */\nexport type SimpleOptions =\n    | (string | number)[]\n    | Record<string | number, string>;\n\n/**\n * The types of options that can be passed to the options prop.\n *\n * @public\n */\nexport type OptionsProp<T extends object = object> =\n    | SimpleOptions\n    | Option<T>[];\n\n/**\n * Option groups should always be formatted as an array of group objects with nested options.\n *\n * @public\n */\nexport type OptionsGroupsProp<T extends object = object> = (Option<T> & {\n    /** list of options in this group */\n    options: OptionsProp<T>;\n})[];\n\n/**\n * A list of options that can either be a list of option items or a list of group items.\n *\n * @public\n */\nexport type OptionsOrGroupsProp<T extends object = object> =\n    | OptionsProp<T>\n    | OptionsGroupsProp<T>;\n\n//  --- INTERNAL API ---\n\n/**\n * Internal option item representation wrapper with additional information.\n * @internal\n */\nexport type OptionItem<T extends object> = {\n    /** internal genereated uniqe option key */\n    key: string;\n    /** the option item object */\n    item: Option<T>;\n};\n\n/**\n * Internal option group item representation wrapper with additional information.\n * @internal\n */\nexport type OptionGroupItem<T extends object> = {\n    /** internal genereated uniqe option key */\n    key: string;\n    /** the option item object */\n    item: Option<T>;\n    /** list of options */\n    options: OptionItem<T>[];\n};\n\n// ------------------\n\ntype SimpleOption = { label: string; value: string | number };\n\ntype NormalizedOption<T extends object> = OptionItem<T>;\n\ntype NormalizedGroup<T extends object> = Omit<OptionGroupItem<T>, \"options\"> & {\n    options: NormalizedOption<T>[];\n};\n\ntype NormalizedItem<T extends object = any> =\n    | NormalizedOption<T>\n    | NormalizedGroup<T>;\n\n/**\n * A function to normalize an array of objects, array of strings, or object of\n * key-value pairs to an array of internal option items.\n *\n * @param options - An un-normalized array of options.\n * @param indexer - An indexer to generate unique keys for each option.\n * @returns A list of normalized option items.\n */\nexport function normalizeOptions<T extends object>(\n    options: OptionsProp<T> | undefined,\n    indexer: Indexer,\n    groupable?: false,\n): NormalizedOption<T>[];\nexport function normalizeOptions<T extends object>(\n    options: OptionsOrGroupsProp<T> | undefined,\n    indexer: Indexer,\n    groupable: boolean,\n): NormalizedItem<T>[];\nexport function normalizeOptions<T extends object>(\n    options: OptionsProp<T> | OptionsGroupsProp<T> | undefined,\n    indexer: Indexer,\n    groupable: boolean = false,\n): NormalizedItem<T>[] {\n    if (!options) return [] as NormalizedOption<T>[];\n\n    if (Array.isArray(options)) {\n        return options.map(\n            (\n                option:\n                    | (string | number)\n                    | Option<T>\n                    | OptionsGroupsProp<T>[number],\n            ) => {\n                if (typeof option === \"string\" || typeof option === \"number\")\n                    // create options item from primitive\n                    return {\n                        item: {\n                            label: String(option),\n                            value: option,\n                        },\n                        key: indexer.nextIndex(),\n                    } satisfies NormalizedOption<SimpleOption>;\n\n                if (groupable && \"options\" in option) {\n                    const key = indexer.nextIndex();\n                    const options = normalizeOptions(\n                        option.options,\n                        indexer,\n                    ) as NormalizedOption<T>[];\n\n                    const item = { ...toValue(option) };\n                    delete item.options; // delete options from item to prevent loop\n\n                    // create group options item\n                    return {\n                        item,\n                        options,\n                        key,\n                    } satisfies NormalizedGroup<T>;\n                }\n\n                // create options item\n                return {\n                    item: toValue(option),\n                    key: indexer.nextIndex(),\n                };\n            },\n        ) as NormalizedItem<T>[];\n    }\n\n    // options are from type SimpleOption and is an object\n    return Object.keys(options).map(\n        (value: string | number) =>\n            ({\n                // create option from object key/value\n                item: {\n                    label: options[value],\n                    value,\n                },\n                key: indexer.nextIndex(),\n            }) satisfies NormalizedOption<SimpleOption>,\n    ) as unknown as NormalizedOption<T>[];\n}\n\n/**\n * Checks if the given normalized option item is an option group or not.\n *\n * @param options - An option item to check.\n * @returns True if the option is a group; otherwise, false.\n */\nexport function isGroupOption<T extends object>(\n    option: NormalizedItem<T>,\n): option is NormalizedGroup<T> {\n    return \"options\" in option;\n}\n\n/**\n * Determines if a normalized options list contains groups or not.\n *\n * @param options - An array of individual options or grouped options.\n * @returns True if the options are grouped; otherwise, false.\n */\nexport function areOptionsGrouped(\n    options: MaybeRefOrGetter<NormalizedItem[]>,\n): boolean {\n    const _options = toValue(options);\n    if (!_options?.length) return false;\n    return isGroupOption(_options[0]);\n}\n\n/**\n * Recursively finds the index of a specific option within a flat or grouped options array.\n * It traverses the structure and returns the index of the target option as if all options were flattened.\n *\n * @param options - A list of options, which may be a flat array or an array of grouped options.\n * @param option - The option to find within the options list.\n * @returns The index of the option if found; otherwise, -1.\n */\nexport function findOptionIndex<T extends object>(\n    options: MaybeRefOrGetter<NormalizedItem<T>[]>,\n    option: MaybeRefOrGetter<NormalizedOption<T>>,\n): number {\n    if (!Array.isArray(toValue(options))) return -1;\n    const optionItem = toValue(option).item;\n\n    let idx = 0;\n    for (const item of toValue(options)) {\n        if (typeof item !== \"object\" && item) continue;\n\n        // check if the first item has an options propery which defines it as group\n        if (isGroupOption(item)) {\n            // check options in group options\n            const groupIdx = findOptionIndex(item.options, option);\n            // increase full group options length when not found\n            if (groupIdx === -1) idx += item.options.length;\n            else {\n                // increase found index of group options\n                idx += groupIdx;\n                return idx;\n            }\n        }\n        // check if option is searched option\n        else if (isEqual(item.item, optionItem)) return idx;\n        // else increase search indx\n        else idx += 1;\n    }\n\n    // not matching option found\n    return -1;\n}\n\n/**\n * Recursively calculates the total number of options from a list of options or grouped options.\n *\n * @param options - An array of individual options or grouped options.\n * @returns The total count of individual options, including those nested within groups.\n */\nexport function getOptionsLength<T extends object>(\n    options: MaybeRefOrGetter<NormalizedItem<T>[]>,\n): number {\n    if (!Array.isArray(toValue(options))) return 0;\n\n    return toValue(options).reduce((length, item) => {\n        if (item && typeof item !== \"object\") return length;\n        if (isGroupOption(item)) {\n            return length + getOptionsLength(item.options);\n        }\n        return length + 1;\n    }, 0);\n}\n","import {\n    computed,\n    onBeforeUnmount,\n    ref,\n    toValue,\n    type MaybeRefOrGetter,\n} from \"vue\";\nimport { isClient } from \"@/utils/ssr\";\nimport { defineClasses, getActiveClasses } from \"./defineClasses\";\n\n/**\n * Prevent the background from scrolling if toggled.\n * Adds `clipped` or `keeped` class to the body.\n * True, alias `clip` removes the body scrollbar.\n * False, alias `keep` makes a non scrollable scrollbar to avoid shifting background, but will set body to position fixed, might break some layouts.\n * @param clipScroll clip scrollbar or not\n */\nexport function usePreventScrolling(\n    clipScroll: MaybeRefOrGetter<boolean>,\n): (active: boolean) => void {\n    const scrollClipClasses = defineClasses([\n        \"scrollClipClass\",\n        \"o-scroll-clip\",\n    ]);\n    const scrollKeepClasses = defineClasses([\n        \"scrollKeepClass\",\n        \"o-scroll-keep\",\n    ]);\n\n    const scrollClass = computed(() =>\n        getActiveClasses(\n            toValue(clipScroll)\n                ? scrollClipClasses.value\n                : scrollKeepClasses.value,\n        ),\n    );\n\n    const savedScrollTop = ref<number>();\n\n    // reset scroll\n    onBeforeUnmount(() => toggleScroll(false));\n\n    function toggleScroll(active: boolean): void {\n        if (!isClient) return;\n        if (!scrollClass.value) return;\n\n        savedScrollTop.value = savedScrollTop.value\n            ? savedScrollTop.value\n            : document.documentElement.scrollTop;\n\n        if (active) document.body.classList.add(...scrollClass.value);\n        else document.body.classList.remove(...scrollClass.value);\n\n        if (!toValue(clipScroll)) {\n            if (active) {\n                document.body.style.top = `-${savedScrollTop.value}px`;\n            } else {\n                document.documentElement.scrollTop = savedScrollTop.value;\n                document.body.style.top = \"\";\n                savedScrollTop.value = undefined;\n            }\n        }\n    }\n\n    return toggleScroll;\n}\n","import { getCurrentScope, type Component, type MaybeRefOrGetter } from \"vue\";\nimport { isDefined } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport { unrefElement } from \"./unrefElement\";\nimport { useDebounce } from \"./useDebounce\";\nimport {\n    useEventListener,\n    type EventListenerOptions,\n    type EventTarget,\n} from \"./useEventListener\";\n\n/** Call a function when the scoll reaches the end or the start of an element.\n * This is useful for infinite scroll lists.\n * @param element - The element to listen for scroll events.\n * @param options - Options for the infinite scroll.\n * @param options.onScroll - Function to call on every scroll event.\n * @param options.onEnd - Function to call when the scroll reaches the end.\n * @param options.onStart - Function to call when the scroll reaches the start.\n * @param options.debounce - Debounce time in milliseconds for the function call on scroll events.\n * @returns A function to call to to manually check the scroll position.\n */\nexport function useScrollEvents(\n    element: MaybeRefOrGetter<EventTarget>,\n    options: {\n        onScroll?: () => void;\n        onScrollEnd?: () => void;\n        onScrollStart?: () => void;\n        debounce?: number;\n    },\n    listenerOptions?: EventListenerOptions,\n): () => void {\n    if (!getCurrentScope())\n        throw new Error(\n            \"The 'useScrollEvents' composable should be used inside a current EffectScope.\",\n        );\n\n    /** debounced checkScroll funciton */\n    const debouncedCheckScroll = useDebounce(\n        checkScroll,\n        options.debounce ?? 100,\n    );\n\n    if (isClient)\n        useEventListener(\n            element,\n            \"scroll\",\n            debouncedCheckScroll,\n            listenerOptions,\n        );\n\n    /** Check if the scroll list inside the dropdown reached the top or it's end. */\n    function checkScroll(): void {\n        const el = unrefElement(element);\n        if (!el) return;\n        if (options.onScroll) options.onScroll();\n        const { offsetTop, scrollTop, clientHeight, scrollHeight } = el;\n\n        const trashhold = offsetTop;\n        if (clientHeight !== scrollHeight) {\n            if (\n                Math.ceil(scrollTop + clientHeight + trashhold) >= scrollHeight\n            ) {\n                if (options.onScrollEnd) options.onScrollEnd();\n            } else if (scrollTop <= trashhold) {\n                if (options.onScrollStart) options.onScrollStart();\n            }\n        }\n    }\n\n    return debouncedCheckScroll;\n}\n\n/**\n * Given an element, returns the element who scrolls it.\n */\nexport function getScrollingParent(target: HTMLElement): HTMLElement | null {\n    if (target.style.position === \"fixed\" || !target)\n        return document.documentElement;\n\n    let isScrollingParent = false;\n    let nextParent = target.parentElement;\n\n    while (!isScrollingParent && isDefined(nextParent)) {\n        if (nextParent === document.documentElement) break;\n\n        const { overflow, overflowY } = getComputedStyle(nextParent);\n        const { scrollHeight, clientHeight } = nextParent; // Both rounded by nature\n\n        isScrollingParent =\n            /(auto|scroll)/.test(`${overflow}${overflowY}`) &&\n            scrollHeight > clientHeight;\n\n        /* ...found it, this one is returned */\n        if (isScrollingParent) break;\n\n        /* ...if not check the next one */\n        nextParent = nextParent.parentElement;\n    }\n\n    return nextParent;\n}\n\n/**\n * Ensure a given child element is within the parent's visible scroll area.\n * If the child is not visible, scroll the parent to the child's position.\n */\nexport function scrollElementInView(\n    scrollableParent: MaybeRefOrGetter<HTMLElement | Component | null>,\n    childElement: MaybeRefOrGetter<HTMLElement | Component | null>,\n): void {\n    const parent = unrefElement(scrollableParent);\n    const element = unrefElement(childElement);\n\n    if (!parent || !element) return;\n\n    // The 'offsetTop' is the distance from the outer border of the element (including margin)\n    // to the top padding edge of the offsetParent, the closest positioned ancestor element.\n    // The 'offsetHeight' is the height of an element, including vertical padding and borders, as an integer.\n    // The 'scrollTop' is the number of pixels by which an element's content is scrolled from its top edge.\n    const { offsetHeight, offsetTop } = element;\n    const { offsetHeight: parentOffsetHeight, scrollTop } = parent;\n\n    const isAbove = offsetTop < scrollTop;\n    const isBelow = offsetTop + offsetHeight > scrollTop + parentOffsetHeight;\n\n    if (isAbove) {\n        parent.scrollTo(0, offsetTop);\n    } else if (isBelow) {\n        parent.scrollTo(0, offsetTop - parentOffsetHeight + offsetHeight);\n    }\n}\n","import { toValue } from \"vue\";\nimport { getOption } from \"@/utils/config\";\n\n/** Get the root config `teleportTarget`. */\nexport function getTeleportDefault(): HTMLElement | string {\n    const option = getOption(\"teleportTarget\", \"body\");\n    return toValue<HTMLElement | string>(option);\n}\n","import {\n    toValue,\n    type DirectiveHook,\n    type MaybeRefOrGetter,\n    type ObjectDirective,\n} from \"vue\";\n\n/**\n * Returns all focusable elements inside the given element\n */\nexport function findFocusable(\n    element: MaybeRefOrGetter<HTMLElement | null>,\n): NodeListOf<HTMLElement> {\n    const el = toValue(element);\n    if (!el) return [] as unknown as NodeListOf<HTMLElement>;\n    return el.querySelectorAll(`a[href]:not([tabindex=\"-1\"]),\n                                 area[href],\n                                 input:not([disabled]):not([type=\"hidden\"]),\n                                 select:not([disabled]),\n                                 textarea:not([disabled]),\n                                 button:not([disabled]),\n                                 iframe,\n                                 object,\n                                 embed,\n                                 *[tabindex]:not([tabindex=\"-1\"]):not([disabled]),\n                                 *[contenteditable]`);\n}\n\n/**\n * Creates a vue v-trap-focus directive which sets the focus on the given element when mounted\n * and traps the focus inside the element.\n */\nexport function useTrapFocus(): {\n    /** vue directive - trap focus on the current element */\n    vTrapFocus: ObjectDirective<HTMLElement>;\n} {\n    /** keydown event, which compares event target with trap element */\n    let onKeyDown: ((event: KeyboardEvent) => void) | null = null;\n\n    function applyHandler(el: HTMLElement, value: boolean): void {\n        if (value) {\n            // move focus inside the root element\n            el.focus({ preventScroll: true });\n\n            // set keydown event listener\n            if (typeof onKeyDown === \"function\")\n                el.addEventListener(\"keydown\", onKeyDown);\n        } else {\n            // remove keydown event listener\n            if (typeof onKeyDown === \"function\")\n                el.removeEventListener(\"keydown\", onKeyDown);\n        }\n    }\n\n    const onMounted: DirectiveHook<HTMLElement> = (el, { value }) => {\n        // create onKeyDown event listener\n        onKeyDown = (event: KeyboardEvent): void => {\n            const target = event.target as HTMLElement;\n            if (!target) return;\n\n            // Need to get focusable each time since it can change between key events\n            // ex. changing month in a datepicker\n            const focusable = findFocusable(el);\n            if (!focusable?.length) {\n                event.preventDefault();\n                return;\n            }\n\n            const firstFocusable = focusable[0];\n            const lastFocusable = focusable[focusable.length - 1];\n\n            if (\n                target === firstFocusable &&\n                event.shiftKey &&\n                event.key === \"Tab\"\n            ) {\n                // prevent moving focus outside by setting the focus to last focusable element\n                event.preventDefault();\n                lastFocusable.focus();\n            } else if (\n                target === lastFocusable &&\n                !event.shiftKey &&\n                event.key === \"Tab\"\n            ) {\n                // prevent moving focus outside by setting the focus to first focusable element\n                event.preventDefault();\n                firstFocusable.focus();\n            }\n        };\n\n        // apply handler when binding value is already true\n        if (value) applyHandler(el, value);\n    };\n\n    /** cleanup on beforeUnmount */\n    const onBeforeUnmount: DirectiveHook<HTMLElement> = (el) => {\n        // remove handler\n        applyHandler(el, false);\n        onKeyDown = null;\n    };\n\n    const onUpdate: DirectiveHook<HTMLElement> = (el, { value, oldValue }) => {\n        // check if binding value has changed\n        if (value !== oldValue)\n            // update handler based on binding value\n            applyHandler(el, value);\n    };\n\n    return {\n        vTrapFocus: {\n            mounted: onMounted,\n            beforeUnmount: onBeforeUnmount,\n            updated: onUpdate,\n        },\n    };\n}\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport getIcons from \"@/utils/icons\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { IconProps } from \"./props\";\n\n/**\n * Icons take an important role of any application.\n * @displayName Icon\n * @style _icon.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OIcon\",\n    configField: \"icon\",\n});\n\nconst props = withDefaults(defineProps<IconProps>(), {\n    override: undefined,\n    icon: undefined,\n    component: () => getDefault(\"iconComponent\"),\n    pack: () => getDefault(\"iconPack\", \"mdi\"),\n    variant: () => getDefault(\"icon.variant\"),\n    size: () => getDefault(\"icon.size\"),\n    customSize: undefined,\n    customClass: undefined,\n    clickable: false,\n    spin: false,\n    rotation: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * on item click event\n     * @param event {event} - native event\n     */\n    click: [event: Event];\n}>();\n\nconst rootStyle = computed(() => {\n    const style = {};\n    if (props.rotation) style[\"transform\"] = `rotate(${props.rotation}deg)`;\n    return style;\n});\n\n/** get the compiled icon packs */\nconst icons = getIcons();\n\n/** icon configuration defined by the corresponding icon pack */\nconst iconConfig = computed(() => icons[props.pack]);\n\n/** icon prefix defined by the icon configuration */\nconst iconPrefix = computed(() => iconConfig.value?.iconPrefix ?? \"\");\n\n/** icon size defined by the icon configuration or custom */\nconst iconSize = computed(() => {\n    if (props.customSize) return props.customSize;\n\n    if (iconConfig.value?.sizes) {\n        if (props.size && iconConfig.value.sizes[props.size] !== undefined)\n            return iconConfig.value.sizes[props.size];\n        else if (iconConfig.value.sizes.default)\n            return iconConfig.value.sizes.default;\n    }\n    return null;\n});\n\n/**\n * Internal icon name based on the pack.\n * If pack is 'fa', gets the equivalent FA icon name of the MDI,\n * internal icons are always MDI.\n */\nconst computedIcon = computed(\n    () => `${iconPrefix.value}${getEquivalentIconOf(props.icon ?? \"\")}`,\n);\n\n/** Equivalent icon name of the MDI. */\nfunction getEquivalentIconOf(value: string): string {\n    // only transform the class if\n    if (\n        // the pack is part of fontawesome icons\n        props.pack.toLocaleLowerCase().startsWith(\"fa\") &&\n        // and an internal icon quivalent is available\n        iconConfig.value?.internalIcons &&\n        iconConfig.value?.internalIcons[value]\n    )\n        return iconConfig.value.internalIcons[value];\n    return value;\n}\n\nfunction onClick(event: Event): void {\n    if (!props.clickable) return;\n    event.preventDefault();\n    emits(\"click\", event);\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-icon\"],\n    [\n        \"clickableClass\",\n        \"o-icon--clickable\",\n        null,\n        computed(() => props.clickable),\n    ],\n    [\"spinClass\", \"o-icon--spin\", null, computed(() => props.spin)],\n    [\n        \"sizeClass\",\n        \"o-icon--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-icon--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n);\n</script>\n\n<template>\n    <span\n        data-oruga=\"icon\"\n        :class=\"rootClasses\"\n        :style=\"rootStyle\"\n        :tabindex=\"clickable ? 0 : undefined\"\n        :role=\"clickable ? 'button' : undefined\"\n        @click=\"onClick\"\n        @keydown.enter=\"onClick\"\n        @keydown.space=\"onClick\">\n        <!-- custom icon component -->\n        <component\n            :is=\"component\"\n            v-if=\"component\"\n            :icon=\"[pack, computedIcon]\"\n            :size=\"iconSize\"\n            :class=\"customClass\" />\n\n        <!-- native css icon -->\n        <i v-else :class=\"[pack, computedIcon, iconSize, customClass]\" />\n    </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport getIcons from \"@/utils/icons\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { IconProps } from \"./props\";\n\n/**\n * Icons take an important role of any application.\n * @displayName Icon\n * @style _icon.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OIcon\",\n    configField: \"icon\",\n});\n\nconst props = withDefaults(defineProps<IconProps>(), {\n    override: undefined,\n    icon: undefined,\n    component: () => getDefault(\"iconComponent\"),\n    pack: () => getDefault(\"iconPack\", \"mdi\"),\n    variant: () => getDefault(\"icon.variant\"),\n    size: () => getDefault(\"icon.size\"),\n    customSize: undefined,\n    customClass: undefined,\n    clickable: false,\n    spin: false,\n    rotation: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * on item click event\n     * @param event {event} - native event\n     */\n    click: [event: Event];\n}>();\n\nconst rootStyle = computed(() => {\n    const style = {};\n    if (props.rotation) style[\"transform\"] = `rotate(${props.rotation}deg)`;\n    return style;\n});\n\n/** get the compiled icon packs */\nconst icons = getIcons();\n\n/** icon configuration defined by the corresponding icon pack */\nconst iconConfig = computed(() => icons[props.pack]);\n\n/** icon prefix defined by the icon configuration */\nconst iconPrefix = computed(() => iconConfig.value?.iconPrefix ?? \"\");\n\n/** icon size defined by the icon configuration or custom */\nconst iconSize = computed(() => {\n    if (props.customSize) return props.customSize;\n\n    if (iconConfig.value?.sizes) {\n        if (props.size && iconConfig.value.sizes[props.size] !== undefined)\n            return iconConfig.value.sizes[props.size];\n        else if (iconConfig.value.sizes.default)\n            return iconConfig.value.sizes.default;\n    }\n    return null;\n});\n\n/**\n * Internal icon name based on the pack.\n * If pack is 'fa', gets the equivalent FA icon name of the MDI,\n * internal icons are always MDI.\n */\nconst computedIcon = computed(\n    () => `${iconPrefix.value}${getEquivalentIconOf(props.icon ?? \"\")}`,\n);\n\n/** Equivalent icon name of the MDI. */\nfunction getEquivalentIconOf(value: string): string {\n    // only transform the class if\n    if (\n        // the pack is part of fontawesome icons\n        props.pack.toLocaleLowerCase().startsWith(\"fa\") &&\n        // and an internal icon quivalent is available\n        iconConfig.value?.internalIcons &&\n        iconConfig.value?.internalIcons[value]\n    )\n        return iconConfig.value.internalIcons[value];\n    return value;\n}\n\nfunction onClick(event: Event): void {\n    if (!props.clickable) return;\n    event.preventDefault();\n    emits(\"click\", event);\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-icon\"],\n    [\n        \"clickableClass\",\n        \"o-icon--clickable\",\n        null,\n        computed(() => props.clickable),\n    ],\n    [\"spinClass\", \"o-icon--spin\", null, computed(() => props.spin)],\n    [\n        \"sizeClass\",\n        \"o-icon--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-icon--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n);\n</script>\n\n<template>\n    <span\n        data-oruga=\"icon\"\n        :class=\"rootClasses\"\n        :style=\"rootStyle\"\n        :tabindex=\"clickable ? 0 : undefined\"\n        :role=\"clickable ? 'button' : undefined\"\n        @click=\"onClick\"\n        @keydown.enter=\"onClick\"\n        @keydown.space=\"onClick\">\n        <!-- custom icon component -->\n        <component\n            :is=\"component\"\n            v-if=\"component\"\n            :icon=\"[pack, computedIcon]\"\n            :size=\"iconSize\"\n            :class=\"customClass\" />\n\n        <!-- native css icon -->\n        <i v-else :class=\"[pack, computedIcon, iconSize, customClass]\" />\n    </span>\n</template>\n","<script setup lang=\"ts\" generic=\"IsNumber extends boolean = false\">\nimport {\n    ref,\n    computed,\n    nextTick,\n    watch,\n    onMounted,\n    useAttrs,\n    useId,\n    useTemplateRef,\n    type StyleValue,\n} from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isClient } from \"@/utils/ssr\";\nimport { isDefined, isTrueish } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    unrefElement,\n    useDebounce,\n    useInputHandler,\n} from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { InputProps } from \"./props\";\n\n/**\n * Get user Input. Use with Field to access all functionalities.\n * @displayName Input\n * @style _input.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OInput\",\n    configField: \"input\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = InputProps<IsNumber>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<InputProps<IsNumber>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // number: false,\n    type: \"text\",\n    size: () => getDefault(\"input.size\"),\n    variant: () => getDefault(\"input.variant\"),\n    placeholder: undefined,\n    expanded: () => getDefault(\"input.expanded\", false),\n    rounded: false,\n    disabled: false,\n    passwordReveal: false,\n    maxlength: undefined,\n    counter: () => getDefault(\"input.counter\", false),\n    autosize: false,\n    iconPack: () => getDefault(\"input.iconPack\"),\n    icon: () => getDefault(\"input.icon\"),\n    iconClickable: false,\n    iconRight: () => getDefault(\"input.iconRight\"),\n    iconRightClickable: false,\n    iconRightVariant: undefined,\n    clearable: () => getDefault(\"input.clearable\", false),\n    clearIcon: () => getDefault(\"input.clearIcon\", \"close-circle\"),\n    statusIcon: () => getDefault(\"statusIcon\", true),\n    debounce: () => getDefault(\"autocomplete.debounce\"),\n    autocomplete: () => getDefault(\"input.autocomplete\", \"off\"),\n    id: () => useId(),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: \"\",\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {string | number} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on input change event\n     * @param value {string} - input value\n     * @param event {Event} - native event\n     */\n    input: [value: string, event: Event];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} -  native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n}>();\n\n// --- Validation Feature ---\n\nconst rootRef = useTemplateRef(\"rootElement\");\nconst inputRef = useTemplateRef<HTMLInputElement>(\"inputElement\");\n\n// use form input functionalities\nconst {\n    checkHtml5Validity,\n    onBlur,\n    onFocus,\n    onInvalid,\n    setFocus,\n    isValid,\n    isFocused,\n} = useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField, statusVariant, statusVariantIcon } = injectField();\n\n// if `id` is given set as `for` property on o-field wrapper\nif (props.id) parentField.value?.setInputId(props.id);\n\nconst vmodel = defineModel<ModelValue, string, string, ModelValue>({\n    // cast incomming value to string\n    get: (value) => (isDefined(value) ? String(value) : \"\"),\n    // cast outgoing value to number if prop number is true\n    set: (value) =>\n        !isDefined(value)\n            ? value\n            : isTrueish(props.number)\n              ? Number(value)\n              : String(value),\n    default: undefined,\n});\n\n/** Get value length */\nconst valueLength = computed(() =>\n    typeof vmodel.value === \"string\" || typeof vmodel.value === \"number\"\n        ? String(vmodel.value).length\n        : 0,\n);\n\nwatch(\n    () => vmodel.value,\n    (value) => handleChange(value),\n    { flush: \"post\" },\n);\n\nonMounted(() => handleChange(vmodel.value));\n\nif (props.autosize && props.type === \"textarea\") {\n    const resizeObserver = window.ResizeObserver\n        ? new window.ResizeObserver(resize)\n        : undefined;\n\n    onMounted(() => {\n        // start resize observing\n        if (isClient && resizeObserver && rootRef.value) {\n            resizeObserver.observe(rootRef.value);\n        }\n    });\n}\n\n/**\n * Called when v-model changes:\n *  1. Set parent field filled state.\n *  2. Resize textarea input\n *  3. Check html5 valdiation\n */\nfunction handleChange(value: string): void {\n    if (parentField.value) parentField.value.setFilled(!!value);\n    if (props.autosize) resize();\n    if (!isValid.value) checkHtml5Validity();\n}\n\nconst height = ref(\"auto\");\n\nfunction resize(): void {\n    if (props.type !== \"textarea\") return;\n    height.value = \"auto\";\n    nextTick(() => {\n        if (!inputRef.value) return;\n        const scrollHeight = inputRef.value.scrollHeight;\n        height.value = scrollHeight + \"px\";\n    });\n}\n\n/** Computed inline styles for autoresize */\nconst computedStyles = computed<StyleValue>(() =>\n    props.type === \"textarea\" && props.autosize\n        ? {\n              resize: \"none\",\n              height: height.value,\n              overflow: \"hidden\",\n          }\n        : {},\n);\n\n/** debounced input event handler based on debounce prop */\nconst debouncedInput = useDebounce(onInput, props.debounce);\n\nfunction onInput(event: Event): void {\n    const inputElement = unrefElement(inputRef);\n    if (!inputElement) return;\n    const value = (inputElement as HTMLInputElement).value;\n    if (value === vmodel.value) return;\n\n    vmodel.value = value as ModelValue;\n    emits(\"input\", value, event);\n}\n\nconst placeholderVisible = computed(\n    () => !isDefined(vmodel.value) || vmodel.value === \"\",\n);\n\n// #region --- Icon Feature ---\n\nconst hasIconRight = computed(() => {\n    return !!(\n        props.passwordReveal ||\n        (props.statusIcon && statusVariantIcon.value) ||\n        (props.clearable && vmodel.value && props.clearIcon) ||\n        props.iconRight\n    );\n});\n\nconst computedIconRight = computed(() => {\n    if (props.passwordReveal) return passwordVisibleIcon.value;\n    else if (props.clearable && vmodel.value && props.clearIcon)\n        return props.clearIcon;\n    else if (props.iconRight) return props.iconRight;\n    return statusVariantIcon.value;\n});\n\nconst computedIconRightVariant = computed(() =>\n    props.passwordReveal || props.iconRight\n        ? props.iconRightVariant || props.variant\n        : statusVariant.value,\n);\n\nfunction iconClick(event: Event): void {\n    emits(\"icon-click\", event);\n    nextTick(() => setFocus());\n}\n\nfunction rightIconClick(event: Event): void {\n    if (props.passwordReveal) togglePasswordVisibility();\n    else if (props.clearable)\n        vmodel.value = (isTrueish(props.number) ? 0 : \"\") as ModelValue;\n    if (props.iconRightClickable) {\n        emits(\"icon-right-click\", event);\n        nextTick(() => setFocus());\n    }\n}\n\n// #endregion --- Icon Feature ---\n\n// #region --- Password Visability Feature ---\n\nconst isPasswordVisible = ref(false);\n\nconst inputType = computed(() => {\n    if (props.passwordReveal)\n        return isPasswordVisible.value ? \"text\" : \"password\";\n    else return props.type;\n});\n\n/** Current password-reveal icon name. */\nconst passwordVisibleIcon = computed(() =>\n    !isPasswordVisible.value ? \"eye\" : \"eye-off\",\n);\n\n/**\n * Toggle the visibility of a password-reveal input\n * by changing the type and focus the input right away.\n */\nfunction togglePasswordVisibility(): void {\n    isPasswordVisible.value = !isPasswordVisible.value;\n    nextTick(() => setFocus());\n}\n\n// #endregion --- Password Visability Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-input\"],\n    [\n        \"sizeClass\",\n        \"o-input--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-input--\",\n        computed(() => statusVariant.value || props.variant),\n        computed(() => !!statusVariant.value || !!props.variant),\n    ],\n    [\n        \"expandedClass\",\n        \"o-input--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    [\n        \"disabledClass\",\n        \"o-input--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\"roundedClass\", \"o-input--rounded\", null, computed(() => props.rounded)],\n    [\"hasIconRightClass\", \"o-input--icon-right\", null, hasIconRight],\n    [\n        \"textareaClass\",\n        \"o-input--textarea\",\n        null,\n        computed(() => props.type === \"textarea\"),\n    ],\n);\n\nconst inputClasses = defineClasses(\n    [\"inputClass\", \"o-input__input\"],\n    [\n        \"iconLeftSpaceClass\",\n        \"o-input__input--iconspace-left\",\n        null,\n        computed(() => !!props.icon),\n    ],\n    [\n        \"iconRightSpaceClass\",\n        \"o-input__input--iconspace-right\",\n        null,\n        hasIconRight,\n    ],\n    [\n        \"placeholderClass\",\n        \"o-input__input--placeholder\",\n        null,\n        placeholderVisible,\n    ],\n);\n\nconst iconLeftClasses = defineClasses([\"iconLeftClass\", \"o-input__icon-left\"]);\n\nconst iconRightClasses = defineClasses([\n    \"iconRightClass\",\n    \"o-input__icon-right\",\n]);\n\nconst counterClasses = defineClasses([\"counterClass\", \"o-input__counter\"]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n\n// #endregio  --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <div ref=\"rootElement\" data-oruga=\"input\" :class=\"rootClasses\">\n        <o-icon\n            v-if=\"icon\"\n            :class=\"iconLeftClasses\"\n            :clickable=\"iconClickable\"\n            :icon=\"icon\"\n            :pack=\"iconPack\"\n            :size=\"size\"\n            @click=\"iconClick\" />\n\n        <input\n            v-if=\"type !== 'textarea'\"\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"inputElement\"\n            :value=\"vmodel\"\n            :type=\"inputType\"\n            :data-oruga-input=\"inputType\"\n            :class=\"inputClasses\"\n            :maxlength=\"maxlength\"\n            :autocomplete=\"autocomplete\"\n            :placeholder=\"placeholder\"\n            :disabled=\"disabled\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\"\n            @input=\"debouncedInput\" />\n\n        <textarea\n            v-else\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"inputElement\"\n            :value=\"vmodel\"\n            data-oruga-input=\"textarea\"\n            :class=\"inputClasses\"\n            :maxlength=\"maxlength\"\n            :style=\"computedStyles\"\n            :placeholder=\"placeholder\"\n            :disabled=\"disabled\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\"\n            @input=\"debouncedInput\" />\n\n        <o-icon\n            v-if=\"hasIconRight\"\n            :class=\"iconRightClasses\"\n            :icon=\"computedIconRight\"\n            :pack=\"iconPack\"\n            :size=\"size\"\n            :variant=\"computedIconRightVariant\"\n            :clickable=\"passwordReveal || clearable || iconRightClickable\"\n            @click=\"rightIconClick\" />\n\n        <small\n            v-if=\"maxlength && counter && isFocused && type !== 'number'\"\n            :class=\"counterClasses\">\n            {{ valueLength }} / {{ maxlength }}\n        </small>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"IsNumber extends boolean = false\">\nimport {\n    ref,\n    computed,\n    nextTick,\n    watch,\n    onMounted,\n    useAttrs,\n    useId,\n    useTemplateRef,\n    type StyleValue,\n} from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isClient } from \"@/utils/ssr\";\nimport { isDefined, isTrueish } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    unrefElement,\n    useDebounce,\n    useInputHandler,\n} from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { InputProps } from \"./props\";\n\n/**\n * Get user Input. Use with Field to access all functionalities.\n * @displayName Input\n * @style _input.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OInput\",\n    configField: \"input\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = InputProps<IsNumber>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<InputProps<IsNumber>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // number: false,\n    type: \"text\",\n    size: () => getDefault(\"input.size\"),\n    variant: () => getDefault(\"input.variant\"),\n    placeholder: undefined,\n    expanded: () => getDefault(\"input.expanded\", false),\n    rounded: false,\n    disabled: false,\n    passwordReveal: false,\n    maxlength: undefined,\n    counter: () => getDefault(\"input.counter\", false),\n    autosize: false,\n    iconPack: () => getDefault(\"input.iconPack\"),\n    icon: () => getDefault(\"input.icon\"),\n    iconClickable: false,\n    iconRight: () => getDefault(\"input.iconRight\"),\n    iconRightClickable: false,\n    iconRightVariant: undefined,\n    clearable: () => getDefault(\"input.clearable\", false),\n    clearIcon: () => getDefault(\"input.clearIcon\", \"close-circle\"),\n    statusIcon: () => getDefault(\"statusIcon\", true),\n    debounce: () => getDefault(\"autocomplete.debounce\"),\n    autocomplete: () => getDefault(\"input.autocomplete\", \"off\"),\n    id: () => useId(),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: \"\",\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {string | number} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on input change event\n     * @param value {string} - input value\n     * @param event {Event} - native event\n     */\n    input: [value: string, event: Event];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} -  native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n}>();\n\n// --- Validation Feature ---\n\nconst rootRef = useTemplateRef(\"rootElement\");\nconst inputRef = useTemplateRef<HTMLInputElement>(\"inputElement\");\n\n// use form input functionalities\nconst {\n    checkHtml5Validity,\n    onBlur,\n    onFocus,\n    onInvalid,\n    setFocus,\n    isValid,\n    isFocused,\n} = useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField, statusVariant, statusVariantIcon } = injectField();\n\n// if `id` is given set as `for` property on o-field wrapper\nif (props.id) parentField.value?.setInputId(props.id);\n\nconst vmodel = defineModel<ModelValue, string, string, ModelValue>({\n    // cast incomming value to string\n    get: (value) => (isDefined(value) ? String(value) : \"\"),\n    // cast outgoing value to number if prop number is true\n    set: (value) =>\n        !isDefined(value)\n            ? value\n            : isTrueish(props.number)\n              ? Number(value)\n              : String(value),\n    default: undefined,\n});\n\n/** Get value length */\nconst valueLength = computed(() =>\n    typeof vmodel.value === \"string\" || typeof vmodel.value === \"number\"\n        ? String(vmodel.value).length\n        : 0,\n);\n\nwatch(\n    () => vmodel.value,\n    (value) => handleChange(value),\n    { flush: \"post\" },\n);\n\nonMounted(() => handleChange(vmodel.value));\n\nif (props.autosize && props.type === \"textarea\") {\n    const resizeObserver = window.ResizeObserver\n        ? new window.ResizeObserver(resize)\n        : undefined;\n\n    onMounted(() => {\n        // start resize observing\n        if (isClient && resizeObserver && rootRef.value) {\n            resizeObserver.observe(rootRef.value);\n        }\n    });\n}\n\n/**\n * Called when v-model changes:\n *  1. Set parent field filled state.\n *  2. Resize textarea input\n *  3. Check html5 valdiation\n */\nfunction handleChange(value: string): void {\n    if (parentField.value) parentField.value.setFilled(!!value);\n    if (props.autosize) resize();\n    if (!isValid.value) checkHtml5Validity();\n}\n\nconst height = ref(\"auto\");\n\nfunction resize(): void {\n    if (props.type !== \"textarea\") return;\n    height.value = \"auto\";\n    nextTick(() => {\n        if (!inputRef.value) return;\n        const scrollHeight = inputRef.value.scrollHeight;\n        height.value = scrollHeight + \"px\";\n    });\n}\n\n/** Computed inline styles for autoresize */\nconst computedStyles = computed<StyleValue>(() =>\n    props.type === \"textarea\" && props.autosize\n        ? {\n              resize: \"none\",\n              height: height.value,\n              overflow: \"hidden\",\n          }\n        : {},\n);\n\n/** debounced input event handler based on debounce prop */\nconst debouncedInput = useDebounce(onInput, props.debounce);\n\nfunction onInput(event: Event): void {\n    const inputElement = unrefElement(inputRef);\n    if (!inputElement) return;\n    const value = (inputElement as HTMLInputElement).value;\n    if (value === vmodel.value) return;\n\n    vmodel.value = value as ModelValue;\n    emits(\"input\", value, event);\n}\n\nconst placeholderVisible = computed(\n    () => !isDefined(vmodel.value) || vmodel.value === \"\",\n);\n\n// #region --- Icon Feature ---\n\nconst hasIconRight = computed(() => {\n    return !!(\n        props.passwordReveal ||\n        (props.statusIcon && statusVariantIcon.value) ||\n        (props.clearable && vmodel.value && props.clearIcon) ||\n        props.iconRight\n    );\n});\n\nconst computedIconRight = computed(() => {\n    if (props.passwordReveal) return passwordVisibleIcon.value;\n    else if (props.clearable && vmodel.value && props.clearIcon)\n        return props.clearIcon;\n    else if (props.iconRight) return props.iconRight;\n    return statusVariantIcon.value;\n});\n\nconst computedIconRightVariant = computed(() =>\n    props.passwordReveal || props.iconRight\n        ? props.iconRightVariant || props.variant\n        : statusVariant.value,\n);\n\nfunction iconClick(event: Event): void {\n    emits(\"icon-click\", event);\n    nextTick(() => setFocus());\n}\n\nfunction rightIconClick(event: Event): void {\n    if (props.passwordReveal) togglePasswordVisibility();\n    else if (props.clearable)\n        vmodel.value = (isTrueish(props.number) ? 0 : \"\") as ModelValue;\n    if (props.iconRightClickable) {\n        emits(\"icon-right-click\", event);\n        nextTick(() => setFocus());\n    }\n}\n\n// #endregion --- Icon Feature ---\n\n// #region --- Password Visability Feature ---\n\nconst isPasswordVisible = ref(false);\n\nconst inputType = computed(() => {\n    if (props.passwordReveal)\n        return isPasswordVisible.value ? \"text\" : \"password\";\n    else return props.type;\n});\n\n/** Current password-reveal icon name. */\nconst passwordVisibleIcon = computed(() =>\n    !isPasswordVisible.value ? \"eye\" : \"eye-off\",\n);\n\n/**\n * Toggle the visibility of a password-reveal input\n * by changing the type and focus the input right away.\n */\nfunction togglePasswordVisibility(): void {\n    isPasswordVisible.value = !isPasswordVisible.value;\n    nextTick(() => setFocus());\n}\n\n// #endregion --- Password Visability Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-input\"],\n    [\n        \"sizeClass\",\n        \"o-input--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-input--\",\n        computed(() => statusVariant.value || props.variant),\n        computed(() => !!statusVariant.value || !!props.variant),\n    ],\n    [\n        \"expandedClass\",\n        \"o-input--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    [\n        \"disabledClass\",\n        \"o-input--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\"roundedClass\", \"o-input--rounded\", null, computed(() => props.rounded)],\n    [\"hasIconRightClass\", \"o-input--icon-right\", null, hasIconRight],\n    [\n        \"textareaClass\",\n        \"o-input--textarea\",\n        null,\n        computed(() => props.type === \"textarea\"),\n    ],\n);\n\nconst inputClasses = defineClasses(\n    [\"inputClass\", \"o-input__input\"],\n    [\n        \"iconLeftSpaceClass\",\n        \"o-input__input--iconspace-left\",\n        null,\n        computed(() => !!props.icon),\n    ],\n    [\n        \"iconRightSpaceClass\",\n        \"o-input__input--iconspace-right\",\n        null,\n        hasIconRight,\n    ],\n    [\n        \"placeholderClass\",\n        \"o-input__input--placeholder\",\n        null,\n        placeholderVisible,\n    ],\n);\n\nconst iconLeftClasses = defineClasses([\"iconLeftClass\", \"o-input__icon-left\"]);\n\nconst iconRightClasses = defineClasses([\n    \"iconRightClass\",\n    \"o-input__icon-right\",\n]);\n\nconst counterClasses = defineClasses([\"counterClass\", \"o-input__counter\"]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n\n// #endregio  --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <div ref=\"rootElement\" data-oruga=\"input\" :class=\"rootClasses\">\n        <o-icon\n            v-if=\"icon\"\n            :class=\"iconLeftClasses\"\n            :clickable=\"iconClickable\"\n            :icon=\"icon\"\n            :pack=\"iconPack\"\n            :size=\"size\"\n            @click=\"iconClick\" />\n\n        <input\n            v-if=\"type !== 'textarea'\"\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"inputElement\"\n            :value=\"vmodel\"\n            :type=\"inputType\"\n            :data-oruga-input=\"inputType\"\n            :class=\"inputClasses\"\n            :maxlength=\"maxlength\"\n            :autocomplete=\"autocomplete\"\n            :placeholder=\"placeholder\"\n            :disabled=\"disabled\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\"\n            @input=\"debouncedInput\" />\n\n        <textarea\n            v-else\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"inputElement\"\n            :value=\"vmodel\"\n            data-oruga-input=\"textarea\"\n            :class=\"inputClasses\"\n            :maxlength=\"maxlength\"\n            :style=\"computedStyles\"\n            :placeholder=\"placeholder\"\n            :disabled=\"disabled\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\"\n            @input=\"debouncedInput\" />\n\n        <o-icon\n            v-if=\"hasIconRight\"\n            :class=\"iconRightClasses\"\n            :icon=\"computedIconRight\"\n            :pack=\"iconPack\"\n            :size=\"size\"\n            :variant=\"computedIconRightVariant\"\n            :clickable=\"passwordReveal || clearable || iconRightClickable\"\n            @click=\"rightIconClick\" />\n\n        <small\n            v-if=\"maxlength && counter && isFocused && type !== 'number'\"\n            :class=\"counterClasses\">\n            {{ valueLength }} / {{ maxlength }}\n        </small>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { useId, computed, useTemplateRef, ref } from \"vue\";\n\nimport { isDefined, isEqual } from \"@/utils/helpers\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { DropdownComponent, DropdownItemComponent } from \"./types\";\nimport type { DropdownItemProps } from \"./props\";\n\n/**\n * An option item used by the dropdown component.\n * @displayName Dropdown Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ODropdownItem\",\n    configField: \"dropdown\",\n});\n\nconst props = withDefaults(defineProps<DropdownItemProps<T>>(), {\n    override: undefined,\n    // @ts-expect-error string is not assignable of generic type T\n    value: () => useId(),\n    label: undefined,\n    disabled: false,\n    clickable: true,\n    hidden: false,\n    tag: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * onclick event\n     * @param value {unknown} - value prop data\n     * @param event {event} - native event\n     */\n    click: [value: T, event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef<HTMLElement>(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<DropdownItemComponent<T>>(() => ({\n    value: props.value as T,\n    label: props.label,\n    isViable: isViable.value,\n    setHidden,\n    selectItem: (): void => rootRef.value?.click(),\n}));\n\n/** inject functionalities and data from the parent component */\nconst { parent, item } = useProviderChild<\n    DropdownComponent<T>,\n    DropdownItemComponent<T>\n>(rootRef, { data: providedData });\n\nconst localHidden = ref(false);\nconst isHidden = computed(() => props.hidden || localHidden.value);\n\nfunction setHidden(hidden: boolean): void {\n    localHidden.value = hidden;\n}\n\n/** Shows if the item is viable or not (not disabled or hidden). */\nconst isViable = computed(\n    () => !isHidden.value && !props.disabled && props.clickable,\n);\n\n/** Shows if the item is clickable or not. */\nconst isClickable = computed(\n    () => !parent.value.disabled && !props.disabled && props.clickable,\n);\n\nconst isSelected = computed(() => {\n    if (!isDefined(parent.value.selected)) return false;\n    if (parent.value.multiple && Array.isArray(parent.value.selected))\n        return parent.value.selected.some((selected: T) =>\n            isEqual(item.value.data.value, selected),\n        );\n    return isEqual(item.value.data.value, parent.value.selected);\n});\n\nconst isFocused = computed(\n    () => item.value.identifier === parent.value.focsuedIdentifier,\n);\n\n/** Click listener, select the item. */\nfunction onClick(event: Event): void {\n    if (!isClickable.value) return;\n    parent.value.selectItem(item.value, event);\n    emits(\"click\", props.value as T, event);\n}\n\n/** Hover listener, focus the item. */\nfunction focusItem(): void {\n    parent.value.focusItem(item.value);\n}\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"itemClass\", \"o-dropdown__item\"],\n    [\n        \"itemDisabledClass\",\n        \"o-dropdown__item--disabled\",\n        null,\n        computed(() => parent.value.disabled || props.disabled),\n    ],\n    [\"itemSelectedClass\", \"o-dropdown__item--active\", null, isSelected],\n    [\"itemClickableClass\", \"o-dropdown__item--clickable\", null, isClickable],\n    [\"itemFocusedClass\", \"o-dropdown__item--focused\", null, isFocused],\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <component\n        :is=\"tag ?? parent.itemTag\"\n        v-show=\"!isHidden\"\n        :id=\"`${parent.menuId}-${item.identifier}`\"\n        ref=\"rootElement\"\n        data-oruga=\"dropdown-item\"\n        :data-id=\"`dropdown-${item.identifier}`\"\n        :class=\"rootClasses\"\n        :role=\"parent.selectable ? 'option' : 'menuitem'\"\n        tabindex=\"-1\"\n        :aria-selected=\"parent.selectable ? isSelected : undefined\"\n        :aria-hidden=\"isHidden\"\n        :aria-disabled=\"disabled\"\n        @click=\"onClick\"\n        @mouseenter=\"focusItem\"\n        @keydown.enter=\"onClick\"\n        @keydown.space=\"onClick\">\n        <slot>{{ label }}</slot>\n    </component>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { useId, computed, useTemplateRef, ref } from \"vue\";\n\nimport { isDefined, isEqual } from \"@/utils/helpers\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { DropdownComponent, DropdownItemComponent } from \"./types\";\nimport type { DropdownItemProps } from \"./props\";\n\n/**\n * An option item used by the dropdown component.\n * @displayName Dropdown Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ODropdownItem\",\n    configField: \"dropdown\",\n});\n\nconst props = withDefaults(defineProps<DropdownItemProps<T>>(), {\n    override: undefined,\n    // @ts-expect-error string is not assignable of generic type T\n    value: () => useId(),\n    label: undefined,\n    disabled: false,\n    clickable: true,\n    hidden: false,\n    tag: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * onclick event\n     * @param value {unknown} - value prop data\n     * @param event {event} - native event\n     */\n    click: [value: T, event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef<HTMLElement>(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<DropdownItemComponent<T>>(() => ({\n    value: props.value as T,\n    label: props.label,\n    isViable: isViable.value,\n    setHidden,\n    selectItem: (): void => rootRef.value?.click(),\n}));\n\n/** inject functionalities and data from the parent component */\nconst { parent, item } = useProviderChild<\n    DropdownComponent<T>,\n    DropdownItemComponent<T>\n>(rootRef, { data: providedData });\n\nconst localHidden = ref(false);\nconst isHidden = computed(() => props.hidden || localHidden.value);\n\nfunction setHidden(hidden: boolean): void {\n    localHidden.value = hidden;\n}\n\n/** Shows if the item is viable or not (not disabled or hidden). */\nconst isViable = computed(\n    () => !isHidden.value && !props.disabled && props.clickable,\n);\n\n/** Shows if the item is clickable or not. */\nconst isClickable = computed(\n    () => !parent.value.disabled && !props.disabled && props.clickable,\n);\n\nconst isSelected = computed(() => {\n    if (!isDefined(parent.value.selected)) return false;\n    if (parent.value.multiple && Array.isArray(parent.value.selected))\n        return parent.value.selected.some((selected: T) =>\n            isEqual(item.value.data.value, selected),\n        );\n    return isEqual(item.value.data.value, parent.value.selected);\n});\n\nconst isFocused = computed(\n    () => item.value.identifier === parent.value.focsuedIdentifier,\n);\n\n/** Click listener, select the item. */\nfunction onClick(event: Event): void {\n    if (!isClickable.value) return;\n    parent.value.selectItem(item.value, event);\n    emits(\"click\", props.value as T, event);\n}\n\n/** Hover listener, focus the item. */\nfunction focusItem(): void {\n    parent.value.focusItem(item.value);\n}\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"itemClass\", \"o-dropdown__item\"],\n    [\n        \"itemDisabledClass\",\n        \"o-dropdown__item--disabled\",\n        null,\n        computed(() => parent.value.disabled || props.disabled),\n    ],\n    [\"itemSelectedClass\", \"o-dropdown__item--active\", null, isSelected],\n    [\"itemClickableClass\", \"o-dropdown__item--clickable\", null, isClickable],\n    [\"itemFocusedClass\", \"o-dropdown__item--focused\", null, isFocused],\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <component\n        :is=\"tag ?? parent.itemTag\"\n        v-show=\"!isHidden\"\n        :id=\"`${parent.menuId}-${item.identifier}`\"\n        ref=\"rootElement\"\n        data-oruga=\"dropdown-item\"\n        :data-id=\"`dropdown-${item.identifier}`\"\n        :class=\"rootClasses\"\n        :role=\"parent.selectable ? 'option' : 'menuitem'\"\n        tabindex=\"-1\"\n        :aria-selected=\"parent.selectable ? isSelected : undefined\"\n        :aria-hidden=\"isHidden\"\n        :aria-disabled=\"disabled\"\n        @click=\"onClick\"\n        @mouseenter=\"focusItem\"\n        @keydown.enter=\"onClick\"\n        @keydown.space=\"onClick\">\n        <slot>{{ label }}</slot>\n    </component>\n</template>\n","<script setup lang=\"ts\">\nimport {\n    watch,\n    computed,\n    nextTick,\n    onBeforeUnmount,\n    ref,\n    type Component,\n    type PropType,\n} from \"vue\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    getTeleportDefault,\n    getScrollingParent,\n    unrefElement,\n    type MaybeElement,\n} from \"@/composables\";\n\ntype Position = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nconst opposites: Record<Position, Position> = {\n    top: \"bottom\",\n    bottom: \"top\",\n    right: \"left\",\n    left: \"right\",\n};\n\ntype Point = { x: number; y: number };\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = defineProps({\n    teleport: {\n        type: [Boolean, String, Object],\n        required: true,\n    },\n    trigger: {\n        type: Object as PropType<MaybeElement>,\n        default: undefined,\n    },\n    /**\n     * Position of the component relative to the trigger\n     * @values auto, top, bottom, left, right, top-right, top-left, bottom-left, bottom-right\n     */\n    position: {\n        type: String,\n        validator: (value: string) =>\n            [\n                \"auto\",\n                \"top\",\n                \"bottom\",\n                \"left\",\n                \"right\",\n                \"top-right\",\n                \"top-left\",\n                \"bottom-left\",\n                \"bottom-right\",\n            ].includes(value),\n        required: true,\n    },\n    /** Used for calculation position auto */\n    defaultPosition: {\n        type: String as PropType<Position>,\n        validator: (value: string) =>\n            [\"top\", \"bottom\", \"left\", \"right\"].includes(value),\n        default: \"top\",\n    },\n    /** disable the position calculation */\n    disabled: { type: Boolean, default: false },\n    /** update positioning on teleport */\n    disablePositioning: { type: Boolean, default: true },\n});\n\nconst emits = defineEmits<{\n    \"update:position\": [value: string];\n}>();\n\nconst _teleport = computed(() =>\n    typeof props.teleport === \"boolean\"\n        ? { to: getTeleportDefault(), disabled: !props.teleport }\n        : { to: props.teleport, disabled: false },\n);\n\nconst contentRef = ref<HTMLElement | Component>();\n\nfunction setContent<T extends typeof contentRef.value>(el: T): typeof el {\n    contentRef.value = el;\n\n    nextTick(() => {\n        // update positioning\n        updatePositioning();\n        // add handler\n        addHandler();\n    });\n    return el;\n}\n\n// --- Dynamic Positioning Handling Feature ---\n\nconst initialPosition = props.position;\n\nconst scrollingParent = ref<HTMLElement | null>();\nlet resizeObserver: ResizeObserver | undefined;\n\nif (isClient && window.ResizeObserver) {\n    resizeObserver = new window.ResizeObserver(updatePositioning);\n}\n\n// on disable state change update event listener\nwatch(\n    () => props.disabled,\n    () => {\n        if (!props.disabled) addHandler();\n        else removeHandler();\n    },\n    { immediate: true, flush: \"post\" },\n);\n\n// update positioning if props change\nwatch(\n    [\n        () => !!props.trigger,\n        () => props.disablePositioning,\n        () => props.disabled,\n    ],\n    () => updatePositioning(),\n    { immediate: true, flush: \"post\" },\n);\n\n// remove any event listener on unmount\nonBeforeUnmount(() => removeHandler());\n\n/** add event listener */\nfunction addHandler(): void {\n    if (isClient && !scrollingParent.value && contentRef.value) {\n        // get parent container\n        scrollingParent.value = getScrollingParent(unrefElement(contentRef)!);\n        // set event listener\n        if (\n            scrollingParent.value &&\n            scrollingParent.value !== document.documentElement\n        ) {\n            scrollingParent.value.addEventListener(\n                \"scroll\",\n                updatePositioning,\n                { passive: true },\n            );\n            if (window.ResizeObserver && resizeObserver)\n                resizeObserver.observe(scrollingParent.value);\n        } else {\n            document.addEventListener(\"scroll\", updatePositioning, {\n                passive: true,\n            });\n            window.addEventListener(\"resize\", updatePositioning);\n        }\n    }\n}\n\n/** remove event listener */\nfunction removeHandler(): void {\n    if (isClient) {\n        if (window.ResizeObserver && resizeObserver)\n            resizeObserver.disconnect();\n        window.removeEventListener(\"resize\", updatePositioning);\n        document.removeEventListener(\"scroll\", updatePositioning);\n        scrollingParent.value = undefined;\n    }\n}\n\n/** Update the best position set teleport positioning */\nfunction updatePositioning(): void {\n    if (props.disabled) return;\n    let position = props.position;\n    // update position if auto position is enabled\n    if (initialPosition === \"auto\") {\n        // calculate best position\n        position = getAutoPosition();\n        if (position != props.position)\n            // two-way bind updated position\n            emits(\"update:position\", position);\n    }\n    // do not set content position if not teleport enabled\n    if (!props.teleport) return;\n\n    const content = unrefElement(contentRef);\n    const trigger = unrefElement(() => props.trigger);\n\n    // set content position\n    if (content && trigger) {\n        const rect = trigger.getBoundingClientRect();\n        let top = rect.top + window.scrollY;\n        let left = rect.left + window.scrollX;\n        // define vertical positioning\n        if (position.includes(\"bottom\")) {\n            top += trigger.clientHeight;\n        } else if (position.includes(\"top\")) {\n            top -= content.clientHeight;\n        }\n        // define horizontal positioning\n        if (position === \"left\") {\n            left -= content.clientWidth;\n        } else if (position === \"right\") {\n            left += trigger.clientWidth;\n        } else if (position.includes(\"-right\")) {\n            left += trigger.clientWidth - content.clientWidth;\n        }\n\n        // adjust exact vertical positioning\n        if (position === \"top\" || position === \"bottom\") {\n            left += trigger.clientWidth / 2; //- content.clientWidth / 2;\n        }\n        // adjust exact horizontal positioning\n        if (position === \"left\" || position === \"right\") {\n            top += trigger.clientHeight / 2; // - content.clientHeight / 2;\n        }\n\n        // set style properties\n        if (props.disablePositioning) {\n            content.style.position = \"relative\";\n            content.style.top = `${top}px`;\n            content.style.left = `${left}px`;\n        } else {\n            content.style.position = \"\";\n            content.style.top = \"\";\n            content.style.left = \"\";\n        }\n    }\n}\n\n/** calculate best position if auto */\nfunction getAutoPosition(): string {\n    let bestPosition = props.defaultPosition;\n    if (!props.trigger || !contentRef.value) return bestPosition;\n    if (!scrollingParent.value) return bestPosition;\n\n    // get viewport from container\n    const viewRect = new DOMRect(\n        scrollingParent.value.offsetLeft,\n        scrollingParent.value.offsetTop,\n        scrollingParent.value.clientWidth,\n        scrollingParent.value.clientHeight,\n    );\n\n    const contentRect = unrefElement(contentRef)!.getBoundingClientRect();\n    const triggerRect = unrefElement(props.trigger).getBoundingClientRect();\n\n    // detect auto position\n    const triggerAnchors = anchors(triggerRect);\n    const contentAnchors = anchors(contentRect);\n    const contentRectAtAnchor = (pos: Position) => {\n        const triggerAnchor = triggerAnchors[pos];\n        const contentAnchor = contentAnchors[opposites[pos]];\n        // Translates contentRect so contentAnchor is on top of triggerAnchor\n        // NOTE: this doesn't account for the extra offset that the tooltip arrow provides.\n        // That offset should be small, and it's tricky to get it from the CSS.\n        return new DOMRect(\n            contentRect.x + (triggerAnchor.x - contentAnchor.x),\n            contentRect.y + (triggerAnchor.y - contentAnchor.y),\n            contentRect.width,\n            contentRect.height,\n        );\n    };\n\n    const defaultOpposite = opposites[props.defaultPosition];\n    const crossPosition =\n        props.defaultPosition === \"top\" || props.defaultPosition === \"bottom\"\n            ? \"left\"\n            : \"top\";\n    const crossOpposite = opposites[crossPosition];\n    // In descending order of priority\n    const positions: Position[] = [\n        props.defaultPosition,\n        defaultOpposite,\n        crossPosition,\n        crossOpposite,\n    ];\n    let maxOverlap = 0;\n    for (const position of positions) {\n        const overlap = intersectionArea(\n            viewRect,\n            contentRectAtAnchor(position),\n        );\n        if (overlap > maxOverlap) {\n            maxOverlap = overlap;\n            bestPosition = position;\n        }\n    }\n    return bestPosition;\n}\n\n// --- Helper Functions ---\n\nfunction intersectionArea(a: DOMRect, b: DOMRect): number {\n    const left = Math.max(a.left, b.left);\n    const right = Math.min(a.right, b.right);\n    const top = Math.max(a.top, b.top);\n    const bottom = Math.min(a.bottom, b.bottom);\n    return Math.max(right - left, 0) * Math.max(bottom - top, 0);\n}\n\n/**\n * @param rect the bounding rectangle of the trigger element\n * @return the \"anchor points\" (points where the arrow attaches) for each side of the tooltip\n */\nconst anchors = (rect: DOMRect): Record<Position, Point> => ({\n    top: { x: (rect.left + rect.right) * 0.5, y: rect.top },\n    bottom: { x: (rect.left + rect.right) * 0.5, y: rect.bottom },\n    left: { x: rect.left, y: (rect.top + rect.bottom) * 0.5 },\n    right: { x: rect.right, y: (rect.top + rect.bottom) * 0.5 },\n});\n</script>\n\n<template>\n    <Teleport :to=\"_teleport.to\" :disabled=\"_teleport.disabled\">\n        <template v-if=\"_teleport.disabled\">\n            <slot :set-content=\"setContent\" />\n        </template>\n        <template v-else>\n            <div\n                v-bind=\"$attrs\"\n                :style=\"{ position: 'absolute', left: '0px', top: '0px' }\">\n                <slot :set-content=\"setContent\" />\n            </div>\n        </template>\n    </Teleport>\n</template>\n","<script setup lang=\"ts\">\nimport {\n    watch,\n    computed,\n    nextTick,\n    onBeforeUnmount,\n    ref,\n    type Component,\n    type PropType,\n} from \"vue\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    getTeleportDefault,\n    getScrollingParent,\n    unrefElement,\n    type MaybeElement,\n} from \"@/composables\";\n\ntype Position = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nconst opposites: Record<Position, Position> = {\n    top: \"bottom\",\n    bottom: \"top\",\n    right: \"left\",\n    left: \"right\",\n};\n\ntype Point = { x: number; y: number };\n\ndefineOptions({ inheritAttrs: false });\n\nconst props = defineProps({\n    teleport: {\n        type: [Boolean, String, Object],\n        required: true,\n    },\n    trigger: {\n        type: Object as PropType<MaybeElement>,\n        default: undefined,\n    },\n    /**\n     * Position of the component relative to the trigger\n     * @values auto, top, bottom, left, right, top-right, top-left, bottom-left, bottom-right\n     */\n    position: {\n        type: String,\n        validator: (value: string) =>\n            [\n                \"auto\",\n                \"top\",\n                \"bottom\",\n                \"left\",\n                \"right\",\n                \"top-right\",\n                \"top-left\",\n                \"bottom-left\",\n                \"bottom-right\",\n            ].includes(value),\n        required: true,\n    },\n    /** Used for calculation position auto */\n    defaultPosition: {\n        type: String as PropType<Position>,\n        validator: (value: string) =>\n            [\"top\", \"bottom\", \"left\", \"right\"].includes(value),\n        default: \"top\",\n    },\n    /** disable the position calculation */\n    disabled: { type: Boolean, default: false },\n    /** update positioning on teleport */\n    disablePositioning: { type: Boolean, default: true },\n});\n\nconst emits = defineEmits<{\n    \"update:position\": [value: string];\n}>();\n\nconst _teleport = computed(() =>\n    typeof props.teleport === \"boolean\"\n        ? { to: getTeleportDefault(), disabled: !props.teleport }\n        : { to: props.teleport, disabled: false },\n);\n\nconst contentRef = ref<HTMLElement | Component>();\n\nfunction setContent<T extends typeof contentRef.value>(el: T): typeof el {\n    contentRef.value = el;\n\n    nextTick(() => {\n        // update positioning\n        updatePositioning();\n        // add handler\n        addHandler();\n    });\n    return el;\n}\n\n// --- Dynamic Positioning Handling Feature ---\n\nconst initialPosition = props.position;\n\nconst scrollingParent = ref<HTMLElement | null>();\nlet resizeObserver: ResizeObserver | undefined;\n\nif (isClient && window.ResizeObserver) {\n    resizeObserver = new window.ResizeObserver(updatePositioning);\n}\n\n// on disable state change update event listener\nwatch(\n    () => props.disabled,\n    () => {\n        if (!props.disabled) addHandler();\n        else removeHandler();\n    },\n    { immediate: true, flush: \"post\" },\n);\n\n// update positioning if props change\nwatch(\n    [\n        () => !!props.trigger,\n        () => props.disablePositioning,\n        () => props.disabled,\n    ],\n    () => updatePositioning(),\n    { immediate: true, flush: \"post\" },\n);\n\n// remove any event listener on unmount\nonBeforeUnmount(() => removeHandler());\n\n/** add event listener */\nfunction addHandler(): void {\n    if (isClient && !scrollingParent.value && contentRef.value) {\n        // get parent container\n        scrollingParent.value = getScrollingParent(unrefElement(contentRef)!);\n        // set event listener\n        if (\n            scrollingParent.value &&\n            scrollingParent.value !== document.documentElement\n        ) {\n            scrollingParent.value.addEventListener(\n                \"scroll\",\n                updatePositioning,\n                { passive: true },\n            );\n            if (window.ResizeObserver && resizeObserver)\n                resizeObserver.observe(scrollingParent.value);\n        } else {\n            document.addEventListener(\"scroll\", updatePositioning, {\n                passive: true,\n            });\n            window.addEventListener(\"resize\", updatePositioning);\n        }\n    }\n}\n\n/** remove event listener */\nfunction removeHandler(): void {\n    if (isClient) {\n        if (window.ResizeObserver && resizeObserver)\n            resizeObserver.disconnect();\n        window.removeEventListener(\"resize\", updatePositioning);\n        document.removeEventListener(\"scroll\", updatePositioning);\n        scrollingParent.value = undefined;\n    }\n}\n\n/** Update the best position set teleport positioning */\nfunction updatePositioning(): void {\n    if (props.disabled) return;\n    let position = props.position;\n    // update position if auto position is enabled\n    if (initialPosition === \"auto\") {\n        // calculate best position\n        position = getAutoPosition();\n        if (position != props.position)\n            // two-way bind updated position\n            emits(\"update:position\", position);\n    }\n    // do not set content position if not teleport enabled\n    if (!props.teleport) return;\n\n    const content = unrefElement(contentRef);\n    const trigger = unrefElement(() => props.trigger);\n\n    // set content position\n    if (content && trigger) {\n        const rect = trigger.getBoundingClientRect();\n        let top = rect.top + window.scrollY;\n        let left = rect.left + window.scrollX;\n        // define vertical positioning\n        if (position.includes(\"bottom\")) {\n            top += trigger.clientHeight;\n        } else if (position.includes(\"top\")) {\n            top -= content.clientHeight;\n        }\n        // define horizontal positioning\n        if (position === \"left\") {\n            left -= content.clientWidth;\n        } else if (position === \"right\") {\n            left += trigger.clientWidth;\n        } else if (position.includes(\"-right\")) {\n            left += trigger.clientWidth - content.clientWidth;\n        }\n\n        // adjust exact vertical positioning\n        if (position === \"top\" || position === \"bottom\") {\n            left += trigger.clientWidth / 2; //- content.clientWidth / 2;\n        }\n        // adjust exact horizontal positioning\n        if (position === \"left\" || position === \"right\") {\n            top += trigger.clientHeight / 2; // - content.clientHeight / 2;\n        }\n\n        // set style properties\n        if (props.disablePositioning) {\n            content.style.position = \"relative\";\n            content.style.top = `${top}px`;\n            content.style.left = `${left}px`;\n        } else {\n            content.style.position = \"\";\n            content.style.top = \"\";\n            content.style.left = \"\";\n        }\n    }\n}\n\n/** calculate best position if auto */\nfunction getAutoPosition(): string {\n    let bestPosition = props.defaultPosition;\n    if (!props.trigger || !contentRef.value) return bestPosition;\n    if (!scrollingParent.value) return bestPosition;\n\n    // get viewport from container\n    const viewRect = new DOMRect(\n        scrollingParent.value.offsetLeft,\n        scrollingParent.value.offsetTop,\n        scrollingParent.value.clientWidth,\n        scrollingParent.value.clientHeight,\n    );\n\n    const contentRect = unrefElement(contentRef)!.getBoundingClientRect();\n    const triggerRect = unrefElement(props.trigger).getBoundingClientRect();\n\n    // detect auto position\n    const triggerAnchors = anchors(triggerRect);\n    const contentAnchors = anchors(contentRect);\n    const contentRectAtAnchor = (pos: Position) => {\n        const triggerAnchor = triggerAnchors[pos];\n        const contentAnchor = contentAnchors[opposites[pos]];\n        // Translates contentRect so contentAnchor is on top of triggerAnchor\n        // NOTE: this doesn't account for the extra offset that the tooltip arrow provides.\n        // That offset should be small, and it's tricky to get it from the CSS.\n        return new DOMRect(\n            contentRect.x + (triggerAnchor.x - contentAnchor.x),\n            contentRect.y + (triggerAnchor.y - contentAnchor.y),\n            contentRect.width,\n            contentRect.height,\n        );\n    };\n\n    const defaultOpposite = opposites[props.defaultPosition];\n    const crossPosition =\n        props.defaultPosition === \"top\" || props.defaultPosition === \"bottom\"\n            ? \"left\"\n            : \"top\";\n    const crossOpposite = opposites[crossPosition];\n    // In descending order of priority\n    const positions: Position[] = [\n        props.defaultPosition,\n        defaultOpposite,\n        crossPosition,\n        crossOpposite,\n    ];\n    let maxOverlap = 0;\n    for (const position of positions) {\n        const overlap = intersectionArea(\n            viewRect,\n            contentRectAtAnchor(position),\n        );\n        if (overlap > maxOverlap) {\n            maxOverlap = overlap;\n            bestPosition = position;\n        }\n    }\n    return bestPosition;\n}\n\n// --- Helper Functions ---\n\nfunction intersectionArea(a: DOMRect, b: DOMRect): number {\n    const left = Math.max(a.left, b.left);\n    const right = Math.min(a.right, b.right);\n    const top = Math.max(a.top, b.top);\n    const bottom = Math.min(a.bottom, b.bottom);\n    return Math.max(right - left, 0) * Math.max(bottom - top, 0);\n}\n\n/**\n * @param rect the bounding rectangle of the trigger element\n * @return the \"anchor points\" (points where the arrow attaches) for each side of the tooltip\n */\nconst anchors = (rect: DOMRect): Record<Position, Point> => ({\n    top: { x: (rect.left + rect.right) * 0.5, y: rect.top },\n    bottom: { x: (rect.left + rect.right) * 0.5, y: rect.bottom },\n    left: { x: rect.left, y: (rect.top + rect.bottom) * 0.5 },\n    right: { x: rect.right, y: (rect.top + rect.bottom) * 0.5 },\n});\n</script>\n\n<template>\n    <Teleport :to=\"_teleport.to\" :disabled=\"_teleport.disabled\">\n        <template v-if=\"_teleport.disabled\">\n            <slot :set-content=\"setContent\" />\n        </template>\n        <template v-else>\n            <div\n                v-bind=\"$attrs\"\n                :style=\"{ position: 'absolute', left: '0px', top: '0px' }\">\n                <slot :set-content=\"setContent\" />\n            </div>\n        </template>\n    </Teleport>\n</template>\n","<script setup lang=\"ts\" generic=\"T, IsMultiple extends boolean = false\">\nimport {\n    computed,\n    nextTick,\n    ref,\n    watch,\n    useId,\n    toValue,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport ODropdownItem from \"../dropdown/DropdownItem.vue\";\nimport PositionWrapper from \"../utils/PositionWrapper.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { toCssDimension, isMobileAgent, isTrueish, mod } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderParent,\n    useMatchMedia,\n    useClickOutside,\n    usePreventScrolling,\n    useEventListener,\n    useScrollEvents,\n    scrollElementInView,\n    unrefElement,\n    useIndexer,\n    isGroupOption,\n    type OptionGroupItem,\n    type OptionItem,\n} from \"@/composables\";\n\nimport type {\n    DropdownChildItem,\n    DropdownComponent,\n    DropdownItemComponent,\n} from \"./types\";\nimport type { DropdownItemProps, DropdownProps } from \"./props\";\nimport { injectField } from \"../field/fieldInjection\";\n\n/**\n * Dropdowns are very versatile, can used as a quick menu or even like a select for discoverable content.\n * @displayName Dropdown\n * @requires ./DropdownItem.vue\n * @style _dropdown.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ODropdown\",\n    configField: \"dropdown\",\n});\n\ntype ModelValue = DropdownProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<DropdownProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    options: undefined,\n    active: false,\n    label: undefined,\n    disabled: false,\n    inline: false,\n    selectable: false,\n    keepOpen: () => getDefault(\"dropdown.keepOpen\", false),\n    keepFirst: () => getDefault(\"dropdown.keepFirst\", false),\n    closeOnOutside: () => getDefault(\"dropdown.closeOnOutside\", true),\n    closeOnScroll: () => getDefault(\"dropdown.closeOnScroll\", false),\n    selectOnFocus: () => getDefault(\"dropdown.selectOnFocus\", false),\n    selectOnClose: () => getDefault(\"dropdown.selectOnClose\", false),\n    expanded: false,\n    position: () => getDefault(\"dropdown.position\", \"bottom-left\"),\n    scrollable: false,\n    maxHeight: () => getDefault(\"dropdown.maxHeight\", 200),\n    menuId: () => useId(),\n    menuTag: () => getDefault(\"dropdown.menuTag\", \"div\"),\n    itemTag: () => getDefault(\"dropdown.itemTag\", \"div\"),\n    triggerTag: () => getDefault(\"dropdown.triggerTag\", \"div\"),\n    openOnClick: () => getDefault(\"tooltip.openOnClick\", true),\n    openOnContextmenu: () => getDefault(\"tooltip.openOnContextmenu\", false),\n    openOnHover: () => getDefault(\"tooltip.openOnHover\", false),\n    openOnFocus: () => getDefault(\"tooltip.openOnFocus\", false),\n    delay: undefined,\n    desktopModal: () => getDefault(\"dropdown.desktopModal\", false),\n    mobileModal: () => getDefault(\"dropdown.mobileModal\", true),\n    mobileBreakpoint: () => getDefault(\"dropdown.mobileBreakpoint\"),\n    animation: () => getDefault(\"dropdown.animation\", \"fade\"),\n    teleport: () => getDefault(\"dropdown.teleport\", false),\n    clipScroll: () => getDefault(\"dropdown.clipScroll\", false),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown | unknown[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on select event - fired before update:modelValue\n     * @param value {unknown} - selected value\n     */\n    select: [value: T];\n    /**\n     * @deprecated use update:model-value instead\n     * on change event - fired after update:modelValue\n     * @param value {unknown | unknown[]} - selected value\n     */\n    change: [value: ModelValue];\n    /**\n     * on active state changes to true\n     * @param event {Event} - native event\n     */\n    open: [event: Event];\n    /**\n     * on active state changes to false\n     * @param event {Event} - native event\n     */\n    close: [event: Event];\n    /** the list inside the dropdown reached the start */\n    \"scroll-start\": [];\n    /** the list inside the dropdown reached it's end */\n    \"scroll-end\": [];\n}>();\n\ndefineSlots<{\n    /**\n     * Override the trigger element, default is label prop\n     * @param active {boolean} - dropdown active state\n     * @param value {unknown | unknown[]} - the selected value\n     * @param toggle {(event: Event): void} - toggle dropdown active state\n     */\n    trigger?(props: {\n        active: boolean;\n        value: ModelValue;\n        toggle: (event: Event) => void;\n    }): void;\n    /**\n     * Define the dropdown items here\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    default?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define extra `o-dropdown-item` components here, even if you have some options defined by prop\n     * @param toggle {(): void} - toggle dropdown active state\n     * */\n    before?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define extra `o-dropdown-item` components here, even if you have some options defined by prop\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    after?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define the content to show if the list is empty\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    empty?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Override the option group\n     * @param group {object} - options group item\n     */\n    group?(props: { group: OptionGroupItem<DropdownItemProps<T>> }): void;\n    /**\n     * Override the label, default is label prop\n     * @param option {object} - option item\n     */\n    option?(props: { option: OptionItem<DropdownItemProps<T>> }): void;\n}>();\n\nconst triggerRef = useTemplateRef<HTMLElement>(\"triggerRef\");\nconst menuRef = ref<HTMLElement | Component>();\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// set field labelId or create a unique label id if a label is given\nconst labelId = props.labelledby ?? parentField.value?.labelId;\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer, true),\n);\n\n// the selected item value, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst autoPosition = ref(props.position);\n\n/** update autoPosition on prop change */\nwatch(\n    () => props.position,\n    (v) => (autoPosition.value = v),\n);\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\n// check if client is mobile native\nconst isMobileNative = isClient && isMobileAgent.any();\n\n// check if should be shown as modal\nconst isModal = computed(\n    () =>\n        !props.inline &&\n        ((isMobile.value && props.mobileModal) ||\n            (!isMobile.value && props.desktopModal)),\n);\n\nconst menuStyle = computed(() => ({\n    maxHeight: props.scrollable ? toCssDimension(props.maxHeight) : null,\n    overflow: props.scrollable ? \"auto\" : null,\n}));\n\nconst hoverable = computed(() => props.openOnHover);\n\nconst toggleScroll = usePreventScrolling(props.clipScroll);\n\nwatch(\n    isActive,\n    (value) => {\n        // on active set event handler if not open as modal\n        if (value) {\n            // keep first option always pre-focused\n            if (!props.inline && props.keepFirst && !focusedItem.value)\n                moveFocus(1);\n        }\n        if (isModal.value) toggleScroll(value);\n    },\n    { flush: \"post\" },\n);\n\n// #region --- Child Items ---\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<DropdownComponent<T>>(() => ({\n    menuId: props.menuId,\n    itemTag: props.itemTag,\n    disabled: props.disabled,\n    multiple: isTrueish(props.multiple),\n    selectable: props.selectable,\n    selected: vmodel.value,\n    focsuedIdentifier: focusedItem.value?.identifier,\n    selectItem,\n    focusItem,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<\n    DropdownItemComponent<T>,\n    DropdownComponent<T>\n>({\n    rootRef: menuRef,\n    data: provideData,\n});\n\nwatch(\n    childItems,\n    () => {\n        // change pre-focused element when items change and keepFirst\n        if (isActive.value && !props.inline && props.keepFirst) {\n            focusedItem.value = undefined;\n            moveFocus(1);\n        }\n    },\n    { deep: true, flush: \"post\" },\n);\n\n/** is any option visible */\nconst hasViableItems = computed(() =>\n    childItems.value.some((item) => item.data.isViable),\n);\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(\n    startingIndex: number,\n    delta: 1 | -1,\n): DropdownChildItem<T> {\n    let newIndex = mod(\n        focusedItem.value?.index == startingIndex\n            ? startingIndex + delta\n            : startingIndex,\n        childItems.value.length,\n    );\n    for (\n        ;\n        newIndex !== focusedItem.value?.index;\n        newIndex = mod(newIndex + delta, childItems.value.length)\n    ) {\n        // Break if the item at this index is viable (not disabled or hidden)\n        if (childItems.value[newIndex].data.isViable) break;\n    }\n\n    return childItems.value[newIndex];\n}\n\n// #endregion --- Child Items ---\n\n// #region --- Trigger Handler ---\n\nif (isClient) {\n    // set infinite scroll handler\n    if (props.scrollable)\n        useScrollEvents(\n            menuRef,\n            {\n                onScrollEnd: () => emits(\"scroll-end\"),\n                onScrollStart: () => emits(\"scroll-start\"),\n            },\n            { passive: true },\n        );\n\n    // set click outside handler\n    if (props.closeOnOutside)\n        useClickOutside([menuRef, triggerRef], onClickedOutside, {\n            trigger: isActive,\n            passive: true,\n        });\n\n    // set scroll page event\n    if (props.closeOnScroll)\n        useEventListener(window, \"scroll\", onPageScroll, {\n            trigger: isActive,\n            passive: true,\n        });\n}\n\n/** Close dropdown if clicked outside. */\nfunction onClickedOutside(event: Event): void {\n    if (!props.closeOnOutside) return;\n    if (!isActive.value || props.inline) return;\n    close(event);\n}\n\n/** Close dropdown if page get scrolled. */\nfunction onPageScroll(event: Event): void {\n    if (!props.closeOnScroll) return;\n    if (!isActive.value || props.inline) return;\n    close(event);\n}\n\nfunction onTriggerClick(event: Event): void {\n    // check if is mobile native and hoverable together\n    if (isMobileNative && hoverable.value) toggle(event);\n    // check normal click conditions\n    if (!props.openOnClick) return;\n    toggle(event);\n}\n\nfunction onTriggerContextMenu(event: Event): void {\n    if (!props.openOnContextmenu) return;\n    event.preventDefault();\n    open(event);\n}\n\nfunction onTriggerFocus(event: Event): void {\n    if (!props.openOnFocus) return;\n    open(event);\n}\n\nfunction onTriggerHover(event: Event): void {\n    if (isMobileNative) return;\n    if (!props.openOnHover) return;\n    open(event);\n}\n\nfunction onTriggerHoverLeave(event: Event): void {\n    if (isMobileNative) return;\n    if (!props.openOnHover) return;\n    close(event);\n}\n\n/** Toggle dropdown if it's not disabled. */\nfunction toggle(event: Event): void {\n    if (props.disabled) return;\n    if (!isActive.value) open(event);\n    else close(event);\n}\n\nlet timer: ReturnType<typeof setTimeout> | undefined;\n\nfunction open(event: Event): void {\n    if (props.disabled) return;\n    if (isActive.value) return;\n    if (props.delay) {\n        timer = setTimeout(() => {\n            isActive.value = true;\n            timer = undefined;\n            emits(\"open\", event);\n        }, props.delay);\n    } else {\n        // if not active, toggle after clickOutside event\n        // this fixes toggling programmatic\n        nextTick(() => (isActive.value = true));\n        emits(\"open\", event);\n    }\n}\n\nfunction close(event: Event): void {\n    if (!isActive.value) return;\n\n    // clear remaining timer\n    if (timer) clearTimeout(timer);\n\n    // select item when dropdown closed\n    if (props.selectOnClose && focusedItem.value?.data.value)\n        selectItem(focusedItem.value);\n\n    // reset focused item\n    if (focusedItem.value) {\n        unrefElement(focusedItem.value.el)?.blur();\n        focusedItem.value = undefined;\n    }\n\n    isActive.value = false;\n    emits(\"close\", event);\n}\n\n// #endregion --- Trigger Handler ---\n\n// #region --- Select Feature ---\n\n/**\n * Click listener from DropdownItem.\n *   1. Set new selected item.\n *   2. Update v-model.\n *   3. Close the dropdown.\n */\nfunction selectItem(item: DropdownChildItem<T>, event?: Event): void {\n    const value = item.data!.value!;\n    emits(\"select\", value);\n\n    if (props.selectable) {\n        // set selected option\n        if (isTrueish(props.multiple)) {\n            if (vmodel.value && Array.isArray(vmodel.value)) {\n                if (!vmodel.value.includes(value)) {\n                    // add a value\n                    vmodel.value = [...vmodel.value, value] as ModelValue;\n                } else {\n                    // remove a value\n                    vmodel.value = vmodel.value.filter(\n                        (val) => val !== value,\n                    ) as ModelValue;\n                }\n            } else {\n                // init new value array\n                vmodel.value = [value] as ModelValue;\n            }\n            // emit change after vmodel has changed\n            nextTick(() => emits(\"change\", vmodel.value));\n        } else {\n            if (vmodel.value !== value) {\n                // update a single value\n                vmodel.value = value as ModelValue;\n                // emit change after vmodel has changed\n                nextTick(() => emits(\"change\", vmodel.value));\n            }\n        }\n    }\n\n    triggerRef.value?.focus();\n    if (props.keepOpen || !isActive.value || !event) return;\n    close(event);\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Focus Feature ---\n\nconst focusedItem = ref<DropdownChildItem<T>>();\n\n/** Hover listener from DropdownItem. */\nfunction focusItem(value: DropdownChildItem<T>): void {\n    focusedItem.value = value;\n}\n\n/** Menu hover leave event handler. */\nfunction onMenuHoverLeave(): void {\n    focusedItem.value = undefined;\n}\n\n/** Set focus on a tab item. */\nfunction moveFocus(delta: 1 | -1): void {\n    if (!hasViableItems.value) return;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n    setFocus(item);\n}\n\n/** Set focus on a dropdown item. */\nfunction setFocus(item: DropdownChildItem<T>): void {\n    if (props.selectOnFocus && item.data.value)\n        selectItem(\n            item,\n            new FocusEvent(\"focus\", { relatedTarget: toValue(item.el) }),\n        );\n\n    // set item as focused\n    focusedItem.value = item;\n\n    // scroll item into view\n    scrollElementInView(menuRef, item.el);\n}\n\nfunction onUpPressed(event: Event): void {\n    if (!isActive.value) return open(event);\n    moveFocus(-1);\n}\n\nfunction onDownPressed(event: Event): void {\n    if (!isActive.value) return open(event);\n    moveFocus(1);\n}\n\nfunction onEnter(event: Event): void {\n    if (!isActive.value) return;\n    if (!focusedItem.value) return;\n    setFocus(focusedItem.value);\n    focusedItem.value.data.selectItem();\n    // prevent other event handler\n    event.stopPropagation();\n}\n\n/** Go to the first viable item */\nfunction onHomePressed(event: Event): void {\n    const target = event.target as HTMLElement;\n    // do not prevent default for HTMLElements with native keyboard \"Home\" key event behavior\n    if (target.tagName !== \"INPUT\" && target.tagName !== \"TEXTAREA\")\n        event.preventDefault();\n\n    open(event);\n    if (!hasViableItems.value) return;\n    const item = getFirstViableItem(0, 1);\n    setFocus(item);\n}\n\n/** Go to the last viable item */\nfunction onEndPressed(event: Event): void {\n    const target = event.target as HTMLElement;\n    // do not prevent default for HTMLElements with native keyboard \"End\" key event behavior\n    if (target.tagName !== \"INPUT\" && target.tagName !== \"TEXTAREA\")\n        event.preventDefault();\n\n    open(event);\n    if (!hasViableItems.value) return;\n    const item = getFirstViableItem(childItems.value.length - 1, -1);\n    setFocus(item);\n}\n\nfunction onEscape(event: Event): void {\n    close(event);\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-dropdown\"],\n    [\n        \"disabledClass\",\n        \"o-dropdown--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"expandedClass\",\n        \"o-dropdown--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    /** @deprecated */\n    [\"inlineClass\", \"o-dropdown--inline\", null, computed(() => props.inline)],\n    [\"mobileClass\", \"o-dropdown--mobile\", null, isMobile],\n    [\"modalClass\", \"o-dropdown--modal\", null, isModal],\n    [\"hoverableClass\", \"o-dropdown--hoverable\", null, hoverable],\n    [\n        \"positionClass\",\n        \"o-dropdown--position-\",\n        autoPosition,\n        computed(() => !!autoPosition.value),\n    ],\n    [\n        \"activeClass\",\n        \"o-dropdown--active\",\n        null,\n        computed(() => isActive.value || props.inline),\n    ],\n);\n\nconst triggerClasses = defineClasses([\"triggerClass\", \"o-dropdown__trigger\"]);\n\nconst teleportClasses = defineClasses([\n    \"teleportClass\",\n    \"o-dropdown--teleport\",\n    null,\n    computed(() => !!props.teleport),\n]);\n\nconst overlayClasses = defineClasses([\"overlayClass\", \"o-dropdown__overlay\"]);\n\nconst menuClasses = defineClasses(\n    [\"menuClass\", \"o-dropdown__menu\"],\n    [\n        \"menuPositionClass\",\n        \"o-dropdown__menu--\",\n        autoPosition,\n        computed(() => !!autoPosition.value),\n    ],\n    [\n        \"menuActiveClass\",\n        \"o-dropdown__menu--active\",\n        null,\n        computed(() => isActive.value || props.inline),\n    ],\n);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ value: vmodel, items: childItems });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <div\n        data-oruga=\"dropdown\"\n        :class=\"rootClasses\"\n        @mouseleave=\"onTriggerHoverLeave\"\n        @focusout=\"onTriggerHoverLeave\">\n        <component\n            :is=\"triggerTag\"\n            v-if=\"!inline\"\n            ref=\"triggerRef\"\n            :class=\"triggerClasses\"\n            :role=\"selectable ? 'combobox' : undefined\"\n            :tabindex=\"disabled ? -1 : null\"\n            :aria-haspopup=\"selectable ? 'listbox' : 'menu'\"\n            :aria-expanded=\"selectable ? isActive : undefined\"\n            :aria-activedescendant=\"\n                focusedItem ? `${menuId}-${focusedItem.identifier}` : undefined\n            \"\n            :aria-disabled=\"disabled\"\n            :aria-controls=\"menuId\"\n            :aria-labelledby=\"selectable ? labelId : undefined\"\n            :aria-label=\"selectable ? ariaLabel : undefined\"\n            @click=\"onTriggerClick\"\n            @contextmenu=\"onTriggerContextMenu\"\n            @mouseenter=\"onTriggerHover\"\n            @focus.capture=\"onTriggerFocus\"\n            @keydown.tab=\"onEscape\"\n            @keydown.escape=\"onEscape\"\n            @keydown.enter.capture=\"onEnter\"\n            @keydown.space.capture=\"onEnter\"\n            @keydown.up.prevent=\"onUpPressed\"\n            @keydown.down.prevent=\"onDownPressed\"\n            @keydown.home=\"onHomePressed\"\n            @keydown.end=\"onEndPressed\">\n            <slot\n                name=\"trigger\"\n                :active=\"isActive\"\n                :value=\"modelValue as ModelValue\"\n                :toggle=\"onTriggerClick\">\n                {{ label }}\n            </slot>\n        </component>\n\n        <PositionWrapper\n            v-slot=\"{ setContent }\"\n            v-model:position=\"autoPosition\"\n            :teleport=\"teleport\"\n            :class=\"[...rootClasses, ...teleportClasses]\"\n            :trigger=\"triggerRef\"\n            :disabled=\"!isActive\"\n            default-position=\"bottom\"\n            :disable-positioning=\"!isModal\">\n            <transition v-if=\"isModal\" :name=\"animation\">\n                <div\n                    v-show=\"isActive\"\n                    :class=\"overlayClasses\"\n                    tabindex=\"-1\"\n                    @click=\"onClickedOutside\" />\n            </transition>\n\n            <transition :name=\"animation\">\n                <component\n                    :is=\"menuTag\"\n                    v-show=\"(!disabled && isActive) || inline\"\n                    :id=\"menuId\"\n                    :ref=\"(el) => (menuRef = setContent(el))\"\n                    :tabindex=\"inline ? 0 : -1\"\n                    :class=\"menuClasses\"\n                    :style=\"menuStyle\"\n                    :role=\"selectable ? 'listbox' : 'menu'\"\n                    :aria-labelledby=\"labelId\"\n                    :aria-label=\"ariaLabel\"\n                    :aria-hidden=\"\n                        !selectable && !inline\n                            ? disabled || !isActive\n                            : undefined\n                    \"\n                    :aria-multiselectable=\"\n                        selectable ? isTrueish(multiple) : undefined\n                    \"\n                    @mouseleave=\"onMenuHoverLeave\"\n                    @keydown.enter.prevent=\"inline && onEnter($event)\"\n                    @keydown.space.prevent=\"inline && onEnter($event)\"\n                    @keydown.up.prevent=\"inline && onUpPressed($event)\"\n                    @keydown.down.prevent=\"inline && onDownPressed($event)\"\n                    @keydown.home=\"inline && onHomePressed($event)\"\n                    @keydown.end=\"inline && onEndPressed($event)\">\n                    <slot name=\"before\" :toggle=\"toggle\" />\n\n                    <slot :toggle=\"toggle\">\n                        <template\n                            v-for=\"option in normalizedOptions\"\n                            :key=\"option.key\">\n                            <template v-if=\"isGroupOption(option)\">\n                                <o-dropdown-item\n                                    v-bind=\"option.item\"\n                                    role=\"presentation\"\n                                    :clickable=\"false\">\n                                    <slot name=\"group\" :group=\"option\">\n                                        <span> {{ option.item.label }} </span>\n                                    </slot>\n                                </o-dropdown-item>\n\n                                <o-dropdown-item\n                                    v-for=\"_option in option.options\"\n                                    v-bind=\"_option.item\"\n                                    :key=\"_option.key\">\n                                    <slot name=\"option\" :option=\"_option\">\n                                        <span> {{ _option.item.label }} </span>\n                                    </slot>\n                                </o-dropdown-item>\n                            </template>\n\n                            <o-dropdown-item v-else v-bind=\"option.item\">\n                                <slot name=\"option\" :option=\"option\">\n                                    <span> {{ option.item.label }} </span>\n                                </slot>\n                            </o-dropdown-item>\n                        </template>\n                    </slot>\n\n                    <slot\n                        v-if=\"!hasViableItems\"\n                        name=\"empty\"\n                        :toggle=\"toggle\" />\n\n                    <slot name=\"after\" :toggle=\"toggle\" />\n                </component>\n            </transition>\n        </PositionWrapper>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T, IsMultiple extends boolean = false\">\nimport {\n    computed,\n    nextTick,\n    ref,\n    watch,\n    useId,\n    toValue,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport ODropdownItem from \"../dropdown/DropdownItem.vue\";\nimport PositionWrapper from \"../utils/PositionWrapper.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { toCssDimension, isMobileAgent, isTrueish, mod } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderParent,\n    useMatchMedia,\n    useClickOutside,\n    usePreventScrolling,\n    useEventListener,\n    useScrollEvents,\n    scrollElementInView,\n    unrefElement,\n    useIndexer,\n    isGroupOption,\n    type OptionGroupItem,\n    type OptionItem,\n} from \"@/composables\";\n\nimport type {\n    DropdownChildItem,\n    DropdownComponent,\n    DropdownItemComponent,\n} from \"./types\";\nimport type { DropdownItemProps, DropdownProps } from \"./props\";\nimport { injectField } from \"../field/fieldInjection\";\n\n/**\n * Dropdowns are very versatile, can used as a quick menu or even like a select for discoverable content.\n * @displayName Dropdown\n * @requires ./DropdownItem.vue\n * @style _dropdown.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ODropdown\",\n    configField: \"dropdown\",\n});\n\ntype ModelValue = DropdownProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<DropdownProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    options: undefined,\n    active: false,\n    label: undefined,\n    disabled: false,\n    inline: false,\n    selectable: false,\n    keepOpen: () => getDefault(\"dropdown.keepOpen\", false),\n    keepFirst: () => getDefault(\"dropdown.keepFirst\", false),\n    closeOnOutside: () => getDefault(\"dropdown.closeOnOutside\", true),\n    closeOnScroll: () => getDefault(\"dropdown.closeOnScroll\", false),\n    selectOnFocus: () => getDefault(\"dropdown.selectOnFocus\", false),\n    selectOnClose: () => getDefault(\"dropdown.selectOnClose\", false),\n    expanded: false,\n    position: () => getDefault(\"dropdown.position\", \"bottom-left\"),\n    scrollable: false,\n    maxHeight: () => getDefault(\"dropdown.maxHeight\", 200),\n    menuId: () => useId(),\n    menuTag: () => getDefault(\"dropdown.menuTag\", \"div\"),\n    itemTag: () => getDefault(\"dropdown.itemTag\", \"div\"),\n    triggerTag: () => getDefault(\"dropdown.triggerTag\", \"div\"),\n    openOnClick: () => getDefault(\"tooltip.openOnClick\", true),\n    openOnContextmenu: () => getDefault(\"tooltip.openOnContextmenu\", false),\n    openOnHover: () => getDefault(\"tooltip.openOnHover\", false),\n    openOnFocus: () => getDefault(\"tooltip.openOnFocus\", false),\n    delay: undefined,\n    desktopModal: () => getDefault(\"dropdown.desktopModal\", false),\n    mobileModal: () => getDefault(\"dropdown.mobileModal\", true),\n    mobileBreakpoint: () => getDefault(\"dropdown.mobileBreakpoint\"),\n    animation: () => getDefault(\"dropdown.animation\", \"fade\"),\n    teleport: () => getDefault(\"dropdown.teleport\", false),\n    clipScroll: () => getDefault(\"dropdown.clipScroll\", false),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown | unknown[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on select event - fired before update:modelValue\n     * @param value {unknown} - selected value\n     */\n    select: [value: T];\n    /**\n     * @deprecated use update:model-value instead\n     * on change event - fired after update:modelValue\n     * @param value {unknown | unknown[]} - selected value\n     */\n    change: [value: ModelValue];\n    /**\n     * on active state changes to true\n     * @param event {Event} - native event\n     */\n    open: [event: Event];\n    /**\n     * on active state changes to false\n     * @param event {Event} - native event\n     */\n    close: [event: Event];\n    /** the list inside the dropdown reached the start */\n    \"scroll-start\": [];\n    /** the list inside the dropdown reached it's end */\n    \"scroll-end\": [];\n}>();\n\ndefineSlots<{\n    /**\n     * Override the trigger element, default is label prop\n     * @param active {boolean} - dropdown active state\n     * @param value {unknown | unknown[]} - the selected value\n     * @param toggle {(event: Event): void} - toggle dropdown active state\n     */\n    trigger?(props: {\n        active: boolean;\n        value: ModelValue;\n        toggle: (event: Event) => void;\n    }): void;\n    /**\n     * Define the dropdown items here\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    default?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define extra `o-dropdown-item` components here, even if you have some options defined by prop\n     * @param toggle {(): void} - toggle dropdown active state\n     * */\n    before?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define extra `o-dropdown-item` components here, even if you have some options defined by prop\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    after?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define the content to show if the list is empty\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    empty?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Override the option group\n     * @param group {object} - options group item\n     */\n    group?(props: { group: OptionGroupItem<DropdownItemProps<T>> }): void;\n    /**\n     * Override the label, default is label prop\n     * @param option {object} - option item\n     */\n    option?(props: { option: OptionItem<DropdownItemProps<T>> }): void;\n}>();\n\nconst triggerRef = useTemplateRef<HTMLElement>(\"triggerRef\");\nconst menuRef = ref<HTMLElement | Component>();\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// set field labelId or create a unique label id if a label is given\nconst labelId = props.labelledby ?? parentField.value?.labelId;\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer, true),\n);\n\n// the selected item value, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst autoPosition = ref(props.position);\n\n/** update autoPosition on prop change */\nwatch(\n    () => props.position,\n    (v) => (autoPosition.value = v),\n);\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\n// check if client is mobile native\nconst isMobileNative = isClient && isMobileAgent.any();\n\n// check if should be shown as modal\nconst isModal = computed(\n    () =>\n        !props.inline &&\n        ((isMobile.value && props.mobileModal) ||\n            (!isMobile.value && props.desktopModal)),\n);\n\nconst menuStyle = computed(() => ({\n    maxHeight: props.scrollable ? toCssDimension(props.maxHeight) : null,\n    overflow: props.scrollable ? \"auto\" : null,\n}));\n\nconst hoverable = computed(() => props.openOnHover);\n\nconst toggleScroll = usePreventScrolling(props.clipScroll);\n\nwatch(\n    isActive,\n    (value) => {\n        // on active set event handler if not open as modal\n        if (value) {\n            // keep first option always pre-focused\n            if (!props.inline && props.keepFirst && !focusedItem.value)\n                moveFocus(1);\n        }\n        if (isModal.value) toggleScroll(value);\n    },\n    { flush: \"post\" },\n);\n\n// #region --- Child Items ---\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<DropdownComponent<T>>(() => ({\n    menuId: props.menuId,\n    itemTag: props.itemTag,\n    disabled: props.disabled,\n    multiple: isTrueish(props.multiple),\n    selectable: props.selectable,\n    selected: vmodel.value,\n    focsuedIdentifier: focusedItem.value?.identifier,\n    selectItem,\n    focusItem,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<\n    DropdownItemComponent<T>,\n    DropdownComponent<T>\n>({\n    rootRef: menuRef,\n    data: provideData,\n});\n\nwatch(\n    childItems,\n    () => {\n        // change pre-focused element when items change and keepFirst\n        if (isActive.value && !props.inline && props.keepFirst) {\n            focusedItem.value = undefined;\n            moveFocus(1);\n        }\n    },\n    { deep: true, flush: \"post\" },\n);\n\n/** is any option visible */\nconst hasViableItems = computed(() =>\n    childItems.value.some((item) => item.data.isViable),\n);\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(\n    startingIndex: number,\n    delta: 1 | -1,\n): DropdownChildItem<T> {\n    let newIndex = mod(\n        focusedItem.value?.index == startingIndex\n            ? startingIndex + delta\n            : startingIndex,\n        childItems.value.length,\n    );\n    for (\n        ;\n        newIndex !== focusedItem.value?.index;\n        newIndex = mod(newIndex + delta, childItems.value.length)\n    ) {\n        // Break if the item at this index is viable (not disabled or hidden)\n        if (childItems.value[newIndex].data.isViable) break;\n    }\n\n    return childItems.value[newIndex];\n}\n\n// #endregion --- Child Items ---\n\n// #region --- Trigger Handler ---\n\nif (isClient) {\n    // set infinite scroll handler\n    if (props.scrollable)\n        useScrollEvents(\n            menuRef,\n            {\n                onScrollEnd: () => emits(\"scroll-end\"),\n                onScrollStart: () => emits(\"scroll-start\"),\n            },\n            { passive: true },\n        );\n\n    // set click outside handler\n    if (props.closeOnOutside)\n        useClickOutside([menuRef, triggerRef], onClickedOutside, {\n            trigger: isActive,\n            passive: true,\n        });\n\n    // set scroll page event\n    if (props.closeOnScroll)\n        useEventListener(window, \"scroll\", onPageScroll, {\n            trigger: isActive,\n            passive: true,\n        });\n}\n\n/** Close dropdown if clicked outside. */\nfunction onClickedOutside(event: Event): void {\n    if (!props.closeOnOutside) return;\n    if (!isActive.value || props.inline) return;\n    close(event);\n}\n\n/** Close dropdown if page get scrolled. */\nfunction onPageScroll(event: Event): void {\n    if (!props.closeOnScroll) return;\n    if (!isActive.value || props.inline) return;\n    close(event);\n}\n\nfunction onTriggerClick(event: Event): void {\n    // check if is mobile native and hoverable together\n    if (isMobileNative && hoverable.value) toggle(event);\n    // check normal click conditions\n    if (!props.openOnClick) return;\n    toggle(event);\n}\n\nfunction onTriggerContextMenu(event: Event): void {\n    if (!props.openOnContextmenu) return;\n    event.preventDefault();\n    open(event);\n}\n\nfunction onTriggerFocus(event: Event): void {\n    if (!props.openOnFocus) return;\n    open(event);\n}\n\nfunction onTriggerHover(event: Event): void {\n    if (isMobileNative) return;\n    if (!props.openOnHover) return;\n    open(event);\n}\n\nfunction onTriggerHoverLeave(event: Event): void {\n    if (isMobileNative) return;\n    if (!props.openOnHover) return;\n    close(event);\n}\n\n/** Toggle dropdown if it's not disabled. */\nfunction toggle(event: Event): void {\n    if (props.disabled) return;\n    if (!isActive.value) open(event);\n    else close(event);\n}\n\nlet timer: ReturnType<typeof setTimeout> | undefined;\n\nfunction open(event: Event): void {\n    if (props.disabled) return;\n    if (isActive.value) return;\n    if (props.delay) {\n        timer = setTimeout(() => {\n            isActive.value = true;\n            timer = undefined;\n            emits(\"open\", event);\n        }, props.delay);\n    } else {\n        // if not active, toggle after clickOutside event\n        // this fixes toggling programmatic\n        nextTick(() => (isActive.value = true));\n        emits(\"open\", event);\n    }\n}\n\nfunction close(event: Event): void {\n    if (!isActive.value) return;\n\n    // clear remaining timer\n    if (timer) clearTimeout(timer);\n\n    // select item when dropdown closed\n    if (props.selectOnClose && focusedItem.value?.data.value)\n        selectItem(focusedItem.value);\n\n    // reset focused item\n    if (focusedItem.value) {\n        unrefElement(focusedItem.value.el)?.blur();\n        focusedItem.value = undefined;\n    }\n\n    isActive.value = false;\n    emits(\"close\", event);\n}\n\n// #endregion --- Trigger Handler ---\n\n// #region --- Select Feature ---\n\n/**\n * Click listener from DropdownItem.\n *   1. Set new selected item.\n *   2. Update v-model.\n *   3. Close the dropdown.\n */\nfunction selectItem(item: DropdownChildItem<T>, event?: Event): void {\n    const value = item.data!.value!;\n    emits(\"select\", value);\n\n    if (props.selectable) {\n        // set selected option\n        if (isTrueish(props.multiple)) {\n            if (vmodel.value && Array.isArray(vmodel.value)) {\n                if (!vmodel.value.includes(value)) {\n                    // add a value\n                    vmodel.value = [...vmodel.value, value] as ModelValue;\n                } else {\n                    // remove a value\n                    vmodel.value = vmodel.value.filter(\n                        (val) => val !== value,\n                    ) as ModelValue;\n                }\n            } else {\n                // init new value array\n                vmodel.value = [value] as ModelValue;\n            }\n            // emit change after vmodel has changed\n            nextTick(() => emits(\"change\", vmodel.value));\n        } else {\n            if (vmodel.value !== value) {\n                // update a single value\n                vmodel.value = value as ModelValue;\n                // emit change after vmodel has changed\n                nextTick(() => emits(\"change\", vmodel.value));\n            }\n        }\n    }\n\n    triggerRef.value?.focus();\n    if (props.keepOpen || !isActive.value || !event) return;\n    close(event);\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Focus Feature ---\n\nconst focusedItem = ref<DropdownChildItem<T>>();\n\n/** Hover listener from DropdownItem. */\nfunction focusItem(value: DropdownChildItem<T>): void {\n    focusedItem.value = value;\n}\n\n/** Menu hover leave event handler. */\nfunction onMenuHoverLeave(): void {\n    focusedItem.value = undefined;\n}\n\n/** Set focus on a tab item. */\nfunction moveFocus(delta: 1 | -1): void {\n    if (!hasViableItems.value) return;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n    setFocus(item);\n}\n\n/** Set focus on a dropdown item. */\nfunction setFocus(item: DropdownChildItem<T>): void {\n    if (props.selectOnFocus && item.data.value)\n        selectItem(\n            item,\n            new FocusEvent(\"focus\", { relatedTarget: toValue(item.el) }),\n        );\n\n    // set item as focused\n    focusedItem.value = item;\n\n    // scroll item into view\n    scrollElementInView(menuRef, item.el);\n}\n\nfunction onUpPressed(event: Event): void {\n    if (!isActive.value) return open(event);\n    moveFocus(-1);\n}\n\nfunction onDownPressed(event: Event): void {\n    if (!isActive.value) return open(event);\n    moveFocus(1);\n}\n\nfunction onEnter(event: Event): void {\n    if (!isActive.value) return;\n    if (!focusedItem.value) return;\n    setFocus(focusedItem.value);\n    focusedItem.value.data.selectItem();\n    // prevent other event handler\n    event.stopPropagation();\n}\n\n/** Go to the first viable item */\nfunction onHomePressed(event: Event): void {\n    const target = event.target as HTMLElement;\n    // do not prevent default for HTMLElements with native keyboard \"Home\" key event behavior\n    if (target.tagName !== \"INPUT\" && target.tagName !== \"TEXTAREA\")\n        event.preventDefault();\n\n    open(event);\n    if (!hasViableItems.value) return;\n    const item = getFirstViableItem(0, 1);\n    setFocus(item);\n}\n\n/** Go to the last viable item */\nfunction onEndPressed(event: Event): void {\n    const target = event.target as HTMLElement;\n    // do not prevent default for HTMLElements with native keyboard \"End\" key event behavior\n    if (target.tagName !== \"INPUT\" && target.tagName !== \"TEXTAREA\")\n        event.preventDefault();\n\n    open(event);\n    if (!hasViableItems.value) return;\n    const item = getFirstViableItem(childItems.value.length - 1, -1);\n    setFocus(item);\n}\n\nfunction onEscape(event: Event): void {\n    close(event);\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-dropdown\"],\n    [\n        \"disabledClass\",\n        \"o-dropdown--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"expandedClass\",\n        \"o-dropdown--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    /** @deprecated */\n    [\"inlineClass\", \"o-dropdown--inline\", null, computed(() => props.inline)],\n    [\"mobileClass\", \"o-dropdown--mobile\", null, isMobile],\n    [\"modalClass\", \"o-dropdown--modal\", null, isModal],\n    [\"hoverableClass\", \"o-dropdown--hoverable\", null, hoverable],\n    [\n        \"positionClass\",\n        \"o-dropdown--position-\",\n        autoPosition,\n        computed(() => !!autoPosition.value),\n    ],\n    [\n        \"activeClass\",\n        \"o-dropdown--active\",\n        null,\n        computed(() => isActive.value || props.inline),\n    ],\n);\n\nconst triggerClasses = defineClasses([\"triggerClass\", \"o-dropdown__trigger\"]);\n\nconst teleportClasses = defineClasses([\n    \"teleportClass\",\n    \"o-dropdown--teleport\",\n    null,\n    computed(() => !!props.teleport),\n]);\n\nconst overlayClasses = defineClasses([\"overlayClass\", \"o-dropdown__overlay\"]);\n\nconst menuClasses = defineClasses(\n    [\"menuClass\", \"o-dropdown__menu\"],\n    [\n        \"menuPositionClass\",\n        \"o-dropdown__menu--\",\n        autoPosition,\n        computed(() => !!autoPosition.value),\n    ],\n    [\n        \"menuActiveClass\",\n        \"o-dropdown__menu--active\",\n        null,\n        computed(() => isActive.value || props.inline),\n    ],\n);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ value: vmodel, items: childItems });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <div\n        data-oruga=\"dropdown\"\n        :class=\"rootClasses\"\n        @mouseleave=\"onTriggerHoverLeave\"\n        @focusout=\"onTriggerHoverLeave\">\n        <component\n            :is=\"triggerTag\"\n            v-if=\"!inline\"\n            ref=\"triggerRef\"\n            :class=\"triggerClasses\"\n            :role=\"selectable ? 'combobox' : undefined\"\n            :tabindex=\"disabled ? -1 : null\"\n            :aria-haspopup=\"selectable ? 'listbox' : 'menu'\"\n            :aria-expanded=\"selectable ? isActive : undefined\"\n            :aria-activedescendant=\"\n                focusedItem ? `${menuId}-${focusedItem.identifier}` : undefined\n            \"\n            :aria-disabled=\"disabled\"\n            :aria-controls=\"menuId\"\n            :aria-labelledby=\"selectable ? labelId : undefined\"\n            :aria-label=\"selectable ? ariaLabel : undefined\"\n            @click=\"onTriggerClick\"\n            @contextmenu=\"onTriggerContextMenu\"\n            @mouseenter=\"onTriggerHover\"\n            @focus.capture=\"onTriggerFocus\"\n            @keydown.tab=\"onEscape\"\n            @keydown.escape=\"onEscape\"\n            @keydown.enter.capture=\"onEnter\"\n            @keydown.space.capture=\"onEnter\"\n            @keydown.up.prevent=\"onUpPressed\"\n            @keydown.down.prevent=\"onDownPressed\"\n            @keydown.home=\"onHomePressed\"\n            @keydown.end=\"onEndPressed\">\n            <slot\n                name=\"trigger\"\n                :active=\"isActive\"\n                :value=\"modelValue as ModelValue\"\n                :toggle=\"onTriggerClick\">\n                {{ label }}\n            </slot>\n        </component>\n\n        <PositionWrapper\n            v-slot=\"{ setContent }\"\n            v-model:position=\"autoPosition\"\n            :teleport=\"teleport\"\n            :class=\"[...rootClasses, ...teleportClasses]\"\n            :trigger=\"triggerRef\"\n            :disabled=\"!isActive\"\n            default-position=\"bottom\"\n            :disable-positioning=\"!isModal\">\n            <transition v-if=\"isModal\" :name=\"animation\">\n                <div\n                    v-show=\"isActive\"\n                    :class=\"overlayClasses\"\n                    tabindex=\"-1\"\n                    @click=\"onClickedOutside\" />\n            </transition>\n\n            <transition :name=\"animation\">\n                <component\n                    :is=\"menuTag\"\n                    v-show=\"(!disabled && isActive) || inline\"\n                    :id=\"menuId\"\n                    :ref=\"(el) => (menuRef = setContent(el))\"\n                    :tabindex=\"inline ? 0 : -1\"\n                    :class=\"menuClasses\"\n                    :style=\"menuStyle\"\n                    :role=\"selectable ? 'listbox' : 'menu'\"\n                    :aria-labelledby=\"labelId\"\n                    :aria-label=\"ariaLabel\"\n                    :aria-hidden=\"\n                        !selectable && !inline\n                            ? disabled || !isActive\n                            : undefined\n                    \"\n                    :aria-multiselectable=\"\n                        selectable ? isTrueish(multiple) : undefined\n                    \"\n                    @mouseleave=\"onMenuHoverLeave\"\n                    @keydown.enter.prevent=\"inline && onEnter($event)\"\n                    @keydown.space.prevent=\"inline && onEnter($event)\"\n                    @keydown.up.prevent=\"inline && onUpPressed($event)\"\n                    @keydown.down.prevent=\"inline && onDownPressed($event)\"\n                    @keydown.home=\"inline && onHomePressed($event)\"\n                    @keydown.end=\"inline && onEndPressed($event)\">\n                    <slot name=\"before\" :toggle=\"toggle\" />\n\n                    <slot :toggle=\"toggle\">\n                        <template\n                            v-for=\"option in normalizedOptions\"\n                            :key=\"option.key\">\n                            <template v-if=\"isGroupOption(option)\">\n                                <o-dropdown-item\n                                    v-bind=\"option.item\"\n                                    role=\"presentation\"\n                                    :clickable=\"false\">\n                                    <slot name=\"group\" :group=\"option\">\n                                        <span> {{ option.item.label }} </span>\n                                    </slot>\n                                </o-dropdown-item>\n\n                                <o-dropdown-item\n                                    v-for=\"_option in option.options\"\n                                    v-bind=\"_option.item\"\n                                    :key=\"_option.key\">\n                                    <slot name=\"option\" :option=\"_option\">\n                                        <span> {{ _option.item.label }} </span>\n                                    </slot>\n                                </o-dropdown-item>\n                            </template>\n\n                            <o-dropdown-item v-else v-bind=\"option.item\">\n                                <slot name=\"option\" :option=\"option\">\n                                    <span> {{ option.item.label }} </span>\n                                </slot>\n                            </o-dropdown-item>\n                        </template>\n                    </slot>\n\n                    <slot\n                        v-if=\"!hasViableItems\"\n                        name=\"empty\"\n                        :toggle=\"toggle\" />\n\n                    <slot name=\"after\" :toggle=\"toggle\" />\n                </component>\n            </transition>\n        </PositionWrapper>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport {\n    computed,\n    ref,\n    watch,\n    useAttrs,\n    useId,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport OInput from \"../input/Input.vue\";\nimport ODropdown from \"../dropdown/Dropdown.vue\";\nimport ODropdownItem from \"../dropdown/DropdownItem.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isEqual } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useInputHandler,\n    useIndexer,\n    isGroupOption,\n    type OptionGroupItem,\n    type OptionItem,\n} from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { AutocompleteProps } from \"./props\";\nimport type { DropdownItemProps } from \"../dropdown/props\";\nimport type { ComponentExposed } from \"vue-component-type-helpers\";\n\nenum SpecialOption {\n    Header,\n    Footer,\n    EMPTY,\n}\n\n/**\n * Extended input that provide suggestions while the user types.\n * @displayName Autocomplete\n * @style _autocomplete.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OAutocomplete\",\n    configField: \"autocomplete\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = AutocompleteProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<AutocompleteProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    input: \"\",\n    active: false,\n    options: undefined,\n    filter: undefined,\n    backendFiltering: () => getDefault(\"autocomplete.backendFiltering\", false),\n    type: \"text\",\n    menuTag: () => getDefault(\"autocomplete.menuTag\", \"div\"),\n    itemTag: () => getDefault(\"autocomplete.itemTag\", \"div\"),\n    size: () => getDefault(\"autocomplete.size\"),\n    position: () => getDefault(\"autocomplete.position\", \"auto\"),\n    placeholder: undefined,\n    expanded: () => getDefault(\"autocomplete.expanded\", false),\n    rounded: false,\n    disabled: false,\n    maxlength: undefined,\n    debounce: () => getDefault(\"autocomplete.debounce\", 400),\n    keepFirst: () => getDefault(\"autocomplete.keepFirst\", false),\n    clearOnSelect: () => getDefault(\"autocomplete.clearOnSelect\", false),\n    openOnFocus: () => getDefault(\"autocomplete.openOnFocus\", false),\n    keepOpen: () => getDefault(\"autocomplete.keepOpen\", false),\n    maxHeight: () => getDefault(\"autocomplete.maxHeight\"),\n    selectOnClose: false,\n    selectableHeader: false,\n    selectableFooter: false,\n    iconPack: () => getDefault(\"autocomplete.iconPack\"),\n    icon: () => getDefault(\"autocomplete.icon\"),\n    iconClickable: false,\n    iconRight: () => getDefault(\"autocomplete.iconRight\"),\n    iconRightClickable: false,\n    iconRightVariant: undefined,\n    clearable: () => getDefault(\"autocomplete.clearable\", false),\n    clearIcon: () => getDefault(\"autocomplete.clearIcon\", \"close-circle\"),\n    statusIcon: () => getDefault(\"statusIcon\", true),\n    desktopModal: () => getDefault(\"dropdown.desktopModal\", false),\n    mobileModal: () => getDefault(\"autocomplete.mobileModal\", false),\n    animation: () => getDefault(\"autocomplete.animation\", \"fade\"),\n    autocomplete: () => getDefault(\"autocomplete.autocomplete\", \"off\"),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: undefined,\n    teleport: () => getDefault(\"autocomplete.teleport\", false),\n    inputClasses: () => getDefault(\"autocomplete.inputClasses\", {}),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * input prop two-way binding\n     * @param value {string} - updated input prop\n     */\n    \"update:input\": [value: string];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on input change event\n     * @param value {string} - input value\n     * @param event {Event} - native event\n     */\n    input: [value: string, event: Event];\n    /**\n     * selected element changed event\n     * @param value {unknown} - selected value\n     */\n    select: [value: ModelValue];\n    /**\n     * header is selected\n     */\n    \"select-header\": [];\n    /**\n     * footer is selected\n     */\n    \"select-footer\": [];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n    /** the list inside the dropdown reached the start */\n    \"scroll-start\": [];\n    /** the list inside the dropdown reached it's end */\n    \"scroll-end\": [];\n}>();\n\nconst slots = defineSlots<{\n    /**\n     * Define the autocomplete items here\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    default?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define an additional header\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    header?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define an additional footer\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    footer?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define the content to show if the list is empty\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    empty?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Override the option group\n     * @param group {object} - options group\n     */\n    group?(props: { group: OptionGroupItem<DropdownItemProps<T>> }): void;\n    /**\n     * Override the select option\n     * @param option {object} - option object\n     */\n    option?(props: { option: OptionItem<DropdownItemProps<T>> }): void;\n}>();\n\nconst dropdownRef =\n    useTemplateRef<ComponentExposed<typeof ODropdown<T>>>(\"dropdownElement\");\n\n// define as Component to prevent docs memmory overload\nconst inputRef = useTemplateRef<Component>(\"inputComponent\");\n\n// use form input functionalities\nconst { checkHtml5Validity, onInvalid, onFocus, onBlur, isFocused, setFocus } =\n    useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\n// the value of the inner input, use v-model:input to make it two-way binding\nconst inputValue = defineModel<string>(\"input\", { default: \"\" });\n\n/** create a unique id for the menu */\nconst menuId = useId();\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer, true),\n);\n\n// #region --- Child Items ---\n\nconst childItems = computed(() => dropdownRef.value?.items ?? []);\n\n// filter child items based on the input value\nwatch(inputValue, (filter: string): void => {\n    if (props.backendFiltering) return;\n    childItems.value.forEach((item) => {\n        // prevent the empty state from hidding\n        if (item.data.value === SpecialOption.Header) return;\n        if (item.data.value === SpecialOption.Footer) return;\n        if (item.data.value === SpecialOption.EMPTY) return;\n\n        // check if the value matches the filter string\n        const containsFilter =\n            typeof props.filter === \"function\"\n                ? props.filter(item.data.value, filter)\n                : item.data.label?.toLowerCase().includes(filter.toLowerCase());\n\n        // update hidden state\n        item.data.setHidden(!containsFilter);\n    });\n});\n\n/** is any option visible */\nconst hasViableItems = computed(() =>\n    childItems.value.some((item) => item.data.isViable),\n);\n\nwatch(hasViableItems, (viable) => {\n    // open or close dropdown when has no items to show or an empty state entry\n    if (isFocused.value) isActive.value = viable || !!slots.empty;\n});\n\nfunction findOption(\n    value: T | undefined,\n): (typeof childItems)[\"value\"][number] | undefined {\n    if (typeof value === \"undefined\") return undefined;\n    return childItems.value.find((item) => isEqual(value, item.data.value));\n}\n\n// #endregion --- Child Items ---\n\n// #region --- Select Feature ---\n\n/** the selected value, use v-model to make it two-way binding */\nconst selectedValue = defineModel<ModelValue>({ default: undefined });\n\n/** the selected value to the dropdown list */\nconst dropdownValue = ref<T>();\n\n// update the selected value when the input value changes\nwatch(\n    inputValue,\n    (value) => {\n        // find the option for the current selected value\n        const currentOption = findOption(selectedValue.value);\n\n        // clear selected value if option label does not match the selected value\n        if (currentOption && currentOption.data.label !== value) {\n            selectedValue.value = undefined;\n        }\n\n        // Close dropdown if data is empty\n        if (!hasViableItems.value && !slots.empty) {\n            isActive.value = false;\n        }\n    },\n    { flush: \"post\" },\n);\n\n// update the input value when the selected value changes\nwatch(\n    selectedValue,\n    updateInput,\n    // set initial values if selected is given\n    { immediate: true },\n);\n\n// initialise the input value when the childitems got defined\nwatch(\n    childItems,\n    () => {\n        if (selectedValue.value) updateInput(selectedValue.value);\n    },\n    { once: true },\n);\n\n/** Update the input and dropdown Value based on the given value. */\nfunction updateInput(value: T | undefined): void {\n    // find option based on the value\n    const option = findOption(value);\n\n    if (!option) {\n        inputValue.value = \"\";\n        dropdownValue.value = undefined;\n        return;\n    }\n\n    // set selected option label as input value\n    inputValue.value = props.clearOnSelect ? \"\" : (option.data.label ?? \"\");\n    checkHtml5Validity();\n\n    // set the selected option value as dropdown value\n    dropdownValue.value = option.data.value;\n}\n\n/**\n * Set the selected value when the dropdown value changes.\n * 1. update v-model value\n * 2. emit select event\n * 3. close dropdown if not keepOpen\n */\nfunction setSelected(item: T | SpecialOption | undefined): void {\n    let value: T | undefined = undefined;\n\n    // check if emoty was selected\n    if (item === SpecialOption.EMPTY) return;\n    // Check if header or footer was selected\n    if (item === SpecialOption.Header) {\n        emits(\"select-header\");\n    } else if (item === SpecialOption.Footer) {\n        emits(\"select-footer\");\n    } else if (item) {\n        value = item;\n    }\n\n    // set which option is currently selected, update v-model,\n    selectedValue.value = value;\n    emits(\"select\", value);\n\n    if (props.keepOpen) setFocus();\n    else isActive.value = false;\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Input Event Handler ---\n\n/** emit input change event */\nfunction onInput(value: string, event: Event): void {\n    if (isFocused.value) {\n        if (!isActive.value && value && (hasViableItems.value || slots.empty)) {\n            // open dropdown if input has value and options are available\n            isActive.value = true;\n        } else if (isActive.value && !value && !props.keepOpen) {\n            // close dropdown if input has not value and is not keep open\n            isActive.value = false;\n        }\n    }\n    emits(\"input\", value, event);\n    checkHtml5Validity();\n}\n\n/**\n * Focus listener.\n * If value is the same as selected, select all text.\n */\nfunction handleFocus(event: Event): void {\n    // open dropdown if `openOnFocus` and has options\n    if (\n        props.openOnFocus &&\n        (!!props.options?.length ||\n            !!slots.default ||\n            !!slots.header ||\n            !!slots.footer)\n    )\n        isActive.value = true;\n    onFocus(event);\n}\n\n/**\n * Blur listener.\n * Close on blur.\n */\nfunction handleBlur(event: Event): void {\n    onBlur(event);\n}\n\n// #endregion --- Input Event Handler ---\n\n// #region --- Icon Feature ---\n\nconst computedIconRight = computed(() =>\n    props.clearable && inputValue.value && props.clearIcon\n        ? props.clearIcon\n        : props.iconRight,\n);\n\nconst computedIconRightClickable = computed(() =>\n    props.clearable ? true : props.iconRightClickable,\n);\n\nfunction rightIconClick(event: Event): void {\n    if (props.clearable) {\n        inputValue.value = \"\";\n    } else emits(\"icon-right-click\", event);\n}\n\n// #endregion --- Icon Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n    ...props.inputClasses,\n}));\n\nconst rootClasses = defineClasses([\"rootClass\", \"o-autocomplete\"]);\n\nconst itemClasses = defineClasses([\"itemClass\", \"o-autocomplete__item\"]);\n\nconst itemEmptyClasses = defineClasses([\n    \"itemEmptyClass\",\n    \"o-autocomplete__item--empty\",\n]);\n\nconst itemGroupClasses = defineClasses([\n    \"itemGroupClass\",\n    \"o-autocomplete__item-group\",\n]);\n\nconst itemHeaderClasses = defineClasses([\n    \"itemHeaderClass\",\n    \"o-autocomplete__item-header\",\n]);\n\nconst itemFooterClasses = defineClasses([\n    \"itemFooterClass\",\n    \"o-autocomplete__item-footer\",\n]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({\n    value: inputValue,\n    items: childItems,\n    checkHtml5Validity,\n    focus: setFocus,\n});\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <o-dropdown\n        ref=\"dropdownElement\"\n        v-model=\"dropdownValue\"\n        v-model:active=\"isActive\"\n        data-oruga=\"autocomplete\"\n        :class=\"rootClasses\"\n        :menu-id=\"menuId\"\n        :menu-tag=\"menuTag\"\n        :item-tag=\"itemTag\"\n        scrollable\n        selectable\n        :open-on-click=\"false\"\n        :open-on-contextmenu=\"false\"\n        :open-on-focus=\"false\"\n        :open-on-hover=\"false\"\n        :keep-open=\"keepOpen\"\n        :keep-first=\"keepFirst\"\n        :select-on-close=\"selectOnClose\"\n        :disabled=\"disabled\"\n        :desktop-modal=\"desktopModal\"\n        :mobile-modal=\"mobileModal\"\n        :max-height=\"maxHeight\"\n        :animation=\"animation\"\n        :position=\"position\"\n        :teleport=\"teleport\"\n        :expanded=\"expanded\"\n        @select=\"setSelected\"\n        @scroll-start=\"emits('scroll-start')\"\n        @scroll-end=\"emits('scroll-end')\">\n        <template #trigger>\n            <o-input\n                ref=\"inputComponent\"\n                v-bind=\"inputBind\"\n                v-model=\"inputValue\"\n                :type=\"type\"\n                :size=\"size\"\n                :rounded=\"rounded\"\n                :icon=\"icon\"\n                :icon-right=\"computedIconRight\"\n                :icon-right-clickable=\"computedIconRightClickable\"\n                :icon-pack=\"iconPack\"\n                :placeholder=\"placeholder\"\n                :maxlength=\"maxlength\"\n                :autocomplete=\"autocomplete\"\n                :expanded=\"expanded\"\n                :disabled=\"disabled\"\n                :status-icon=\"statusIcon\"\n                :debounce=\"debounce\"\n                :aria-autocomplete=\"keepFirst ? 'both' : 'list'\"\n                :aria-controls=\"menuId\"\n                enterkeyhint=\"enter\"\n                :use-html5-validation=\"false\"\n                @input=\"onInput\"\n                @focus=\"handleFocus\"\n                @blur=\"handleBlur\"\n                @invalid=\"onInvalid\"\n                @icon-click=\"emits('icon-click', $event)\"\n                @icon-right-click=\"rightIconClick\" />\n        </template>\n\n        <template #before=\"{ toggle }\">\n            <o-dropdown-item\n                v-if=\"$slots.header\"\n                :value=\"SpecialOption.Header\"\n                :clickable=\"selectableHeader\"\n                :class=\"[...itemClasses, ...itemHeaderClasses]\">\n                <slot name=\"header\" :toggle />\n            </o-dropdown-item>\n        </template>\n\n        <template #default=\"{ toggle }\">\n            <slot :toggle>\n                <template v-for=\"option in normalizedOptions\" :key=\"option.key\">\n                    <template v-if=\"isGroupOption(option)\">\n                        <o-dropdown-item\n                            v-bind=\"option.item\"\n                            role=\"presentation\"\n                            :clickable=\"false\"\n                            :class=\"[...itemClasses, ...itemGroupClasses]\">\n                            <slot name=\"group\" :group=\"option\">\n                                <span> {{ option.item.label }} </span>\n                            </slot>\n                        </o-dropdown-item>\n\n                        <o-dropdown-item\n                            v-for=\"_option in option.options\"\n                            :key=\"_option.key\"\n                            v-bind=\"_option.item\"\n                            :class=\"itemClasses\">\n                            <slot name=\"option\" :option=\"_option\">\n                                <span> {{ _option.item.label }} </span>\n                            </slot>\n                        </o-dropdown-item>\n                    </template>\n\n                    <o-dropdown-item\n                        v-else\n                        v-bind=\"option.item\"\n                        :class=\"itemClasses\">\n                        <slot name=\"option\" :option=\"option\">\n                            <span> {{ option.item.label }} </span>\n                        </slot>\n                    </o-dropdown-item>\n                </template>\n            </slot>\n        </template>\n\n        <template v-if=\"$slots.empty\" #empty=\"{ toggle }\">\n            <o-dropdown-item\n                :value=\"SpecialOption.EMPTY\"\n                :clickable=\"false\"\n                :class=\"[...itemClasses, ...itemEmptyClasses]\">\n                <slot name=\"empty\" :toggle />\n            </o-dropdown-item>\n        </template>\n\n        <template #after=\"{ toggle }\">\n            <o-dropdown-item\n                v-if=\"$slots.footer\"\n                :value=\"SpecialOption.Footer\"\n                :clickable=\"selectableFooter\"\n                :class=\"[...itemClasses, ...itemFooterClasses]\">\n                <slot name=\"footer\" :toggle />\n            </o-dropdown-item>\n        </template>\n    </o-dropdown>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport {\n    computed,\n    ref,\n    watch,\n    useAttrs,\n    useId,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport OInput from \"../input/Input.vue\";\nimport ODropdown from \"../dropdown/Dropdown.vue\";\nimport ODropdownItem from \"../dropdown/DropdownItem.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isEqual } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useInputHandler,\n    useIndexer,\n    isGroupOption,\n    type OptionGroupItem,\n    type OptionItem,\n} from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { AutocompleteProps } from \"./props\";\nimport type { DropdownItemProps } from \"../dropdown/props\";\nimport type { ComponentExposed } from \"vue-component-type-helpers\";\n\nenum SpecialOption {\n    Header,\n    Footer,\n    EMPTY,\n}\n\n/**\n * Extended input that provide suggestions while the user types.\n * @displayName Autocomplete\n * @style _autocomplete.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OAutocomplete\",\n    configField: \"autocomplete\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = AutocompleteProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<AutocompleteProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    input: \"\",\n    active: false,\n    options: undefined,\n    filter: undefined,\n    backendFiltering: () => getDefault(\"autocomplete.backendFiltering\", false),\n    type: \"text\",\n    menuTag: () => getDefault(\"autocomplete.menuTag\", \"div\"),\n    itemTag: () => getDefault(\"autocomplete.itemTag\", \"div\"),\n    size: () => getDefault(\"autocomplete.size\"),\n    position: () => getDefault(\"autocomplete.position\", \"auto\"),\n    placeholder: undefined,\n    expanded: () => getDefault(\"autocomplete.expanded\", false),\n    rounded: false,\n    disabled: false,\n    maxlength: undefined,\n    debounce: () => getDefault(\"autocomplete.debounce\", 400),\n    keepFirst: () => getDefault(\"autocomplete.keepFirst\", false),\n    clearOnSelect: () => getDefault(\"autocomplete.clearOnSelect\", false),\n    openOnFocus: () => getDefault(\"autocomplete.openOnFocus\", false),\n    keepOpen: () => getDefault(\"autocomplete.keepOpen\", false),\n    maxHeight: () => getDefault(\"autocomplete.maxHeight\"),\n    selectOnClose: false,\n    selectableHeader: false,\n    selectableFooter: false,\n    iconPack: () => getDefault(\"autocomplete.iconPack\"),\n    icon: () => getDefault(\"autocomplete.icon\"),\n    iconClickable: false,\n    iconRight: () => getDefault(\"autocomplete.iconRight\"),\n    iconRightClickable: false,\n    iconRightVariant: undefined,\n    clearable: () => getDefault(\"autocomplete.clearable\", false),\n    clearIcon: () => getDefault(\"autocomplete.clearIcon\", \"close-circle\"),\n    statusIcon: () => getDefault(\"statusIcon\", true),\n    desktopModal: () => getDefault(\"dropdown.desktopModal\", false),\n    mobileModal: () => getDefault(\"autocomplete.mobileModal\", false),\n    animation: () => getDefault(\"autocomplete.animation\", \"fade\"),\n    autocomplete: () => getDefault(\"autocomplete.autocomplete\", \"off\"),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: undefined,\n    teleport: () => getDefault(\"autocomplete.teleport\", false),\n    inputClasses: () => getDefault(\"autocomplete.inputClasses\", {}),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * input prop two-way binding\n     * @param value {string} - updated input prop\n     */\n    \"update:input\": [value: string];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on input change event\n     * @param value {string} - input value\n     * @param event {Event} - native event\n     */\n    input: [value: string, event: Event];\n    /**\n     * selected element changed event\n     * @param value {unknown} - selected value\n     */\n    select: [value: ModelValue];\n    /**\n     * header is selected\n     */\n    \"select-header\": [];\n    /**\n     * footer is selected\n     */\n    \"select-footer\": [];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n    /** the list inside the dropdown reached the start */\n    \"scroll-start\": [];\n    /** the list inside the dropdown reached it's end */\n    \"scroll-end\": [];\n}>();\n\nconst slots = defineSlots<{\n    /**\n     * Define the autocomplete items here\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    default?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define an additional header\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    header?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define an additional footer\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    footer?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define the content to show if the list is empty\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    empty?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Override the option group\n     * @param group {object} - options group\n     */\n    group?(props: { group: OptionGroupItem<DropdownItemProps<T>> }): void;\n    /**\n     * Override the select option\n     * @param option {object} - option object\n     */\n    option?(props: { option: OptionItem<DropdownItemProps<T>> }): void;\n}>();\n\nconst dropdownRef =\n    useTemplateRef<ComponentExposed<typeof ODropdown<T>>>(\"dropdownElement\");\n\n// define as Component to prevent docs memmory overload\nconst inputRef = useTemplateRef<Component>(\"inputComponent\");\n\n// use form input functionalities\nconst { checkHtml5Validity, onInvalid, onFocus, onBlur, isFocused, setFocus } =\n    useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\n// the value of the inner input, use v-model:input to make it two-way binding\nconst inputValue = defineModel<string>(\"input\", { default: \"\" });\n\n/** create a unique id for the menu */\nconst menuId = useId();\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer, true),\n);\n\n// #region --- Child Items ---\n\nconst childItems = computed(() => dropdownRef.value?.items ?? []);\n\n// filter child items based on the input value\nwatch(inputValue, (filter: string): void => {\n    if (props.backendFiltering) return;\n    childItems.value.forEach((item) => {\n        // prevent the empty state from hidding\n        if (item.data.value === SpecialOption.Header) return;\n        if (item.data.value === SpecialOption.Footer) return;\n        if (item.data.value === SpecialOption.EMPTY) return;\n\n        // check if the value matches the filter string\n        const containsFilter =\n            typeof props.filter === \"function\"\n                ? props.filter(item.data.value, filter)\n                : item.data.label?.toLowerCase().includes(filter.toLowerCase());\n\n        // update hidden state\n        item.data.setHidden(!containsFilter);\n    });\n});\n\n/** is any option visible */\nconst hasViableItems = computed(() =>\n    childItems.value.some((item) => item.data.isViable),\n);\n\nwatch(hasViableItems, (viable) => {\n    // open or close dropdown when has no items to show or an empty state entry\n    if (isFocused.value) isActive.value = viable || !!slots.empty;\n});\n\nfunction findOption(\n    value: T | undefined,\n): (typeof childItems)[\"value\"][number] | undefined {\n    if (typeof value === \"undefined\") return undefined;\n    return childItems.value.find((item) => isEqual(value, item.data.value));\n}\n\n// #endregion --- Child Items ---\n\n// #region --- Select Feature ---\n\n/** the selected value, use v-model to make it two-way binding */\nconst selectedValue = defineModel<ModelValue>({ default: undefined });\n\n/** the selected value to the dropdown list */\nconst dropdownValue = ref<T>();\n\n// update the selected value when the input value changes\nwatch(\n    inputValue,\n    (value) => {\n        // find the option for the current selected value\n        const currentOption = findOption(selectedValue.value);\n\n        // clear selected value if option label does not match the selected value\n        if (currentOption && currentOption.data.label !== value) {\n            selectedValue.value = undefined;\n        }\n\n        // Close dropdown if data is empty\n        if (!hasViableItems.value && !slots.empty) {\n            isActive.value = false;\n        }\n    },\n    { flush: \"post\" },\n);\n\n// update the input value when the selected value changes\nwatch(\n    selectedValue,\n    updateInput,\n    // set initial values if selected is given\n    { immediate: true },\n);\n\n// initialise the input value when the childitems got defined\nwatch(\n    childItems,\n    () => {\n        if (selectedValue.value) updateInput(selectedValue.value);\n    },\n    { once: true },\n);\n\n/** Update the input and dropdown Value based on the given value. */\nfunction updateInput(value: T | undefined): void {\n    // find option based on the value\n    const option = findOption(value);\n\n    if (!option) {\n        inputValue.value = \"\";\n        dropdownValue.value = undefined;\n        return;\n    }\n\n    // set selected option label as input value\n    inputValue.value = props.clearOnSelect ? \"\" : (option.data.label ?? \"\");\n    checkHtml5Validity();\n\n    // set the selected option value as dropdown value\n    dropdownValue.value = option.data.value;\n}\n\n/**\n * Set the selected value when the dropdown value changes.\n * 1. update v-model value\n * 2. emit select event\n * 3. close dropdown if not keepOpen\n */\nfunction setSelected(item: T | SpecialOption | undefined): void {\n    let value: T | undefined = undefined;\n\n    // check if emoty was selected\n    if (item === SpecialOption.EMPTY) return;\n    // Check if header or footer was selected\n    if (item === SpecialOption.Header) {\n        emits(\"select-header\");\n    } else if (item === SpecialOption.Footer) {\n        emits(\"select-footer\");\n    } else if (item) {\n        value = item;\n    }\n\n    // set which option is currently selected, update v-model,\n    selectedValue.value = value;\n    emits(\"select\", value);\n\n    if (props.keepOpen) setFocus();\n    else isActive.value = false;\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Input Event Handler ---\n\n/** emit input change event */\nfunction onInput(value: string, event: Event): void {\n    if (isFocused.value) {\n        if (!isActive.value && value && (hasViableItems.value || slots.empty)) {\n            // open dropdown if input has value and options are available\n            isActive.value = true;\n        } else if (isActive.value && !value && !props.keepOpen) {\n            // close dropdown if input has not value and is not keep open\n            isActive.value = false;\n        }\n    }\n    emits(\"input\", value, event);\n    checkHtml5Validity();\n}\n\n/**\n * Focus listener.\n * If value is the same as selected, select all text.\n */\nfunction handleFocus(event: Event): void {\n    // open dropdown if `openOnFocus` and has options\n    if (\n        props.openOnFocus &&\n        (!!props.options?.length ||\n            !!slots.default ||\n            !!slots.header ||\n            !!slots.footer)\n    )\n        isActive.value = true;\n    onFocus(event);\n}\n\n/**\n * Blur listener.\n * Close on blur.\n */\nfunction handleBlur(event: Event): void {\n    onBlur(event);\n}\n\n// #endregion --- Input Event Handler ---\n\n// #region --- Icon Feature ---\n\nconst computedIconRight = computed(() =>\n    props.clearable && inputValue.value && props.clearIcon\n        ? props.clearIcon\n        : props.iconRight,\n);\n\nconst computedIconRightClickable = computed(() =>\n    props.clearable ? true : props.iconRightClickable,\n);\n\nfunction rightIconClick(event: Event): void {\n    if (props.clearable) {\n        inputValue.value = \"\";\n    } else emits(\"icon-right-click\", event);\n}\n\n// #endregion --- Icon Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n    ...props.inputClasses,\n}));\n\nconst rootClasses = defineClasses([\"rootClass\", \"o-autocomplete\"]);\n\nconst itemClasses = defineClasses([\"itemClass\", \"o-autocomplete__item\"]);\n\nconst itemEmptyClasses = defineClasses([\n    \"itemEmptyClass\",\n    \"o-autocomplete__item--empty\",\n]);\n\nconst itemGroupClasses = defineClasses([\n    \"itemGroupClass\",\n    \"o-autocomplete__item-group\",\n]);\n\nconst itemHeaderClasses = defineClasses([\n    \"itemHeaderClass\",\n    \"o-autocomplete__item-header\",\n]);\n\nconst itemFooterClasses = defineClasses([\n    \"itemFooterClass\",\n    \"o-autocomplete__item-footer\",\n]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({\n    value: inputValue,\n    items: childItems,\n    checkHtml5Validity,\n    focus: setFocus,\n});\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <o-dropdown\n        ref=\"dropdownElement\"\n        v-model=\"dropdownValue\"\n        v-model:active=\"isActive\"\n        data-oruga=\"autocomplete\"\n        :class=\"rootClasses\"\n        :menu-id=\"menuId\"\n        :menu-tag=\"menuTag\"\n        :item-tag=\"itemTag\"\n        scrollable\n        selectable\n        :open-on-click=\"false\"\n        :open-on-contextmenu=\"false\"\n        :open-on-focus=\"false\"\n        :open-on-hover=\"false\"\n        :keep-open=\"keepOpen\"\n        :keep-first=\"keepFirst\"\n        :select-on-close=\"selectOnClose\"\n        :disabled=\"disabled\"\n        :desktop-modal=\"desktopModal\"\n        :mobile-modal=\"mobileModal\"\n        :max-height=\"maxHeight\"\n        :animation=\"animation\"\n        :position=\"position\"\n        :teleport=\"teleport\"\n        :expanded=\"expanded\"\n        @select=\"setSelected\"\n        @scroll-start=\"emits('scroll-start')\"\n        @scroll-end=\"emits('scroll-end')\">\n        <template #trigger>\n            <o-input\n                ref=\"inputComponent\"\n                v-bind=\"inputBind\"\n                v-model=\"inputValue\"\n                :type=\"type\"\n                :size=\"size\"\n                :rounded=\"rounded\"\n                :icon=\"icon\"\n                :icon-right=\"computedIconRight\"\n                :icon-right-clickable=\"computedIconRightClickable\"\n                :icon-pack=\"iconPack\"\n                :placeholder=\"placeholder\"\n                :maxlength=\"maxlength\"\n                :autocomplete=\"autocomplete\"\n                :expanded=\"expanded\"\n                :disabled=\"disabled\"\n                :status-icon=\"statusIcon\"\n                :debounce=\"debounce\"\n                :aria-autocomplete=\"keepFirst ? 'both' : 'list'\"\n                :aria-controls=\"menuId\"\n                enterkeyhint=\"enter\"\n                :use-html5-validation=\"false\"\n                @input=\"onInput\"\n                @focus=\"handleFocus\"\n                @blur=\"handleBlur\"\n                @invalid=\"onInvalid\"\n                @icon-click=\"emits('icon-click', $event)\"\n                @icon-right-click=\"rightIconClick\" />\n        </template>\n\n        <template #before=\"{ toggle }\">\n            <o-dropdown-item\n                v-if=\"$slots.header\"\n                :value=\"SpecialOption.Header\"\n                :clickable=\"selectableHeader\"\n                :class=\"[...itemClasses, ...itemHeaderClasses]\">\n                <slot name=\"header\" :toggle />\n            </o-dropdown-item>\n        </template>\n\n        <template #default=\"{ toggle }\">\n            <slot :toggle>\n                <template v-for=\"option in normalizedOptions\" :key=\"option.key\">\n                    <template v-if=\"isGroupOption(option)\">\n                        <o-dropdown-item\n                            v-bind=\"option.item\"\n                            role=\"presentation\"\n                            :clickable=\"false\"\n                            :class=\"[...itemClasses, ...itemGroupClasses]\">\n                            <slot name=\"group\" :group=\"option\">\n                                <span> {{ option.item.label }} </span>\n                            </slot>\n                        </o-dropdown-item>\n\n                        <o-dropdown-item\n                            v-for=\"_option in option.options\"\n                            :key=\"_option.key\"\n                            v-bind=\"_option.item\"\n                            :class=\"itemClasses\">\n                            <slot name=\"option\" :option=\"_option\">\n                                <span> {{ _option.item.label }} </span>\n                            </slot>\n                        </o-dropdown-item>\n                    </template>\n\n                    <o-dropdown-item\n                        v-else\n                        v-bind=\"option.item\"\n                        :class=\"itemClasses\">\n                        <slot name=\"option\" :option=\"option\">\n                            <span> {{ option.item.label }} </span>\n                        </slot>\n                    </o-dropdown-item>\n                </template>\n            </slot>\n        </template>\n\n        <template v-if=\"$slots.empty\" #empty=\"{ toggle }\">\n            <o-dropdown-item\n                :value=\"SpecialOption.EMPTY\"\n                :clickable=\"false\"\n                :class=\"[...itemClasses, ...itemEmptyClasses]\">\n                <slot name=\"empty\" :toggle />\n            </o-dropdown-item>\n        </template>\n\n        <template #after=\"{ toggle }\">\n            <o-dropdown-item\n                v-if=\"$slots.footer\"\n                :value=\"SpecialOption.Footer\"\n                :clickable=\"selectableFooter\"\n                :class=\"[...itemClasses, ...itemFooterClasses]\">\n                <slot name=\"footer\" :toggle />\n            </o-dropdown-item>\n        </template>\n    </o-dropdown>\n</template>\n","import type { App } from \"vue\";\n\nimport Autocomplete from \"./Autocomplete.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export autocomplete specific types */\nexport type * from \"./props\";\n\n/** export autocomplete plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Autocomplete);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export autocomplete components */\nexport { Autocomplete as OAutocomplete };\n","<script setup lang=\"ts\">\nimport { computed, useTemplateRef } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderParent,\n    useIndexer,\n} from \"@/composables\";\n\nimport type { BreadcrumbProps } from \"./props\";\n\n/**\n * The classic breadcrumb, in different colors, sizes, and states\n * @displayName Breadcrumb\n * @requires ./BreadcrumbItem.vue\n * @style _breadcrumb.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OBreadcrumb\",\n    configField: \"breadcrumb\",\n});\n\nconst props = withDefaults(defineProps<BreadcrumbProps>(), {\n    override: undefined,\n    options: undefined,\n    size: () => getDefault(\"breadcrumb.size\"),\n    variant: () => getDefault(\"breadcrumb.variant\"),\n    position: () => getDefault(\"breadcrumb.position\"),\n    separator: () => getDefault(\"breadcrumb.separator\", \"/\"),\n    ariaLabel: () => getDefault(\"modal.ariaLabel\", \"Breadcrumb\"),\n});\n\ndefineSlots<{\n    /** Place breadcrumb items here  */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n/** provide functionalities and data to child item components */\nuseProviderParent({ rootRef });\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\nconst customStyle = computed(() => ({ \"--seperator\": `'${props.separator}'` }));\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-breadcrumb\"],\n    [\n        \"sizeClass\",\n        \"o-breadcrumb--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-breadcrumb--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"positionClass\",\n        \"o-breadcrumb--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n);\n\nconst listClasses = defineClasses([\"listClass\", \"o-breadcrumb__list\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <nav\n        ref=\"rootElement\"\n        data-oruga=\"breadcrumb\"\n        :class=\"rootClasses\"\n        :style=\"customStyle\"\n        :aria-label=\"ariaLabel\">\n        <ol :class=\"listClasses\">\n            <slot>\n                <o-breadcrumb-item\n                    v-for=\"option in normalizedOptions\"\n                    :key=\"option.key\"\n                    v-bind=\"option.item\" />\n            </slot>\n        </ol>\n    </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useTemplateRef } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderParent,\n    useIndexer,\n} from \"@/composables\";\n\nimport type { BreadcrumbProps } from \"./props\";\n\n/**\n * The classic breadcrumb, in different colors, sizes, and states\n * @displayName Breadcrumb\n * @requires ./BreadcrumbItem.vue\n * @style _breadcrumb.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OBreadcrumb\",\n    configField: \"breadcrumb\",\n});\n\nconst props = withDefaults(defineProps<BreadcrumbProps>(), {\n    override: undefined,\n    options: undefined,\n    size: () => getDefault(\"breadcrumb.size\"),\n    variant: () => getDefault(\"breadcrumb.variant\"),\n    position: () => getDefault(\"breadcrumb.position\"),\n    separator: () => getDefault(\"breadcrumb.separator\", \"/\"),\n    ariaLabel: () => getDefault(\"modal.ariaLabel\", \"Breadcrumb\"),\n});\n\ndefineSlots<{\n    /** Place breadcrumb items here  */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n/** provide functionalities and data to child item components */\nuseProviderParent({ rootRef });\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\nconst customStyle = computed(() => ({ \"--seperator\": `'${props.separator}'` }));\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-breadcrumb\"],\n    [\n        \"sizeClass\",\n        \"o-breadcrumb--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-breadcrumb--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"positionClass\",\n        \"o-breadcrumb--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n);\n\nconst listClasses = defineClasses([\"listClass\", \"o-breadcrumb__list\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <nav\n        ref=\"rootElement\"\n        data-oruga=\"breadcrumb\"\n        :class=\"rootClasses\"\n        :style=\"customStyle\"\n        :aria-label=\"ariaLabel\">\n        <ol :class=\"listClasses\">\n            <slot>\n                <o-breadcrumb-item\n                    v-for=\"option in normalizedOptions\"\n                    :key=\"option.key\"\n                    v-bind=\"option.item\" />\n            </slot>\n        </ol>\n    </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useTemplateRef } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { BreadcrumbItemProps } from \"./props\";\n\n/**\n * The classic breadrcumb item, in different colors, sizes, and states\n * @displayName Breadcrumb Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OBreadcrumbItem\",\n    configField: \"breadcrumb\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<BreadcrumbItemProps>(), {\n    override: undefined,\n    label: undefined,\n    active: false,\n    disabled: false,\n    hidden: false,\n    iconLeft: undefined,\n    iconRight: undefined,\n    iconPack: () => getDefault(\"breadcrumb.iconPack\"),\n    iconSize: () => getDefault(\"breadcrumb.iconSize\"),\n    tag: () => getDefault(\"breadcrumb.tag\", \"a\"),\n});\n\ndefineSlots<{\n    /** Item seperator */\n    seperator?(): void;\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n/** inject functionalities and data from the parent component */\nconst { item } = useProviderChild(rootRef);\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"itemClass\", \"o-breadcrumb__item\"],\n    [\n        \"disabledClass\",\n        \"o-breadcrumb__item--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"activeClass\",\n        \"o-breadcrumb__item--active\",\n        null,\n        computed(() => props.active),\n    ],\n);\n\nconst linkClasses = defineClasses([\"linkClass\", \"o-breadcrumb__item__link\"]);\n\nconst iconLeftClasses = defineClasses(\n    [\"iconClass\", \"o-breadcrumb__item__icon\"],\n    [\"iconLeftClass\", \"o-breadcrumb__item__icon--left\"],\n);\n\nconst iconRightClasses = defineClasses(\n    [\"iconClass\", \"o-breadcrumb__item__icon\"],\n    [\"iconRightClass\", \"o-breadcrumb__item__icon--right\"],\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <li\n        v-show=\"!hidden\"\n        ref=\"rootElement\"\n        data-oruga=\"breadcrumb-item\"\n        :data-id=\"`breadcrumb-${item.identifier}`\"\n        :class=\"rootClasses\"\n        :aria-current=\"active ? 'page' : undefined\">\n        <slot name=\"seperator\" />\n\n        <component\n            :is=\"tag\"\n            v-bind=\"$attrs\"\n            :class=\"linkClasses\"\n            :disabled=\"disabled\"\n            :active=\"active\"\n            :aria-current=\"active ? 'page' : undefined\">\n            <o-icon\n                v-if=\"iconLeft\"\n                :icon=\"iconLeft\"\n                :pack=\"iconPack\"\n                :size=\"iconSize\"\n                :class=\"iconLeftClasses\" />\n\n            <!--\n                @slot Override label\n            -->\n            <slot>\n                <span>{{ label }}</span>\n            </slot>\n\n            <o-icon\n                v-if=\"iconRight\"\n                :icon=\"iconRight\"\n                :pack=\"iconPack\"\n                :size=\"iconSize\"\n                :class=\"iconRightClasses\" />\n        </component>\n    </li>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useTemplateRef } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { BreadcrumbItemProps } from \"./props\";\n\n/**\n * The classic breadrcumb item, in different colors, sizes, and states\n * @displayName Breadcrumb Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OBreadcrumbItem\",\n    configField: \"breadcrumb\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<BreadcrumbItemProps>(), {\n    override: undefined,\n    label: undefined,\n    active: false,\n    disabled: false,\n    hidden: false,\n    iconLeft: undefined,\n    iconRight: undefined,\n    iconPack: () => getDefault(\"breadcrumb.iconPack\"),\n    iconSize: () => getDefault(\"breadcrumb.iconSize\"),\n    tag: () => getDefault(\"breadcrumb.tag\", \"a\"),\n});\n\ndefineSlots<{\n    /** Item seperator */\n    seperator?(): void;\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n/** inject functionalities and data from the parent component */\nconst { item } = useProviderChild(rootRef);\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"itemClass\", \"o-breadcrumb__item\"],\n    [\n        \"disabledClass\",\n        \"o-breadcrumb__item--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"activeClass\",\n        \"o-breadcrumb__item--active\",\n        null,\n        computed(() => props.active),\n    ],\n);\n\nconst linkClasses = defineClasses([\"linkClass\", \"o-breadcrumb__item__link\"]);\n\nconst iconLeftClasses = defineClasses(\n    [\"iconClass\", \"o-breadcrumb__item__icon\"],\n    [\"iconLeftClass\", \"o-breadcrumb__item__icon--left\"],\n);\n\nconst iconRightClasses = defineClasses(\n    [\"iconClass\", \"o-breadcrumb__item__icon\"],\n    [\"iconRightClass\", \"o-breadcrumb__item__icon--right\"],\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <li\n        v-show=\"!hidden\"\n        ref=\"rootElement\"\n        data-oruga=\"breadcrumb-item\"\n        :data-id=\"`breadcrumb-${item.identifier}`\"\n        :class=\"rootClasses\"\n        :aria-current=\"active ? 'page' : undefined\">\n        <slot name=\"seperator\" />\n\n        <component\n            :is=\"tag\"\n            v-bind=\"$attrs\"\n            :class=\"linkClasses\"\n            :disabled=\"disabled\"\n            :active=\"active\"\n            :aria-current=\"active ? 'page' : undefined\">\n            <o-icon\n                v-if=\"iconLeft\"\n                :icon=\"iconLeft\"\n                :pack=\"iconPack\"\n                :size=\"iconSize\"\n                :class=\"iconLeftClasses\" />\n\n            <!--\n                @slot Override label\n            -->\n            <slot>\n                <span>{{ label }}</span>\n            </slot>\n\n            <o-icon\n                v-if=\"iconRight\"\n                :icon=\"iconRight\"\n                :pack=\"iconPack\"\n                :size=\"iconSize\"\n                :class=\"iconRightClasses\" />\n        </component>\n    </li>\n</template>\n","import type { App } from \"vue\";\n\nimport Breadcrumb from \"./Breadcrumb.vue\";\nimport BreadcrumbItem from \"./BreadcrumbItem.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export breadcrumb specific types */\nexport type * from \"./props\";\n\n/** export breadcrumb plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Breadcrumb);\n        registerComponent(app, BreadcrumbItem);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export Breadcrumb components */\nexport { Breadcrumb as OBreadcrumb, BreadcrumbItem as OBreadcrumbItem };\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { ButtonProps } from \"./props\";\n\n/**\n * The classic button, in different colors, sizes, and states.\n * @displayName Button\n * @style _button.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OButton\",\n    configField: \"button\",\n});\n\nconst props = withDefaults(defineProps<ButtonProps>(), {\n    override: undefined,\n    tag: () => getDefault(\"button.tag\", \"button\"),\n    variant: () => getDefault(\"button.variant\"),\n    size: () => getDefault(\"button.size\"),\n    label: undefined,\n    rounded: () => getDefault(\"button.rounded\", false),\n    expanded: false,\n    disabled: false,\n    outlined: false,\n    loading: false,\n    inverted: false,\n    type: \"button\",\n    iconPack: () => getDefault(\"button.iconPack\"),\n    iconLeft: undefined,\n    iconRight: undefined,\n});\n\ndefineEmits<{\n    /**\n     * button click event\n     * @param event {Event} - native event\n     */\n    click: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst computedNativeType = computed(() =>\n    props.tag === \"button\" || props.tag === \"input\" ? props.type : null,\n);\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-button\"],\n    [\n        \"sizeClass\",\n        \"o-button--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-button--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"outlinedClass\",\n        \"o-button--outlined\",\n        null,\n        computed(() => props.outlined),\n    ],\n    [\n        \"invertedClass\",\n        \"o-button--inverted\",\n        null,\n        computed(() => props.inverted),\n    ],\n    [\n        \"expandedClass\",\n        \"o-button--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    [\"loadingClass\", \"o-button--loading\", null, computed(() => props.loading)],\n    [\"roundedClass\", \"o-button--rounded\", null, computed(() => props.rounded)],\n    [\n        \"disabledClass\",\n        \"o-button--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n);\n\nconst wrapperClasses = defineClasses([\"wrapperClass\", \"o-button__wrapper\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-button__label\"]);\n\nconst iconClasses = defineClasses([\"iconClass\", \"o-button__icon\"]);\n\nconst iconLeftClasses = defineClasses([\"iconLeftClass\", \"o-button__icon-left\"]);\n\nconst iconRightClasses = defineClasses([\n    \"iconRightClass\",\n    \"o-button__icon-right\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <component\n        :is=\"tag\"\n        data-oruga=\"button\"\n        :type=\"computedNativeType\"\n        role=\"button\"\n        tabindex=\"0\"\n        :class=\"rootClasses\"\n        :disabled=\"disabled ? true : null\"\n        :aria-disabled=\"disabled ? true : null\"\n        @click=\"$emit('click', $event)\"\n        @keydown.enter.prevent=\"$emit('click', $event)\"\n        @keydown.space.prevent=\"$emit('click', $event)\">\n        <span :class=\"wrapperClasses\">\n            <o-icon\n                v-if=\"iconLeft\"\n                :pack=\"iconPack\"\n                :icon=\"iconLeft\"\n                :size=\"size\"\n                :class=\"[...iconClasses, ...iconLeftClasses]\" />\n\n            <span v-if=\"label || $slots.default\" :class=\"labelClasses\">\n                <slot>{{ label }}</slot>\n            </span>\n\n            <o-icon\n                v-if=\"iconRight\"\n                :pack=\"iconPack\"\n                :icon=\"iconRight\"\n                :size=\"size\"\n                :class=\"[...iconClasses, ...iconRightClasses]\" />\n        </span>\n    </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { ButtonProps } from \"./props\";\n\n/**\n * The classic button, in different colors, sizes, and states.\n * @displayName Button\n * @style _button.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OButton\",\n    configField: \"button\",\n});\n\nconst props = withDefaults(defineProps<ButtonProps>(), {\n    override: undefined,\n    tag: () => getDefault(\"button.tag\", \"button\"),\n    variant: () => getDefault(\"button.variant\"),\n    size: () => getDefault(\"button.size\"),\n    label: undefined,\n    rounded: () => getDefault(\"button.rounded\", false),\n    expanded: false,\n    disabled: false,\n    outlined: false,\n    loading: false,\n    inverted: false,\n    type: \"button\",\n    iconPack: () => getDefault(\"button.iconPack\"),\n    iconLeft: undefined,\n    iconRight: undefined,\n});\n\ndefineEmits<{\n    /**\n     * button click event\n     * @param event {Event} - native event\n     */\n    click: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst computedNativeType = computed(() =>\n    props.tag === \"button\" || props.tag === \"input\" ? props.type : null,\n);\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-button\"],\n    [\n        \"sizeClass\",\n        \"o-button--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-button--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"outlinedClass\",\n        \"o-button--outlined\",\n        null,\n        computed(() => props.outlined),\n    ],\n    [\n        \"invertedClass\",\n        \"o-button--inverted\",\n        null,\n        computed(() => props.inverted),\n    ],\n    [\n        \"expandedClass\",\n        \"o-button--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    [\"loadingClass\", \"o-button--loading\", null, computed(() => props.loading)],\n    [\"roundedClass\", \"o-button--rounded\", null, computed(() => props.rounded)],\n    [\n        \"disabledClass\",\n        \"o-button--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n);\n\nconst wrapperClasses = defineClasses([\"wrapperClass\", \"o-button__wrapper\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-button__label\"]);\n\nconst iconClasses = defineClasses([\"iconClass\", \"o-button__icon\"]);\n\nconst iconLeftClasses = defineClasses([\"iconLeftClass\", \"o-button__icon-left\"]);\n\nconst iconRightClasses = defineClasses([\n    \"iconRightClass\",\n    \"o-button__icon-right\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <component\n        :is=\"tag\"\n        data-oruga=\"button\"\n        :type=\"computedNativeType\"\n        role=\"button\"\n        tabindex=\"0\"\n        :class=\"rootClasses\"\n        :disabled=\"disabled ? true : null\"\n        :aria-disabled=\"disabled ? true : null\"\n        @click=\"$emit('click', $event)\"\n        @keydown.enter.prevent=\"$emit('click', $event)\"\n        @keydown.space.prevent=\"$emit('click', $event)\">\n        <span :class=\"wrapperClasses\">\n            <o-icon\n                v-if=\"iconLeft\"\n                :pack=\"iconPack\"\n                :icon=\"iconLeft\"\n                :size=\"size\"\n                :class=\"[...iconClasses, ...iconLeftClasses]\" />\n\n            <span v-if=\"label || $slots.default\" :class=\"labelClasses\">\n                <slot>{{ label }}</slot>\n            </span>\n\n            <o-icon\n                v-if=\"iconRight\"\n                :pack=\"iconPack\"\n                :icon=\"iconRight\"\n                :size=\"size\"\n                :class=\"[...iconClasses, ...iconRightClasses]\" />\n        </span>\n    </component>\n</template>\n","import type { App } from \"vue\";\n\nimport Button from \"./Button.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export button specific types */\nexport type * from \"./props\";\n\n/** export button plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Button);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export button components */\nexport { Button as OButton };\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, useTemplateRef } from \"vue\";\n\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { CarouselComponent, CarouselItemComponent } from \"./types\";\nimport type { CarouselItemProps } from \"./props\";\n\n/**\n * A Slideshow item used by the carousel.\n * @displayName Carousel Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OCarouselItem\",\n    configField: \"carousel\",\n});\n\nconst props = withDefaults(defineProps<CarouselItemProps<T>>(), {\n    override: undefined,\n    value: undefined,\n    clickable: false,\n    title: undefined,\n    subtitle: undefined,\n    image: undefined,\n    imageAlt: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * onclick event\n     * @param value {unknown} - value prop data\n     * @param event {event} - native event\n     */\n    click: [value: T, event: Event];\n    /** on tab item activate event */\n    activate: [];\n    /** on tab item deactivate event */\n    deactivate: [];\n}>();\n\ndefineSlots<{\n    /** Override the item content */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<CarouselItemComponent<T>>(() => ({\n    getValue,\n    activate,\n    deactivate,\n}));\n\n/** inject functionalities and data from the parent component */\nconst { parent, item, itemsCount } = useProviderChild<\n    CarouselComponent<T>,\n    CarouselItemComponent<T>\n>(rootRef, { data: providedData });\n\nconst isActive = computed(() => item.value.index === parent.value.activeIndex);\n\nconst itemStyle = computed(() => ({ width: `${parent.value.itemWidth}px` }));\n\n/** Return the item value or the item index if no value is set. */\nfunction getValue(): T {\n    return (props.value ?? item.value.index) as T;\n}\n\n/** Click listener, select the item. */\nfunction onClick(event: Event): void {\n    if (!props.clickable) return;\n    if (isActive.value) parent.value.onClick(event);\n    const value = getValue();\n    parent.value.setActive(value);\n    emits(\"click\", value, event);\n}\n\n/** Activate element. */\nfunction activate(): void {\n    emits(\"activate\");\n}\n\n/** Deactivate element. */\nfunction deactivate(): void {\n    emits(\"deactivate\");\n}\n\n// #region --- Computed Component Classes ---\n\nconst itemClasses = defineClasses(\n    [\"itemClass\", \"o-carousel__item\"],\n    [\"itemActiveClass\", \"o-carousel__item--active\", null, isActive],\n    [\n        \"itemClickableClass\",\n        \"o-carousel__item--clickable\",\n        null,\n        computed(() => props.clickable),\n    ],\n);\n\nconst titleClasses = defineClasses([\n    \"itemTitleClass\",\n    \"o-carousel__item-title\",\n]);\n\nconst subtitleClasses = defineClasses([\n    \"itemSubtitleClass\",\n    \"o-carousel__item-subtitle\",\n]);\nconst imageClasses = defineClasses([\n    \"itemImageClass\",\n    \"o-carousel__item-image\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div\n        :id=\"`carouselpanel-${item.identifier}`\"\n        ref=\"rootElement\"\n        data-oruga=\"carousel-item\"\n        :data-id=\"`carousel-${item.identifier}`\"\n        :class=\"itemClasses\"\n        :style=\"itemStyle\"\n        :role=\"parent.indicators ? 'tabpanel' : 'group'\"\n        :aria-labelledby=\"`carousel-${item.identifier}`\"\n        aria-roledescription=\"slide\"\n        :aria-label=\"`${item.index + 1} of ${itemsCount}`\"\n        draggable=\"true\"\n        @click=\"onClick\"\n        @keydown.enter=\"onClick\"\n        @keydown.space=\"onClick\"\n        @dragstart=\"parent.onDrag\"\n        @touchstart=\"parent.onDrag\">\n        <slot>\n            <div :class=\"imageClasses\">\n                <img :src=\"image\" :alt=\"imageAlt\" />\n            </div>\n\n            <div v-if=\"title\" :class=\"titleClasses\">\n                {{ title }}\n            </div>\n\n            <div v-if=\"subtitle\" :class=\"subtitleClasses\">\n                {{ subtitle }}\n            </div>\n        </slot>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, useTemplateRef } from \"vue\";\n\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { CarouselComponent, CarouselItemComponent } from \"./types\";\nimport type { CarouselItemProps } from \"./props\";\n\n/**\n * A Slideshow item used by the carousel.\n * @displayName Carousel Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OCarouselItem\",\n    configField: \"carousel\",\n});\n\nconst props = withDefaults(defineProps<CarouselItemProps<T>>(), {\n    override: undefined,\n    value: undefined,\n    clickable: false,\n    title: undefined,\n    subtitle: undefined,\n    image: undefined,\n    imageAlt: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * onclick event\n     * @param value {unknown} - value prop data\n     * @param event {event} - native event\n     */\n    click: [value: T, event: Event];\n    /** on tab item activate event */\n    activate: [];\n    /** on tab item deactivate event */\n    deactivate: [];\n}>();\n\ndefineSlots<{\n    /** Override the item content */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<CarouselItemComponent<T>>(() => ({\n    getValue,\n    activate,\n    deactivate,\n}));\n\n/** inject functionalities and data from the parent component */\nconst { parent, item, itemsCount } = useProviderChild<\n    CarouselComponent<T>,\n    CarouselItemComponent<T>\n>(rootRef, { data: providedData });\n\nconst isActive = computed(() => item.value.index === parent.value.activeIndex);\n\nconst itemStyle = computed(() => ({ width: `${parent.value.itemWidth}px` }));\n\n/** Return the item value or the item index if no value is set. */\nfunction getValue(): T {\n    return (props.value ?? item.value.index) as T;\n}\n\n/** Click listener, select the item. */\nfunction onClick(event: Event): void {\n    if (!props.clickable) return;\n    if (isActive.value) parent.value.onClick(event);\n    const value = getValue();\n    parent.value.setActive(value);\n    emits(\"click\", value, event);\n}\n\n/** Activate element. */\nfunction activate(): void {\n    emits(\"activate\");\n}\n\n/** Deactivate element. */\nfunction deactivate(): void {\n    emits(\"deactivate\");\n}\n\n// #region --- Computed Component Classes ---\n\nconst itemClasses = defineClasses(\n    [\"itemClass\", \"o-carousel__item\"],\n    [\"itemActiveClass\", \"o-carousel__item--active\", null, isActive],\n    [\n        \"itemClickableClass\",\n        \"o-carousel__item--clickable\",\n        null,\n        computed(() => props.clickable),\n    ],\n);\n\nconst titleClasses = defineClasses([\n    \"itemTitleClass\",\n    \"o-carousel__item-title\",\n]);\n\nconst subtitleClasses = defineClasses([\n    \"itemSubtitleClass\",\n    \"o-carousel__item-subtitle\",\n]);\nconst imageClasses = defineClasses([\n    \"itemImageClass\",\n    \"o-carousel__item-image\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div\n        :id=\"`carouselpanel-${item.identifier}`\"\n        ref=\"rootElement\"\n        data-oruga=\"carousel-item\"\n        :data-id=\"`carousel-${item.identifier}`\"\n        :class=\"itemClasses\"\n        :style=\"itemStyle\"\n        :role=\"parent.indicators ? 'tabpanel' : 'group'\"\n        :aria-labelledby=\"`carousel-${item.identifier}`\"\n        aria-roledescription=\"slide\"\n        :aria-label=\"`${item.index + 1} of ${itemsCount}`\"\n        draggable=\"true\"\n        @click=\"onClick\"\n        @keydown.enter=\"onClick\"\n        @keydown.space=\"onClick\"\n        @dragstart=\"parent.onDrag\"\n        @touchstart=\"parent.onDrag\">\n        <slot>\n            <div :class=\"imageClasses\">\n                <img :src=\"image\" :alt=\"imageAlt\" />\n            </div>\n\n            <div v-if=\"title\" :class=\"titleClasses\">\n                {{ title }}\n            </div>\n\n            <div v-if=\"subtitle\" :class=\"subtitleClasses\">\n                {{ subtitle }}\n            </div>\n        </slot>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport {\n    computed,\n    watch,\n    onBeforeUnmount,\n    onMounted,\n    ref,\n    nextTick,\n    readonly,\n    toRaw,\n    useTemplateRef,\n    triggerRef,\n    watchEffect,\n    onUnmounted,\n} from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport OCarouselItem from \"./CarouselItem.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { sign, mod, bound, isDefined } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useIndexer,\n    useProviderParent,\n    type ProviderItem,\n} from \"@/composables\";\n\nimport type { ClassBinding } from \"@/types\";\nimport type {\n    CarouselItemComponent,\n    CarouselComponent,\n    CarouselItem,\n} from \"./types\";\nimport type { CarouselProps } from \"./props\";\n\n/**\n * A Slideshow for cycling images in confined spaces.\n * @displayName Carousel\n * @requires ./CarouselItem.vue\n * @style _carousel.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OCarousel\",\n    configField: \"carousel\",\n});\n\ntype ModelValue = CarouselProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<CarouselProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    options: undefined,\n    dragable: true,\n    autoplay: false,\n    interval: () => getDefault(\"carousel.interval\", 3500),\n    pauseHover: false,\n    repeat: false,\n    overlay: false,\n    indicators: true,\n    indicatorInside: false,\n    indicatorPosition: () => getDefault(\"carousel.indicatorPosition\", \"bottom\"),\n    indicatorStyle: () => getDefault(\"carousel.indicatorStyle\", \"dots\"),\n    itemsToShow: () => getDefault(\"carousel.itemsToShow\", 1),\n    itemsToList: () => getDefault(\"carousel.itemsToList\", 1),\n    arrows: () => getDefault(\"carousel.arrows\", true),\n    arrowsHover: () => getDefault(\"carousel.arrowsHover\", true),\n    iconPack: () => getDefault(\"carousel.iconPack\"),\n    iconSize: () => getDefault(\"carousel.iconSize\"),\n    iconPrev: () => getDefault(\"carousel.iconPrev\", \"chevron-left\"),\n    iconNext: () => getDefault(\"carousel.iconNext\", \"chevron-right\"),\n    iconAutoplayPause: () => getDefault(\"carousel.iconAutoplayPause\", \"pause\"),\n    iconAutoplayResume: () => getDefault(\"carousel.iconAutoplayResume\", \"play\"),\n    breakpoints: undefined,\n    ariaAutoplayPauseLabel: () =>\n        getDefault(\n            \"carousel.ariaAutoplayPauseLabel\",\n            \"Stop Automatic Slide Show\",\n        ),\n    ariaAutoplayResumeLabel: () =>\n        getDefault(\n            \"carousel.ariaAutoplayResumeLabel\",\n            \"Start Automatic Slide Show\",\n        ),\n    ariaNextLabel: () => getDefault(\"carousel.ariaNextLabel\", \"Next Slide\"),\n    ariaPreviousLabel: () =>\n        getDefault(\"carousel.ariaPreviousLabel\", \"Previous Slide\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {number} - updated modelValue prop\n     */\n    \"update:model-value\": [value: number];\n    /**\n     * on carousel slide change event\n     * @param value {unknown} - new tab value\n     * @param value {unknown} - old tab value\n     */\n    change: [newValue: ModelValue, oldValue: ModelValue];\n    /**\n     * on item click event\n     * @param event {event} - native event\n     */\n    click: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Define the carousel items here */\n    default?(): void;\n    /**\n     * Override the pause/resume button\n     * @param autoplay {boolean} - if autoplay is active\n     * @param toggle {(): void} - toggle autoplay\n     */\n    pause?(props: { autoplay: boolean; toggle: () => void }): void;\n    /**\n     * Override the arrows\n     * @param hasPrev {boolean} - has prev arrow button\n     * @param hasNext {boolean} - has next arrow button\n     * @param prev {(): void} - switch to prev item function\n     * @param next {(): void} - switch to next item function\n     */\n    arrows?(props: {\n        hasPrev: boolean;\n        hasNext: boolean;\n        prev: () => void;\n        next: () => void;\n    }): void;\n    /**\n     * Override the indicators\n     * @param activeIndex {number} - active item index\n     * @param switchTo {(idx?: number): void} - switch to item function\n     */\n    indicators?(props: {\n        activeIndex: number;\n        switchTo: (idx?: number) => void;\n    }): void;\n    /**\n     * Override the indicator elements\n     * @param index {number} - indicator index\n     */\n    indicator?(props: { index: number }): void;\n    /** Define element to show when overlay is active */\n    overlay?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<CarouselComponent<T>>(() => ({\n    activeIndex: activeItem.value?.index ?? 0,\n    indicators: props.indicators,\n    itemWidth: itemWidth.value,\n    onDrag: onDragStart,\n    onClick: (event: Event): void => emits(\"click\", event),\n    setActive,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems, itemsCount } = useProviderParent<CarouselItemComponent<T>>({\n    rootRef,\n    data: provideData,\n});\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\nconst indicatorItems = computed(() =>\n    childItems.value.filter(\n        (el, i) => mod(i, settings.value.itemsToList) === 0,\n    ),\n);\n\nconst resizeObserver =\n    isClient && window.ResizeObserver\n        ? new window.ResizeObserver(onRefresh)\n        : undefined;\n\nconst windowWidth = ref(0);\n\nonMounted(() => {\n    if (!isClient) return;\n    // start resize observing\n    if (window.ResizeObserver && resizeObserver && rootRef.value)\n        resizeObserver.observe(rootRef.value);\n\n    // set HTML element with\n    windowWidth.value = window.innerWidth;\n\n    // a prefers-reduced-motion user setting must always override autoplay\n    const hasReducedMotion = window.matchMedia(\n        \"(prefers-reduced-motion: reduce)\",\n    );\n\n    // start timer when autoplay is enabled\n    if (!hasReducedMotion?.matches) startTimer();\n});\n\nonBeforeUnmount(() => {\n    if (!isClient) return;\n    // cleanup resize observer\n    if (window.ResizeObserver && resizeObserver) resizeObserver.disconnect();\n\n    // cleanup drag event\n    onDragEnd();\n    // cleanup timer\n    pauseTimer();\n});\n\nconst settings = computed<typeof props>(() => {\n    let settings;\n\n    if (!props.breakpoints) settings = toRaw(props);\n    else {\n        const breakpoints = Object.keys(props.breakpoints)\n            .map(Number)\n            .sort((a, b) => b - a);\n\n        const breakpoint = breakpoints.find(\n            (breakpoint) => windowWidth.value >= breakpoint,\n        );\n\n        settings = toRaw(\n            breakpoint ? { ...props, ...props.breakpoints[breakpoint] } : props,\n        );\n    }\n\n    // prevent empty values\n    if (!settings.itemsToList) settings.itemsToList = 1;\n    if (!settings.itemsToShow) settings.itemsToShow = 1;\n    return readonly(settings);\n});\n\nconst itemWidth = computed(() => {\n    // Ensure component is mounted\n    if (!windowWidth.value || !rootRef.value) return 0;\n\n    const rect = rootRef.value.getBoundingClientRect();\n    return rect.width / settings.value.itemsToShow;\n});\n\n/** watch specific props which need to refresh the component */\nwatch(\n    [\n        () => props.itemsToList,\n        () => props.itemsToShow,\n        () => props.arrowsHover,\n        () => props.repeat,\n    ],\n    () => onRefresh(),\n);\n\nfunction onRefresh(): void {\n    vmodel.value = childItems.value[0]?.data.getValue();\n    // set HTML element with\n    windowWidth.value = window.innerWidth;\n    // trigger re creation of settings based on props\n    nextTick(() => triggerRef(settings));\n}\n\n// #region --- Active Item Feature ---\n\n/** The selected item value or index, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nconst activeItem = ref<CarouselItem<T>>();\n\nonMounted(() => {\n    // set first tab as default if not defined\n    if (!vmodel.value) vmodel.value = childItems.value[0]?.data.getValue();\n});\n\n/** When v-model is changed set the new active tab. */\nwatch(\n    () => props.modelValue,\n    (value) => {\n        if (vmodel.value !== value) activateItem(value);\n    },\n);\n\n// set the active item immediate and every time the vmodel changes\nwatchEffect(() => {\n    activeItem.value = isDefined(vmodel.value)\n        ? childItems.value.find(\n              (item) => vmodel.value === item.data.getValue(),\n          ) || childItems.value[0]\n        : childItems.value[0];\n});\n\nfunction setActive(value: T): void {\n    if (vmodel.value === value) return;\n    activateItem(value);\n}\n\n/** Activate a specific child item by value and deactivate the previous child item. */\nfunction activateItem(newValue: ModelValue): void {\n    const oldValue = activeItem.value?.data.getValue();\n    const oldItem = activeItem.value;\n    const newItem =\n        childItems.value.find((item) => newValue === item.data.getValue()) ||\n        childItems.value[0];\n\n    if (oldItem && newItem) {\n        oldItem.data.deactivate(newItem.index);\n        newItem.data.activate(oldItem.index);\n    }\n\n    nextTick(() => {\n        vmodel.value = newValue;\n        emits(\"change\", newValue, oldValue);\n    });\n}\n\n// #endregion --- Active Item Feature ---\n\n// #region --- Switch Item Events ---\n\n/**\n * Show the slide by index.\n * @param index the real index of the slide\n */\nfunction switchTo(index: number = 0): void {\n    if (settings.value.repeat) index = mod(index, itemsCount.value);\n    index = bound(index, 0, itemsCount.value - 1);\n\n    const item = childItems.value[index];\n    activateItem(item?.data.getValue());\n}\n\nconst hasArrows = computed(\n    () =>\n        (settings.value.arrowsHover && isHovered.value) ||\n        !settings.value.arrowsHover,\n);\n\nconst hasPrev = computed(\n    () => settings.value.repeat || (activeItem.value?.index ?? 0) > 0,\n);\n\nfunction onPrev(): void {\n    switchTo((activeItem.value?.index ?? 0) - settings.value.itemsToList);\n}\n\nconst hasNext = computed(\n    () =>\n        settings.value.repeat ||\n        (activeItem.value?.index ?? 0) <\n            itemsCount.value - settings.value.itemsToList,\n);\n\nfunction onNext(): void {\n    switchTo((activeItem.value?.index ?? 0) + settings.value.itemsToList);\n}\n\n/** Go to the first viable item */\nfunction onHomePressed(): void {\n    switchTo(0);\n}\n\n/** Go to the last viable item */\nfunction onEndPressed(): void {\n    switchTo(itemsCount.value - settings.value.itemsToList);\n}\n\n/** Set focus on a tab item. */\nfunction onChange(item: ProviderItem): void {\n    switchTo(item.index);\n}\n\n// #endregion --- Switch Item Events ---\n\n// #region --- Drag & Drop | Slide Feature ---\n\nconst dragX = ref<number>();\nconst delta = ref<number>(0);\n\nconst isDragging = computed(() => isDefined(dragX.value));\n\n/** slide transform:translateX translation */\nconst translation = computed(\n    () =>\n        -bound(\n            delta.value + (activeItem.value?.index ?? 0) * itemWidth.value,\n            0,\n            (childItems.value.length - settings.value.itemsToShow) *\n                itemWidth.value,\n        ),\n);\n\n/** handle drag event */\nfunction onDragStart(event: TouchEvent | MouseEvent): void {\n    if (\n        isDragging.value ||\n        !settings.value.dragable ||\n        ((event as MouseEvent).button !== 0 && event.type !== \"touchstart\")\n    )\n        return;\n\n    delta.value = 0;\n    // get dragging start x value\n    dragX.value = (event as TouchEvent).touches\n        ? (event as TouchEvent).touches[0]?.clientX\n        : (event as MouseEvent).clientX;\n\n    // stop timer when dragging starts\n    pauseTimer();\n}\n\nfunction onDragOver(event: TouchEvent | MouseEvent): void {\n    if (!isDragging.value) return;\n\n    const dragEndX =\n        ((event as TouchEvent).touches\n            ? (event as TouchEvent).changedTouches[0] ||\n              (event as TouchEvent).touches[0]\n            : (event as MouseEvent)\n        ).clientX ?? 0;\n    // calc transition delta value\n    delta.value = (dragX.value ?? 0) - dragEndX;\n}\n\nfunction onDragEnd(): void {\n    if (!isDragging.value) return;\n    // switch slide\n    const signCheck = sign(delta.value);\n    const results = Math.round(Math.abs(delta.value / itemWidth.value) + 0.15); // Hack\n    switchTo((activeItem.value?.index ?? 0) + signCheck * results);\n\n    // cleanup\n    delta.value = 0;\n    dragX.value = undefined;\n\n    // atart timer after dragging ends\n    startTimer();\n}\n\n// #endregion --- Drag & Drop | Slide Feature ---\n\n// #region --- Autoplay Feature ---\n\nlet autoplayInterval: ReturnType<typeof setInterval> | undefined;\n\nonUnmounted(() => {\n    clearInterval(autoplayInterval);\n    autoplayInterval = undefined;\n});\n\n/** deactive autoplay feature */\nconst isAutoplayPaused = ref(false);\n\nconst isHovered = ref(false);\n\nfunction onHoverEnter(): void {\n    isHovered.value = true;\n}\n\nfunction onHoverLeave(): void {\n    isHovered.value = false;\n}\n\n/** Start/Stop timer when carousel get hovered */\nwatch(isHovered, (value) => {\n    if (!props.autoplay || !props.pauseHover) return;\n    if (value) pauseTimer();\n    else startTimer();\n});\n\n/** When autoplay is changed, start or pause timer accordingly */\nwatch(\n    () => props.autoplay,\n    (status) => {\n        if (status) startTimer();\n        else pauseTimer();\n    },\n);\n\n/** Since the timer can get paused at the end, if repeat is changed we need to restart it */\nwatch(\n    () => props.repeat,\n    (status) => {\n        if (status) startTimer();\n    },\n);\n\nfunction onToggleAutoplay(): void {\n    if (!isAutoplayPaused.value) {\n        isAutoplayPaused.value = true;\n        pauseTimer();\n    } else {\n        isAutoplayPaused.value = false;\n        startTimer();\n    }\n}\n\nfunction startTimer(): void {\n    if (!props.autoplay || autoplayInterval) return;\n    if (isAutoplayPaused.value) return;\n    autoplayInterval = setInterval(() => {\n        if (!props.repeat && !hasNext.value) pauseTimer();\n        else onNext();\n    }, props.interval);\n}\n\nfunction pauseTimer(): void {\n    if (!autoplayInterval) return;\n    clearInterval(autoplayInterval);\n    autoplayInterval = undefined;\n}\n\n// #endregion --- Autoplay Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-carousel\"],\n    [\n        \"overlayClass\",\n        \"o-carousel__overlay\",\n        null,\n        computed(() => props.overlay),\n    ],\n);\n\nconst wrapperClasses = defineClasses([\"wrapperClass\", \"o-carousel__wrapper\"]);\n\nconst itemsClasses = defineClasses(\n    [\"itemsClass\", \"o-carousel__items\"],\n    [\"itemsDraggingClass\", \"o-carousel__items--dragging\", null, isDragging],\n);\n\nconst prevIconClasses = defineClasses(\n    [\"iconClass\", \"o-carousel__icon\"],\n    [\"iconPrevClass\", \"o-carousel__icon-prev\"],\n);\n\nconst nextIconClasses = defineClasses(\n    [\"iconClass\", \"o-carousel__icon\"],\n    [\"iconNextClass\", \"o-carousel__icon-next\"],\n);\n\nconst autoplayIconClasses = defineClasses(\n    [\"iconClass\", \"o-carousel__icon\"],\n    [\"iconAutoplayClass\", \"o-carousel__icon-autoplay\"],\n);\n\nconst indicatorsClasses = defineClasses(\n    [\"indicatorsClass\", \"o-carousel__indicators\"],\n    [\n        \"indicatorsInsideClass\",\n        \"o-carousel__indicators--inside\",\n        null,\n        computed(() => !!props.indicatorInside),\n    ],\n    [\n        \"indicatorsPositionClass\",\n        \"o-carousel__indicators--\",\n        computed(() => props.indicatorPosition),\n        computed(() => !!props.indicatorPosition),\n    ],\n);\n\nconst indicatorClasses = defineClasses([\n    \"indicatorClass\",\n    \"o-carousel__indicator\",\n]);\n\nconst indicatorItemClasses = defineClasses(\n    [\"indicatorItemClass\", \"o-carousel__indicator__item\"],\n    [\n        \"indicatorItemStyleClass\",\n        \"o-carousel__indicator__item--\",\n        computed(() => props.indicatorStyle),\n        computed(() => !!props.indicatorStyle),\n    ],\n);\n\nconst indicatorItemActiveClasses = defineClasses([\n    \"indicatorItemActiveClass\",\n    \"o-carousel__indicator__item--active\",\n]);\n\nfunction indicatorItemAppliedClasses(item: ProviderItem): ClassBinding[] {\n    const activeClasses =\n        item.identifier === activeItem.value?.identifier\n            ? indicatorItemActiveClasses.value\n            : [];\n\n    return [...indicatorItemClasses.value, ...activeClasses];\n}\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div\n        ref=\"rootElement\"\n        data-oruga=\"carousel\"\n        :class=\"rootClasses\"\n        role=\"region\"\n        aria-roledescription=\"carousel\"\n        @mouseenter=\"onHoverEnter\"\n        @mouseleave=\"onHoverLeave\"\n        @focusin=\"onHoverEnter\"\n        @focusout=\"onHoverLeave\"\n        @keydown.left.prevent=\"onPrev\"\n        @keydown.right.prevent=\"onNext\"\n        @keydown.home.prevent=\"onHomePressed\"\n        @keydown.end.prevent=\"onEndPressed\">\n        <div :class=\"wrapperClasses\">\n            <slot\n                name=\"pause\"\n                :autoplay=\"!isAutoplayPaused\"\n                :toggle=\"onToggleAutoplay\">\n                <template v-if=\"autoplay\">\n                    <o-icon\n                        :class=\"autoplayIconClasses\"\n                        :pack=\"iconPack\"\n                        :icon=\"\n                            !isAutoplayPaused\n                                ? iconAutoplayPause\n                                : iconAutoplayResume\n                        \"\n                        :size=\"iconSize\"\n                        clickable\n                        :aria-label=\"\n                            !isAutoplayPaused\n                                ? ariaAutoplayPauseLabel\n                                : ariaAutoplayResumeLabel\n                        \"\n                        @click=\"onToggleAutoplay\" />\n                </template>\n            </slot>\n\n            <slot\n                name=\"arrows\"\n                :has-prev=\"hasPrev\"\n                :prev=\"onPrev\"\n                :has-next=\"hasNext\"\n                :next=\"onNext\">\n                <template v-if=\"arrows\">\n                    <o-icon\n                        v-show=\"hasArrows && hasPrev\"\n                        :class=\"prevIconClasses\"\n                        :pack=\"iconPack\"\n                        :icon=\"iconPrev\"\n                        :size=\"iconSize\"\n                        clickable\n                        :aria-label=\"ariaPreviousLabel\"\n                        @click=\"onPrev\" />\n                    <o-icon\n                        v-show=\"hasArrows && hasNext\"\n                        :class=\"nextIconClasses\"\n                        :pack=\"iconPack\"\n                        :icon=\"iconNext\"\n                        :size=\"iconSize\"\n                        clickable\n                        :aria-label=\"ariaNextLabel\"\n                        @click=\"onNext\" />\n                </template>\n            </slot>\n\n            <div\n                :class=\"itemsClasses\"\n                :style=\"'transform:translateX(' + translation + 'px)'\"\n                aria-roledescription=\"carousel-slide\"\n                aria-atomic=\"false\"\n                :tabindex=\"indicators ? undefined : 0\"\n                :aria-live=\"autoplay ? 'off' : 'polite'\"\n                @dragend=\"onDragEnd\"\n                @dragover=\"onDragOver\"\n                @touchmove=\"onDragOver\"\n                @touchend=\"onDragEnd\">\n                <slot>\n                    <o-carousel-item\n                        v-for=\"option in normalizedOptions\"\n                        :key=\"option.key\"\n                        v-bind=\"option.item\" />\n                </slot>\n            </div>\n        </div>\n\n        <slot\n            name=\"indicators\"\n            :active-index=\"activeItem?.index ?? 0\"\n            :switch-to=\"switchTo\">\n            <div\n                v-if=\"indicators\"\n                :class=\"indicatorsClasses\"\n                role=\"tablist\"\n                aria-label=\"Slides\">\n                <div\n                    v-for=\"item in indicatorItems\"\n                    :id=\"`carousel-${item.identifier}`\"\n                    :key=\"item.index\"\n                    :class=\"indicatorClasses\"\n                    role=\"tab\"\n                    :tabindex=\"\n                        item.identifier === activeItem?.identifier ? '0' : '-1'\n                    \"\n                    :aria-label=\"`Slide ${item.identifier}`\"\n                    :aria-controls=\"`carouselpanel-${item.identifier}`\"\n                    :aria-selected=\"item.identifier === activeItem?.identifier\"\n                    @click=\"onChange(item)\"\n                    @keydown.enter=\"onChange(item)\"\n                    @keydown.space=\"onChange(item)\">\n                    <slot :index=\"item.index\" name=\"indicator\">\n                        <span :class=\"indicatorItemAppliedClasses(item)\" />\n                    </slot>\n                </div>\n            </div>\n        </slot>\n\n        <template v-if=\"overlay\">\n            <slot name=\"overlay\" />\n        </template>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport {\n    computed,\n    watch,\n    onBeforeUnmount,\n    onMounted,\n    ref,\n    nextTick,\n    readonly,\n    toRaw,\n    useTemplateRef,\n    triggerRef,\n    watchEffect,\n    onUnmounted,\n} from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport OCarouselItem from \"./CarouselItem.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { sign, mod, bound, isDefined } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useIndexer,\n    useProviderParent,\n    type ProviderItem,\n} from \"@/composables\";\n\nimport type { ClassBinding } from \"@/types\";\nimport type {\n    CarouselItemComponent,\n    CarouselComponent,\n    CarouselItem,\n} from \"./types\";\nimport type { CarouselProps } from \"./props\";\n\n/**\n * A Slideshow for cycling images in confined spaces.\n * @displayName Carousel\n * @requires ./CarouselItem.vue\n * @style _carousel.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OCarousel\",\n    configField: \"carousel\",\n});\n\ntype ModelValue = CarouselProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<CarouselProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    options: undefined,\n    dragable: true,\n    autoplay: false,\n    interval: () => getDefault(\"carousel.interval\", 3500),\n    pauseHover: false,\n    repeat: false,\n    overlay: false,\n    indicators: true,\n    indicatorInside: false,\n    indicatorPosition: () => getDefault(\"carousel.indicatorPosition\", \"bottom\"),\n    indicatorStyle: () => getDefault(\"carousel.indicatorStyle\", \"dots\"),\n    itemsToShow: () => getDefault(\"carousel.itemsToShow\", 1),\n    itemsToList: () => getDefault(\"carousel.itemsToList\", 1),\n    arrows: () => getDefault(\"carousel.arrows\", true),\n    arrowsHover: () => getDefault(\"carousel.arrowsHover\", true),\n    iconPack: () => getDefault(\"carousel.iconPack\"),\n    iconSize: () => getDefault(\"carousel.iconSize\"),\n    iconPrev: () => getDefault(\"carousel.iconPrev\", \"chevron-left\"),\n    iconNext: () => getDefault(\"carousel.iconNext\", \"chevron-right\"),\n    iconAutoplayPause: () => getDefault(\"carousel.iconAutoplayPause\", \"pause\"),\n    iconAutoplayResume: () => getDefault(\"carousel.iconAutoplayResume\", \"play\"),\n    breakpoints: undefined,\n    ariaAutoplayPauseLabel: () =>\n        getDefault(\n            \"carousel.ariaAutoplayPauseLabel\",\n            \"Stop Automatic Slide Show\",\n        ),\n    ariaAutoplayResumeLabel: () =>\n        getDefault(\n            \"carousel.ariaAutoplayResumeLabel\",\n            \"Start Automatic Slide Show\",\n        ),\n    ariaNextLabel: () => getDefault(\"carousel.ariaNextLabel\", \"Next Slide\"),\n    ariaPreviousLabel: () =>\n        getDefault(\"carousel.ariaPreviousLabel\", \"Previous Slide\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {number} - updated modelValue prop\n     */\n    \"update:model-value\": [value: number];\n    /**\n     * on carousel slide change event\n     * @param value {unknown} - new tab value\n     * @param value {unknown} - old tab value\n     */\n    change: [newValue: ModelValue, oldValue: ModelValue];\n    /**\n     * on item click event\n     * @param event {event} - native event\n     */\n    click: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Define the carousel items here */\n    default?(): void;\n    /**\n     * Override the pause/resume button\n     * @param autoplay {boolean} - if autoplay is active\n     * @param toggle {(): void} - toggle autoplay\n     */\n    pause?(props: { autoplay: boolean; toggle: () => void }): void;\n    /**\n     * Override the arrows\n     * @param hasPrev {boolean} - has prev arrow button\n     * @param hasNext {boolean} - has next arrow button\n     * @param prev {(): void} - switch to prev item function\n     * @param next {(): void} - switch to next item function\n     */\n    arrows?(props: {\n        hasPrev: boolean;\n        hasNext: boolean;\n        prev: () => void;\n        next: () => void;\n    }): void;\n    /**\n     * Override the indicators\n     * @param activeIndex {number} - active item index\n     * @param switchTo {(idx?: number): void} - switch to item function\n     */\n    indicators?(props: {\n        activeIndex: number;\n        switchTo: (idx?: number) => void;\n    }): void;\n    /**\n     * Override the indicator elements\n     * @param index {number} - indicator index\n     */\n    indicator?(props: { index: number }): void;\n    /** Define element to show when overlay is active */\n    overlay?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<CarouselComponent<T>>(() => ({\n    activeIndex: activeItem.value?.index ?? 0,\n    indicators: props.indicators,\n    itemWidth: itemWidth.value,\n    onDrag: onDragStart,\n    onClick: (event: Event): void => emits(\"click\", event),\n    setActive,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems, itemsCount } = useProviderParent<CarouselItemComponent<T>>({\n    rootRef,\n    data: provideData,\n});\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\nconst indicatorItems = computed(() =>\n    childItems.value.filter(\n        (el, i) => mod(i, settings.value.itemsToList) === 0,\n    ),\n);\n\nconst resizeObserver =\n    isClient && window.ResizeObserver\n        ? new window.ResizeObserver(onRefresh)\n        : undefined;\n\nconst windowWidth = ref(0);\n\nonMounted(() => {\n    if (!isClient) return;\n    // start resize observing\n    if (window.ResizeObserver && resizeObserver && rootRef.value)\n        resizeObserver.observe(rootRef.value);\n\n    // set HTML element with\n    windowWidth.value = window.innerWidth;\n\n    // a prefers-reduced-motion user setting must always override autoplay\n    const hasReducedMotion = window.matchMedia(\n        \"(prefers-reduced-motion: reduce)\",\n    );\n\n    // start timer when autoplay is enabled\n    if (!hasReducedMotion?.matches) startTimer();\n});\n\nonBeforeUnmount(() => {\n    if (!isClient) return;\n    // cleanup resize observer\n    if (window.ResizeObserver && resizeObserver) resizeObserver.disconnect();\n\n    // cleanup drag event\n    onDragEnd();\n    // cleanup timer\n    pauseTimer();\n});\n\nconst settings = computed<typeof props>(() => {\n    let settings;\n\n    if (!props.breakpoints) settings = toRaw(props);\n    else {\n        const breakpoints = Object.keys(props.breakpoints)\n            .map(Number)\n            .sort((a, b) => b - a);\n\n        const breakpoint = breakpoints.find(\n            (breakpoint) => windowWidth.value >= breakpoint,\n        );\n\n        settings = toRaw(\n            breakpoint ? { ...props, ...props.breakpoints[breakpoint] } : props,\n        );\n    }\n\n    // prevent empty values\n    if (!settings.itemsToList) settings.itemsToList = 1;\n    if (!settings.itemsToShow) settings.itemsToShow = 1;\n    return readonly(settings);\n});\n\nconst itemWidth = computed(() => {\n    // Ensure component is mounted\n    if (!windowWidth.value || !rootRef.value) return 0;\n\n    const rect = rootRef.value.getBoundingClientRect();\n    return rect.width / settings.value.itemsToShow;\n});\n\n/** watch specific props which need to refresh the component */\nwatch(\n    [\n        () => props.itemsToList,\n        () => props.itemsToShow,\n        () => props.arrowsHover,\n        () => props.repeat,\n    ],\n    () => onRefresh(),\n);\n\nfunction onRefresh(): void {\n    vmodel.value = childItems.value[0]?.data.getValue();\n    // set HTML element with\n    windowWidth.value = window.innerWidth;\n    // trigger re creation of settings based on props\n    nextTick(() => triggerRef(settings));\n}\n\n// #region --- Active Item Feature ---\n\n/** The selected item value or index, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nconst activeItem = ref<CarouselItem<T>>();\n\nonMounted(() => {\n    // set first tab as default if not defined\n    if (!vmodel.value) vmodel.value = childItems.value[0]?.data.getValue();\n});\n\n/** When v-model is changed set the new active tab. */\nwatch(\n    () => props.modelValue,\n    (value) => {\n        if (vmodel.value !== value) activateItem(value);\n    },\n);\n\n// set the active item immediate and every time the vmodel changes\nwatchEffect(() => {\n    activeItem.value = isDefined(vmodel.value)\n        ? childItems.value.find(\n              (item) => vmodel.value === item.data.getValue(),\n          ) || childItems.value[0]\n        : childItems.value[0];\n});\n\nfunction setActive(value: T): void {\n    if (vmodel.value === value) return;\n    activateItem(value);\n}\n\n/** Activate a specific child item by value and deactivate the previous child item. */\nfunction activateItem(newValue: ModelValue): void {\n    const oldValue = activeItem.value?.data.getValue();\n    const oldItem = activeItem.value;\n    const newItem =\n        childItems.value.find((item) => newValue === item.data.getValue()) ||\n        childItems.value[0];\n\n    if (oldItem && newItem) {\n        oldItem.data.deactivate(newItem.index);\n        newItem.data.activate(oldItem.index);\n    }\n\n    nextTick(() => {\n        vmodel.value = newValue;\n        emits(\"change\", newValue, oldValue);\n    });\n}\n\n// #endregion --- Active Item Feature ---\n\n// #region --- Switch Item Events ---\n\n/**\n * Show the slide by index.\n * @param index the real index of the slide\n */\nfunction switchTo(index: number = 0): void {\n    if (settings.value.repeat) index = mod(index, itemsCount.value);\n    index = bound(index, 0, itemsCount.value - 1);\n\n    const item = childItems.value[index];\n    activateItem(item?.data.getValue());\n}\n\nconst hasArrows = computed(\n    () =>\n        (settings.value.arrowsHover && isHovered.value) ||\n        !settings.value.arrowsHover,\n);\n\nconst hasPrev = computed(\n    () => settings.value.repeat || (activeItem.value?.index ?? 0) > 0,\n);\n\nfunction onPrev(): void {\n    switchTo((activeItem.value?.index ?? 0) - settings.value.itemsToList);\n}\n\nconst hasNext = computed(\n    () =>\n        settings.value.repeat ||\n        (activeItem.value?.index ?? 0) <\n            itemsCount.value - settings.value.itemsToList,\n);\n\nfunction onNext(): void {\n    switchTo((activeItem.value?.index ?? 0) + settings.value.itemsToList);\n}\n\n/** Go to the first viable item */\nfunction onHomePressed(): void {\n    switchTo(0);\n}\n\n/** Go to the last viable item */\nfunction onEndPressed(): void {\n    switchTo(itemsCount.value - settings.value.itemsToList);\n}\n\n/** Set focus on a tab item. */\nfunction onChange(item: ProviderItem): void {\n    switchTo(item.index);\n}\n\n// #endregion --- Switch Item Events ---\n\n// #region --- Drag & Drop | Slide Feature ---\n\nconst dragX = ref<number>();\nconst delta = ref<number>(0);\n\nconst isDragging = computed(() => isDefined(dragX.value));\n\n/** slide transform:translateX translation */\nconst translation = computed(\n    () =>\n        -bound(\n            delta.value + (activeItem.value?.index ?? 0) * itemWidth.value,\n            0,\n            (childItems.value.length - settings.value.itemsToShow) *\n                itemWidth.value,\n        ),\n);\n\n/** handle drag event */\nfunction onDragStart(event: TouchEvent | MouseEvent): void {\n    if (\n        isDragging.value ||\n        !settings.value.dragable ||\n        ((event as MouseEvent).button !== 0 && event.type !== \"touchstart\")\n    )\n        return;\n\n    delta.value = 0;\n    // get dragging start x value\n    dragX.value = (event as TouchEvent).touches\n        ? (event as TouchEvent).touches[0]?.clientX\n        : (event as MouseEvent).clientX;\n\n    // stop timer when dragging starts\n    pauseTimer();\n}\n\nfunction onDragOver(event: TouchEvent | MouseEvent): void {\n    if (!isDragging.value) return;\n\n    const dragEndX =\n        ((event as TouchEvent).touches\n            ? (event as TouchEvent).changedTouches[0] ||\n              (event as TouchEvent).touches[0]\n            : (event as MouseEvent)\n        ).clientX ?? 0;\n    // calc transition delta value\n    delta.value = (dragX.value ?? 0) - dragEndX;\n}\n\nfunction onDragEnd(): void {\n    if (!isDragging.value) return;\n    // switch slide\n    const signCheck = sign(delta.value);\n    const results = Math.round(Math.abs(delta.value / itemWidth.value) + 0.15); // Hack\n    switchTo((activeItem.value?.index ?? 0) + signCheck * results);\n\n    // cleanup\n    delta.value = 0;\n    dragX.value = undefined;\n\n    // atart timer after dragging ends\n    startTimer();\n}\n\n// #endregion --- Drag & Drop | Slide Feature ---\n\n// #region --- Autoplay Feature ---\n\nlet autoplayInterval: ReturnType<typeof setInterval> | undefined;\n\nonUnmounted(() => {\n    clearInterval(autoplayInterval);\n    autoplayInterval = undefined;\n});\n\n/** deactive autoplay feature */\nconst isAutoplayPaused = ref(false);\n\nconst isHovered = ref(false);\n\nfunction onHoverEnter(): void {\n    isHovered.value = true;\n}\n\nfunction onHoverLeave(): void {\n    isHovered.value = false;\n}\n\n/** Start/Stop timer when carousel get hovered */\nwatch(isHovered, (value) => {\n    if (!props.autoplay || !props.pauseHover) return;\n    if (value) pauseTimer();\n    else startTimer();\n});\n\n/** When autoplay is changed, start or pause timer accordingly */\nwatch(\n    () => props.autoplay,\n    (status) => {\n        if (status) startTimer();\n        else pauseTimer();\n    },\n);\n\n/** Since the timer can get paused at the end, if repeat is changed we need to restart it */\nwatch(\n    () => props.repeat,\n    (status) => {\n        if (status) startTimer();\n    },\n);\n\nfunction onToggleAutoplay(): void {\n    if (!isAutoplayPaused.value) {\n        isAutoplayPaused.value = true;\n        pauseTimer();\n    } else {\n        isAutoplayPaused.value = false;\n        startTimer();\n    }\n}\n\nfunction startTimer(): void {\n    if (!props.autoplay || autoplayInterval) return;\n    if (isAutoplayPaused.value) return;\n    autoplayInterval = setInterval(() => {\n        if (!props.repeat && !hasNext.value) pauseTimer();\n        else onNext();\n    }, props.interval);\n}\n\nfunction pauseTimer(): void {\n    if (!autoplayInterval) return;\n    clearInterval(autoplayInterval);\n    autoplayInterval = undefined;\n}\n\n// #endregion --- Autoplay Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-carousel\"],\n    [\n        \"overlayClass\",\n        \"o-carousel__overlay\",\n        null,\n        computed(() => props.overlay),\n    ],\n);\n\nconst wrapperClasses = defineClasses([\"wrapperClass\", \"o-carousel__wrapper\"]);\n\nconst itemsClasses = defineClasses(\n    [\"itemsClass\", \"o-carousel__items\"],\n    [\"itemsDraggingClass\", \"o-carousel__items--dragging\", null, isDragging],\n);\n\nconst prevIconClasses = defineClasses(\n    [\"iconClass\", \"o-carousel__icon\"],\n    [\"iconPrevClass\", \"o-carousel__icon-prev\"],\n);\n\nconst nextIconClasses = defineClasses(\n    [\"iconClass\", \"o-carousel__icon\"],\n    [\"iconNextClass\", \"o-carousel__icon-next\"],\n);\n\nconst autoplayIconClasses = defineClasses(\n    [\"iconClass\", \"o-carousel__icon\"],\n    [\"iconAutoplayClass\", \"o-carousel__icon-autoplay\"],\n);\n\nconst indicatorsClasses = defineClasses(\n    [\"indicatorsClass\", \"o-carousel__indicators\"],\n    [\n        \"indicatorsInsideClass\",\n        \"o-carousel__indicators--inside\",\n        null,\n        computed(() => !!props.indicatorInside),\n    ],\n    [\n        \"indicatorsPositionClass\",\n        \"o-carousel__indicators--\",\n        computed(() => props.indicatorPosition),\n        computed(() => !!props.indicatorPosition),\n    ],\n);\n\nconst indicatorClasses = defineClasses([\n    \"indicatorClass\",\n    \"o-carousel__indicator\",\n]);\n\nconst indicatorItemClasses = defineClasses(\n    [\"indicatorItemClass\", \"o-carousel__indicator__item\"],\n    [\n        \"indicatorItemStyleClass\",\n        \"o-carousel__indicator__item--\",\n        computed(() => props.indicatorStyle),\n        computed(() => !!props.indicatorStyle),\n    ],\n);\n\nconst indicatorItemActiveClasses = defineClasses([\n    \"indicatorItemActiveClass\",\n    \"o-carousel__indicator__item--active\",\n]);\n\nfunction indicatorItemAppliedClasses(item: ProviderItem): ClassBinding[] {\n    const activeClasses =\n        item.identifier === activeItem.value?.identifier\n            ? indicatorItemActiveClasses.value\n            : [];\n\n    return [...indicatorItemClasses.value, ...activeClasses];\n}\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div\n        ref=\"rootElement\"\n        data-oruga=\"carousel\"\n        :class=\"rootClasses\"\n        role=\"region\"\n        aria-roledescription=\"carousel\"\n        @mouseenter=\"onHoverEnter\"\n        @mouseleave=\"onHoverLeave\"\n        @focusin=\"onHoverEnter\"\n        @focusout=\"onHoverLeave\"\n        @keydown.left.prevent=\"onPrev\"\n        @keydown.right.prevent=\"onNext\"\n        @keydown.home.prevent=\"onHomePressed\"\n        @keydown.end.prevent=\"onEndPressed\">\n        <div :class=\"wrapperClasses\">\n            <slot\n                name=\"pause\"\n                :autoplay=\"!isAutoplayPaused\"\n                :toggle=\"onToggleAutoplay\">\n                <template v-if=\"autoplay\">\n                    <o-icon\n                        :class=\"autoplayIconClasses\"\n                        :pack=\"iconPack\"\n                        :icon=\"\n                            !isAutoplayPaused\n                                ? iconAutoplayPause\n                                : iconAutoplayResume\n                        \"\n                        :size=\"iconSize\"\n                        clickable\n                        :aria-label=\"\n                            !isAutoplayPaused\n                                ? ariaAutoplayPauseLabel\n                                : ariaAutoplayResumeLabel\n                        \"\n                        @click=\"onToggleAutoplay\" />\n                </template>\n            </slot>\n\n            <slot\n                name=\"arrows\"\n                :has-prev=\"hasPrev\"\n                :prev=\"onPrev\"\n                :has-next=\"hasNext\"\n                :next=\"onNext\">\n                <template v-if=\"arrows\">\n                    <o-icon\n                        v-show=\"hasArrows && hasPrev\"\n                        :class=\"prevIconClasses\"\n                        :pack=\"iconPack\"\n                        :icon=\"iconPrev\"\n                        :size=\"iconSize\"\n                        clickable\n                        :aria-label=\"ariaPreviousLabel\"\n                        @click=\"onPrev\" />\n                    <o-icon\n                        v-show=\"hasArrows && hasNext\"\n                        :class=\"nextIconClasses\"\n                        :pack=\"iconPack\"\n                        :icon=\"iconNext\"\n                        :size=\"iconSize\"\n                        clickable\n                        :aria-label=\"ariaNextLabel\"\n                        @click=\"onNext\" />\n                </template>\n            </slot>\n\n            <div\n                :class=\"itemsClasses\"\n                :style=\"'transform:translateX(' + translation + 'px)'\"\n                aria-roledescription=\"carousel-slide\"\n                aria-atomic=\"false\"\n                :tabindex=\"indicators ? undefined : 0\"\n                :aria-live=\"autoplay ? 'off' : 'polite'\"\n                @dragend=\"onDragEnd\"\n                @dragover=\"onDragOver\"\n                @touchmove=\"onDragOver\"\n                @touchend=\"onDragEnd\">\n                <slot>\n                    <o-carousel-item\n                        v-for=\"option in normalizedOptions\"\n                        :key=\"option.key\"\n                        v-bind=\"option.item\" />\n                </slot>\n            </div>\n        </div>\n\n        <slot\n            name=\"indicators\"\n            :active-index=\"activeItem?.index ?? 0\"\n            :switch-to=\"switchTo\">\n            <div\n                v-if=\"indicators\"\n                :class=\"indicatorsClasses\"\n                role=\"tablist\"\n                aria-label=\"Slides\">\n                <div\n                    v-for=\"item in indicatorItems\"\n                    :id=\"`carousel-${item.identifier}`\"\n                    :key=\"item.index\"\n                    :class=\"indicatorClasses\"\n                    role=\"tab\"\n                    :tabindex=\"\n                        item.identifier === activeItem?.identifier ? '0' : '-1'\n                    \"\n                    :aria-label=\"`Slide ${item.identifier}`\"\n                    :aria-controls=\"`carouselpanel-${item.identifier}`\"\n                    :aria-selected=\"item.identifier === activeItem?.identifier\"\n                    @click=\"onChange(item)\"\n                    @keydown.enter=\"onChange(item)\"\n                    @keydown.space=\"onChange(item)\">\n                    <slot :index=\"item.index\" name=\"indicator\">\n                        <span :class=\"indicatorItemAppliedClasses(item)\" />\n                    </slot>\n                </div>\n            </div>\n        </slot>\n\n        <template v-if=\"overlay\">\n            <slot name=\"overlay\" />\n        </template>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Carousel from \"./Carousel.vue\";\nimport CarouselItem from \"./CarouselItem.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export carousel specific types */\nexport type * from \"./props\";\n\n/** export carousel plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Carousel);\n        registerComponent(app, CarouselItem);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export carousel components */\nexport { Carousel as OCarousel, CarouselItem as OCarouselItem };\n","<script setup lang=\"ts\" generic=\"T, IsMultiple extends boolean = false\">\nimport { computed, useAttrs, useId, useSlots, useTemplateRef } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { CheckboxProps } from \"./props\";\nimport { isTrueish } from \"@/utils/helpers\";\n\n/**\n * Select a single or grouped options.\n * @displayName Checkbox\n * @style _checkbox.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OCheckbox\",\n    configField: \"checkbox\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = CheckboxProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<CheckboxProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    id: () => useId(),\n    variant: () => getDefault(\"checkbox.variant\"),\n    size: () => getDefault(\"checkbox.size\"),\n    label: undefined,\n    indeterminate: false,\n    required: false,\n    disabled: false,\n    name: undefined,\n    nativeValue: undefined,\n    trueValue: undefined,\n    falseValue: undefined,\n    autocomplete: () => getDefault(\"checkbox.autocomplete\", \"off\"),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: \"\",\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown | unknown[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on input change event\n     * @param value {unknown | unknown[]} input value\n     * @param event {Event} - native event\n     */\n    input: [value: ModelValue, event: Event];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst inputRef = useTemplateRef(\"inputElement\");\n\n// use form input functionalities\nconst { checkHtml5Validity, onBlur, onFocus, onInvalid, setFocus } =\n    useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// set field labelId or create a unique label id if a label is given\nconst labelId =\n    !!parentField.value || !!props.label || !!useSlots().default\n        ? parentField.value?.labelId || useId()\n        : undefined;\n\n// if no `label` is given and `id` is given set as `for` property on o-field wrapper\nif (!props.label && props.id) parentField.value?.setInputId(props.id);\n\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nconst isChecked = computed(\n    () =>\n        isTrueish(props.multiple) &&\n        (Array.isArray(vmodel.value)\n            ? vmodel.value.includes(props.nativeValue as T)\n            : vmodel.value === (props.trueValue ?? true)),\n);\n\nfunction onInput(event: Event): void {\n    emits(\"input\", vmodel.value, event);\n}\n\n// #region --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-checkbox\"],\n    [\n        \"sizeClass\",\n        \"o-checkbox--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-checkbox--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"disabledClass\",\n        \"o-checkbox--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\"checkedClass\", \"o-checkbox--checked\", null, isChecked],\n    [\n        \"indeterminateClass\",\n        \"o-checkbox--indeterminate\",\n        null,\n        computed(() => props.indeterminate),\n    ],\n);\n\nconst inputClasses = defineClasses([\"inputClass\", \"o-checkbox__input\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-checkbox__label\"]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <div data-oruga=\"checkbox\" :class=\"rootClasses\">\n        <input\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"inputElement\"\n            v-model=\"vmodel\"\n            type=\"checkbox\"\n            data-oruga-input=\"checkbox\"\n            :class=\"inputClasses\"\n            :name=\"name\"\n            :value=\"nativeValue\"\n            :true-value=\"trueValue ?? true\"\n            :false-value=\"falseValue ?? false\"\n            :required=\"required\"\n            :indeterminate=\"indeterminate\"\n            :disabled=\"disabled\"\n            :autocomplete=\"autocomplete\"\n            :aria-checked=\"indeterminate ? 'mixed' : isChecked\"\n            :aria-labelledby=\"labelId\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\"\n            @change=\"onInput\" />\n\n        <label\n            v-if=\"label || $slots.default\"\n            :id=\"labelId\"\n            :for=\"id\"\n            :class=\"labelClasses\">\n            <slot>{{ label }}</slot>\n        </label>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T, IsMultiple extends boolean = false\">\nimport { computed, useAttrs, useId, useSlots, useTemplateRef } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { CheckboxProps } from \"./props\";\nimport { isTrueish } from \"@/utils/helpers\";\n\n/**\n * Select a single or grouped options.\n * @displayName Checkbox\n * @style _checkbox.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OCheckbox\",\n    configField: \"checkbox\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = CheckboxProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<CheckboxProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    id: () => useId(),\n    variant: () => getDefault(\"checkbox.variant\"),\n    size: () => getDefault(\"checkbox.size\"),\n    label: undefined,\n    indeterminate: false,\n    required: false,\n    disabled: false,\n    name: undefined,\n    nativeValue: undefined,\n    trueValue: undefined,\n    falseValue: undefined,\n    autocomplete: () => getDefault(\"checkbox.autocomplete\", \"off\"),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: \"\",\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown | unknown[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on input change event\n     * @param value {unknown | unknown[]} input value\n     * @param event {Event} - native event\n     */\n    input: [value: ModelValue, event: Event];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst inputRef = useTemplateRef(\"inputElement\");\n\n// use form input functionalities\nconst { checkHtml5Validity, onBlur, onFocus, onInvalid, setFocus } =\n    useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// set field labelId or create a unique label id if a label is given\nconst labelId =\n    !!parentField.value || !!props.label || !!useSlots().default\n        ? parentField.value?.labelId || useId()\n        : undefined;\n\n// if no `label` is given and `id` is given set as `for` property on o-field wrapper\nif (!props.label && props.id) parentField.value?.setInputId(props.id);\n\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nconst isChecked = computed(\n    () =>\n        isTrueish(props.multiple) &&\n        (Array.isArray(vmodel.value)\n            ? vmodel.value.includes(props.nativeValue as T)\n            : vmodel.value === (props.trueValue ?? true)),\n);\n\nfunction onInput(event: Event): void {\n    emits(\"input\", vmodel.value, event);\n}\n\n// #region --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-checkbox\"],\n    [\n        \"sizeClass\",\n        \"o-checkbox--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-checkbox--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"disabledClass\",\n        \"o-checkbox--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\"checkedClass\", \"o-checkbox--checked\", null, isChecked],\n    [\n        \"indeterminateClass\",\n        \"o-checkbox--indeterminate\",\n        null,\n        computed(() => props.indeterminate),\n    ],\n);\n\nconst inputClasses = defineClasses([\"inputClass\", \"o-checkbox__input\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-checkbox__label\"]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <div data-oruga=\"checkbox\" :class=\"rootClasses\">\n        <input\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"inputElement\"\n            v-model=\"vmodel\"\n            type=\"checkbox\"\n            data-oruga-input=\"checkbox\"\n            :class=\"inputClasses\"\n            :name=\"name\"\n            :value=\"nativeValue\"\n            :true-value=\"trueValue ?? true\"\n            :false-value=\"falseValue ?? false\"\n            :required=\"required\"\n            :indeterminate=\"indeterminate\"\n            :disabled=\"disabled\"\n            :autocomplete=\"autocomplete\"\n            :aria-checked=\"indeterminate ? 'mixed' : isChecked\"\n            :aria-labelledby=\"labelId\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\"\n            @change=\"onInput\" />\n\n        <label\n            v-if=\"label || $slots.default\"\n            :id=\"labelId\"\n            :for=\"id\"\n            :class=\"labelClasses\">\n            <slot>{{ label }}</slot>\n        </label>\n    </div>\n</template>\n","import type { App } from \"vue\";\nimport Checkbox from \"./Checkbox.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export checkbox specific types */\nexport type * from \"./props\";\n\n/** export checkbox plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Checkbox);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export table components */\nexport { Checkbox as OCheckbox };\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { CollapseProps } from \"./props\";\n\n/**\n * An easy way to toggle what you want.\n * @displayName Collapse\n * @style _collapse.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OCollapse\",\n    configField: \"collapse\",\n});\n\nconst props = withDefaults(defineProps<CollapseProps>(), {\n    override: undefined,\n    open: true,\n    expanded: false,\n    animation: () => getDefault(\"collapse.animation\", \"fade\"),\n    position: () => getDefault(\"collapse.position\", \"top\"),\n    contentId: () => useId(),\n    triggerId: () => useId(),\n});\n\nconst emits = defineEmits<{\n    /**\n     * open prop two-way binding\n     * @param value {boolean} - updated open prop\n     */\n    \"update:open\": [value: boolean];\n    /** on collapse opened */\n    open: [];\n    /** on collapse closed */\n    close: [];\n}>();\n\ndefineSlots<{\n    /** Content to collapse */\n    default?(): void;\n    /**\n     * Define the collapse trigger element\n     * @param open {boolean} - collapse open state\n     */\n    trigger?(props: { open: boolean }): void;\n}>();\n\nconst isOpen = defineModel<boolean>(\"open\", { default: true });\n\n/** Toggle and emit events */\nfunction toggle(): void {\n    isOpen.value = !isOpen.value;\n    if (isOpen.value) emits(\"open\");\n    else emits(\"close\");\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-collapse\"],\n    [\n        \"positionClass\",\n        \"o-collapse--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n);\n\nconst triggerClasses = defineClasses(\n    [\"triggerClass\", \"o-collapse__trigger\"],\n    [\n        \"expandedClass\",\n        \"o-collapse__trigger--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n);\n\nconst contentClasses = defineClasses([\"contentClass\", \"o-collapse__content\"]);\n</script>\n\n<template>\n    <div data-oruga=\"collapse\" :class=\"rootClasses\">\n        <div\n            :id=\"triggerId\"\n            :class=\"triggerClasses\"\n            role=\"button\"\n            tabindex=\"0\"\n            :aria-controls=\"contentId\"\n            :aria-expanded=\"isOpen\"\n            @click=\"toggle\"\n            @keydown.enter.prevent=\"toggle\"\n            @keydown.space.prevent=\"toggle\">\n            <slot name=\"trigger\" :open=\"isOpen\" />\n        </div>\n\n        <Transition :name=\"animation\">\n            <div\n                v-show=\"isOpen\"\n                :id=\"contentId\"\n                :class=\"contentClasses\"\n                :aria-labelledby=\"triggerId\">\n                <slot />\n            </div>\n        </Transition>\n    </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useId } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { CollapseProps } from \"./props\";\n\n/**\n * An easy way to toggle what you want.\n * @displayName Collapse\n * @style _collapse.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OCollapse\",\n    configField: \"collapse\",\n});\n\nconst props = withDefaults(defineProps<CollapseProps>(), {\n    override: undefined,\n    open: true,\n    expanded: false,\n    animation: () => getDefault(\"collapse.animation\", \"fade\"),\n    position: () => getDefault(\"collapse.position\", \"top\"),\n    contentId: () => useId(),\n    triggerId: () => useId(),\n});\n\nconst emits = defineEmits<{\n    /**\n     * open prop two-way binding\n     * @param value {boolean} - updated open prop\n     */\n    \"update:open\": [value: boolean];\n    /** on collapse opened */\n    open: [];\n    /** on collapse closed */\n    close: [];\n}>();\n\ndefineSlots<{\n    /** Content to collapse */\n    default?(): void;\n    /**\n     * Define the collapse trigger element\n     * @param open {boolean} - collapse open state\n     */\n    trigger?(props: { open: boolean }): void;\n}>();\n\nconst isOpen = defineModel<boolean>(\"open\", { default: true });\n\n/** Toggle and emit events */\nfunction toggle(): void {\n    isOpen.value = !isOpen.value;\n    if (isOpen.value) emits(\"open\");\n    else emits(\"close\");\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-collapse\"],\n    [\n        \"positionClass\",\n        \"o-collapse--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n);\n\nconst triggerClasses = defineClasses(\n    [\"triggerClass\", \"o-collapse__trigger\"],\n    [\n        \"expandedClass\",\n        \"o-collapse__trigger--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n);\n\nconst contentClasses = defineClasses([\"contentClass\", \"o-collapse__content\"]);\n</script>\n\n<template>\n    <div data-oruga=\"collapse\" :class=\"rootClasses\">\n        <div\n            :id=\"triggerId\"\n            :class=\"triggerClasses\"\n            role=\"button\"\n            tabindex=\"0\"\n            :aria-controls=\"contentId\"\n            :aria-expanded=\"isOpen\"\n            @click=\"toggle\"\n            @keydown.enter.prevent=\"toggle\"\n            @keydown.space.prevent=\"toggle\">\n            <slot name=\"trigger\" :open=\"isOpen\" />\n        </div>\n\n        <Transition :name=\"animation\">\n            <div\n                v-show=\"isOpen\"\n                :id=\"contentId\"\n                :class=\"contentClasses\"\n                :aria-labelledby=\"triggerId\">\n                <slot />\n            </div>\n        </Transition>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Collapse from \"./Collapse.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export collapse specific types */\nexport type * from \"./props\";\n\n/** export collapse plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Collapse);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export collapse components */\nexport { Collapse as OCollapse };\n","<script setup lang=\"ts\" generic=\"T, IsMultiple extends boolean = false\">\nimport {\n    computed,\n    watch,\n    nextTick,\n    useAttrs,\n    useId,\n    useTemplateRef,\n} from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isDefined, isTrueish } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    isGroupOption,\n    normalizeOptions,\n    useIndexer,\n    useInputHandler,\n} from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { SelectProps } from \"./props\";\n\n/**\n * Select an item in a list. Use with Field to access all functionalities.\n * @displayName Select\n * @style _select.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSelect\",\n    configField: \"select\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = SelectProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<SelectProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    options: undefined,\n    size: () => getDefault(\"select.size\"),\n    variant: () => getDefault(\"select.variant\"),\n    placeholder: undefined,\n    disabled: false,\n    required: false,\n    expanded: () => getDefault(\"select.expanded\", false),\n    rounded: false,\n    nativeSize: undefined,\n    iconPack: () => getDefault(\"select.iconPack\"),\n    icon: () => getDefault(\"select.icon\"),\n    iconClickable: false,\n    iconRight: () => getDefault(\"select.iconRight\"),\n    iconRightClickable: false,\n    iconRightVariant: undefined,\n    id: () => useId(),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidation: \"\",\n    autocomplete: () => getDefault(\"select.autocomplete\", \"off\"),\n    statusIcon: () => getDefault(\"statusIcon\", true),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown | unknown[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the placeholder */\n    placeholder?(): void;\n    /** Define the select options here, default is options prop */\n    default?(): void;\n}>();\n\nconst selectRef = useTemplateRef(\"selectElement\");\n\n// use form input functionality\nconst { checkHtml5Validity, onBlur, onFocus, onInvalid, setFocus, isValid } =\n    useInputHandler(selectRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField, statusVariant, statusVariantIcon } = injectField();\n\n// if `id` is given set as `for` property on o-field wrapper\nif (props.id) parentField?.value?.setInputId(props.id);\n\nconst vmodel = defineModel<ModelValue>({\n    get: (value) =>\n        typeof value !== \"undefined\"\n            ? value\n            : ((props.multiple ? [] : \"\") as ModelValue),\n    set: (value) =>\n        typeof value !== \"undefined\"\n            ? value\n            : ((props.multiple ? [] : undefined) as ModelValue),\n    default: undefined,\n});\n\n/**\n * When v-model is changed:\n *  1. Set parent field filled state.\n *  2. Check html5 valdiation\n */\nwatch(\n    vmodel,\n    (value) => {\n        if (parentField?.value) parentField.value.setFilled(!!value);\n        if (!isValid.value) checkHtml5Validity();\n    },\n    { immediate: true, flush: \"post\" },\n);\n\n// create a unique id sequence\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer, true),\n);\n\nconst placeholderVisible = computed(\n    () =>\n        !isTrueish(props.multiple) &&\n        (!isDefined(vmodel.value) || vmodel.value === \"\"),\n);\n\n// --- Icon Feature ---\n\nconst hasIconRight = computed(\n    () =>\n        (!!props.iconRight && !isTrueish(props.multiple)) ||\n        (props.statusIcon && !!statusVariantIcon.value),\n);\n\nconst rightIcon = computed(() =>\n    props.iconRight ? props.iconRight : statusVariantIcon.value,\n);\n\nconst rightIconVariant = computed(() =>\n    props.iconRight\n        ? props.iconRightVariant || props.variant\n        : statusVariant.value,\n);\n\nfunction iconClick(emit, event: Event): void {\n    emits(emit, event);\n    nextTick(() => setFocus());\n}\n\nfunction leftIconClick(event: Event): void {\n    if (props.iconClickable) iconClick(\"icon-click\", event);\n}\n\nfunction rightIconClick(event: Event): void {\n    if (props.iconRightClickable) iconClick(\"icon-right-click\", event);\n}\n\n// --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-select\"],\n    [\n        \"sizeClass\",\n        \"o-select--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-select--\",\n        computed(() => statusVariant.value || props.variant),\n        computed(() => !!statusVariant.value || !!props.variant),\n    ],\n    [\n        \"expandedClass\",\n        \"o-select--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    [\n        \"disabledClass\",\n        \"o-select--disabled\",\n        null,\n        computed(() => isTrueish(props.disabled)),\n    ],\n    [\n        \"roundedClass\",\n        \"o-select--rounded\",\n        null,\n        computed(() => isTrueish(props.rounded)),\n    ],\n    [\"hasIconRightClass\", \"o-select--icon-right\", null, hasIconRight],\n    [\n        \"multipleClass\",\n        \"o-select--multiple\",\n        null,\n        computed(() => isTrueish(props.multiple)),\n    ],\n);\n\nconst selectClasses = defineClasses(\n    [\"selectClass\", \"o-select__input\"],\n    [\n        \"iconLeftSpaceClass\",\n        \"o-select__input--iconspace-left\",\n        null,\n        computed(() => !!props.icon),\n    ],\n    [\n        \"iconRightSpaceClass\",\n        \"o-select__input--iconspace-right\",\n        null,\n        hasIconRight,\n    ],\n    [\n        \"placeholderClass\",\n        \"o-select__input--placeholder\",\n        null,\n        placeholderVisible,\n    ],\n    [\n        \"arrowedClass\",\n        \"o-select__input--arrowed\",\n        null,\n        computed(() => !hasIconRight.value && !isTrueish(props.multiple)),\n    ],\n);\n\nconst iconLeftClasses = defineClasses([\"iconLeftClass\", \"o-select__icon-left\"]);\n\nconst iconRightClasses = defineClasses([\n    \"iconRightClass\",\n    \"o-select__icon-right\",\n]);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n</script>\n\n<template>\n    <div data-oruga=\"select\" :class=\"rootClasses\">\n        <o-icon\n            v-if=\"icon\"\n            :class=\"iconLeftClasses\"\n            :clickable=\"iconClickable\"\n            :icon=\"icon\"\n            :pack=\"iconPack\"\n            :size=\"size\"\n            @click=\"leftIconClick($event)\" />\n\n        <select\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"selectElement\"\n            v-model=\"vmodel\"\n            data-oruga-input=\"select\"\n            :class=\"selectClasses\"\n            :autocomplete=\"autocomplete\"\n            :multiple=\"props.multiple\"\n            :size=\"nativeSize\"\n            :disabled=\"disabled\"\n            :required=\"required\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\">\n            <template v-if=\"placeholder || $slots.placeholder\">\n                <option v-if=\"placeholderVisible\" value=\"\" disabled hidden>\n                    <slot name=\"placeholder\">\n                        {{ placeholder }}\n                    </slot>\n                </option>\n            </template>\n\n            <slot>\n                <template v-for=\"option in normalizedOptions\" :key=\"option.key\">\n                    <optgroup v-if=\"isGroupOption(option)\" v-bind=\"option.item\">\n                        <option\n                            v-for=\"_option in option.options\"\n                            v-bind=\"_option.item\"\n                            :key=\"_option.key\"\n                            :label=\"undefined\"\n                            :selected=\"_option.item.value === vmodel\">\n                            {{ _option.item.label }}\n                        </option>\n                    </optgroup>\n\n                    <option\n                        v-else\n                        v-bind=\"option.item\"\n                        :label=\"undefined\"\n                        :selected=\"option.item.value === vmodel\">\n                        {{ option.item.label }}\n                    </option>\n                </template>\n            </slot>\n        </select>\n\n        <o-icon\n            v-if=\"hasIconRight\"\n            :class=\"iconRightClasses\"\n            :icon=\"rightIcon\"\n            :pack=\"iconPack\"\n            :size=\"size\"\n            :variant=\"rightIconVariant\"\n            :clickable=\"iconRightClickable\"\n            @click=\"rightIconClick\" />\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T, IsMultiple extends boolean = false\">\nimport {\n    computed,\n    watch,\n    nextTick,\n    useAttrs,\n    useId,\n    useTemplateRef,\n} from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isDefined, isTrueish } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    isGroupOption,\n    normalizeOptions,\n    useIndexer,\n    useInputHandler,\n} from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { SelectProps } from \"./props\";\n\n/**\n * Select an item in a list. Use with Field to access all functionalities.\n * @displayName Select\n * @style _select.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSelect\",\n    configField: \"select\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = SelectProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<SelectProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    options: undefined,\n    size: () => getDefault(\"select.size\"),\n    variant: () => getDefault(\"select.variant\"),\n    placeholder: undefined,\n    disabled: false,\n    required: false,\n    expanded: () => getDefault(\"select.expanded\", false),\n    rounded: false,\n    nativeSize: undefined,\n    iconPack: () => getDefault(\"select.iconPack\"),\n    icon: () => getDefault(\"select.icon\"),\n    iconClickable: false,\n    iconRight: () => getDefault(\"select.iconRight\"),\n    iconRightClickable: false,\n    iconRightVariant: undefined,\n    id: () => useId(),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidation: \"\",\n    autocomplete: () => getDefault(\"select.autocomplete\", \"off\"),\n    statusIcon: () => getDefault(\"statusIcon\", true),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown | unknown[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the placeholder */\n    placeholder?(): void;\n    /** Define the select options here, default is options prop */\n    default?(): void;\n}>();\n\nconst selectRef = useTemplateRef(\"selectElement\");\n\n// use form input functionality\nconst { checkHtml5Validity, onBlur, onFocus, onInvalid, setFocus, isValid } =\n    useInputHandler(selectRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField, statusVariant, statusVariantIcon } = injectField();\n\n// if `id` is given set as `for` property on o-field wrapper\nif (props.id) parentField?.value?.setInputId(props.id);\n\nconst vmodel = defineModel<ModelValue>({\n    get: (value) =>\n        typeof value !== \"undefined\"\n            ? value\n            : ((props.multiple ? [] : \"\") as ModelValue),\n    set: (value) =>\n        typeof value !== \"undefined\"\n            ? value\n            : ((props.multiple ? [] : undefined) as ModelValue),\n    default: undefined,\n});\n\n/**\n * When v-model is changed:\n *  1. Set parent field filled state.\n *  2. Check html5 valdiation\n */\nwatch(\n    vmodel,\n    (value) => {\n        if (parentField?.value) parentField.value.setFilled(!!value);\n        if (!isValid.value) checkHtml5Validity();\n    },\n    { immediate: true, flush: \"post\" },\n);\n\n// create a unique id sequence\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer, true),\n);\n\nconst placeholderVisible = computed(\n    () =>\n        !isTrueish(props.multiple) &&\n        (!isDefined(vmodel.value) || vmodel.value === \"\"),\n);\n\n// --- Icon Feature ---\n\nconst hasIconRight = computed(\n    () =>\n        (!!props.iconRight && !isTrueish(props.multiple)) ||\n        (props.statusIcon && !!statusVariantIcon.value),\n);\n\nconst rightIcon = computed(() =>\n    props.iconRight ? props.iconRight : statusVariantIcon.value,\n);\n\nconst rightIconVariant = computed(() =>\n    props.iconRight\n        ? props.iconRightVariant || props.variant\n        : statusVariant.value,\n);\n\nfunction iconClick(emit, event: Event): void {\n    emits(emit, event);\n    nextTick(() => setFocus());\n}\n\nfunction leftIconClick(event: Event): void {\n    if (props.iconClickable) iconClick(\"icon-click\", event);\n}\n\nfunction rightIconClick(event: Event): void {\n    if (props.iconRightClickable) iconClick(\"icon-right-click\", event);\n}\n\n// --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-select\"],\n    [\n        \"sizeClass\",\n        \"o-select--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-select--\",\n        computed(() => statusVariant.value || props.variant),\n        computed(() => !!statusVariant.value || !!props.variant),\n    ],\n    [\n        \"expandedClass\",\n        \"o-select--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    [\n        \"disabledClass\",\n        \"o-select--disabled\",\n        null,\n        computed(() => isTrueish(props.disabled)),\n    ],\n    [\n        \"roundedClass\",\n        \"o-select--rounded\",\n        null,\n        computed(() => isTrueish(props.rounded)),\n    ],\n    [\"hasIconRightClass\", \"o-select--icon-right\", null, hasIconRight],\n    [\n        \"multipleClass\",\n        \"o-select--multiple\",\n        null,\n        computed(() => isTrueish(props.multiple)),\n    ],\n);\n\nconst selectClasses = defineClasses(\n    [\"selectClass\", \"o-select__input\"],\n    [\n        \"iconLeftSpaceClass\",\n        \"o-select__input--iconspace-left\",\n        null,\n        computed(() => !!props.icon),\n    ],\n    [\n        \"iconRightSpaceClass\",\n        \"o-select__input--iconspace-right\",\n        null,\n        hasIconRight,\n    ],\n    [\n        \"placeholderClass\",\n        \"o-select__input--placeholder\",\n        null,\n        placeholderVisible,\n    ],\n    [\n        \"arrowedClass\",\n        \"o-select__input--arrowed\",\n        null,\n        computed(() => !hasIconRight.value && !isTrueish(props.multiple)),\n    ],\n);\n\nconst iconLeftClasses = defineClasses([\"iconLeftClass\", \"o-select__icon-left\"]);\n\nconst iconRightClasses = defineClasses([\n    \"iconRightClass\",\n    \"o-select__icon-right\",\n]);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n</script>\n\n<template>\n    <div data-oruga=\"select\" :class=\"rootClasses\">\n        <o-icon\n            v-if=\"icon\"\n            :class=\"iconLeftClasses\"\n            :clickable=\"iconClickable\"\n            :icon=\"icon\"\n            :pack=\"iconPack\"\n            :size=\"size\"\n            @click=\"leftIconClick($event)\" />\n\n        <select\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"selectElement\"\n            v-model=\"vmodel\"\n            data-oruga-input=\"select\"\n            :class=\"selectClasses\"\n            :autocomplete=\"autocomplete\"\n            :multiple=\"props.multiple\"\n            :size=\"nativeSize\"\n            :disabled=\"disabled\"\n            :required=\"required\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\">\n            <template v-if=\"placeholder || $slots.placeholder\">\n                <option v-if=\"placeholderVisible\" value=\"\" disabled hidden>\n                    <slot name=\"placeholder\">\n                        {{ placeholder }}\n                    </slot>\n                </option>\n            </template>\n\n            <slot>\n                <template v-for=\"option in normalizedOptions\" :key=\"option.key\">\n                    <optgroup v-if=\"isGroupOption(option)\" v-bind=\"option.item\">\n                        <option\n                            v-for=\"_option in option.options\"\n                            v-bind=\"_option.item\"\n                            :key=\"_option.key\"\n                            :label=\"undefined\"\n                            :selected=\"_option.item.value === vmodel\">\n                            {{ _option.item.label }}\n                        </option>\n                    </optgroup>\n\n                    <option\n                        v-else\n                        v-bind=\"option.item\"\n                        :label=\"undefined\"\n                        :selected=\"option.item.value === vmodel\">\n                        {{ option.item.label }}\n                    </option>\n                </template>\n            </slot>\n        </select>\n\n        <o-icon\n            v-if=\"hasIconRight\"\n            :class=\"iconRightClasses\"\n            :icon=\"rightIcon\"\n            :pack=\"iconPack\"\n            :size=\"size\"\n            :variant=\"rightIconVariant\"\n            :clickable=\"iconRightClickable\"\n            @click=\"rightIconClick\" />\n    </div>\n</template>\n","<script setup lang=\"ts\">\nimport {\n    computed,\n    useAttrs,\n    ref,\n    watch,\n    nextTick,\n    useTemplateRef,\n    type PropType,\n} from \"vue\";\n\nimport ODropdown from \"../dropdown/Dropdown.vue\";\nimport ODropdownItem from \"../dropdown/DropdownItem.vue\";\nimport OInput from \"../input/Input.vue\";\n\nimport { isDate, isDefined, isMobileAgent, isTrueish } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    getActiveClasses,\n    useEventListener,\n    useInputHandler,\n} from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { ClassBinding, ComponentClass } from \"@/types\";\n\n/**\n * This is a internal used component.\n * Used by Datepicker and Timepicker.\n */\ndefineOptions({\n    name: \"OPickerWrapper\",\n});\n\nconst props = defineProps({\n    /** the internal input value */\n    value: {\n        type: [Date, Array] as PropType<Date | Date[] | undefined>,\n        default: undefined,\n    },\n    /** the active state of the dropdown */\n    active: { type: Boolean, default: false },\n    /** parent picker component props  */\n    pickerProps: { type: Object, required: true },\n    /** data-oruga attribute value */\n    dataOruga: { type: String, required: true },\n    /** format props value to input value */\n    formatter: {\n        type: Function as PropType<\n            (value: Date | Date[] | undefined, isNative: boolean) => string\n        >,\n        required: true,\n    },\n    /** parse input value to props value */\n    parser: {\n        type: Function as PropType<\n            (value: string, isNative: boolean) => Date | Date[] | undefined\n        >,\n        required: true,\n    },\n    type: { type: String, required: true },\n    step: { type: String, default: undefined },\n    min: { type: Date, default: undefined },\n    max: { type: Date, default: undefined },\n    stayOpen: { type: Boolean, default: false },\n    /** the DateTimeFormat object to watch for to update the parsed input value */\n    dtf: { type: Object, default: undefined },\n    rootClasses: { type: Array as PropType<ClassBinding[]>, required: true },\n    dropdownClasses: {\n        type: Array as PropType<ClassBinding[]>,\n        required: true,\n    },\n    boxClass: { type: Array as PropType<ComponentClass>, required: true },\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {Date, Date[]} - updated active prop\n     */\n    \"update:value\": [value: Date | Date[] | undefined];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /** on input focus event */\n    focus: [event: Event];\n    /** on input blur event */\n    blur: [event: Event];\n    /** on input invalid event */\n    invalid: [event: Event];\n    /** on icon click event */\n    \"icon-click\": [event: Event];\n    /** on icon right click event */\n    \"icon-right-click\": [event: Event];\n    /** on dropdown left button press event */\n    left: [event: Event];\n    /** on dropdown right button press event */\n    right: [event: Event];\n}>();\n\nconst isMobileNative = computed(\n    () =>\n        !isTrueish(props.pickerProps.inline) &&\n        isTrueish(props.pickerProps.mobileNative) &&\n        isMobileAgent.any(),\n);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\nconst dropdownRef = useTemplateRef(\"dropdownComponent\");\nconst inputRef = useTemplateRef(\"inputComponent\");\nconst nativeInputRef = useTemplateRef(\"nativeInputComponent\");\n\nconst elementRef = computed(() =>\n    isMobileNative.value ? nativeInputRef.value : inputRef.value,\n);\n\n// use form input functionality for native input\nconst {\n    input,\n    checkHtml5Validity,\n    setFocus,\n    onBlur,\n    onFocus,\n    onInvalid,\n    isValid,\n} = useInputHandler<HTMLInputElement>(elementRef, emits, props.pickerProps);\n\n/**\n * Show input as text for placeholder,\n * when placeholder and no native value is given.\n */\nconst initialNativeType =\n    !isDefined(props.pickerProps.placeholder) || isTrueish(props.value)\n        ? props.type\n        : \"text\";\n\n/** the v-model value of the input */\nconst inputValue = ref(\"\");\n\n/**\n * When v-model is changed:\n *  1. Update internal value.\n *  2. Close picker.\n *  3. If it's invalid, validate again.\n */\nwatch(\n    () => props.value,\n    (value) => {\n        // update internal value\n        inputValue.value = props.formatter(value, isMobileNative.value);\n\n        // toggle picker if not stay open\n        if (!isMobileNative.value && !props.stayOpen) togglePicker(false);\n        // validate if its invalid\n        if (!isValid.value) checkHtml5Validity();\n    },\n    { immediate: true },\n);\n\n// update the parsed input value when the dtf change\nwatch(\n    () => props.dtf,\n    () => setValue(inputValue.value),\n);\n\n/** Set the vmodel value and update the prop value */\nfunction setValue(value: string): void {\n    // parse to date\n    let date = props.parser(value, isMobileNative.value);\n\n    // check min/max dates\n    if (Array.isArray(date)) date = date.map(checkMinMaxDate);\n    else if (isDefined(date)) date = checkMinMaxDate(date);\n\n    nextTick(\n        () =>\n            // reparse to string for internal value\n            (inputValue.value = props.formatter(date, isMobileNative.value)),\n    );\n\n    // update the prop value\n    emits(\"update:value\", date);\n}\n\nfunction checkMinMaxDate(date: Date): Date {\n    if (!isDate(date)) return date;\n    if (props.min && date < props.min) date = props.min;\n    else if (props.max && date > props.max) date = props.max;\n    return date;\n}\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nwatch(isActive, onActiveChange);\n\nif (isClient) useEventListener(document, \"keyup\", onKeyup);\n\n/** Keypress event that is bound to the document. */\nfunction onKeyup(event: KeyboardEvent): void {\n    if (!isActive.value) return;\n    if (event.key === \"Escape\" || event.key === \"Esc\") togglePicker(false);\n}\n\n// --- PICKER EVENT HANDLER ---\n\n/** Toggle picker */\nfunction togglePicker(active: boolean): void {\n    if (!dropdownRef.value) return;\n    if (active || isTrueish(props.pickerProps.closeOnClick))\n        nextTick(() => (isActive.value = active));\n}\n\n/** Avoid dropdown toggle when is already visible */\nfunction onInputClick(event): void {\n    if (isActive.value) event.stopPropagation();\n}\n\n/** Emit 'blur' event on dropdown is not active (closed) */\nfunction onActiveChange(value: boolean): void {\n    if (value) onFocus();\n    else if (!value) onBlur();\n}\n\n// --- NATIVE EVENT HANDLER ---\n\nfunction onChange(event: Event): void {\n    setValue((event.target as HTMLInputElement).value);\n}\n\nfunction onNativeClick(event: Event): void {\n    // do nothing if client is not mobile\n    if (!isMobileNative.value || !input.value) return;\n\n    // when input is not editable jet\n    if (input.value.type === \"text\") {\n        event.preventDefault();\n        event.stopPropagation();\n\n        // blur the current state to remove active native keyboards for type 'text'\n        input.value.blur();\n\n        setTimeout(() => {\n            if (!input.value) return;\n            // make the input editable\n            input.value.readOnly = false;\n            input.value.type = props.type;\n\n            // focus the underlaying input element again to open native keyboards for type 'date'\n            setFocus();\n        }, 50);\n    }\n}\n\nfunction onNativeFocus(event: Event): void {\n    // do nothing if client is not mobile\n    if (!isMobileNative.value || !input.value) return;\n\n    // when input is not editable jet\n    if (input.value.type === \"text\") {\n        // prevent focus\n        event.preventDefault();\n        event.stopPropagation();\n    }\n    // only emit focus event if editable\n    else onFocus(event);\n}\n\nfunction onNativeBlur(event: Event): void {\n    // do nothing if client is not mobile\n    if (!isMobileNative.value || !input.value) return;\n\n    // when the input does not have any value\n    if (!input.value.value) {\n        // make the input uneditable\n        input.value.readOnly = true;\n        input.value.type = \"text\";\n    }\n    // emit blur event\n    onBlur(event);\n}\n\nfunction onNativeChange(event: Event): void {\n    const value = (event.target as HTMLInputElement).value\n        ? (event.target as HTMLInputElement).value\n        : \"\";\n\n    // when the input does not have any value\n    if (!value && input.value) {\n        input.value.value = value;\n        input.value.blur();\n    }\n\n    setValue(value);\n}\n\n// --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n    inputClass: props.pickerProps.inputClass,\n    ...props.pickerProps.inputClasses,\n}));\n\nconst dropdownBind = computed(() => ({\n    \"root-class\": getActiveClasses(props.dropdownClasses),\n    \"teleport-class\": getActiveClasses(props.rootClasses),\n    ...props.pickerProps.dropdownClasses,\n}));\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus });\n</script>\n\n<template>\n    <div :data-oruga=\"dataOruga\" :class=\"rootClasses\" @click=\"onNativeClick\">\n        <o-dropdown\n            v-if=\"!isMobileNative\"\n            ref=\"dropdownComponent\"\n            v-bind=\"dropdownBind\"\n            v-model:active=\"isActive\"\n            :open-on-click=\"pickerProps.openOnFocus\"\n            :position=\"pickerProps.position\"\n            :disabled=\"pickerProps.disabled\"\n            :inline=\"pickerProps.inline\"\n            :mobile-modal=\"pickerProps.mobileModal\"\n            :desktop-modal=\"pickerProps.desktopModal\"\n            :mobile-breakpoint=\"pickerProps.mobileBreakpoint\"\n            :teleport=\"pickerProps.teleport\">\n            <template v-if=\"!pickerProps.inline\" #trigger>\n                <slot name=\"trigger\">\n                    <o-input\n                        ref=\"inputComponent\"\n                        v-bind=\"inputBind\"\n                        v-model=\"inputValue\"\n                        :placeholder=\"pickerProps.placeholder\"\n                        :size=\"pickerProps.size\"\n                        :icon-pack=\"pickerProps.iconPack\"\n                        :icon=\"pickerProps.icon\"\n                        :icon-right=\"pickerProps.iconRight\"\n                        :icon-right-clickable=\"pickerProps.iconRightClickable\"\n                        :expanded=\"pickerProps.expanded\"\n                        :rounded=\"pickerProps.rounded\"\n                        :disabled=\"pickerProps.disabled\"\n                        :readonly=\"pickerProps.readonly\"\n                        autocomplete=\"off\"\n                        :use-html5-validation=\"false\"\n                        @invalid=\"onInvalid\"\n                        @click=\"onInputClick\"\n                        @keyup.enter=\"togglePicker(true)\"\n                        @change=\"onChange\"\n                        @focus=\"onFocus\"\n                        @blur=\"onBlur\"\n                        @icon-click=\"$emit('icon-click', $event)\"\n                        @icon-right-click=\"$emit('icon-right-click', $event)\" />\n                </slot>\n            </template>\n\n            <o-dropdown-item\n                override\n                tag=\"div\"\n                :item-class=\"boxClass\"\n                :disabled=\"pickerProps.disabled\"\n                :clickable=\"false\"\n                @keydown.left=\"$emit('left', $event)\"\n                @keydown.right=\"$emit('right', $event)\">\n                <slot />\n            </o-dropdown-item>\n        </o-dropdown>\n\n        <!-- Native Picker -->\n        <template v-else>\n            <slot name=\"trigger\">\n                <o-input\n                    ref=\"nativeInputComponent\"\n                    v-bind=\"inputBind\"\n                    v-model=\"inputValue\"\n                    :type=\"initialNativeType\"\n                    :min=\"formatter(min, true)\"\n                    :max=\"formatter(max, true)\"\n                    :step=\"step\"\n                    :placeholder=\"pickerProps.placeholder\"\n                    :size=\"pickerProps.size\"\n                    :icon-pack=\"pickerProps.iconPack\"\n                    :icon=\"pickerProps.icon\"\n                    :icon-right=\"pickerProps.iconRight\"\n                    :icon-right-clickable=\"pickerProps.iconRightClickable\"\n                    :rounded=\"pickerProps.rounded\"\n                    :disabled=\"pickerProps.disabled\"\n                    :readonly=\"initialNativeType == 'text'\"\n                    autocomplete=\"off\"\n                    :use-html5-validation=\"false\"\n                    @change=\"onNativeChange\"\n                    @focus=\"onNativeFocus\"\n                    @blur=\"onNativeBlur\"\n                    @invalid=\"onInvalid\"\n                    @icon-click=\"$emit('icon-click', $event)\"\n                    @icon-right-click=\"$emit('icon-right-click', $event)\" />\n            </slot>\n        </template>\n    </div>\n</template>\n","<script setup lang=\"ts\">\nimport {\n    computed,\n    useAttrs,\n    ref,\n    watch,\n    nextTick,\n    useTemplateRef,\n    type PropType,\n} from \"vue\";\n\nimport ODropdown from \"../dropdown/Dropdown.vue\";\nimport ODropdownItem from \"../dropdown/DropdownItem.vue\";\nimport OInput from \"../input/Input.vue\";\n\nimport { isDate, isDefined, isMobileAgent, isTrueish } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    getActiveClasses,\n    useEventListener,\n    useInputHandler,\n} from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { ClassBinding, ComponentClass } from \"@/types\";\n\n/**\n * This is a internal used component.\n * Used by Datepicker and Timepicker.\n */\ndefineOptions({\n    name: \"OPickerWrapper\",\n});\n\nconst props = defineProps({\n    /** the internal input value */\n    value: {\n        type: [Date, Array] as PropType<Date | Date[] | undefined>,\n        default: undefined,\n    },\n    /** the active state of the dropdown */\n    active: { type: Boolean, default: false },\n    /** parent picker component props  */\n    pickerProps: { type: Object, required: true },\n    /** data-oruga attribute value */\n    dataOruga: { type: String, required: true },\n    /** format props value to input value */\n    formatter: {\n        type: Function as PropType<\n            (value: Date | Date[] | undefined, isNative: boolean) => string\n        >,\n        required: true,\n    },\n    /** parse input value to props value */\n    parser: {\n        type: Function as PropType<\n            (value: string, isNative: boolean) => Date | Date[] | undefined\n        >,\n        required: true,\n    },\n    type: { type: String, required: true },\n    step: { type: String, default: undefined },\n    min: { type: Date, default: undefined },\n    max: { type: Date, default: undefined },\n    stayOpen: { type: Boolean, default: false },\n    /** the DateTimeFormat object to watch for to update the parsed input value */\n    dtf: { type: Object, default: undefined },\n    rootClasses: { type: Array as PropType<ClassBinding[]>, required: true },\n    dropdownClasses: {\n        type: Array as PropType<ClassBinding[]>,\n        required: true,\n    },\n    boxClass: { type: Array as PropType<ComponentClass>, required: true },\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {Date, Date[]} - updated active prop\n     */\n    \"update:value\": [value: Date | Date[] | undefined];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /** on input focus event */\n    focus: [event: Event];\n    /** on input blur event */\n    blur: [event: Event];\n    /** on input invalid event */\n    invalid: [event: Event];\n    /** on icon click event */\n    \"icon-click\": [event: Event];\n    /** on icon right click event */\n    \"icon-right-click\": [event: Event];\n    /** on dropdown left button press event */\n    left: [event: Event];\n    /** on dropdown right button press event */\n    right: [event: Event];\n}>();\n\nconst isMobileNative = computed(\n    () =>\n        !isTrueish(props.pickerProps.inline) &&\n        isTrueish(props.pickerProps.mobileNative) &&\n        isMobileAgent.any(),\n);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\nconst dropdownRef = useTemplateRef(\"dropdownComponent\");\nconst inputRef = useTemplateRef(\"inputComponent\");\nconst nativeInputRef = useTemplateRef(\"nativeInputComponent\");\n\nconst elementRef = computed(() =>\n    isMobileNative.value ? nativeInputRef.value : inputRef.value,\n);\n\n// use form input functionality for native input\nconst {\n    input,\n    checkHtml5Validity,\n    setFocus,\n    onBlur,\n    onFocus,\n    onInvalid,\n    isValid,\n} = useInputHandler<HTMLInputElement>(elementRef, emits, props.pickerProps);\n\n/**\n * Show input as text for placeholder,\n * when placeholder and no native value is given.\n */\nconst initialNativeType =\n    !isDefined(props.pickerProps.placeholder) || isTrueish(props.value)\n        ? props.type\n        : \"text\";\n\n/** the v-model value of the input */\nconst inputValue = ref(\"\");\n\n/**\n * When v-model is changed:\n *  1. Update internal value.\n *  2. Close picker.\n *  3. If it's invalid, validate again.\n */\nwatch(\n    () => props.value,\n    (value) => {\n        // update internal value\n        inputValue.value = props.formatter(value, isMobileNative.value);\n\n        // toggle picker if not stay open\n        if (!isMobileNative.value && !props.stayOpen) togglePicker(false);\n        // validate if its invalid\n        if (!isValid.value) checkHtml5Validity();\n    },\n    { immediate: true },\n);\n\n// update the parsed input value when the dtf change\nwatch(\n    () => props.dtf,\n    () => setValue(inputValue.value),\n);\n\n/** Set the vmodel value and update the prop value */\nfunction setValue(value: string): void {\n    // parse to date\n    let date = props.parser(value, isMobileNative.value);\n\n    // check min/max dates\n    if (Array.isArray(date)) date = date.map(checkMinMaxDate);\n    else if (isDefined(date)) date = checkMinMaxDate(date);\n\n    nextTick(\n        () =>\n            // reparse to string for internal value\n            (inputValue.value = props.formatter(date, isMobileNative.value)),\n    );\n\n    // update the prop value\n    emits(\"update:value\", date);\n}\n\nfunction checkMinMaxDate(date: Date): Date {\n    if (!isDate(date)) return date;\n    if (props.min && date < props.min) date = props.min;\n    else if (props.max && date > props.max) date = props.max;\n    return date;\n}\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nwatch(isActive, onActiveChange);\n\nif (isClient) useEventListener(document, \"keyup\", onKeyup);\n\n/** Keypress event that is bound to the document. */\nfunction onKeyup(event: KeyboardEvent): void {\n    if (!isActive.value) return;\n    if (event.key === \"Escape\" || event.key === \"Esc\") togglePicker(false);\n}\n\n// --- PICKER EVENT HANDLER ---\n\n/** Toggle picker */\nfunction togglePicker(active: boolean): void {\n    if (!dropdownRef.value) return;\n    if (active || isTrueish(props.pickerProps.closeOnClick))\n        nextTick(() => (isActive.value = active));\n}\n\n/** Avoid dropdown toggle when is already visible */\nfunction onInputClick(event): void {\n    if (isActive.value) event.stopPropagation();\n}\n\n/** Emit 'blur' event on dropdown is not active (closed) */\nfunction onActiveChange(value: boolean): void {\n    if (value) onFocus();\n    else if (!value) onBlur();\n}\n\n// --- NATIVE EVENT HANDLER ---\n\nfunction onChange(event: Event): void {\n    setValue((event.target as HTMLInputElement).value);\n}\n\nfunction onNativeClick(event: Event): void {\n    // do nothing if client is not mobile\n    if (!isMobileNative.value || !input.value) return;\n\n    // when input is not editable jet\n    if (input.value.type === \"text\") {\n        event.preventDefault();\n        event.stopPropagation();\n\n        // blur the current state to remove active native keyboards for type 'text'\n        input.value.blur();\n\n        setTimeout(() => {\n            if (!input.value) return;\n            // make the input editable\n            input.value.readOnly = false;\n            input.value.type = props.type;\n\n            // focus the underlaying input element again to open native keyboards for type 'date'\n            setFocus();\n        }, 50);\n    }\n}\n\nfunction onNativeFocus(event: Event): void {\n    // do nothing if client is not mobile\n    if (!isMobileNative.value || !input.value) return;\n\n    // when input is not editable jet\n    if (input.value.type === \"text\") {\n        // prevent focus\n        event.preventDefault();\n        event.stopPropagation();\n    }\n    // only emit focus event if editable\n    else onFocus(event);\n}\n\nfunction onNativeBlur(event: Event): void {\n    // do nothing if client is not mobile\n    if (!isMobileNative.value || !input.value) return;\n\n    // when the input does not have any value\n    if (!input.value.value) {\n        // make the input uneditable\n        input.value.readOnly = true;\n        input.value.type = \"text\";\n    }\n    // emit blur event\n    onBlur(event);\n}\n\nfunction onNativeChange(event: Event): void {\n    const value = (event.target as HTMLInputElement).value\n        ? (event.target as HTMLInputElement).value\n        : \"\";\n\n    // when the input does not have any value\n    if (!value && input.value) {\n        input.value.value = value;\n        input.value.blur();\n    }\n\n    setValue(value);\n}\n\n// --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n    inputClass: props.pickerProps.inputClass,\n    ...props.pickerProps.inputClasses,\n}));\n\nconst dropdownBind = computed(() => ({\n    \"root-class\": getActiveClasses(props.dropdownClasses),\n    \"teleport-class\": getActiveClasses(props.rootClasses),\n    ...props.pickerProps.dropdownClasses,\n}));\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus });\n</script>\n\n<template>\n    <div :data-oruga=\"dataOruga\" :class=\"rootClasses\" @click=\"onNativeClick\">\n        <o-dropdown\n            v-if=\"!isMobileNative\"\n            ref=\"dropdownComponent\"\n            v-bind=\"dropdownBind\"\n            v-model:active=\"isActive\"\n            :open-on-click=\"pickerProps.openOnFocus\"\n            :position=\"pickerProps.position\"\n            :disabled=\"pickerProps.disabled\"\n            :inline=\"pickerProps.inline\"\n            :mobile-modal=\"pickerProps.mobileModal\"\n            :desktop-modal=\"pickerProps.desktopModal\"\n            :mobile-breakpoint=\"pickerProps.mobileBreakpoint\"\n            :teleport=\"pickerProps.teleport\">\n            <template v-if=\"!pickerProps.inline\" #trigger>\n                <slot name=\"trigger\">\n                    <o-input\n                        ref=\"inputComponent\"\n                        v-bind=\"inputBind\"\n                        v-model=\"inputValue\"\n                        :placeholder=\"pickerProps.placeholder\"\n                        :size=\"pickerProps.size\"\n                        :icon-pack=\"pickerProps.iconPack\"\n                        :icon=\"pickerProps.icon\"\n                        :icon-right=\"pickerProps.iconRight\"\n                        :icon-right-clickable=\"pickerProps.iconRightClickable\"\n                        :expanded=\"pickerProps.expanded\"\n                        :rounded=\"pickerProps.rounded\"\n                        :disabled=\"pickerProps.disabled\"\n                        :readonly=\"pickerProps.readonly\"\n                        autocomplete=\"off\"\n                        :use-html5-validation=\"false\"\n                        @invalid=\"onInvalid\"\n                        @click=\"onInputClick\"\n                        @keyup.enter=\"togglePicker(true)\"\n                        @change=\"onChange\"\n                        @focus=\"onFocus\"\n                        @blur=\"onBlur\"\n                        @icon-click=\"$emit('icon-click', $event)\"\n                        @icon-right-click=\"$emit('icon-right-click', $event)\" />\n                </slot>\n            </template>\n\n            <o-dropdown-item\n                override\n                tag=\"div\"\n                :item-class=\"boxClass\"\n                :disabled=\"pickerProps.disabled\"\n                :clickable=\"false\"\n                @keydown.left=\"$emit('left', $event)\"\n                @keydown.right=\"$emit('right', $event)\">\n                <slot />\n            </o-dropdown-item>\n        </o-dropdown>\n\n        <!-- Native Picker -->\n        <template v-else>\n            <slot name=\"trigger\">\n                <o-input\n                    ref=\"nativeInputComponent\"\n                    v-bind=\"inputBind\"\n                    v-model=\"inputValue\"\n                    :type=\"initialNativeType\"\n                    :min=\"formatter(min, true)\"\n                    :max=\"formatter(max, true)\"\n                    :step=\"step\"\n                    :placeholder=\"pickerProps.placeholder\"\n                    :size=\"pickerProps.size\"\n                    :icon-pack=\"pickerProps.iconPack\"\n                    :icon=\"pickerProps.icon\"\n                    :icon-right=\"pickerProps.iconRight\"\n                    :icon-right-clickable=\"pickerProps.iconRightClickable\"\n                    :rounded=\"pickerProps.rounded\"\n                    :disabled=\"pickerProps.disabled\"\n                    :readonly=\"initialNativeType == 'text'\"\n                    autocomplete=\"off\"\n                    :use-html5-validation=\"false\"\n                    @change=\"onNativeChange\"\n                    @focus=\"onNativeFocus\"\n                    @blur=\"onNativeBlur\"\n                    @invalid=\"onInvalid\"\n                    @icon-click=\"$emit('icon-click', $event)\"\n                    @icon-right-click=\"$emit('icon-right-click', $event)\" />\n            </slot>\n        </template>\n    </div>\n</template>\n","type MonthType =\n    | \"numeric\"\n    | \"2-digit\"\n    | \"long\"\n    | \"short\"\n    | \"narrow\"\n    | undefined;\n\n/**\n * Return month names according to a specified locale\n * @param  {String} locale A bcp47 localerouter. undefined will use the user browser locale\n * @param  {String} format long (ex. March), short (ex. Mar) or narrow (M)\n * @return {Array<String>} An array of month names\n */\nexport function getMonthNames(\n    locale?: string,\n    format: MonthType = \"long\",\n): string[] {\n    const dates: Date[] = [];\n    for (let i = 0; i < 12; i++) {\n        dates.push(new Date(2000, i, 15));\n    }\n    const dtf = new Intl.DateTimeFormat(locale, {\n        month: format,\n    });\n    return dates.map((d) => dtf.format(d));\n}\n\ntype WeekdayType = \"long\" | \"short\" | \"narrow\" | undefined;\n\n/**\n * Return weekday names according to a specified locale\n * @param  {String} locale A bcp47 localerouter. undefined will use the user browser locale\n * @param  {Number} first day of week index\n * @param  {String} format long (ex. Thursday), short (ex. Thu) or narrow (T)\n * @return {Array<String>} An array of weekday names\n */\nexport function getWeekdayNames(\n    locale?: string,\n    firstDayOfWeek: number = 0,\n    format: WeekdayType = \"narrow\",\n): string[] {\n    const dates: Date[] = [];\n    for (let i = 1, j = 0; j < 7; i++) {\n        const d = new Date(2000, 0, i);\n        const day = d.getDay();\n        if (day === firstDayOfWeek || j > 0) {\n            dates.push(d);\n            j++;\n        }\n    }\n    const dtf = new Intl.DateTimeFormat(locale, {\n        weekday: format,\n    });\n    return dates.map((d) => dtf.format(d));\n}\n\n/**\n * Accept a regex with group names and return an object\n * ex. matchWithGroups(/((?!=<year>)\\d+)\\/((?!=<month>)\\d+)\\/((?!=<day>)\\d+)/, '2000/12/25')\n * will return { year: 2000, month: 12, day: 25 }\n * @param  {String} includes injections of (?!={groupname}) for each group\n * @param  {String} the string to run regex\n * @return {Object} an object with a property for each group having the group's match as the value\n */\nexport function matchWithGroups(pattern: string, str: string): any {\n    const matches = str.match(pattern);\n    return (\n        // get the pattern as a string\n        pattern\n            .toString()\n            // suss out the groups\n            .match(/<(.+?)>/g)\n            // remove the braces\n            ?.map((group) => {\n                const groupMatches = group.match(/<(.+)>/);\n                if (!groupMatches || groupMatches.length <= 0) {\n                    return null;\n                }\n                const match = group.match(/<(.+)>/);\n                return match && match?.length > 1 ? match[1] : null;\n            })\n            // create an object with a property for each group having the group's match as the value\n            .reduce((acc, curr, index) => {\n                if (curr === null) return acc;\n                if (matches && matches.length > index) {\n                    acc[curr] = matches[index + 1];\n                } else {\n                    acc[curr] = null;\n                }\n                return acc;\n            }, {} as any)\n    );\n}\n\n/** Return array of all days in the week that the startingDate is within */\nexport function weekBuilder(\n    startingDate: number,\n    month: number,\n    year: number,\n    firstDayOfWeek: number,\n): Date[] {\n    const thisMonth = new Date(year, month);\n\n    const thisWeek: Date[] = [];\n\n    const dayOfWeek = new Date(year, month, startingDate).getDay();\n\n    const end =\n        dayOfWeek >= firstDayOfWeek\n            ? dayOfWeek - firstDayOfWeek\n            : 7 - firstDayOfWeek + dayOfWeek;\n\n    let daysAgo = 1;\n    for (let i = 0; i < end; i++) {\n        thisWeek.unshift(\n            new Date(\n                thisMonth.getFullYear(),\n                thisMonth.getMonth(),\n                startingDate - daysAgo,\n            ),\n        );\n        daysAgo++;\n    }\n\n    thisWeek.push(new Date(year, month, startingDate));\n\n    let daysForward = 1;\n    while (thisWeek.length < 7) {\n        thisWeek.push(new Date(year, month, startingDate + daysForward));\n        daysForward++;\n    }\n\n    return thisWeek;\n}\n\nexport function firstWeekOffset(year, dow, doy): number {\n    // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n    const fwd = 7 + dow - doy;\n    // first-week day local weekday -- which local weekday is fwd\n    const firstJanuary = new Date(year, 0, fwd);\n    const fwdlw = (7 + firstJanuary.getDay() - dow) % 7;\n    return -fwdlw + fwd - 1;\n}\n\n/** Return the number of days in a specific year */\nexport function daysInYear(year): number {\n    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 ? 366 : 365;\n}\n\n/** Return the number of weeks in a specific year */\nexport function weeksInYear(year, dow, doy): number {\n    const weekOffset = firstWeekOffset(year, dow, doy);\n    const weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n}\n","import { computed } from \"vue\";\nimport { matchWithGroups } from \"./utils\";\nimport { isTrueish } from \"@/utils/helpers\";\nimport type { DatepickerProps } from \"./props\";\n\n/** Time Format Feature */\nexport function useDatepickerMixins<R extends boolean, M extends boolean>(\n    props: DatepickerProps<R, M>,\n) {\n    /**\n     * Check that selected date is within earliest/latest params and\n     * is within a given month\n     */\n    function isDateSelectable(date: Date, month: number): boolean {\n        const validity: boolean[] = [];\n\n        if (props.minDate) validity.push(date >= props.minDate);\n        if (props.maxDate) validity.push(date <= props.maxDate);\n\n        if (props.nearbyMonthDays && !props.nearbySelectableMonthDays)\n            validity.push(date.getMonth() === month);\n\n        if (props.selectableDates) {\n            if (typeof props.selectableDates === \"function\") {\n                if (props.selectableDates(date)) return true;\n                else validity.push(false);\n            } else {\n                for (let i = 0; i < props.selectableDates.length; i++) {\n                    const enabledDate = props.selectableDates[i];\n                    if (\n                        date.getDate() === enabledDate.getDate() &&\n                        date.getFullYear() === enabledDate.getFullYear() &&\n                        date.getMonth() === enabledDate.getMonth()\n                    )\n                        return true;\n                    else validity.push(false);\n                }\n            }\n        }\n\n        if (props.unselectableDates) {\n            if (typeof props.unselectableDates === \"function\") {\n                validity.push(!props.unselectableDates(date));\n            } else {\n                for (let i = 0; i < props.unselectableDates.length; i++) {\n                    const disabledDate = props.unselectableDates[i];\n                    validity.push(\n                        date.getDate() !== disabledDate.getDate() ||\n                            date.getFullYear() !== disabledDate.getFullYear() ||\n                            date.getMonth() !== disabledDate.getMonth(),\n                    );\n                }\n            }\n        }\n\n        if (props.unselectableDaysOfWeek) {\n            for (let i = 0; i < props.unselectableDaysOfWeek.length; i++) {\n                const dayOfWeek = props.unselectableDaysOfWeek[i];\n                validity.push(date.getDay() !== dayOfWeek);\n            }\n        }\n\n        return validity.indexOf(false) < 0;\n    }\n\n    const isTypeMonth = computed(() => props.type === \"month\");\n\n    const localeOptions = computed(\n        () =>\n            new Intl.DateTimeFormat(props.locale, {\n                year: \"numeric\",\n                month: \"numeric\",\n            }).resolvedOptions() as Intl.DateTimeFormatOptions,\n    );\n\n    /** DateTime Format */\n    const dtf = computed(\n        () => new Intl.DateTimeFormat(props.locale /*, { timeZone: 'UTC' }*/),\n    );\n\n    /** DateTime Month Format */\n    const dtfMonth = computed(\n        () =>\n            new Intl.DateTimeFormat(props.locale, {\n                year: localeOptions.value.year || \"numeric\",\n                month: localeOptions.value.month || \"2-digit\",\n                // timeZone: 'UTC'\n            }),\n    );\n\n    const sampleTime = computed(() => {\n        const d = dateCreator();\n        d.setHours(10);\n        d.setSeconds(0);\n        d.setMinutes(0);\n        d.setMilliseconds(0);\n        return d;\n    });\n\n    function dateCreator(): Date {\n        if (typeof props.creator === \"function\") {\n            const r = props.creator();\n            if (r instanceof Date) return r;\n        }\n        return new Date();\n    }\n\n    /** Format date into string */\n    function dateFormatter(date: typeof props.modelValue): string {\n        if (typeof props.formatter === \"function\") {\n            const r = props.formatter(date);\n            if (typeof r === \"string\") return r;\n        }\n\n        if (!date) return \"\";\n        const targetDates: Date[] = Array.isArray(date) ? date : [date];\n        if (!targetDates.length) return \"\";\n        const dates = targetDates.map((date) => {\n            const d = new Date(\n                date.getFullYear(),\n                date.getMonth(),\n                date.getDate(),\n                12,\n            );\n            return !isTypeMonth.value\n                ? dtf.value.format(d)\n                : dtfMonth.value.format(d);\n        });\n\n        return !isTrueish(props.multiple) && !isTrueish(props.range)\n            ? dates.join(\" - \")\n            : dates.join(\", \");\n    }\n\n    /** Parse a string into a date */\n    function dateParser(date: string): typeof props.modelValue {\n        if (typeof props.parser === \"function\") {\n            const r = props.parser(date);\n            if (r !== undefined) return r;\n        }\n\n        if (!date) return undefined;\n        const isArray = isTrueish(props.multiple) || isTrueish(props.range);\n        const targetDates = !isArray ? [date] : date.split(\", \");\n        const dates = targetDates.map((date) => {\n            if (\n                dtf.value.formatToParts &&\n                typeof dtf.value.formatToParts === \"function\"\n            ) {\n                const formatRegex = (\n                    isTypeMonth.value ? dtfMonth.value : dtf.value\n                )\n                    .formatToParts(sampleTime.value)\n                    .map((part) => {\n                        if (part.type === \"literal\") return part.value;\n                        return `((?!=<${part.type}>)\\\\d+)`;\n                    })\n                    .join(\"\");\n                const dateGroups = matchWithGroups(formatRegex, date);\n\n                // We do a simple validation for the group.\n                // If it is not valid, it will fallback to Date.parse below\n                if (\n                    dateGroups.year &&\n                    dateGroups.year.length === 4 &&\n                    dateGroups.month &&\n                    dateGroups.month <= 12\n                ) {\n                    if (isTypeMonth.value)\n                        return new Date(dateGroups.year, dateGroups.month - 1);\n                    else if (dateGroups.day && dateGroups.day <= 31) {\n                        return new Date(\n                            dateGroups.year,\n                            dateGroups.month - 1,\n                            dateGroups.day,\n                            12,\n                        );\n                    }\n                }\n            }\n            // Fallback if formatToParts is not supported or if we were not able to parse a valid date\n            if (!isTypeMonth.value) return new Date(Date.parse(date));\n            const s = date.split(\"/\");\n            const year = s[0].length === 4 ? s[0] : s[1];\n            const month = s[0].length === 2 ? s[0] : s[1];\n            if (year && month) {\n                return new Date(\n                    parseInt(year, 10),\n                    parseInt(month, 10) - 1,\n                    1,\n                    0,\n                    0,\n                    0,\n                    0,\n                );\n            }\n        });\n        return (isArray ? dates : dates[0]) as typeof props.modelValue;\n    }\n\n    return {\n        dtf,\n        isDateSelectable,\n        dateCreator,\n        dateParser,\n        dateFormatter,\n    };\n}\n","<script\n    setup\n    lang=\"ts\"\n    generic=\"IsRange extends boolean, IsMultiple extends boolean\">\nimport {\n    computed,\n    watch,\n    nextTick,\n    ref,\n    effectScope,\n    onUnmounted,\n    type PropType,\n    type ComponentPublicInstance,\n} from \"vue\";\n\nimport { defineClasses } from \"@/composables\";\nimport { isTrueish } from \"@/utils/helpers\";\n\nimport { useDatepickerMixins } from \"./useDatepickerMixins\";\nimport { weeksInYear, firstWeekOffset } from \"./utils\";\n\nimport type { DatepickerEvent } from \"./types\";\nimport type { DatepickerProps } from \"./props\";\nimport type { ClassBinding } from \"@/types\";\n\ndefineOptions({\n    name: \"ODatepickerTableRow\",\n    configField: \"datepicker\",\n});\n\nconst props = defineProps({\n    day: { type: Number, required: true },\n    week: { type: Array as PropType<Date[]>, required: true },\n    month: { type: Number, required: true },\n    selectedDate: {\n        type: [Date, Array] as PropType<Date | Date[]>,\n        default: undefined,\n    },\n    events: { type: Array as PropType<DatepickerEvent[]>, required: true },\n    hoveredDateRange: { type: Array as PropType<Date[]>, required: true },\n    pickerProps: {\n        type: Object as PropType<DatepickerProps<IsRange, IsMultiple>>,\n        required: true,\n    },\n});\n\nconst emits = defineEmits<{\n    select: [value: Date];\n    \"hover-enddate\": [value: Date];\n    \"change-focus\": [value: Date];\n    \"week-number-click\": [value: number];\n}>();\n\nconst { isDateSelectable, dateCreator } = useDatepickerMixins(\n    props.pickerProps,\n);\n\nconst hasEvents = computed(() => !!props.events.length);\n\nconst dayRefs = ref(new Map());\n\nfunction setDayRef(\n    date: Date,\n    el: Element | ComponentPublicInstance | null,\n): void {\n    const refKey = `day-${date.getMonth()}-${date.getDate()}`;\n    if (el) dayRefs.value.set(refKey, el);\n}\n\nwatch(\n    () => props.day,\n    (day) => {\n        // if day is in week\n        if (props.week.map((d) => d.getDate()).includes(day))\n            nextTick(() => {\n                // $nextTick is needed when month is changed\n                const refKey = `day-${props.month}-${day}`;\n                const ref = dayRefs.value.get(refKey);\n                if (ref) ref.focus();\n            });\n    },\n);\n\nwatch(\n    () => props.month,\n    // clear day refs on month change\n    () => (dayRefs.value = new Map()),\n);\n\nfunction clickWeekNumber(week: number): void {\n    if (props.pickerProps.weekNumberClickable) emits(\"week-number-click\", week);\n}\n\nfunction getDayOfYear(input: Date): number {\n    return (\n        Math.round(\n            (input.getTime() - new Date(input.getFullYear(), 0, 1).getTime()) /\n                864e5,\n        ) + 1\n    );\n}\n\nfunction getWeekNumber(day: Date): number {\n    const dow = props.pickerProps.firstDayOfWeek; // first day of week\n    // Rules for the first week : 1 for the 1st January, 4 for the 4th January\n    const doy = props.pickerProps.rulesForFirstWeek;\n    const weekOffset = firstWeekOffset(day.getFullYear(), dow, doy);\n    const week = Math.floor((getDayOfYear(day) - weekOffset - 1) / 7) + 1;\n\n    if (week < 1) {\n        const resYear = day.getFullYear() - 1;\n        return week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(day.getFullYear(), dow, doy)) {\n        return week - weeksInYear(day.getFullYear(), dow, doy);\n    } else {\n        return week;\n    }\n}\n\nfunction eventsDateMatch(day: Date): DatepickerEvent[] {\n    if (!props.events?.length) return [];\n    return props.events.filter((event) => event.date.getDay() === day.getDay());\n}\n\n// --- Event Handlers ---\n\nfunction onKeydown(event: KeyboardEvent, weekDay: Date): void {\n    let preventDefault = true;\n    switch (event.key) {\n        case \"Tab\": {\n            preventDefault = false;\n            break;\n        }\n        case \" \":\n        case \"Space\":\n        case \"Spacebar\":\n        case \"Enter\": {\n            selectDate(weekDay);\n            break;\n        }\n\n        case \"ArrowLeft\":\n        case \"Left\": {\n            changeFocus(weekDay, -1);\n            break;\n        }\n        case \"ArrowRight\":\n        case \"Right\": {\n            changeFocus(weekDay, 1);\n            break;\n        }\n        case \"ArrowUp\":\n        case \"Up\": {\n            changeFocus(weekDay, -7);\n            break;\n        }\n        case \"ArrowDown\":\n        case \"Down\": {\n            changeFocus(weekDay, 7);\n            break;\n        }\n    }\n    if (preventDefault) event.preventDefault();\n}\n\n/** Emit select event with chosen date as payload */\nfunction selectDate(date: Date): void {\n    if (props.pickerProps.disabled || props.pickerProps.readonly) return;\n    if (isDateSelectable(date, props.month)) emits(\"select\", date);\n}\n\nfunction changeFocus(day, inc): void {\n    const nextDay = new Date(day.getTime());\n    nextDay.setDate(day.getDate() + inc);\n    // if next day is out of range or not selectable, move to next selectable date\n    while (\n        (props.pickerProps.minDate && nextDay < props.pickerProps.minDate) ||\n        (props.pickerProps.maxDate && nextDay > props.pickerProps.maxDate) ||\n        !isDateSelectable(nextDay, nextDay.getMonth())\n    ) {\n        // revert day selection until selectable day is reached\n        nextDay.setDate(nextDay.getDate() - Math.sign(inc));\n    }\n    setRangeHoverEndDate(nextDay);\n    emits(\"change-focus\", nextDay);\n}\n\nfunction setRangeHoverEndDate(day): void {\n    if (isTrueish(props.pickerProps.range)) emits(\"hover-enddate\", day);\n}\n\n// #region --- Computed Component Classes ---\n\nfunction dateMatch(\n    dateOne: Date,\n    dateTwo?: Date | Date[],\n    multiple = false,\n): boolean {\n    // if either date is null or undefined, return false\n    // if using multiple flag, return false\n    if (!dateOne || !dateTwo || multiple) return false;\n\n    if (Array.isArray(dateTwo))\n        return dateTwo.some(\n            (date) =>\n                dateOne.getDate() === date.getDate() &&\n                dateOne.getFullYear() === date.getFullYear() &&\n                dateOne.getMonth() === date.getMonth(),\n        );\n\n    return (\n        dateOne.getDate() === dateTwo.getDate() &&\n        dateOne.getFullYear() === dateTwo.getFullYear() &&\n        dateOne.getMonth() === dateTwo.getMonth()\n    );\n}\n\nfunction dateWithin(\n    dateOne: Date,\n    dates?: Date | Date[],\n    multiple = false,\n): boolean {\n    if (!Array.isArray(dates) || multiple) return false;\n    return dateOne > dates[0] && dateOne < dates[1];\n}\n\nconst scope = effectScope();\n\n// stop all scope effects\nonUnmounted(() => scope.stop());\n\n/** Build cellClasses for cell using validations */\nfunction cellClasses(day: Date): ClassBinding[] {\n    const classes = defineClasses(\n        [\n            \"tableCellSelectedClass\",\n            \"o-datepicker__table__cell--selected\",\n            null,\n            dateMatch(day, props.selectedDate) ||\n                dateWithin(\n                    day,\n                    props.selectedDate,\n                    isTrueish(props.pickerProps.multiple),\n                ),\n        ],\n        [\n            \"tableCellFirstSelectedClass\",\n            \"o-datepicker__table__cell--first-selected\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.selectedDate)\n                    ? props.selectedDate[0]\n                    : undefined,\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"tableCellWithinSelectedClass\",\n            \"o-datepicker__table__cell--within-selected\",\n            null,\n            dateWithin(\n                day,\n                props.selectedDate,\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"tableCellLastSelectedClass\",\n            \"o-datepicker__table__cell--last-selected\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.selectedDate)\n                    ? props.selectedDate[1]\n                    : undefined,\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"tableCellFirstHoveredClass\",\n            \"o-datepicker__table__cell--first-hovered\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.hoveredDateRange)\n                    ? props.hoveredDateRange[0]\n                    : undefined,\n            ),\n        ],\n        [\n            \"tableCellWithinHoveredClass\",\n            \"o-datepicker__table__cell--within-hovered\",\n            null,\n            dateWithin(day, props.hoveredDateRange),\n        ],\n        [\n            \"tableCellLastHoveredClass\",\n            \"o-datepicker__table__cell--last-hovered\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.hoveredDateRange)\n                    ? props.hoveredDateRange[1]\n                    : undefined,\n            ),\n        ],\n        [\n            \"tableCellTodayClass\",\n            \"o-datepicker__table__cell--today\",\n            null,\n            dateMatch(day, dateCreator()),\n        ],\n        [\n            \"tableCellSelectableClass\",\n            \"o-datepicker__table__cell--selectable\",\n            null,\n            isDateSelectable(day, props.month) &&\n                !props.pickerProps.disabled &&\n                !props.pickerProps.readonly,\n        ],\n        [\n            \"tableCellUnselectableClass\",\n            \"o-datepicker__table__cell--unselectable\",\n            null,\n            !isDateSelectable(day, props.month) || props.pickerProps.disabled,\n        ],\n        [\n            \"tableCellInvisibleClass\",\n            \"o-datepicker__table__cell--invisible\",\n            null,\n            !props.pickerProps.nearbyMonthDays &&\n                day.getMonth() !== props.month,\n        ],\n        [\n            \"tableCellNearbyClass\",\n            \"o-datepicker__table__cell--nearby\",\n            null,\n            props.pickerProps.nearbySelectableMonthDays &&\n                day.getMonth() !== props.month,\n        ],\n        // pass effect scope for rectivity binding\n        { scope },\n    );\n\n    return [\n        ...tableCellClasses.value,\n        ...cellEventsClass.value,\n        ...classes.value,\n    ];\n}\n\nfunction eventClasses(event: DatepickerEvent): ClassBinding[] {\n    const classes = defineClasses(\n        [\"tableEventClass\", \"o-datepicker__table__event\"],\n        [\n            \"tableEventVariantClass\",\n            \"o-datepicker__table__event--\",\n            event.type,\n            !!event.type,\n        ],\n        [\n            \"tableEventIndicatorClass\",\n            \"o-datepicker__table__event--\",\n            props.pickerProps.indicators,\n            !!props.pickerProps.indicators,\n        ],\n        // pass effect scope for rectivity binding\n        { scope },\n    );\n    return classes.value;\n}\n\nconst tableRowClasses = defineClasses(\n    [\"tableRowClass\", \"o-datepicker__table__row\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableCellClasses = defineClasses(\n    [\"tableCellClass\", \"o-datepicker__table__cell\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableEventsClasses = defineClasses(\n    [\"tableEventsClass\", \"o-datepicker__table__events\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst cellEventsClass = defineClasses(\n    [\n        \"tableCellEventsClass\",\n        \"o-datepicker__table__cell--events\",\n        null,\n        hasEvents,\n    ],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div :class=\"tableRowClasses\">\n        <div\n            v-if=\"pickerProps.showWeekNumber\"\n            :class=\"tableCellClasses\"\n            :style=\"{\n                cursor: pickerProps.weekNumberClickable ? 'pointer' : 'auto',\n            }\"\n            :tabindex=\"pickerProps.weekNumberClickable ? 0 : undefined\"\n            role=\"button\"\n            @click.prevent=\"clickWeekNumber(getWeekNumber(week[6]))\"\n            @keydown.enter.prevent=\"clickWeekNumber(getWeekNumber(week[6]))\">\n            <span>{{ getWeekNumber(week[6]) }}</span>\n        </div>\n\n        <template v-for=\"(weekDay, idx) in week\" :key=\"idx\">\n            <div\n                v-if=\"\n                    !pickerProps.disabled &&\n                    !pickerProps.readonly &&\n                    isDateSelectable(weekDay, month)\n                \"\n                :ref=\"(el) => setDayRef(weekDay, el)\"\n                :class=\"cellClasses(weekDay)\"\n                role=\"button\"\n                :tabindex=\"\n                    day === weekDay.getDate() && month === weekDay.getMonth()\n                        ? undefined\n                        : 0\n                \"\n                @click.prevent=\"selectDate(weekDay)\"\n                @mouseenter=\"setRangeHoverEndDate(weekDay)\"\n                @focus=\"setRangeHoverEndDate(weekDay)\"\n                @keydown.enter.prevent=\"onKeydown($event, weekDay)\">\n                <span>{{ weekDay.getDate() }}</span>\n                <div\n                    v-if=\"eventsDateMatch(weekDay).length\"\n                    :class=\"tableEventsClasses\">\n                    <div\n                        v-for=\"(event, index) in eventsDateMatch(weekDay)\"\n                        :key=\"index\"\n                        :class=\"eventClasses(event)\" />\n                </div>\n            </div>\n\n            <div v-else :class=\"cellClasses(weekDay)\">\n                <span>{{ weekDay.getDate() }}</span>\n                <div\n                    v-if=\"eventsDateMatch(weekDay).length\"\n                    :class=\"tableEventsClasses\">\n                    <div\n                        v-for=\"(event, index) in eventsDateMatch(weekDay)\"\n                        :key=\"index\"\n                        :class=\"eventClasses(event)\" />\n                </div>\n            </div>\n        </template>\n    </div>\n</template>\n","<script\n    setup\n    lang=\"ts\"\n    generic=\"IsRange extends boolean, IsMultiple extends boolean\">\nimport {\n    computed,\n    watch,\n    nextTick,\n    ref,\n    effectScope,\n    onUnmounted,\n    type PropType,\n    type ComponentPublicInstance,\n} from \"vue\";\n\nimport { defineClasses } from \"@/composables\";\nimport { isTrueish } from \"@/utils/helpers\";\n\nimport { useDatepickerMixins } from \"./useDatepickerMixins\";\nimport { weeksInYear, firstWeekOffset } from \"./utils\";\n\nimport type { DatepickerEvent } from \"./types\";\nimport type { DatepickerProps } from \"./props\";\nimport type { ClassBinding } from \"@/types\";\n\ndefineOptions({\n    name: \"ODatepickerTableRow\",\n    configField: \"datepicker\",\n});\n\nconst props = defineProps({\n    day: { type: Number, required: true },\n    week: { type: Array as PropType<Date[]>, required: true },\n    month: { type: Number, required: true },\n    selectedDate: {\n        type: [Date, Array] as PropType<Date | Date[]>,\n        default: undefined,\n    },\n    events: { type: Array as PropType<DatepickerEvent[]>, required: true },\n    hoveredDateRange: { type: Array as PropType<Date[]>, required: true },\n    pickerProps: {\n        type: Object as PropType<DatepickerProps<IsRange, IsMultiple>>,\n        required: true,\n    },\n});\n\nconst emits = defineEmits<{\n    select: [value: Date];\n    \"hover-enddate\": [value: Date];\n    \"change-focus\": [value: Date];\n    \"week-number-click\": [value: number];\n}>();\n\nconst { isDateSelectable, dateCreator } = useDatepickerMixins(\n    props.pickerProps,\n);\n\nconst hasEvents = computed(() => !!props.events.length);\n\nconst dayRefs = ref(new Map());\n\nfunction setDayRef(\n    date: Date,\n    el: Element | ComponentPublicInstance | null,\n): void {\n    const refKey = `day-${date.getMonth()}-${date.getDate()}`;\n    if (el) dayRefs.value.set(refKey, el);\n}\n\nwatch(\n    () => props.day,\n    (day) => {\n        // if day is in week\n        if (props.week.map((d) => d.getDate()).includes(day))\n            nextTick(() => {\n                // $nextTick is needed when month is changed\n                const refKey = `day-${props.month}-${day}`;\n                const ref = dayRefs.value.get(refKey);\n                if (ref) ref.focus();\n            });\n    },\n);\n\nwatch(\n    () => props.month,\n    // clear day refs on month change\n    () => (dayRefs.value = new Map()),\n);\n\nfunction clickWeekNumber(week: number): void {\n    if (props.pickerProps.weekNumberClickable) emits(\"week-number-click\", week);\n}\n\nfunction getDayOfYear(input: Date): number {\n    return (\n        Math.round(\n            (input.getTime() - new Date(input.getFullYear(), 0, 1).getTime()) /\n                864e5,\n        ) + 1\n    );\n}\n\nfunction getWeekNumber(day: Date): number {\n    const dow = props.pickerProps.firstDayOfWeek; // first day of week\n    // Rules for the first week : 1 for the 1st January, 4 for the 4th January\n    const doy = props.pickerProps.rulesForFirstWeek;\n    const weekOffset = firstWeekOffset(day.getFullYear(), dow, doy);\n    const week = Math.floor((getDayOfYear(day) - weekOffset - 1) / 7) + 1;\n\n    if (week < 1) {\n        const resYear = day.getFullYear() - 1;\n        return week + weeksInYear(resYear, dow, doy);\n    } else if (week > weeksInYear(day.getFullYear(), dow, doy)) {\n        return week - weeksInYear(day.getFullYear(), dow, doy);\n    } else {\n        return week;\n    }\n}\n\nfunction eventsDateMatch(day: Date): DatepickerEvent[] {\n    if (!props.events?.length) return [];\n    return props.events.filter((event) => event.date.getDay() === day.getDay());\n}\n\n// --- Event Handlers ---\n\nfunction onKeydown(event: KeyboardEvent, weekDay: Date): void {\n    let preventDefault = true;\n    switch (event.key) {\n        case \"Tab\": {\n            preventDefault = false;\n            break;\n        }\n        case \" \":\n        case \"Space\":\n        case \"Spacebar\":\n        case \"Enter\": {\n            selectDate(weekDay);\n            break;\n        }\n\n        case \"ArrowLeft\":\n        case \"Left\": {\n            changeFocus(weekDay, -1);\n            break;\n        }\n        case \"ArrowRight\":\n        case \"Right\": {\n            changeFocus(weekDay, 1);\n            break;\n        }\n        case \"ArrowUp\":\n        case \"Up\": {\n            changeFocus(weekDay, -7);\n            break;\n        }\n        case \"ArrowDown\":\n        case \"Down\": {\n            changeFocus(weekDay, 7);\n            break;\n        }\n    }\n    if (preventDefault) event.preventDefault();\n}\n\n/** Emit select event with chosen date as payload */\nfunction selectDate(date: Date): void {\n    if (props.pickerProps.disabled || props.pickerProps.readonly) return;\n    if (isDateSelectable(date, props.month)) emits(\"select\", date);\n}\n\nfunction changeFocus(day, inc): void {\n    const nextDay = new Date(day.getTime());\n    nextDay.setDate(day.getDate() + inc);\n    // if next day is out of range or not selectable, move to next selectable date\n    while (\n        (props.pickerProps.minDate && nextDay < props.pickerProps.minDate) ||\n        (props.pickerProps.maxDate && nextDay > props.pickerProps.maxDate) ||\n        !isDateSelectable(nextDay, nextDay.getMonth())\n    ) {\n        // revert day selection until selectable day is reached\n        nextDay.setDate(nextDay.getDate() - Math.sign(inc));\n    }\n    setRangeHoverEndDate(nextDay);\n    emits(\"change-focus\", nextDay);\n}\n\nfunction setRangeHoverEndDate(day): void {\n    if (isTrueish(props.pickerProps.range)) emits(\"hover-enddate\", day);\n}\n\n// #region --- Computed Component Classes ---\n\nfunction dateMatch(\n    dateOne: Date,\n    dateTwo?: Date | Date[],\n    multiple = false,\n): boolean {\n    // if either date is null or undefined, return false\n    // if using multiple flag, return false\n    if (!dateOne || !dateTwo || multiple) return false;\n\n    if (Array.isArray(dateTwo))\n        return dateTwo.some(\n            (date) =>\n                dateOne.getDate() === date.getDate() &&\n                dateOne.getFullYear() === date.getFullYear() &&\n                dateOne.getMonth() === date.getMonth(),\n        );\n\n    return (\n        dateOne.getDate() === dateTwo.getDate() &&\n        dateOne.getFullYear() === dateTwo.getFullYear() &&\n        dateOne.getMonth() === dateTwo.getMonth()\n    );\n}\n\nfunction dateWithin(\n    dateOne: Date,\n    dates?: Date | Date[],\n    multiple = false,\n): boolean {\n    if (!Array.isArray(dates) || multiple) return false;\n    return dateOne > dates[0] && dateOne < dates[1];\n}\n\nconst scope = effectScope();\n\n// stop all scope effects\nonUnmounted(() => scope.stop());\n\n/** Build cellClasses for cell using validations */\nfunction cellClasses(day: Date): ClassBinding[] {\n    const classes = defineClasses(\n        [\n            \"tableCellSelectedClass\",\n            \"o-datepicker__table__cell--selected\",\n            null,\n            dateMatch(day, props.selectedDate) ||\n                dateWithin(\n                    day,\n                    props.selectedDate,\n                    isTrueish(props.pickerProps.multiple),\n                ),\n        ],\n        [\n            \"tableCellFirstSelectedClass\",\n            \"o-datepicker__table__cell--first-selected\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.selectedDate)\n                    ? props.selectedDate[0]\n                    : undefined,\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"tableCellWithinSelectedClass\",\n            \"o-datepicker__table__cell--within-selected\",\n            null,\n            dateWithin(\n                day,\n                props.selectedDate,\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"tableCellLastSelectedClass\",\n            \"o-datepicker__table__cell--last-selected\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.selectedDate)\n                    ? props.selectedDate[1]\n                    : undefined,\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"tableCellFirstHoveredClass\",\n            \"o-datepicker__table__cell--first-hovered\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.hoveredDateRange)\n                    ? props.hoveredDateRange[0]\n                    : undefined,\n            ),\n        ],\n        [\n            \"tableCellWithinHoveredClass\",\n            \"o-datepicker__table__cell--within-hovered\",\n            null,\n            dateWithin(day, props.hoveredDateRange),\n        ],\n        [\n            \"tableCellLastHoveredClass\",\n            \"o-datepicker__table__cell--last-hovered\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.hoveredDateRange)\n                    ? props.hoveredDateRange[1]\n                    : undefined,\n            ),\n        ],\n        [\n            \"tableCellTodayClass\",\n            \"o-datepicker__table__cell--today\",\n            null,\n            dateMatch(day, dateCreator()),\n        ],\n        [\n            \"tableCellSelectableClass\",\n            \"o-datepicker__table__cell--selectable\",\n            null,\n            isDateSelectable(day, props.month) &&\n                !props.pickerProps.disabled &&\n                !props.pickerProps.readonly,\n        ],\n        [\n            \"tableCellUnselectableClass\",\n            \"o-datepicker__table__cell--unselectable\",\n            null,\n            !isDateSelectable(day, props.month) || props.pickerProps.disabled,\n        ],\n        [\n            \"tableCellInvisibleClass\",\n            \"o-datepicker__table__cell--invisible\",\n            null,\n            !props.pickerProps.nearbyMonthDays &&\n                day.getMonth() !== props.month,\n        ],\n        [\n            \"tableCellNearbyClass\",\n            \"o-datepicker__table__cell--nearby\",\n            null,\n            props.pickerProps.nearbySelectableMonthDays &&\n                day.getMonth() !== props.month,\n        ],\n        // pass effect scope for rectivity binding\n        { scope },\n    );\n\n    return [\n        ...tableCellClasses.value,\n        ...cellEventsClass.value,\n        ...classes.value,\n    ];\n}\n\nfunction eventClasses(event: DatepickerEvent): ClassBinding[] {\n    const classes = defineClasses(\n        [\"tableEventClass\", \"o-datepicker__table__event\"],\n        [\n            \"tableEventVariantClass\",\n            \"o-datepicker__table__event--\",\n            event.type,\n            !!event.type,\n        ],\n        [\n            \"tableEventIndicatorClass\",\n            \"o-datepicker__table__event--\",\n            props.pickerProps.indicators,\n            !!props.pickerProps.indicators,\n        ],\n        // pass effect scope for rectivity binding\n        { scope },\n    );\n    return classes.value;\n}\n\nconst tableRowClasses = defineClasses(\n    [\"tableRowClass\", \"o-datepicker__table__row\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableCellClasses = defineClasses(\n    [\"tableCellClass\", \"o-datepicker__table__cell\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableEventsClasses = defineClasses(\n    [\"tableEventsClass\", \"o-datepicker__table__events\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst cellEventsClass = defineClasses(\n    [\n        \"tableCellEventsClass\",\n        \"o-datepicker__table__cell--events\",\n        null,\n        hasEvents,\n    ],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div :class=\"tableRowClasses\">\n        <div\n            v-if=\"pickerProps.showWeekNumber\"\n            :class=\"tableCellClasses\"\n            :style=\"{\n                cursor: pickerProps.weekNumberClickable ? 'pointer' : 'auto',\n            }\"\n            :tabindex=\"pickerProps.weekNumberClickable ? 0 : undefined\"\n            role=\"button\"\n            @click.prevent=\"clickWeekNumber(getWeekNumber(week[6]))\"\n            @keydown.enter.prevent=\"clickWeekNumber(getWeekNumber(week[6]))\">\n            <span>{{ getWeekNumber(week[6]) }}</span>\n        </div>\n\n        <template v-for=\"(weekDay, idx) in week\" :key=\"idx\">\n            <div\n                v-if=\"\n                    !pickerProps.disabled &&\n                    !pickerProps.readonly &&\n                    isDateSelectable(weekDay, month)\n                \"\n                :ref=\"(el) => setDayRef(weekDay, el)\"\n                :class=\"cellClasses(weekDay)\"\n                role=\"button\"\n                :tabindex=\"\n                    day === weekDay.getDate() && month === weekDay.getMonth()\n                        ? undefined\n                        : 0\n                \"\n                @click.prevent=\"selectDate(weekDay)\"\n                @mouseenter=\"setRangeHoverEndDate(weekDay)\"\n                @focus=\"setRangeHoverEndDate(weekDay)\"\n                @keydown.enter.prevent=\"onKeydown($event, weekDay)\">\n                <span>{{ weekDay.getDate() }}</span>\n                <div\n                    v-if=\"eventsDateMatch(weekDay).length\"\n                    :class=\"tableEventsClasses\">\n                    <div\n                        v-for=\"(event, index) in eventsDateMatch(weekDay)\"\n                        :key=\"index\"\n                        :class=\"eventClasses(event)\" />\n                </div>\n            </div>\n\n            <div v-else :class=\"cellClasses(weekDay)\">\n                <span>{{ weekDay.getDate() }}</span>\n                <div\n                    v-if=\"eventsDateMatch(weekDay).length\"\n                    :class=\"tableEventsClasses\">\n                    <div\n                        v-for=\"(event, index) in eventsDateMatch(weekDay)\"\n                        :key=\"index\"\n                        :class=\"eventClasses(event)\" />\n                </div>\n            </div>\n        </template>\n    </div>\n</template>\n","<script\n    setup\n    lang=\"ts\"\n    generic=\"IsRange extends boolean, IsMultiple extends boolean\">\nimport { computed, ref, type PropType } from \"vue\";\n\nimport ODatepickerTableRow from \"./DatepickerTableRow.vue\";\n\nimport { isTrueish, isDefined } from \"@/utils/helpers\";\nimport { defineClasses } from \"@/composables\";\n\nimport { useDatepickerMixins } from \"./useDatepickerMixins\";\nimport { weekBuilder } from \"./utils\";\n\nimport type { DatepickerEvent, FocusedDate } from \"./types\";\nimport type { DatepickerProps } from \"./props\";\n\ndefineOptions({\n    name: \"ODatepickerTable\",\n    configField: \"datepicker\",\n});\n\nconst props = defineProps({\n    modelValue: {\n        type: [Date, Array] as PropType<Date | Date[]>,\n        default: undefined,\n    },\n    focusedDate: { type: Object as PropType<FocusedDate>, required: true },\n    dayNames: { type: Array as PropType<string[]>, required: true },\n    monthNames: { type: Array as PropType<string[]>, required: true },\n    pickerProps: {\n        type: Object as PropType<DatepickerProps<IsRange, IsMultiple>>,\n        required: true,\n    },\n});\n\nconst emits = defineEmits<{\n    /** modelValue prop two-way binding */\n    \"update:model-value\": [value: Date | Date[]];\n    /** focusedDate prop two-way binding */\n    \"update:focusedDate\": [value: FocusedDate];\n    \"range-start\": [value: Date];\n    \"range-end\": [value: Date];\n    \"week-number-click\": [value: number];\n}>();\n\nconst { isDateSelectable } = useDatepickerMixins(props.pickerProps);\n\nconst focusedDateModel = defineModel<FocusedDate>(\"focusedDate\", {\n    required: true,\n});\n\nconst selectedBeginDate = ref<Date>();\nconst selectedEndDate = ref<Date>();\nconst hoveredEndDate = ref<Date>();\n\nconst visibleDayNames = computed(() => {\n    const visibleDayNames: string[] = [];\n    let index = props.pickerProps.firstDayOfWeek || 0;\n    while (visibleDayNames.length < props.dayNames.length) {\n        const currentDayName = props.dayNames[index % props.dayNames.length];\n        visibleDayNames.push(currentDayName);\n        index++;\n    }\n    if (props.pickerProps.showWeekNumber) visibleDayNames.unshift(\"\");\n    return visibleDayNames;\n});\n\n/** Return array of all events */\nconst eventsList = computed(() => {\n    if (!props.pickerProps.events) return [];\n    return props.pickerProps.events.map((event) =>\n        !event.date && event instanceof Date ? { date: event } : event,\n    );\n});\n\n/** Return array of all weeks in the specified month */\nconst weeksInThisMonth = computed<Date[][]>(() => {\n    validateFocusedDay();\n    const month = focusedDateModel.value.month;\n    const year = focusedDateModel.value.year;\n    const weeksInThisMonth: Date[][] = [];\n\n    let startingDay = 1;\n\n    while (weeksInThisMonth.length < 6) {\n        const newWeek = weekBuilder(\n            startingDay,\n            month,\n            year,\n            props.pickerProps.firstDayOfWeek || 0,\n        );\n        weeksInThisMonth.push(newWeek);\n        startingDay += 7;\n    }\n\n    return weeksInThisMonth;\n});\n\nfunction eventsInThisWeek(week: Date[]): DatepickerEvent[] {\n    if (!props.pickerProps.events) return [];\n    return eventsList.value.filter((event) => {\n        const stripped = new Date(event.date);\n        stripped.setHours(0, 0, 0, 0);\n        const timed = stripped.getTime();\n        return week.some((weekDate) => weekDate.getTime() === timed);\n    });\n}\n\nconst hoveredDateRange = computed<Date[]>(() => {\n    if (!isTrueish(props.pickerProps.range) || selectedEndDate.value) return [];\n\n    return (\n        (hoveredEndDate.value || 0) < (selectedBeginDate.value || 0)\n            ? [hoveredEndDate.value, selectedBeginDate.value]\n            : [selectedBeginDate.value, hoveredEndDate.value]\n    ).filter(isDefined);\n});\n\nfunction validateFocusedDay(): void {\n    const currentDate = new Date(\n        focusedDateModel.value.year,\n        focusedDateModel.value.month,\n        focusedDateModel.value.day,\n    );\n    if (isDateSelectable(currentDate, focusedDateModel.value.month)) return;\n\n    let day = 0;\n    // Number of days in the current month\n    const monthDays = new Date(\n        focusedDateModel.value.year,\n        focusedDateModel.value.month + 1,\n        0,\n    ).getDate();\n    let firstFocusable: Date | undefined;\n    while (!firstFocusable && ++day < monthDays) {\n        const date = new Date(\n            focusedDateModel.value.year,\n            focusedDateModel.value.month,\n            day,\n        );\n        if (isDateSelectable(date, focusedDateModel.value.month)) {\n            firstFocusable = currentDate;\n            focusedDateModel.value = {\n                day: date.getDate(),\n                month: date.getMonth(),\n                year: date.getFullYear(),\n            };\n        }\n    }\n}\n\n// --- Event Handlers ---\n\n/** Emit input event with selected date as payload for v-model in parent */\nfunction onSelectedDate(date: Date): void {\n    if (props.pickerProps.disabled) return;\n    else if (isTrueish(props.pickerProps.range)) handleSelectRangeDate(date);\n    else if (isTrueish(props.pickerProps.multiple))\n        handleSelectMultipleDates(date);\n    else emits(\"update:model-value\", date);\n}\n\n/*\n * If both begin and end dates are set, reset the end date and set the begin date.\n * If only begin date is selected, emit an array of the begin date and the new date.\n * If not set, only set the begin date.\n */\nfunction handleSelectRangeDate(date: Date): void {\n    if (selectedBeginDate.value && selectedEndDate.value) {\n        selectedBeginDate.value = date;\n        selectedEndDate.value = undefined;\n        emits(\"range-start\", date);\n    } else if (selectedBeginDate.value && !selectedEndDate.value) {\n        if (selectedBeginDate.value > date) {\n            selectedEndDate.value = selectedBeginDate.value;\n            selectedBeginDate.value = date;\n        } else {\n            selectedEndDate.value = date;\n        }\n        emits(\"range-end\", date);\n        emits(\"update:model-value\", [\n            selectedBeginDate.value,\n            selectedEndDate.value,\n        ]);\n    } else {\n        selectedBeginDate.value = date;\n        emits(\"range-start\", date);\n    }\n}\n\n/*\n * If selected date already exists list of selected dates, remove it from the list\n * Otherwise, add date to list of selected dates\n */\nfunction handleSelectMultipleDates(date: Date): void {\n    let multipleSelectedDates = Array.isArray(props.modelValue)\n        ? props.modelValue\n        : [];\n    const multipleSelect = multipleSelectedDates.filter(\n        (selectedDate) =>\n            selectedDate.getDate() === date.getDate() &&\n            selectedDate.getFullYear() === date.getFullYear() &&\n            selectedDate.getMonth() === date.getMonth(),\n    );\n    if (multipleSelect.length) {\n        multipleSelectedDates = multipleSelectedDates.filter(\n            (selectedDate) =>\n                selectedDate.getDate() !== date.getDate() ||\n                selectedDate.getFullYear() !== date.getFullYear() ||\n                selectedDate.getMonth() !== date.getMonth(),\n        );\n    } else {\n        multipleSelectedDates = [...multipleSelectedDates, date];\n    }\n    emits(\"update:model-value\", multipleSelectedDates);\n}\n\nfunction onRangeHoverEndDate(date: Date): void {\n    hoveredEndDate.value = date;\n}\n\nfunction onChangeFocus(date: Date): void {\n    focusedDateModel.value = {\n        day: date.getDate(),\n        month: date.getMonth(),\n        year: date.getFullYear(),\n    };\n}\n\n// #region --- Computed Component Classes ---\n\nconst tableClasses = defineClasses(\n    [\"tableClass\", \"o-datepicker__table\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableHeadClasses = defineClasses(\n    [\"tableHeadClass\", \"o-datepicker__table__head\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableCellClasses = defineClasses(\n    [\"tableCellClass\", \"o-datepicker__table__cell\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableHeadCellClasses = defineClasses(\n    [\"tableHeadCellClass\", \"o-datepicker__table__head-cell\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableBodyClasses = defineClasses(\n    [\"tableBodyClass\", \"o-datepicker__table__body\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <section :class=\"tableClasses\">\n        <header :class=\"tableHeadClasses\">\n            <div\n                v-for=\"(day, index) in visibleDayNames\"\n                :key=\"index\"\n                :class=\"[...tableCellClasses, ...tableHeadCellClasses]\">\n                <span>{{ day }}</span>\n            </div>\n        </header>\n\n        <div :class=\"tableBodyClasses\">\n            <o-datepicker-table-row\n                v-for=\"(week, index) in weeksInThisMonth\"\n                :key=\"index\"\n                :selected-date=\"modelValue\"\n                :day=\"focusedDateModel.day\"\n                :week=\"week\"\n                :month=\"focusedDateModel.month\"\n                :events=\"eventsInThisWeek(week)\"\n                :hovered-date-range=\"hoveredDateRange\"\n                :picker-props=\"props.pickerProps\"\n                @select=\"onSelectedDate\"\n                @hover-enddate=\"onRangeHoverEndDate\"\n                @change-focus=\"onChangeFocus\"\n                @week-number-click=\"$emit('week-number-click', $event)\" />\n        </div>\n    </section>\n</template>\n","<script\n    setup\n    lang=\"ts\"\n    generic=\"IsRange extends boolean, IsMultiple extends boolean\">\nimport { computed, ref, type PropType } from \"vue\";\n\nimport ODatepickerTableRow from \"./DatepickerTableRow.vue\";\n\nimport { isTrueish, isDefined } from \"@/utils/helpers\";\nimport { defineClasses } from \"@/composables\";\n\nimport { useDatepickerMixins } from \"./useDatepickerMixins\";\nimport { weekBuilder } from \"./utils\";\n\nimport type { DatepickerEvent, FocusedDate } from \"./types\";\nimport type { DatepickerProps } from \"./props\";\n\ndefineOptions({\n    name: \"ODatepickerTable\",\n    configField: \"datepicker\",\n});\n\nconst props = defineProps({\n    modelValue: {\n        type: [Date, Array] as PropType<Date | Date[]>,\n        default: undefined,\n    },\n    focusedDate: { type: Object as PropType<FocusedDate>, required: true },\n    dayNames: { type: Array as PropType<string[]>, required: true },\n    monthNames: { type: Array as PropType<string[]>, required: true },\n    pickerProps: {\n        type: Object as PropType<DatepickerProps<IsRange, IsMultiple>>,\n        required: true,\n    },\n});\n\nconst emits = defineEmits<{\n    /** modelValue prop two-way binding */\n    \"update:model-value\": [value: Date | Date[]];\n    /** focusedDate prop two-way binding */\n    \"update:focusedDate\": [value: FocusedDate];\n    \"range-start\": [value: Date];\n    \"range-end\": [value: Date];\n    \"week-number-click\": [value: number];\n}>();\n\nconst { isDateSelectable } = useDatepickerMixins(props.pickerProps);\n\nconst focusedDateModel = defineModel<FocusedDate>(\"focusedDate\", {\n    required: true,\n});\n\nconst selectedBeginDate = ref<Date>();\nconst selectedEndDate = ref<Date>();\nconst hoveredEndDate = ref<Date>();\n\nconst visibleDayNames = computed(() => {\n    const visibleDayNames: string[] = [];\n    let index = props.pickerProps.firstDayOfWeek || 0;\n    while (visibleDayNames.length < props.dayNames.length) {\n        const currentDayName = props.dayNames[index % props.dayNames.length];\n        visibleDayNames.push(currentDayName);\n        index++;\n    }\n    if (props.pickerProps.showWeekNumber) visibleDayNames.unshift(\"\");\n    return visibleDayNames;\n});\n\n/** Return array of all events */\nconst eventsList = computed(() => {\n    if (!props.pickerProps.events) return [];\n    return props.pickerProps.events.map((event) =>\n        !event.date && event instanceof Date ? { date: event } : event,\n    );\n});\n\n/** Return array of all weeks in the specified month */\nconst weeksInThisMonth = computed<Date[][]>(() => {\n    validateFocusedDay();\n    const month = focusedDateModel.value.month;\n    const year = focusedDateModel.value.year;\n    const weeksInThisMonth: Date[][] = [];\n\n    let startingDay = 1;\n\n    while (weeksInThisMonth.length < 6) {\n        const newWeek = weekBuilder(\n            startingDay,\n            month,\n            year,\n            props.pickerProps.firstDayOfWeek || 0,\n        );\n        weeksInThisMonth.push(newWeek);\n        startingDay += 7;\n    }\n\n    return weeksInThisMonth;\n});\n\nfunction eventsInThisWeek(week: Date[]): DatepickerEvent[] {\n    if (!props.pickerProps.events) return [];\n    return eventsList.value.filter((event) => {\n        const stripped = new Date(event.date);\n        stripped.setHours(0, 0, 0, 0);\n        const timed = stripped.getTime();\n        return week.some((weekDate) => weekDate.getTime() === timed);\n    });\n}\n\nconst hoveredDateRange = computed<Date[]>(() => {\n    if (!isTrueish(props.pickerProps.range) || selectedEndDate.value) return [];\n\n    return (\n        (hoveredEndDate.value || 0) < (selectedBeginDate.value || 0)\n            ? [hoveredEndDate.value, selectedBeginDate.value]\n            : [selectedBeginDate.value, hoveredEndDate.value]\n    ).filter(isDefined);\n});\n\nfunction validateFocusedDay(): void {\n    const currentDate = new Date(\n        focusedDateModel.value.year,\n        focusedDateModel.value.month,\n        focusedDateModel.value.day,\n    );\n    if (isDateSelectable(currentDate, focusedDateModel.value.month)) return;\n\n    let day = 0;\n    // Number of days in the current month\n    const monthDays = new Date(\n        focusedDateModel.value.year,\n        focusedDateModel.value.month + 1,\n        0,\n    ).getDate();\n    let firstFocusable: Date | undefined;\n    while (!firstFocusable && ++day < monthDays) {\n        const date = new Date(\n            focusedDateModel.value.year,\n            focusedDateModel.value.month,\n            day,\n        );\n        if (isDateSelectable(date, focusedDateModel.value.month)) {\n            firstFocusable = currentDate;\n            focusedDateModel.value = {\n                day: date.getDate(),\n                month: date.getMonth(),\n                year: date.getFullYear(),\n            };\n        }\n    }\n}\n\n// --- Event Handlers ---\n\n/** Emit input event with selected date as payload for v-model in parent */\nfunction onSelectedDate(date: Date): void {\n    if (props.pickerProps.disabled) return;\n    else if (isTrueish(props.pickerProps.range)) handleSelectRangeDate(date);\n    else if (isTrueish(props.pickerProps.multiple))\n        handleSelectMultipleDates(date);\n    else emits(\"update:model-value\", date);\n}\n\n/*\n * If both begin and end dates are set, reset the end date and set the begin date.\n * If only begin date is selected, emit an array of the begin date and the new date.\n * If not set, only set the begin date.\n */\nfunction handleSelectRangeDate(date: Date): void {\n    if (selectedBeginDate.value && selectedEndDate.value) {\n        selectedBeginDate.value = date;\n        selectedEndDate.value = undefined;\n        emits(\"range-start\", date);\n    } else if (selectedBeginDate.value && !selectedEndDate.value) {\n        if (selectedBeginDate.value > date) {\n            selectedEndDate.value = selectedBeginDate.value;\n            selectedBeginDate.value = date;\n        } else {\n            selectedEndDate.value = date;\n        }\n        emits(\"range-end\", date);\n        emits(\"update:model-value\", [\n            selectedBeginDate.value,\n            selectedEndDate.value,\n        ]);\n    } else {\n        selectedBeginDate.value = date;\n        emits(\"range-start\", date);\n    }\n}\n\n/*\n * If selected date already exists list of selected dates, remove it from the list\n * Otherwise, add date to list of selected dates\n */\nfunction handleSelectMultipleDates(date: Date): void {\n    let multipleSelectedDates = Array.isArray(props.modelValue)\n        ? props.modelValue\n        : [];\n    const multipleSelect = multipleSelectedDates.filter(\n        (selectedDate) =>\n            selectedDate.getDate() === date.getDate() &&\n            selectedDate.getFullYear() === date.getFullYear() &&\n            selectedDate.getMonth() === date.getMonth(),\n    );\n    if (multipleSelect.length) {\n        multipleSelectedDates = multipleSelectedDates.filter(\n            (selectedDate) =>\n                selectedDate.getDate() !== date.getDate() ||\n                selectedDate.getFullYear() !== date.getFullYear() ||\n                selectedDate.getMonth() !== date.getMonth(),\n        );\n    } else {\n        multipleSelectedDates = [...multipleSelectedDates, date];\n    }\n    emits(\"update:model-value\", multipleSelectedDates);\n}\n\nfunction onRangeHoverEndDate(date: Date): void {\n    hoveredEndDate.value = date;\n}\n\nfunction onChangeFocus(date: Date): void {\n    focusedDateModel.value = {\n        day: date.getDate(),\n        month: date.getMonth(),\n        year: date.getFullYear(),\n    };\n}\n\n// #region --- Computed Component Classes ---\n\nconst tableClasses = defineClasses(\n    [\"tableClass\", \"o-datepicker__table\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableHeadClasses = defineClasses(\n    [\"tableHeadClass\", \"o-datepicker__table__head\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableCellClasses = defineClasses(\n    [\"tableCellClass\", \"o-datepicker__table__cell\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableHeadCellClasses = defineClasses(\n    [\"tableHeadCellClass\", \"o-datepicker__table__head-cell\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst tableBodyClasses = defineClasses(\n    [\"tableBodyClass\", \"o-datepicker__table__body\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <section :class=\"tableClasses\">\n        <header :class=\"tableHeadClasses\">\n            <div\n                v-for=\"(day, index) in visibleDayNames\"\n                :key=\"index\"\n                :class=\"[...tableCellClasses, ...tableHeadCellClasses]\">\n                <span>{{ day }}</span>\n            </div>\n        </header>\n\n        <div :class=\"tableBodyClasses\">\n            <o-datepicker-table-row\n                v-for=\"(week, index) in weeksInThisMonth\"\n                :key=\"index\"\n                :selected-date=\"modelValue\"\n                :day=\"focusedDateModel.day\"\n                :week=\"week\"\n                :month=\"focusedDateModel.month\"\n                :events=\"eventsInThisWeek(week)\"\n                :hovered-date-range=\"hoveredDateRange\"\n                :picker-props=\"props.pickerProps\"\n                @select=\"onSelectedDate\"\n                @hover-enddate=\"onRangeHoverEndDate\"\n                @change-focus=\"onChangeFocus\"\n                @week-number-click=\"$emit('week-number-click', $event)\" />\n        </div>\n    </section>\n</template>\n","<script\n    setup\n    lang=\"ts\"\n    generic=\"IsRange extends boolean, IsMultiple extends boolean\">\nimport {\n    computed,\n    ref,\n    nextTick,\n    watch,\n    effectScope,\n    onUnmounted,\n    type PropType,\n    type ComponentPublicInstance,\n} from \"vue\";\n\nimport { isDefined, isTrueish } from \"@/utils/helpers\";\nimport { defineClasses } from \"@/composables\";\n\nimport { useDatepickerMixins } from \"./useDatepickerMixins\";\n\nimport type { DatepickerEvent, FocusedDate } from \"./types\";\nimport type { DatepickerProps } from \"./props\";\nimport type { ClassBinding } from \"@/types\";\n\ndefineOptions({\n    name: \"ODatepickerMonth\",\n    configField: \"datepicker\",\n    inheritAttrs: false,\n});\n\nconst props = defineProps({\n    modelValue: {\n        type: [Date, Array] as PropType<Date | Date[]>,\n        default: undefined,\n    },\n    monthNames: { type: Array as PropType<string[]>, required: true },\n    focusedDate: { type: Object as PropType<FocusedDate>, required: true },\n    pickerProps: {\n        type: Object as PropType<DatepickerProps<IsRange, IsMultiple>>,\n        required: true,\n    },\n});\n\nconst emits = defineEmits<{\n    /** modelValue prop two-way binding */\n    \"update:model-value\": [value: Date | Date[]];\n    /** focusedDate prop two-way binding */\n    \"update:focusedDate\": [value: FocusedDate];\n    \"range-start\": [value: Date];\n    \"range-end\": [value: Date];\n}>();\n\nconst { dateCreator } = useDatepickerMixins(props.pickerProps);\n\nconst selectedBeginDate = ref<Date>();\nconst selectedEndDate = ref<Date>();\nconst hoveredEndDate = ref<Date>();\n\nconst hasEvents = computed(() => !!props.pickerProps.events?.length);\n\nconst monthRefs = ref(new Map());\n\nfunction setMonthRef(\n    date: Date,\n    el: Element | ComponentPublicInstance | null,\n): void {\n    const refKey = `month-${date.getMonth()}`;\n    if (el) monthRefs.value.set(refKey, el);\n}\n\nwatch(\n    () => props.focusedDate.month,\n    (month) => {\n        const refKey = `month-${month}`;\n        nextTick(() => {\n            // $nextTick is needed when month is changed\n            const ref = monthRefs.value.get(refKey);\n            if (ref?.length > 0 && ref[0]) {\n                ref[0].focus();\n            }\n        });\n    },\n);\n\n/** Return array of all events in the specified month */\nconst eventsInThisYear = computed(() => {\n    if (!props.pickerProps.events) return [];\n\n    return props.pickerProps.events\n        .map((event) => {\n            if (!event.date && event instanceof Date) event = { date: event };\n            if (!event.type) event.type = \"is-primary\";\n            return event;\n        })\n        .filter((event) => event.date.getFullYear() === props.focusedDate.year);\n});\n\nconst monthDates = computed(() => {\n    const year = props.focusedDate.year;\n    const months: Date[] = [];\n    for (let i = 0; i < 12; i++) {\n        const d = new Date(year, i, 1);\n        d.setHours(0, 0, 0, 0);\n        months.push(d);\n    }\n    return months;\n});\n\nconst hoveredDateRange = computed(() => {\n    if (!isTrueish(props.pickerProps.range) || !selectedEndDate.value)\n        return [];\n\n    return (\n        hoveredEndDate.value &&\n        selectedBeginDate.value &&\n        hoveredEndDate.value < selectedBeginDate.value\n            ? [hoveredEndDate.value, selectedBeginDate.value]\n            : [selectedBeginDate.value, hoveredEndDate.value]\n    ).filter(isDefined);\n});\n\nfunction eventsDateMatch(day): DatepickerEvent[] {\n    if (!eventsInThisYear.value.length) return [];\n    return eventsInThisYear.value.filter(\n        (event) => event.date.getMonth() === day.getMonth(),\n    );\n}\n\nfunction isDateSelectable(date: Date): boolean {\n    const validity: boolean[] = [];\n\n    if (props.pickerProps.minDate)\n        validity.push(date >= props.pickerProps.minDate);\n    if (props.pickerProps.maxDate)\n        validity.push(date <= props.pickerProps.maxDate);\n\n    validity.push(date.getFullYear() === props.focusedDate.year);\n\n    if (props.pickerProps.selectableDates) {\n        if (typeof props.pickerProps.selectableDates === \"function\") {\n            if (props.pickerProps.selectableDates(date)) return true;\n            else validity.push(false);\n        } else {\n            for (let i = 0; i < props.pickerProps.selectableDates.length; i++) {\n                const enabledDate = props.pickerProps.selectableDates[i];\n                if (\n                    date.getFullYear() === enabledDate.getFullYear() &&\n                    date.getMonth() === enabledDate.getMonth()\n                )\n                    return true;\n                else validity.push(false);\n            }\n        }\n    }\n\n    if (props.pickerProps.unselectableDates) {\n        if (typeof props.pickerProps.unselectableDates === \"function\") {\n            validity.push(!props.pickerProps.unselectableDates(date));\n        } else {\n            for (\n                let i = 0;\n                i < props.pickerProps.unselectableDates.length;\n                i++\n            ) {\n                const disabledDate = props.pickerProps.unselectableDates[i];\n                validity.push(\n                    date.getFullYear() !== disabledDate.getFullYear() ||\n                        date.getMonth() !== disabledDate.getMonth(),\n                );\n            }\n        }\n    }\n\n    if (props.pickerProps.unselectableDaysOfWeek) {\n        for (\n            let i = 0;\n            i < props.pickerProps.unselectableDaysOfWeek.length;\n            i++\n        ) {\n            const dayOfWeek = props.pickerProps.unselectableDaysOfWeek[i];\n            validity.push(date.getDay() !== dayOfWeek);\n        }\n    }\n\n    return validity.indexOf(false) < 0;\n}\n\n// --- Event Handlers ---\n\nfunction onKeydown(event: KeyboardEvent, weekDay: Date): void {\n    let preventDefault = true;\n    switch (event.key) {\n        case \"Tab\": {\n            preventDefault = false;\n            break;\n        }\n        case \" \":\n        case \"Space\":\n        case \"Spacebar\":\n        case \"Enter\": {\n            selectDate(weekDay);\n            break;\n        }\n\n        case \"ArrowLeft\":\n        case \"Left\": {\n            changeFocus(weekDay, -1);\n            break;\n        }\n        case \"ArrowRight\":\n        case \"Right\": {\n            changeFocus(weekDay, 1);\n            break;\n        }\n        case \"ArrowUp\":\n        case \"Up\": {\n            changeFocus(weekDay, -7);\n            break;\n        }\n        case \"ArrowDown\":\n        case \"Down\": {\n            changeFocus(weekDay, 7);\n            break;\n        }\n    }\n    if (preventDefault) event.preventDefault();\n}\n\n/*\n * Emit update:modelValue event with selected date as payload for v-model in parent\n */\nfunction selectDate(date: Date): void {\n    if (props.pickerProps.disabled || props.pickerProps.readonly) return;\n    if (!isDateSelectable(date)) return;\n\n    if (isTrueish(props.pickerProps.range)) handleSelectRangeDate(date);\n    else if (isTrueish(props.pickerProps.multiple))\n        handleSelectMultipleDates(date);\n    else emits(\"update:model-value\", date);\n}\n\n/*\n * If both begin and end dates are set, reset the end date and set the begin date.\n * If only begin date is selected, emit an array of the begin date and the new date.\n * If not set, only set the begin date.\n */\nfunction handleSelectRangeDate(date: Date): void {\n    if (selectedBeginDate.value && selectedEndDate.value) {\n        selectedBeginDate.value = date;\n        selectedEndDate.value = undefined;\n        emits(\"range-start\", date);\n    } else if (selectedBeginDate.value && !selectedEndDate.value) {\n        if (selectedBeginDate.value > date) {\n            selectedEndDate.value = selectedBeginDate.value;\n            selectedBeginDate.value = date;\n        } else {\n            selectedEndDate.value = date;\n        }\n        emits(\"range-end\", date);\n        emits(\"update:model-value\", [\n            selectedBeginDate.value,\n            selectedEndDate.value,\n        ]);\n    } else {\n        selectedBeginDate.value = date;\n        emits(\"range-start\", date);\n    }\n}\n\nconst multipleSelectedDates = computed(() =>\n    isTrueish(props.pickerProps.multiple) && props.modelValue\n        ? props.modelValue\n        : [],\n);\n\nfunction handleSelectMultipleDates(date: Date): void {\n    if (!Array.isArray(props.modelValue)) return;\n    let multipleSelectedDates = props.modelValue;\n\n    const multipleSelect = multipleSelectedDates.filter(\n        (selectedDate) =>\n            selectedDate.getDate() === date.getDate() &&\n            selectedDate.getFullYear() === date.getFullYear() &&\n            selectedDate.getMonth() === date.getMonth(),\n    );\n    if (multipleSelect.length) {\n        multipleSelectedDates = multipleSelectedDates.filter(\n            (selectedDate) =>\n                selectedDate.getDate() !== date.getDate() ||\n                selectedDate.getFullYear() !== date.getFullYear() ||\n                selectedDate.getMonth() !== date.getMonth(),\n        );\n    } else {\n        multipleSelectedDates.push(date);\n    }\n    emits(\"update:model-value\", multipleSelectedDates);\n}\n\nfunction changeFocus(month: Date, inc: number): void {\n    month.setMonth(month.getMonth() + inc);\n    const focused = {\n        day: month.getDate(),\n        month: month.getMonth(),\n        year: month.getFullYear(),\n    };\n    emits(\"update:focusedDate\", focused);\n}\n\nfunction onRangeHoverEndDate(day: Date): void {\n    if (isTrueish(props.pickerProps.range)) hoveredEndDate.value = day;\n}\n\n// #region --- Computed Component Classes ---\n\nfunction dateMatch(dateOne, dateTwo, multiple = false): boolean {\n    // if either date is null or undefined, return false\n    if (!dateOne || !dateTwo || multiple) return false;\n    if (Array.isArray(dateTwo))\n        return dateTwo.some(\n            (date) =>\n                dateOne.getFullYear() === date.getFullYear() &&\n                dateOne.getMonth() === date.getMonth(),\n        );\n    return (\n        dateOne.getFullYear() === dateTwo.getFullYear() &&\n        dateOne.getMonth() === dateTwo.getMonth()\n    );\n}\n\nfunction dateWithin(dateOne, dates, multiple = false): boolean {\n    if (!Array.isArray(dates) || multiple) return false;\n    return dateOne > dates[0] && dateOne < dates[1];\n}\n\nfunction dateMultipleSelected(dateOne, dates, multiple = false): boolean {\n    if (!Array.isArray(dates) || !multiple) return false;\n    return dates.some(\n        (date) =>\n            dateOne.getDate() === date.getDate() &&\n            dateOne.getFullYear() === date.getFullYear() &&\n            dateOne.getMonth() === date.getMonth(),\n    );\n}\n\nconst monthClasses = defineClasses(\n    [\"monthClass\", \"o-datepicker__month\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst monthTableClasses = defineClasses(\n    [\"monthTableClass\", \"o-datepicker__month__table\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst monthCellClasses = defineClasses(\n    [\"monthCellClass\", \"o-datepicker__month__cell\"],\n    [\n        \"monthCellEventsClass\",\n        \"o-datepicker__month__cell--events\",\n        null,\n        hasEvents,\n    ],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\n// Registers a dispose callback on the current active effect scope.\nconst scope = effectScope();\n\n// stop all scope effects\nonUnmounted(() => scope.stop());\n\n/**\n * Build classes for cell using validations\n */\nfunction cellClasses(day: Date): ClassBinding[] {\n    const classes = defineClasses(\n        [\n            \"monthCellSelectedClass\",\n            \"o-datepicker__month__cell--selected\",\n            null,\n            dateMatch(\n                day,\n                props.modelValue,\n                isTrueish(props.pickerProps.multiple),\n            ) ||\n                dateWithin(\n                    day,\n                    props.modelValue,\n                    isTrueish(props.pickerProps.multiple),\n                ) ||\n                dateMultipleSelected(\n                    day,\n                    multipleSelectedDates.value,\n                    isTrueish(props.pickerProps.multiple),\n                ),\n        ],\n        [\n            \"monthCellFirstSelectedClass\",\n            \"o-datepicker__month__cell--first-selected\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.modelValue) && props.modelValue[0],\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"monthCellWithinSelectedClass\",\n            \"o-datepicker__month__cell--within-selected\",\n            null,\n            dateWithin(\n                day,\n                props.modelValue,\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"monthCellLastSelectedClass\",\n            \"o-datepicker__month__cell--last-selected\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.modelValue) && props.modelValue[1],\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"monthCellWithinHoveredRangeClass\",\n            \"o-datepicker__month__cell--within-hovered-range\",\n            null,\n            hoveredDateRange.value &&\n                hoveredDateRange.value.length === 2 &&\n                (dateMatch(day, hoveredDateRange.value) ||\n                    dateWithin(day, hoveredDateRange.value)),\n        ],\n        [\n            \"monthCellFirstHoveredClass\",\n            \"o-datepicker__month__cell--first-hovered\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(hoveredDateRange.value) &&\n                    hoveredDateRange.value[0],\n            ),\n        ],\n        [\n            \"monthCellWithinHoveredClass\",\n            \"o-datepicker__month__cell--within-hovered\",\n            null,\n            dateWithin(day, hoveredDateRange.value),\n        ],\n        [\n            \"monthCellLastHoveredClass\",\n            \"o-datepicker__month__cell--last-hovered\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(hoveredDateRange.value) &&\n                    hoveredDateRange.value[1],\n            ),\n        ],\n        [\n            \"monthCellTodayClass\",\n            \"o-datepicker__month__cell--today\",\n            null,\n            dateMatch(day, dateCreator()),\n        ],\n        [\n            \"monthCellSelectableclass\",\n            \"o-datepicker__month__cell--selectable\",\n            null,\n            isDateSelectable(day) &&\n                !props.pickerProps.disabled &&\n                !props.pickerProps.readonly,\n        ],\n        [\n            \"monthCellUnselectableClass\",\n            \"o-datepicker__month__cell--unselectable\",\n            null,\n            !isDateSelectable(day) || props.pickerProps.disabled,\n        ],\n        // pass effect scope for rectivity binding\n        { scope },\n    );\n    return [...monthCellClasses.value, ...classes.value];\n}\n\nconst monthEventsClasses = defineClasses(\n    [\"monthEventsClass\", \"o-datepicker__month__events\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\n/**\n * Build classes for event\n */\nfunction eventClasses(event: DatepickerEvent): ClassBinding[] {\n    const classes = defineClasses(\n        [\"monthEventClass\", \"o-datepicker__month__event\"],\n        [\n            \"monthEventTypeClass\",\n            \"o-datepicker__month__event--\",\n            event.type,\n            !!event.type,\n        ],\n        [\n            \"monthEventIndicatorClass\",\n            \"o-datepicker__month__event--\",\n            props.pickerProps.indicators,\n            !!props.pickerProps.indicators,\n        ],\n        // pass effect scope for rectivity binding\n        { scope },\n    );\n    return classes.value;\n}\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <section :class=\"monthClasses\">\n        <div :class=\"monthTableClasses\">\n            <template v-for=\"(date, idx) in monthDates\" :key=\"idx\">\n                <div\n                    v-if=\"\n                        !pickerProps.disabled &&\n                        !pickerProps.readonly &&\n                        isDateSelectable(date)\n                    \"\n                    :ref=\"(el) => setMonthRef(date, el)\"\n                    :class=\"cellClasses(date)\"\n                    role=\"button\"\n                    :tabindex=\"\n                        focusedDate.month === date.getMonth() ? undefined : 0\n                    \"\n                    @click.prevent=\"selectDate(date)\"\n                    @mouseenter=\"onRangeHoverEndDate(date)\"\n                    @focus=\"onRangeHoverEndDate(date)\"\n                    @keydown.prevent=\"onKeydown($event, date)\">\n                    {{ monthNames[date.getMonth()] }}\n                    <div\n                        v-if=\"eventsDateMatch(date).length\"\n                        :class=\"monthEventsClasses\">\n                        <div\n                            v-for=\"(event, index) in eventsDateMatch(date)\"\n                            :key=\"index\"\n                            :class=\"eventClasses(event)\" />\n                    </div>\n                </div>\n\n                <div v-else :class=\"cellClasses(date)\">\n                    {{ monthNames[date.getMonth()] }}\n                    <div\n                        v-if=\"eventsDateMatch(date).length\"\n                        :class=\"monthEventsClasses\">\n                        <div\n                            v-for=\"(event, index) in eventsDateMatch(date)\"\n                            :key=\"index\"\n                            :class=\"eventClasses(event)\" />\n                    </div>\n                </div>\n            </template>\n        </div>\n    </section>\n</template>\n","<script\n    setup\n    lang=\"ts\"\n    generic=\"IsRange extends boolean, IsMultiple extends boolean\">\nimport {\n    computed,\n    ref,\n    nextTick,\n    watch,\n    effectScope,\n    onUnmounted,\n    type PropType,\n    type ComponentPublicInstance,\n} from \"vue\";\n\nimport { isDefined, isTrueish } from \"@/utils/helpers\";\nimport { defineClasses } from \"@/composables\";\n\nimport { useDatepickerMixins } from \"./useDatepickerMixins\";\n\nimport type { DatepickerEvent, FocusedDate } from \"./types\";\nimport type { DatepickerProps } from \"./props\";\nimport type { ClassBinding } from \"@/types\";\n\ndefineOptions({\n    name: \"ODatepickerMonth\",\n    configField: \"datepicker\",\n    inheritAttrs: false,\n});\n\nconst props = defineProps({\n    modelValue: {\n        type: [Date, Array] as PropType<Date | Date[]>,\n        default: undefined,\n    },\n    monthNames: { type: Array as PropType<string[]>, required: true },\n    focusedDate: { type: Object as PropType<FocusedDate>, required: true },\n    pickerProps: {\n        type: Object as PropType<DatepickerProps<IsRange, IsMultiple>>,\n        required: true,\n    },\n});\n\nconst emits = defineEmits<{\n    /** modelValue prop two-way binding */\n    \"update:model-value\": [value: Date | Date[]];\n    /** focusedDate prop two-way binding */\n    \"update:focusedDate\": [value: FocusedDate];\n    \"range-start\": [value: Date];\n    \"range-end\": [value: Date];\n}>();\n\nconst { dateCreator } = useDatepickerMixins(props.pickerProps);\n\nconst selectedBeginDate = ref<Date>();\nconst selectedEndDate = ref<Date>();\nconst hoveredEndDate = ref<Date>();\n\nconst hasEvents = computed(() => !!props.pickerProps.events?.length);\n\nconst monthRefs = ref(new Map());\n\nfunction setMonthRef(\n    date: Date,\n    el: Element | ComponentPublicInstance | null,\n): void {\n    const refKey = `month-${date.getMonth()}`;\n    if (el) monthRefs.value.set(refKey, el);\n}\n\nwatch(\n    () => props.focusedDate.month,\n    (month) => {\n        const refKey = `month-${month}`;\n        nextTick(() => {\n            // $nextTick is needed when month is changed\n            const ref = monthRefs.value.get(refKey);\n            if (ref?.length > 0 && ref[0]) {\n                ref[0].focus();\n            }\n        });\n    },\n);\n\n/** Return array of all events in the specified month */\nconst eventsInThisYear = computed(() => {\n    if (!props.pickerProps.events) return [];\n\n    return props.pickerProps.events\n        .map((event) => {\n            if (!event.date && event instanceof Date) event = { date: event };\n            if (!event.type) event.type = \"is-primary\";\n            return event;\n        })\n        .filter((event) => event.date.getFullYear() === props.focusedDate.year);\n});\n\nconst monthDates = computed(() => {\n    const year = props.focusedDate.year;\n    const months: Date[] = [];\n    for (let i = 0; i < 12; i++) {\n        const d = new Date(year, i, 1);\n        d.setHours(0, 0, 0, 0);\n        months.push(d);\n    }\n    return months;\n});\n\nconst hoveredDateRange = computed(() => {\n    if (!isTrueish(props.pickerProps.range) || !selectedEndDate.value)\n        return [];\n\n    return (\n        hoveredEndDate.value &&\n        selectedBeginDate.value &&\n        hoveredEndDate.value < selectedBeginDate.value\n            ? [hoveredEndDate.value, selectedBeginDate.value]\n            : [selectedBeginDate.value, hoveredEndDate.value]\n    ).filter(isDefined);\n});\n\nfunction eventsDateMatch(day): DatepickerEvent[] {\n    if (!eventsInThisYear.value.length) return [];\n    return eventsInThisYear.value.filter(\n        (event) => event.date.getMonth() === day.getMonth(),\n    );\n}\n\nfunction isDateSelectable(date: Date): boolean {\n    const validity: boolean[] = [];\n\n    if (props.pickerProps.minDate)\n        validity.push(date >= props.pickerProps.minDate);\n    if (props.pickerProps.maxDate)\n        validity.push(date <= props.pickerProps.maxDate);\n\n    validity.push(date.getFullYear() === props.focusedDate.year);\n\n    if (props.pickerProps.selectableDates) {\n        if (typeof props.pickerProps.selectableDates === \"function\") {\n            if (props.pickerProps.selectableDates(date)) return true;\n            else validity.push(false);\n        } else {\n            for (let i = 0; i < props.pickerProps.selectableDates.length; i++) {\n                const enabledDate = props.pickerProps.selectableDates[i];\n                if (\n                    date.getFullYear() === enabledDate.getFullYear() &&\n                    date.getMonth() === enabledDate.getMonth()\n                )\n                    return true;\n                else validity.push(false);\n            }\n        }\n    }\n\n    if (props.pickerProps.unselectableDates) {\n        if (typeof props.pickerProps.unselectableDates === \"function\") {\n            validity.push(!props.pickerProps.unselectableDates(date));\n        } else {\n            for (\n                let i = 0;\n                i < props.pickerProps.unselectableDates.length;\n                i++\n            ) {\n                const disabledDate = props.pickerProps.unselectableDates[i];\n                validity.push(\n                    date.getFullYear() !== disabledDate.getFullYear() ||\n                        date.getMonth() !== disabledDate.getMonth(),\n                );\n            }\n        }\n    }\n\n    if (props.pickerProps.unselectableDaysOfWeek) {\n        for (\n            let i = 0;\n            i < props.pickerProps.unselectableDaysOfWeek.length;\n            i++\n        ) {\n            const dayOfWeek = props.pickerProps.unselectableDaysOfWeek[i];\n            validity.push(date.getDay() !== dayOfWeek);\n        }\n    }\n\n    return validity.indexOf(false) < 0;\n}\n\n// --- Event Handlers ---\n\nfunction onKeydown(event: KeyboardEvent, weekDay: Date): void {\n    let preventDefault = true;\n    switch (event.key) {\n        case \"Tab\": {\n            preventDefault = false;\n            break;\n        }\n        case \" \":\n        case \"Space\":\n        case \"Spacebar\":\n        case \"Enter\": {\n            selectDate(weekDay);\n            break;\n        }\n\n        case \"ArrowLeft\":\n        case \"Left\": {\n            changeFocus(weekDay, -1);\n            break;\n        }\n        case \"ArrowRight\":\n        case \"Right\": {\n            changeFocus(weekDay, 1);\n            break;\n        }\n        case \"ArrowUp\":\n        case \"Up\": {\n            changeFocus(weekDay, -7);\n            break;\n        }\n        case \"ArrowDown\":\n        case \"Down\": {\n            changeFocus(weekDay, 7);\n            break;\n        }\n    }\n    if (preventDefault) event.preventDefault();\n}\n\n/*\n * Emit update:modelValue event with selected date as payload for v-model in parent\n */\nfunction selectDate(date: Date): void {\n    if (props.pickerProps.disabled || props.pickerProps.readonly) return;\n    if (!isDateSelectable(date)) return;\n\n    if (isTrueish(props.pickerProps.range)) handleSelectRangeDate(date);\n    else if (isTrueish(props.pickerProps.multiple))\n        handleSelectMultipleDates(date);\n    else emits(\"update:model-value\", date);\n}\n\n/*\n * If both begin and end dates are set, reset the end date and set the begin date.\n * If only begin date is selected, emit an array of the begin date and the new date.\n * If not set, only set the begin date.\n */\nfunction handleSelectRangeDate(date: Date): void {\n    if (selectedBeginDate.value && selectedEndDate.value) {\n        selectedBeginDate.value = date;\n        selectedEndDate.value = undefined;\n        emits(\"range-start\", date);\n    } else if (selectedBeginDate.value && !selectedEndDate.value) {\n        if (selectedBeginDate.value > date) {\n            selectedEndDate.value = selectedBeginDate.value;\n            selectedBeginDate.value = date;\n        } else {\n            selectedEndDate.value = date;\n        }\n        emits(\"range-end\", date);\n        emits(\"update:model-value\", [\n            selectedBeginDate.value,\n            selectedEndDate.value,\n        ]);\n    } else {\n        selectedBeginDate.value = date;\n        emits(\"range-start\", date);\n    }\n}\n\nconst multipleSelectedDates = computed(() =>\n    isTrueish(props.pickerProps.multiple) && props.modelValue\n        ? props.modelValue\n        : [],\n);\n\nfunction handleSelectMultipleDates(date: Date): void {\n    if (!Array.isArray(props.modelValue)) return;\n    let multipleSelectedDates = props.modelValue;\n\n    const multipleSelect = multipleSelectedDates.filter(\n        (selectedDate) =>\n            selectedDate.getDate() === date.getDate() &&\n            selectedDate.getFullYear() === date.getFullYear() &&\n            selectedDate.getMonth() === date.getMonth(),\n    );\n    if (multipleSelect.length) {\n        multipleSelectedDates = multipleSelectedDates.filter(\n            (selectedDate) =>\n                selectedDate.getDate() !== date.getDate() ||\n                selectedDate.getFullYear() !== date.getFullYear() ||\n                selectedDate.getMonth() !== date.getMonth(),\n        );\n    } else {\n        multipleSelectedDates.push(date);\n    }\n    emits(\"update:model-value\", multipleSelectedDates);\n}\n\nfunction changeFocus(month: Date, inc: number): void {\n    month.setMonth(month.getMonth() + inc);\n    const focused = {\n        day: month.getDate(),\n        month: month.getMonth(),\n        year: month.getFullYear(),\n    };\n    emits(\"update:focusedDate\", focused);\n}\n\nfunction onRangeHoverEndDate(day: Date): void {\n    if (isTrueish(props.pickerProps.range)) hoveredEndDate.value = day;\n}\n\n// #region --- Computed Component Classes ---\n\nfunction dateMatch(dateOne, dateTwo, multiple = false): boolean {\n    // if either date is null or undefined, return false\n    if (!dateOne || !dateTwo || multiple) return false;\n    if (Array.isArray(dateTwo))\n        return dateTwo.some(\n            (date) =>\n                dateOne.getFullYear() === date.getFullYear() &&\n                dateOne.getMonth() === date.getMonth(),\n        );\n    return (\n        dateOne.getFullYear() === dateTwo.getFullYear() &&\n        dateOne.getMonth() === dateTwo.getMonth()\n    );\n}\n\nfunction dateWithin(dateOne, dates, multiple = false): boolean {\n    if (!Array.isArray(dates) || multiple) return false;\n    return dateOne > dates[0] && dateOne < dates[1];\n}\n\nfunction dateMultipleSelected(dateOne, dates, multiple = false): boolean {\n    if (!Array.isArray(dates) || !multiple) return false;\n    return dates.some(\n        (date) =>\n            dateOne.getDate() === date.getDate() &&\n            dateOne.getFullYear() === date.getFullYear() &&\n            dateOne.getMonth() === date.getMonth(),\n    );\n}\n\nconst monthClasses = defineClasses(\n    [\"monthClass\", \"o-datepicker__month\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst monthTableClasses = defineClasses(\n    [\"monthTableClass\", \"o-datepicker__month__table\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\nconst monthCellClasses = defineClasses(\n    [\"monthCellClass\", \"o-datepicker__month__cell\"],\n    [\n        \"monthCellEventsClass\",\n        \"o-datepicker__month__cell--events\",\n        null,\n        hasEvents,\n    ],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\n// Registers a dispose callback on the current active effect scope.\nconst scope = effectScope();\n\n// stop all scope effects\nonUnmounted(() => scope.stop());\n\n/**\n * Build classes for cell using validations\n */\nfunction cellClasses(day: Date): ClassBinding[] {\n    const classes = defineClasses(\n        [\n            \"monthCellSelectedClass\",\n            \"o-datepicker__month__cell--selected\",\n            null,\n            dateMatch(\n                day,\n                props.modelValue,\n                isTrueish(props.pickerProps.multiple),\n            ) ||\n                dateWithin(\n                    day,\n                    props.modelValue,\n                    isTrueish(props.pickerProps.multiple),\n                ) ||\n                dateMultipleSelected(\n                    day,\n                    multipleSelectedDates.value,\n                    isTrueish(props.pickerProps.multiple),\n                ),\n        ],\n        [\n            \"monthCellFirstSelectedClass\",\n            \"o-datepicker__month__cell--first-selected\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.modelValue) && props.modelValue[0],\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"monthCellWithinSelectedClass\",\n            \"o-datepicker__month__cell--within-selected\",\n            null,\n            dateWithin(\n                day,\n                props.modelValue,\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"monthCellLastSelectedClass\",\n            \"o-datepicker__month__cell--last-selected\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(props.modelValue) && props.modelValue[1],\n                isTrueish(props.pickerProps.multiple),\n            ),\n        ],\n        [\n            \"monthCellWithinHoveredRangeClass\",\n            \"o-datepicker__month__cell--within-hovered-range\",\n            null,\n            hoveredDateRange.value &&\n                hoveredDateRange.value.length === 2 &&\n                (dateMatch(day, hoveredDateRange.value) ||\n                    dateWithin(day, hoveredDateRange.value)),\n        ],\n        [\n            \"monthCellFirstHoveredClass\",\n            \"o-datepicker__month__cell--first-hovered\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(hoveredDateRange.value) &&\n                    hoveredDateRange.value[0],\n            ),\n        ],\n        [\n            \"monthCellWithinHoveredClass\",\n            \"o-datepicker__month__cell--within-hovered\",\n            null,\n            dateWithin(day, hoveredDateRange.value),\n        ],\n        [\n            \"monthCellLastHoveredClass\",\n            \"o-datepicker__month__cell--last-hovered\",\n            null,\n            dateMatch(\n                day,\n                Array.isArray(hoveredDateRange.value) &&\n                    hoveredDateRange.value[1],\n            ),\n        ],\n        [\n            \"monthCellTodayClass\",\n            \"o-datepicker__month__cell--today\",\n            null,\n            dateMatch(day, dateCreator()),\n        ],\n        [\n            \"monthCellSelectableclass\",\n            \"o-datepicker__month__cell--selectable\",\n            null,\n            isDateSelectable(day) &&\n                !props.pickerProps.disabled &&\n                !props.pickerProps.readonly,\n        ],\n        [\n            \"monthCellUnselectableClass\",\n            \"o-datepicker__month__cell--unselectable\",\n            null,\n            !isDateSelectable(day) || props.pickerProps.disabled,\n        ],\n        // pass effect scope for rectivity binding\n        { scope },\n    );\n    return [...monthCellClasses.value, ...classes.value];\n}\n\nconst monthEventsClasses = defineClasses(\n    [\"monthEventsClass\", \"o-datepicker__month__events\"],\n    // passing the picker props will add reactivity to property changes\n    { props: props.pickerProps },\n);\n\n/**\n * Build classes for event\n */\nfunction eventClasses(event: DatepickerEvent): ClassBinding[] {\n    const classes = defineClasses(\n        [\"monthEventClass\", \"o-datepicker__month__event\"],\n        [\n            \"monthEventTypeClass\",\n            \"o-datepicker__month__event--\",\n            event.type,\n            !!event.type,\n        ],\n        [\n            \"monthEventIndicatorClass\",\n            \"o-datepicker__month__event--\",\n            props.pickerProps.indicators,\n            !!props.pickerProps.indicators,\n        ],\n        // pass effect scope for rectivity binding\n        { scope },\n    );\n    return classes.value;\n}\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <section :class=\"monthClasses\">\n        <div :class=\"monthTableClasses\">\n            <template v-for=\"(date, idx) in monthDates\" :key=\"idx\">\n                <div\n                    v-if=\"\n                        !pickerProps.disabled &&\n                        !pickerProps.readonly &&\n                        isDateSelectable(date)\n                    \"\n                    :ref=\"(el) => setMonthRef(date, el)\"\n                    :class=\"cellClasses(date)\"\n                    role=\"button\"\n                    :tabindex=\"\n                        focusedDate.month === date.getMonth() ? undefined : 0\n                    \"\n                    @click.prevent=\"selectDate(date)\"\n                    @mouseenter=\"onRangeHoverEndDate(date)\"\n                    @focus=\"onRangeHoverEndDate(date)\"\n                    @keydown.prevent=\"onKeydown($event, date)\">\n                    {{ monthNames[date.getMonth()] }}\n                    <div\n                        v-if=\"eventsDateMatch(date).length\"\n                        :class=\"monthEventsClasses\">\n                        <div\n                            v-for=\"(event, index) in eventsDateMatch(date)\"\n                            :key=\"index\"\n                            :class=\"eventClasses(event)\" />\n                    </div>\n                </div>\n\n                <div v-else :class=\"cellClasses(date)\">\n                    {{ monthNames[date.getMonth()] }}\n                    <div\n                        v-if=\"eventsDateMatch(date).length\"\n                        :class=\"monthEventsClasses\">\n                        <div\n                            v-for=\"(event, index) in eventsDateMatch(date)\"\n                            :key=\"index\"\n                            :class=\"eventClasses(event)\" />\n                    </div>\n                </div>\n            </template>\n        </div>\n    </section>\n</template>\n","<script\n    setup\n    lang=\"ts\"\n    generic=\"\n        IsRange extends boolean = false,\n        IsMultiple extends boolean = false\n    \">\nimport { computed, ref, watch, useTemplateRef } from \"vue\";\n\nimport OButton from \"../button/Button.vue\";\nimport OSelect from \"../select/Select.vue\";\nimport OPickerWrapper from \"../utils/PickerWrapper.vue\";\nimport ODatepickerTable from \"./DatepickerTable.vue\";\nimport ODatepickerMonth from \"./DatepickerMonth.vue\";\n\nimport { getDefault, getDefaultFunction } from \"@/utils/config\";\nimport { isDate, pad } from \"@/utils/helpers\";\nimport { defineClasses, getActiveClasses, useMatchMedia } from \"@/composables\";\n\nimport { useDatepickerMixins } from \"./useDatepickerMixins\";\nimport { getMonthNames, getWeekdayNames } from \"./utils\";\n\nimport type { FocusedDate } from \"./types\";\nimport type { DatepickerProps } from \"./props\";\nimport type { SelectOption } from \"../select\";\n\n/**\n * An input with a simple dropdown/modal for selecting a date, uses native datepicker for mobile.\n * @displayName Datepicker\n * @style _datepicker.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ODatepicker\",\n    configField: \"datepicker\",\n});\n\ntype ModelValue = DatepickerProps<IsRange, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(\n    defineProps<DatepickerProps<IsRange, IsMultiple>>(),\n    {\n        override: undefined,\n        modelValue: undefined,\n        // range: false,\n        // multiple: false,\n        active: false,\n        type: \"date\",\n        dayNames: () => getDefault(\"datepicker.dayNames\"),\n        monthNames: () => getDefault(\"datepicker.monthNames\"),\n        size: () => getDefault(\"datepicker.size\"),\n        focusedDate: undefined,\n        events: undefined,\n        indicators: \"dots\",\n        minDate: undefined,\n        maxDate: undefined,\n        expanded: () => getDefault(\"datepicker.expanded\", false),\n        rounded: false,\n        inline: false,\n        placeholder: undefined,\n        readonly: false,\n        disabled: false,\n        openOnFocus: () => getDefault(\"datepicker.openOnFocus\", true),\n        closeOnClick: () => getDefault(\"datepicker.closeOnClick\", true),\n        locale: () => getDefault(\"locale\"),\n        formatter: getDefaultFunction(\"datepicker.formatter\"),\n        parser: getDefaultFunction(\"datepicker.parser\"),\n        creator: getDefaultFunction(\"datepicker.creator\"),\n        selectableDates: undefined,\n        unselectableDates: undefined,\n        unselectableDaysOfWeek: () =>\n            getDefault(\"datepicker.unselectableDaysOfWeek\"),\n        nearbyMonthDays: () => getDefault(\"datepicker.nearbyMonthDays\", true),\n        nearbySelectableMonthDays: () =>\n            getDefault(\"datepicker.nearbySelectableMonthDays\", false),\n        showWeekNumber: () => getDefault(\"datepicker.showWeekNumber\", false),\n        weekNumberClickable: () =>\n            getDefault(\"datepicker.weekNumberClickable\", false),\n        firstDayOfWeek: () => getDefault(\"datepicker.firstDayOfWeek\", 0),\n        rulesForFirstWeek: 4,\n        yearsRange: () => getDefault(\"datepicker.yearsRange\", [-100, 10]),\n        position: undefined,\n        iconPack: () => getDefault(\"datepicker.iconPack\"),\n        icon: () => getDefault(\"datepicker.icon\"),\n        iconRight: () => getDefault(\"datepicker.iconRight\"),\n        iconRightClickable: false,\n        iconPrev: () => getDefault(\"datepicker.iconPrev\", \"chevron-left\"),\n        iconNext: () => getDefault(\"datepicker.iconNext\", \"chevron-right\"),\n        desktopModal: () => getDefault(\"datepicker.desktopModal\", false),\n        mobileModal: () => getDefault(\"datepicker.mobileModal\", true),\n        mobileNative: () => getDefault(\"datepicker.mobileNative\", false),\n        mobileBreakpoint: () => getDefault(\"datepicker.mobileBreakpoint\"),\n        teleport: () => getDefault(\"datepicker.teleport\", false),\n        useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n        customValidity: \"\",\n        ariaNextLabel: () =>\n            getDefault(\"datepicker.ariaNextLabel\", \"Next Page\"),\n        ariaPreviousLabel: () =>\n            getDefault(\"datepicker.ariaNextLabel\", \"Previous Page\"),\n        ariaSelectMonthLabel: () =>\n            getDefault(\"datepicker.ariaSelectMonthLabel\", \"Select Month\"),\n        ariaSelectYearLabel: () =>\n            getDefault(\"datepicker.ariaSelectYearLabel\", \"Select Year\"),\n        inputClasses: () => getDefault(\"datepicker.inputClasses\"),\n        dropdownClasses: () => getDefault(\"datepicker.dropdownClasses\"),\n        selectClasses: () => getDefault(\"datepicker.selectClasses\"),\n    },\n);\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {Date | Date[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on range start is selected event\n     * @param value {Date} - range start date\n     */\n    \"range-start\": [value: Date];\n    /**\n     * on range end is selected event\n     * @param value {Date} - range end date\n     */\n    \"range-end\": [value: Date];\n    /**\n     * on month change event\n     * @param value {number} - month number\n     */\n    \"change-month\": [value: number];\n    /**\n     * on year change event\n     * @param value {number} - year number\n     */\n    \"change-year\": [value: number];\n    /**\n     *  on week number click event\n     * @param value {number} - week number\n     */\n    \"week-number-click\": [value: number];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the trigger input element */\n    trigger?(): void;\n    /** Override the header */\n    header?(): void;\n    /** Override the body */\n    body?(): void;\n    /** Define an additional footer */\n    footer?(): void;\n}>();\n\nconst { dtf, dateCreator, dateFormatter, dateParser } =\n    useDatepickerMixins(props);\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst pickerRef = useTemplateRef(\"pickerComponent\");\n\n// the modelvalue of selected date, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst isTypeMonth = computed(() => props.type === \"month\");\n\n/**\n * When v-model is changed:\n *   1. Update internal value.\n */\nwatch(\n    () => props.modelValue,\n    (value: ModelValue) => {\n        const isArray = Array.isArray(value);\n        const currentDate: Date = isArray\n            ? value.length\n                ? value[value.length - 1]\n                : dateCreator()\n            : value\n              ? value\n              : dateCreator();\n        if (\n            !isArray ||\n            (isArray &&\n                Array.isArray(vmodel.value) &&\n                value.length > vmodel.value.length)\n        )\n            // update internal state\n            focusedDateData.value = {\n                day: currentDate.getDate(),\n                month: currentDate.getMonth(),\n                year: currentDate.getFullYear(),\n            };\n    },\n);\n\nwatch(\n    () => props.focusedDate,\n    (value) => {\n        if (value) {\n            focusedDateData.value = {\n                day: value.getDate(),\n                month: value.getMonth(),\n                year: value.getFullYear(),\n            };\n        }\n    },\n);\n\nconst _initialDate: Date =\n    (Array.isArray(props.modelValue)\n        ? props.modelValue[0]\n        : props.modelValue) ||\n    props.focusedDate ||\n    dateCreator();\n\nif (\n    !props.modelValue &&\n    props.maxDate &&\n    props.maxDate.getFullYear() < _initialDate.getFullYear()\n) {\n    _initialDate.setFullYear(props.maxDate.getFullYear());\n}\n\nconst focusedDateData = ref<FocusedDate>({\n    day: _initialDate.getDate(),\n    month: _initialDate.getMonth(),\n    year: _initialDate.getFullYear(),\n});\n\n/*\n * Emit input event on month and/or year change\n */\nwatch(\n    () => focusedDateData.value.month,\n    (value) => emits(\"change-month\", value),\n);\nwatch(\n    () => focusedDateData.value.year,\n    (value) => emits(\"change-year\", value),\n);\n\nconst computedMonthNames = computed(() =>\n    Array.isArray(props.monthNames)\n        ? props.monthNames\n        : getMonthNames(props.locale),\n);\n\nconst listOfMonths = computed<SelectOption<number>[]>(() => {\n    let minMonth = 0;\n    let maxMonth = 12;\n    if (\n        props.minDate &&\n        focusedDateData.value.year === props.minDate.getFullYear()\n    ) {\n        minMonth = props.minDate.getMonth();\n    }\n    if (\n        props.maxDate &&\n        focusedDateData.value.year === props.maxDate.getFullYear()\n    ) {\n        maxMonth = props.maxDate.getMonth();\n    }\n    return computedMonthNames.value.map((name, index) => ({\n        label: name,\n        value: index,\n        disabled: index < minMonth || index > maxMonth,\n    }));\n});\n\nconst computedDayNames = computed(() =>\n    Array.isArray(props.dayNames)\n        ? props.dayNames\n        : getWeekdayNames(props.locale),\n);\n\n/*\n * Returns an array of years for the year dropdown. If earliest/latest\n * dates are set by props, range of years will fall within those dates.\n */\nconst listOfYears = computed<SelectOption<number>[]>(() => {\n    let latestYear = _initialDate.getFullYear() + (props.yearsRange[1] ?? 0);\n    if (props.maxDate && props.maxDate.getFullYear() < latestYear) {\n        latestYear = Math.max(\n            props.maxDate.getFullYear(),\n            focusedDateData.value.year,\n        );\n    }\n\n    let earliestYear = _initialDate.getFullYear() + (props.yearsRange[0] ?? 0);\n    if (props.minDate && props.minDate.getFullYear() > earliestYear) {\n        earliestYear = Math.min(\n            props.minDate.getFullYear(),\n            focusedDateData.value.year,\n        );\n    }\n\n    return Array.from(\n        { length: latestYear - earliestYear + 1 || 1 },\n        (value, index) => earliestYear + index,\n    )\n        .reverse()\n        .map((year) => ({\n            label: String(year),\n            value: year,\n        }));\n});\n\nconst showPrev = computed<boolean>(() => {\n    if (!props.minDate) return true;\n    if (isTypeMonth.value)\n        return focusedDateData.value.year > props.minDate.getFullYear();\n\n    const dateToCheck = new Date(\n        focusedDateData.value.year,\n        focusedDateData.value.month,\n    );\n    const date = new Date(\n        props.minDate.getFullYear(),\n        props.minDate.getMonth(),\n    );\n    return dateToCheck > date;\n});\n\n/**\n * Either decrement month by 1 if not January or decrement year by 1\n * and set month to 11 (December) or decrement year when 'month'\n */\nfunction prev(): void {\n    if (props.disabled) return;\n\n    if (isTypeMonth.value) {\n        focusedDateData.value.year -= 1;\n    } else {\n        if (focusedDateData.value.month > 0) {\n            focusedDateData.value.month -= 1;\n        } else {\n            focusedDateData.value.month = 11;\n            focusedDateData.value.year -= 1;\n        }\n    }\n}\n\nconst showNext = computed<boolean>(() => {\n    if (!props.maxDate) return true;\n    if (isTypeMonth.value)\n        return focusedDateData.value.year < props.maxDate.getFullYear();\n\n    const dateToCheck = new Date(\n        focusedDateData.value.year,\n        focusedDateData.value.month,\n    );\n    const date = new Date(\n        props.maxDate.getFullYear(),\n        props.maxDate.getMonth(),\n    );\n    return dateToCheck < date;\n});\n\n/**\n * Either increment month by 1 if not December or increment year by 1\n * and set month to 0 (January) or increment year when 'month'\n */\nfunction next(): void {\n    if (props.disabled) return;\n    if (isTypeMonth.value) {\n        focusedDateData.value.year += 1;\n    } else {\n        if (focusedDateData.value.month < 11) {\n            focusedDateData.value.month += 1;\n        } else {\n            focusedDateData.value.month = 0;\n            focusedDateData.value.year += 1;\n        }\n    }\n}\n\n// #region --- Formatter / Parser ---\n\n/** Format date into string */\nfunction format(value: Date | Date[] | undefined, isNative: boolean): string {\n    if (isNative) return formatNative(value);\n\n    // define function prop\n    const date = (Array.isArray(value) ? [...value] : value) as ModelValue;\n\n    return dateFormatter(date);\n}\n\nfunction formatNative(value: Date | Date[] | undefined): string {\n    if (Array.isArray(value)) value = value[0];\n\n    // return empty string if no value is given or value can't parse to proper date\n    if (!value) return \"\";\n    const date = new Date(value);\n    if (!isDate(date)) return \"\";\n\n    if (isTypeMonth.value) {\n        // Format date into string 'YYYY-MM'\n        const year = date.getFullYear();\n        const month = date.getMonth() + 1;\n        return year + \"-\" + pad(month);\n    } else {\n        // Format date into string 'YYYY-MM-DD'\n        const year = date.getFullYear();\n        const month = date.getMonth() + 1;\n        const day = date.getDate();\n        return year + \"-\" + pad(month) + \"-\" + pad(day);\n    }\n}\n\n/** Parse string into date */\nfunction parse(value: string, isNative: boolean): Date | Date[] | undefined {\n    if (isNative) return parseNative(value);\n\n    const date = dateParser(value);\n\n    const isValid =\n        isDate(date) ||\n        (Array.isArray(date) &&\n            date.length === 2 &&\n            isDate(date[0]) &&\n            isDate(date[1]));\n\n    return isValid ? date : undefined;\n}\n\n/** Parse date from string */\nfunction parseNative(value: string): Date | undefined {\n    const s = value ? value.split(\"-\") : [];\n    if (s.length !== 3) return undefined;\n    const year = parseInt(s[0], 10);\n    const month = parseInt(s[1]) - 1;\n    const day = parseInt(s[2]);\n    return new Date(year, month, day);\n}\n\n// #endregion --- Formatter / Parser ---\n\n// #region --- Event Handler ---\n\n/** move to the previous focused date */\nfunction prevDate(): void {\n    if (props.disabled) return;\n\n    if (isTypeMonth.value) {\n        focusedDateData.value.year -= 1;\n    } else {\n        const date = new Date(\n            focusedDateData.value.year,\n            focusedDateData.value.month,\n            focusedDateData.value.day,\n        );\n        date.setDate(date.getDate() - 1);\n        focusedDateData.value.day = date.getDate();\n        focusedDateData.value.month = date.getMonth();\n        focusedDateData.value.year = date.getFullYear();\n\n        // todo: show selected hovered date\n        // vmodel.value = date as ModelValue;\n    }\n}\n\n/** move to the next focused date */\nfunction nextDate(): void {\n    if (props.disabled) return;\n\n    if (isTypeMonth.value) {\n        focusedDateData.value.year += 1;\n    } else {\n        const date = new Date(\n            focusedDateData.value.year,\n            focusedDateData.value.month,\n            focusedDateData.value.day,\n        );\n        date.setDate(date.getDate() + 1);\n        focusedDateData.value.day = date.getDate();\n        focusedDateData.value.month = date.getMonth();\n        focusedDateData.value.year = date.getFullYear();\n\n        // todo: show selected hovered date\n        // vmodel.value = date as ModelValue;\n    }\n}\n\n// #endregion --- Event Handler ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-datepicker\"],\n    [\n        \"sizeClass\",\n        \"o-datepicker--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\"mobileClass\", \"o-datepicker--mobile\", null, isMobile],\n    [\n        \"expandedClass\",\n        \"o-datepicker--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n);\n\nconst boxClasses = defineClasses([\"boxClass\", \"o-datepicker__box\"]);\nconst boxClassBind = computed(() => getActiveClasses(boxClasses));\n\nconst headerClasses = defineClasses([\"headerClass\", \"o-datepicker__header\"]);\n\nconst prevButtonClasses = defineClasses([\n    \"prevButtonClass\",\n    \"o-datepicker__header__previous\",\n]);\n\nconst nextButtonClasses = defineClasses([\n    \"nextButtonClass\",\n    \"o-datepicker__header__next\",\n]);\n\nconst listsClasses = defineClasses([\n    \"listsClass\",\n    \"o-datepicker__header__list\",\n]);\n\nconst footerClasses = defineClasses([\"footerClass\", \"o-datepicker__footer\"]);\n\nconst pickerDropdownClasses = defineClasses([\n    \"dropdownClass\",\n    \"o-datepicker__dropdown\",\n]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ focus: () => pickerRef.value?.focus(), value: vmodel });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <OPickerWrapper\n        ref=\"pickerComponent\"\n        v-model:active=\"isActive\"\n        v-model:value=\"vmodel\"\n        data-oruga=\"datepicker\"\n        :picker-props=\"props\"\n        :formatter=\"format\"\n        :parser=\"parse\"\n        :type=\"!isTypeMonth ? 'date' : 'month'\"\n        :max=\"maxDate\"\n        :min=\"minDate\"\n        :stay-open=\"props.multiple\"\n        :root-classes=\"rootClasses\"\n        :dropdown-classes=\"pickerDropdownClasses\"\n        :box-class=\"boxClassBind\"\n        :dtf=\"dtf\"\n        @focus=\"$emit('focus', $event)\"\n        @blur=\"$emit('blur', $event)\"\n        @invalid=\"$emit('invalid', $event)\"\n        @left=\"prevDate\"\n        @right=\"nextDate\"\n        @icon-click=\"$emit('icon-click', $event)\"\n        @icon-right-click=\"$emit('icon-right-click', $event)\">\n        <template v-if=\"$slots.trigger\" #trigger>\n            <slot name=\"trigger\" />\n        </template>\n\n        <header :class=\"headerClasses\">\n            <slot name=\"header\">\n                <OButton\n                    v-if=\"!disabled\"\n                    :class=\"prevButtonClasses\"\n                    :disabled=\"!showPrev\"\n                    :icon-pack=\"iconPack\"\n                    :icon-left=\"iconPrev\"\n                    :size=\"size\"\n                    :aria-label=\"ariaPreviousLabel\"\n                    @click.prevent=\"prev\"\n                    @keydown.enter.prevent=\"prev\"\n                    @keydown.space.prevent=\"prev\" />\n\n                <OButton\n                    v-if=\"!disabled\"\n                    :class=\"nextButtonClasses\"\n                    :disabled=\"!showNext\"\n                    :icon-pack=\"iconPack\"\n                    :icon-left=\"iconNext\"\n                    :size=\"size\"\n                    :aria-label=\"ariaNextLabel\"\n                    @click.prevent=\"next\"\n                    @keydown.enter.prevent=\"next\"\n                    @keydown.space.prevent=\"next\" />\n\n                <div :class=\"listsClasses\">\n                    <o-select\n                        v-if=\"!isTypeMonth\"\n                        v-bind=\"selectClasses\"\n                        v-model=\"focusedDateData.month\"\n                        :disabled=\"disabled\"\n                        :size=\"size\"\n                        :options=\"listOfMonths\"\n                        :aria-label=\"ariaSelectMonthLabel\"\n                        :use-html5-validation=\"false\"\n                        @keydown.left.stop.prevent=\"prev\"\n                        @keydown.right.stop.prevent=\"next\" />\n\n                    <o-select\n                        v-bind=\"selectClasses\"\n                        v-model=\"focusedDateData.year\"\n                        :disabled=\"disabled\"\n                        :size=\"size\"\n                        :options=\"listOfYears\"\n                        :aria-label=\"ariaSelectYearLabel\"\n                        :use-html5-validation=\"false\"\n                        @keydown.left.stop.prevent=\"prev\"\n                        @keydown.right.stop.prevent=\"next\"\n                        @keydown.up.stop.prevent=\"focusedDateData.year += 1\"\n                        @keydown.down.stop.prevent=\"\n                            focusedDateData.year -= 1\n                        \" />\n                </div>\n            </slot>\n        </header>\n\n        <slot name=\"body\">\n            <o-datepicker-month\n                v-if=\"isTypeMonth\"\n                v-model=\"vmodel\"\n                v-model:focused-date=\"focusedDateData\"\n                :month-names=\"computedMonthNames\"\n                :picker-props=\"props\"\n                @range-start=\"$emit('range-start', $event)\"\n                @range-end=\"$emit('range-end', $event)\" />\n\n            <o-datepicker-table\n                v-else\n                v-model=\"vmodel\"\n                v-model:focused-date=\"focusedDateData\"\n                :day-names=\"computedDayNames\"\n                :month-names=\"computedMonthNames\"\n                :picker-props=\"props\"\n                @week-number-click=\"$emit('week-number-click', $event)\"\n                @range-start=\"$emit('range-start', $event)\"\n                @range-end=\"$emit('range-end', $event)\" />\n        </slot>\n\n        <footer v-if=\"$slots.footer\" :class=\"footerClasses\">\n            <slot name=\"footer\" />\n        </footer>\n    </OPickerWrapper>\n</template>\n","<script\n    setup\n    lang=\"ts\"\n    generic=\"\n        IsRange extends boolean = false,\n        IsMultiple extends boolean = false\n    \">\nimport { computed, ref, watch, useTemplateRef } from \"vue\";\n\nimport OButton from \"../button/Button.vue\";\nimport OSelect from \"../select/Select.vue\";\nimport OPickerWrapper from \"../utils/PickerWrapper.vue\";\nimport ODatepickerTable from \"./DatepickerTable.vue\";\nimport ODatepickerMonth from \"./DatepickerMonth.vue\";\n\nimport { getDefault, getDefaultFunction } from \"@/utils/config\";\nimport { isDate, pad } from \"@/utils/helpers\";\nimport { defineClasses, getActiveClasses, useMatchMedia } from \"@/composables\";\n\nimport { useDatepickerMixins } from \"./useDatepickerMixins\";\nimport { getMonthNames, getWeekdayNames } from \"./utils\";\n\nimport type { FocusedDate } from \"./types\";\nimport type { DatepickerProps } from \"./props\";\nimport type { SelectOption } from \"../select\";\n\n/**\n * An input with a simple dropdown/modal for selecting a date, uses native datepicker for mobile.\n * @displayName Datepicker\n * @style _datepicker.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ODatepicker\",\n    configField: \"datepicker\",\n});\n\ntype ModelValue = DatepickerProps<IsRange, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(\n    defineProps<DatepickerProps<IsRange, IsMultiple>>(),\n    {\n        override: undefined,\n        modelValue: undefined,\n        // range: false,\n        // multiple: false,\n        active: false,\n        type: \"date\",\n        dayNames: () => getDefault(\"datepicker.dayNames\"),\n        monthNames: () => getDefault(\"datepicker.monthNames\"),\n        size: () => getDefault(\"datepicker.size\"),\n        focusedDate: undefined,\n        events: undefined,\n        indicators: \"dots\",\n        minDate: undefined,\n        maxDate: undefined,\n        expanded: () => getDefault(\"datepicker.expanded\", false),\n        rounded: false,\n        inline: false,\n        placeholder: undefined,\n        readonly: false,\n        disabled: false,\n        openOnFocus: () => getDefault(\"datepicker.openOnFocus\", true),\n        closeOnClick: () => getDefault(\"datepicker.closeOnClick\", true),\n        locale: () => getDefault(\"locale\"),\n        formatter: getDefaultFunction(\"datepicker.formatter\"),\n        parser: getDefaultFunction(\"datepicker.parser\"),\n        creator: getDefaultFunction(\"datepicker.creator\"),\n        selectableDates: undefined,\n        unselectableDates: undefined,\n        unselectableDaysOfWeek: () =>\n            getDefault(\"datepicker.unselectableDaysOfWeek\"),\n        nearbyMonthDays: () => getDefault(\"datepicker.nearbyMonthDays\", true),\n        nearbySelectableMonthDays: () =>\n            getDefault(\"datepicker.nearbySelectableMonthDays\", false),\n        showWeekNumber: () => getDefault(\"datepicker.showWeekNumber\", false),\n        weekNumberClickable: () =>\n            getDefault(\"datepicker.weekNumberClickable\", false),\n        firstDayOfWeek: () => getDefault(\"datepicker.firstDayOfWeek\", 0),\n        rulesForFirstWeek: 4,\n        yearsRange: () => getDefault(\"datepicker.yearsRange\", [-100, 10]),\n        position: undefined,\n        iconPack: () => getDefault(\"datepicker.iconPack\"),\n        icon: () => getDefault(\"datepicker.icon\"),\n        iconRight: () => getDefault(\"datepicker.iconRight\"),\n        iconRightClickable: false,\n        iconPrev: () => getDefault(\"datepicker.iconPrev\", \"chevron-left\"),\n        iconNext: () => getDefault(\"datepicker.iconNext\", \"chevron-right\"),\n        desktopModal: () => getDefault(\"datepicker.desktopModal\", false),\n        mobileModal: () => getDefault(\"datepicker.mobileModal\", true),\n        mobileNative: () => getDefault(\"datepicker.mobileNative\", false),\n        mobileBreakpoint: () => getDefault(\"datepicker.mobileBreakpoint\"),\n        teleport: () => getDefault(\"datepicker.teleport\", false),\n        useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n        customValidity: \"\",\n        ariaNextLabel: () =>\n            getDefault(\"datepicker.ariaNextLabel\", \"Next Page\"),\n        ariaPreviousLabel: () =>\n            getDefault(\"datepicker.ariaNextLabel\", \"Previous Page\"),\n        ariaSelectMonthLabel: () =>\n            getDefault(\"datepicker.ariaSelectMonthLabel\", \"Select Month\"),\n        ariaSelectYearLabel: () =>\n            getDefault(\"datepicker.ariaSelectYearLabel\", \"Select Year\"),\n        inputClasses: () => getDefault(\"datepicker.inputClasses\"),\n        dropdownClasses: () => getDefault(\"datepicker.dropdownClasses\"),\n        selectClasses: () => getDefault(\"datepicker.selectClasses\"),\n    },\n);\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {Date | Date[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on range start is selected event\n     * @param value {Date} - range start date\n     */\n    \"range-start\": [value: Date];\n    /**\n     * on range end is selected event\n     * @param value {Date} - range end date\n     */\n    \"range-end\": [value: Date];\n    /**\n     * on month change event\n     * @param value {number} - month number\n     */\n    \"change-month\": [value: number];\n    /**\n     * on year change event\n     * @param value {number} - year number\n     */\n    \"change-year\": [value: number];\n    /**\n     *  on week number click event\n     * @param value {number} - week number\n     */\n    \"week-number-click\": [value: number];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the trigger input element */\n    trigger?(): void;\n    /** Override the header */\n    header?(): void;\n    /** Override the body */\n    body?(): void;\n    /** Define an additional footer */\n    footer?(): void;\n}>();\n\nconst { dtf, dateCreator, dateFormatter, dateParser } =\n    useDatepickerMixins(props);\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst pickerRef = useTemplateRef(\"pickerComponent\");\n\n// the modelvalue of selected date, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst isTypeMonth = computed(() => props.type === \"month\");\n\n/**\n * When v-model is changed:\n *   1. Update internal value.\n */\nwatch(\n    () => props.modelValue,\n    (value: ModelValue) => {\n        const isArray = Array.isArray(value);\n        const currentDate: Date = isArray\n            ? value.length\n                ? value[value.length - 1]\n                : dateCreator()\n            : value\n              ? value\n              : dateCreator();\n        if (\n            !isArray ||\n            (isArray &&\n                Array.isArray(vmodel.value) &&\n                value.length > vmodel.value.length)\n        )\n            // update internal state\n            focusedDateData.value = {\n                day: currentDate.getDate(),\n                month: currentDate.getMonth(),\n                year: currentDate.getFullYear(),\n            };\n    },\n);\n\nwatch(\n    () => props.focusedDate,\n    (value) => {\n        if (value) {\n            focusedDateData.value = {\n                day: value.getDate(),\n                month: value.getMonth(),\n                year: value.getFullYear(),\n            };\n        }\n    },\n);\n\nconst _initialDate: Date =\n    (Array.isArray(props.modelValue)\n        ? props.modelValue[0]\n        : props.modelValue) ||\n    props.focusedDate ||\n    dateCreator();\n\nif (\n    !props.modelValue &&\n    props.maxDate &&\n    props.maxDate.getFullYear() < _initialDate.getFullYear()\n) {\n    _initialDate.setFullYear(props.maxDate.getFullYear());\n}\n\nconst focusedDateData = ref<FocusedDate>({\n    day: _initialDate.getDate(),\n    month: _initialDate.getMonth(),\n    year: _initialDate.getFullYear(),\n});\n\n/*\n * Emit input event on month and/or year change\n */\nwatch(\n    () => focusedDateData.value.month,\n    (value) => emits(\"change-month\", value),\n);\nwatch(\n    () => focusedDateData.value.year,\n    (value) => emits(\"change-year\", value),\n);\n\nconst computedMonthNames = computed(() =>\n    Array.isArray(props.monthNames)\n        ? props.monthNames\n        : getMonthNames(props.locale),\n);\n\nconst listOfMonths = computed<SelectOption<number>[]>(() => {\n    let minMonth = 0;\n    let maxMonth = 12;\n    if (\n        props.minDate &&\n        focusedDateData.value.year === props.minDate.getFullYear()\n    ) {\n        minMonth = props.minDate.getMonth();\n    }\n    if (\n        props.maxDate &&\n        focusedDateData.value.year === props.maxDate.getFullYear()\n    ) {\n        maxMonth = props.maxDate.getMonth();\n    }\n    return computedMonthNames.value.map((name, index) => ({\n        label: name,\n        value: index,\n        disabled: index < minMonth || index > maxMonth,\n    }));\n});\n\nconst computedDayNames = computed(() =>\n    Array.isArray(props.dayNames)\n        ? props.dayNames\n        : getWeekdayNames(props.locale),\n);\n\n/*\n * Returns an array of years for the year dropdown. If earliest/latest\n * dates are set by props, range of years will fall within those dates.\n */\nconst listOfYears = computed<SelectOption<number>[]>(() => {\n    let latestYear = _initialDate.getFullYear() + (props.yearsRange[1] ?? 0);\n    if (props.maxDate && props.maxDate.getFullYear() < latestYear) {\n        latestYear = Math.max(\n            props.maxDate.getFullYear(),\n            focusedDateData.value.year,\n        );\n    }\n\n    let earliestYear = _initialDate.getFullYear() + (props.yearsRange[0] ?? 0);\n    if (props.minDate && props.minDate.getFullYear() > earliestYear) {\n        earliestYear = Math.min(\n            props.minDate.getFullYear(),\n            focusedDateData.value.year,\n        );\n    }\n\n    return Array.from(\n        { length: latestYear - earliestYear + 1 || 1 },\n        (value, index) => earliestYear + index,\n    )\n        .reverse()\n        .map((year) => ({\n            label: String(year),\n            value: year,\n        }));\n});\n\nconst showPrev = computed<boolean>(() => {\n    if (!props.minDate) return true;\n    if (isTypeMonth.value)\n        return focusedDateData.value.year > props.minDate.getFullYear();\n\n    const dateToCheck = new Date(\n        focusedDateData.value.year,\n        focusedDateData.value.month,\n    );\n    const date = new Date(\n        props.minDate.getFullYear(),\n        props.minDate.getMonth(),\n    );\n    return dateToCheck > date;\n});\n\n/**\n * Either decrement month by 1 if not January or decrement year by 1\n * and set month to 11 (December) or decrement year when 'month'\n */\nfunction prev(): void {\n    if (props.disabled) return;\n\n    if (isTypeMonth.value) {\n        focusedDateData.value.year -= 1;\n    } else {\n        if (focusedDateData.value.month > 0) {\n            focusedDateData.value.month -= 1;\n        } else {\n            focusedDateData.value.month = 11;\n            focusedDateData.value.year -= 1;\n        }\n    }\n}\n\nconst showNext = computed<boolean>(() => {\n    if (!props.maxDate) return true;\n    if (isTypeMonth.value)\n        return focusedDateData.value.year < props.maxDate.getFullYear();\n\n    const dateToCheck = new Date(\n        focusedDateData.value.year,\n        focusedDateData.value.month,\n    );\n    const date = new Date(\n        props.maxDate.getFullYear(),\n        props.maxDate.getMonth(),\n    );\n    return dateToCheck < date;\n});\n\n/**\n * Either increment month by 1 if not December or increment year by 1\n * and set month to 0 (January) or increment year when 'month'\n */\nfunction next(): void {\n    if (props.disabled) return;\n    if (isTypeMonth.value) {\n        focusedDateData.value.year += 1;\n    } else {\n        if (focusedDateData.value.month < 11) {\n            focusedDateData.value.month += 1;\n        } else {\n            focusedDateData.value.month = 0;\n            focusedDateData.value.year += 1;\n        }\n    }\n}\n\n// #region --- Formatter / Parser ---\n\n/** Format date into string */\nfunction format(value: Date | Date[] | undefined, isNative: boolean): string {\n    if (isNative) return formatNative(value);\n\n    // define function prop\n    const date = (Array.isArray(value) ? [...value] : value) as ModelValue;\n\n    return dateFormatter(date);\n}\n\nfunction formatNative(value: Date | Date[] | undefined): string {\n    if (Array.isArray(value)) value = value[0];\n\n    // return empty string if no value is given or value can't parse to proper date\n    if (!value) return \"\";\n    const date = new Date(value);\n    if (!isDate(date)) return \"\";\n\n    if (isTypeMonth.value) {\n        // Format date into string 'YYYY-MM'\n        const year = date.getFullYear();\n        const month = date.getMonth() + 1;\n        return year + \"-\" + pad(month);\n    } else {\n        // Format date into string 'YYYY-MM-DD'\n        const year = date.getFullYear();\n        const month = date.getMonth() + 1;\n        const day = date.getDate();\n        return year + \"-\" + pad(month) + \"-\" + pad(day);\n    }\n}\n\n/** Parse string into date */\nfunction parse(value: string, isNative: boolean): Date | Date[] | undefined {\n    if (isNative) return parseNative(value);\n\n    const date = dateParser(value);\n\n    const isValid =\n        isDate(date) ||\n        (Array.isArray(date) &&\n            date.length === 2 &&\n            isDate(date[0]) &&\n            isDate(date[1]));\n\n    return isValid ? date : undefined;\n}\n\n/** Parse date from string */\nfunction parseNative(value: string): Date | undefined {\n    const s = value ? value.split(\"-\") : [];\n    if (s.length !== 3) return undefined;\n    const year = parseInt(s[0], 10);\n    const month = parseInt(s[1]) - 1;\n    const day = parseInt(s[2]);\n    return new Date(year, month, day);\n}\n\n// #endregion --- Formatter / Parser ---\n\n// #region --- Event Handler ---\n\n/** move to the previous focused date */\nfunction prevDate(): void {\n    if (props.disabled) return;\n\n    if (isTypeMonth.value) {\n        focusedDateData.value.year -= 1;\n    } else {\n        const date = new Date(\n            focusedDateData.value.year,\n            focusedDateData.value.month,\n            focusedDateData.value.day,\n        );\n        date.setDate(date.getDate() - 1);\n        focusedDateData.value.day = date.getDate();\n        focusedDateData.value.month = date.getMonth();\n        focusedDateData.value.year = date.getFullYear();\n\n        // todo: show selected hovered date\n        // vmodel.value = date as ModelValue;\n    }\n}\n\n/** move to the next focused date */\nfunction nextDate(): void {\n    if (props.disabled) return;\n\n    if (isTypeMonth.value) {\n        focusedDateData.value.year += 1;\n    } else {\n        const date = new Date(\n            focusedDateData.value.year,\n            focusedDateData.value.month,\n            focusedDateData.value.day,\n        );\n        date.setDate(date.getDate() + 1);\n        focusedDateData.value.day = date.getDate();\n        focusedDateData.value.month = date.getMonth();\n        focusedDateData.value.year = date.getFullYear();\n\n        // todo: show selected hovered date\n        // vmodel.value = date as ModelValue;\n    }\n}\n\n// #endregion --- Event Handler ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-datepicker\"],\n    [\n        \"sizeClass\",\n        \"o-datepicker--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\"mobileClass\", \"o-datepicker--mobile\", null, isMobile],\n    [\n        \"expandedClass\",\n        \"o-datepicker--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n);\n\nconst boxClasses = defineClasses([\"boxClass\", \"o-datepicker__box\"]);\nconst boxClassBind = computed(() => getActiveClasses(boxClasses));\n\nconst headerClasses = defineClasses([\"headerClass\", \"o-datepicker__header\"]);\n\nconst prevButtonClasses = defineClasses([\n    \"prevButtonClass\",\n    \"o-datepicker__header__previous\",\n]);\n\nconst nextButtonClasses = defineClasses([\n    \"nextButtonClass\",\n    \"o-datepicker__header__next\",\n]);\n\nconst listsClasses = defineClasses([\n    \"listsClass\",\n    \"o-datepicker__header__list\",\n]);\n\nconst footerClasses = defineClasses([\"footerClass\", \"o-datepicker__footer\"]);\n\nconst pickerDropdownClasses = defineClasses([\n    \"dropdownClass\",\n    \"o-datepicker__dropdown\",\n]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ focus: () => pickerRef.value?.focus(), value: vmodel });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <OPickerWrapper\n        ref=\"pickerComponent\"\n        v-model:active=\"isActive\"\n        v-model:value=\"vmodel\"\n        data-oruga=\"datepicker\"\n        :picker-props=\"props\"\n        :formatter=\"format\"\n        :parser=\"parse\"\n        :type=\"!isTypeMonth ? 'date' : 'month'\"\n        :max=\"maxDate\"\n        :min=\"minDate\"\n        :stay-open=\"props.multiple\"\n        :root-classes=\"rootClasses\"\n        :dropdown-classes=\"pickerDropdownClasses\"\n        :box-class=\"boxClassBind\"\n        :dtf=\"dtf\"\n        @focus=\"$emit('focus', $event)\"\n        @blur=\"$emit('blur', $event)\"\n        @invalid=\"$emit('invalid', $event)\"\n        @left=\"prevDate\"\n        @right=\"nextDate\"\n        @icon-click=\"$emit('icon-click', $event)\"\n        @icon-right-click=\"$emit('icon-right-click', $event)\">\n        <template v-if=\"$slots.trigger\" #trigger>\n            <slot name=\"trigger\" />\n        </template>\n\n        <header :class=\"headerClasses\">\n            <slot name=\"header\">\n                <OButton\n                    v-if=\"!disabled\"\n                    :class=\"prevButtonClasses\"\n                    :disabled=\"!showPrev\"\n                    :icon-pack=\"iconPack\"\n                    :icon-left=\"iconPrev\"\n                    :size=\"size\"\n                    :aria-label=\"ariaPreviousLabel\"\n                    @click.prevent=\"prev\"\n                    @keydown.enter.prevent=\"prev\"\n                    @keydown.space.prevent=\"prev\" />\n\n                <OButton\n                    v-if=\"!disabled\"\n                    :class=\"nextButtonClasses\"\n                    :disabled=\"!showNext\"\n                    :icon-pack=\"iconPack\"\n                    :icon-left=\"iconNext\"\n                    :size=\"size\"\n                    :aria-label=\"ariaNextLabel\"\n                    @click.prevent=\"next\"\n                    @keydown.enter.prevent=\"next\"\n                    @keydown.space.prevent=\"next\" />\n\n                <div :class=\"listsClasses\">\n                    <o-select\n                        v-if=\"!isTypeMonth\"\n                        v-bind=\"selectClasses\"\n                        v-model=\"focusedDateData.month\"\n                        :disabled=\"disabled\"\n                        :size=\"size\"\n                        :options=\"listOfMonths\"\n                        :aria-label=\"ariaSelectMonthLabel\"\n                        :use-html5-validation=\"false\"\n                        @keydown.left.stop.prevent=\"prev\"\n                        @keydown.right.stop.prevent=\"next\" />\n\n                    <o-select\n                        v-bind=\"selectClasses\"\n                        v-model=\"focusedDateData.year\"\n                        :disabled=\"disabled\"\n                        :size=\"size\"\n                        :options=\"listOfYears\"\n                        :aria-label=\"ariaSelectYearLabel\"\n                        :use-html5-validation=\"false\"\n                        @keydown.left.stop.prevent=\"prev\"\n                        @keydown.right.stop.prevent=\"next\"\n                        @keydown.up.stop.prevent=\"focusedDateData.year += 1\"\n                        @keydown.down.stop.prevent=\"\n                            focusedDateData.year -= 1\n                        \" />\n                </div>\n            </slot>\n        </header>\n\n        <slot name=\"body\">\n            <o-datepicker-month\n                v-if=\"isTypeMonth\"\n                v-model=\"vmodel\"\n                v-model:focused-date=\"focusedDateData\"\n                :month-names=\"computedMonthNames\"\n                :picker-props=\"props\"\n                @range-start=\"$emit('range-start', $event)\"\n                @range-end=\"$emit('range-end', $event)\" />\n\n            <o-datepicker-table\n                v-else\n                v-model=\"vmodel\"\n                v-model:focused-date=\"focusedDateData\"\n                :day-names=\"computedDayNames\"\n                :month-names=\"computedMonthNames\"\n                :picker-props=\"props\"\n                @week-number-click=\"$emit('week-number-click', $event)\"\n                @range-start=\"$emit('range-start', $event)\"\n                @range-end=\"$emit('range-end', $event)\" />\n        </slot>\n\n        <footer v-if=\"$slots.footer\" :class=\"footerClasses\">\n            <slot name=\"footer\" />\n        </footer>\n    </OPickerWrapper>\n</template>\n","import type { App } from \"vue\";\n\nimport Datepicker from \"./Datepicker.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export datepicker specific types */\nexport type * from \"./props\";\nexport type { DatepickerEvent, FocusedDate } from \"./types\";\n\n/** export datepicker plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Datepicker);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export datepicker components */\nexport { Datepicker as ODatepicker };\n","import { computed } from \"vue\";\nimport { matchWithGroups } from \"../datepicker/utils\";\nimport type { TimepickerProps } from \"./props\";\n\nconst AM = \"AM\" as const;\nconst PM = \"PM\" as const;\nconst HOUR_FORMAT_24 = \"24\" as const;\nconst HOUR_FORMAT_12 = \"12\" as const;\n\n/** Time Format Feature */\nexport function useTimepickerMixins(props: TimepickerProps) {\n    const localeOptions = computed(\n        () =>\n            new Intl.DateTimeFormat(props.locale, {\n                hour: \"numeric\",\n                minute: \"numeric\",\n                second: props.enableSeconds ? \"numeric\" : undefined,\n            }).resolvedOptions() as Intl.DateTimeFormatOptions,\n    );\n\n    const isHourFormat24 = computed(\n        () =>\n            (props.hourFormat && props.hourFormat === HOUR_FORMAT_24) ||\n            (!props.hourFormat && !localeOptions.value.hour12),\n    );\n\n    const dtf = computed(\n        () =>\n            new Intl.DateTimeFormat(props.locale, {\n                hour: localeOptions.value.hour || \"numeric\",\n                minute: localeOptions.value.minute || \"numeric\",\n                second: props.enableSeconds\n                    ? localeOptions.value.second || \"numeric\"\n                    : undefined,\n                hourCycle: !isHourFormat24.value ? \"h12\" : \"h23\",\n            }),\n    );\n\n    const sampleTime = computed(() => {\n        const d = timeCreator();\n        d.setHours(10);\n        d.setSeconds(0);\n        d.setMinutes(0);\n        d.setMilliseconds(0);\n        return d;\n    });\n\n    const amString = computed(() => {\n        if (\n            dtf.value.formatToParts &&\n            typeof dtf.value.formatToParts === \"function\"\n        ) {\n            const d = new Date(sampleTime.value);\n            d.setHours(10);\n            const dayPeriod = dtf.value\n                .formatToParts(d)\n                .find((part) => part.type === \"dayPeriod\");\n            if (dayPeriod) return dayPeriod.value;\n        }\n        return AM;\n    });\n\n    const pmString = computed(() => {\n        if (\n            dtf.value.formatToParts &&\n            typeof dtf.value.formatToParts === \"function\"\n        ) {\n            const d = new Date(sampleTime.value);\n            d.setHours(20);\n            const dayPeriod = dtf.value\n                .formatToParts(d)\n                .find((part) => part.type === \"dayPeriod\");\n            if (dayPeriod) {\n                return dayPeriod.value;\n            }\n        }\n        return PM;\n    });\n\n    const meridiens = computed(() => [amString.value, pmString.value]);\n\n    const hourLiteral = computed(() => {\n        if (\n            dtf.value.formatToParts &&\n            typeof dtf.value.formatToParts === \"function\"\n        ) {\n            const d = new Date(sampleTime.value);\n            const parts = dtf.value.formatToParts(d);\n            const literal = parts.find(\n                (part, idx) => idx > 0 && parts[idx - 1].type === \"hour\",\n            );\n            if (literal) return literal.value;\n        }\n        return \":\";\n    });\n\n    const minuteLiteral = computed(() => {\n        if (\n            dtf.value.formatToParts &&\n            typeof dtf.value.formatToParts === \"function\"\n        ) {\n            const d = new Date(sampleTime.value);\n            const parts = dtf.value.formatToParts(d);\n            const literal = parts.find(\n                (part, idx) => idx > 0 && parts[idx - 1].type === \"minute\",\n            );\n            if (literal) return literal.value;\n        }\n        return \":\";\n    });\n\n    const secondLiteral = computed(() => {\n        if (\n            dtf.value.formatToParts &&\n            typeof dtf.value.formatToParts === \"function\"\n        ) {\n            const d = new Date(sampleTime.value);\n            const parts = dtf.value.formatToParts(d);\n            const literal = parts.find(\n                (part, idx) => idx > 0 && parts[idx - 1].type === \"second\",\n            );\n            if (literal) return literal.value;\n        }\n        return undefined;\n    });\n\n    function timeCreator(): Date {\n        if (typeof props.creator === \"function\") {\n            const r = props.creator();\n            if (r instanceof Date) return r;\n        }\n        return new Date();\n    }\n\n    function timeFormatter(time: typeof props.modelValue): string {\n        if (typeof props.formatter === \"function\") {\n            const r = props.formatter(time);\n            if (typeof r === \"string\") return r;\n        }\n\n        if (!time) return \"00:00\";\n        return dtf.value.format(time);\n    }\n\n    function timeParser(time: string): typeof props.modelValue {\n        if (typeof props.parser === \"function\") {\n            const r = props.parser(time);\n            if (r !== undefined) return r;\n        }\n\n        if (!time) return undefined;\n\n        if (\n            dtf.value.formatToParts &&\n            typeof dtf.value.formatToParts === \"function\"\n        ) {\n            const formatRegex = dtf.value\n                .formatToParts(sampleTime.value)\n                .map((part) => {\n                    if (part.type === \"literal\") {\n                        return part.value.replace(/ /g, \"\\\\s?\");\n                    } else if (part.type === \"dayPeriod\") {\n                        return `((?!=<${part.type}>)(${amString.value}|${\n                            pmString.value\n                        }|${AM}|${PM}|${AM.toLowerCase()}|${PM.toLowerCase()})?)`;\n                    }\n                    return `((?!=<${part.type}>)\\\\d+)`;\n                })\n                .join(\"\");\n            const timeGroups = matchWithGroups(formatRegex, time);\n\n            // We do a simple validation for the group.\n            // If it is not valid, it will fallback to Date.parse below\n            timeGroups.hour = timeGroups.hour\n                ? parseInt(timeGroups.hour, 10)\n                : null;\n            timeGroups.minute = timeGroups.minute\n                ? parseInt(timeGroups.minute, 10)\n                : null;\n            timeGroups.second = timeGroups.second\n                ? parseInt(timeGroups.second, 10)\n                : null;\n            if (\n                timeGroups.hour &&\n                timeGroups.hour >= 0 &&\n                timeGroups.hour < 24 &&\n                timeGroups.minute &&\n                timeGroups.minute >= 0 &&\n                timeGroups.minute < 59\n            ) {\n                if (\n                    timeGroups.dayPeriod &&\n                    (timeGroups.dayPeriod.toLowerCase() ===\n                        pmString.value.toLowerCase() ||\n                        timeGroups.dayPeriod.toLowerCase() ===\n                            PM.toLowerCase()) &&\n                    timeGroups.hour < 12\n                ) {\n                    timeGroups.hour += 12;\n                }\n                const date = new Date(sampleTime.value);\n                date.setHours(timeGroups.hour);\n                date.setMinutes(timeGroups.minute);\n                date.setSeconds(timeGroups.second || 0);\n                return date;\n            }\n        }\n\n        // Fallback if formatToParts is not supported or if we were not able to parse a valid date\n        let am = false;\n        if (props.hourFormat === HOUR_FORMAT_12) {\n            const dateString12 = time.split(\" \");\n            time = dateString12[0];\n            am = dateString12[1] === amString.value || dateString12[1] === AM;\n        }\n        const timeSplit = time.split(\":\");\n        let hours = parseInt(timeSplit[0], 10);\n        const minutes = parseInt(timeSplit[1], 10);\n        const seconds =\n            props.enableSeconds && timeSplit.length >= 3\n                ? parseInt(timeSplit[2], 10)\n                : 0;\n        if (\n            isNaN(hours) ||\n            hours < 0 ||\n            hours > 23 ||\n            (props.hourFormat === HOUR_FORMAT_12 &&\n                (hours < 1 || hours > 12)) ||\n            isNaN(minutes) ||\n            minutes < 0 ||\n            minutes > 59\n        ) {\n            return undefined;\n        }\n        const date = new Date(sampleTime.value);\n        date.setSeconds(seconds);\n        date.setMinutes(minutes);\n        if (props.hourFormat === HOUR_FORMAT_12) {\n            if (am && hours === 12) {\n                hours = 0;\n            } else if (!am && hours !== 12) {\n                hours += 12;\n            }\n        }\n        date.setHours(hours);\n        return new Date(date.getTime());\n    }\n\n    return {\n        dtf,\n        timeCreator,\n        timeFormatter,\n        timeParser,\n        pmString,\n        amString,\n        meridiens,\n        isHourFormat24,\n        hourLiteral,\n        minuteLiteral,\n        secondLiteral,\n    };\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, useTemplateRef, watch } from \"vue\";\n\nimport OSelect from \"../select/Select.vue\";\nimport OPickerWrapper from \"../utils/PickerWrapper.vue\";\n\nimport { getDefault, getDefaultFunction } from \"@/utils/config\";\nimport { isDate, isDefined, pad } from \"@/utils/helpers\";\nimport { defineClasses, useMatchMedia, getActiveClasses } from \"@/composables\";\n\nimport { useTimepickerMixins } from \"./useTimepickerMixins\";\n\nimport type { TimepickerProps } from \"./props\";\nimport type { SelectOption } from \"../select\";\n\n/**\n * An input with a simple dropdown/modal for selecting a time, uses native timepicker for mobile.\n * @displayName Timepicker\n * @style _timepicker.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTimepicker\",\n    configField: \"timepicker\",\n});\n\ntype ModelValue = TimepickerProps[\"modelValue\"];\n\nconst props = withDefaults(defineProps<TimepickerProps>(), {\n    override: undefined,\n    modelValue: undefined,\n    active: false,\n    minTime: undefined,\n    maxTime: undefined,\n    inline: false,\n    placeholder: undefined,\n    expanded: () => getDefault(\"timepicker.expanded\", false),\n    rounded: false,\n    readonly: false,\n    disabled: false,\n    size: () => getDefault(\"timepicker.size\"),\n    hourFormat: undefined,\n    incrementHours: 1,\n    incrementMinutes: 1,\n    incrementSeconds: 1,\n    openOnFocus: () => getDefault(\"timepicker.openOnFocus\", true),\n    closeOnClick: () => getDefault(\"timepicker.closeOnClick\", true),\n    enableSeconds: false,\n    defaultMinutes: undefined,\n    defaultSeconds: undefined,\n    locale: () => getDefault(\"locale\"),\n    formatter: getDefaultFunction(\"timepicker.formatter\"),\n    parser: getDefaultFunction(\"timepicker.parser\"),\n    creator: getDefaultFunction(\"timepicker.creator\"),\n    unselectableTimes: undefined,\n    resetOnMeridianChange: false,\n    position: undefined,\n    iconPack: () => getDefault(\"timepicker.iconPack\"),\n    icon: () => getDefault(\"timepicker.icon\"),\n    iconRight: () => getDefault(\"timepicker.iconRight\"),\n    iconRightClickable: false,\n    desktopModal: () => getDefault(\"timepicker.desktopModal\", false),\n    mobileModal: () => getDefault(\"timepicker.mobileModal\", true),\n    mobileNative: () => getDefault(\"timepicker.mobileNative\", true),\n    mobileBreakpoint: () => getDefault(\"timepicker.mobileBreakpoint\"),\n    teleport: () => getDefault(\"timepicker.teleport\", false),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: \"\",\n    inputClasses: () => getDefault(\"timepicker.inputClasses\"),\n    dropdownClasses: () => getDefault(\"timepicker.dropdownClasses\"),\n    ariaSelectSecondsLabel: () =>\n        getDefault(\"timepicker.ariaSelectSecondLabel\", \"Select Second\"),\n    ariaSelectMinutesLabel: () =>\n        getDefault(\"timepicker.ariaSelectMinuteLabel\", \"Select Minute\"),\n    ariaSelectHoursLabel: () =>\n        getDefault(\"timepicker.ariaSelectHourLabel\", \"Select Hour\"),\n    selectClasses: () => getDefault(\"timepicker.selectClasses\"),\n});\n\ndefineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {Date} - updated modelValue prop\n     */\n    \"update:model-value\": [value: Date];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the trigger input element */\n    trigger?(): void;\n    /** Define an additional content in the footer */\n    footer?(): void;\n}>();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst {\n    dtf,\n    timeCreator,\n    timeFormatter,\n    timeParser,\n    pmString,\n    amString,\n    meridiens,\n    isHourFormat24,\n    hourLiteral,\n    minuteLiteral,\n    secondLiteral,\n} = useTimepickerMixins(props);\n\nconst pickerRef = useTemplateRef(\"pickerComponent\");\n\n// the modelvalue of selected date, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst hoursSelected = ref<number>();\nconst minutesSelected = ref<number>();\nconst secondsSelected = ref<number>();\nconst meridienSelected = ref<string>();\n\nwatch(\n    () => props.modelValue,\n    (value) => updateValue(value),\n    { immediate: true },\n);\n\n/** Update internal value. */\nfunction updateValue(value: Date | Date[] | undefined): void {\n    if (Array.isArray(value)) return updateValue(value[0]);\n    if (vmodel.value !== value) vmodel.value = value;\n    if (value) {\n        // update internal state\n        hoursSelected.value = value.getHours();\n        minutesSelected.value = value.getMinutes();\n        secondsSelected.value = value.getSeconds();\n        meridienSelected.value =\n            value.getHours() >= 12 ? pmString.value : amString.value;\n    } else {\n        // reset internal state\n        hoursSelected.value = undefined;\n        minutesSelected.value = undefined;\n        secondsSelected.value = undefined;\n        meridienSelected.value = amString.value;\n    }\n}\n\nconst step = computed(() => (props.enableSeconds ? \"1\" : undefined));\n\nwatch(\n    () => props.hourFormat,\n    () => {\n        if (isDefined(hoursSelected.value))\n            meridienSelected.value =\n                (hoursSelected.value || 0) >= 12\n                    ? pmString.value\n                    : amString.value;\n    },\n);\n\nwatch(\n    () => props.locale,\n    (value) => {\n        // see updateInternalState default\n        if (!value) meridienSelected.value = amString.value;\n    },\n);\n\nfunction formatNumber(value: number, prependZero: boolean): string {\n    return isHourFormat24.value || prependZero ? pad(value) : String(value);\n}\n\nconst hours = computed<(SelectOption<number> & { value: number })[]>(() => {\n    if (!props.incrementHours || props.incrementHours < 1)\n        throw new Error(\"Hour increment cannot be null or less than 1.\");\n    const hours: (SelectOption<number> & { value: number })[] = [];\n    const numberOfHours = isHourFormat24.value ? 24 : 12;\n    for (let i = 0; i < numberOfHours; i += props.incrementHours) {\n        let value = i;\n        let label = value;\n        if (!isHourFormat24.value) {\n            value = i + 1;\n            label = value;\n            if (meridienSelected.value === amString.value) {\n                if (value === 12) value = 0;\n            } else if (meridienSelected.value === pmString.value) {\n                if (value !== 12) value += 12;\n            }\n        }\n        hours.push({\n            label: formatNumber(label, false),\n            value: value,\n        });\n    }\n    return hours;\n});\n\nconst minutes = computed<(SelectOption<number> & { value: number })[]>(() => {\n    if (!props.incrementMinutes || props.incrementMinutes < 1)\n        throw new Error(\"Minute increment cannot be null or less than 1.\");\n    const minutes: (SelectOption<number> & { value: number })[] = [];\n    for (let i = 0; i < 60; i += props.incrementMinutes) {\n        minutes.push({\n            label: formatNumber(i, true),\n            value: i,\n        });\n    }\n    return minutes;\n});\n\nconst seconds = computed<(SelectOption<number> & { value: number })[]>(() => {\n    if (!props.incrementSeconds || props.incrementSeconds < 1)\n        throw new Error(\"Second increment cannot be null or less than 1.\");\n    const seconds: (SelectOption<number> & { value: number })[] = [];\n    for (let i = 0; i < 60; i += props.incrementSeconds) {\n        seconds.push({\n            label: formatNumber(i, true),\n            value: i,\n        });\n    }\n    return seconds;\n});\n\nfunction isHourDisabled(hour: number): boolean {\n    let disabled = false;\n    if (props.minTime) {\n        const minHours = props.minTime.getHours();\n        const noMinutesAvailable = minutes.value.every((minute) => {\n            return isMinuteDisabledForHour(hour, minute.value);\n        });\n        disabled = hour < minHours || noMinutesAvailable;\n    }\n    if (props.maxTime) {\n        if (!disabled) {\n            const maxHours = props.maxTime.getHours();\n            disabled = hour > maxHours;\n        }\n    }\n\n    if (props.unselectableTimes && !disabled) {\n        if (typeof props.unselectableTimes === \"function\") {\n            const date = new Date();\n            date.setHours(hour);\n            date.setMinutes(minutesSelected.value || 0);\n            date.setSeconds(secondsSelected.value || 0);\n            return props.unselectableTimes(date);\n        } else {\n            const unselectable = props.unselectableTimes.filter((time) => {\n                if (props.enableSeconds && isDefined(secondsSelected.value)) {\n                    return (\n                        time.getHours() === hour &&\n                        time.getMinutes() === minutesSelected.value &&\n                        time.getSeconds() === secondsSelected.value\n                    );\n                } else if (isDefined(minutesSelected.value)) {\n                    return (\n                        time.getHours() === hour &&\n                        time.getMinutes() === minutesSelected.value\n                    );\n                }\n                return false;\n            });\n            if (unselectable.length > 0) {\n                disabled = true;\n            } else {\n                disabled = minutes.value.every((minute) => {\n                    return (\n                        (props.unselectableTimes as Date[]).filter((time) => {\n                            return (\n                                time.getHours() === hour &&\n                                time.getMinutes() === minute.value\n                            );\n                        }).length > 0\n                    );\n                });\n            }\n        }\n    }\n    return disabled;\n}\n\nfunction isMinuteDisabledForHour(hour: number, minute: number): boolean {\n    let disabled = false;\n    if (props.minTime) {\n        const minHours = props.minTime.getHours();\n        const minMinutes = props.minTime.getMinutes();\n        disabled = hour === minHours && minute < minMinutes;\n    }\n    if (props.maxTime) {\n        if (!disabled) {\n            const maxHours = props.maxTime.getHours();\n            const maxMinutes = props.maxTime.getMinutes();\n            disabled = hour === maxHours && minute > maxMinutes;\n        }\n    }\n    return disabled;\n}\n\nfunction isMinuteDisabled(minute: number): boolean {\n    if (hoursSelected.value === undefined) return false;\n\n    let disabled =\n        isHourDisabled(hoursSelected.value) ||\n        isMinuteDisabledForHour(hoursSelected.value, minute);\n\n    if (props.unselectableTimes && !disabled) {\n        if (typeof props.unselectableTimes === \"function\") {\n            const date = new Date();\n            date.setHours(hoursSelected.value);\n            date.setMinutes(minute);\n            date.setSeconds(secondsSelected.value || 0);\n            return props.unselectableTimes(date);\n        } else {\n            const unselectable = props.unselectableTimes.filter((time) => {\n                if (props.enableSeconds && isDefined(secondsSelected.value)) {\n                    return (\n                        time.getHours() === hoursSelected.value &&\n                        time.getMinutes() === minute &&\n                        time.getSeconds() === secondsSelected.value\n                    );\n                } else {\n                    return (\n                        time.getHours() === hoursSelected.value &&\n                        time.getMinutes() === minute\n                    );\n                }\n            });\n            disabled = unselectable.length > 0;\n        }\n    }\n    return disabled;\n}\n\nfunction isSecondDisabled(second: number): boolean {\n    if (!isDefined(minutesSelected.value)) return false;\n    let disabled = false;\n\n    if (isMinuteDisabled(minutesSelected.value)) {\n        disabled = true;\n    } else {\n        if (props.minTime) {\n            const minHours = props.minTime.getHours();\n            const minMinutes = props.minTime.getMinutes();\n            const minSeconds = props.minTime.getSeconds();\n            disabled =\n                hoursSelected.value === minHours &&\n                minutesSelected.value === minMinutes &&\n                second < minSeconds;\n        }\n        if (props.maxTime) {\n            if (!disabled) {\n                const maxHours = props.maxTime.getHours();\n                const maxMinutes = props.maxTime.getMinutes();\n                const maxSeconds = props.maxTime.getSeconds();\n                disabled =\n                    hoursSelected.value === maxHours &&\n                    minutesSelected.value === maxMinutes &&\n                    second > maxSeconds;\n            }\n        }\n    }\n    if (props.unselectableTimes && !disabled) {\n        if (typeof props.unselectableTimes === \"function\") {\n            const date = new Date();\n            date.setHours(hoursSelected.value || 0);\n            date.setMinutes(minutesSelected.value);\n            date.setSeconds(second);\n            return props.unselectableTimes(date);\n        } else {\n            const unselectable = props.unselectableTimes.filter((time) => {\n                return (\n                    time.getHours() === hoursSelected.value &&\n                    time.getMinutes() === minutesSelected.value &&\n                    time.getSeconds() === second\n                );\n            });\n            disabled = unselectable.length > 0;\n        }\n    }\n    return disabled;\n}\n\nfunction isMeridienDisabled(meridienString: string): boolean {\n    const offset = meridienString == \"AM\" ? 0 : 12;\n    for (let i = 0; i < 12; i++) {\n        if (!isHourDisabled(i + offset)) return false;\n    }\n    return true;\n}\n\nfunction updateDateSelected(\n    hours: number,\n    minutes: number,\n    seconds: number,\n    meridiens,\n): void {\n    if (\n        isDefined(hours) &&\n        isDefined(minutes) &&\n        ((!isDefined(isHourFormat24.value) && isDefined(meridiens)) ||\n            isDefined(isHourFormat24.value))\n    ) {\n        let time: Date;\n        if (vmodel.value) {\n            time = new Date(vmodel.value);\n        } else {\n            time = timeCreator();\n            time.setMilliseconds(0);\n        }\n        time.setHours(hours);\n        time.setMinutes(minutes);\n        time.setSeconds(seconds);\n        if (!isNaN(time.getTime())) {\n            vmodel.value = new Date(time.getTime());\n        }\n    }\n}\n\n// --- Formatter / Parser ---\n\n/** Format date into string */\nfunction format(value: Date | Date[] | undefined, isNative: boolean): string {\n    if (Array.isArray(value)) return format(value[0], isNative);\n    if (isNative) return formatNative(value);\n\n    return timeFormatter(value);\n}\n\n/** Format date into string 'HH-MM-SS'*/\nfunction formatNative(value: Date | Date[] | undefined): string {\n    if (Array.isArray(value)) return formatNative(value[0]);\n\n    // return empty string if no value is given or value can't parse to proper date\n    if (!value) return \"\";\n    const date = new Date(value);\n    if (!isDate(date)) return \"\";\n\n    const hours = date.getHours();\n    const minutes = date.getMinutes();\n    const seconds = date.getSeconds();\n    return (\n        formatNumber(hours, true) +\n        \":\" +\n        formatNumber(minutes, true) +\n        \":\" +\n        formatNumber(seconds, true)\n    );\n}\n\n/** Parse string into date */\nfunction parse(value: string, isNative: boolean): Date | undefined {\n    if (isNative) return parseNative(value);\n\n    const date = timeParser(value);\n    return isDate(date) ? date : undefined;\n}\n\n/** Parse time from string */\nfunction parseNative(date: string): Date | undefined {\n    if (!date) return undefined;\n\n    let time: Date;\n    if (vmodel.value) {\n        time = new Date(vmodel.value);\n    } else {\n        time = timeCreator();\n        time.setMilliseconds(0);\n    }\n    const t = date.split(\":\");\n    time.setHours(parseInt(t[0], 10));\n    time.setMinutes(parseInt(t[1], 10));\n    time.setSeconds(t[2] ? parseInt(t[2], 10) : 0);\n    return new Date(time.getTime());\n}\n\n// --- Event Handler ---\n\nfunction onMeridienChange(value: string): void {\n    if (isDefined(hoursSelected.value) && props.resetOnMeridianChange) {\n        hoursSelected.value = undefined;\n        minutesSelected.value = undefined;\n        secondsSelected.value = undefined;\n        vmodel.value = undefined;\n    } else if (isDefined(hoursSelected.value)) {\n        if (value === pmString.value) hoursSelected.value += 12;\n        else if (value === amString.value) hoursSelected.value -= 12;\n    }\n    updateDateSelected(\n        hoursSelected.value || 0,\n        minutesSelected.value || 0,\n        props.enableSeconds ? secondsSelected.value || 0 : 0,\n        value,\n    );\n}\n\nfunction onHoursChange(value: string): void {\n    if (!minutesSelected.value && typeof props.defaultMinutes !== \"undefined\")\n        minutesSelected.value = props.defaultMinutes;\n    if (!secondsSelected.value && typeof props.defaultSeconds !== \"undefined\")\n        secondsSelected.value = props.defaultSeconds;\n\n    updateDateSelected(\n        parseInt(value, 10),\n        minutesSelected.value || 0,\n        props.enableSeconds ? secondsSelected.value || 0 : 0,\n        meridienSelected.value,\n    );\n}\n\nfunction onMinutesChange(value: string): void {\n    if (!secondsSelected.value && props.defaultSeconds)\n        secondsSelected.value = props.defaultSeconds;\n\n    updateDateSelected(\n        hoursSelected.value || 0,\n        parseInt(value, 10),\n        props.enableSeconds ? secondsSelected.value || 0 : 0,\n        meridienSelected.value,\n    );\n}\n\nfunction onSecondsChange(value: string): void {\n    updateDateSelected(\n        hoursSelected.value || 0,\n        minutesSelected.value || 0,\n        parseInt(value, 10),\n        meridienSelected.value,\n    );\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-timepicker\"],\n    [\n        \"sizeClass\",\n        \"o-timepicker--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\"mobileClass\", \"o-timepicker--mobile\", null, isMobile],\n);\n\nconst separatorClasses = defineClasses([\n    \"separatorClass\",\n    \"o-timepicker__separtor\",\n]);\n\nconst footerClasses = defineClasses([\"footerClass\", \"o-timepicker__footer\"]);\n\nconst pickerDropdownClasses = defineClasses([\n    \"dropdownClass\",\n    \"o-timepicker__dropdown\",\n]);\n\nconst boxClasses = defineClasses([\"boxClass\", \"o-timepicker__box\"]);\nconst boxClassBind = computed(() => getActiveClasses(boxClasses));\n\nconst selectSelectClasses = defineClasses([\n    \"selectClasses.selectClass\",\n    \"o-timepicker__select\",\n]);\n\nconst selectPlaceholderClasses = defineClasses([\n    \"selectClasses.placeholderClass\",\n    \"o-timepicker__select-placeholder\",\n]);\n\nconst selectBind = computed(() => ({\n    \"select-class\": getActiveClasses(selectSelectClasses),\n    \"placeholder-class\": getActiveClasses(selectPlaceholderClasses),\n    ...props.selectClasses,\n}));\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ focus: () => pickerRef.value?.focus(), value: vmodel });\n</script>\n\n<template>\n    <OPickerWrapper\n        ref=\"pickerComponent\"\n        v-model:active=\"isActive\"\n        :value=\"vmodel\"\n        data-oruga=\"timepicker\"\n        :picker-props=\"props\"\n        :formatter=\"format\"\n        :parser=\"parse\"\n        type=\"time\"\n        :max=\"maxTime\"\n        :min=\"minTime\"\n        :step=\"step\"\n        :root-classes=\"rootClasses\"\n        :dropdown-classes=\"pickerDropdownClasses\"\n        :box-class=\"boxClassBind\"\n        :dtf=\"dtf\"\n        @update:value=\"updateValue\"\n        @focus=\"$emit('focus', $event)\"\n        @blur=\"$emit('blur', $event)\"\n        @invalid=\"$emit('invalid', $event)\"\n        @icon-click=\"$emit('icon-click', $event)\"\n        @icon-right-click=\"$emit('icon-right-click', $event)\">\n        <template v-if=\"$slots.trigger\" #trigger>\n            <slot name=\"trigger\" />\n        </template>\n\n        <o-select\n            v-bind=\"selectBind\"\n            v-model=\"hoursSelected\"\n            :options=\"hours\"\n            override\n            :disabled=\"disabled\"\n            placeholder=\"00\"\n            :aria-label=\"ariaSelectHoursLabel\"\n            :use-html5-validation=\"false\"\n            @change=\"onHoursChange($event.target.value)\" />\n\n        <span :class=\"separatorClasses\">{{ hourLiteral }}</span>\n\n        <o-select\n            v-bind=\"selectBind\"\n            v-model=\"minutesSelected\"\n            override\n            :disabled=\"disabled\"\n            placeholder=\"00\"\n            :aria-label=\"ariaSelectMinutesLabel\"\n            :use-html5-validation=\"false\"\n            @change=\"onMinutesChange($event.target.value)\">\n            <option\n                v-for=\"minute in minutes\"\n                :key=\"minute.value\"\n                :value=\"minute.value\"\n                :disabled=\"isMinuteDisabled(minute.value)\">\n                {{ minute.label }}\n            </option>\n        </o-select>\n\n        <template v-if=\"enableSeconds\">\n            <span :class=\"separatorClasses\">{{ minuteLiteral }}</span>\n\n            <o-select\n                v-bind=\"selectBind\"\n                v-model=\"secondsSelected\"\n                override\n                :disabled=\"disabled\"\n                placeholder=\"00\"\n                :aria-label=\"ariaSelectSecondsLabel\"\n                :use-html5-validation=\"false\"\n                @change=\"onSecondsChange($event.target.value)\">\n                <option\n                    v-for=\"second in seconds\"\n                    :key=\"second.value\"\n                    :value=\"second.value\"\n                    :disabled=\"isSecondDisabled(second.value)\">\n                    {{ second.label }}\n                </option>\n            </o-select>\n\n            <span :class=\"separatorClasses\">{{ secondLiteral }}</span>\n        </template>\n\n        <o-select\n            v-if=\"!isHourFormat24\"\n            v-bind=\"selectBind\"\n            v-model=\"meridienSelected\"\n            override\n            :disabled=\"disabled\"\n            :use-html5-validation=\"false\"\n            @change=\"onMeridienChange($event.target.value)\">\n            <option\n                v-for=\"meridien in meridiens\"\n                :key=\"meridien\"\n                :value=\"meridien\"\n                :disabled=\"isMeridienDisabled(meridien)\">\n                {{ meridien }}\n            </option>\n        </o-select>\n\n        <footer v-if=\"$slots.footer\" :class=\"footerClasses\">\n            <slot name=\"footer\" />\n        </footer>\n    </OPickerWrapper>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, useTemplateRef, watch } from \"vue\";\n\nimport OSelect from \"../select/Select.vue\";\nimport OPickerWrapper from \"../utils/PickerWrapper.vue\";\n\nimport { getDefault, getDefaultFunction } from \"@/utils/config\";\nimport { isDate, isDefined, pad } from \"@/utils/helpers\";\nimport { defineClasses, useMatchMedia, getActiveClasses } from \"@/composables\";\n\nimport { useTimepickerMixins } from \"./useTimepickerMixins\";\n\nimport type { TimepickerProps } from \"./props\";\nimport type { SelectOption } from \"../select\";\n\n/**\n * An input with a simple dropdown/modal for selecting a time, uses native timepicker for mobile.\n * @displayName Timepicker\n * @style _timepicker.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTimepicker\",\n    configField: \"timepicker\",\n});\n\ntype ModelValue = TimepickerProps[\"modelValue\"];\n\nconst props = withDefaults(defineProps<TimepickerProps>(), {\n    override: undefined,\n    modelValue: undefined,\n    active: false,\n    minTime: undefined,\n    maxTime: undefined,\n    inline: false,\n    placeholder: undefined,\n    expanded: () => getDefault(\"timepicker.expanded\", false),\n    rounded: false,\n    readonly: false,\n    disabled: false,\n    size: () => getDefault(\"timepicker.size\"),\n    hourFormat: undefined,\n    incrementHours: 1,\n    incrementMinutes: 1,\n    incrementSeconds: 1,\n    openOnFocus: () => getDefault(\"timepicker.openOnFocus\", true),\n    closeOnClick: () => getDefault(\"timepicker.closeOnClick\", true),\n    enableSeconds: false,\n    defaultMinutes: undefined,\n    defaultSeconds: undefined,\n    locale: () => getDefault(\"locale\"),\n    formatter: getDefaultFunction(\"timepicker.formatter\"),\n    parser: getDefaultFunction(\"timepicker.parser\"),\n    creator: getDefaultFunction(\"timepicker.creator\"),\n    unselectableTimes: undefined,\n    resetOnMeridianChange: false,\n    position: undefined,\n    iconPack: () => getDefault(\"timepicker.iconPack\"),\n    icon: () => getDefault(\"timepicker.icon\"),\n    iconRight: () => getDefault(\"timepicker.iconRight\"),\n    iconRightClickable: false,\n    desktopModal: () => getDefault(\"timepicker.desktopModal\", false),\n    mobileModal: () => getDefault(\"timepicker.mobileModal\", true),\n    mobileNative: () => getDefault(\"timepicker.mobileNative\", true),\n    mobileBreakpoint: () => getDefault(\"timepicker.mobileBreakpoint\"),\n    teleport: () => getDefault(\"timepicker.teleport\", false),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: \"\",\n    inputClasses: () => getDefault(\"timepicker.inputClasses\"),\n    dropdownClasses: () => getDefault(\"timepicker.dropdownClasses\"),\n    ariaSelectSecondsLabel: () =>\n        getDefault(\"timepicker.ariaSelectSecondLabel\", \"Select Second\"),\n    ariaSelectMinutesLabel: () =>\n        getDefault(\"timepicker.ariaSelectMinuteLabel\", \"Select Minute\"),\n    ariaSelectHoursLabel: () =>\n        getDefault(\"timepicker.ariaSelectHourLabel\", \"Select Hour\"),\n    selectClasses: () => getDefault(\"timepicker.selectClasses\"),\n});\n\ndefineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {Date} - updated modelValue prop\n     */\n    \"update:model-value\": [value: Date];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the trigger input element */\n    trigger?(): void;\n    /** Define an additional content in the footer */\n    footer?(): void;\n}>();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst {\n    dtf,\n    timeCreator,\n    timeFormatter,\n    timeParser,\n    pmString,\n    amString,\n    meridiens,\n    isHourFormat24,\n    hourLiteral,\n    minuteLiteral,\n    secondLiteral,\n} = useTimepickerMixins(props);\n\nconst pickerRef = useTemplateRef(\"pickerComponent\");\n\n// the modelvalue of selected date, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst hoursSelected = ref<number>();\nconst minutesSelected = ref<number>();\nconst secondsSelected = ref<number>();\nconst meridienSelected = ref<string>();\n\nwatch(\n    () => props.modelValue,\n    (value) => updateValue(value),\n    { immediate: true },\n);\n\n/** Update internal value. */\nfunction updateValue(value: Date | Date[] | undefined): void {\n    if (Array.isArray(value)) return updateValue(value[0]);\n    if (vmodel.value !== value) vmodel.value = value;\n    if (value) {\n        // update internal state\n        hoursSelected.value = value.getHours();\n        minutesSelected.value = value.getMinutes();\n        secondsSelected.value = value.getSeconds();\n        meridienSelected.value =\n            value.getHours() >= 12 ? pmString.value : amString.value;\n    } else {\n        // reset internal state\n        hoursSelected.value = undefined;\n        minutesSelected.value = undefined;\n        secondsSelected.value = undefined;\n        meridienSelected.value = amString.value;\n    }\n}\n\nconst step = computed(() => (props.enableSeconds ? \"1\" : undefined));\n\nwatch(\n    () => props.hourFormat,\n    () => {\n        if (isDefined(hoursSelected.value))\n            meridienSelected.value =\n                (hoursSelected.value || 0) >= 12\n                    ? pmString.value\n                    : amString.value;\n    },\n);\n\nwatch(\n    () => props.locale,\n    (value) => {\n        // see updateInternalState default\n        if (!value) meridienSelected.value = amString.value;\n    },\n);\n\nfunction formatNumber(value: number, prependZero: boolean): string {\n    return isHourFormat24.value || prependZero ? pad(value) : String(value);\n}\n\nconst hours = computed<(SelectOption<number> & { value: number })[]>(() => {\n    if (!props.incrementHours || props.incrementHours < 1)\n        throw new Error(\"Hour increment cannot be null or less than 1.\");\n    const hours: (SelectOption<number> & { value: number })[] = [];\n    const numberOfHours = isHourFormat24.value ? 24 : 12;\n    for (let i = 0; i < numberOfHours; i += props.incrementHours) {\n        let value = i;\n        let label = value;\n        if (!isHourFormat24.value) {\n            value = i + 1;\n            label = value;\n            if (meridienSelected.value === amString.value) {\n                if (value === 12) value = 0;\n            } else if (meridienSelected.value === pmString.value) {\n                if (value !== 12) value += 12;\n            }\n        }\n        hours.push({\n            label: formatNumber(label, false),\n            value: value,\n        });\n    }\n    return hours;\n});\n\nconst minutes = computed<(SelectOption<number> & { value: number })[]>(() => {\n    if (!props.incrementMinutes || props.incrementMinutes < 1)\n        throw new Error(\"Minute increment cannot be null or less than 1.\");\n    const minutes: (SelectOption<number> & { value: number })[] = [];\n    for (let i = 0; i < 60; i += props.incrementMinutes) {\n        minutes.push({\n            label: formatNumber(i, true),\n            value: i,\n        });\n    }\n    return minutes;\n});\n\nconst seconds = computed<(SelectOption<number> & { value: number })[]>(() => {\n    if (!props.incrementSeconds || props.incrementSeconds < 1)\n        throw new Error(\"Second increment cannot be null or less than 1.\");\n    const seconds: (SelectOption<number> & { value: number })[] = [];\n    for (let i = 0; i < 60; i += props.incrementSeconds) {\n        seconds.push({\n            label: formatNumber(i, true),\n            value: i,\n        });\n    }\n    return seconds;\n});\n\nfunction isHourDisabled(hour: number): boolean {\n    let disabled = false;\n    if (props.minTime) {\n        const minHours = props.minTime.getHours();\n        const noMinutesAvailable = minutes.value.every((minute) => {\n            return isMinuteDisabledForHour(hour, minute.value);\n        });\n        disabled = hour < minHours || noMinutesAvailable;\n    }\n    if (props.maxTime) {\n        if (!disabled) {\n            const maxHours = props.maxTime.getHours();\n            disabled = hour > maxHours;\n        }\n    }\n\n    if (props.unselectableTimes && !disabled) {\n        if (typeof props.unselectableTimes === \"function\") {\n            const date = new Date();\n            date.setHours(hour);\n            date.setMinutes(minutesSelected.value || 0);\n            date.setSeconds(secondsSelected.value || 0);\n            return props.unselectableTimes(date);\n        } else {\n            const unselectable = props.unselectableTimes.filter((time) => {\n                if (props.enableSeconds && isDefined(secondsSelected.value)) {\n                    return (\n                        time.getHours() === hour &&\n                        time.getMinutes() === minutesSelected.value &&\n                        time.getSeconds() === secondsSelected.value\n                    );\n                } else if (isDefined(minutesSelected.value)) {\n                    return (\n                        time.getHours() === hour &&\n                        time.getMinutes() === minutesSelected.value\n                    );\n                }\n                return false;\n            });\n            if (unselectable.length > 0) {\n                disabled = true;\n            } else {\n                disabled = minutes.value.every((minute) => {\n                    return (\n                        (props.unselectableTimes as Date[]).filter((time) => {\n                            return (\n                                time.getHours() === hour &&\n                                time.getMinutes() === minute.value\n                            );\n                        }).length > 0\n                    );\n                });\n            }\n        }\n    }\n    return disabled;\n}\n\nfunction isMinuteDisabledForHour(hour: number, minute: number): boolean {\n    let disabled = false;\n    if (props.minTime) {\n        const minHours = props.minTime.getHours();\n        const minMinutes = props.minTime.getMinutes();\n        disabled = hour === minHours && minute < minMinutes;\n    }\n    if (props.maxTime) {\n        if (!disabled) {\n            const maxHours = props.maxTime.getHours();\n            const maxMinutes = props.maxTime.getMinutes();\n            disabled = hour === maxHours && minute > maxMinutes;\n        }\n    }\n    return disabled;\n}\n\nfunction isMinuteDisabled(minute: number): boolean {\n    if (hoursSelected.value === undefined) return false;\n\n    let disabled =\n        isHourDisabled(hoursSelected.value) ||\n        isMinuteDisabledForHour(hoursSelected.value, minute);\n\n    if (props.unselectableTimes && !disabled) {\n        if (typeof props.unselectableTimes === \"function\") {\n            const date = new Date();\n            date.setHours(hoursSelected.value);\n            date.setMinutes(minute);\n            date.setSeconds(secondsSelected.value || 0);\n            return props.unselectableTimes(date);\n        } else {\n            const unselectable = props.unselectableTimes.filter((time) => {\n                if (props.enableSeconds && isDefined(secondsSelected.value)) {\n                    return (\n                        time.getHours() === hoursSelected.value &&\n                        time.getMinutes() === minute &&\n                        time.getSeconds() === secondsSelected.value\n                    );\n                } else {\n                    return (\n                        time.getHours() === hoursSelected.value &&\n                        time.getMinutes() === minute\n                    );\n                }\n            });\n            disabled = unselectable.length > 0;\n        }\n    }\n    return disabled;\n}\n\nfunction isSecondDisabled(second: number): boolean {\n    if (!isDefined(minutesSelected.value)) return false;\n    let disabled = false;\n\n    if (isMinuteDisabled(minutesSelected.value)) {\n        disabled = true;\n    } else {\n        if (props.minTime) {\n            const minHours = props.minTime.getHours();\n            const minMinutes = props.minTime.getMinutes();\n            const minSeconds = props.minTime.getSeconds();\n            disabled =\n                hoursSelected.value === minHours &&\n                minutesSelected.value === minMinutes &&\n                second < minSeconds;\n        }\n        if (props.maxTime) {\n            if (!disabled) {\n                const maxHours = props.maxTime.getHours();\n                const maxMinutes = props.maxTime.getMinutes();\n                const maxSeconds = props.maxTime.getSeconds();\n                disabled =\n                    hoursSelected.value === maxHours &&\n                    minutesSelected.value === maxMinutes &&\n                    second > maxSeconds;\n            }\n        }\n    }\n    if (props.unselectableTimes && !disabled) {\n        if (typeof props.unselectableTimes === \"function\") {\n            const date = new Date();\n            date.setHours(hoursSelected.value || 0);\n            date.setMinutes(minutesSelected.value);\n            date.setSeconds(second);\n            return props.unselectableTimes(date);\n        } else {\n            const unselectable = props.unselectableTimes.filter((time) => {\n                return (\n                    time.getHours() === hoursSelected.value &&\n                    time.getMinutes() === minutesSelected.value &&\n                    time.getSeconds() === second\n                );\n            });\n            disabled = unselectable.length > 0;\n        }\n    }\n    return disabled;\n}\n\nfunction isMeridienDisabled(meridienString: string): boolean {\n    const offset = meridienString == \"AM\" ? 0 : 12;\n    for (let i = 0; i < 12; i++) {\n        if (!isHourDisabled(i + offset)) return false;\n    }\n    return true;\n}\n\nfunction updateDateSelected(\n    hours: number,\n    minutes: number,\n    seconds: number,\n    meridiens,\n): void {\n    if (\n        isDefined(hours) &&\n        isDefined(minutes) &&\n        ((!isDefined(isHourFormat24.value) && isDefined(meridiens)) ||\n            isDefined(isHourFormat24.value))\n    ) {\n        let time: Date;\n        if (vmodel.value) {\n            time = new Date(vmodel.value);\n        } else {\n            time = timeCreator();\n            time.setMilliseconds(0);\n        }\n        time.setHours(hours);\n        time.setMinutes(minutes);\n        time.setSeconds(seconds);\n        if (!isNaN(time.getTime())) {\n            vmodel.value = new Date(time.getTime());\n        }\n    }\n}\n\n// --- Formatter / Parser ---\n\n/** Format date into string */\nfunction format(value: Date | Date[] | undefined, isNative: boolean): string {\n    if (Array.isArray(value)) return format(value[0], isNative);\n    if (isNative) return formatNative(value);\n\n    return timeFormatter(value);\n}\n\n/** Format date into string 'HH-MM-SS'*/\nfunction formatNative(value: Date | Date[] | undefined): string {\n    if (Array.isArray(value)) return formatNative(value[0]);\n\n    // return empty string if no value is given or value can't parse to proper date\n    if (!value) return \"\";\n    const date = new Date(value);\n    if (!isDate(date)) return \"\";\n\n    const hours = date.getHours();\n    const minutes = date.getMinutes();\n    const seconds = date.getSeconds();\n    return (\n        formatNumber(hours, true) +\n        \":\" +\n        formatNumber(minutes, true) +\n        \":\" +\n        formatNumber(seconds, true)\n    );\n}\n\n/** Parse string into date */\nfunction parse(value: string, isNative: boolean): Date | undefined {\n    if (isNative) return parseNative(value);\n\n    const date = timeParser(value);\n    return isDate(date) ? date : undefined;\n}\n\n/** Parse time from string */\nfunction parseNative(date: string): Date | undefined {\n    if (!date) return undefined;\n\n    let time: Date;\n    if (vmodel.value) {\n        time = new Date(vmodel.value);\n    } else {\n        time = timeCreator();\n        time.setMilliseconds(0);\n    }\n    const t = date.split(\":\");\n    time.setHours(parseInt(t[0], 10));\n    time.setMinutes(parseInt(t[1], 10));\n    time.setSeconds(t[2] ? parseInt(t[2], 10) : 0);\n    return new Date(time.getTime());\n}\n\n// --- Event Handler ---\n\nfunction onMeridienChange(value: string): void {\n    if (isDefined(hoursSelected.value) && props.resetOnMeridianChange) {\n        hoursSelected.value = undefined;\n        minutesSelected.value = undefined;\n        secondsSelected.value = undefined;\n        vmodel.value = undefined;\n    } else if (isDefined(hoursSelected.value)) {\n        if (value === pmString.value) hoursSelected.value += 12;\n        else if (value === amString.value) hoursSelected.value -= 12;\n    }\n    updateDateSelected(\n        hoursSelected.value || 0,\n        minutesSelected.value || 0,\n        props.enableSeconds ? secondsSelected.value || 0 : 0,\n        value,\n    );\n}\n\nfunction onHoursChange(value: string): void {\n    if (!minutesSelected.value && typeof props.defaultMinutes !== \"undefined\")\n        minutesSelected.value = props.defaultMinutes;\n    if (!secondsSelected.value && typeof props.defaultSeconds !== \"undefined\")\n        secondsSelected.value = props.defaultSeconds;\n\n    updateDateSelected(\n        parseInt(value, 10),\n        minutesSelected.value || 0,\n        props.enableSeconds ? secondsSelected.value || 0 : 0,\n        meridienSelected.value,\n    );\n}\n\nfunction onMinutesChange(value: string): void {\n    if (!secondsSelected.value && props.defaultSeconds)\n        secondsSelected.value = props.defaultSeconds;\n\n    updateDateSelected(\n        hoursSelected.value || 0,\n        parseInt(value, 10),\n        props.enableSeconds ? secondsSelected.value || 0 : 0,\n        meridienSelected.value,\n    );\n}\n\nfunction onSecondsChange(value: string): void {\n    updateDateSelected(\n        hoursSelected.value || 0,\n        minutesSelected.value || 0,\n        parseInt(value, 10),\n        meridienSelected.value,\n    );\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-timepicker\"],\n    [\n        \"sizeClass\",\n        \"o-timepicker--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\"mobileClass\", \"o-timepicker--mobile\", null, isMobile],\n);\n\nconst separatorClasses = defineClasses([\n    \"separatorClass\",\n    \"o-timepicker__separtor\",\n]);\n\nconst footerClasses = defineClasses([\"footerClass\", \"o-timepicker__footer\"]);\n\nconst pickerDropdownClasses = defineClasses([\n    \"dropdownClass\",\n    \"o-timepicker__dropdown\",\n]);\n\nconst boxClasses = defineClasses([\"boxClass\", \"o-timepicker__box\"]);\nconst boxClassBind = computed(() => getActiveClasses(boxClasses));\n\nconst selectSelectClasses = defineClasses([\n    \"selectClasses.selectClass\",\n    \"o-timepicker__select\",\n]);\n\nconst selectPlaceholderClasses = defineClasses([\n    \"selectClasses.placeholderClass\",\n    \"o-timepicker__select-placeholder\",\n]);\n\nconst selectBind = computed(() => ({\n    \"select-class\": getActiveClasses(selectSelectClasses),\n    \"placeholder-class\": getActiveClasses(selectPlaceholderClasses),\n    ...props.selectClasses,\n}));\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ focus: () => pickerRef.value?.focus(), value: vmodel });\n</script>\n\n<template>\n    <OPickerWrapper\n        ref=\"pickerComponent\"\n        v-model:active=\"isActive\"\n        :value=\"vmodel\"\n        data-oruga=\"timepicker\"\n        :picker-props=\"props\"\n        :formatter=\"format\"\n        :parser=\"parse\"\n        type=\"time\"\n        :max=\"maxTime\"\n        :min=\"minTime\"\n        :step=\"step\"\n        :root-classes=\"rootClasses\"\n        :dropdown-classes=\"pickerDropdownClasses\"\n        :box-class=\"boxClassBind\"\n        :dtf=\"dtf\"\n        @update:value=\"updateValue\"\n        @focus=\"$emit('focus', $event)\"\n        @blur=\"$emit('blur', $event)\"\n        @invalid=\"$emit('invalid', $event)\"\n        @icon-click=\"$emit('icon-click', $event)\"\n        @icon-right-click=\"$emit('icon-right-click', $event)\">\n        <template v-if=\"$slots.trigger\" #trigger>\n            <slot name=\"trigger\" />\n        </template>\n\n        <o-select\n            v-bind=\"selectBind\"\n            v-model=\"hoursSelected\"\n            :options=\"hours\"\n            override\n            :disabled=\"disabled\"\n            placeholder=\"00\"\n            :aria-label=\"ariaSelectHoursLabel\"\n            :use-html5-validation=\"false\"\n            @change=\"onHoursChange($event.target.value)\" />\n\n        <span :class=\"separatorClasses\">{{ hourLiteral }}</span>\n\n        <o-select\n            v-bind=\"selectBind\"\n            v-model=\"minutesSelected\"\n            override\n            :disabled=\"disabled\"\n            placeholder=\"00\"\n            :aria-label=\"ariaSelectMinutesLabel\"\n            :use-html5-validation=\"false\"\n            @change=\"onMinutesChange($event.target.value)\">\n            <option\n                v-for=\"minute in minutes\"\n                :key=\"minute.value\"\n                :value=\"minute.value\"\n                :disabled=\"isMinuteDisabled(minute.value)\">\n                {{ minute.label }}\n            </option>\n        </o-select>\n\n        <template v-if=\"enableSeconds\">\n            <span :class=\"separatorClasses\">{{ minuteLiteral }}</span>\n\n            <o-select\n                v-bind=\"selectBind\"\n                v-model=\"secondsSelected\"\n                override\n                :disabled=\"disabled\"\n                placeholder=\"00\"\n                :aria-label=\"ariaSelectSecondsLabel\"\n                :use-html5-validation=\"false\"\n                @change=\"onSecondsChange($event.target.value)\">\n                <option\n                    v-for=\"second in seconds\"\n                    :key=\"second.value\"\n                    :value=\"second.value\"\n                    :disabled=\"isSecondDisabled(second.value)\">\n                    {{ second.label }}\n                </option>\n            </o-select>\n\n            <span :class=\"separatorClasses\">{{ secondLiteral }}</span>\n        </template>\n\n        <o-select\n            v-if=\"!isHourFormat24\"\n            v-bind=\"selectBind\"\n            v-model=\"meridienSelected\"\n            override\n            :disabled=\"disabled\"\n            :use-html5-validation=\"false\"\n            @change=\"onMeridienChange($event.target.value)\">\n            <option\n                v-for=\"meridien in meridiens\"\n                :key=\"meridien\"\n                :value=\"meridien\"\n                :disabled=\"isMeridienDisabled(meridien)\">\n                {{ meridien }}\n            </option>\n        </o-select>\n\n        <footer v-if=\"$slots.footer\" :class=\"footerClasses\">\n            <slot name=\"footer\" />\n        </footer>\n    </OPickerWrapper>\n</template>\n","import { computed } from \"vue\";\nimport { matchWithGroups } from \"../datepicker/utils\";\nimport type { DatetimepickerProps } from \"./props\";\n\nconst AM = \"AM\" as const;\nconst PM = \"PM\" as const;\nconst HOUR_FORMAT_24 = \"24\" as const;\n\n/** Time Format Feature */\nexport function useDateimepickerMixins(props: DatetimepickerProps) {\n    const localeOptions = computed(\n        () =>\n            new Intl.DateTimeFormat(props.locale, {\n                year: \"numeric\",\n                month: \"numeric\",\n                day: \"numeric\",\n                hour: \"numeric\",\n                minute: \"numeric\",\n                second: props.timepicker?.enableSeconds ? \"numeric\" : undefined,\n            }).resolvedOptions() as Intl.DateTimeFormatOptions,\n    );\n\n    const isHourFormat24 = computed(\n        () =>\n            (props.timepicker?.hourFormat &&\n                props.timepicker.hourFormat === HOUR_FORMAT_24) ||\n            (!props.timepicker?.hourFormat && !localeOptions.value.hour12),\n    );\n\n    const dtf = computed(\n        () =>\n            new Intl.DateTimeFormat(props.locale, {\n                year: localeOptions.value.year || \"numeric\",\n                month: localeOptions.value.month || \"numeric\",\n                day: localeOptions.value.day || \"numeric\",\n                hour: localeOptions.value.hour || \"numeric\",\n                minute: localeOptions.value.minute || \"numeric\",\n                second: props.timepicker?.enableSeconds\n                    ? localeOptions.value.second || \"numeric\"\n                    : undefined,\n                hourCycle: !isHourFormat24.value ? \"h12\" : \"h23\",\n            }),\n    );\n\n    const amString = computed(() => {\n        if (\n            dtf.value.formatToParts &&\n            typeof dtf.value.formatToParts === \"function\"\n        ) {\n            const d = datetimeCreator();\n            d.setHours(10);\n            const dayPeriod = dtf.value\n                .formatToParts(d)\n                .find((part) => part.type === \"dayPeriod\");\n            if (dayPeriod) return dayPeriod.value;\n        }\n        return AM;\n    });\n\n    const pmString = computed(() => {\n        if (\n            dtf.value.formatToParts &&\n            typeof dtf.value.formatToParts === \"function\"\n        ) {\n            const d = datetimeCreator();\n            d.setHours(20);\n            const dayPeriod = dtf.value\n                .formatToParts(d)\n                .find((part) => part.type === \"dayPeriod\");\n            if (dayPeriod) return dayPeriod.value;\n        }\n        return PM;\n    });\n\n    function datetimeCreator(): Date {\n        if (typeof props.creator === \"function\") {\n            const r = props.creator();\n            if (r instanceof Date) return r;\n        }\n        return new Date();\n    }\n\n    function datetimeFormatter(date: Date): string {\n        if (typeof props.formatter === \"function\") {\n            const r = props.formatter(date);\n            if (typeof r === \"string\") return r;\n        }\n\n        if (!date) return \"\";\n        return dtf.value.format(date);\n    }\n\n    function datetimeParser(date: string): Date | undefined {\n        if (typeof props.parser === \"function\") {\n            const r = props.parser(date);\n            if (r !== undefined) return r;\n        }\n\n        if (!date) return undefined;\n        if (\n            dtf.value.formatToParts &&\n            typeof dtf.value.formatToParts === \"function\"\n        ) {\n            const dayPeriods = [\n                AM,\n                PM,\n                AM.toLowerCase(),\n                PM.toLowerCase(),\n                amString.value,\n                pmString.value,\n            ];\n            const parts = dtf.value.formatToParts(new Date());\n            const formatRegex = parts\n                .map((part, idx) => {\n                    if (part.type === \"literal\") {\n                        if (\n                            idx + 1 < parts.length &&\n                            parts[idx + 1].type === \"hour\"\n                        ) {\n                            return `[^\\\\d]+`;\n                        }\n                        return part.value.replace(/ /g, \"\\\\s?\");\n                    } else if (part.type === \"dayPeriod\") {\n                        return `((?!=<${part.type}>)(${dayPeriods.join(\n                            \"|\",\n                        )})?)`;\n                    }\n                    return `((?!=<${part.type}>)\\\\d+)`;\n                })\n                .join(\"\");\n            const datetimeGroups = matchWithGroups(formatRegex, date);\n\n            // We do a simple validation for the group.\n            // If it is not valid, it will fallback to Date.parse below\n            if (\n                datetimeGroups.year &&\n                datetimeGroups.year.length === 4 &&\n                datetimeGroups.month &&\n                datetimeGroups.month <= 12 &&\n                datetimeGroups.day &&\n                datetimeGroups.day <= 31 &&\n                datetimeGroups.hour &&\n                datetimeGroups.hour >= 0 &&\n                datetimeGroups.hour < 24 &&\n                datetimeGroups.minute &&\n                datetimeGroups.minute >= 0 &&\n                datetimeGroups.minute <= 59\n            ) {\n                return new Date(\n                    datetimeGroups.year,\n                    datetimeGroups.month - 1,\n                    datetimeGroups.day,\n                    datetimeGroups.hour,\n                    datetimeGroups.minute,\n                    datetimeGroups.second || 0,\n                );\n            }\n        }\n\n        // Fallback if formatToParts is not supported or if we were not able to parse a valid date\n        return new Date(Date.parse(date));\n    }\n\n    return {\n        dtf,\n        datetimeCreator,\n        datetimeFormatter,\n        datetimeParser,\n    };\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, useTemplateRef, watch } from \"vue\";\n\nimport ODatepicker from \"../datepicker/Datepicker.vue\";\nimport OTimepicker from \"../timepicker/Timepicker.vue\";\nimport OInput from \"../input/Input.vue\";\n\nimport { getDefault, getDefaultFunction } from \"@/utils/config\";\nimport { isDate, isMobileAgent, pad } from \"@/utils/helpers\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { useDateimepickerMixins } from \"./useDatetimepickerMixin\";\n\nimport type { DatepickerProps } from \"../datepicker/props\";\nimport type { TimepickerProps } from \"../timepicker/props\";\nimport type { DatetimepickerProps } from \"./props\";\n\n/**\n * An input with a simple dropdown/modal for selecting a date and time, uses native datetimepicker for mobile.\n * @displayName Datetimepicker\n * @style _datetimepicker.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ODatetimepicker\",\n    configField: \"datetimepicker\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = DatetimepickerProps[\"modelValue\"];\n\nconst props = withDefaults(defineProps<DatetimepickerProps>(), {\n    override: undefined,\n    modelValue: undefined,\n    active: false,\n    datepicker: undefined,\n    timepicker: undefined,\n    minDatetime: undefined,\n    maxDatetime: undefined,\n    size: () => getDefault(\"datetimepicker.size\"),\n    expanded: () => getDefault(\"datetimepicker.expanded\", false),\n    rounded: false,\n    placeholder: undefined,\n    readonly: false,\n    disabled: false,\n    inline: false,\n    openOnFocus: () => getDefault(\"datetimepicker.openOnFocus\", true),\n    locale: () => getDefault(\"locale\"),\n    formatter: getDefaultFunction(\"datetimepicker.dateFormatter\"),\n    parser: getDefaultFunction(\"datetimepicker.dateParser\"),\n    creator: getDefaultFunction(\"datetimepicker.datetimeCreator\"),\n    position: undefined,\n    iconPack: () => getDefault(\"datetimepicker.iconPack\"),\n    icon: () => getDefault(\"datetimepicker.icon\"),\n    iconRight: () => getDefault(\"datetimepicker.iconRight\"),\n    iconRightClickable: false,\n    desktopModal: () => getDefault(\"datetimepicker.desktopModal\", false),\n    mobileModal: () => getDefault(\"datetimepicker.mobileModal\", true),\n    mobileNative: () => getDefault(\"datetimepicker.mobileNative\", true),\n    teleport: () => getDefault(\"datetimepicker.teleport\", false),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: \"\",\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {Date} - updated modelValue prop\n     */\n    \"update:model-value\": [value: Date];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on range start is selected event\n     * @param value {Date} - range start date\n     */\n    \"range-start\": [value: Date];\n    /**\n     * on range end is selected event\n     * @param value {Date} - range end date\n     */\n    \"range-end\": [value: Date];\n    /**\n     * on month change event\n     * @param value {number} - month number\n     */\n    \"change-month\": [value: number];\n    /**\n     * on year change event\n     * @param value {number} - year number\n     */\n    \"change-year\": [value: number];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n}>();\n\ndefineSlots<{\n    /** Define an additional footer */\n    footer?(): void;\n}>();\n\nconst datepickerRef = useTemplateRef(\"datepickerComponent\");\nconst nativeInputRef = useTemplateRef(\"nativeInputComponent\");\n\nconst timepickerProps = ref<TimepickerProps | undefined>(props.timepicker);\nwatch(\n    () => props.timepicker,\n    (value) => (timepickerProps.value = value),\n    { deep: true },\n);\nconst datepickerProps = ref<DatepickerProps | undefined>(props.datepicker);\nwatch(\n    () => props.datepicker,\n    (value) => (datepickerProps.value = value),\n    { deep: true },\n);\n\nconst isMobileNative = computed(\n    () => props.mobileNative && isMobileAgent.any(),\n);\n\nconst elementRef = computed(() =>\n    isMobileNative.value ? nativeInputRef.value : datepickerRef.value,\n);\n\n// use form input functionality for native input\nconst { checkHtml5Validity, setFocus, onBlur, onFocus, onInvalid } =\n    useInputHandler(elementRef, emits, props);\n\nconst { datetimeFormatter, datetimeParser } = useDateimepickerMixins(props);\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\n// the modelvalue of selected date, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nfunction updateVModel(value: Date | Date[] | undefined): void {\n    if (Array.isArray(value)) return updateVModel(value[0]);\n    if (!value) {\n        vmodel.value = undefined;\n        return;\n    }\n\n    let date = new Date(value.getTime());\n    if (props.modelValue) {\n        // restore time part\n        if (\n            (value.getDate() !== props.modelValue.getDate() ||\n                value.getMonth() !== props.modelValue.getMonth() ||\n                value.getFullYear() !== props.modelValue.getFullYear()) &&\n            value.getHours() === 0 &&\n            value.getMinutes() === 0 &&\n            value.getSeconds() === 0\n        ) {\n            date.setHours(\n                props.modelValue.getHours(),\n                props.modelValue.getMinutes(),\n                props.modelValue.getSeconds(),\n                0,\n            );\n        }\n    }\n    // check min and max range\n    if (props.minDatetime && date < props.minDatetime) {\n        date = props.minDatetime;\n    } else if (props.maxDatetime && date > props.maxDatetime) {\n        date = props.maxDatetime;\n    }\n    vmodel.value = new Date(date.getTime());\n}\n\nconst minDate = computed(() => {\n    if (!props.minDatetime) return datepickerProps.value?.minDate;\n    return new Date(\n        props.minDatetime.getFullYear(),\n        props.minDatetime.getMonth(),\n        props.minDatetime.getDate(),\n        0,\n        0,\n        0,\n        0,\n    );\n});\n\nconst maxDate = computed(() => {\n    if (!props.maxDatetime) return datepickerProps.value?.maxDate;\n    return new Date(\n        props.maxDatetime.getFullYear(),\n        props.maxDatetime.getMonth(),\n        props.maxDatetime.getDate(),\n        0,\n        0,\n        0,\n        0,\n    );\n});\n\n// Only enable min/max time if local (not necessarily UTC) date portion matches\nconst minTime = computed(() => {\n    if (\n        !props.minDatetime ||\n        vmodel.value === null ||\n        typeof vmodel.value === \"undefined\" ||\n        vmodel.value.getFullYear() != props.minDatetime.getFullYear() ||\n        vmodel.value.getMonth() != props.minDatetime.getMonth() ||\n        vmodel.value.getDate() != props.minDatetime.getDate()\n    ) {\n        return timepickerProps.value?.minTime;\n    }\n    return props.minDatetime;\n});\n\nconst maxTime = computed(() => {\n    if (\n        !props.maxDatetime ||\n        vmodel.value === null ||\n        typeof vmodel.value === \"undefined\" ||\n        vmodel.value.getFullYear() != props.maxDatetime.getFullYear() ||\n        vmodel.value.getMonth() != props.maxDatetime.getMonth() ||\n        vmodel.value.getDate() != props.maxDatetime.getDate()\n    ) {\n        return timepickerProps.value?.maxTime;\n    }\n    return props.maxDatetime;\n});\n\nconst datepickerSize = computed(\n    () => datepickerProps.value?.size || props.size,\n);\n\nconst timepickerSize = computed(\n    () => timepickerProps.value?.size || props.size,\n);\n\nconst timepickerDisabled = computed(\n    () => timepickerProps.value?.disabled || props.disabled,\n);\n\n// #region --- Formatter / Parser ---\n\n/** Format date into string */\nfunction format(value: Date): string {\n    return datetimeFormatter(value);\n}\n\n/** Parse string into date */\nfunction parse(value: string): Date | undefined {\n    const date = datetimeParser(value);\n\n    return isDate(date) ? date : undefined;\n}\n\nfunction formatNative(value: ModelValue): string {\n    const date = value ? new Date(value) : undefined;\n    if (date && isDate(date)) {\n        const year = date.getFullYear();\n        const month = date.getMonth() + 1;\n        const day = date.getDate();\n        const hours = date.getHours();\n        const minutes = date.getMinutes();\n        const seconds = date.getSeconds();\n        return (\n            year +\n            \"-\" +\n            pad(month) +\n            \"-\" +\n            pad(day) +\n            \"T\" +\n            pad(hours) +\n            \":\" +\n            pad(minutes) +\n            \":\" +\n            pad(seconds)\n        );\n    }\n    return \"\";\n}\n\n// #endregion --- Formatter / Parser ---\n\n// #region --- Event Handler ---\n\n/** Parse date from string */\nfunction onChangeNativePicker(event: Event): void {\n    const date = (event.target as HTMLInputElement).value;\n    const s = date ? date.split(/\\D/) : [];\n    if (s.length >= 5) {\n        const year = parseInt(s[0], 10);\n        const month = parseInt(s[1], 10) - 1;\n        const day = parseInt(s[2], 10);\n        const hours = parseInt(s[3], 10);\n        const minutes = parseInt(s[4], 10);\n        // Seconds are omitted intentionally; they are unsupported by input\n        // type=datetime-local and cause the control to fail native validation\n        updateVModel(new Date(year, month, day, hours, minutes));\n    } else {\n        updateVModel(undefined);\n    }\n}\n\n// #endregion --- Event Handler ---\n\n// #region --- Computed Component Classes ---\n\nconst datepickerWrapperClasses = defineClasses([\n    \"datepickerWrapperClass\",\n    \"o-datetimepicker__date\",\n]);\n\nconst timepickerWrapperClasses = defineClasses([\n    \"timepickerWrapperClass\",\n    \"o-datetimepicker__time\",\n]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <o-datepicker\n        v-if=\"!isMobileNative || inline\"\n        ref=\"datepickerComponent\"\n        v-bind=\"{ ...$attrs, ...datepicker }\"\n        v-model:active=\"isActive\"\n        :model-value=\"vmodel\"\n        data-oruga=\"datetimepicker\"\n        :class=\"datepickerWrapperClasses\"\n        :rounded=\"rounded\"\n        :open-on-focus=\"openOnFocus\"\n        :position=\"position\"\n        :inline=\"inline\"\n        :readonly=\"readonly\"\n        :expanded=\"expanded\"\n        :close-on-click=\"false\"\n        :formatter=\"format\"\n        :parser=\"parse\"\n        :min-date=\"minDate\"\n        :max-date=\"maxDate\"\n        :icon=\"icon\"\n        :icon-right=\"iconRight\"\n        :icon-right-clickable=\"iconRightClickable\"\n        :icon-pack=\"iconPack\"\n        :size=\"datepickerSize\"\n        :placeholder=\"placeholder\"\n        :range=\"false\"\n        :multiple=\"false\"\n        :disabled=\"disabled\"\n        :desktop-modal=\"desktopModal\"\n        :mobile-modal=\"mobileModal\"\n        :mobile-native=\"isMobileNative\"\n        :locale=\"locale\"\n        :teleport=\"teleport\"\n        :use-html5-validation=\"false\"\n        @update:model-value=\"updateVModel\"\n        @focus=\"onFocus\"\n        @blur=\"onBlur\"\n        @invalid=\"onInvalid\"\n        @change-month=\"$emit('change-month', $event)\"\n        @change-year=\"$emit('change-year', $event)\"\n        @icon-click=\"$emit('icon-click', $event)\"\n        @icon-right-click=\"$emit('icon-right-click', $event)\">\n        <template #footer>\n            <div :class=\"timepickerWrapperClasses\">\n                <o-timepicker\n                    v-bind=\"timepicker\"\n                    v-model=\"vmodel\"\n                    inline\n                    :readonly=\"readonly\"\n                    :min-time=\"minTime\"\n                    :max-time=\"maxTime\"\n                    :size=\"timepickerSize\"\n                    :disabled=\"timepickerDisabled\"\n                    :mobile-native=\"isMobileNative\"\n                    :locale=\"locale\" />\n            </div>\n\n            <template v-if=\"$slots.footer\">\n                <slot name=\"footer\" />\n            </template>\n        </template>\n    </o-datepicker>\n\n    <!-- Native Picker -->\n    <o-input\n        v-else\n        v-bind=\"$attrs\"\n        ref=\"nativeInputComponent\"\n        type=\"datetime-local\"\n        autocomplete=\"off\"\n        :value=\"formatNative(vmodel)\"\n        :max=\"formatNative(maxDate)\"\n        :min=\"formatNative(minDate)\"\n        :placeholder=\"placeholder\"\n        :size=\"datepickerSize\"\n        :icon-pack=\"iconPack\"\n        :icon=\"icon\"\n        :rounded=\"rounded\"\n        :disabled=\"disabled\"\n        :readonly=\"false\"\n        :use-html5-validation=\"false\"\n        @change=\"onChangeNativePicker\"\n        @focus=\"onFocus\"\n        @blur=\"onBlur\"\n        @invalid=\"onInvalid\" />\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, useTemplateRef, watch } from \"vue\";\n\nimport ODatepicker from \"../datepicker/Datepicker.vue\";\nimport OTimepicker from \"../timepicker/Timepicker.vue\";\nimport OInput from \"../input/Input.vue\";\n\nimport { getDefault, getDefaultFunction } from \"@/utils/config\";\nimport { isDate, isMobileAgent, pad } from \"@/utils/helpers\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { useDateimepickerMixins } from \"./useDatetimepickerMixin\";\n\nimport type { DatepickerProps } from \"../datepicker/props\";\nimport type { TimepickerProps } from \"../timepicker/props\";\nimport type { DatetimepickerProps } from \"./props\";\n\n/**\n * An input with a simple dropdown/modal for selecting a date and time, uses native datetimepicker for mobile.\n * @displayName Datetimepicker\n * @style _datetimepicker.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ODatetimepicker\",\n    configField: \"datetimepicker\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = DatetimepickerProps[\"modelValue\"];\n\nconst props = withDefaults(defineProps<DatetimepickerProps>(), {\n    override: undefined,\n    modelValue: undefined,\n    active: false,\n    datepicker: undefined,\n    timepicker: undefined,\n    minDatetime: undefined,\n    maxDatetime: undefined,\n    size: () => getDefault(\"datetimepicker.size\"),\n    expanded: () => getDefault(\"datetimepicker.expanded\", false),\n    rounded: false,\n    placeholder: undefined,\n    readonly: false,\n    disabled: false,\n    inline: false,\n    openOnFocus: () => getDefault(\"datetimepicker.openOnFocus\", true),\n    locale: () => getDefault(\"locale\"),\n    formatter: getDefaultFunction(\"datetimepicker.dateFormatter\"),\n    parser: getDefaultFunction(\"datetimepicker.dateParser\"),\n    creator: getDefaultFunction(\"datetimepicker.datetimeCreator\"),\n    position: undefined,\n    iconPack: () => getDefault(\"datetimepicker.iconPack\"),\n    icon: () => getDefault(\"datetimepicker.icon\"),\n    iconRight: () => getDefault(\"datetimepicker.iconRight\"),\n    iconRightClickable: false,\n    desktopModal: () => getDefault(\"datetimepicker.desktopModal\", false),\n    mobileModal: () => getDefault(\"datetimepicker.mobileModal\", true),\n    mobileNative: () => getDefault(\"datetimepicker.mobileNative\", true),\n    teleport: () => getDefault(\"datetimepicker.teleport\", false),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: \"\",\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {Date} - updated modelValue prop\n     */\n    \"update:model-value\": [value: Date];\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on range start is selected event\n     * @param value {Date} - range start date\n     */\n    \"range-start\": [value: Date];\n    /**\n     * on range end is selected event\n     * @param value {Date} - range end date\n     */\n    \"range-end\": [value: Date];\n    /**\n     * on month change event\n     * @param value {number} - month number\n     */\n    \"change-month\": [value: number];\n    /**\n     * on year change event\n     * @param value {number} - year number\n     */\n    \"change-year\": [value: number];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n}>();\n\ndefineSlots<{\n    /** Define an additional footer */\n    footer?(): void;\n}>();\n\nconst datepickerRef = useTemplateRef(\"datepickerComponent\");\nconst nativeInputRef = useTemplateRef(\"nativeInputComponent\");\n\nconst timepickerProps = ref<TimepickerProps | undefined>(props.timepicker);\nwatch(\n    () => props.timepicker,\n    (value) => (timepickerProps.value = value),\n    { deep: true },\n);\nconst datepickerProps = ref<DatepickerProps | undefined>(props.datepicker);\nwatch(\n    () => props.datepicker,\n    (value) => (datepickerProps.value = value),\n    { deep: true },\n);\n\nconst isMobileNative = computed(\n    () => props.mobileNative && isMobileAgent.any(),\n);\n\nconst elementRef = computed(() =>\n    isMobileNative.value ? nativeInputRef.value : datepickerRef.value,\n);\n\n// use form input functionality for native input\nconst { checkHtml5Validity, setFocus, onBlur, onFocus, onInvalid } =\n    useInputHandler(elementRef, emits, props);\n\nconst { datetimeFormatter, datetimeParser } = useDateimepickerMixins(props);\n\n// the active state of the dropdown, use v-model:active to make it two-way binding\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\n// the modelvalue of selected date, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nfunction updateVModel(value: Date | Date[] | undefined): void {\n    if (Array.isArray(value)) return updateVModel(value[0]);\n    if (!value) {\n        vmodel.value = undefined;\n        return;\n    }\n\n    let date = new Date(value.getTime());\n    if (props.modelValue) {\n        // restore time part\n        if (\n            (value.getDate() !== props.modelValue.getDate() ||\n                value.getMonth() !== props.modelValue.getMonth() ||\n                value.getFullYear() !== props.modelValue.getFullYear()) &&\n            value.getHours() === 0 &&\n            value.getMinutes() === 0 &&\n            value.getSeconds() === 0\n        ) {\n            date.setHours(\n                props.modelValue.getHours(),\n                props.modelValue.getMinutes(),\n                props.modelValue.getSeconds(),\n                0,\n            );\n        }\n    }\n    // check min and max range\n    if (props.minDatetime && date < props.minDatetime) {\n        date = props.minDatetime;\n    } else if (props.maxDatetime && date > props.maxDatetime) {\n        date = props.maxDatetime;\n    }\n    vmodel.value = new Date(date.getTime());\n}\n\nconst minDate = computed(() => {\n    if (!props.minDatetime) return datepickerProps.value?.minDate;\n    return new Date(\n        props.minDatetime.getFullYear(),\n        props.minDatetime.getMonth(),\n        props.minDatetime.getDate(),\n        0,\n        0,\n        0,\n        0,\n    );\n});\n\nconst maxDate = computed(() => {\n    if (!props.maxDatetime) return datepickerProps.value?.maxDate;\n    return new Date(\n        props.maxDatetime.getFullYear(),\n        props.maxDatetime.getMonth(),\n        props.maxDatetime.getDate(),\n        0,\n        0,\n        0,\n        0,\n    );\n});\n\n// Only enable min/max time if local (not necessarily UTC) date portion matches\nconst minTime = computed(() => {\n    if (\n        !props.minDatetime ||\n        vmodel.value === null ||\n        typeof vmodel.value === \"undefined\" ||\n        vmodel.value.getFullYear() != props.minDatetime.getFullYear() ||\n        vmodel.value.getMonth() != props.minDatetime.getMonth() ||\n        vmodel.value.getDate() != props.minDatetime.getDate()\n    ) {\n        return timepickerProps.value?.minTime;\n    }\n    return props.minDatetime;\n});\n\nconst maxTime = computed(() => {\n    if (\n        !props.maxDatetime ||\n        vmodel.value === null ||\n        typeof vmodel.value === \"undefined\" ||\n        vmodel.value.getFullYear() != props.maxDatetime.getFullYear() ||\n        vmodel.value.getMonth() != props.maxDatetime.getMonth() ||\n        vmodel.value.getDate() != props.maxDatetime.getDate()\n    ) {\n        return timepickerProps.value?.maxTime;\n    }\n    return props.maxDatetime;\n});\n\nconst datepickerSize = computed(\n    () => datepickerProps.value?.size || props.size,\n);\n\nconst timepickerSize = computed(\n    () => timepickerProps.value?.size || props.size,\n);\n\nconst timepickerDisabled = computed(\n    () => timepickerProps.value?.disabled || props.disabled,\n);\n\n// #region --- Formatter / Parser ---\n\n/** Format date into string */\nfunction format(value: Date): string {\n    return datetimeFormatter(value);\n}\n\n/** Parse string into date */\nfunction parse(value: string): Date | undefined {\n    const date = datetimeParser(value);\n\n    return isDate(date) ? date : undefined;\n}\n\nfunction formatNative(value: ModelValue): string {\n    const date = value ? new Date(value) : undefined;\n    if (date && isDate(date)) {\n        const year = date.getFullYear();\n        const month = date.getMonth() + 1;\n        const day = date.getDate();\n        const hours = date.getHours();\n        const minutes = date.getMinutes();\n        const seconds = date.getSeconds();\n        return (\n            year +\n            \"-\" +\n            pad(month) +\n            \"-\" +\n            pad(day) +\n            \"T\" +\n            pad(hours) +\n            \":\" +\n            pad(minutes) +\n            \":\" +\n            pad(seconds)\n        );\n    }\n    return \"\";\n}\n\n// #endregion --- Formatter / Parser ---\n\n// #region --- Event Handler ---\n\n/** Parse date from string */\nfunction onChangeNativePicker(event: Event): void {\n    const date = (event.target as HTMLInputElement).value;\n    const s = date ? date.split(/\\D/) : [];\n    if (s.length >= 5) {\n        const year = parseInt(s[0], 10);\n        const month = parseInt(s[1], 10) - 1;\n        const day = parseInt(s[2], 10);\n        const hours = parseInt(s[3], 10);\n        const minutes = parseInt(s[4], 10);\n        // Seconds are omitted intentionally; they are unsupported by input\n        // type=datetime-local and cause the control to fail native validation\n        updateVModel(new Date(year, month, day, hours, minutes));\n    } else {\n        updateVModel(undefined);\n    }\n}\n\n// #endregion --- Event Handler ---\n\n// #region --- Computed Component Classes ---\n\nconst datepickerWrapperClasses = defineClasses([\n    \"datepickerWrapperClass\",\n    \"o-datetimepicker__date\",\n]);\n\nconst timepickerWrapperClasses = defineClasses([\n    \"timepickerWrapperClass\",\n    \"o-datetimepicker__time\",\n]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <o-datepicker\n        v-if=\"!isMobileNative || inline\"\n        ref=\"datepickerComponent\"\n        v-bind=\"{ ...$attrs, ...datepicker }\"\n        v-model:active=\"isActive\"\n        :model-value=\"vmodel\"\n        data-oruga=\"datetimepicker\"\n        :class=\"datepickerWrapperClasses\"\n        :rounded=\"rounded\"\n        :open-on-focus=\"openOnFocus\"\n        :position=\"position\"\n        :inline=\"inline\"\n        :readonly=\"readonly\"\n        :expanded=\"expanded\"\n        :close-on-click=\"false\"\n        :formatter=\"format\"\n        :parser=\"parse\"\n        :min-date=\"minDate\"\n        :max-date=\"maxDate\"\n        :icon=\"icon\"\n        :icon-right=\"iconRight\"\n        :icon-right-clickable=\"iconRightClickable\"\n        :icon-pack=\"iconPack\"\n        :size=\"datepickerSize\"\n        :placeholder=\"placeholder\"\n        :range=\"false\"\n        :multiple=\"false\"\n        :disabled=\"disabled\"\n        :desktop-modal=\"desktopModal\"\n        :mobile-modal=\"mobileModal\"\n        :mobile-native=\"isMobileNative\"\n        :locale=\"locale\"\n        :teleport=\"teleport\"\n        :use-html5-validation=\"false\"\n        @update:model-value=\"updateVModel\"\n        @focus=\"onFocus\"\n        @blur=\"onBlur\"\n        @invalid=\"onInvalid\"\n        @change-month=\"$emit('change-month', $event)\"\n        @change-year=\"$emit('change-year', $event)\"\n        @icon-click=\"$emit('icon-click', $event)\"\n        @icon-right-click=\"$emit('icon-right-click', $event)\">\n        <template #footer>\n            <div :class=\"timepickerWrapperClasses\">\n                <o-timepicker\n                    v-bind=\"timepicker\"\n                    v-model=\"vmodel\"\n                    inline\n                    :readonly=\"readonly\"\n                    :min-time=\"minTime\"\n                    :max-time=\"maxTime\"\n                    :size=\"timepickerSize\"\n                    :disabled=\"timepickerDisabled\"\n                    :mobile-native=\"isMobileNative\"\n                    :locale=\"locale\" />\n            </div>\n\n            <template v-if=\"$slots.footer\">\n                <slot name=\"footer\" />\n            </template>\n        </template>\n    </o-datepicker>\n\n    <!-- Native Picker -->\n    <o-input\n        v-else\n        v-bind=\"$attrs\"\n        ref=\"nativeInputComponent\"\n        type=\"datetime-local\"\n        autocomplete=\"off\"\n        :value=\"formatNative(vmodel)\"\n        :max=\"formatNative(maxDate)\"\n        :min=\"formatNative(minDate)\"\n        :placeholder=\"placeholder\"\n        :size=\"datepickerSize\"\n        :icon-pack=\"iconPack\"\n        :icon=\"icon\"\n        :rounded=\"rounded\"\n        :disabled=\"disabled\"\n        :readonly=\"false\"\n        :use-html5-validation=\"false\"\n        @change=\"onChangeNativePicker\"\n        @focus=\"onFocus\"\n        @blur=\"onBlur\"\n        @invalid=\"onInvalid\" />\n</template>\n","import type { App } from \"vue\";\n\nimport Datetimepicker from \"./Datetimepicker.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export datetimepicker specific types */\nexport type * from \"./props\";\n\n/** export datetimepicker plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Datetimepicker);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export datetimepicker components */\nexport { Datetimepicker as ODatetimepicker };\n","<script setup lang=\"ts\">\nimport { useTemplateRef, watch } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    useEventListener,\n    usePreventScrolling,\n} from \"@/composables\";\n\nimport type { LoadingProps } from \"./props\";\n\n/**\n * A simple loading overlay.\n * @displayName Loading\n * @style _loading.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OLoading\",\n    configField: \"loading\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<LoadingProps>(), {\n    override: undefined,\n    active: false,\n    fullPage: true,\n    label: undefined,\n    animation: () => getDefault(\"loading.animation\", \"fade\"),\n    closeOnOutside: false,\n    closeOnEscape: false,\n    icon: () => getDefault(\"loading.icon\", \"loading\"),\n    iconPack: () => getDefault(\"loading.iconPack\"),\n    iconSpin: () => getDefault(\"loading.iconSpin\", true),\n    iconSize: () => getDefault(\"loading.iconSize\", \"medium\"),\n    clipScroll: () => getDefault(\"loading.clipScroll\", false),\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * fullPage prop two-way binding\n     * @param value {boolean} - updated fullPage prop\n     */\n    \"update:fullPage\": [value: boolean];\n    /**\n     * on active state changes to false\n     * @param event {Event} - native event\n     */\n    close: [event?: Event];\n}>();\n\ndefineSlots<{\n    /**\n     * Define the content while loading, default is icon and optional label prop\n     * @param close {(event: Event): void} - function to close the component\n     */\n    default?(props: { close: (event: Event) => void }): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nconst isFullPage = defineModel<boolean>(\"fullPage\", { default: true });\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst toggleScroll = usePreventScrolling(props.clipScroll);\n\nwatch(isActive, (value) => {\n    if (isFullPage.value) toggleScroll(value);\n});\n\n// #region --- Events Feature ---\n\nif (isClient) {\n    // register onKeyup event when is active\n    useEventListener(rootRef, \"keyup\", onKeyup, {\n        trigger: isActive,\n        passive: true,\n    });\n}\n\n/** Keyup event listener that is bound to the root element. */\nfunction onKeyup(event: KeyboardEvent): void {\n    if (!props.closeOnEscape) return;\n    if (event.key === \"Escape\" || event.key === \"Esc\") close(event);\n}\n\n/** Click outside event listener, when clicked on the overlay. */\nfunction clickedOutside(event: Event): void {\n    if (!props.closeOnOutside) return;\n    close(event);\n}\n\n/** set active to false and emit close event */\nfunction close(event: Event): void {\n    if (!isActive.value) return;\n    isActive.value = false;\n    emits(\"close\", event);\n}\n\n// #endregion --- Events Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-loading\"],\n    [\"fullPageClass\", \"o-loading--fullpage\", null, isFullPage],\n);\n\nconst overlayClasses = defineClasses([\"overlayClass\", \"o-loading__overlay\"]);\n\nconst iconClasses = defineClasses([\"iconClass\", \"o-loading__icon\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-loading__label\"]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <transition :name=\"animation\">\n        <div\n            v-if=\"isActive\"\n            ref=\"rootElement\"\n            data-oruga=\"loading\"\n            :class=\"rootClasses\"\n            role=\"status\"\n            aria-live=\"polite\">\n            <div\n                :class=\"overlayClasses\"\n                :tabindex=\"-1\"\n                @click=\"clickedOutside\" />\n\n            <slot :close=\"close\">\n                <o-icon\n                    :icon=\"icon\"\n                    :spin=\"iconSpin\"\n                    :size=\"iconSize\"\n                    :pack=\"iconPack\"\n                    :class=\"iconClasses\" />\n                <span v-if=\"label\" :class=\"labelClasses\">\n                    {{ label }}\n                </span>\n            </slot>\n        </div>\n    </transition>\n</template>\n","<script setup lang=\"ts\">\nimport { useTemplateRef, watch } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    useEventListener,\n    usePreventScrolling,\n} from \"@/composables\";\n\nimport type { LoadingProps } from \"./props\";\n\n/**\n * A simple loading overlay.\n * @displayName Loading\n * @style _loading.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OLoading\",\n    configField: \"loading\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<LoadingProps>(), {\n    override: undefined,\n    active: false,\n    fullPage: true,\n    label: undefined,\n    animation: () => getDefault(\"loading.animation\", \"fade\"),\n    closeOnOutside: false,\n    closeOnEscape: false,\n    icon: () => getDefault(\"loading.icon\", \"loading\"),\n    iconPack: () => getDefault(\"loading.iconPack\"),\n    iconSpin: () => getDefault(\"loading.iconSpin\", true),\n    iconSize: () => getDefault(\"loading.iconSize\", \"medium\"),\n    clipScroll: () => getDefault(\"loading.clipScroll\", false),\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * fullPage prop two-way binding\n     * @param value {boolean} - updated fullPage prop\n     */\n    \"update:fullPage\": [value: boolean];\n    /**\n     * on active state changes to false\n     * @param event {Event} - native event\n     */\n    close: [event?: Event];\n}>();\n\ndefineSlots<{\n    /**\n     * Define the content while loading, default is icon and optional label prop\n     * @param close {(event: Event): void} - function to close the component\n     */\n    default?(props: { close: (event: Event) => void }): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nconst isFullPage = defineModel<boolean>(\"fullPage\", { default: true });\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst toggleScroll = usePreventScrolling(props.clipScroll);\n\nwatch(isActive, (value) => {\n    if (isFullPage.value) toggleScroll(value);\n});\n\n// #region --- Events Feature ---\n\nif (isClient) {\n    // register onKeyup event when is active\n    useEventListener(rootRef, \"keyup\", onKeyup, {\n        trigger: isActive,\n        passive: true,\n    });\n}\n\n/** Keyup event listener that is bound to the root element. */\nfunction onKeyup(event: KeyboardEvent): void {\n    if (!props.closeOnEscape) return;\n    if (event.key === \"Escape\" || event.key === \"Esc\") close(event);\n}\n\n/** Click outside event listener, when clicked on the overlay. */\nfunction clickedOutside(event: Event): void {\n    if (!props.closeOnOutside) return;\n    close(event);\n}\n\n/** set active to false and emit close event */\nfunction close(event: Event): void {\n    if (!isActive.value) return;\n    isActive.value = false;\n    emits(\"close\", event);\n}\n\n// #endregion --- Events Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-loading\"],\n    [\"fullPageClass\", \"o-loading--fullpage\", null, isFullPage],\n);\n\nconst overlayClasses = defineClasses([\"overlayClass\", \"o-loading__overlay\"]);\n\nconst iconClasses = defineClasses([\"iconClass\", \"o-loading__icon\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-loading__label\"]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <transition :name=\"animation\">\n        <div\n            v-if=\"isActive\"\n            ref=\"rootElement\"\n            data-oruga=\"loading\"\n            :class=\"rootClasses\"\n            role=\"status\"\n            aria-live=\"polite\">\n            <div\n                :class=\"overlayClasses\"\n                :tabindex=\"-1\"\n                @click=\"clickedOutside\" />\n\n            <slot :close=\"close\">\n                <o-icon\n                    :icon=\"icon\"\n                    :spin=\"iconSpin\"\n                    :size=\"iconSize\"\n                    :pack=\"iconPack\"\n                    :class=\"iconClasses\" />\n                <span v-if=\"label\" :class=\"labelClasses\">\n                    {{ label }}\n                </span>\n            </slot>\n        </div>\n    </transition>\n</template>\n","<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport type { ClassBinding } from \"@/types\";\n\nimport OIcon from \"@/components/icon/Icon.vue\";\n\ndefineProps({\n    label: { type: String, required: true },\n    icon: { type: String, required: true },\n    size: { type: String, default: undefined },\n    pack: { type: String, default: undefined },\n    classes: { type: Array as PropType<ClassBinding[]>, required: true },\n});\n</script>\n\n<template>\n    <button\n        type=\"button\"\n        :class=\"classes\"\n        :aria-label=\"label\"\n        data-oruga=\"close\">\n        <slot>\n            <o-icon :pack=\"pack\" :icon=\"icon\" :size=\"size\" />\n        </slot>\n    </button>\n</template>\n","<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\nimport type { ClassBinding } from \"@/types\";\n\nimport OIcon from \"@/components/icon/Icon.vue\";\n\ndefineProps({\n    label: { type: String, required: true },\n    icon: { type: String, required: true },\n    size: { type: String, default: undefined },\n    pack: { type: String, default: undefined },\n    classes: { type: Array as PropType<ClassBinding[]>, required: true },\n});\n</script>\n\n<template>\n    <button\n        type=\"button\"\n        :class=\"classes\"\n        :aria-label=\"label\"\n        data-oruga=\"close\">\n        <slot>\n            <o-icon :pack=\"pack\" :icon=\"icon\" :size=\"size\" />\n        </slot>\n    </button>\n</template>\n","<script setup lang=\"ts\" generic=\"C extends Component\">\nimport {\n    computed,\n    nextTick,\n    onMounted,\n    useId,\n    useTemplateRef,\n    watch,\n    type Component,\n} from \"vue\";\n\nimport OLoading from \"@/components/loading/Loading.vue\";\nimport OButton from \"@/components/button/Button.vue\";\nimport CloseButton from \"@/components/utils/CloseButton.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { toCssDimension } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    getTeleportDefault,\n    unrefElement,\n    useMatchMedia,\n    usePreventScrolling,\n} from \"@/composables\";\n\nimport type { DialogProps } from \"./props\";\n\n/**\n * Dialog is a container to display content in an overlay window.\n * @displayName Dialog\n * @style _dialog.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ODialog\",\n    configField: \"dialog\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<DialogProps<C>>(), {\n    override: undefined,\n    active: false,\n    fullscreen: false,\n    animation: () => getDefault(\"dialog.animation\", \"zoom-out\"),\n    backdrop: () => getDefault(\"dialog.backdrop\", true),\n    maxWidth: () => getDefault(\"dialog.maxWidth\", \"80vw\"),\n    maxHeight: () => getDefault(\"dialog.maxHeight\", \"80vh\"),\n    closeable: () => getDefault(\"dialog.closeable\", false),\n    closeOnBackdrop: () => getDefault(\"dialog.closeOnBackdrop\", true),\n    closeOnEscape: () => getDefault(\"dialog.closeOnEscape\", true),\n    closeOnConfirm: () => getDefault(\"dialog.closeOnConfirm\", false),\n    blockScroll: () => getDefault(\"dialog.blockScroll\", true),\n    textPosition: undefined,\n    title: undefined,\n    subtitle: undefined,\n    content: undefined,\n    imageSrc: undefined,\n    imageAlt: undefined,\n    component: undefined,\n    props: undefined,\n    events: undefined,\n    loading: undefined,\n    loadingLabel: undefined,\n    iconPack: () => getDefault(\"dialog.iconPack\"),\n    closeIcon: () => getDefault(\"dialog.closeIcon\", \"close\"),\n    closeIconSize: () => getDefault(\"dialog.closeIconSize\"),\n    ariaCloseLabel: () => getDefault(\"dialog.ariaCloseLabel\", \"Close\"),\n    confirmButton: undefined,\n    confirmVariant: undefined,\n    disableConfirm: undefined,\n    cancelButton: undefined,\n    cancelVariant: undefined,\n    disableCancel: undefined,\n    buttonPosition: undefined,\n    mobileBreakpoint: () => getDefault(\"dialog.mobileBreakpoint\"),\n    teleport: () => getDefault(\"dialog.teleport\", false),\n    ariaLabel: undefined,\n    ariaDescribedby: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * the event is fired when the dialog has been closed\n     * @param event {Event} - native event\n     * @param value {String | undefined} - an optional return value\n     */\n    close: [event: Event, value?: string];\n    /**\n     * the event is fired when the user wish to dismiss the current open dialog\n     * @param event {Event} - native event\n     * @param value {String | undefined} - an optional return value\n     */\n    cancel: [event: Event, value?: string];\n    /**\n     * the event is fired when the confirm button get clicked\n     */\n    confirm: [];\n}>();\n\ndefineSlots<{\n    /**\n     * Override the header\n     * @param close {(returnValue?: string): void} - function to emit a `close` event\n     * @param confirm {(): void} - function to emit a `confirm` event\n     */\n    header?(props: {\n        close: (returnValue?: string) => void;\n        confirm: () => void;\n    }): void;\n    /** Override the header title, default is title prop */\n    title?(): void;\n    /** Override the header subtitle, default is subtitle prop */\n    subtitle?(): void;\n    /** Define a custom close icon */\n    close?(): void;\n    /** Override the image element */\n    image?(): void;\n    /**\n     * Override the default dialog body\n     * @param close {(returnValue?: string): void} - function to emit a `close` event\n     * @param confirm {(): void} - function to emit a `confirm` event\n     */\n    default?(props: {\n        close: (returnValue?: string) => void;\n        confirm: () => void;\n    }): void;\n    /**\n     * Override the body content, default is content prop\n     * @param close {(returnValue?: string): void} - function to emit a `close` event\n     * @param confirm {(): void} - function to emit a `confirm` event\n     */\n    content?(props: {\n        close: (returnValue?: string) => void;\n        confirm: () => void;\n    }): void;\n    /**\n     * Override the footer\n     * @param close {(returnValue?: string): void} - function to emit a `close` event\n     * @param confirm {(): void} - function to emit a `confirm` event\n     */\n    footer?(props: {\n        close: (returnValue?: string) => void;\n        confirm: () => void;\n    }): void;\n    /** Define the cancel button label */\n    cancelButton?(): void;\n    /** Define the confirm button label */\n    confirmButton?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nconst cancelButtonRef = useTemplateRef(\"cancelButton\");\nconst confirmButtonRef = useTemplateRef(\"confirmButton\");\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst titleId = useId();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst _teleport = computed(() =>\n    typeof props.teleport === \"boolean\"\n        ? { to: getTeleportDefault(), disabled: !props.teleport }\n        : { to: props.teleport, disabled: false },\n);\n\nconst wrapperStyle = computed(() => ({\n    maxWidth: !props.fullscreen ? toCssDimension(props.maxWidth) : undefined,\n    maxHeight: !props.fullscreen ? toCssDimension(props.maxHeight) : undefined,\n}));\n\nconst hasBackdrop = computed(\n    () => props.backdrop || props.alert || rootRef.value?.ariaModal,\n);\n\n/**\n * Specifies the types of user actions that can be used to close the dialog.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby\n */\nconst closedBy = computed(() => {\n    // The dialog can be dismissed when the user clicks or taps outside it,\n    // and with a platform-specific user action or a developer-specified mechanism.\n    if (\n        hasBackdrop.value &&\n        props.closeOnBackdrop &&\n        !props.alert &&\n        !props.fullscreen\n    )\n        return \"any\";\n    // The dialog can be dismissed with a platform-specific user action or a developer-specified mechanism.\n    else if (props.closeOnEscape) return \"closerequest\";\n    // The dialog can only be dismissed with a developer-specified mechanism.\n    else return \"none\";\n});\n\n// #region --- Scroll Feature ---\n\nconst toggleScroll = usePreventScrolling(props.blockScroll);\n\nwatch(\n    isActive,\n    (value) => {\n        if (hasBackdrop.value) toggleScroll(value);\n    },\n    { immediate: true },\n);\n\n// #endregion --- Scroll Feature ---\n\n// #region --- Focus Feature ---\n\nfunction focusCancelButton(): void {\n    nextTick(() => unrefElement(cancelButtonRef)?.focus());\n}\n\nfunction focusConfirmButton(): void {\n    nextTick(() => unrefElement(confirmButtonRef)?.focus());\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Trigger Handler ---\n\nonMounted(() => toggleDialog(isActive.value));\n\nwatch(isActive, toggleDialog);\n\n/** show or close the dialog element */\nfunction toggleDialog(value: boolean): void {\n    if (!rootRef.value) return;\n\n    if (value) {\n        // reset the return value on each open\n        rootRef.value.returnValue = \"\";\n\n        // trigger dialog show as modal with backdrop event\n        if (hasBackdrop.value) rootRef.value.showModal();\n        // trigger dialog show without backdrop event\n        else rootRef.value.show();\n    } else if (rootRef.value?.open) {\n        // trigger dialog close event\n        rootRef.value.close();\n    }\n}\n\n/** request the dialog to close when active */\nfunction close(returnValue?: string): void {\n    if (!isActive.value || !rootRef.value) return;\n\n    // trigger dialog close event\n    if (typeof rootRef.value.requestClose === \"function\")\n        // requestClose is a fairly new web API that is not yet supported in all environments\n        rootRef.value.requestClose(returnValue);\n    else rootRef.value.close(returnValue);\n}\n\n/** emit a confirm event when active */\nfunction confirm(): void {\n    if (!isActive.value || !rootRef.value) return;\n\n    emits(\"confirm\");\n    if (props.closeOnConfirm) rootRef.value.close(\"confirm\");\n}\n\n/** native dialog close event */\nfunction onClose(event: Event): void {\n    isActive.value = false;\n    const returnValue = rootRef.value?.returnValue;\n    emits(\"close\", event, returnValue);\n}\n\n/** native dialog cancel event */\nfunction onCancel(event: Event): void {\n    const returnValue = rootRef.value?.returnValue;\n    emits(\"cancel\", event, returnValue);\n}\n\n// #endregion --- Trigger Handler ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-dialog\"],\n    [\"mobileClass\", \"o-dialog--mobile\", null, isMobile],\n    [\"activeClass\", \"o-dialog--active\", null, isActive],\n    [\n        \"fullscreenClass\",\n        \"o-dialog--fullscreen\",\n        null,\n        computed(() => props.fullscreen),\n    ],\n    [\n        \"teleportClass\",\n        \"o-dialog--teleport\",\n        null,\n        computed(() => !!props.teleport),\n    ],\n);\n\nconst backdropClasses = defineClasses([\"backdropClass\", \"o-dialog__backdrop\"]);\n\nconst wrapperClasses = defineClasses(\n    [\"wrapperClass\", \"o-dialog__wrapper\"],\n    [\n        \"textPositionClass\",\n        \"o-dialog__wrapper--\",\n        computed(() => props.textPosition),\n        computed(() => !!props.textPosition),\n    ],\n);\n\nconst headerClasses = defineClasses([\"headerClass\", \"o-dialog__header\"]);\n\nconst titleClasses = defineClasses([\"titleClass\", \"o-dialog__header-title\"]);\n\nconst subtitleClasses = defineClasses([\n    \"subtitleClass\",\n    \"o-dialog__header-subtitle\",\n]);\n\nconst closeClasses = defineClasses([\"closeClass\", \"o-dialog__close\"]);\n\nconst imageClasses = defineClasses([\"imageClass\", \"o-dialog__image\"]);\n\nconst figureClasses = defineClasses([\"figureClass\", \"o-dialog__image-figure\"]);\n\nconst bodyClasses = defineClasses([\"bodyClass\", \"o-dialog__body\"]);\n\nconst contentClasses = defineClasses([\n    \"contentClass\",\n    \"o-dialog__body-content\",\n]);\n\nconst footerClasses = defineClasses(\n    [\"footerClass\", \"o-dialog__footer\"],\n    [\n        \"footerPositionClass\",\n        \"o-dialog__footer--\",\n        computed(() => props.buttonPosition),\n        computed(() => !!props.buttonPosition),\n    ],\n);\n\nconst confirmButtonClasses = defineClasses([\n    \"confirmButtonClass\",\n    \"o-dialog__confirm-button\",\n]);\n\nconst cancelButtonClasses = defineClasses([\n    \"cancelButtonClass\",\n    \"o-dialog__cancel-button\",\n]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close, confirm });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <Teleport :to=\"_teleport.to\" :disabled=\"_teleport.disabled\">\n        <transition :name=\"animation\">\n            <!-- eslint-disable-next-line vue/require-toggle-inside-transition -->\n            <dialog\n                ref=\"rootElement\"\n                v-bind=\"$attrs\"\n                data-oruga=\"dialog\"\n                :class=\"rootClasses\"\n                :role=\"alert ? 'alertdialog' : 'dialog'\"\n                :closedBy=\"closedBy\"\n                :aria-label=\"ariaLabel\"\n                :aria-describedby=\"title ? titleId : ariaDescribedby\"\n                @close=\"onClose\"\n                @cancel=\"onCancel\">\n                <!-- Backdrop -->\n                <div\n                    v-if=\"backdrop && backdropClasses.length\"\n                    :class=\"backdropClasses\" />\n\n                <div :class=\"wrapperClasses\" :style=\"wrapperStyle\">\n                    <!-- Header -->\n                    <header\n                        v-if=\"\n                            $slots['header'] ||\n                            $slots['title'] ||\n                            $slots['subtitle'] ||\n                            title ||\n                            subtitle ||\n                            closeable\n                        \"\n                        :class=\"headerClasses\">\n                        <slot name=\"header\" :close=\"close\" :confirm=\"confirm\">\n                            <h1\n                                v-if=\"$slots['title'] || title\"\n                                :id=\"titleId\"\n                                :class=\"titleClasses\">\n                                <slot name=\"title\"> {{ title }} </slot>\n                            </h1>\n\n                            <h2\n                                v-if=\"$slots['subtitle'] || subtitle\"\n                                :class=\"subtitleClasses\">\n                                <slot name=\"subtitle\"> {{ subtitle }} </slot>\n                            </h2>\n                        </slot>\n\n                        <CloseButton\n                            v-if=\"closeable\"\n                            :pack=\"iconPack\"\n                            :icon=\"closeIcon\"\n                            :size=\"closeIconSize\"\n                            :label=\"ariaCloseLabel\"\n                            :classes=\"closeClasses\"\n                            @click=\"close\">\n                            <slot v-if=\"$slots['close']\" name=\"close\" />\n                        </CloseButton>\n                    </header>\n\n                    <!-- Body -->\n                    <div\n                        v-if=\"\n                            $slots['default'] ||\n                            $slots['content'] ||\n                            $props.component ||\n                            content\n                        \"\n                        :class=\"bodyClasses\">\n                        <!-- Image -->\n                        <slot name=\"image\">\n                            <figure v-if=\"imageSrc\" :class=\"figureClasses\">\n                                <img\n                                    :src=\"imageSrc\"\n                                    :alt=\"imageAlt\"\n                                    :class=\"imageClasses\" />\n                            </figure>\n                        </slot>\n\n                        <!-- Main Content -->\n                        <slot :close=\"close\" :confirm=\"confirm\">\n                            <!-- injected component for programmatic usage -->\n                            <component\n                                :is=\"$props.component\"\n                                v-if=\"$props.component\"\n                                v-bind=\"$props.props\"\n                                v-on=\"$props.events || {}\"\n                                @close=\"close\" />\n\n                            <p v-else :class=\"contentClasses\">\n                                <slot\n                                    name=\"content\"\n                                    :close=\"close\"\n                                    :confirm=\"confirm\">\n                                    {{ content }}\n                                </slot>\n                            </p>\n                        </slot>\n                    </div>\n\n                    <!-- Loading -->\n                    <o-loading\n                        :active=\"loading\"\n                        :full-page=\"false\"\n                        :label=\"loadingLabel\"\n                        :icon-pack=\"iconPack\" />\n\n                    <!-- Footer -->\n                    <footer\n                        v-if=\"$slots['footer'] || cancelButton || confirmButton\"\n                        :class=\"footerClasses\">\n                        <slot name=\"footer\" :close=\"close\" :confirm=\"confirm\">\n                            <OButton\n                                v-if=\"cancelButton || $slots['cancelButton']\"\n                                ref=\"cancelButton\"\n                                :class=\"cancelButtonClasses\"\n                                :label=\"cancelButton\"\n                                :variant=\"cancelVariant\"\n                                :disabled=\"disableCancel\"\n                                autofocus\n                                @click=\"close('cancel')\"\n                                @keyup.right=\"focusConfirmButton\">\n                                <slot name=\"cancelButton\">\n                                    {{ cancelButton }}\n                                </slot>\n                            </OButton>\n\n                            <OButton\n                                v-if=\"confirmButton || $slots['confirmButton']\"\n                                ref=\"confirmButton\"\n                                :class=\"confirmButtonClasses\"\n                                :label=\"confirmButton\"\n                                :variant=\"confirmVariant\"\n                                :disabled=\"disableConfirm\"\n                                :loading=\"loading\"\n                                autofocus\n                                @click=\"confirm\"\n                                @keyup.left=\"focusCancelButton\">\n                                <slot name=\"confirmButton\">\n                                    {{ confirmButton }}\n                                </slot>\n                            </OButton>\n                        </slot>\n                    </footer>\n                </div>\n            </dialog>\n        </transition>\n    </Teleport>\n</template>\n","<script setup lang=\"ts\" generic=\"C extends Component\">\nimport {\n    computed,\n    nextTick,\n    onMounted,\n    useId,\n    useTemplateRef,\n    watch,\n    type Component,\n} from \"vue\";\n\nimport OLoading from \"@/components/loading/Loading.vue\";\nimport OButton from \"@/components/button/Button.vue\";\nimport CloseButton from \"@/components/utils/CloseButton.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { toCssDimension } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    getTeleportDefault,\n    unrefElement,\n    useMatchMedia,\n    usePreventScrolling,\n} from \"@/composables\";\n\nimport type { DialogProps } from \"./props\";\n\n/**\n * Dialog is a container to display content in an overlay window.\n * @displayName Dialog\n * @style _dialog.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ODialog\",\n    configField: \"dialog\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<DialogProps<C>>(), {\n    override: undefined,\n    active: false,\n    fullscreen: false,\n    animation: () => getDefault(\"dialog.animation\", \"zoom-out\"),\n    backdrop: () => getDefault(\"dialog.backdrop\", true),\n    maxWidth: () => getDefault(\"dialog.maxWidth\", \"80vw\"),\n    maxHeight: () => getDefault(\"dialog.maxHeight\", \"80vh\"),\n    closeable: () => getDefault(\"dialog.closeable\", false),\n    closeOnBackdrop: () => getDefault(\"dialog.closeOnBackdrop\", true),\n    closeOnEscape: () => getDefault(\"dialog.closeOnEscape\", true),\n    closeOnConfirm: () => getDefault(\"dialog.closeOnConfirm\", false),\n    blockScroll: () => getDefault(\"dialog.blockScroll\", true),\n    textPosition: undefined,\n    title: undefined,\n    subtitle: undefined,\n    content: undefined,\n    imageSrc: undefined,\n    imageAlt: undefined,\n    component: undefined,\n    props: undefined,\n    events: undefined,\n    loading: undefined,\n    loadingLabel: undefined,\n    iconPack: () => getDefault(\"dialog.iconPack\"),\n    closeIcon: () => getDefault(\"dialog.closeIcon\", \"close\"),\n    closeIconSize: () => getDefault(\"dialog.closeIconSize\"),\n    ariaCloseLabel: () => getDefault(\"dialog.ariaCloseLabel\", \"Close\"),\n    confirmButton: undefined,\n    confirmVariant: undefined,\n    disableConfirm: undefined,\n    cancelButton: undefined,\n    cancelVariant: undefined,\n    disableCancel: undefined,\n    buttonPosition: undefined,\n    mobileBreakpoint: () => getDefault(\"dialog.mobileBreakpoint\"),\n    teleport: () => getDefault(\"dialog.teleport\", false),\n    ariaLabel: undefined,\n    ariaDescribedby: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * the event is fired when the dialog has been closed\n     * @param event {Event} - native event\n     * @param value {String | undefined} - an optional return value\n     */\n    close: [event: Event, value?: string];\n    /**\n     * the event is fired when the user wish to dismiss the current open dialog\n     * @param event {Event} - native event\n     * @param value {String | undefined} - an optional return value\n     */\n    cancel: [event: Event, value?: string];\n    /**\n     * the event is fired when the confirm button get clicked\n     */\n    confirm: [];\n}>();\n\ndefineSlots<{\n    /**\n     * Override the header\n     * @param close {(returnValue?: string): void} - function to emit a `close` event\n     * @param confirm {(): void} - function to emit a `confirm` event\n     */\n    header?(props: {\n        close: (returnValue?: string) => void;\n        confirm: () => void;\n    }): void;\n    /** Override the header title, default is title prop */\n    title?(): void;\n    /** Override the header subtitle, default is subtitle prop */\n    subtitle?(): void;\n    /** Define a custom close icon */\n    close?(): void;\n    /** Override the image element */\n    image?(): void;\n    /**\n     * Override the default dialog body\n     * @param close {(returnValue?: string): void} - function to emit a `close` event\n     * @param confirm {(): void} - function to emit a `confirm` event\n     */\n    default?(props: {\n        close: (returnValue?: string) => void;\n        confirm: () => void;\n    }): void;\n    /**\n     * Override the body content, default is content prop\n     * @param close {(returnValue?: string): void} - function to emit a `close` event\n     * @param confirm {(): void} - function to emit a `confirm` event\n     */\n    content?(props: {\n        close: (returnValue?: string) => void;\n        confirm: () => void;\n    }): void;\n    /**\n     * Override the footer\n     * @param close {(returnValue?: string): void} - function to emit a `close` event\n     * @param confirm {(): void} - function to emit a `confirm` event\n     */\n    footer?(props: {\n        close: (returnValue?: string) => void;\n        confirm: () => void;\n    }): void;\n    /** Define the cancel button label */\n    cancelButton?(): void;\n    /** Define the confirm button label */\n    confirmButton?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nconst cancelButtonRef = useTemplateRef(\"cancelButton\");\nconst confirmButtonRef = useTemplateRef(\"confirmButton\");\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst titleId = useId();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst _teleport = computed(() =>\n    typeof props.teleport === \"boolean\"\n        ? { to: getTeleportDefault(), disabled: !props.teleport }\n        : { to: props.teleport, disabled: false },\n);\n\nconst wrapperStyle = computed(() => ({\n    maxWidth: !props.fullscreen ? toCssDimension(props.maxWidth) : undefined,\n    maxHeight: !props.fullscreen ? toCssDimension(props.maxHeight) : undefined,\n}));\n\nconst hasBackdrop = computed(\n    () => props.backdrop || props.alert || rootRef.value?.ariaModal,\n);\n\n/**\n * Specifies the types of user actions that can be used to close the dialog.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dialog#closedby\n */\nconst closedBy = computed(() => {\n    // The dialog can be dismissed when the user clicks or taps outside it,\n    // and with a platform-specific user action or a developer-specified mechanism.\n    if (\n        hasBackdrop.value &&\n        props.closeOnBackdrop &&\n        !props.alert &&\n        !props.fullscreen\n    )\n        return \"any\";\n    // The dialog can be dismissed with a platform-specific user action or a developer-specified mechanism.\n    else if (props.closeOnEscape) return \"closerequest\";\n    // The dialog can only be dismissed with a developer-specified mechanism.\n    else return \"none\";\n});\n\n// #region --- Scroll Feature ---\n\nconst toggleScroll = usePreventScrolling(props.blockScroll);\n\nwatch(\n    isActive,\n    (value) => {\n        if (hasBackdrop.value) toggleScroll(value);\n    },\n    { immediate: true },\n);\n\n// #endregion --- Scroll Feature ---\n\n// #region --- Focus Feature ---\n\nfunction focusCancelButton(): void {\n    nextTick(() => unrefElement(cancelButtonRef)?.focus());\n}\n\nfunction focusConfirmButton(): void {\n    nextTick(() => unrefElement(confirmButtonRef)?.focus());\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Trigger Handler ---\n\nonMounted(() => toggleDialog(isActive.value));\n\nwatch(isActive, toggleDialog);\n\n/** show or close the dialog element */\nfunction toggleDialog(value: boolean): void {\n    if (!rootRef.value) return;\n\n    if (value) {\n        // reset the return value on each open\n        rootRef.value.returnValue = \"\";\n\n        // trigger dialog show as modal with backdrop event\n        if (hasBackdrop.value) rootRef.value.showModal();\n        // trigger dialog show without backdrop event\n        else rootRef.value.show();\n    } else if (rootRef.value?.open) {\n        // trigger dialog close event\n        rootRef.value.close();\n    }\n}\n\n/** request the dialog to close when active */\nfunction close(returnValue?: string): void {\n    if (!isActive.value || !rootRef.value) return;\n\n    // trigger dialog close event\n    if (typeof rootRef.value.requestClose === \"function\")\n        // requestClose is a fairly new web API that is not yet supported in all environments\n        rootRef.value.requestClose(returnValue);\n    else rootRef.value.close(returnValue);\n}\n\n/** emit a confirm event when active */\nfunction confirm(): void {\n    if (!isActive.value || !rootRef.value) return;\n\n    emits(\"confirm\");\n    if (props.closeOnConfirm) rootRef.value.close(\"confirm\");\n}\n\n/** native dialog close event */\nfunction onClose(event: Event): void {\n    isActive.value = false;\n    const returnValue = rootRef.value?.returnValue;\n    emits(\"close\", event, returnValue);\n}\n\n/** native dialog cancel event */\nfunction onCancel(event: Event): void {\n    const returnValue = rootRef.value?.returnValue;\n    emits(\"cancel\", event, returnValue);\n}\n\n// #endregion --- Trigger Handler ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-dialog\"],\n    [\"mobileClass\", \"o-dialog--mobile\", null, isMobile],\n    [\"activeClass\", \"o-dialog--active\", null, isActive],\n    [\n        \"fullscreenClass\",\n        \"o-dialog--fullscreen\",\n        null,\n        computed(() => props.fullscreen),\n    ],\n    [\n        \"teleportClass\",\n        \"o-dialog--teleport\",\n        null,\n        computed(() => !!props.teleport),\n    ],\n);\n\nconst backdropClasses = defineClasses([\"backdropClass\", \"o-dialog__backdrop\"]);\n\nconst wrapperClasses = defineClasses(\n    [\"wrapperClass\", \"o-dialog__wrapper\"],\n    [\n        \"textPositionClass\",\n        \"o-dialog__wrapper--\",\n        computed(() => props.textPosition),\n        computed(() => !!props.textPosition),\n    ],\n);\n\nconst headerClasses = defineClasses([\"headerClass\", \"o-dialog__header\"]);\n\nconst titleClasses = defineClasses([\"titleClass\", \"o-dialog__header-title\"]);\n\nconst subtitleClasses = defineClasses([\n    \"subtitleClass\",\n    \"o-dialog__header-subtitle\",\n]);\n\nconst closeClasses = defineClasses([\"closeClass\", \"o-dialog__close\"]);\n\nconst imageClasses = defineClasses([\"imageClass\", \"o-dialog__image\"]);\n\nconst figureClasses = defineClasses([\"figureClass\", \"o-dialog__image-figure\"]);\n\nconst bodyClasses = defineClasses([\"bodyClass\", \"o-dialog__body\"]);\n\nconst contentClasses = defineClasses([\n    \"contentClass\",\n    \"o-dialog__body-content\",\n]);\n\nconst footerClasses = defineClasses(\n    [\"footerClass\", \"o-dialog__footer\"],\n    [\n        \"footerPositionClass\",\n        \"o-dialog__footer--\",\n        computed(() => props.buttonPosition),\n        computed(() => !!props.buttonPosition),\n    ],\n);\n\nconst confirmButtonClasses = defineClasses([\n    \"confirmButtonClass\",\n    \"o-dialog__confirm-button\",\n]);\n\nconst cancelButtonClasses = defineClasses([\n    \"cancelButtonClass\",\n    \"o-dialog__cancel-button\",\n]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close, confirm });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <Teleport :to=\"_teleport.to\" :disabled=\"_teleport.disabled\">\n        <transition :name=\"animation\">\n            <!-- eslint-disable-next-line vue/require-toggle-inside-transition -->\n            <dialog\n                ref=\"rootElement\"\n                v-bind=\"$attrs\"\n                data-oruga=\"dialog\"\n                :class=\"rootClasses\"\n                :role=\"alert ? 'alertdialog' : 'dialog'\"\n                :closedBy=\"closedBy\"\n                :aria-label=\"ariaLabel\"\n                :aria-describedby=\"title ? titleId : ariaDescribedby\"\n                @close=\"onClose\"\n                @cancel=\"onCancel\">\n                <!-- Backdrop -->\n                <div\n                    v-if=\"backdrop && backdropClasses.length\"\n                    :class=\"backdropClasses\" />\n\n                <div :class=\"wrapperClasses\" :style=\"wrapperStyle\">\n                    <!-- Header -->\n                    <header\n                        v-if=\"\n                            $slots['header'] ||\n                            $slots['title'] ||\n                            $slots['subtitle'] ||\n                            title ||\n                            subtitle ||\n                            closeable\n                        \"\n                        :class=\"headerClasses\">\n                        <slot name=\"header\" :close=\"close\" :confirm=\"confirm\">\n                            <h1\n                                v-if=\"$slots['title'] || title\"\n                                :id=\"titleId\"\n                                :class=\"titleClasses\">\n                                <slot name=\"title\"> {{ title }} </slot>\n                            </h1>\n\n                            <h2\n                                v-if=\"$slots['subtitle'] || subtitle\"\n                                :class=\"subtitleClasses\">\n                                <slot name=\"subtitle\"> {{ subtitle }} </slot>\n                            </h2>\n                        </slot>\n\n                        <CloseButton\n                            v-if=\"closeable\"\n                            :pack=\"iconPack\"\n                            :icon=\"closeIcon\"\n                            :size=\"closeIconSize\"\n                            :label=\"ariaCloseLabel\"\n                            :classes=\"closeClasses\"\n                            @click=\"close\">\n                            <slot v-if=\"$slots['close']\" name=\"close\" />\n                        </CloseButton>\n                    </header>\n\n                    <!-- Body -->\n                    <div\n                        v-if=\"\n                            $slots['default'] ||\n                            $slots['content'] ||\n                            $props.component ||\n                            content\n                        \"\n                        :class=\"bodyClasses\">\n                        <!-- Image -->\n                        <slot name=\"image\">\n                            <figure v-if=\"imageSrc\" :class=\"figureClasses\">\n                                <img\n                                    :src=\"imageSrc\"\n                                    :alt=\"imageAlt\"\n                                    :class=\"imageClasses\" />\n                            </figure>\n                        </slot>\n\n                        <!-- Main Content -->\n                        <slot :close=\"close\" :confirm=\"confirm\">\n                            <!-- injected component for programmatic usage -->\n                            <component\n                                :is=\"$props.component\"\n                                v-if=\"$props.component\"\n                                v-bind=\"$props.props\"\n                                v-on=\"$props.events || {}\"\n                                @close=\"close\" />\n\n                            <p v-else :class=\"contentClasses\">\n                                <slot\n                                    name=\"content\"\n                                    :close=\"close\"\n                                    :confirm=\"confirm\">\n                                    {{ content }}\n                                </slot>\n                            </p>\n                        </slot>\n                    </div>\n\n                    <!-- Loading -->\n                    <o-loading\n                        :active=\"loading\"\n                        :full-page=\"false\"\n                        :label=\"loadingLabel\"\n                        :icon-pack=\"iconPack\" />\n\n                    <!-- Footer -->\n                    <footer\n                        v-if=\"$slots['footer'] || cancelButton || confirmButton\"\n                        :class=\"footerClasses\">\n                        <slot name=\"footer\" :close=\"close\" :confirm=\"confirm\">\n                            <OButton\n                                v-if=\"cancelButton || $slots['cancelButton']\"\n                                ref=\"cancelButton\"\n                                :class=\"cancelButtonClasses\"\n                                :label=\"cancelButton\"\n                                :variant=\"cancelVariant\"\n                                :disabled=\"disableCancel\"\n                                autofocus\n                                @click=\"close('cancel')\"\n                                @keyup.right=\"focusConfirmButton\">\n                                <slot name=\"cancelButton\">\n                                    {{ cancelButton }}\n                                </slot>\n                            </OButton>\n\n                            <OButton\n                                v-if=\"confirmButton || $slots['confirmButton']\"\n                                ref=\"confirmButton\"\n                                :class=\"confirmButtonClasses\"\n                                :label=\"confirmButton\"\n                                :variant=\"confirmVariant\"\n                                :disabled=\"disableConfirm\"\n                                :loading=\"loading\"\n                                autofocus\n                                @click=\"confirm\"\n                                @keyup.left=\"focusCancelButton\">\n                                <slot name=\"confirmButton\">\n                                    {{ confirmButton }}\n                                </slot>\n                            </OButton>\n                        </slot>\n                    </footer>\n                </div>\n            </dialog>\n        </transition>\n    </Teleport>\n</template>\n","import type { ComponentInternalInstance } from \"vue\";\n\nexport default class InstanceRegistry<T = ComponentInternalInstance> {\n    private entries: Array<T>;\n    private counter: number;\n\n    constructor() {\n        this.entries = [];\n        this.counter = 0;\n    }\n\n    /** Returns the number of registered active instances. */\n    count(): number {\n        return this.entries.length;\n    }\n\n    /** Returns the total number of instances that have ever been created. */\n    getCounter(): number {\n        return this.counter;\n    }\n\n    /** Returns the first registered active instance. */\n    fist(): T | undefined {\n        return this.entries.length ? this.entries[0] : undefined;\n    }\n\n    /** Returns the last registered active instance. */\n    last(): T | undefined {\n        return this.entries.length\n            ? this.entries[this.entries.length - 1]\n            : undefined;\n    }\n\n    /** Adds a new instance to the instance stack. */\n    add(entry: T): void {\n        this.entries.push(entry);\n        this.counter++;\n    }\n\n    /** Removes an instance from the instance stack. */\n    remove(entry: T): void {\n        const index = this.entries.indexOf(entry);\n        this.entries.splice(index, 1);\n    }\n\n    /** Call a function for every registered active instance. */\n    walk(callback: (value: T) => boolean | void): void {\n        // Walk a copy of the array so that the callback is allowed to remove the instance\n        this.entries = [...this.entries].filter((e) => {\n            const ret = callback(e);\n            return ret !== true;\n        });\n    }\n}\n","import {\n    createVNode,\n    defineComponent,\n    getCurrentInstance,\n    onMounted,\n    onUnmounted,\n    type ComponentInternalInstance,\n    type VNode,\n    type VNodeTypes,\n} from \"vue\";\nimport type { ComponentProps } from \"vue-component-type-helpers\";\nimport type InstanceRegistry from \"@/components/programmatic/InstanceRegistry\";\nimport { isClient } from \"@/utils/ssr\";\n\nexport type ProgrammaticComponentProps<C extends VNodeTypes> = {\n    /**\n     * Component to be injected.\n     * Terminate the component by emitting a 'close' event — emits('close')\n     */\n    component: C;\n    /**\n     * Props to be binded to the injected component.\n     * Both attributes and properties can be used in props.\n     * Vue automatically picks the right way to assign it.\n     * `class` and `style` have the same object / array value support like in templates.\n     * Event listeners should be passed as onXxx.\n     * @see https://vuejs.org/api/render-function.html#h\n     */\n    props?: ComponentProps<C> | { container?: HTMLElement };\n    /** Programmatic component registry instance. */\n    registry?: InstanceRegistry<ComponentInternalInstance>;\n};\n\nexport type CloseEventArgs<T extends VNodeTypes> =\n    NonNullable<ComponentProps<T>[\"onClose\"]> extends (...args: any[]) => any\n        ? Parameters<ComponentProps<T>[\"onClose\"]>\n        : never[];\n\n/** The ProgrammaticComponent close funtion definition. */\ntype CloseFunction<C extends VNodeTypes> = (\n    ...args: CloseEventArgs<C> | unknown[]\n) => void;\n\nexport type ProgrammaticComponentEmits<C extends VNodeTypes> = {\n    /**\n     * On component close event.\n     * This get called when the component emits `close` or the exposed `close` function get called.\n     */\n    close?: CloseFunction<C>;\n    /** On component destroy event which get called when the component should be destroyed. */\n    destroy?: () => void;\n};\n\n// there is a bug with functional defineComponent and extracting the exposed type\n// export type ProgrammaticComponentExpose = ComponentExposed<\n//     typeof ProgrammaticComponent\n// >;\n\nexport type ProgrammaticComponentExpose<C extends VNodeTypes> = {\n    /** Call the close event of the component. */\n    close: CloseFunction<C>;\n    /** Promise which get resolved on the close event. */\n    promise: Promise<Parameters<CloseFunction<C>>>;\n};\n\nexport const ProgrammaticComponent = defineComponent<\n    ProgrammaticComponentProps<VNodeTypes>,\n    ProgrammaticComponentEmits<VNodeTypes>\n>(\n    <C extends VNodeTypes>(\n        props: ProgrammaticComponentProps<C>,\n        { expose, emit, slots },\n    ) => {\n        // getting a hold of the internal instance in setup()\n        const vm = getCurrentInstance();\n        if (!vm)\n            throw new Error(\"ProgrammaticComponent initialisation failed.\");\n\n        // create response promise\n        let resolve: (args: Parameters<CloseFunction<C>>) => void;\n        const promise = new Promise<Parameters<CloseFunction<C>>>(\n            (p1) => (resolve = p1),\n        );\n\n        // add component instance to instance register\n        onMounted(() => props.registry?.add(vm));\n\n        // remove component instance from instance register\n        onUnmounted(() => props.registry?.remove(vm));\n\n        const close: CloseFunction<C> = (...args) => {\n            // emit `onClose` event\n            emit(\"close\", ...args);\n\n            // call promise resolve\n            resolve(args);\n\n            // emit `destory` event after animation is finished\n            setTimeout(() => {\n                if (isClient)\n                    window.requestAnimationFrame(() => emit(\"destroy\"));\n                else emit(\"destroy\");\n            });\n        };\n\n        /** expose public functionalities for programmatic usage */\n        expose({ close, promise } satisfies ProgrammaticComponentExpose<C>);\n\n        // return render function which renders given component\n        return (): VNode =>\n            createVNode(\n                props.component,\n                { ...props.props, onClose: close },\n                slots[\"default\"],\n            );\n    },\n    {\n        name: \"ProgrammaticApp\",\n        // manual runtime props declaration is currently still needed.\n        props: [\"component\", \"props\", \"registry\"],\n        // manual runtime emits declaration\n        emits: [\"close\", \"destroy\"],\n        // manual runtime slot declaration\n        slots: [\"default\"],\n    },\n);\n","import {\n    createApp,\n    toValue,\n    type App,\n    type ComponentInternalInstance,\n    type EmitsToProps,\n    type MaybeRefOrGetter,\n    type VNodeTypes,\n} from \"vue\";\n\nimport InstanceRegistry from \"@/components/programmatic/InstanceRegistry\";\nimport { getActiveOruga } from \"@/utils/config\";\nimport { getTeleportDefault, resolveElement } from \"@/composables\";\n\nimport {\n    ProgrammaticComponent,\n    type ProgrammaticComponentProps,\n    type ProgrammaticComponentEmits,\n    type ProgrammaticComponentExpose,\n} from \"./ProgrammaticComponent\";\n\ndeclare module \"../../index\" {\n    interface OrugaProgrammatic {\n        programmatic: Required<\n            InstanceType<typeof ProgrammaticComponentFactory>\n        >;\n    }\n}\n\n/** programmatic component options */\nexport type ProgrammaticOptions<C extends VNodeTypes> = {\n    /**\n     * Specify the template `id` attribute for the programmatic container element.\n     * @default `programmatic-app`\n     */\n    appId?: string;\n    /**\n     * Configure a prefix for all IDs generated via [`useId()`](https://vuejs.org/api/composition-api-helpers.html#useid) inside this programmatic instance.\n     * By default a unique id prefix is generated.\n     * See {@link https://vuejs.org/api/application.html#app-config-idprefix}.\n     */\n    idPrefix?: string;\n} & Omit<ProgrammaticComponentProps<C>, \"component\"> & // component props\n    EmitsToProps<Pick<Required<ProgrammaticComponentEmits<C>>, \"close\">>; // component emit props\n\n/** public options interface for programmatically called components */\nexport type ProgrammaticComponentOptions<C extends VNodeTypes> = EmitsToProps<\n    Pick<Required<ProgrammaticComponentEmits<C>>, \"close\">\n> &\n    // make the type extendable\n    Record<string, any>;\n\n/** programmatic component public interface */\nexport type ProgrammaticExpose<C extends VNodeTypes = VNodeTypes> =\n    ProgrammaticComponentExpose<C>;\n\n/** target container to render the programmatic component into  */\nexport type ProgrammaticTarget = MaybeRefOrGetter<string | HTMLElement | null>;\n\nexport abstract class ProgrammaticFactory {\n    /** programmatic instance registry for the factory instance */\n    private _registry = new InstanceRegistry<ComponentInternalInstance>();\n\n    /** Returns the number of registered active instances. */\n    public count(): number {\n        return this._registry.count();\n    }\n\n    /** Close the last registred instance in the global programmatic instance registry. */\n    public close(...args: unknown[]): void {\n        this._registry.last()?.exposed?.close(...args);\n    }\n\n    /** Close all instances in the global programmatic instance registry. */\n    public closeAll(...args: unknown[]): void {\n        this._registry.walk((entry) => entry.exposed?.close(...args));\n    }\n\n    abstract open(...args: any[]): ProgrammaticExpose;\n\n    /**\n     * Create a new programmatic component instance.\n     * @param component - The component to render.\n     * @param options - Programmatic component render options.\n     * @param target - A target container the component get rendered into - default is `document.body`.\n     * @returns ProgrammaticExpose - programmatic component expose interface\n     */\n    protected _create<C extends VNodeTypes>(\n        component: C,\n        options: ProgrammaticOptions<C>,\n        target?: ProgrammaticTarget,\n    ): ProgrammaticExpose<C> {\n        options = { registry: this._registry, ...options };\n\n        const targetQuery = toValue(target);\n        // define the target container\n        const targetElement: HTMLElement | null =\n            // either by a given query selector / element\n            (targetQuery && resolveElement(targetQuery)) ||\n            // or by the default teleport target config\n            resolveElement(getTeleportDefault());\n        if (!targetElement)\n            throw new Error(\"ComponentProgrammatic - no target is defined.\");\n\n        // create app container\n        let container: HTMLDivElement | undefined =\n            document.createElement(\"div\");\n        // set the HTML #id of the programmatic app\n        container.id = options.appId || \"programmatic-app\";\n\n        // place the app container into the target element\n        targetElement.appendChild(container);\n\n        // clear instance handler\n        function onDestroy(): void {\n            // destroy app/component\n            if (app) {\n                app.unmount();\n                app = undefined;\n            }\n            // clear container\n            if (container && targetElement) {\n                targetElement.removeChild(container);\n                container = undefined;\n            }\n        }\n\n        // create a new vue app instance with the ProgrammaticComponent as root\n        let app: App | undefined = createApp(ProgrammaticComponent, {\n            registry: options.registry, // programmatic registry instance\n            component, // the component which should be rendered\n            props: { ...options.props, container: targetElement }, // component props including the target as `container`\n            onClose: options.onClose, // custom onClose handler\n            onDestroy, // node destory cleanup handler\n        });\n\n        // get the current active oruga instance\n        const orugaConfig = getActiveOruga();\n        // provide the oruga config to the new app instance\n        orugaConfig?.provide(app);\n        // if running inside another app share the current app context to the new app instance\n        if (orugaConfig?._app)\n            app._context = Object.assign(\n                app._context,\n                orugaConfig._app._context,\n            );\n\n        // set a prefix for all IDs generated via useId() to prevent duplication in multiple programmatic instances\n        app.config.idPrefix =\n            options.idPrefix ??\n            \"programmatic-\" + options.registry!.getCounter();\n\n        // render the new vue instance into the container element\n        const instance = app.mount(container);\n\n        // return exposed programmatic functionalities from the mounted component instance\n        return instance as unknown as ProgrammaticExpose<C>;\n    }\n}\n\nexport class ProgrammaticComponentFactory extends ProgrammaticFactory {\n    /**\n     * Create a new programmatic component instance.\n     * @param component - The component to render.\n     * @param options - Programmatic component render options.\n     * @param target - A target container the component get rendered into - default is `document.body`.\n     * @returns ProgrammaticExpose - programmatic component expose interface\n     */\n    public open<C extends VNodeTypes>(\n        component: C,\n        options?: ProgrammaticOptions<C>,\n        target?: ProgrammaticTarget,\n    ): ProgrammaticExpose<C> {\n        return this._create(component, options ?? {}, target);\n    }\n}\n\nexport default function useProgrammaticComponent(): ProgrammaticComponentFactory {\n    return new ProgrammaticComponentFactory();\n}\n","import InstanceRegistry from \"./InstanceRegistry\";\n\nimport useProgrammaticComponent, {\n    ProgrammaticFactory,\n    ProgrammaticComponentFactory,\n} from \"./useProgrammatic\";\n\nimport { registerProgrammatic } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export programmatic specific types */\nexport type {\n    ProgrammaticOptions,\n    ProgrammaticTarget,\n    ProgrammaticExpose,\n    ProgrammaticComponentOptions,\n} from \"./useProgrammatic\";\nexport type { CloseEventArgs } from \"./ProgrammaticComponent\";\n\n/** export programmatic plugin */\nexport default {\n    install(app, { oruga }): void {\n        registerProgrammatic(\n            oruga,\n            \"programmatic\",\n            ProgrammaticComponentFactory,\n        );\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export programmatic classes & composables here */\nexport {\n    InstanceRegistry,\n    ProgrammaticComponentFactory,\n    ProgrammaticFactory,\n    useProgrammaticComponent,\n};\n","import { type Component } from \"vue\";\nimport {\n    ProgrammaticFactory,\n    type ProgrammaticComponentOptions,\n    type ProgrammaticExpose,\n    type ProgrammaticTarget,\n} from \"../programmatic\";\nimport type { ComponentProps } from \"vue-component-type-helpers\";\n\nimport Dialog from \"./Dialog.vue\";\n\nimport type { DialogProps } from \"./props\";\n\ndeclare module \"../../index\" {\n    interface OrugaProgrammatic {\n        dialog: Required<InstanceType<typeof DialogProgrammaticFactory>>;\n    }\n}\n\nexport type DialogProgrammaticOptions<C extends Component> = Readonly<\n    DialogProps<C>\n> &\n    ProgrammaticComponentOptions<typeof Dialog<C>> &\n    Partial<Pick<ComponentProps<typeof Dialog<C>>, \"onConfirm\" | \"onClose\">>;\n\nexport class DialogProgrammaticFactory extends ProgrammaticFactory {\n    /**\n     * Create a new programmatic dialog component instance.\n     * @param options - Dialog content string or dialog component props object.\n     * @param modalOptions - Modal component props object.\n     * @param target - A target container the component get rendered into - default is `document.body`.\n     * @returns ProgrammaticExpose - programmatic component expose interface\n     */\n    open<C extends Component>(\n        options: string | DialogProgrammaticOptions<C>,\n        target?: ProgrammaticTarget,\n    ): ProgrammaticExpose<typeof Dialog<C>> {\n        const _options: DialogProgrammaticOptions<C> =\n            typeof options === \"string\" ? { content: options } : options;\n\n        const componentProps: DialogProps<C> = {\n            active: true, // set the active default state to true\n            ..._options,\n        };\n\n        // create programmatic component\n        return this._create<typeof Dialog<C>>(\n            Dialog,\n            {\n                props: componentProps, // component specific props\n                onClose: _options.onClose, // on close event handler\n            },\n            target, // target the component get rendered into\n        );\n    }\n}\n\nexport default function useDialogProgrammatic(): DialogProgrammaticFactory {\n    return new DialogProgrammaticFactory();\n}\n","import type { App } from \"vue\";\n\nimport Dialog from \"./Dialog.vue\";\nimport useDialogProgrammatic, {\n    DialogProgrammaticFactory,\n} from \"./useDialogProgrammatic\";\n\nimport { registerComponent, registerProgrammatic } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export dialog specific types */\nexport type * from \"./props\";\nexport type { DialogProgrammaticOptions } from \"./useDialogProgrammatic\";\n\n/** export dialog plugin */\nexport default {\n    install(app: App, { oruga }): void {\n        registerComponent(app, Dialog);\n        registerProgrammatic(oruga, \"dialog\", DialogProgrammaticFactory);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export dialog components */\nexport { Dialog as ODialog, useDialogProgrammatic };\n","import type { App } from \"vue\";\n\nimport Dropdown from \"./Dropdown.vue\";\nimport DropdownItem from \"./DropdownItem.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export dropdown specific types */\nexport type * from \"./props\";\n\n/** export dropdown plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Dropdown);\n        registerComponent(app, DropdownItem);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export dropdown components */\nexport { Dropdown as ODropdown, DropdownItem as ODropdownItem };\n","<script setup lang=\"ts\">\nimport {\n    computed,\n    ref,\n    useSlots,\n    watch,\n    useId,\n    useTemplateRef,\n    type VNodeArrayChildren,\n} from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isVNodeEmpty } from \"@/utils/helpers\";\nimport { defineClasses, useMatchMedia } from \"@/composables\";\n\nimport { injectField, provideField, type FieldData } from \"./fieldInjection\";\n\nimport type { FieldProps } from \"./props\";\n\n/**\n * Fields are used to add functionality to controls and to attach/group components and elements together.\n * @displayName Field\n * @style _field.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OField\",\n    configField: \"field\",\n});\n\nconst props = withDefaults(defineProps<FieldProps>(), {\n    override: undefined,\n    variant: undefined,\n    label: undefined,\n    labelSize: () => getDefault(\"field.labelSize\"),\n    labelFor: undefined,\n    labelId: () => useId(),\n    message: undefined,\n    messageSize: () => getDefault(\"field.messageSize\"),\n    messageTag: () => getDefault(\"field.messageTag\", \"p\"),\n    messageId: () => useId(),\n    grouped: false,\n    addons: false,\n    multiline: false,\n    horizontal: false,\n    mobileBreakpoint: () => getDefault(\"field.mobileBreakpoint\"),\n});\n\ndefineSlots<{\n    /** Override the label */\n    label?(): void;\n    /**\n     * Override the message\n     * @param message {string | string[] | undefined} - message property\n     */\n    message?(props: { message: string | string[] | undefined }): void;\n    /** Default content */\n    default?(): void;\n}>();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\n/** the unique id for the input to associate the label with */\nconst inputId = ref(props.labelFor);\nwatch(\n    () => props.labelFor,\n    (v) => (inputId.value = v),\n);\n\n/** set internal variant when prop change */\nconst fieldVariant = ref(props.variant);\nwatch(\n    () => props.variant,\n    (v) => (fieldVariant.value = v),\n);\n\n/** set internal message when prop change */\nconst fieldMessage = ref(props.message);\nwatch(\n    () => props.message,\n    (v) => (fieldMessage.value = v),\n);\n\n/** set parent message if we use Field in Field */\nwatch(fieldMessage, (value) => {\n    if (parentField.value && parentField.value.hasInnerField) {\n        if (!parentField.value.variant)\n            parentField.value.setVariant(fieldVariant.value);\n        if (!parentField.value.message) parentField.value.setMessage(value);\n    }\n});\n\n/** this can be set from inputs to update the focus state */\nconst isFocused = ref(false);\n/** this can be set from inputs to update the filled state */\nconst isFilled = ref(false);\n/** this can be set from sub fields to update the has inner field state */\nconst hasInnerField = ref(false);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n// tell parent field it has an inner field\nif (parentField.value) parentField.value.addInnerField();\n\nconst slots = useSlots();\n\nconst hasLabel = computed(() => props.label || !!slots.label);\n\nconst hasMessage = computed(\n    () =>\n        (Array.isArray(fieldMessage.value) && fieldMessage.value.length) ||\n        (!Array.isArray(fieldMessage.value) && !!fieldMessage.value) ||\n        !!slots.message,\n);\n\nconst hasBody = computed(\n    () =>\n        props.grouped ||\n        props.multiline ||\n        hasInnerField.value ||\n        hasAddons.value,\n);\n\nconst hasAddons = computed(\n    () => props.addons && !props.horizontal && !!slots.default,\n);\n\nfunction getInnerContent(vnode): VNodeArrayChildren {\n    const slot = vnode();\n    return slot.length === 1 && Array.isArray(slot[0].children)\n        ? slot[0].children\n        : slot;\n}\n\n// --- Field Dependency Injection Feature ---\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nfunction addInnerField(): void {\n    hasInnerField.value = true;\n}\nfunction setFocus(value: boolean): void {\n    isFocused.value = value;\n}\nfunction setFilled(value: boolean): void {\n    isFilled.value = value;\n}\nfunction setVariant(value?: string): void {\n    fieldVariant.value = value;\n}\nfunction setMessage(value?: string | string[]): void {\n    fieldMessage.value = value;\n}\nfunction setInputId(value: string): void {\n    inputId.value = value;\n}\n\nconst inputAttrs = computed(() => ({\n    \"aria-labelledby\": props.labelId,\n    ...(fieldVariant.value === \"error\"\n        ? { \"aria-errormessage\": props.messageId }\n        : {}),\n    ...(fieldMessage.value ? { \"aria-describedby\": props.messageId } : {}),\n}));\n\n// Provided data is a computed ref to ensure reactivity.\nconst provideData = computed<FieldData>(() => ({\n    $el: rootRef.value,\n    props,\n    hasInnerField: hasInnerField.value,\n    variant: fieldVariant.value,\n    message: fieldMessage.value,\n    labelId: props.labelId,\n    inputAttrs: inputAttrs.value,\n    addInnerField,\n    setInputId,\n    setFocus,\n    setFilled,\n    setVariant,\n    setMessage,\n}));\n\n// Provide field component data via dependency injection.\nprovideField(provideData);\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-field\"],\n    [\n        \"horizontalClass\",\n        \"o-field--horizontal\",\n        null,\n        computed(() => !!props.horizontal),\n    ],\n    [\"mobileClass\", \"o-field--mobile\", null, isMobile],\n    [\"focusedClass\", \"o-field--focused\", null, isFocused],\n    [\"filledClass\", \"o-field--filled\", null, isFilled],\n    [\n        \"variantClass\",\n        \"o-field--\",\n        fieldVariant,\n        computed(() => !!fieldVariant.value),\n    ],\n);\n\nconst labelClasses = defineClasses(\n    [\"labelClass\", \"o-field__label\"],\n    [\n        \"labelSizeClass\",\n        \"o-field__label--\",\n        computed(() => props.labelSize),\n        computed(() => !!props.labelSize),\n    ],\n    [\n        \"labelVariantClass\",\n        \"o-field__label--\",\n        fieldVariant,\n        computed(() => !!fieldVariant.value),\n    ],\n);\n\nconst horizontalLabelClasses = defineClasses([\n    \"horizontalLabelClass\",\n    \"o-field__horizontal-label\",\n]);\n\nconst horizontalBodyClasses = defineClasses([\n    \"horizontalBodyClass\",\n    \"o-field__horizontal-body\",\n]);\n\nconst bodyClasses = defineClasses([\"bodyClass\", \"o-field__body\"]);\n\nconst innerBodyClasses = defineClasses(\n    [\"rootClass\", \"o-field\"],\n    [\"groupedClass\", \"o-field--grouped\", null, computed(() => props.grouped)],\n    [\n        \"addonsClass\",\n        \"o-field--addons\",\n        null,\n        computed(() => !props.grouped && hasAddons.value),\n    ],\n    [\n        \"multilineClass\",\n        \"o-field--multiline\",\n        null,\n        computed(() => props.multiline),\n    ],\n);\n\nconst messageClasses = defineClasses(\n    [\"messageClass\", \"o-field__message\"],\n    [\n        \"messageSizeClass\",\n        \"o-field__message--\",\n        computed(() => props.messageSize),\n        computed(() => !!props.messageSize),\n    ],\n    [\n        \"messageVariantClass\",\n        \"o-field__message--\",\n        fieldVariant,\n        computed(() => !!fieldVariant.value),\n    ],\n);\n</script>\n\n<template>\n    <div ref=\"rootElement\" data-oruga=\"field\" :class=\"rootClasses\">\n        <div v-if=\"horizontal\" :class=\"horizontalLabelClasses\">\n            <label\n                v-if=\"hasLabel\"\n                :id=\"labelId\"\n                :for=\"inputId\"\n                :class=\"labelClasses\">\n                <slot name=\"label\">{{ label }}</slot>\n            </label>\n        </div>\n\n        <template v-else>\n            <label\n                v-if=\"hasLabel\"\n                :id=\"labelId\"\n                :for=\"inputId\"\n                :class=\"labelClasses\">\n                <slot name=\"label\">{{ label }}</slot>\n            </label>\n        </template>\n\n        <div v-if=\"horizontal\" :class=\"horizontalBodyClasses\">\n            <template\n                v-for=\"(element, index) in getInnerContent($slots.default)\"\n                :key=\"index\">\n                <component :is=\"element\" v-if=\"isVNodeEmpty(element)\" />\n\n                <OField\n                    v-else\n                    :variant=\"fieldVariant\"\n                    :addons=\"false\"\n                    :label-id=\"labelId\"\n                    :message-id=\"messageId\"\n                    :message-tag=\"messageTag\"\n                    :message-class=\"messageClass\"\n                    :message=\"index === 0 ? fieldMessage : undefined\">\n                    <!-- render inner default slot element -->\n                    <component :is=\"element\" />\n                    <template v-if=\"index === 0 && $slots.message\" #message>\n                        <slot name=\"message\" :message=\"fieldMessage\" />\n                    </template>\n                </OField>\n            </template>\n        </div>\n\n        <div v-else-if=\"hasBody\" :class=\"bodyClasses\">\n            <div :class=\"innerBodyClasses\">\n                <slot />\n            </div>\n        </div>\n\n        <template v-else>\n            <slot />\n        </template>\n\n        <component\n            :is=\"messageTag\"\n            v-if=\"hasMessage && !horizontal\"\n            :id=\"messageId\"\n            :class=\"messageClasses\">\n            <slot name=\"message\" :message=\"fieldMessage\">\n                <template v-if=\"Array.isArray(fieldMessage)\">\n                    <div v-for=\"message in fieldMessage\" :key=\"message\">\n                        {{ message }}\n                    </div>\n                </template>\n\n                <template v-else>\n                    {{ fieldMessage }}\n                </template>\n            </slot>\n        </component>\n    </div>\n</template>\n","<script setup lang=\"ts\">\nimport {\n    computed,\n    ref,\n    useSlots,\n    watch,\n    useId,\n    useTemplateRef,\n    type VNodeArrayChildren,\n} from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isVNodeEmpty } from \"@/utils/helpers\";\nimport { defineClasses, useMatchMedia } from \"@/composables\";\n\nimport { injectField, provideField, type FieldData } from \"./fieldInjection\";\n\nimport type { FieldProps } from \"./props\";\n\n/**\n * Fields are used to add functionality to controls and to attach/group components and elements together.\n * @displayName Field\n * @style _field.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OField\",\n    configField: \"field\",\n});\n\nconst props = withDefaults(defineProps<FieldProps>(), {\n    override: undefined,\n    variant: undefined,\n    label: undefined,\n    labelSize: () => getDefault(\"field.labelSize\"),\n    labelFor: undefined,\n    labelId: () => useId(),\n    message: undefined,\n    messageSize: () => getDefault(\"field.messageSize\"),\n    messageTag: () => getDefault(\"field.messageTag\", \"p\"),\n    messageId: () => useId(),\n    grouped: false,\n    addons: false,\n    multiline: false,\n    horizontal: false,\n    mobileBreakpoint: () => getDefault(\"field.mobileBreakpoint\"),\n});\n\ndefineSlots<{\n    /** Override the label */\n    label?(): void;\n    /**\n     * Override the message\n     * @param message {string | string[] | undefined} - message property\n     */\n    message?(props: { message: string | string[] | undefined }): void;\n    /** Default content */\n    default?(): void;\n}>();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\n/** the unique id for the input to associate the label with */\nconst inputId = ref(props.labelFor);\nwatch(\n    () => props.labelFor,\n    (v) => (inputId.value = v),\n);\n\n/** set internal variant when prop change */\nconst fieldVariant = ref(props.variant);\nwatch(\n    () => props.variant,\n    (v) => (fieldVariant.value = v),\n);\n\n/** set internal message when prop change */\nconst fieldMessage = ref(props.message);\nwatch(\n    () => props.message,\n    (v) => (fieldMessage.value = v),\n);\n\n/** set parent message if we use Field in Field */\nwatch(fieldMessage, (value) => {\n    if (parentField.value && parentField.value.hasInnerField) {\n        if (!parentField.value.variant)\n            parentField.value.setVariant(fieldVariant.value);\n        if (!parentField.value.message) parentField.value.setMessage(value);\n    }\n});\n\n/** this can be set from inputs to update the focus state */\nconst isFocused = ref(false);\n/** this can be set from inputs to update the filled state */\nconst isFilled = ref(false);\n/** this can be set from sub fields to update the has inner field state */\nconst hasInnerField = ref(false);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n// tell parent field it has an inner field\nif (parentField.value) parentField.value.addInnerField();\n\nconst slots = useSlots();\n\nconst hasLabel = computed(() => props.label || !!slots.label);\n\nconst hasMessage = computed(\n    () =>\n        (Array.isArray(fieldMessage.value) && fieldMessage.value.length) ||\n        (!Array.isArray(fieldMessage.value) && !!fieldMessage.value) ||\n        !!slots.message,\n);\n\nconst hasBody = computed(\n    () =>\n        props.grouped ||\n        props.multiline ||\n        hasInnerField.value ||\n        hasAddons.value,\n);\n\nconst hasAddons = computed(\n    () => props.addons && !props.horizontal && !!slots.default,\n);\n\nfunction getInnerContent(vnode): VNodeArrayChildren {\n    const slot = vnode();\n    return slot.length === 1 && Array.isArray(slot[0].children)\n        ? slot[0].children\n        : slot;\n}\n\n// --- Field Dependency Injection Feature ---\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nfunction addInnerField(): void {\n    hasInnerField.value = true;\n}\nfunction setFocus(value: boolean): void {\n    isFocused.value = value;\n}\nfunction setFilled(value: boolean): void {\n    isFilled.value = value;\n}\nfunction setVariant(value?: string): void {\n    fieldVariant.value = value;\n}\nfunction setMessage(value?: string | string[]): void {\n    fieldMessage.value = value;\n}\nfunction setInputId(value: string): void {\n    inputId.value = value;\n}\n\nconst inputAttrs = computed(() => ({\n    \"aria-labelledby\": props.labelId,\n    ...(fieldVariant.value === \"error\"\n        ? { \"aria-errormessage\": props.messageId }\n        : {}),\n    ...(fieldMessage.value ? { \"aria-describedby\": props.messageId } : {}),\n}));\n\n// Provided data is a computed ref to ensure reactivity.\nconst provideData = computed<FieldData>(() => ({\n    $el: rootRef.value,\n    props,\n    hasInnerField: hasInnerField.value,\n    variant: fieldVariant.value,\n    message: fieldMessage.value,\n    labelId: props.labelId,\n    inputAttrs: inputAttrs.value,\n    addInnerField,\n    setInputId,\n    setFocus,\n    setFilled,\n    setVariant,\n    setMessage,\n}));\n\n// Provide field component data via dependency injection.\nprovideField(provideData);\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-field\"],\n    [\n        \"horizontalClass\",\n        \"o-field--horizontal\",\n        null,\n        computed(() => !!props.horizontal),\n    ],\n    [\"mobileClass\", \"o-field--mobile\", null, isMobile],\n    [\"focusedClass\", \"o-field--focused\", null, isFocused],\n    [\"filledClass\", \"o-field--filled\", null, isFilled],\n    [\n        \"variantClass\",\n        \"o-field--\",\n        fieldVariant,\n        computed(() => !!fieldVariant.value),\n    ],\n);\n\nconst labelClasses = defineClasses(\n    [\"labelClass\", \"o-field__label\"],\n    [\n        \"labelSizeClass\",\n        \"o-field__label--\",\n        computed(() => props.labelSize),\n        computed(() => !!props.labelSize),\n    ],\n    [\n        \"labelVariantClass\",\n        \"o-field__label--\",\n        fieldVariant,\n        computed(() => !!fieldVariant.value),\n    ],\n);\n\nconst horizontalLabelClasses = defineClasses([\n    \"horizontalLabelClass\",\n    \"o-field__horizontal-label\",\n]);\n\nconst horizontalBodyClasses = defineClasses([\n    \"horizontalBodyClass\",\n    \"o-field__horizontal-body\",\n]);\n\nconst bodyClasses = defineClasses([\"bodyClass\", \"o-field__body\"]);\n\nconst innerBodyClasses = defineClasses(\n    [\"rootClass\", \"o-field\"],\n    [\"groupedClass\", \"o-field--grouped\", null, computed(() => props.grouped)],\n    [\n        \"addonsClass\",\n        \"o-field--addons\",\n        null,\n        computed(() => !props.grouped && hasAddons.value),\n    ],\n    [\n        \"multilineClass\",\n        \"o-field--multiline\",\n        null,\n        computed(() => props.multiline),\n    ],\n);\n\nconst messageClasses = defineClasses(\n    [\"messageClass\", \"o-field__message\"],\n    [\n        \"messageSizeClass\",\n        \"o-field__message--\",\n        computed(() => props.messageSize),\n        computed(() => !!props.messageSize),\n    ],\n    [\n        \"messageVariantClass\",\n        \"o-field__message--\",\n        fieldVariant,\n        computed(() => !!fieldVariant.value),\n    ],\n);\n</script>\n\n<template>\n    <div ref=\"rootElement\" data-oruga=\"field\" :class=\"rootClasses\">\n        <div v-if=\"horizontal\" :class=\"horizontalLabelClasses\">\n            <label\n                v-if=\"hasLabel\"\n                :id=\"labelId\"\n                :for=\"inputId\"\n                :class=\"labelClasses\">\n                <slot name=\"label\">{{ label }}</slot>\n            </label>\n        </div>\n\n        <template v-else>\n            <label\n                v-if=\"hasLabel\"\n                :id=\"labelId\"\n                :for=\"inputId\"\n                :class=\"labelClasses\">\n                <slot name=\"label\">{{ label }}</slot>\n            </label>\n        </template>\n\n        <div v-if=\"horizontal\" :class=\"horizontalBodyClasses\">\n            <template\n                v-for=\"(element, index) in getInnerContent($slots.default)\"\n                :key=\"index\">\n                <component :is=\"element\" v-if=\"isVNodeEmpty(element)\" />\n\n                <OField\n                    v-else\n                    :variant=\"fieldVariant\"\n                    :addons=\"false\"\n                    :label-id=\"labelId\"\n                    :message-id=\"messageId\"\n                    :message-tag=\"messageTag\"\n                    :message-class=\"messageClass\"\n                    :message=\"index === 0 ? fieldMessage : undefined\">\n                    <!-- render inner default slot element -->\n                    <component :is=\"element\" />\n                    <template v-if=\"index === 0 && $slots.message\" #message>\n                        <slot name=\"message\" :message=\"fieldMessage\" />\n                    </template>\n                </OField>\n            </template>\n        </div>\n\n        <div v-else-if=\"hasBody\" :class=\"bodyClasses\">\n            <div :class=\"innerBodyClasses\">\n                <slot />\n            </div>\n        </div>\n\n        <template v-else>\n            <slot />\n        </template>\n\n        <component\n            :is=\"messageTag\"\n            v-if=\"hasMessage && !horizontal\"\n            :id=\"messageId\"\n            :class=\"messageClasses\">\n            <slot name=\"message\" :message=\"fieldMessage\">\n                <template v-if=\"Array.isArray(fieldMessage)\">\n                    <div v-for=\"message in fieldMessage\" :key=\"message\">\n                        {{ message }}\n                    </div>\n                </template>\n\n                <template v-else>\n                    {{ fieldMessage }}\n                </template>\n            </slot>\n        </component>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Field from \"./Field.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export field specific types */\nexport type * from \"./props\";\n\n/** export field plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Field);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export field components */\nexport { Field as OField };\n","import type { App } from \"vue\";\n\nimport Icon from \"./Icon.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export icon specific types */\nexport type * from \"./props\";\n\n/** export icon plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Icon);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export icon components */\nexport { Icon as OIcon };\n","import type { App } from \"vue\";\n\nimport Input from \"./Input.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export input specific types */\nexport type * from \"./props\";\n\n/** export input plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Input);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export input components */\nexport { Input as OInput };\n","<script setup lang=\"ts\" generic=\"T\">\nimport { useId, computed, useTemplateRef, ref } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isDefined, isEqual } from \"@/utils/helpers\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { ListboxComponent, ListItemComponent } from \"./types\";\nimport type { ListItemProps } from \"./props\";\n\n/**\n * An option item used by the listbox component.\n * @displayName Listbox Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OListItem\",\n    configField: \"listbox\",\n});\n\nconst props = withDefaults(defineProps<ListItemProps<T>>(), {\n    override: undefined,\n    // @ts-expect-error string is not assignable of generic type T\n    value: () => useId(),\n    label: undefined,\n    disabled: false,\n    hidden: false,\n    icon: undefined,\n    iconPack: () => getDefault(\"listbox.iconPack\"),\n    iconSize: () => getDefault(\"listbox.iconSize\"),\n    ariaLabel: undefined,\n    ariaLabelledby: undefined,\n    parentKey: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * onclick event\n     * @param value {unknown} value prop data\n     * @param event {event} native event\n     */\n    click: [value: T, event: Event];\n}>();\n\ndefineSlots<{\n    /**\n     * Override the label, default is label prop\n     * @param selected {boolean} - item is selected\n     * @param disabled {boolean} - item is disabled\n     */\n    default?(props: { selected: boolean; disabled: boolean }): void;\n}>();\n\nconst key = props.parentKey ?? \"listbox\";\n\nconst rootRef = useTemplateRef<HTMLElement>(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<ListItemComponent<T>>(() => ({\n    value: props.value,\n    hidden: isHidden.value,\n    isViable: isViable.value,\n    setHidden,\n    matches,\n    selectItem: (): void => rootRef.value?.click(),\n}));\n\n/** inject functionalities and data from the parent component */\nconst { parent, item } = useProviderChild<\n    ListboxComponent<T>,\n    ListItemComponent<T>\n>(rootRef, { key, data: providedData });\n\nconst localHidden = ref(false);\nconst isHidden = computed(() => props.hidden || localHidden.value);\n\nfunction setHidden(hidden: boolean): void {\n    localHidden.value = hidden;\n}\n\n/** Shows if the item is viable or not (not disabled or hidden). */\nconst isViable = computed(() => !isHidden.value && !props.disabled);\n\nconst isDisabled = computed(() => parent.value.disabled || props.disabled);\n\nconst isFocused = computed(\n    () => item.value.identifier === parent.value.focsuedItem?.identifier,\n);\n\n/** Shows if the item is clickable or not. */\nconst isSelectable = computed(\n    () => !isDisabled.value && parent.value.selectable,\n);\n\nconst isSelected = computed(() => {\n    if (!isDefined(parent.value.selected)) return false;\n    if (parent.value.multiple && Array.isArray(parent.value.selected))\n        return parent.value.selected.some((selected) =>\n            isEqual(item.value.data.value, selected),\n        );\n    return isEqual(item.value.data.value, parent.value.selected);\n});\n\n/** Hover listener, set the item as focused element. */\nfunction focusItem(): void {\n    parent.value.focusItem(item.value);\n}\n\n/** Click listener, toggle the selection of the item. */\nfunction clickItem(event: Event): void {\n    if (!isSelectable.value) return;\n    parent.value.selectItem(item.value, !isSelected.value);\n    emits(\"click\", props.value as T, event);\n}\n\n/** Check if a given value matches the item label (startsWith). */\n// TODO: refactor to mave into Parent because not name does noch match implementation\nfunction matches(value: string): boolean {\n    return !!props.label?.toLowerCase().startsWith(value.toLowerCase());\n}\n\n// #region --- Computed Component Classes ---\n\nconst itmeClasses = defineClasses(\n    [\"itemClass\", `o-${key}__item`],\n    [\"itemSelectableClass\", `o-${key}__item--selectable`, null, isSelectable],\n    [\"itemSelectedClass\", `o-${key}__item--selected`, null, isSelected],\n    [\"itemFocusedClass\", `o-${key}__item--focused`, null, isFocused],\n    [\"itemDisabledClass\", `o-${key}__item--disabled`, null, isDisabled],\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <li\n        v-show=\"!isHidden\"\n        :id=\"`${parent.id}-${item.identifier}`\"\n        ref=\"rootElement\"\n        :data-oruga=\"`${key}-item`\"\n        :data-id=\"`${key}-${item.identifier}`\"\n        :class=\"itmeClasses\"\n        role=\"option\"\n        tabindex=\"-1\"\n        :aria-selected=\"\n            parent.selectable && !parent.multiple ? isSelected : undefined\n        \"\n        :aria-checked=\"\n            parent.selectable && parent.multiple ? isSelected : undefined\n        \"\n        :aria-hidden=\"isHidden\"\n        :aria-disabled=\"isDisabled\"\n        :aria-label=\"ariaLabel ?? label\"\n        :aria-labelledby=\"ariaLabelledby\"\n        @click.prevent=\"clickItem\"\n        @mouseenter=\"focusItem\">\n        <!-- TODO: add checkbox for checkable -->\n        <slot :selected=\"isSelected\" :disabled=\"isDisabled\">\n            <o-icon\n                v-if=\"icon\"\n                :icon=\"icon\"\n                :pack=\"iconPack\"\n                :size=\"iconSize\" />\n            <span>{{ label }}</span>\n        </slot>\n    </li>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { useId, computed, useTemplateRef, ref } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isDefined, isEqual } from \"@/utils/helpers\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { ListboxComponent, ListItemComponent } from \"./types\";\nimport type { ListItemProps } from \"./props\";\n\n/**\n * An option item used by the listbox component.\n * @displayName Listbox Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OListItem\",\n    configField: \"listbox\",\n});\n\nconst props = withDefaults(defineProps<ListItemProps<T>>(), {\n    override: undefined,\n    // @ts-expect-error string is not assignable of generic type T\n    value: () => useId(),\n    label: undefined,\n    disabled: false,\n    hidden: false,\n    icon: undefined,\n    iconPack: () => getDefault(\"listbox.iconPack\"),\n    iconSize: () => getDefault(\"listbox.iconSize\"),\n    ariaLabel: undefined,\n    ariaLabelledby: undefined,\n    parentKey: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * onclick event\n     * @param value {unknown} value prop data\n     * @param event {event} native event\n     */\n    click: [value: T, event: Event];\n}>();\n\ndefineSlots<{\n    /**\n     * Override the label, default is label prop\n     * @param selected {boolean} - item is selected\n     * @param disabled {boolean} - item is disabled\n     */\n    default?(props: { selected: boolean; disabled: boolean }): void;\n}>();\n\nconst key = props.parentKey ?? \"listbox\";\n\nconst rootRef = useTemplateRef<HTMLElement>(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<ListItemComponent<T>>(() => ({\n    value: props.value,\n    hidden: isHidden.value,\n    isViable: isViable.value,\n    setHidden,\n    matches,\n    selectItem: (): void => rootRef.value?.click(),\n}));\n\n/** inject functionalities and data from the parent component */\nconst { parent, item } = useProviderChild<\n    ListboxComponent<T>,\n    ListItemComponent<T>\n>(rootRef, { key, data: providedData });\n\nconst localHidden = ref(false);\nconst isHidden = computed(() => props.hidden || localHidden.value);\n\nfunction setHidden(hidden: boolean): void {\n    localHidden.value = hidden;\n}\n\n/** Shows if the item is viable or not (not disabled or hidden). */\nconst isViable = computed(() => !isHidden.value && !props.disabled);\n\nconst isDisabled = computed(() => parent.value.disabled || props.disabled);\n\nconst isFocused = computed(\n    () => item.value.identifier === parent.value.focsuedItem?.identifier,\n);\n\n/** Shows if the item is clickable or not. */\nconst isSelectable = computed(\n    () => !isDisabled.value && parent.value.selectable,\n);\n\nconst isSelected = computed(() => {\n    if (!isDefined(parent.value.selected)) return false;\n    if (parent.value.multiple && Array.isArray(parent.value.selected))\n        return parent.value.selected.some((selected) =>\n            isEqual(item.value.data.value, selected),\n        );\n    return isEqual(item.value.data.value, parent.value.selected);\n});\n\n/** Hover listener, set the item as focused element. */\nfunction focusItem(): void {\n    parent.value.focusItem(item.value);\n}\n\n/** Click listener, toggle the selection of the item. */\nfunction clickItem(event: Event): void {\n    if (!isSelectable.value) return;\n    parent.value.selectItem(item.value, !isSelected.value);\n    emits(\"click\", props.value as T, event);\n}\n\n/** Check if a given value matches the item label (startsWith). */\n// TODO: refactor to mave into Parent because not name does noch match implementation\nfunction matches(value: string): boolean {\n    return !!props.label?.toLowerCase().startsWith(value.toLowerCase());\n}\n\n// #region --- Computed Component Classes ---\n\nconst itmeClasses = defineClasses(\n    [\"itemClass\", `o-${key}__item`],\n    [\"itemSelectableClass\", `o-${key}__item--selectable`, null, isSelectable],\n    [\"itemSelectedClass\", `o-${key}__item--selected`, null, isSelected],\n    [\"itemFocusedClass\", `o-${key}__item--focused`, null, isFocused],\n    [\"itemDisabledClass\", `o-${key}__item--disabled`, null, isDisabled],\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <li\n        v-show=\"!isHidden\"\n        :id=\"`${parent.id}-${item.identifier}`\"\n        ref=\"rootElement\"\n        :data-oruga=\"`${key}-item`\"\n        :data-id=\"`${key}-${item.identifier}`\"\n        :class=\"itmeClasses\"\n        role=\"option\"\n        tabindex=\"-1\"\n        :aria-selected=\"\n            parent.selectable && !parent.multiple ? isSelected : undefined\n        \"\n        :aria-checked=\"\n            parent.selectable && parent.multiple ? isSelected : undefined\n        \"\n        :aria-hidden=\"isHidden\"\n        :aria-disabled=\"isDisabled\"\n        :aria-label=\"ariaLabel ?? label\"\n        :aria-labelledby=\"ariaLabelledby\"\n        @click.prevent=\"clickItem\"\n        @mouseenter=\"focusItem\">\n        <!-- TODO: add checkbox for checkable -->\n        <slot :selected=\"isSelected\" :disabled=\"isDisabled\">\n            <o-icon\n                v-if=\"icon\"\n                :icon=\"icon\"\n                :pack=\"iconPack\"\n                :size=\"iconSize\" />\n            <span>{{ label }}</span>\n        </slot>\n    </li>\n</template>\n","<script setup lang=\"ts\" generic=\"T, IsMultiple extends boolean = false\">\nimport {\n    computed,\n    ref,\n    toValue,\n    useId,\n    useTemplateRef,\n    watch,\n    watchEffect,\n} from \"vue\";\n\nimport OListboxItem from \"./ListItem.vue\";\nimport OInput from \"@/components/input/Input.vue\";\n\nimport {\n    alternateArray,\n    isDefined,\n    isEmpty,\n    isEqual,\n    isPrintableCharacter,\n    isTrueish,\n    mod,\n    toCssDimension,\n} from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport { getDefault } from \"@/utils/config\";\nimport {\n    areOptionsGrouped,\n    defineClasses,\n    findOptionIndex,\n    getOptionsLength,\n    isGroupOption,\n    normalizeOptions,\n    scrollElementInView,\n    unrefElement,\n    useIndexer,\n    useProviderParent,\n    useScrollEvents,\n} from \"@/composables\";\n\nimport { injectField } from \"@/components/field/fieldInjection\";\n\nimport type { ListboxProps } from \"./props\";\nimport type { ListItem, ListboxComponent, ListItemComponent } from \"./types\";\n\n/**\n * Listbox is used to select one or more values from a list of items.\n * @displayName Listbox\n * @requires ./ListItem.vue\n * @style _listbox.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OListbox\",\n    configField: \"listbox\",\n});\n\ntype ModelValue = ListboxProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<ListboxProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    options: undefined,\n    scrollHeight: () => getDefault(\"listbox.scrollHeight\", \"225\"),\n    disabled: false,\n    selectable: true,\n    // checkable: false,\n    selectOnFocus: false,\n    emptyLabel: () => getDefault(\"listbox.emptyLabel\"),\n    filterable: false,\n    backendFiltering: false,\n    filter: undefined,\n    filterIcon: () => getDefault(\"listbox.filterIcon\"),\n    filterDebounce: () => getDefault(\"listbox.filterDebounce\", 400),\n    filterPlaceholder: () => getDefault(\"listbox.filterPlaceholder\"),\n    iconPack: () => getDefault(\"listbox.iconPack\"),\n    animation: () => getDefault(\"listbox.animation\", \"fade\"),\n    id: () => useId(),\n    ariaLabel: undefined,\n    ariaLabelledby: undefined,\n    inputClasses: () => getDefault(\"listbox.inputClasses\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown | unknown[]} updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on select event - fired before update:modelValue\n     * @param value {unknown} selected value\n     */\n    select: [value: T];\n    /**\n     * on filter change event\n     * @param value {string} filter value\n     * @param event {Event} native event\n     */\n    filter: [value: string, event: Event];\n    /**\n     * on list focus event\n     * @param event {Event} native event\n     */\n    focus: [event: Event];\n    /**\n     * on list blur event\n     * @param event {Event} native event\n     */\n    blur: [event: Event];\n    /** scrolling inside the list reached the start */\n    \"scroll-start\": [];\n    /** scrolling inside the list reached the end */\n    \"scroll-end\": [];\n}>();\n\ndefineSlots<{\n    /** Define an additional header */\n    header?(): void;\n    /**\n     * Overridet the filter input\n     * @param value {string} - filter input value\n     * @param onChange {(input: string, event: Event): void} - on filter input change event\n     * @param onKeydown {(event: Event): void} - on filter input keydown event\n     */\n    filter?(props: {\n        value: string;\n        onChange: (input: string, event: Event) => void;\n        onKeydown: (event: KeyboardEvent) => void;\n    }): void;\n    /** Define the listbox items here */\n    default?(): void;\n    /** Define the content to show if the list is empty */\n    empty?(): void;\n    /** Define an additional footer */\n    footer?(): void;\n}>();\n\nconst listRef = useTemplateRef<HTMLElement>(\"listElement\");\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// if `id` is given set as `for` property on o-field wrapper\nif (props.id) parentField.value?.setInputId(props.id);\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer, true),\n);\n\n/** determines if the options are grouped or not */\nconst optionsGrouped = computed(() => areOptionsGrouped(normalizedOptions));\n\n// #region --- Child Items ---\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<ListboxComponent<T>>(() => ({\n    id: props.id,\n    disabled: props.disabled,\n    multiple: isTrueish(props.multiple),\n    // checkable: props.checkable,\n    selectable: props.selectable,\n    selected: vmodel.value,\n    focsuedItem: focusedItem.value,\n    selectItem,\n    focusItem,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<\n    ListItemComponent<T>,\n    ListboxComponent<T>\n>({ rootRef: listRef, data: provideData });\n\nconst hasViableItems = computed(() =>\n    childItems.value.some((item) => item.data.isViable),\n);\n\n/**\n * List of child items without disabled or hidden items.\n * Returns empty list when no items are viable or component is disabled.\n */\nconst viableItems = computed(() => {\n    if (!props.selectable || props.disabled) return [];\n    return childItems.value.filter((item) => item.data.isViable);\n});\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(startingIndex: number, delta: 1 | -1): ListItem<T> {\n    let newIndex = mod(\n        focusedItem.value?.index == startingIndex\n            ? startingIndex + delta\n            : startingIndex,\n        childItems.value.length,\n    );\n\n    for (\n        ;\n        newIndex !== focusedItem.value?.index;\n        newIndex = mod(newIndex + delta, childItems.value.length)\n    ) {\n        // Break if the item at this index is viable (not disabled or hidden)\n        if (childItems.value[newIndex].data.isViable) break;\n    }\n\n    return childItems.value[newIndex];\n}\n\n// #endregion --- Child Items ---\n\n// #region --- Scroll Feature ---\n\n// set infinite scroll handler\nif (isClient && props.scrollHeight)\n    useScrollEvents(\n        listRef,\n        {\n            onScrollEnd: () => emits(\"scroll-end\"),\n            onScrollStart: () => emits(\"scroll-start\"),\n        },\n        { passive: true },\n    );\n\nconst listStyle = computed(() => ({\n    maxHeight: toCssDimension(props.scrollHeight),\n    overflow: \"auto\",\n}));\n\n// #endregion --- Scroll Handler ---\n\n// #region --- Select Feature ---\n\n// the selected item value, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n/** Checks if the value of the given item is part of the modelValue. */\nfunction isItemSelected(item: ListItem<T>): boolean {\n    if (isTrueish(props.multiple)) {\n        if (Array.isArray(vmodel.value))\n            return vmodel.value.some((value) =>\n                isEqual(item.data.value, value),\n            );\n        else return false;\n    } else return isEqual(item.data.value, vmodel.value);\n}\n\n/** Replaces the modelValue when selectable and multiple. */\nfunction updateSelectedItems(items: ListItem<T>[]): void {\n    if (!props.selectable || !isTrueish(props.multiple)) return;\n    const values = items.map((item) => item.data.value).filter(isDefined);\n    vmodel.value = values as ModelValue;\n}\n\n/** Updates the modelValue for one item when selectable. */\nfunction selectItem(item: ListItem<T>, selection: boolean = true): void {\n    if (!props.selectable) return;\n\n    const value = item.data.value!;\n    if (selection) emits(\"select\", value);\n\n    // set selected option\n    if (isTrueish(props.multiple)) {\n        if (vmodel.value && Array.isArray(vmodel.value)) {\n            if (selection && !vmodel.value.includes(value)) {\n                // add a value\n                vmodel.value = [...vmodel.value, value] as ModelValue;\n            } else if (!selection) {\n                // remove a value\n                vmodel.value = vmodel.value.filter(\n                    (val) => val !== value,\n                ) as ModelValue;\n            }\n        } else {\n            // init new value array\n            vmodel.value = (selection ? [value] : []) as ModelValue;\n        }\n    } else {\n        if (!selection) vmodel.value = undefined;\n        else if (vmodel.value !== value) {\n            // update a single value\n            vmodel.value = value as ModelValue;\n        }\n    }\n}\n\n/** Select a range of items from a staring index to an end index. */\nfunction selectItemRange(start: number, end: number): void {\n    if (!props.selectable || !isTrueish(props.multiple)) return;\n    if (start < 0 || end < 0) return;\n\n    const rangeStart = Math.min(start, end);\n    const rangeEnd = Math.max(start, end);\n    const items = childItems.value\n        // get the items by the rande\n        .slice(rangeStart, rangeEnd + 1)\n        // remove not viable items\n        .filter((item) => item.data.isViable);\n\n    // select all items in the range\n    updateSelectedItems(items);\n}\n\n/** Returns the first selected item or undefined started by the given index alternating between the next and previous elements. */\nfunction findFirstSelectedItem(index: number = 0): ListItem<T> | undefined {\n    if (isEmpty(vmodel.value)) return undefined;\n\n    if (isTrueish(props.multiple)) {\n        if (!Array.isArray(vmodel.value)) return undefined;\n        // check index overflow\n        if (index < 0 || index >= childItems.value.length) return undefined;\n\n        // reorders array by alternating between the next and previous elements\n        const items = alternateArray(childItems.value, index)\n            // filter only viable items\n            .filter((item) => item.data.isViable);\n\n        // find first option which is in the selection list\n        return items.find(isItemSelected);\n    } else {\n        const items = childItems.value;\n        // find first option which is in the selection list\n        return items.find(isItemSelected);\n    }\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Focus Feature ---\n\nconst isFocused = ref(false);\nconst focusedItem = ref<ListItem<T>>();\nconst startRangeIndex = ref(-1);\n\n/** Sets the beginn index for an multiselection. */\nfunction startFocusRange(): void {\n    if (isTrueish(props.multiple))\n        startRangeIndex.value = focusedItem.value?.index ?? -1;\n}\n\n/** Set an item as focused element. */\nfunction focusItem(value?: ListItem<T>): void {\n    focusedItem.value = value;\n}\n\n/** Set focus on an item. */\nfunction setFocus(item: ListItem<T>): void {\n    isFocused.value = true;\n    if (props.selectOnFocus && item.data.value) selectItem(item, true);\n\n    // set item as focused\n    focusedItem.value = item;\n\n    // scroll item into view\n    scrollElementInView(listRef, item.el);\n}\n\n/** Select the current focused item. */\nfunction selectFocusedItem(event: KeyboardEvent): void {\n    if (!props.selectable || !focusedItem.value) return;\n\n    // ensure item is in view\n    setFocus(focusedItem.value);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey) {\n        const nearestSelectedItem = findFirstSelectedItem(\n            focusedItem.value.index,\n        );\n        // select from nearest selected option to focused option\n        if (nearestSelectedItem)\n            selectItemRange(focusedItem.value.index, nearestSelectedItem.index);\n    } else\n        // select the item\n        selectItem(focusedItem.value, !isItemSelected(focusedItem.value));\n}\n\n/** Move the focus one element up the list. */\nfunction moveFocusUp(event: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the previous item\n    const delta = -1;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey)\n        selectItemRange(item.index, startRangeIndex.value);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Move the focus one element down the list. */\nfunction moveFocusDown(event: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the next item\n    const delta = 1;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Go to the first viable item. */\nfunction focusFirstItem(event?: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n\n    // get the first item\n    const item = getFirstViableItem(0, 1);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event?.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Go to the last viable item. */\nfunction focusLastItem(event?: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the last item\n    const item = getFirstViableItem(childItems.value.length - 1, -1);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event?.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\nfunction onFocusin(event: FocusEvent): void {\n    // prevent when already focused\n    if (isFocused.value) return;\n\n    if (event.target !== event.currentTarget) {\n        isFocused.value = true;\n\n        // ensure that the list is the real focused element\n        const listElement = unrefElement(listRef);\n        if (listElement) listElement.focus();\n    } else {\n        const firstSelectedItem = findFirstSelectedItem();\n        // when an item is already selected\n        if (firstSelectedItem)\n            // focus this item\n            setFocus(firstSelectedItem);\n        else\n            // else focus first item\n            focusFirstItem();\n    }\n\n    emits(\"focus\", event);\n}\n\nfunction onFocusout(event: FocusEvent): void {\n    // check if focus is still inside the component\n    const listElement = event.currentTarget as HTMLElement;\n    const newFocus = event.relatedTarget as HTMLElement;\n    if (listElement?.contains(newFocus)) return;\n    if (listElement?.contains(event.target as Node)) return;\n\n    // clear focus\n    isFocused.value = false;\n    focusedItem.value = undefined;\n    startRangeIndex.value = -1;\n}\n\nfunction onBlur(event: Event): void {\n    // clear focus\n    isFocused.value = false;\n    focusedItem.value = undefined;\n    startRangeIndex.value = -1;\n\n    emits(\"blur\", event);\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Filter Feature ---\n\nfunction onFilterChange(value: string, event: Event): void {\n    emits(\"filter\", value, event);\n\n    focusedItem.value = undefined;\n    startRangeIndex.value = -1;\n}\n\nconst filterValue = ref<string>(\"\");\n\n// if not backend filtered\nif (!props.backendFiltering) {\n    // update the hidden state for every item based on filter value\n    watchEffect(() => {\n        if (!props.filterable) return;\n\n        childItems.value.forEach((item) => {\n            if (!item.data) return;\n\n            // prevent filtering for presentation items\n            if ((item.data as any).role === \"presentation\") return;\n\n            // no filter means not hidden\n            if (!filterValue.value) {\n                item.data.setHidden(false);\n                return;\n            }\n\n            const isVisible =\n                typeof props.filter === \"function\"\n                    ? // call filter function if available\n                      props.filter(item.data.value!, toValue(filterValue))\n                    : // else check filter value matches item value\n                      item.data.matches(toValue(filterValue));\n\n            // update hidden state\n            item.data.setHidden(!isVisible);\n        });\n    });\n}\n\n// #endregion --- Filter Handler ---\n\n// #region --- Type-Ahead Feature ---\n\nconst typeAheadValue = ref(\"\");\nlet searchTimeout: ReturnType<typeof setTimeout> | undefined;\n\n// on type-ahead value change\nwatch(typeAheadValue, (value) => {\n    // clear old timeout\n    if (searchTimeout) clearTimeout(searchTimeout);\n\n    // when value is not empty\n    if (!isEmpty(value)) {\n        // find first item that starts with the search value\n        const matchedItem = viableItems.value.find((item) =>\n            item.data.matches(value),\n        );\n\n        if (matchedItem)\n            // focus the item\n            setFocus(matchedItem);\n    }\n\n    // set timeout to search value get cleared\n    searchTimeout = setTimeout(() => {\n        typeAheadValue.value = \"\";\n        searchTimeout = undefined;\n    }, 500);\n});\n\n// #endregion --- Type-Ahead Feature ---\n\n// #region --- Keyboard Listener ---\n\nfunction onListKeyDown(event: KeyboardEvent): void {\n    const metaKey = event.metaKey || event.ctrlKey;\n\n    switch (event.code) {\n        case \"ArrowDown\":\n            moveFocusDown(event);\n            event.preventDefault();\n            break;\n\n        case \"ArrowUp\":\n            moveFocusUp(event);\n            event.preventDefault();\n            break;\n\n        case \"Home\":\n            focusFirstItem(event);\n            event.preventDefault();\n            break;\n\n        case \"End\":\n            focusLastItem(event);\n            event.preventDefault();\n            break;\n\n        case \"Enter\":\n        case \"NumpadEnter\":\n        case \"Space\":\n            selectFocusedItem(event);\n            event.preventDefault();\n            break;\n\n        case \"Tab\":\n            //NOOP\n            break;\n\n        case \"ShiftLeft\":\n        case \"ShiftRight\":\n            startFocusRange();\n            break;\n\n        default:\n            if (isTrueish(props.multiple) && event.code === \"KeyA\" && metaKey) {\n                // select all avaibale items\n                updateSelectedItems(viableItems.value);\n                event.preventDefault();\n                break;\n            }\n\n            if (!metaKey && isPrintableCharacter(event.key)) {\n                // append event key char to previus searched chars\n                typeAheadValue.value = (typeAheadValue.value || \"\") + event.key;\n                event.preventDefault();\n            }\n\n            break;\n    }\n}\n\nfunction onFilterKeyDown(event: KeyboardEvent): void {\n    switch (event.code) {\n        case \"ArrowDown\":\n            moveFocusDown(event);\n            event.preventDefault();\n            break;\n\n        case \"ArrowUp\":\n            moveFocusUp(event);\n            event.preventDefault();\n            break;\n\n        case \"Home\":\n            focusFirstItem(event);\n            event.preventDefault();\n            break;\n\n        case \"End\":\n            focusLastItem(event);\n            event.preventDefault();\n            break;\n\n        case \"Enter\":\n        case \"NumpadEnter\":\n            selectFocusedItem(event);\n            break;\n\n        case \"ShiftLeft\":\n        case \"ShiftRight\":\n            startFocusRange();\n            break;\n\n        default:\n            break;\n    }\n}\n\n// #endregion --- Keyboard Listener ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-listbox\"],\n    [\n        \"disabledClass\",\n        \"o-listbox--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"selectableClass\",\n        \"o-listbox--selectable\",\n        null,\n        computed(() => props.selectable),\n    ],\n    [\n        \"filterableClass\",\n        \"o-listbox--filterable\",\n        null,\n        computed(() => props.filterable),\n    ],\n    [\n        \"multipleClass\",\n        \"o-listbox--multiple\",\n        null,\n        computed(() => !!props.multiple),\n    ],\n);\n\nconst headerClasses = defineClasses([\"headerClass\", \"o-listbox__header\"]);\n\nconst footerClasses = defineClasses([\"footerClass\", \"o-listbox__footer\"]);\n\nconst filterClasses = defineClasses([\"filterClass\", \"o-listbox__filter\"]);\n\nconst listClasses = defineClasses([\"listClass\", \"o-listbox__list\"]);\n\nconst emptyClasses = defineClasses([\"emptyClass\", \"o-listbox__empty\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div\n        data-oruga=\"listbox\"\n        :class=\"rootClasses\"\n        @focusout=\"onFocusout\"\n        @mouseleave=\"isFocused && onFocusout($event)\">\n        <div v-if=\"$slots.header\" :class=\"headerClasses\">\n            <slot name=\"header\" />\n        </div>\n\n        <div v-if=\"filterable\" :class=\"filterClasses\">\n            <slot\n                name=\"filter\"\n                :value=\"filterValue\"\n                :on-change=\"onFilterChange\"\n                :on-keydown=\"onFilterKeyDown\">\n                <o-input\n                    v-model=\"filterValue\"\n                    v-bind=\"inputClasses\"\n                    name=\"filter\"\n                    type=\"search\"\n                    role=\"searchbox\"\n                    :tabindex=\"!disabled && !isFocused ? 0 : -1\"\n                    :debounce=\"filterDebounce\"\n                    :placeholder=\"filterPlaceholder\"\n                    :icon=\"filterIcon\"\n                    :pack=\"iconPack\"\n                    :disabled=\"disabled\"\n                    expanded\n                    size=\"small\"\n                    aria-label=\"listbox filter input\"\n                    :aria-owns=\"id + '_list'\"\n                    :aria-activedescendant=\"\n                        focusedItem\n                            ? `${id}-${focusedItem.identifier}`\n                            : undefined\n                    \"\n                    autocomplete=\"off\"\n                    :use-html5-validation=\"false\"\n                    @input=\"onFilterChange\"\n                    @blur=\"onBlur\"\n                    @keydown=\"onFilterKeyDown\" />\n            </slot>\n        </div>\n\n        <component\n            :is=\"optionsGrouped ? 'div' : 'ul'\"\n            :id=\"id + '_list'\"\n            ref=\"listElement\"\n            role=\"listbox\"\n            :tabindex=\"disabled || isFocused ? -1 : 0\"\n            :class=\"listClasses\"\n            :style=\"listStyle\"\n            :aria-multiselectable=\"multiple\"\n            :aria-activedescendant=\"\n                focusedItem ? `${id}-${focusedItem.identifier}` : undefined\n            \"\n            :aria-label=\"ariaLabel\"\n            :aria-labelledby=\"props.ariaLabelledby ?? parentField?.labelId\"\n            :aria-disabled=\"disabled\"\n            @focusin=\"onFocusin\"\n            @blur=\"onBlur\"\n            @mouseleave=\"focusItem(undefined)\"\n            @keydown=\"onListKeyDown\">\n            <transition-group :name=\"animation\">\n                <slot>\n                    <template\n                        v-for=\"option in normalizedOptions\"\n                        :key=\"option.key\">\n                        <ul v-if=\"isGroupOption(option)\" role=\"group\">\n                            <o-listbox-item\n                                v-bind=\"option.item\"\n                                disabled\n                                role=\"presentation\" />\n\n                            <o-listbox-item\n                                v-for=\"_option in option.options\"\n                                v-bind=\"_option.item\"\n                                :key=\"_option.key\"\n                                :aria-setsize=\"getOptionsLength(option.options)\"\n                                :aria-posinset=\"\n                                    findOptionIndex(option.options, _option) + 1\n                                \" />\n                        </ul>\n\n                        <o-listbox-item\n                            v-else\n                            v-bind=\"option.item\"\n                            :aria-setsize=\"getOptionsLength(normalizedOptions)\"\n                            :aria-posinset=\"\n                                findOptionIndex(normalizedOptions, option) + 1\n                            \" />\n                    </template>\n                </slot>\n            </transition-group>\n        </component>\n\n        <transition :name=\"animation\">\n            <div\n                v-if=\"!hasViableItems && ($slots.empty || emptyLabel)\"\n                :class=\"emptyClasses\">\n                <slot name=\"empty\">\n                    {{ emptyLabel }}\n                </slot>\n            </div>\n        </transition>\n\n        <div v-if=\"$slots.footer\" :class=\"footerClasses\">\n            <slot name=\"footer\" />\n        </div>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T, IsMultiple extends boolean = false\">\nimport {\n    computed,\n    ref,\n    toValue,\n    useId,\n    useTemplateRef,\n    watch,\n    watchEffect,\n} from \"vue\";\n\nimport OListboxItem from \"./ListItem.vue\";\nimport OInput from \"@/components/input/Input.vue\";\n\nimport {\n    alternateArray,\n    isDefined,\n    isEmpty,\n    isEqual,\n    isPrintableCharacter,\n    isTrueish,\n    mod,\n    toCssDimension,\n} from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport { getDefault } from \"@/utils/config\";\nimport {\n    areOptionsGrouped,\n    defineClasses,\n    findOptionIndex,\n    getOptionsLength,\n    isGroupOption,\n    normalizeOptions,\n    scrollElementInView,\n    unrefElement,\n    useIndexer,\n    useProviderParent,\n    useScrollEvents,\n} from \"@/composables\";\n\nimport { injectField } from \"@/components/field/fieldInjection\";\n\nimport type { ListboxProps } from \"./props\";\nimport type { ListItem, ListboxComponent, ListItemComponent } from \"./types\";\n\n/**\n * Listbox is used to select one or more values from a list of items.\n * @displayName Listbox\n * @requires ./ListItem.vue\n * @style _listbox.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OListbox\",\n    configField: \"listbox\",\n});\n\ntype ModelValue = ListboxProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<ListboxProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    options: undefined,\n    scrollHeight: () => getDefault(\"listbox.scrollHeight\", \"225\"),\n    disabled: false,\n    selectable: true,\n    // checkable: false,\n    selectOnFocus: false,\n    emptyLabel: () => getDefault(\"listbox.emptyLabel\"),\n    filterable: false,\n    backendFiltering: false,\n    filter: undefined,\n    filterIcon: () => getDefault(\"listbox.filterIcon\"),\n    filterDebounce: () => getDefault(\"listbox.filterDebounce\", 400),\n    filterPlaceholder: () => getDefault(\"listbox.filterPlaceholder\"),\n    iconPack: () => getDefault(\"listbox.iconPack\"),\n    animation: () => getDefault(\"listbox.animation\", \"fade\"),\n    id: () => useId(),\n    ariaLabel: undefined,\n    ariaLabelledby: undefined,\n    inputClasses: () => getDefault(\"listbox.inputClasses\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown | unknown[]} updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on select event - fired before update:modelValue\n     * @param value {unknown} selected value\n     */\n    select: [value: T];\n    /**\n     * on filter change event\n     * @param value {string} filter value\n     * @param event {Event} native event\n     */\n    filter: [value: string, event: Event];\n    /**\n     * on list focus event\n     * @param event {Event} native event\n     */\n    focus: [event: Event];\n    /**\n     * on list blur event\n     * @param event {Event} native event\n     */\n    blur: [event: Event];\n    /** scrolling inside the list reached the start */\n    \"scroll-start\": [];\n    /** scrolling inside the list reached the end */\n    \"scroll-end\": [];\n}>();\n\ndefineSlots<{\n    /** Define an additional header */\n    header?(): void;\n    /**\n     * Overridet the filter input\n     * @param value {string} - filter input value\n     * @param onChange {(input: string, event: Event): void} - on filter input change event\n     * @param onKeydown {(event: Event): void} - on filter input keydown event\n     */\n    filter?(props: {\n        value: string;\n        onChange: (input: string, event: Event) => void;\n        onKeydown: (event: KeyboardEvent) => void;\n    }): void;\n    /** Define the listbox items here */\n    default?(): void;\n    /** Define the content to show if the list is empty */\n    empty?(): void;\n    /** Define an additional footer */\n    footer?(): void;\n}>();\n\nconst listRef = useTemplateRef<HTMLElement>(\"listElement\");\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// if `id` is given set as `for` property on o-field wrapper\nif (props.id) parentField.value?.setInputId(props.id);\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer, true),\n);\n\n/** determines if the options are grouped or not */\nconst optionsGrouped = computed(() => areOptionsGrouped(normalizedOptions));\n\n// #region --- Child Items ---\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<ListboxComponent<T>>(() => ({\n    id: props.id,\n    disabled: props.disabled,\n    multiple: isTrueish(props.multiple),\n    // checkable: props.checkable,\n    selectable: props.selectable,\n    selected: vmodel.value,\n    focsuedItem: focusedItem.value,\n    selectItem,\n    focusItem,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<\n    ListItemComponent<T>,\n    ListboxComponent<T>\n>({ rootRef: listRef, data: provideData });\n\nconst hasViableItems = computed(() =>\n    childItems.value.some((item) => item.data.isViable),\n);\n\n/**\n * List of child items without disabled or hidden items.\n * Returns empty list when no items are viable or component is disabled.\n */\nconst viableItems = computed(() => {\n    if (!props.selectable || props.disabled) return [];\n    return childItems.value.filter((item) => item.data.isViable);\n});\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(startingIndex: number, delta: 1 | -1): ListItem<T> {\n    let newIndex = mod(\n        focusedItem.value?.index == startingIndex\n            ? startingIndex + delta\n            : startingIndex,\n        childItems.value.length,\n    );\n\n    for (\n        ;\n        newIndex !== focusedItem.value?.index;\n        newIndex = mod(newIndex + delta, childItems.value.length)\n    ) {\n        // Break if the item at this index is viable (not disabled or hidden)\n        if (childItems.value[newIndex].data.isViable) break;\n    }\n\n    return childItems.value[newIndex];\n}\n\n// #endregion --- Child Items ---\n\n// #region --- Scroll Feature ---\n\n// set infinite scroll handler\nif (isClient && props.scrollHeight)\n    useScrollEvents(\n        listRef,\n        {\n            onScrollEnd: () => emits(\"scroll-end\"),\n            onScrollStart: () => emits(\"scroll-start\"),\n        },\n        { passive: true },\n    );\n\nconst listStyle = computed(() => ({\n    maxHeight: toCssDimension(props.scrollHeight),\n    overflow: \"auto\",\n}));\n\n// #endregion --- Scroll Handler ---\n\n// #region --- Select Feature ---\n\n// the selected item value, use v-model to make it two-way binding\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n/** Checks if the value of the given item is part of the modelValue. */\nfunction isItemSelected(item: ListItem<T>): boolean {\n    if (isTrueish(props.multiple)) {\n        if (Array.isArray(vmodel.value))\n            return vmodel.value.some((value) =>\n                isEqual(item.data.value, value),\n            );\n        else return false;\n    } else return isEqual(item.data.value, vmodel.value);\n}\n\n/** Replaces the modelValue when selectable and multiple. */\nfunction updateSelectedItems(items: ListItem<T>[]): void {\n    if (!props.selectable || !isTrueish(props.multiple)) return;\n    const values = items.map((item) => item.data.value).filter(isDefined);\n    vmodel.value = values as ModelValue;\n}\n\n/** Updates the modelValue for one item when selectable. */\nfunction selectItem(item: ListItem<T>, selection: boolean = true): void {\n    if (!props.selectable) return;\n\n    const value = item.data.value!;\n    if (selection) emits(\"select\", value);\n\n    // set selected option\n    if (isTrueish(props.multiple)) {\n        if (vmodel.value && Array.isArray(vmodel.value)) {\n            if (selection && !vmodel.value.includes(value)) {\n                // add a value\n                vmodel.value = [...vmodel.value, value] as ModelValue;\n            } else if (!selection) {\n                // remove a value\n                vmodel.value = vmodel.value.filter(\n                    (val) => val !== value,\n                ) as ModelValue;\n            }\n        } else {\n            // init new value array\n            vmodel.value = (selection ? [value] : []) as ModelValue;\n        }\n    } else {\n        if (!selection) vmodel.value = undefined;\n        else if (vmodel.value !== value) {\n            // update a single value\n            vmodel.value = value as ModelValue;\n        }\n    }\n}\n\n/** Select a range of items from a staring index to an end index. */\nfunction selectItemRange(start: number, end: number): void {\n    if (!props.selectable || !isTrueish(props.multiple)) return;\n    if (start < 0 || end < 0) return;\n\n    const rangeStart = Math.min(start, end);\n    const rangeEnd = Math.max(start, end);\n    const items = childItems.value\n        // get the items by the rande\n        .slice(rangeStart, rangeEnd + 1)\n        // remove not viable items\n        .filter((item) => item.data.isViable);\n\n    // select all items in the range\n    updateSelectedItems(items);\n}\n\n/** Returns the first selected item or undefined started by the given index alternating between the next and previous elements. */\nfunction findFirstSelectedItem(index: number = 0): ListItem<T> | undefined {\n    if (isEmpty(vmodel.value)) return undefined;\n\n    if (isTrueish(props.multiple)) {\n        if (!Array.isArray(vmodel.value)) return undefined;\n        // check index overflow\n        if (index < 0 || index >= childItems.value.length) return undefined;\n\n        // reorders array by alternating between the next and previous elements\n        const items = alternateArray(childItems.value, index)\n            // filter only viable items\n            .filter((item) => item.data.isViable);\n\n        // find first option which is in the selection list\n        return items.find(isItemSelected);\n    } else {\n        const items = childItems.value;\n        // find first option which is in the selection list\n        return items.find(isItemSelected);\n    }\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Focus Feature ---\n\nconst isFocused = ref(false);\nconst focusedItem = ref<ListItem<T>>();\nconst startRangeIndex = ref(-1);\n\n/** Sets the beginn index for an multiselection. */\nfunction startFocusRange(): void {\n    if (isTrueish(props.multiple))\n        startRangeIndex.value = focusedItem.value?.index ?? -1;\n}\n\n/** Set an item as focused element. */\nfunction focusItem(value?: ListItem<T>): void {\n    focusedItem.value = value;\n}\n\n/** Set focus on an item. */\nfunction setFocus(item: ListItem<T>): void {\n    isFocused.value = true;\n    if (props.selectOnFocus && item.data.value) selectItem(item, true);\n\n    // set item as focused\n    focusedItem.value = item;\n\n    // scroll item into view\n    scrollElementInView(listRef, item.el);\n}\n\n/** Select the current focused item. */\nfunction selectFocusedItem(event: KeyboardEvent): void {\n    if (!props.selectable || !focusedItem.value) return;\n\n    // ensure item is in view\n    setFocus(focusedItem.value);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey) {\n        const nearestSelectedItem = findFirstSelectedItem(\n            focusedItem.value.index,\n        );\n        // select from nearest selected option to focused option\n        if (nearestSelectedItem)\n            selectItemRange(focusedItem.value.index, nearestSelectedItem.index);\n    } else\n        // select the item\n        selectItem(focusedItem.value, !isItemSelected(focusedItem.value));\n}\n\n/** Move the focus one element up the list. */\nfunction moveFocusUp(event: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the previous item\n    const delta = -1;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey)\n        selectItemRange(item.index, startRangeIndex.value);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Move the focus one element down the list. */\nfunction moveFocusDown(event: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the next item\n    const delta = 1;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Go to the first viable item. */\nfunction focusFirstItem(event?: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n\n    // get the first item\n    const item = getFirstViableItem(0, 1);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event?.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Go to the last viable item. */\nfunction focusLastItem(event?: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the last item\n    const item = getFirstViableItem(childItems.value.length - 1, -1);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event?.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\nfunction onFocusin(event: FocusEvent): void {\n    // prevent when already focused\n    if (isFocused.value) return;\n\n    if (event.target !== event.currentTarget) {\n        isFocused.value = true;\n\n        // ensure that the list is the real focused element\n        const listElement = unrefElement(listRef);\n        if (listElement) listElement.focus();\n    } else {\n        const firstSelectedItem = findFirstSelectedItem();\n        // when an item is already selected\n        if (firstSelectedItem)\n            // focus this item\n            setFocus(firstSelectedItem);\n        else\n            // else focus first item\n            focusFirstItem();\n    }\n\n    emits(\"focus\", event);\n}\n\nfunction onFocusout(event: FocusEvent): void {\n    // check if focus is still inside the component\n    const listElement = event.currentTarget as HTMLElement;\n    const newFocus = event.relatedTarget as HTMLElement;\n    if (listElement?.contains(newFocus)) return;\n    if (listElement?.contains(event.target as Node)) return;\n\n    // clear focus\n    isFocused.value = false;\n    focusedItem.value = undefined;\n    startRangeIndex.value = -1;\n}\n\nfunction onBlur(event: Event): void {\n    // clear focus\n    isFocused.value = false;\n    focusedItem.value = undefined;\n    startRangeIndex.value = -1;\n\n    emits(\"blur\", event);\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Filter Feature ---\n\nfunction onFilterChange(value: string, event: Event): void {\n    emits(\"filter\", value, event);\n\n    focusedItem.value = undefined;\n    startRangeIndex.value = -1;\n}\n\nconst filterValue = ref<string>(\"\");\n\n// if not backend filtered\nif (!props.backendFiltering) {\n    // update the hidden state for every item based on filter value\n    watchEffect(() => {\n        if (!props.filterable) return;\n\n        childItems.value.forEach((item) => {\n            if (!item.data) return;\n\n            // prevent filtering for presentation items\n            if ((item.data as any).role === \"presentation\") return;\n\n            // no filter means not hidden\n            if (!filterValue.value) {\n                item.data.setHidden(false);\n                return;\n            }\n\n            const isVisible =\n                typeof props.filter === \"function\"\n                    ? // call filter function if available\n                      props.filter(item.data.value!, toValue(filterValue))\n                    : // else check filter value matches item value\n                      item.data.matches(toValue(filterValue));\n\n            // update hidden state\n            item.data.setHidden(!isVisible);\n        });\n    });\n}\n\n// #endregion --- Filter Handler ---\n\n// #region --- Type-Ahead Feature ---\n\nconst typeAheadValue = ref(\"\");\nlet searchTimeout: ReturnType<typeof setTimeout> | undefined;\n\n// on type-ahead value change\nwatch(typeAheadValue, (value) => {\n    // clear old timeout\n    if (searchTimeout) clearTimeout(searchTimeout);\n\n    // when value is not empty\n    if (!isEmpty(value)) {\n        // find first item that starts with the search value\n        const matchedItem = viableItems.value.find((item) =>\n            item.data.matches(value),\n        );\n\n        if (matchedItem)\n            // focus the item\n            setFocus(matchedItem);\n    }\n\n    // set timeout to search value get cleared\n    searchTimeout = setTimeout(() => {\n        typeAheadValue.value = \"\";\n        searchTimeout = undefined;\n    }, 500);\n});\n\n// #endregion --- Type-Ahead Feature ---\n\n// #region --- Keyboard Listener ---\n\nfunction onListKeyDown(event: KeyboardEvent): void {\n    const metaKey = event.metaKey || event.ctrlKey;\n\n    switch (event.code) {\n        case \"ArrowDown\":\n            moveFocusDown(event);\n            event.preventDefault();\n            break;\n\n        case \"ArrowUp\":\n            moveFocusUp(event);\n            event.preventDefault();\n            break;\n\n        case \"Home\":\n            focusFirstItem(event);\n            event.preventDefault();\n            break;\n\n        case \"End\":\n            focusLastItem(event);\n            event.preventDefault();\n            break;\n\n        case \"Enter\":\n        case \"NumpadEnter\":\n        case \"Space\":\n            selectFocusedItem(event);\n            event.preventDefault();\n            break;\n\n        case \"Tab\":\n            //NOOP\n            break;\n\n        case \"ShiftLeft\":\n        case \"ShiftRight\":\n            startFocusRange();\n            break;\n\n        default:\n            if (isTrueish(props.multiple) && event.code === \"KeyA\" && metaKey) {\n                // select all avaibale items\n                updateSelectedItems(viableItems.value);\n                event.preventDefault();\n                break;\n            }\n\n            if (!metaKey && isPrintableCharacter(event.key)) {\n                // append event key char to previus searched chars\n                typeAheadValue.value = (typeAheadValue.value || \"\") + event.key;\n                event.preventDefault();\n            }\n\n            break;\n    }\n}\n\nfunction onFilterKeyDown(event: KeyboardEvent): void {\n    switch (event.code) {\n        case \"ArrowDown\":\n            moveFocusDown(event);\n            event.preventDefault();\n            break;\n\n        case \"ArrowUp\":\n            moveFocusUp(event);\n            event.preventDefault();\n            break;\n\n        case \"Home\":\n            focusFirstItem(event);\n            event.preventDefault();\n            break;\n\n        case \"End\":\n            focusLastItem(event);\n            event.preventDefault();\n            break;\n\n        case \"Enter\":\n        case \"NumpadEnter\":\n            selectFocusedItem(event);\n            break;\n\n        case \"ShiftLeft\":\n        case \"ShiftRight\":\n            startFocusRange();\n            break;\n\n        default:\n            break;\n    }\n}\n\n// #endregion --- Keyboard Listener ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-listbox\"],\n    [\n        \"disabledClass\",\n        \"o-listbox--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"selectableClass\",\n        \"o-listbox--selectable\",\n        null,\n        computed(() => props.selectable),\n    ],\n    [\n        \"filterableClass\",\n        \"o-listbox--filterable\",\n        null,\n        computed(() => props.filterable),\n    ],\n    [\n        \"multipleClass\",\n        \"o-listbox--multiple\",\n        null,\n        computed(() => !!props.multiple),\n    ],\n);\n\nconst headerClasses = defineClasses([\"headerClass\", \"o-listbox__header\"]);\n\nconst footerClasses = defineClasses([\"footerClass\", \"o-listbox__footer\"]);\n\nconst filterClasses = defineClasses([\"filterClass\", \"o-listbox__filter\"]);\n\nconst listClasses = defineClasses([\"listClass\", \"o-listbox__list\"]);\n\nconst emptyClasses = defineClasses([\"emptyClass\", \"o-listbox__empty\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div\n        data-oruga=\"listbox\"\n        :class=\"rootClasses\"\n        @focusout=\"onFocusout\"\n        @mouseleave=\"isFocused && onFocusout($event)\">\n        <div v-if=\"$slots.header\" :class=\"headerClasses\">\n            <slot name=\"header\" />\n        </div>\n\n        <div v-if=\"filterable\" :class=\"filterClasses\">\n            <slot\n                name=\"filter\"\n                :value=\"filterValue\"\n                :on-change=\"onFilterChange\"\n                :on-keydown=\"onFilterKeyDown\">\n                <o-input\n                    v-model=\"filterValue\"\n                    v-bind=\"inputClasses\"\n                    name=\"filter\"\n                    type=\"search\"\n                    role=\"searchbox\"\n                    :tabindex=\"!disabled && !isFocused ? 0 : -1\"\n                    :debounce=\"filterDebounce\"\n                    :placeholder=\"filterPlaceholder\"\n                    :icon=\"filterIcon\"\n                    :pack=\"iconPack\"\n                    :disabled=\"disabled\"\n                    expanded\n                    size=\"small\"\n                    aria-label=\"listbox filter input\"\n                    :aria-owns=\"id + '_list'\"\n                    :aria-activedescendant=\"\n                        focusedItem\n                            ? `${id}-${focusedItem.identifier}`\n                            : undefined\n                    \"\n                    autocomplete=\"off\"\n                    :use-html5-validation=\"false\"\n                    @input=\"onFilterChange\"\n                    @blur=\"onBlur\"\n                    @keydown=\"onFilterKeyDown\" />\n            </slot>\n        </div>\n\n        <component\n            :is=\"optionsGrouped ? 'div' : 'ul'\"\n            :id=\"id + '_list'\"\n            ref=\"listElement\"\n            role=\"listbox\"\n            :tabindex=\"disabled || isFocused ? -1 : 0\"\n            :class=\"listClasses\"\n            :style=\"listStyle\"\n            :aria-multiselectable=\"multiple\"\n            :aria-activedescendant=\"\n                focusedItem ? `${id}-${focusedItem.identifier}` : undefined\n            \"\n            :aria-label=\"ariaLabel\"\n            :aria-labelledby=\"props.ariaLabelledby ?? parentField?.labelId\"\n            :aria-disabled=\"disabled\"\n            @focusin=\"onFocusin\"\n            @blur=\"onBlur\"\n            @mouseleave=\"focusItem(undefined)\"\n            @keydown=\"onListKeyDown\">\n            <transition-group :name=\"animation\">\n                <slot>\n                    <template\n                        v-for=\"option in normalizedOptions\"\n                        :key=\"option.key\">\n                        <ul v-if=\"isGroupOption(option)\" role=\"group\">\n                            <o-listbox-item\n                                v-bind=\"option.item\"\n                                disabled\n                                role=\"presentation\" />\n\n                            <o-listbox-item\n                                v-for=\"_option in option.options\"\n                                v-bind=\"_option.item\"\n                                :key=\"_option.key\"\n                                :aria-setsize=\"getOptionsLength(option.options)\"\n                                :aria-posinset=\"\n                                    findOptionIndex(option.options, _option) + 1\n                                \" />\n                        </ul>\n\n                        <o-listbox-item\n                            v-else\n                            v-bind=\"option.item\"\n                            :aria-setsize=\"getOptionsLength(normalizedOptions)\"\n                            :aria-posinset=\"\n                                findOptionIndex(normalizedOptions, option) + 1\n                            \" />\n                    </template>\n                </slot>\n            </transition-group>\n        </component>\n\n        <transition :name=\"animation\">\n            <div\n                v-if=\"!hasViableItems && ($slots.empty || emptyLabel)\"\n                :class=\"emptyClasses\">\n                <slot name=\"empty\">\n                    {{ emptyLabel }}\n                </slot>\n            </div>\n        </transition>\n\n        <div v-if=\"$slots.footer\" :class=\"footerClasses\">\n            <slot name=\"footer\" />\n        </div>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Listbox from \"./Listbox.vue\";\nimport ListItem from \"./ListItem.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export listbox specific types */\nexport type * from \"./props\";\n\n/** export listbox plugin */\nexport default {\n    install(Vue: App): void {\n        registerComponent(Vue, Listbox);\n        registerComponent(Vue, ListItem);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export listbox components */\nexport { Listbox as OListbox, ListItem as OListItem };\n","import {\n    ProgrammaticFactory,\n    type ProgrammaticComponentOptions,\n    type ProgrammaticExpose,\n    type ProgrammaticTarget,\n} from \"../programmatic\";\n\nimport Loading from \"./Loading.vue\";\n\nimport type { LoadingProps } from \"./props\";\n\n// extend the OrugaProgrammatic type with the `loading` programmatic interface\ndeclare module \"../../index\" {\n    interface OrugaProgrammatic {\n        loading: Required<InstanceType<typeof LoadingProgrammaticFactory>>;\n    }\n}\n\nexport type LoadingProgrammaticOptions = Readonly<LoadingProps> &\n    ProgrammaticComponentOptions<typeof Loading>;\n\nexport class LoadingProgrammaticFactory extends ProgrammaticFactory {\n    /**\n     * Create a new programmatic loading component instance.\n     * @param options - Loading label string or loading component props object.\n     * @param target - A target container the component get rendered into - default is `document.body`.\n     * @returns ProgrammaticExpose - programmatic component expose interface\n     */\n    public open(\n        options: string | LoadingProgrammaticOptions,\n        target?: ProgrammaticTarget,\n    ): ProgrammaticExpose<typeof Loading> {\n        const _options: LoadingProgrammaticOptions =\n            typeof options === \"string\" ? { label: options } : options;\n\n        const componentProps: LoadingProps = {\n            active: true, // set the active default state to true\n            fullPage: false, // set the full page default state to false\n            ..._options,\n        };\n\n        // create programmatic component\n        return this._create(\n            Loading,\n            {\n                props: componentProps, // component specific props\n                onClose: _options.onClose, // on close event handler\n            },\n            target, // target the component get rendered into\n        );\n    }\n}\n\nexport default function useLoadingProgrammatic(): LoadingProgrammaticFactory {\n    return new LoadingProgrammaticFactory();\n}\n","import type { App } from \"vue\";\n\nimport Loading from \"./Loading.vue\";\nimport useLoadingProgrammatic, {\n    LoadingProgrammaticFactory,\n} from \"./useLoadingProgrammatic\";\n\nimport { registerComponent, registerProgrammatic } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export loading specific types */\nexport type * from \"./props\";\nexport type { LoadingProgrammaticOptions } from \"./useLoadingProgrammatic\";\n\n/** export loading plugin */\nexport default {\n    install(app: App, { oruga }): void {\n        registerComponent(app, Loading);\n        registerProgrammatic(oruga, \"loading\", LoadingProgrammaticFactory);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export loading components & composables */\nexport { Loading as OLoading, useLoadingProgrammatic };\n","import { createVNode, type FunctionalComponent } from \"vue\";\n\n/**\n * Acts much like a regular `<button>` element except that its type defaults to \"button\" even inside forms\n *\n * Useful as a default tag for components that use custom action buttons\n */\nconst PlainButton: FunctionalComponent = (props, { slots, attrs }) =>\n    createVNode(\n        \"button\",\n        {\n            type: \"button\",\n            ...props,\n            ...attrs,\n        },\n        slots.default?.(),\n    );\nexport default PlainButton;\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, useId, useTemplateRef } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport PlainButton from \"../utils/PlainButton\";\n\nimport { getDefault } from \"@/utils/config\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderChild,\n    useProviderParent,\n    type ProviderItem,\n} from \"@/composables\";\n\nimport type {\n    MenuComponent,\n    MenuItemComponent,\n    MenuItemProvider,\n} from \"./types\";\nimport type { MenuItemProps } from \"./props\";\n\n/**\n * A menu list item.\n * @displayName Menu Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OMenuItem\",\n    configField: \"menu\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<MenuItemProps<T>>(), {\n    override: undefined,\n    active: false,\n    // @ts-expect-error string is not assignable of generic type T\n    value: () => useId(),\n    options: undefined,\n    label: undefined,\n    expanded: false,\n    disabled: false,\n    hidden: false,\n    submenuId: () => useId(),\n    icon: undefined,\n    iconPack: () => getDefault(\"menu.iconPack\"),\n    iconSize: () => getDefault(\"menu.iconSize\"),\n    animation: () => getDefault(\"menu.animation\", \"slide\"),\n    tag: () => getDefault(\"menu.itemTag\", PlainButton),\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * onclick event\n     * @param value {unknown} - value prop data\n     * @param event {event} - native event\n     */\n    click: [value: T, event: Event];\n}>();\n\ndefineSlots<{\n    /**\n     * Override the label, default is label prop\n     * @param expanded {boolean} - item expanded state\n     * @param active {boolean} - item active state\n     */\n    label?(props: { expanded: boolean; active: boolean }): void;\n    /** Define submenu items here  */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<MenuItemProvider<T>>(() => ({\n    expanded: isExpanded.value,\n    setExpand,\n    triggerReset,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent({\n    key: \"menu-item\",\n    data: provideData,\n});\n\n/** inject functionalities and data from the parent menu-item component */\nconst menuItem = useProviderChild<MenuItemProvider<T>>(rootRef, {\n    key: \"menu-item\",\n    needParent: false,\n});\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<MenuItemComponent<T>>(() => ({\n    value: props.value,\n    disabled: props.disabled,\n    hidden: props.hidden,\n    parent: menuItem.parent.value,\n    hasChildren: hasChildren.value,\n    expanded: isExpanded.value,\n    setExpand,\n    reset,\n    selectItem,\n}));\n\n/** inject functionalities and data from the parent menu component */\nconst { parent, item } = useProviderChild<\n    MenuComponent<T>,\n    MenuItemComponent<T>\n>(rootRef, { data: providedData });\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, parent.value.indexer),\n);\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst hasChildren = computed(() => !!childItems.value.length);\n\nconst isFocused = computed(\n    () => item.value.identifier === parent.value.focsuedIdentifier,\n);\n\nfunction selectItem(event: Event): void {\n    if (props.disabled || parent.value.disabled) return;\n    triggerReset();\n    isActive.value = !isActive.value;\n    if (parent.value.accordion) isExpanded.value = isActive.value;\n    parent.value.selectItem(isActive.value ? item.value : undefined);\n    emits(\"click\", props.value as T, event);\n}\n\nfunction triggerReset(childs?: ProviderItem<MenuItemComponent<T>>[]): void {\n    // The point of this method is to collect references to the clicked item and any parent,\n    // this way we can skip resetting those elements.\n    if (typeof menuItem.parent.value?.triggerReset === \"function\") {\n        menuItem.parent.value.triggerReset(\n            childs ? [item.value, ...childs] : [item.value],\n        );\n    }\n    // else if not a sub item reset parent menu\n    else if (typeof parent.value.resetMenu === \"function\") {\n        parent.value.resetMenu(childs ? [item.value, ...childs] : [item.value]);\n    }\n}\n\nconst isExpanded = ref(props.expanded);\n// always expand if not accordion feature\nif (!parent.value.accordion) isExpanded.value = true;\n\nfunction setExpand(state: boolean): void {\n    if (!parent.value.accordion) return;\n    isExpanded.value = state;\n\n    if (typeof menuItem.parent.value?.setExpand === \"function\")\n        menuItem.parent.value.setExpand(state);\n}\n\nfunction reset(): void {\n    if (parent.value.accordion) isExpanded.value = false;\n    isActive.value = false;\n}\n\n// #region --- Computed Component Classes ---\n\nconst itemClasses = defineClasses(\n    [\"itemClass\", \"o-menu__item\"],\n    [\"itemActiveClass\", \"o-menu__item--active\", null, isActive],\n    [\"itemFocusedClass\", \"o-menu__item--focused\", null, isFocused],\n    [\n        \"itemDisabledClass\",\n        \"o-menu__item--disabled\",\n        null,\n        computed(() => props.disabled || parent.value.disabled),\n    ],\n);\n\nconst buttonClasses = defineClasses(\n    [\"itemButtonClass\", \"o-menu__item__button\"],\n    [\"itemButtonActiveClass\", \"o-menu__item__button--active\", null, isActive],\n    [\n        \"itemButtonFocusedClass\",\n        \"o-menu__item__button--focused\",\n        null,\n        isFocused,\n    ],\n    [\n        \"itemButtonDisabledClass\",\n        \"o-menu__item__button--disabled\",\n        null,\n        computed(() => props.disabled || parent.value.disabled),\n    ],\n    [\n        \"itemButtonIconClass\",\n        \"o-menu__item__button--icon\",\n        null,\n        computed(() => !!props.icon),\n    ],\n);\n\nconst submenuClasses = defineClasses([\n    \"itemSubmenuClass\",\n    \"o-menu__item__submenu\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <li\n        v-show=\"!hidden\"\n        :id=\"`${parent.menuId}-${item.identifier}`\"\n        ref=\"rootElement\"\n        data-oruga=\"menu-item\"\n        :data-id=\"`menu-${item.identifier}`\"\n        :class=\"itemClasses\"\n        role=\"none\">\n        <component\n            :is=\"tag\"\n            v-bind=\"$attrs\"\n            :class=\"buttonClasses\"\n            :role=\"parent.role + 'item'\"\n            :disabled=\"disabled || parent.disabled\"\n            tabindex=\"-1\"\n            :aria-selected=\"parent.role == 'tree' ? isActive : undefined\"\n            :aria-disabled=\"disabled || parent.disabled\"\n            :aria-expanded=\"hasChildren ? isExpanded : undefined\"\n            :aria-owns=\"hasChildren ? submenuId : undefined\"\n            @click=\"selectItem\"\n            @keydown.enter=\"selectItem\"\n            @keydown.space=\"selectItem\">\n            <o-icon\n                v-if=\"icon\"\n                :icon=\"icon\"\n                :pack=\"iconPack\"\n                :size=\"iconSize\" />\n            <slot name=\"label\" :expanded=\"isExpanded\" :active=\"isActive\">\n                <span>{{ label }}</span>\n            </slot>\n        </component>\n\n        <!-- sub menu items -->\n        <transition v-if=\"$slots.default || options\" :name=\"animation\">\n            <ul\n                v-show=\"isExpanded\"\n                :id=\"submenuId\"\n                :class=\"submenuClasses\"\n                tabindex=\"-1\"\n                role=\"group\">\n                <slot>\n                    <o-menu-item\n                        v-for=\"option in normalizedOptions\"\n                        :key=\"option.key\"\n                        v-bind=\"option.item\" />\n                </slot>\n            </ul>\n        </transition>\n    </li>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, useId, useTemplateRef } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport PlainButton from \"../utils/PlainButton\";\n\nimport { getDefault } from \"@/utils/config\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderChild,\n    useProviderParent,\n    type ProviderItem,\n} from \"@/composables\";\n\nimport type {\n    MenuComponent,\n    MenuItemComponent,\n    MenuItemProvider,\n} from \"./types\";\nimport type { MenuItemProps } from \"./props\";\n\n/**\n * A menu list item.\n * @displayName Menu Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OMenuItem\",\n    configField: \"menu\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<MenuItemProps<T>>(), {\n    override: undefined,\n    active: false,\n    // @ts-expect-error string is not assignable of generic type T\n    value: () => useId(),\n    options: undefined,\n    label: undefined,\n    expanded: false,\n    disabled: false,\n    hidden: false,\n    submenuId: () => useId(),\n    icon: undefined,\n    iconPack: () => getDefault(\"menu.iconPack\"),\n    iconSize: () => getDefault(\"menu.iconSize\"),\n    animation: () => getDefault(\"menu.animation\", \"slide\"),\n    tag: () => getDefault(\"menu.itemTag\", PlainButton),\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * onclick event\n     * @param value {unknown} - value prop data\n     * @param event {event} - native event\n     */\n    click: [value: T, event: Event];\n}>();\n\ndefineSlots<{\n    /**\n     * Override the label, default is label prop\n     * @param expanded {boolean} - item expanded state\n     * @param active {boolean} - item active state\n     */\n    label?(props: { expanded: boolean; active: boolean }): void;\n    /** Define submenu items here  */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<MenuItemProvider<T>>(() => ({\n    expanded: isExpanded.value,\n    setExpand,\n    triggerReset,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent({\n    key: \"menu-item\",\n    data: provideData,\n});\n\n/** inject functionalities and data from the parent menu-item component */\nconst menuItem = useProviderChild<MenuItemProvider<T>>(rootRef, {\n    key: \"menu-item\",\n    needParent: false,\n});\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<MenuItemComponent<T>>(() => ({\n    value: props.value,\n    disabled: props.disabled,\n    hidden: props.hidden,\n    parent: menuItem.parent.value,\n    hasChildren: hasChildren.value,\n    expanded: isExpanded.value,\n    setExpand,\n    reset,\n    selectItem,\n}));\n\n/** inject functionalities and data from the parent menu component */\nconst { parent, item } = useProviderChild<\n    MenuComponent<T>,\n    MenuItemComponent<T>\n>(rootRef, { data: providedData });\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, parent.value.indexer),\n);\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst hasChildren = computed(() => !!childItems.value.length);\n\nconst isFocused = computed(\n    () => item.value.identifier === parent.value.focsuedIdentifier,\n);\n\nfunction selectItem(event: Event): void {\n    if (props.disabled || parent.value.disabled) return;\n    triggerReset();\n    isActive.value = !isActive.value;\n    if (parent.value.accordion) isExpanded.value = isActive.value;\n    parent.value.selectItem(isActive.value ? item.value : undefined);\n    emits(\"click\", props.value as T, event);\n}\n\nfunction triggerReset(childs?: ProviderItem<MenuItemComponent<T>>[]): void {\n    // The point of this method is to collect references to the clicked item and any parent,\n    // this way we can skip resetting those elements.\n    if (typeof menuItem.parent.value?.triggerReset === \"function\") {\n        menuItem.parent.value.triggerReset(\n            childs ? [item.value, ...childs] : [item.value],\n        );\n    }\n    // else if not a sub item reset parent menu\n    else if (typeof parent.value.resetMenu === \"function\") {\n        parent.value.resetMenu(childs ? [item.value, ...childs] : [item.value]);\n    }\n}\n\nconst isExpanded = ref(props.expanded);\n// always expand if not accordion feature\nif (!parent.value.accordion) isExpanded.value = true;\n\nfunction setExpand(state: boolean): void {\n    if (!parent.value.accordion) return;\n    isExpanded.value = state;\n\n    if (typeof menuItem.parent.value?.setExpand === \"function\")\n        menuItem.parent.value.setExpand(state);\n}\n\nfunction reset(): void {\n    if (parent.value.accordion) isExpanded.value = false;\n    isActive.value = false;\n}\n\n// #region --- Computed Component Classes ---\n\nconst itemClasses = defineClasses(\n    [\"itemClass\", \"o-menu__item\"],\n    [\"itemActiveClass\", \"o-menu__item--active\", null, isActive],\n    [\"itemFocusedClass\", \"o-menu__item--focused\", null, isFocused],\n    [\n        \"itemDisabledClass\",\n        \"o-menu__item--disabled\",\n        null,\n        computed(() => props.disabled || parent.value.disabled),\n    ],\n);\n\nconst buttonClasses = defineClasses(\n    [\"itemButtonClass\", \"o-menu__item__button\"],\n    [\"itemButtonActiveClass\", \"o-menu__item__button--active\", null, isActive],\n    [\n        \"itemButtonFocusedClass\",\n        \"o-menu__item__button--focused\",\n        null,\n        isFocused,\n    ],\n    [\n        \"itemButtonDisabledClass\",\n        \"o-menu__item__button--disabled\",\n        null,\n        computed(() => props.disabled || parent.value.disabled),\n    ],\n    [\n        \"itemButtonIconClass\",\n        \"o-menu__item__button--icon\",\n        null,\n        computed(() => !!props.icon),\n    ],\n);\n\nconst submenuClasses = defineClasses([\n    \"itemSubmenuClass\",\n    \"o-menu__item__submenu\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <li\n        v-show=\"!hidden\"\n        :id=\"`${parent.menuId}-${item.identifier}`\"\n        ref=\"rootElement\"\n        data-oruga=\"menu-item\"\n        :data-id=\"`menu-${item.identifier}`\"\n        :class=\"itemClasses\"\n        role=\"none\">\n        <component\n            :is=\"tag\"\n            v-bind=\"$attrs\"\n            :class=\"buttonClasses\"\n            :role=\"parent.role + 'item'\"\n            :disabled=\"disabled || parent.disabled\"\n            tabindex=\"-1\"\n            :aria-selected=\"parent.role == 'tree' ? isActive : undefined\"\n            :aria-disabled=\"disabled || parent.disabled\"\n            :aria-expanded=\"hasChildren ? isExpanded : undefined\"\n            :aria-owns=\"hasChildren ? submenuId : undefined\"\n            @click=\"selectItem\"\n            @keydown.enter=\"selectItem\"\n            @keydown.space=\"selectItem\">\n            <o-icon\n                v-if=\"icon\"\n                :icon=\"icon\"\n                :pack=\"iconPack\"\n                :size=\"iconSize\" />\n            <slot name=\"label\" :expanded=\"isExpanded\" :active=\"isActive\">\n                <span>{{ label }}</span>\n            </slot>\n        </component>\n\n        <!-- sub menu items -->\n        <transition v-if=\"$slots.default || options\" :name=\"animation\">\n            <ul\n                v-show=\"isExpanded\"\n                :id=\"submenuId\"\n                :class=\"submenuClasses\"\n                tabindex=\"-1\"\n                role=\"group\">\n                <slot>\n                    <o-menu-item\n                        v-for=\"option in normalizedOptions\"\n                        :key=\"option.key\"\n                        v-bind=\"option.item\" />\n                </slot>\n            </ul>\n        </transition>\n    </li>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, useId, useTemplateRef } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport OMenuItem from \"../menu/MenuItem.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { mod } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderParent,\n    useIndexer,\n    type ProviderItem,\n} from \"@/composables\";\n\nimport type { MenuChildItem, MenuComponent, MenuItemComponent } from \"./types\";\nimport type { MenuProps } from \"./props\";\n\n/**\n * A simple menu, for any type of vertical navigation.\n * @displayName Menu\n * @requires ./MenuItem.vue\n * @deprecated Since v0.13.0 - use the `OTree` component instead\n * @style _menu.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OMenu\",\n    configField: \"menu\",\n});\n\ntype ModelValue = MenuProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<MenuProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    options: undefined,\n    label: undefined,\n    accordion: true,\n    disabled: false,\n    menuId: () => useId(),\n    labelId: () => useId(),\n    role: () => getDefault(\"menu.role\", \"tree\"),\n    icon: undefined,\n    iconPack: () => getDefault(\"menu.iconPack\"),\n    iconSize: () => getDefault(\"menu.iconSize\"),\n});\n\ndefineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n}>();\n\ndefineSlots<{\n    /**\n     * Override icon and label\n     * @param focused {unknown | undefined} - the focused item value\n     * @param focusedIndex {number | undefined} - index of the focused item\n     * @param selected {unknown | undefined} - the selected item value\n     * @param selectedIndex {number | undefined} - index of the selected item\n     */\n    label?(props: {\n        focused?: MenuItemComponent<T>;\n        focusedIndex?: number;\n        selected?: MenuItemComponent<T>;\n        selectedIndex?: number;\n    }): void;\n    /**\n     * Define menu items here\n     * @param focused {unknown | undefined} - the focused item value\n     * @param focusedIndex {number | undefined} - index of the focused item\n     * @param selected {unknown | undefined} - the selected item value\n     * @param selectedIndex {number | undefined} - index of the selected item\n     */\n    default?(props: {\n        focused?: MenuItemComponent<T>;\n        focusedIndex?: number;\n        selected?: MenuItemComponent<T>;\n        selectedIndex?: number;\n    });\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<MenuComponent<T>>(() => ({\n    focsuedIdentifier: focusedItem.value?.identifier,\n    menuId: props.menuId,\n    accordion: props.accordion,\n    disabled: props.disabled,\n    role: props.role,\n    indexer,\n    resetMenu,\n    selectItem,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<\n    MenuItemComponent<T>,\n    MenuComponent<T>\n>({ rootRef, data: provideData });\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\n/** call reset for every menu item excluding the given one */\nfunction resetMenu(\n    excludedItems: ProviderItem<MenuItemComponent<T>>[] = [],\n): void {\n    childItems.value.forEach((item) => {\n        if (!excludedItems.map((i) => i?.identifier).includes(item.identifier))\n            item.data.reset();\n    });\n}\n\n// #region --- Select Feature ---\n\n/** The selected item value, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nconst selectedItem = ref<MenuChildItem<T>>();\n\nfunction selectItem(\n    item: ProviderItem<MenuItemComponent<T>> | undefined,\n): void {\n    const value = item?.data.value;\n    if (vmodel.value == value) return;\n    vmodel.value = value;\n    selectedItem.value = item;\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Focus Feature ---\n\nconst focusedItem = ref<MenuChildItem<T>>();\n\n/** is any option visible */\nconst isNotEmpty = computed(() => childItems.value.some(isItemViable));\n\nfunction onCollapse(): void {\n    if (!focusedItem.value) return;\n\n    // collapse the item if already expanded\n    if (focusedItem.value.data.expanded)\n        focusedItem.value.data.setExpand(false);\n    // else move focus to the previus item\n    else moveFocus(-1);\n}\n\nfunction onExpend(): void {\n    if (!focusedItem.value) return;\n\n    // expand the item if not already expanded\n    if (focusedItem.value.data.hasChildren && !focusedItem.value.data.expanded)\n        focusedItem.value.data.setExpand(true);\n    // else move focus to the next item\n    else moveFocus(1);\n}\n\n/** Set focus on a dropdown item. */\nfunction setFocus(item: MenuChildItem<T>): void {\n    focusedItem.value = item;\n}\n\n/** Set focus on a tab item. */\nfunction moveFocus(delta: 1 | -1): void {\n    if (!isNotEmpty.value) return;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n    setFocus(item);\n}\n\nfunction onUpPressed(): void {\n    moveFocus(-1);\n}\n\nfunction onDownPressed(): void {\n    moveFocus(1);\n}\n\nfunction onEnter(event: Event): void {\n    if (!focusedItem.value) return;\n    setFocus(focusedItem.value);\n    focusedItem.value.data.selectItem(event);\n}\n\n/** Go to the first viable item */\nfunction onHomePressed(): void {\n    if (!isNotEmpty.value) return;\n    const item = getFirstViableItem(0, 1);\n    setFocus(item);\n}\n\n/** Go to the last viable item */\nfunction onEndPressed(): void {\n    if (!isNotEmpty.value) return;\n    const item = getFirstViableItem(childItems.value.length - 1, -1);\n    setFocus(item);\n}\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(\n    startingIndex: number,\n    delta: 1 | -1,\n): MenuChildItem<T> {\n    let newIndex = mod(\n        focusedItem.value?.index == startingIndex\n            ? startingIndex + delta\n            : startingIndex,\n        childItems.value.length,\n    );\n    for (\n        ;\n        newIndex !== focusedItem.value?.index;\n        newIndex = mod(newIndex + delta, childItems.value.length)\n    ) {\n        // Break if the item at this index is viable (not disabled)\n        if (isItemViable(childItems.value[newIndex])) break;\n    }\n\n    return childItems.value[newIndex];\n}\n\nfunction isItemViable(item: MenuChildItem<T>): boolean {\n    return (\n        !item.data.disabled &&\n        !item.data.hidden &&\n        (item.data.parent?.expanded ?? true)\n    );\n}\n\nfunction onFocusLeave(): void {\n    focusedItem.value = undefined;\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses([\"rootClass\", \"o-menu\"]);\n\nconst listClasses = defineClasses([\"listClass\", \"o-menu__list\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-menu__label\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <nav\n        ref=\"rootElement\"\n        data-oruga=\"menu\"\n        :class=\"rootClasses\"\n        @focusout=\"onFocusLeave\">\n        <div v-if=\"label || $slots.label\" :id=\"labelId\" :class=\"labelClasses\">\n            <slot\n                name=\"label\"\n                :focused=\"focusedItem?.data\"\n                :focused-index=\"focusedItem?.index\"\n                :selected=\"selectedItem?.data\"\n                :selected-index=\"selectedItem?.index\">\n                <o-icon\n                    v-if=\"icon\"\n                    :icon=\"icon\"\n                    :pack=\"iconPack\"\n                    :size=\"iconSize\" />\n                <span>{{ label }}</span>\n            </slot>\n        </div>\n\n        <ul\n            :id=\"menuId\"\n            :class=\"listClasses\"\n            :role=\"role\"\n            :tabindex=\"0\"\n            :aria-labelledby=\"labelId\"\n            @keydown.left=\"onCollapse\"\n            @keydown.right=\"onExpend\"\n            @keydown.enter.prevent=\"onEnter\"\n            @keydown.space.prevent=\"onEnter\"\n            @keydown.up.prevent=\"onUpPressed\"\n            @keydown.down.prevent=\"onDownPressed\"\n            @keydown.home.prevent=\"onHomePressed\"\n            @keydown.end.prevent=\"onEndPressed\">\n            <slot\n                :focused=\"focusedItem?.data\"\n                :focused-index=\"focusedItem?.index\"\n                :selected=\"selectedItem?.data\"\n                :selected-index=\"selectedItem?.index\">\n                <o-menu-item\n                    v-for=\"option in normalizedOptions\"\n                    :key=\"option.key\"\n                    v-bind=\"option.item\" />\n            </slot>\n        </ul>\n    </nav>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, useId, useTemplateRef } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport OMenuItem from \"../menu/MenuItem.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { mod } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderParent,\n    useIndexer,\n    type ProviderItem,\n} from \"@/composables\";\n\nimport type { MenuChildItem, MenuComponent, MenuItemComponent } from \"./types\";\nimport type { MenuProps } from \"./props\";\n\n/**\n * A simple menu, for any type of vertical navigation.\n * @displayName Menu\n * @requires ./MenuItem.vue\n * @deprecated Since v0.13.0 - use the `OTree` component instead\n * @style _menu.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OMenu\",\n    configField: \"menu\",\n});\n\ntype ModelValue = MenuProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<MenuProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    options: undefined,\n    label: undefined,\n    accordion: true,\n    disabled: false,\n    menuId: () => useId(),\n    labelId: () => useId(),\n    role: () => getDefault(\"menu.role\", \"tree\"),\n    icon: undefined,\n    iconPack: () => getDefault(\"menu.iconPack\"),\n    iconSize: () => getDefault(\"menu.iconSize\"),\n});\n\ndefineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n}>();\n\ndefineSlots<{\n    /**\n     * Override icon and label\n     * @param focused {unknown | undefined} - the focused item value\n     * @param focusedIndex {number | undefined} - index of the focused item\n     * @param selected {unknown | undefined} - the selected item value\n     * @param selectedIndex {number | undefined} - index of the selected item\n     */\n    label?(props: {\n        focused?: MenuItemComponent<T>;\n        focusedIndex?: number;\n        selected?: MenuItemComponent<T>;\n        selectedIndex?: number;\n    }): void;\n    /**\n     * Define menu items here\n     * @param focused {unknown | undefined} - the focused item value\n     * @param focusedIndex {number | undefined} - index of the focused item\n     * @param selected {unknown | undefined} - the selected item value\n     * @param selectedIndex {number | undefined} - index of the selected item\n     */\n    default?(props: {\n        focused?: MenuItemComponent<T>;\n        focusedIndex?: number;\n        selected?: MenuItemComponent<T>;\n        selectedIndex?: number;\n    });\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<MenuComponent<T>>(() => ({\n    focsuedIdentifier: focusedItem.value?.identifier,\n    menuId: props.menuId,\n    accordion: props.accordion,\n    disabled: props.disabled,\n    role: props.role,\n    indexer,\n    resetMenu,\n    selectItem,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<\n    MenuItemComponent<T>,\n    MenuComponent<T>\n>({ rootRef, data: provideData });\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\n/** call reset for every menu item excluding the given one */\nfunction resetMenu(\n    excludedItems: ProviderItem<MenuItemComponent<T>>[] = [],\n): void {\n    childItems.value.forEach((item) => {\n        if (!excludedItems.map((i) => i?.identifier).includes(item.identifier))\n            item.data.reset();\n    });\n}\n\n// #region --- Select Feature ---\n\n/** The selected item value, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nconst selectedItem = ref<MenuChildItem<T>>();\n\nfunction selectItem(\n    item: ProviderItem<MenuItemComponent<T>> | undefined,\n): void {\n    const value = item?.data.value;\n    if (vmodel.value == value) return;\n    vmodel.value = value;\n    selectedItem.value = item;\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Focus Feature ---\n\nconst focusedItem = ref<MenuChildItem<T>>();\n\n/** is any option visible */\nconst isNotEmpty = computed(() => childItems.value.some(isItemViable));\n\nfunction onCollapse(): void {\n    if (!focusedItem.value) return;\n\n    // collapse the item if already expanded\n    if (focusedItem.value.data.expanded)\n        focusedItem.value.data.setExpand(false);\n    // else move focus to the previus item\n    else moveFocus(-1);\n}\n\nfunction onExpend(): void {\n    if (!focusedItem.value) return;\n\n    // expand the item if not already expanded\n    if (focusedItem.value.data.hasChildren && !focusedItem.value.data.expanded)\n        focusedItem.value.data.setExpand(true);\n    // else move focus to the next item\n    else moveFocus(1);\n}\n\n/** Set focus on a dropdown item. */\nfunction setFocus(item: MenuChildItem<T>): void {\n    focusedItem.value = item;\n}\n\n/** Set focus on a tab item. */\nfunction moveFocus(delta: 1 | -1): void {\n    if (!isNotEmpty.value) return;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n    setFocus(item);\n}\n\nfunction onUpPressed(): void {\n    moveFocus(-1);\n}\n\nfunction onDownPressed(): void {\n    moveFocus(1);\n}\n\nfunction onEnter(event: Event): void {\n    if (!focusedItem.value) return;\n    setFocus(focusedItem.value);\n    focusedItem.value.data.selectItem(event);\n}\n\n/** Go to the first viable item */\nfunction onHomePressed(): void {\n    if (!isNotEmpty.value) return;\n    const item = getFirstViableItem(0, 1);\n    setFocus(item);\n}\n\n/** Go to the last viable item */\nfunction onEndPressed(): void {\n    if (!isNotEmpty.value) return;\n    const item = getFirstViableItem(childItems.value.length - 1, -1);\n    setFocus(item);\n}\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(\n    startingIndex: number,\n    delta: 1 | -1,\n): MenuChildItem<T> {\n    let newIndex = mod(\n        focusedItem.value?.index == startingIndex\n            ? startingIndex + delta\n            : startingIndex,\n        childItems.value.length,\n    );\n    for (\n        ;\n        newIndex !== focusedItem.value?.index;\n        newIndex = mod(newIndex + delta, childItems.value.length)\n    ) {\n        // Break if the item at this index is viable (not disabled)\n        if (isItemViable(childItems.value[newIndex])) break;\n    }\n\n    return childItems.value[newIndex];\n}\n\nfunction isItemViable(item: MenuChildItem<T>): boolean {\n    return (\n        !item.data.disabled &&\n        !item.data.hidden &&\n        (item.data.parent?.expanded ?? true)\n    );\n}\n\nfunction onFocusLeave(): void {\n    focusedItem.value = undefined;\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses([\"rootClass\", \"o-menu\"]);\n\nconst listClasses = defineClasses([\"listClass\", \"o-menu__list\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-menu__label\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <nav\n        ref=\"rootElement\"\n        data-oruga=\"menu\"\n        :class=\"rootClasses\"\n        @focusout=\"onFocusLeave\">\n        <div v-if=\"label || $slots.label\" :id=\"labelId\" :class=\"labelClasses\">\n            <slot\n                name=\"label\"\n                :focused=\"focusedItem?.data\"\n                :focused-index=\"focusedItem?.index\"\n                :selected=\"selectedItem?.data\"\n                :selected-index=\"selectedItem?.index\">\n                <o-icon\n                    v-if=\"icon\"\n                    :icon=\"icon\"\n                    :pack=\"iconPack\"\n                    :size=\"iconSize\" />\n                <span>{{ label }}</span>\n            </slot>\n        </div>\n\n        <ul\n            :id=\"menuId\"\n            :class=\"listClasses\"\n            :role=\"role\"\n            :tabindex=\"0\"\n            :aria-labelledby=\"labelId\"\n            @keydown.left=\"onCollapse\"\n            @keydown.right=\"onExpend\"\n            @keydown.enter.prevent=\"onEnter\"\n            @keydown.space.prevent=\"onEnter\"\n            @keydown.up.prevent=\"onUpPressed\"\n            @keydown.down.prevent=\"onDownPressed\"\n            @keydown.home.prevent=\"onHomePressed\"\n            @keydown.end.prevent=\"onEndPressed\">\n            <slot\n                :focused=\"focusedItem?.data\"\n                :focused-index=\"focusedItem?.index\"\n                :selected=\"selectedItem?.data\"\n                :selected-index=\"selectedItem?.index\">\n                <o-menu-item\n                    v-for=\"option in normalizedOptions\"\n                    :key=\"option.key\"\n                    v-bind=\"option.item\" />\n            </slot>\n        </ul>\n    </nav>\n</template>\n","import type { App } from \"vue\";\n\nimport Menu from \"./Menu.vue\";\nimport MenuItem from \"./MenuItem.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export menu specific types */\nexport type * from \"./props\";\n\n/** export menu plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Menu);\n        registerComponent(app, MenuItem);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export menu components */\nexport { Menu as OMenu, MenuItem as OMenuItem };\n","<script setup lang=\"ts\" generic=\"C extends Component\">\nimport {\n    ref,\n    computed,\n    watch,\n    nextTick,\n    onMounted,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport CloseButton from \"../utils/CloseButton.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { toCssDimension } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    useClickOutside,\n    useMatchMedia,\n    usePreventScrolling,\n    getTeleportDefault,\n    useTrapFocus,\n    useEventListener,\n} from \"@/composables\";\n\nimport type { ModalProps } from \"./props\";\nimport type { CloseEventArgs } from \"../programmatic\";\n\n/**\n * Classic modal overlay to include any content you may need.\n * @displayName Modal\n * @deprecated Since v0.13.0 - use the `ODialog` component instead\n * @style _modal.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OModal\",\n    configField: \"modal\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<ModalProps<C>>(), {\n    override: undefined,\n    active: false,\n    fullScreen: false,\n    content: undefined,\n    width: () => getDefault(\"modal.width\", 960),\n    animation: () => getDefault(\"modal.animation\", \"zoom-out\"),\n    overlay: () => getDefault(\"modal.overlay\", true),\n    closeable: () => getDefault(\"modal.closeable\", true),\n    closeOnOutside: () => getDefault(\"modal.closeOnOutside\", true),\n    closeOnEscape: () => getDefault(\"modal.closeOnEscape\", true),\n    trapFocus: () => getDefault(\"modal.trapFocus\", true),\n    alert: () => getDefault(\"modal.alert\", false),\n    ariaLabel: () => getDefault(\"modal.ariaLabel\"),\n    autoFocus: () => getDefault(\"modal.autoFocus\", true),\n    iconPack: () => getDefault(\"modal.iconPack\"),\n    closeIcon: () => getDefault(\"modal.closeIcon\", \"close\"),\n    closeIconSize: () => getDefault(\"modal.closeIconSize\", \"medium\"),\n    ariaCloseLabel: () => getDefault(\"modal.ariaCloseLabel\", \"Close\"),\n    mobileBreakpoint: () => getDefault(\"modal.mobileBreakpoint\"),\n    teleport: () => getDefault(\"modal.teleport\", false),\n    clipScroll: () => getDefault(\"modal.clipScroll\", false),\n    component: undefined,\n    props: undefined,\n    events: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on active state changes to false\n     * @param event {Event} - native event\n     */\n    close: [...args: [] | [Event] | CloseEventArgs<C>];\n}>();\n\ndefineSlots<{\n    /**\n     * Modal default content, default is content prop\n     * @param clsoe {(...args): void} - function to close the component\n     */\n    default?(props: {\n        close: (...args: [] | [Event] | CloseEventArgs<C>) => void;\n    }): void;\n    /** Define a custom close icon */\n    close?(): void;\n}>();\n\nconst { vTrapFocus } = useTrapFocus();\n\nconst rootRef = useTemplateRef(\"rootElement\");\nconst contentRef = useTemplateRef(\"contentElement\");\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst _teleport = computed(() =>\n    typeof props.teleport === \"boolean\"\n        ? { to: getTeleportDefault(), disabled: !props.teleport }\n        : { to: props.teleport, disabled: false },\n);\n\nconst customStyle = computed(() =>\n    !props.fullScreen ? { maxWidth: toCssDimension(props.width) } : null,\n);\n\nconst toggleScroll = usePreventScrolling(props.clipScroll);\n\nwatch(isActive, (value) => {\n    if (props.overlay) toggleScroll(value);\n    // if autoFocus focus the element\n    if (value && props.autoFocus)\n        nextTick(() => {\n            if (rootRef.value) rootRef.value.focus();\n        });\n});\n\nonMounted(() => {\n    if (isActive.value && props.overlay) toggleScroll(isActive.value);\n});\n\n// #region --- Events Feature ---\n\nconst showX = computed(() => props.closeable);\n\nif (isClient) {\n    // register onKeyup event listener when is active\n    useEventListener(rootRef, \"keyup\", onKeyup, { trigger: isActive });\n\n    if (!props.overlay)\n        // register outside click event listener when is active\n        useClickOutside(contentRef, onClickedOutside, {\n            trigger: isActive,\n        });\n}\n\n/** Keyup event listener that is bound to the root element. */\nfunction onKeyup(event: KeyboardEvent): void {\n    if (!props.closeOnEscape) return;\n    if (!isActive.value) return;\n    if (event.key === \"Escape\" || event.key === \"Esc\") close(event);\n}\n\n/** Click outside event listener. */\nfunction onClickedOutside(event: Event): void {\n    if (!props.closeOnOutside) return;\n    if (!isActive.value || !isAnimated.value) return;\n    if (\n        props.overlay ||\n        (contentRef.value && !event.composedPath().includes(contentRef.value))\n    )\n        event.preventDefault();\n    close(event);\n}\n\n/** set active to false and emit close event */\nfunction close(...args: [] | [Event] | CloseEventArgs<C>): void {\n    isActive.value = false;\n    emits(\"close\", ...args);\n}\n\n// #endregion --- Events Feature ---\n\n// #region --- Animation Feature ---\n\nconst isAnimated = ref(props.active);\n\n/** Transition after-enter hook */\nfunction afterEnter(): void {\n    isAnimated.value = true;\n}\n\n/** Transition before-leave hook */\nfunction beforeLeave(): void {\n    isAnimated.value = false;\n}\n\n// #endregion --- Animation Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-modal\"],\n    [\"mobileClass\", \"o-modal--mobile\", null, isMobile],\n    [\"activeClass\", \"o-modal--active\", null, isActive],\n);\n\nconst overlayClasses = defineClasses([\"overlayClass\", \"o-modal__overlay\"]);\n\nconst contentClasses = defineClasses(\n    [\"contentClass\", \"o-modal__content\"],\n    [\n        \"fullScreenClass\",\n        \"o-modal__content--full-screen\",\n        null,\n        computed(() => props.fullScreen),\n    ],\n);\n\nconst closeClasses = defineClasses([\"closeClass\", \"o-modal__close\"]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <Teleport :to=\"_teleport.to\" :disabled=\"_teleport.disabled\">\n        <transition\n            :name=\"animation\"\n            @after-enter=\"afterEnter\"\n            @before-leave=\"beforeLeave\">\n            <div\n                v-show=\"isActive\"\n                ref=\"rootElement\"\n                v-bind=\"$attrs\"\n                v-trap-focus=\"trapFocus && isActive\"\n                data-oruga=\"modal\"\n                :class=\"rootClasses\"\n                :tabindex=\"-1\"\n                :role=\"alert ? 'alertdialog' : 'dialog'\"\n                :aria-label=\"ariaLabel\"\n                :aria-modal=\"isActive\">\n                <div\n                    v-if=\"overlay\"\n                    :class=\"overlayClasses\"\n                    tabindex=\"-1\"\n                    @click=\"onClickedOutside\" />\n\n                <div\n                    ref=\"contentElement\"\n                    :class=\"contentClasses\"\n                    :style=\"customStyle\">\n                    <!-- injected component for programmatic usage -->\n                    <component\n                        :is=\"$props.component\"\n                        v-if=\"$props.component\"\n                        v-bind=\"$props.props\"\n                        v-on=\"$props.events || {}\"\n                        @close=\"close\" />\n\n                    <slot v-else :close=\"close\">\n                        <div v-if=\"content\">{{ content }}</div>\n                    </slot>\n\n                    <CloseButton\n                        v-if=\"showX\"\n                        v-show=\"isAnimated\"\n                        :pack=\"iconPack\"\n                        :icon=\"closeIcon\"\n                        :size=\"closeIconSize\"\n                        :label=\"ariaCloseLabel\"\n                        :classes=\"closeClasses\"\n                        @click=\"close($event)\">\n                        <slot v-if=\"$slots['close']\" name=\"close\" />\n                    </CloseButton>\n                </div>\n            </div>\n        </transition>\n    </Teleport>\n</template>\n","<script setup lang=\"ts\" generic=\"C extends Component\">\nimport {\n    ref,\n    computed,\n    watch,\n    nextTick,\n    onMounted,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport CloseButton from \"../utils/CloseButton.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { toCssDimension } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    useClickOutside,\n    useMatchMedia,\n    usePreventScrolling,\n    getTeleportDefault,\n    useTrapFocus,\n    useEventListener,\n} from \"@/composables\";\n\nimport type { ModalProps } from \"./props\";\nimport type { CloseEventArgs } from \"../programmatic\";\n\n/**\n * Classic modal overlay to include any content you may need.\n * @displayName Modal\n * @deprecated Since v0.13.0 - use the `ODialog` component instead\n * @style _modal.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OModal\",\n    configField: \"modal\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<ModalProps<C>>(), {\n    override: undefined,\n    active: false,\n    fullScreen: false,\n    content: undefined,\n    width: () => getDefault(\"modal.width\", 960),\n    animation: () => getDefault(\"modal.animation\", \"zoom-out\"),\n    overlay: () => getDefault(\"modal.overlay\", true),\n    closeable: () => getDefault(\"modal.closeable\", true),\n    closeOnOutside: () => getDefault(\"modal.closeOnOutside\", true),\n    closeOnEscape: () => getDefault(\"modal.closeOnEscape\", true),\n    trapFocus: () => getDefault(\"modal.trapFocus\", true),\n    alert: () => getDefault(\"modal.alert\", false),\n    ariaLabel: () => getDefault(\"modal.ariaLabel\"),\n    autoFocus: () => getDefault(\"modal.autoFocus\", true),\n    iconPack: () => getDefault(\"modal.iconPack\"),\n    closeIcon: () => getDefault(\"modal.closeIcon\", \"close\"),\n    closeIconSize: () => getDefault(\"modal.closeIconSize\", \"medium\"),\n    ariaCloseLabel: () => getDefault(\"modal.ariaCloseLabel\", \"Close\"),\n    mobileBreakpoint: () => getDefault(\"modal.mobileBreakpoint\"),\n    teleport: () => getDefault(\"modal.teleport\", false),\n    clipScroll: () => getDefault(\"modal.clipScroll\", false),\n    component: undefined,\n    props: undefined,\n    events: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on active state changes to false\n     * @param event {Event} - native event\n     */\n    close: [...args: [] | [Event] | CloseEventArgs<C>];\n}>();\n\ndefineSlots<{\n    /**\n     * Modal default content, default is content prop\n     * @param clsoe {(...args): void} - function to close the component\n     */\n    default?(props: {\n        close: (...args: [] | [Event] | CloseEventArgs<C>) => void;\n    }): void;\n    /** Define a custom close icon */\n    close?(): void;\n}>();\n\nconst { vTrapFocus } = useTrapFocus();\n\nconst rootRef = useTemplateRef(\"rootElement\");\nconst contentRef = useTemplateRef(\"contentElement\");\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst _teleport = computed(() =>\n    typeof props.teleport === \"boolean\"\n        ? { to: getTeleportDefault(), disabled: !props.teleport }\n        : { to: props.teleport, disabled: false },\n);\n\nconst customStyle = computed(() =>\n    !props.fullScreen ? { maxWidth: toCssDimension(props.width) } : null,\n);\n\nconst toggleScroll = usePreventScrolling(props.clipScroll);\n\nwatch(isActive, (value) => {\n    if (props.overlay) toggleScroll(value);\n    // if autoFocus focus the element\n    if (value && props.autoFocus)\n        nextTick(() => {\n            if (rootRef.value) rootRef.value.focus();\n        });\n});\n\nonMounted(() => {\n    if (isActive.value && props.overlay) toggleScroll(isActive.value);\n});\n\n// #region --- Events Feature ---\n\nconst showX = computed(() => props.closeable);\n\nif (isClient) {\n    // register onKeyup event listener when is active\n    useEventListener(rootRef, \"keyup\", onKeyup, { trigger: isActive });\n\n    if (!props.overlay)\n        // register outside click event listener when is active\n        useClickOutside(contentRef, onClickedOutside, {\n            trigger: isActive,\n        });\n}\n\n/** Keyup event listener that is bound to the root element. */\nfunction onKeyup(event: KeyboardEvent): void {\n    if (!props.closeOnEscape) return;\n    if (!isActive.value) return;\n    if (event.key === \"Escape\" || event.key === \"Esc\") close(event);\n}\n\n/** Click outside event listener. */\nfunction onClickedOutside(event: Event): void {\n    if (!props.closeOnOutside) return;\n    if (!isActive.value || !isAnimated.value) return;\n    if (\n        props.overlay ||\n        (contentRef.value && !event.composedPath().includes(contentRef.value))\n    )\n        event.preventDefault();\n    close(event);\n}\n\n/** set active to false and emit close event */\nfunction close(...args: [] | [Event] | CloseEventArgs<C>): void {\n    isActive.value = false;\n    emits(\"close\", ...args);\n}\n\n// #endregion --- Events Feature ---\n\n// #region --- Animation Feature ---\n\nconst isAnimated = ref(props.active);\n\n/** Transition after-enter hook */\nfunction afterEnter(): void {\n    isAnimated.value = true;\n}\n\n/** Transition before-leave hook */\nfunction beforeLeave(): void {\n    isAnimated.value = false;\n}\n\n// #endregion --- Animation Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-modal\"],\n    [\"mobileClass\", \"o-modal--mobile\", null, isMobile],\n    [\"activeClass\", \"o-modal--active\", null, isActive],\n);\n\nconst overlayClasses = defineClasses([\"overlayClass\", \"o-modal__overlay\"]);\n\nconst contentClasses = defineClasses(\n    [\"contentClass\", \"o-modal__content\"],\n    [\n        \"fullScreenClass\",\n        \"o-modal__content--full-screen\",\n        null,\n        computed(() => props.fullScreen),\n    ],\n);\n\nconst closeClasses = defineClasses([\"closeClass\", \"o-modal__close\"]);\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <Teleport :to=\"_teleport.to\" :disabled=\"_teleport.disabled\">\n        <transition\n            :name=\"animation\"\n            @after-enter=\"afterEnter\"\n            @before-leave=\"beforeLeave\">\n            <div\n                v-show=\"isActive\"\n                ref=\"rootElement\"\n                v-bind=\"$attrs\"\n                v-trap-focus=\"trapFocus && isActive\"\n                data-oruga=\"modal\"\n                :class=\"rootClasses\"\n                :tabindex=\"-1\"\n                :role=\"alert ? 'alertdialog' : 'dialog'\"\n                :aria-label=\"ariaLabel\"\n                :aria-modal=\"isActive\">\n                <div\n                    v-if=\"overlay\"\n                    :class=\"overlayClasses\"\n                    tabindex=\"-1\"\n                    @click=\"onClickedOutside\" />\n\n                <div\n                    ref=\"contentElement\"\n                    :class=\"contentClasses\"\n                    :style=\"customStyle\">\n                    <!-- injected component for programmatic usage -->\n                    <component\n                        :is=\"$props.component\"\n                        v-if=\"$props.component\"\n                        v-bind=\"$props.props\"\n                        v-on=\"$props.events || {}\"\n                        @close=\"close\" />\n\n                    <slot v-else :close=\"close\">\n                        <div v-if=\"content\">{{ content }}</div>\n                    </slot>\n\n                    <CloseButton\n                        v-if=\"showX\"\n                        v-show=\"isAnimated\"\n                        :pack=\"iconPack\"\n                        :icon=\"closeIcon\"\n                        :size=\"closeIconSize\"\n                        :label=\"ariaCloseLabel\"\n                        :classes=\"closeClasses\"\n                        @click=\"close($event)\">\n                        <slot v-if=\"$slots['close']\" name=\"close\" />\n                    </CloseButton>\n                </div>\n            </div>\n        </transition>\n    </Teleport>\n</template>\n","import { type Component } from \"vue\";\nimport {\n    ProgrammaticFactory,\n    type ProgrammaticComponentOptions,\n    type ProgrammaticExpose,\n    type ProgrammaticTarget,\n} from \"../programmatic\";\n\nimport Modal from \"./Modal.vue\";\n\nimport type { ModalProps } from \"./props\";\n\n// extend the OrugaProgrammatic type with the `modal` programmatic interface\ndeclare module \"../../index\" {\n    interface OrugaProgrammatic {\n        modal: Required<InstanceType<typeof ModalProgrammaticFactory>>;\n    }\n}\n\nexport type ModalProgrammaticOptions<C extends Component> = Readonly<\n    ModalProps<C>\n> &\n    ProgrammaticComponentOptions<typeof Modal<C>>;\n\nexport class ModalProgrammaticFactory extends ProgrammaticFactory {\n    /**\n     * Create a new programmatic modal component instance.\n     * @param options - Modal content string or modal component props object.\n     * @param target - A target container the component get rendered into - default is `document.body`.\n     * @returns ProgrammaticExpose - programmatic component expose interface\n     */\n    open<C extends Component>(\n        options: string | ModalProgrammaticOptions<C>,\n        target?: ProgrammaticTarget,\n    ): ProgrammaticExpose<typeof Modal<C>> {\n        const _options: ModalProgrammaticOptions<C> =\n            typeof options === \"string\" ? { content: options } : options;\n\n        const componentProps: ModalProps<C> = {\n            active: true, // set the active default state to true\n            ..._options,\n        };\n\n        // create programmatic component\n        return this._create(\n            Modal,\n            {\n                props: componentProps, // component specific props\n                onClose: _options.onClose, // on close event handler\n            },\n            target, // target the component get rendered into\n        );\n    }\n}\n\nexport default function useModalProgrammatic(): ModalProgrammaticFactory {\n    return new ModalProgrammaticFactory();\n}\n","import type { App } from \"vue\";\n\nimport Modal from \"./Modal.vue\";\nimport useModalProgrammatic, {\n    ModalProgrammaticFactory,\n} from \"./useModalProgrammatic\";\n\nimport { registerComponent, registerProgrammatic } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export modal specific types */\nexport type * from \"./props\";\nexport type { ModalProgrammaticOptions } from \"./useModalProgrammatic\";\n\n/** export modal plugin */\nexport default {\n    install(app: App, { oruga }): void {\n        registerComponent(app, Modal);\n        registerProgrammatic(oruga, \"modal\", ModalProgrammaticFactory);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export modal components & composables */\nexport { Modal as OModal, useModalProgrammatic };\n","<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport CloseButton from \"../utils/CloseButton.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { NotificationProps } from \"./props\";\n\n/**\n * Bold notification blocks to alert your users of something.\n * @displayName Notification\n * @requires ./NotificationNotice.vue\n * @style _notification.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ONotification\",\n    configField: \"notification\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<NotificationProps>(), {\n    override: undefined,\n    message: undefined,\n    active: true,\n    type: undefined,\n    variant: () => getDefault(\"notification.variant\"),\n    rounded: () => getDefault(\"notification.rounded\"),\n    position: () => getDefault(\"notification.position\", \"top\"),\n    animation: () => getDefault(\"notification.animation\", \"fade\"),\n    icon: undefined,\n    iconPack: () => getDefault(\"notification.iconPack\"),\n    iconSize: () => getDefault(\"notification.iconSize\", \"large\"),\n    closeable: false,\n    closeIcon: () => getDefault(\"notification.closeIcon\", \"close\"),\n    closeIconSize: () => getDefault(\"notification.closeIconSize\"),\n    ariaCloseLabel: () => getDefault(\"notification.ariaCloseLabel\", \"Close\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on component close event\n     * @param event {Event} - native event\n     */\n    close: [...args: [] | [Event]];\n}>();\n\ndefineSlots<{\n    /** Define a custom close icon */\n    close?(): void;\n    /**\n     * Notification inner content, outside of the message container\n     * @param close {(...args: [] | [Event]): void} - function to close the notification\n     */\n    inner?(props: { close: (...args: [] | [Event]) => void }): void;\n    /**\n     * Notification default content, default is message prop\n     * @param close {(...args: [] | [Event]): void} - function to close the notification\n     */\n    default?(props: { close: (...args: [] | [Event]) => void }): void;\n}>();\nconst isActive = defineModel<boolean>(\"active\", { default: true });\n\n/** Icon name (MDI) based on type. */\nconst computedIcon = computed(() => {\n    if (props.icon) return props.icon;\n\n    switch (props.type) {\n        case \"info\":\n            return \"information\";\n        case \"success\":\n            return \"check-circle\";\n        case \"warning\":\n            return \"alert\";\n        case \"danger\":\n            return \"alert-circle\";\n        default:\n            return null;\n    }\n});\n\n/** set active to false and emit close event */\nfunction close(...args: [] | [Event]): void {\n    isActive.value = false;\n    emits(\"close\", ...args);\n}\n\n// #region --- Animation Feature ---\n\nconst isAnimated = ref(props.active);\n\n/** Transition after-enter hook */\nfunction afterEnter(): void {\n    isAnimated.value = true;\n}\n\n/** Transition before-leave hook */\nfunction beforeLeave(): void {\n    isAnimated.value = false;\n}\n\n// #endregion --- Animation Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-notification\"],\n    [\n        \"variantClass\",\n        \"o-notification--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"roundedClass\",\n        \"o-notification--rounded\",\n        null,\n        computed(() => props.rounded),\n    ],\n    [\n        \"positionClass\",\n        \"o-notification--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n);\n\nconst wrapperClasses = defineClasses([\n    \"wrapperClass\",\n    \"o-notification__wrapper\",\n]);\n\nconst iconClasses = defineClasses([\"iconClass\", \"o-notification__icon\"]);\n\nconst contentClasses = defineClasses([\n    \"contentClass\",\n    \"o-notification__content\",\n]);\n\nconst closeClasses = defineClasses([\"closeClass\", \"o-notification__close\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <transition\n        :name=\"animation\"\n        @after-enter=\"afterEnter\"\n        @before-leave=\"beforeLeave\">\n        <article\n            v-show=\"isActive\"\n            v-bind=\"$attrs\"\n            data-oruga=\"notification\"\n            :class=\"rootClasses\">\n            <CloseButton\n                v-if=\"closeable\"\n                v-show=\"isAnimated\"\n                :pack=\"iconPack\"\n                :icon=\"closeIcon\"\n                :size=\"closeIconSize\"\n                :label=\"ariaCloseLabel\"\n                :classes=\"closeClasses\"\n                @click=\"close($event)\">\n                <slot v-if=\"$slots['close']\" name=\"close\" />\n            </CloseButton>\n\n            <slot name=\"inner\" :close=\"close\" />\n\n            <div v-if=\"$slots.default || message\" :class=\"wrapperClasses\">\n                <o-icon\n                    v-if=\"computedIcon\"\n                    :icon=\"computedIcon\"\n                    :pack=\"iconPack\"\n                    :class=\"iconClasses\"\n                    :size=\"iconSize\"\n                    aria-hidden=\"true\" />\n                <div :class=\"contentClasses\">\n                    <slot :close=\"close\">\n                        <span v-if=\"message\">{{ message }} </span>\n                    </slot>\n                </div>\n            </div>\n        </article>\n    </transition>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport CloseButton from \"../utils/CloseButton.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { NotificationProps } from \"./props\";\n\n/**\n * Bold notification blocks to alert your users of something.\n * @displayName Notification\n * @requires ./NotificationNotice.vue\n * @style _notification.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ONotification\",\n    configField: \"notification\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<NotificationProps>(), {\n    override: undefined,\n    message: undefined,\n    active: true,\n    type: undefined,\n    variant: () => getDefault(\"notification.variant\"),\n    rounded: () => getDefault(\"notification.rounded\"),\n    position: () => getDefault(\"notification.position\", \"top\"),\n    animation: () => getDefault(\"notification.animation\", \"fade\"),\n    icon: undefined,\n    iconPack: () => getDefault(\"notification.iconPack\"),\n    iconSize: () => getDefault(\"notification.iconSize\", \"large\"),\n    closeable: false,\n    closeIcon: () => getDefault(\"notification.closeIcon\", \"close\"),\n    closeIconSize: () => getDefault(\"notification.closeIconSize\"),\n    ariaCloseLabel: () => getDefault(\"notification.ariaCloseLabel\", \"Close\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on component close event\n     * @param event {Event} - native event\n     */\n    close: [...args: [] | [Event]];\n}>();\n\ndefineSlots<{\n    /** Define a custom close icon */\n    close?(): void;\n    /**\n     * Notification inner content, outside of the message container\n     * @param close {(...args: [] | [Event]): void} - function to close the notification\n     */\n    inner?(props: { close: (...args: [] | [Event]) => void }): void;\n    /**\n     * Notification default content, default is message prop\n     * @param close {(...args: [] | [Event]): void} - function to close the notification\n     */\n    default?(props: { close: (...args: [] | [Event]) => void }): void;\n}>();\nconst isActive = defineModel<boolean>(\"active\", { default: true });\n\n/** Icon name (MDI) based on type. */\nconst computedIcon = computed(() => {\n    if (props.icon) return props.icon;\n\n    switch (props.type) {\n        case \"info\":\n            return \"information\";\n        case \"success\":\n            return \"check-circle\";\n        case \"warning\":\n            return \"alert\";\n        case \"danger\":\n            return \"alert-circle\";\n        default:\n            return null;\n    }\n});\n\n/** set active to false and emit close event */\nfunction close(...args: [] | [Event]): void {\n    isActive.value = false;\n    emits(\"close\", ...args);\n}\n\n// #region --- Animation Feature ---\n\nconst isAnimated = ref(props.active);\n\n/** Transition after-enter hook */\nfunction afterEnter(): void {\n    isAnimated.value = true;\n}\n\n/** Transition before-leave hook */\nfunction beforeLeave(): void {\n    isAnimated.value = false;\n}\n\n// #endregion --- Animation Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-notification\"],\n    [\n        \"variantClass\",\n        \"o-notification--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"roundedClass\",\n        \"o-notification--rounded\",\n        null,\n        computed(() => props.rounded),\n    ],\n    [\n        \"positionClass\",\n        \"o-notification--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n);\n\nconst wrapperClasses = defineClasses([\n    \"wrapperClass\",\n    \"o-notification__wrapper\",\n]);\n\nconst iconClasses = defineClasses([\"iconClass\", \"o-notification__icon\"]);\n\nconst contentClasses = defineClasses([\n    \"contentClass\",\n    \"o-notification__content\",\n]);\n\nconst closeClasses = defineClasses([\"closeClass\", \"o-notification__close\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <transition\n        :name=\"animation\"\n        @after-enter=\"afterEnter\"\n        @before-leave=\"beforeLeave\">\n        <article\n            v-show=\"isActive\"\n            v-bind=\"$attrs\"\n            data-oruga=\"notification\"\n            :class=\"rootClasses\">\n            <CloseButton\n                v-if=\"closeable\"\n                v-show=\"isAnimated\"\n                :pack=\"iconPack\"\n                :icon=\"closeIcon\"\n                :size=\"closeIconSize\"\n                :label=\"ariaCloseLabel\"\n                :classes=\"closeClasses\"\n                @click=\"close($event)\">\n                <slot v-if=\"$slots['close']\" name=\"close\" />\n            </CloseButton>\n\n            <slot name=\"inner\" :close=\"close\" />\n\n            <div v-if=\"$slots.default || message\" :class=\"wrapperClasses\">\n                <o-icon\n                    v-if=\"computedIcon\"\n                    :icon=\"computedIcon\"\n                    :pack=\"iconPack\"\n                    :class=\"iconClasses\"\n                    :size=\"iconSize\"\n                    aria-hidden=\"true\" />\n                <div :class=\"contentClasses\">\n                    <slot :close=\"close\">\n                        <span v-if=\"message\">{{ message }} </span>\n                    </slot>\n                </div>\n            </div>\n        </article>\n    </transition>\n</template>\n","<script setup lang=\"ts\" generic=\"C extends Component\">\nimport {\n    computed,\n    ref,\n    onMounted,\n    onBeforeMount,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport ONotification from \"./Notification.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, getActiveClasses } from \"@/composables\";\n\nimport type { NotificationNoticeProps } from \"./props\";\nimport type { CloseEventArgs } from \"../programmatic\";\n\n/**\n * Notification Notice is an extension of the Notification component and is used for the programmatic usage.\n * @displayName Notification Notice\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ONotificationNotice\",\n    configField: \"notification\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<NotificationNoticeProps<C>>(), {\n    override: undefined,\n    container: undefined,\n    variant: () => getDefault(\"notification.variant\"),\n    position: () => getDefault(\"notification.position\", \"top\"),\n    duration: () => getDefault(\"notification.duration\", 2000),\n    infinite: false,\n    pauseOnHover: false,\n    queue: () => getDefault(\"notification.queue\"),\n    component: undefined,\n    props: undefined,\n    events: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * on component close event\n     * @param event {Event} - native event\n     */\n    close: [...args: [] | [Event] | CloseEventArgs<C>];\n}>();\n\nconst notificationRef = useTemplateRef(\"notificationComponent\");\n\nconst isActive = ref(true);\n\nconst parentTop = ref<Element | null>(null);\nconst parentBottom = ref<Element | null>(null);\n\n/** Create or inject notice dom container elements. */\nonBeforeMount(() => {\n    if (\n        noticeClasses.value &&\n        positionBottomClasses.value &&\n        positionTopClasses.value\n    ) {\n        const rootClasses = getActiveClasses(noticeClasses.value);\n        const topClasses = getActiveClasses(positionTopClasses.value);\n        const bottomClasses = getActiveClasses(positionBottomClasses.value);\n\n        parentTop.value = props.container.querySelector(\n            `.${rootClasses.join(\".\")}.${topClasses.join(\".\")}`,\n        );\n        parentBottom.value = props.container.querySelector(\n            `.${rootClasses.join(\".\")}.${bottomClasses.join(\".\")}`,\n        );\n\n        if (parentTop.value && parentBottom.value) return;\n\n        // create notices top container if not alread there\n        if (!parentTop.value) {\n            parentTop.value = document.createElement(\"div\");\n            parentTop.value.className = `${rootClasses.join(\n                \" \",\n            )} ${topClasses.join(\" \")}`;\n            parentTop.value.role = \"region\";\n            parentTop.value.ariaLive = \"polite\";\n        }\n\n        // create notices bottom container if not alread there\n        if (!parentBottom.value) {\n            parentBottom.value = document.createElement(\"div\");\n            parentBottom.value.className = `${rootClasses.join(\n                \" \",\n            )} ${bottomClasses.join(\" \")}`;\n            parentBottom.value.role = \"region\";\n            parentBottom.value.ariaLive = \"polite\";\n        }\n\n        // append notices top and bottom container to given container\n        props.container.appendChild(parentTop.value);\n        props.container.appendChild(parentBottom.value);\n\n        if (props.container.tagName !== \"BODY\") {\n            const classes = getActiveClasses(noticeContainerClasses.value);\n            if (classes?.length)\n                classes\n                    .filter((c) => !!c)\n                    .forEach((c: string) => {\n                        parentTop.value?.classList.add(c);\n                        parentBottom.value?.classList.add(c);\n                    });\n        }\n    }\n});\n\nonMounted(() => {\n    showNotice();\n    setAutoClose();\n});\n\nconst correctParent = computed(() => {\n    switch (props.position) {\n        case \"top-right\":\n        case \"top\":\n        case \"top-left\":\n            return parentTop.value;\n\n        case \"bottom-right\":\n        case \"bottom\":\n        case \"bottom-left\":\n            return parentBottom.value;\n        default:\n            return null;\n    }\n});\n\nconst shouldQueue = computed(() =>\n    props.queue && parentTop.value && parentBottom.value\n        ? parentTop.value.childElementCount > 0 ||\n          parentBottom.value.childElementCount > 0\n        : false,\n);\n\nconst isAlert = computed(\n    () => props.variant === \"warning\" || props.variant === \"danger\",\n);\n\n/** move the rendered component template into the correct parent container */\nfunction showNotice(): void {\n    if (!correctParent.value) return;\n\n    if (shouldQueue.value) correctParent.value.innerHTML = \"\";\n    correctParent.value.insertAdjacentElement(\n        \"afterbegin\",\n        notificationRef.value?.$el,\n    );\n}\n\n// --- Auto Close Feature  ---\n\nlet timeout: ReturnType<typeof setTimeout> | undefined;\n\n/** Set timer to auto close message */\nfunction setAutoClose(): void {\n    if (!props.infinite) {\n        // clear old timer\n        if (timeout) clearTimeout(timeout);\n        // set new timer\n        timeout = setTimeout(() => {\n            if (isActive.value) close();\n        }, props.duration);\n    }\n}\n\nlet isPaused = false;\n\nfunction onMouseEnter(): void {\n    if (!props.pauseOnHover || props.infinite) return;\n    isPaused = true;\n    // stop auto close timeout\n    clearTimeout(timeout);\n}\n\nfunction onMouseLeave(event: Event): void {\n    if (isPaused)\n        // close when mouse leave and is paused before\n        close(event);\n}\n\n/** set active to false and emit close event */\nfunction close(...args: [] | [Event] | CloseEventArgs<C>): void {\n    isActive.value = false;\n    if (timeout) clearTimeout(timeout);\n    emits(\"close\", ...args);\n}\n\n// --- Computed Component Classes ---\n\nconst noticeClasses = defineClasses([\"noticeClass\", \"o-notices\"]);\n\nconst positionTopClasses = defineClasses([\n    \"noticePositionClass\",\n    \"o-notices--\",\n    \"top\",\n]);\nconst positionBottomClasses = defineClasses([\n    \"noticePositionClass\",\n    \"o-notices--\",\n    \"bottom\",\n]);\n\nconst noticeContainerClasses = defineClasses([\n    \"noticeContainerClass\",\n    \"o-notices__container\",\n]);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close });\n</script>\n\n<template>\n    <o-notification\n        ref=\"notificationComponent\"\n        v-bind=\"$attrs\"\n        v-model:active=\"isActive\"\n        :override=\"override\"\n        :position=\"position\"\n        :variant=\"variant\"\n        :role=\"isAlert ? 'alert' : 'status'\"\n        :aria-atomic=\"true\"\n        @close=\"close\"\n        @mouseenter=\"onMouseEnter\"\n        @mouseleave=\"onMouseLeave\">\n        <template #inner=\"{ close }\">\n            <!-- injected component for programmatic usage -->\n            <component\n                v-bind=\"$props.props\"\n                :is=\"component\"\n                v-if=\"component\"\n                v-on=\"$props.events || {}\"\n                @close=\"close\" />\n        </template>\n        <slot />\n    </o-notification>\n</template>\n","<script setup lang=\"ts\" generic=\"C extends Component\">\nimport {\n    computed,\n    ref,\n    onMounted,\n    onBeforeMount,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport ONotification from \"./Notification.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, getActiveClasses } from \"@/composables\";\n\nimport type { NotificationNoticeProps } from \"./props\";\nimport type { CloseEventArgs } from \"../programmatic\";\n\n/**\n * Notification Notice is an extension of the Notification component and is used for the programmatic usage.\n * @displayName Notification Notice\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ONotificationNotice\",\n    configField: \"notification\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<NotificationNoticeProps<C>>(), {\n    override: undefined,\n    container: undefined,\n    variant: () => getDefault(\"notification.variant\"),\n    position: () => getDefault(\"notification.position\", \"top\"),\n    duration: () => getDefault(\"notification.duration\", 2000),\n    infinite: false,\n    pauseOnHover: false,\n    queue: () => getDefault(\"notification.queue\"),\n    component: undefined,\n    props: undefined,\n    events: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * on component close event\n     * @param event {Event} - native event\n     */\n    close: [...args: [] | [Event] | CloseEventArgs<C>];\n}>();\n\nconst notificationRef = useTemplateRef(\"notificationComponent\");\n\nconst isActive = ref(true);\n\nconst parentTop = ref<Element | null>(null);\nconst parentBottom = ref<Element | null>(null);\n\n/** Create or inject notice dom container elements. */\nonBeforeMount(() => {\n    if (\n        noticeClasses.value &&\n        positionBottomClasses.value &&\n        positionTopClasses.value\n    ) {\n        const rootClasses = getActiveClasses(noticeClasses.value);\n        const topClasses = getActiveClasses(positionTopClasses.value);\n        const bottomClasses = getActiveClasses(positionBottomClasses.value);\n\n        parentTop.value = props.container.querySelector(\n            `.${rootClasses.join(\".\")}.${topClasses.join(\".\")}`,\n        );\n        parentBottom.value = props.container.querySelector(\n            `.${rootClasses.join(\".\")}.${bottomClasses.join(\".\")}`,\n        );\n\n        if (parentTop.value && parentBottom.value) return;\n\n        // create notices top container if not alread there\n        if (!parentTop.value) {\n            parentTop.value = document.createElement(\"div\");\n            parentTop.value.className = `${rootClasses.join(\n                \" \",\n            )} ${topClasses.join(\" \")}`;\n            parentTop.value.role = \"region\";\n            parentTop.value.ariaLive = \"polite\";\n        }\n\n        // create notices bottom container if not alread there\n        if (!parentBottom.value) {\n            parentBottom.value = document.createElement(\"div\");\n            parentBottom.value.className = `${rootClasses.join(\n                \" \",\n            )} ${bottomClasses.join(\" \")}`;\n            parentBottom.value.role = \"region\";\n            parentBottom.value.ariaLive = \"polite\";\n        }\n\n        // append notices top and bottom container to given container\n        props.container.appendChild(parentTop.value);\n        props.container.appendChild(parentBottom.value);\n\n        if (props.container.tagName !== \"BODY\") {\n            const classes = getActiveClasses(noticeContainerClasses.value);\n            if (classes?.length)\n                classes\n                    .filter((c) => !!c)\n                    .forEach((c: string) => {\n                        parentTop.value?.classList.add(c);\n                        parentBottom.value?.classList.add(c);\n                    });\n        }\n    }\n});\n\nonMounted(() => {\n    showNotice();\n    setAutoClose();\n});\n\nconst correctParent = computed(() => {\n    switch (props.position) {\n        case \"top-right\":\n        case \"top\":\n        case \"top-left\":\n            return parentTop.value;\n\n        case \"bottom-right\":\n        case \"bottom\":\n        case \"bottom-left\":\n            return parentBottom.value;\n        default:\n            return null;\n    }\n});\n\nconst shouldQueue = computed(() =>\n    props.queue && parentTop.value && parentBottom.value\n        ? parentTop.value.childElementCount > 0 ||\n          parentBottom.value.childElementCount > 0\n        : false,\n);\n\nconst isAlert = computed(\n    () => props.variant === \"warning\" || props.variant === \"danger\",\n);\n\n/** move the rendered component template into the correct parent container */\nfunction showNotice(): void {\n    if (!correctParent.value) return;\n\n    if (shouldQueue.value) correctParent.value.innerHTML = \"\";\n    correctParent.value.insertAdjacentElement(\n        \"afterbegin\",\n        notificationRef.value?.$el,\n    );\n}\n\n// --- Auto Close Feature  ---\n\nlet timeout: ReturnType<typeof setTimeout> | undefined;\n\n/** Set timer to auto close message */\nfunction setAutoClose(): void {\n    if (!props.infinite) {\n        // clear old timer\n        if (timeout) clearTimeout(timeout);\n        // set new timer\n        timeout = setTimeout(() => {\n            if (isActive.value) close();\n        }, props.duration);\n    }\n}\n\nlet isPaused = false;\n\nfunction onMouseEnter(): void {\n    if (!props.pauseOnHover || props.infinite) return;\n    isPaused = true;\n    // stop auto close timeout\n    clearTimeout(timeout);\n}\n\nfunction onMouseLeave(event: Event): void {\n    if (isPaused)\n        // close when mouse leave and is paused before\n        close(event);\n}\n\n/** set active to false and emit close event */\nfunction close(...args: [] | [Event] | CloseEventArgs<C>): void {\n    isActive.value = false;\n    if (timeout) clearTimeout(timeout);\n    emits(\"close\", ...args);\n}\n\n// --- Computed Component Classes ---\n\nconst noticeClasses = defineClasses([\"noticeClass\", \"o-notices\"]);\n\nconst positionTopClasses = defineClasses([\n    \"noticePositionClass\",\n    \"o-notices--\",\n    \"top\",\n]);\nconst positionBottomClasses = defineClasses([\n    \"noticePositionClass\",\n    \"o-notices--\",\n    \"bottom\",\n]);\n\nconst noticeContainerClasses = defineClasses([\n    \"noticeContainerClass\",\n    \"o-notices__container\",\n]);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close });\n</script>\n\n<template>\n    <o-notification\n        ref=\"notificationComponent\"\n        v-bind=\"$attrs\"\n        v-model:active=\"isActive\"\n        :override=\"override\"\n        :position=\"position\"\n        :variant=\"variant\"\n        :role=\"isAlert ? 'alert' : 'status'\"\n        :aria-atomic=\"true\"\n        @close=\"close\"\n        @mouseenter=\"onMouseEnter\"\n        @mouseleave=\"onMouseLeave\">\n        <template #inner=\"{ close }\">\n            <!-- injected component for programmatic usage -->\n            <component\n                v-bind=\"$props.props\"\n                :is=\"component\"\n                v-if=\"component\"\n                v-on=\"$props.events || {}\"\n                @close=\"close\" />\n        </template>\n        <slot />\n    </o-notification>\n</template>\n","import type { Component } from \"vue\";\nimport {\n    ProgrammaticFactory,\n    type ProgrammaticComponentOptions,\n    type ProgrammaticExpose,\n    type ProgrammaticTarget,\n} from \"../programmatic\";\nimport { getOption } from \"@/utils/config\";\n\nimport NotificationNotice from \"./NotificationNotice.vue\";\n\nimport type { NotificationProps, NotificationNoticeProps } from \"./props\";\n\n// extend the OrugaProgrammatic type with the `notification` programmatic interface\ndeclare module \"../../index\" {\n    interface OrugaProgrammatic {\n        notification: Required<\n            InstanceType<typeof NotificationProgrammaticFactory>\n        >;\n    }\n}\n\nexport type NotificationProgrammaticOptions<C extends Component> = Readonly<\n    Omit<NotificationNoticeProps<C>, \"container\">\n> &\n    Readonly<NotificationProps> &\n    ProgrammaticComponentOptions<typeof NotificationNotice<C>>;\n\nexport class NotificationProgrammaticFactory extends ProgrammaticFactory {\n    /**\n     * Create a new programmatic notification component instance.\n     * @param options - Notification message string or notification component props object.\n     * @param target - A target container the component get rendered into - default is `document.body`.\n     * @returns ProgrammaticExpose - programmatic component expose interface\n     */\n    public open<C extends Component>(\n        options: string | NotificationProgrammaticOptions<C>,\n        target?: ProgrammaticTarget,\n    ): ProgrammaticExpose<typeof NotificationNotice<C>> {\n        const _options: NotificationProgrammaticOptions<C> =\n            typeof options === \"string\" ? { message: options } : options;\n\n        const componentProps: NotificationProgrammaticOptions<C> = {\n            position: getOption(\"notification.position\", \"top-right\"),\n            ..._options, // pass all props to the internal notification component\n        };\n\n        // create programmatic component\n        return this._create(\n            NotificationNotice,\n            {\n                props: componentProps as NotificationNoticeProps<C>, // component specific props\n                onClose: _options.onClose, // on close event handler\n            },\n            target, // target the component get rendered into\n        );\n    }\n}\n\nexport default function useNotificationProgrammatic(): NotificationProgrammaticFactory {\n    return new NotificationProgrammaticFactory();\n}\n","import type { App } from \"vue\";\n\nimport Notification from \"./Notification.vue\";\nimport NotificationNotice from \"./NotificationNotice.vue\";\nimport useNotificationProgrammatic, {\n    NotificationProgrammaticFactory,\n} from \"./useNotificationProgrammatic\";\n\nimport { registerComponent, registerProgrammatic } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export notification specific types */\nexport type * from \"./props\";\nexport type { NotificationProgrammaticOptions } from \"./useNotificationProgrammatic\";\n\n/** export notification plugin */\nexport default {\n    install(app: App, { oruga }): void {\n        registerComponent(app, Notification);\n        registerProgrammatic(\n            oruga,\n            \"notification\",\n            NotificationProgrammaticFactory,\n        );\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export notification components & composables */\nexport {\n    Notification as ONotification,\n    NotificationNotice as ONotificationNotice,\n    useNotificationProgrammatic,\n};\n","<script setup lang=\"ts\">\nimport { computed, watch, nextTick } from \"vue\";\n\nimport OButton from \"../button/Button.vue\";\nimport PlainButton from \"../utils/PlainButton\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useMatchMedia } from \"@/composables\";\n\nimport type { PaginationProps } from \"./props\";\n\n/**\n * A responsive and flexible paginator navigation.\n * @displayName Pagination\n * @style _pagination.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OPagination\",\n    configField: \"pagination\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<PaginationProps>(), {\n    override: undefined,\n    current: 1,\n    total: undefined,\n    perPage: () => getDefault(\"pagination.perPage\", 20),\n    rangeBefore: 1,\n    rangeAfter: 1,\n    disabled: false,\n    size: () => getDefault(\"pagination.size\"),\n    simple: () => getDefault(\"pagination.simple\", false),\n    rounded: () => getDefault(\"pagination.rounded\", false),\n    position: () => getDefault(\"pagination.position\", \"right\"),\n    buttonTag: () => getDefault(\"pagination.buttonTag\", PlainButton),\n    iconPack: () => getDefault(\"pagination.iconPack\"),\n    iconPrev: () => getDefault(\"pagination.iconPrev\", \"chevron-left\"),\n    iconNext: () => getDefault(\"pagination.iconNext\", \"chevron-right\"),\n    mobileBreakpoint: () => getDefault(\"pagination.mobileBreakpoint\"),\n    ariaNextLabel: () => getDefault(\"pagination.ariaNextLabel\", \"Next page\"),\n    ariaPreviousLabel: () =>\n        getDefault(\"pagination.ariaPreviousLabel\", \"Previous page\"),\n    ariaPageLabel: () => getDefault(\"pagination.ariaPageLabel\", \"Page\"),\n    ariaCurrentLabel: () =>\n        getDefault(\"pagination.ariaCurrentLabel\", \"Current page\"),\n    buttonClasses: () => getDefault(\"pagination.buttonClasses\", {}),\n});\n\nconst emits = defineEmits<{\n    /**\n     * current prop two-way binding\n     * @param value {number} - updated current prop\n     */\n    \"update:current\": [value: number];\n    /**\n     * on current change event\n     * @param value {number} - current value\n     */\n    change: [value: number];\n    /**\n     * on next button event click\n     * @param event {Event} - native click event\n     * @param value {number} - new current value\n     */\n    next: [event: Event, value: number];\n    /**\n     * on previous button event\n     * @param event {Event} - native click event\n     * @param value {number} - new current value\n     */\n    previous: [event: Event, value: number];\n}>();\n\ndefineSlots<{\n    /**\n     * Define a custom pagination button here\n     * @param number {number} - page number\n     * @param isCurrent {boolean} - if page is current\n     * @param onClick {(event: Event): void} - click handler\n     * @param ariaLabel {string} - aria-label attribute\n     */\n    default?(props: {\n        number: number;\n        isCurrent: boolean;\n        onClick: (event: Event) => void;\n        ariaLabel: string;\n    }): void;\n    /**\n     * Define a custom previous button here\n     * @param number {number} - page number\n     * @param isCurrent {boolean} - if page is current\n     * @param onClick {(event: Event): void} - click handler\n     * @param ariaLabel {string} - aria-label attribute\n     */\n    previous?(props: {\n        number: number;\n        isCurrent: boolean;\n        onClick: (event: Event) => void;\n        ariaLabel: string;\n    }): void;\n    /**\n     * Define a custom next button here\n     * @param number {number} - page number\n     * @param isCurrent {boolean} - if page is current\n     * @param onClick {(event: Event): void} - click handler\n     * @param ariaLabel {string} - aria-label attribute\n     */\n    next?(props: {\n        number: number;\n        isCurrent: boolean;\n        onClick: (event: Event) => void;\n        ariaLabel: string;\n    }): void;\n}>();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst currentPage = defineModel<number>(\"current\", { default: 1 });\n\n/** Total page size (count). */\nconst pageCount = computed(() =>\n    Math.ceil((props.total || 0) / Number(props.perPage)),\n);\n\n/** If current page is trying to be greater than page count, set to last. */\nwatch(pageCount, (value) => {\n    if (currentPage.value > value) onLast();\n});\n\n/** First item of the page (count). */\nconst firstItem = computed(() => {\n    const perPage = Number(props.perPage);\n    const firstItem = currentPage.value * perPage - perPage + 1;\n    return firstItem >= 0 ? firstItem : 0;\n});\n\n/** Check if this is the first page. */\nconst isFirst = computed(() => currentPage.value <= 1);\n\n/** Check if first page button should be visible. */\nconst hasFirst = computed(() => currentPage.value >= props.rangeBefore + 2);\n\n/** Check if first ellipsis should be visible. */\nconst hasFirstEllipsis = computed(\n    () => currentPage.value >= props.rangeBefore + 4,\n);\n\n/** Check if this is the last page. */\nconst isLast = computed(() => currentPage.value >= pageCount.value);\n\n/** Check if last page button should be visible. */\nconst hasLast = computed(\n    () => currentPage.value <= pageCount.value - (1 + props.rangeAfter),\n);\n\n/** Check if last ellipsis should be visible. */\nconst hasLastEllipsis = computed(\n    () => currentPage.value < pageCount.value - (2 + props.rangeAfter),\n);\n\n/**\n * Get near pages, 1 before and 1 after the current.\n * Also add the click event to the array.\n */\nconst pagesInRange = computed<ReturnType<typeof getPage>[]>(() => {\n    if (props.simple) return [];\n\n    let left = Math.max(1, currentPage.value - props.rangeBefore);\n    if (left - 1 === 2) {\n        left--; // Do not show the ellipsis if there is only one to hide\n    }\n    let right = Math.min(currentPage.value + props.rangeAfter, pageCount.value);\n    if (pageCount.value - right === 2) {\n        right++; // Do not show the ellipsis if there is only one to hide\n    }\n\n    const pages: ReturnType<typeof getPage>[] = [];\n    for (let i = left; i <= right; i++) {\n        pages.push(getPage(i));\n    }\n    return pages;\n});\n\nconst prevButton = computed(() =>\n    getPage(currentPage.value - 1, props.ariaPreviousLabel, (e, v) =>\n        emits(\"previous\", e, v),\n    ),\n);\n\nconst nextButton = computed(() =>\n    getPage(currentPage.value + 1, props.ariaNextLabel, (e, v) =>\n        emits(\"next\", e, v),\n    ),\n);\n\nconst firstButton = computed(() => getPage(1));\n\nconst lastButton = computed(() => getPage(pageCount.value));\n\n/** Get properties for a page */\nfunction getPage(\n    num: number,\n    ariaLabel?: string,\n    onClick?: (event: Event, value: number) => void,\n): {\n    label: string;\n    number: number;\n    isCurrent: boolean;\n    onClick: (event: Event) => void;\n    ariaLabel: string;\n    ariaCurrent: boolean;\n} {\n    const isCurrent = currentPage.value === num;\n    return {\n        ...props.buttonClasses,\n        isCurrent: isCurrent,\n        number: num,\n        label: String(num),\n        onClick: (event: Event): void => {\n            changePage(num, event);\n            if (onClick) onClick(event, num);\n        },\n        ariaLabel: ariaLabel ?? getAriaPageLabel(num, isCurrent),\n        ariaCurrent: isCurrent,\n    };\n}\n\n/** Get text for aria-label according to page number. */\nfunction getAriaPageLabel(pageNumber: number, isCurrent: boolean): string {\n    if (props.ariaPageLabel && (!isCurrent || !props.ariaCurrentLabel))\n        return props.ariaPageLabel + \" \" + pageNumber + \".\";\n    else if (props.ariaPageLabel && isCurrent && props.ariaCurrentLabel)\n        return (\n            props.ariaCurrentLabel +\n            \", \" +\n            props.ariaPageLabel +\n            \" \" +\n            pageNumber +\n            \".\"\n        );\n    return \"\";\n}\n\n/** Previous button click listener. */\nfunction onPrev(): void {\n    changePage(currentPage.value - 1);\n}\n\n/** Next button click listener. */\nfunction onNext(): void {\n    changePage(currentPage.value + 1);\n}\n\n/** First button click listener. */\nfunction onFirst(): void {\n    changePage(1);\n}\n\n/** Last button click listener. */\nfunction onLast(): void {\n    changePage(pageCount.value);\n}\n\nfunction changePage(page: number, event?: Event): void {\n    if (currentPage.value === page || page < 1 || page > pageCount.value)\n        return;\n    emits(\"change\", page);\n    currentPage.value = page;\n\n    // Set focus on element to keep tab order\n    if (event && event.target)\n        nextTick(() => (event.target as HTMLElement).focus());\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-pagination\"],\n    [\n        \"positionClass\",\n        \"o-pagination--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"sizeClass\",\n        \"o-pagination--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\"simpleClass\", \"o-pagination--simple\", null, computed(() => props.simple)],\n    [\"mobileClass\", \"o-pagination--mobile\", null, isMobile],\n);\n\nconst infoClasses = defineClasses([\"infoClass\", \"o-pagination__info\"]);\n\nconst ellipsisClasses = defineClasses([\n    \"ellipsisClass\",\n    \"o-pagination__ellipsis\",\n]);\n\nconst listClasses = defineClasses([\"listClass\", \"o-pagination__list\"]);\n\nconst listItemClasses = defineClasses([\"listItemClass\", \"o-pagination__item\"]);\n\nconst buttonBaseClasses = defineClasses(\n    [\"buttonClass\", \"o-pagination__button\"],\n    [\n        \"roundedClass\",\n        \"o-pagination__button--rounded\",\n        null,\n        computed(() => props.rounded),\n    ],\n);\n\nconst buttonCurrentClasses = defineClasses([\n    \"buttonCurrentClass\",\n    \"o-pagination__button--current\",\n]);\n\nconst buttonPrevClasses = defineClasses(\n    [\"buttonPrevClass\", \"o-pagination__button-previous\"],\n    [\"buttonDisabledClass\", \"o-pagination__button--disabled\", null, isFirst],\n);\n\nconst buttonNextClasses = defineClasses(\n    [\"buttonNextClass\", \"o-pagination__button-next\"],\n    [\"buttonDisabledClass\", \"o-pagination__button--disabled\", null, isLast],\n);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ last: onLast, first: onFirst, prev: onPrev, next: onNext });\n</script>\n\n<template>\n    <nav data-oruga=\"pagination\" :class=\"rootClasses\">\n        <slot name=\"previous\" v-bind=\"prevButton\">\n            <o-button\n                :tag=\"buttonTag\"\n                v-bind=\"{ ...prevButton, ...buttonClasses }\"\n                :label=\"undefined\"\n                :disabled=\"isFirst || disabled\"\n                :icon-left=\"iconPrev\"\n                :icon-pack=\"iconPack\"\n                :rounded=\"rounded\"\n                :size=\"size\"\n                :class=\"[...buttonBaseClasses, ...buttonPrevClasses]\" />\n        </slot>\n\n        <slot name=\"next\" v-bind=\"nextButton\">\n            <o-button\n                :tag=\"buttonTag\"\n                v-bind=\"{ ...nextButton, ...buttonClasses }\"\n                :label=\"undefined\"\n                :disabled=\"isLast || disabled\"\n                :icon-left=\"iconNext\"\n                :icon-pack=\"iconPack\"\n                :rounded=\"rounded\"\n                :size=\"size\"\n                :class=\"[...buttonBaseClasses, ...buttonNextClasses]\" />\n        </slot>\n\n        <small v-if=\"simple\" :class=\"infoClasses\" aria-live=\"polite\">\n            <template v-if=\"perPage == 1\">\n                {{ firstItem }}\n            </template>\n            <template v-else>\n                {{ firstItem }}-{{\n                    Math.min(currentPage * Number(perPage), total ?? 0)\n                }}\n            </template>\n            / {{ total }}\n        </small>\n\n        <ul v-else :class=\"listClasses\">\n            <!-- First -->\n            <li v-if=\"hasFirst\" :class=\"listItemClasses\">\n                <slot v-bind=\"firstButton\">\n                    <o-button\n                        :tag=\"buttonTag\"\n                        v-bind=\"{ ...firstButton, ...buttonClasses }\"\n                        :variant=\"firstButton.isCurrent ? 'primary' : undefined\"\n                        :disabled=\"disabled\"\n                        :rounded=\"rounded\"\n                        :size=\"size\"\n                        :class=\"[\n                            ...buttonBaseClasses,\n                            ...(firstButton.isCurrent\n                                ? buttonCurrentClasses\n                                : []),\n                        ]\" />\n                </slot>\n            </li>\n\n            <li v-if=\"hasFirstEllipsis\" :class=\"listItemClasses\">\n                <span :class=\"ellipsisClasses\">&hellip;</span>\n            </li>\n\n            <!-- Pages -->\n            <li\n                v-for=\"page in pagesInRange\"\n                :key=\"page.number\"\n                :class=\"listItemClasses\">\n                <slot v-bind=\"page\">\n                    <o-button\n                        :tag=\"buttonTag\"\n                        v-bind=\"{ ...page, ...buttonClasses }\"\n                        :variant=\"page.isCurrent ? 'primary' : undefined\"\n                        :disabled=\"disabled\"\n                        :rounded=\"rounded\"\n                        :size=\"size\"\n                        :class=\"[\n                            ...buttonBaseClasses,\n                            ...(page.isCurrent ? buttonCurrentClasses : []),\n                        ]\" />\n                </slot>\n            </li>\n\n            <!-- Last -->\n            <li v-if=\"hasLastEllipsis\" :class=\"listItemClasses\">\n                <span :class=\"ellipsisClasses\">&hellip;</span>\n            </li>\n\n            <li v-if=\"hasLast\" :class=\"listItemClasses\">\n                <slot v-bind=\"lastButton\">\n                    <o-button\n                        :tag=\"buttonTag\"\n                        v-bind=\"{ ...lastButton, ...buttonClasses }\"\n                        :variant=\"lastButton.isCurrent ? 'primary' : undefined\"\n                        :disabled=\"disabled\"\n                        :rounded=\"rounded\"\n                        :size=\"size\"\n                        :class=\"[\n                            ...buttonBaseClasses,\n                            ...(lastButton.isCurrent\n                                ? buttonCurrentClasses\n                                : []),\n                        ]\" />\n                </slot>\n            </li>\n        </ul>\n    </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, watch, nextTick } from \"vue\";\n\nimport OButton from \"../button/Button.vue\";\nimport PlainButton from \"../utils/PlainButton\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useMatchMedia } from \"@/composables\";\n\nimport type { PaginationProps } from \"./props\";\n\n/**\n * A responsive and flexible paginator navigation.\n * @displayName Pagination\n * @style _pagination.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OPagination\",\n    configField: \"pagination\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<PaginationProps>(), {\n    override: undefined,\n    current: 1,\n    total: undefined,\n    perPage: () => getDefault(\"pagination.perPage\", 20),\n    rangeBefore: 1,\n    rangeAfter: 1,\n    disabled: false,\n    size: () => getDefault(\"pagination.size\"),\n    simple: () => getDefault(\"pagination.simple\", false),\n    rounded: () => getDefault(\"pagination.rounded\", false),\n    position: () => getDefault(\"pagination.position\", \"right\"),\n    buttonTag: () => getDefault(\"pagination.buttonTag\", PlainButton),\n    iconPack: () => getDefault(\"pagination.iconPack\"),\n    iconPrev: () => getDefault(\"pagination.iconPrev\", \"chevron-left\"),\n    iconNext: () => getDefault(\"pagination.iconNext\", \"chevron-right\"),\n    mobileBreakpoint: () => getDefault(\"pagination.mobileBreakpoint\"),\n    ariaNextLabel: () => getDefault(\"pagination.ariaNextLabel\", \"Next page\"),\n    ariaPreviousLabel: () =>\n        getDefault(\"pagination.ariaPreviousLabel\", \"Previous page\"),\n    ariaPageLabel: () => getDefault(\"pagination.ariaPageLabel\", \"Page\"),\n    ariaCurrentLabel: () =>\n        getDefault(\"pagination.ariaCurrentLabel\", \"Current page\"),\n    buttonClasses: () => getDefault(\"pagination.buttonClasses\", {}),\n});\n\nconst emits = defineEmits<{\n    /**\n     * current prop two-way binding\n     * @param value {number} - updated current prop\n     */\n    \"update:current\": [value: number];\n    /**\n     * on current change event\n     * @param value {number} - current value\n     */\n    change: [value: number];\n    /**\n     * on next button event click\n     * @param event {Event} - native click event\n     * @param value {number} - new current value\n     */\n    next: [event: Event, value: number];\n    /**\n     * on previous button event\n     * @param event {Event} - native click event\n     * @param value {number} - new current value\n     */\n    previous: [event: Event, value: number];\n}>();\n\ndefineSlots<{\n    /**\n     * Define a custom pagination button here\n     * @param number {number} - page number\n     * @param isCurrent {boolean} - if page is current\n     * @param onClick {(event: Event): void} - click handler\n     * @param ariaLabel {string} - aria-label attribute\n     */\n    default?(props: {\n        number: number;\n        isCurrent: boolean;\n        onClick: (event: Event) => void;\n        ariaLabel: string;\n    }): void;\n    /**\n     * Define a custom previous button here\n     * @param number {number} - page number\n     * @param isCurrent {boolean} - if page is current\n     * @param onClick {(event: Event): void} - click handler\n     * @param ariaLabel {string} - aria-label attribute\n     */\n    previous?(props: {\n        number: number;\n        isCurrent: boolean;\n        onClick: (event: Event) => void;\n        ariaLabel: string;\n    }): void;\n    /**\n     * Define a custom next button here\n     * @param number {number} - page number\n     * @param isCurrent {boolean} - if page is current\n     * @param onClick {(event: Event): void} - click handler\n     * @param ariaLabel {string} - aria-label attribute\n     */\n    next?(props: {\n        number: number;\n        isCurrent: boolean;\n        onClick: (event: Event) => void;\n        ariaLabel: string;\n    }): void;\n}>();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst currentPage = defineModel<number>(\"current\", { default: 1 });\n\n/** Total page size (count). */\nconst pageCount = computed(() =>\n    Math.ceil((props.total || 0) / Number(props.perPage)),\n);\n\n/** If current page is trying to be greater than page count, set to last. */\nwatch(pageCount, (value) => {\n    if (currentPage.value > value) onLast();\n});\n\n/** First item of the page (count). */\nconst firstItem = computed(() => {\n    const perPage = Number(props.perPage);\n    const firstItem = currentPage.value * perPage - perPage + 1;\n    return firstItem >= 0 ? firstItem : 0;\n});\n\n/** Check if this is the first page. */\nconst isFirst = computed(() => currentPage.value <= 1);\n\n/** Check if first page button should be visible. */\nconst hasFirst = computed(() => currentPage.value >= props.rangeBefore + 2);\n\n/** Check if first ellipsis should be visible. */\nconst hasFirstEllipsis = computed(\n    () => currentPage.value >= props.rangeBefore + 4,\n);\n\n/** Check if this is the last page. */\nconst isLast = computed(() => currentPage.value >= pageCount.value);\n\n/** Check if last page button should be visible. */\nconst hasLast = computed(\n    () => currentPage.value <= pageCount.value - (1 + props.rangeAfter),\n);\n\n/** Check if last ellipsis should be visible. */\nconst hasLastEllipsis = computed(\n    () => currentPage.value < pageCount.value - (2 + props.rangeAfter),\n);\n\n/**\n * Get near pages, 1 before and 1 after the current.\n * Also add the click event to the array.\n */\nconst pagesInRange = computed<ReturnType<typeof getPage>[]>(() => {\n    if (props.simple) return [];\n\n    let left = Math.max(1, currentPage.value - props.rangeBefore);\n    if (left - 1 === 2) {\n        left--; // Do not show the ellipsis if there is only one to hide\n    }\n    let right = Math.min(currentPage.value + props.rangeAfter, pageCount.value);\n    if (pageCount.value - right === 2) {\n        right++; // Do not show the ellipsis if there is only one to hide\n    }\n\n    const pages: ReturnType<typeof getPage>[] = [];\n    for (let i = left; i <= right; i++) {\n        pages.push(getPage(i));\n    }\n    return pages;\n});\n\nconst prevButton = computed(() =>\n    getPage(currentPage.value - 1, props.ariaPreviousLabel, (e, v) =>\n        emits(\"previous\", e, v),\n    ),\n);\n\nconst nextButton = computed(() =>\n    getPage(currentPage.value + 1, props.ariaNextLabel, (e, v) =>\n        emits(\"next\", e, v),\n    ),\n);\n\nconst firstButton = computed(() => getPage(1));\n\nconst lastButton = computed(() => getPage(pageCount.value));\n\n/** Get properties for a page */\nfunction getPage(\n    num: number,\n    ariaLabel?: string,\n    onClick?: (event: Event, value: number) => void,\n): {\n    label: string;\n    number: number;\n    isCurrent: boolean;\n    onClick: (event: Event) => void;\n    ariaLabel: string;\n    ariaCurrent: boolean;\n} {\n    const isCurrent = currentPage.value === num;\n    return {\n        ...props.buttonClasses,\n        isCurrent: isCurrent,\n        number: num,\n        label: String(num),\n        onClick: (event: Event): void => {\n            changePage(num, event);\n            if (onClick) onClick(event, num);\n        },\n        ariaLabel: ariaLabel ?? getAriaPageLabel(num, isCurrent),\n        ariaCurrent: isCurrent,\n    };\n}\n\n/** Get text for aria-label according to page number. */\nfunction getAriaPageLabel(pageNumber: number, isCurrent: boolean): string {\n    if (props.ariaPageLabel && (!isCurrent || !props.ariaCurrentLabel))\n        return props.ariaPageLabel + \" \" + pageNumber + \".\";\n    else if (props.ariaPageLabel && isCurrent && props.ariaCurrentLabel)\n        return (\n            props.ariaCurrentLabel +\n            \", \" +\n            props.ariaPageLabel +\n            \" \" +\n            pageNumber +\n            \".\"\n        );\n    return \"\";\n}\n\n/** Previous button click listener. */\nfunction onPrev(): void {\n    changePage(currentPage.value - 1);\n}\n\n/** Next button click listener. */\nfunction onNext(): void {\n    changePage(currentPage.value + 1);\n}\n\n/** First button click listener. */\nfunction onFirst(): void {\n    changePage(1);\n}\n\n/** Last button click listener. */\nfunction onLast(): void {\n    changePage(pageCount.value);\n}\n\nfunction changePage(page: number, event?: Event): void {\n    if (currentPage.value === page || page < 1 || page > pageCount.value)\n        return;\n    emits(\"change\", page);\n    currentPage.value = page;\n\n    // Set focus on element to keep tab order\n    if (event && event.target)\n        nextTick(() => (event.target as HTMLElement).focus());\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-pagination\"],\n    [\n        \"positionClass\",\n        \"o-pagination--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"sizeClass\",\n        \"o-pagination--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\"simpleClass\", \"o-pagination--simple\", null, computed(() => props.simple)],\n    [\"mobileClass\", \"o-pagination--mobile\", null, isMobile],\n);\n\nconst infoClasses = defineClasses([\"infoClass\", \"o-pagination__info\"]);\n\nconst ellipsisClasses = defineClasses([\n    \"ellipsisClass\",\n    \"o-pagination__ellipsis\",\n]);\n\nconst listClasses = defineClasses([\"listClass\", \"o-pagination__list\"]);\n\nconst listItemClasses = defineClasses([\"listItemClass\", \"o-pagination__item\"]);\n\nconst buttonBaseClasses = defineClasses(\n    [\"buttonClass\", \"o-pagination__button\"],\n    [\n        \"roundedClass\",\n        \"o-pagination__button--rounded\",\n        null,\n        computed(() => props.rounded),\n    ],\n);\n\nconst buttonCurrentClasses = defineClasses([\n    \"buttonCurrentClass\",\n    \"o-pagination__button--current\",\n]);\n\nconst buttonPrevClasses = defineClasses(\n    [\"buttonPrevClass\", \"o-pagination__button-previous\"],\n    [\"buttonDisabledClass\", \"o-pagination__button--disabled\", null, isFirst],\n);\n\nconst buttonNextClasses = defineClasses(\n    [\"buttonNextClass\", \"o-pagination__button-next\"],\n    [\"buttonDisabledClass\", \"o-pagination__button--disabled\", null, isLast],\n);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ last: onLast, first: onFirst, prev: onPrev, next: onNext });\n</script>\n\n<template>\n    <nav data-oruga=\"pagination\" :class=\"rootClasses\">\n        <slot name=\"previous\" v-bind=\"prevButton\">\n            <o-button\n                :tag=\"buttonTag\"\n                v-bind=\"{ ...prevButton, ...buttonClasses }\"\n                :label=\"undefined\"\n                :disabled=\"isFirst || disabled\"\n                :icon-left=\"iconPrev\"\n                :icon-pack=\"iconPack\"\n                :rounded=\"rounded\"\n                :size=\"size\"\n                :class=\"[...buttonBaseClasses, ...buttonPrevClasses]\" />\n        </slot>\n\n        <slot name=\"next\" v-bind=\"nextButton\">\n            <o-button\n                :tag=\"buttonTag\"\n                v-bind=\"{ ...nextButton, ...buttonClasses }\"\n                :label=\"undefined\"\n                :disabled=\"isLast || disabled\"\n                :icon-left=\"iconNext\"\n                :icon-pack=\"iconPack\"\n                :rounded=\"rounded\"\n                :size=\"size\"\n                :class=\"[...buttonBaseClasses, ...buttonNextClasses]\" />\n        </slot>\n\n        <small v-if=\"simple\" :class=\"infoClasses\" aria-live=\"polite\">\n            <template v-if=\"perPage == 1\">\n                {{ firstItem }}\n            </template>\n            <template v-else>\n                {{ firstItem }}-{{\n                    Math.min(currentPage * Number(perPage), total ?? 0)\n                }}\n            </template>\n            / {{ total }}\n        </small>\n\n        <ul v-else :class=\"listClasses\">\n            <!-- First -->\n            <li v-if=\"hasFirst\" :class=\"listItemClasses\">\n                <slot v-bind=\"firstButton\">\n                    <o-button\n                        :tag=\"buttonTag\"\n                        v-bind=\"{ ...firstButton, ...buttonClasses }\"\n                        :variant=\"firstButton.isCurrent ? 'primary' : undefined\"\n                        :disabled=\"disabled\"\n                        :rounded=\"rounded\"\n                        :size=\"size\"\n                        :class=\"[\n                            ...buttonBaseClasses,\n                            ...(firstButton.isCurrent\n                                ? buttonCurrentClasses\n                                : []),\n                        ]\" />\n                </slot>\n            </li>\n\n            <li v-if=\"hasFirstEllipsis\" :class=\"listItemClasses\">\n                <span :class=\"ellipsisClasses\">&hellip;</span>\n            </li>\n\n            <!-- Pages -->\n            <li\n                v-for=\"page in pagesInRange\"\n                :key=\"page.number\"\n                :class=\"listItemClasses\">\n                <slot v-bind=\"page\">\n                    <o-button\n                        :tag=\"buttonTag\"\n                        v-bind=\"{ ...page, ...buttonClasses }\"\n                        :variant=\"page.isCurrent ? 'primary' : undefined\"\n                        :disabled=\"disabled\"\n                        :rounded=\"rounded\"\n                        :size=\"size\"\n                        :class=\"[\n                            ...buttonBaseClasses,\n                            ...(page.isCurrent ? buttonCurrentClasses : []),\n                        ]\" />\n                </slot>\n            </li>\n\n            <!-- Last -->\n            <li v-if=\"hasLastEllipsis\" :class=\"listItemClasses\">\n                <span :class=\"ellipsisClasses\">&hellip;</span>\n            </li>\n\n            <li v-if=\"hasLast\" :class=\"listItemClasses\">\n                <slot v-bind=\"lastButton\">\n                    <o-button\n                        :tag=\"buttonTag\"\n                        v-bind=\"{ ...lastButton, ...buttonClasses }\"\n                        :variant=\"lastButton.isCurrent ? 'primary' : undefined\"\n                        :disabled=\"disabled\"\n                        :rounded=\"rounded\"\n                        :size=\"size\"\n                        :class=\"[\n                            ...buttonBaseClasses,\n                            ...(lastButton.isCurrent\n                                ? buttonCurrentClasses\n                                : []),\n                        ]\" />\n                </slot>\n            </li>\n        </ul>\n    </nav>\n</template>\n","import type { App } from \"vue\";\n\nimport Pagination from \"./Pagination.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export pagination specific types */\nexport type * from \"./props\";\n\n/** export pagination plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Pagination);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export pagination components */\nexport { Pagination as OPagination };\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, useAttrs, useId, useSlots, useTemplateRef } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { RadioProps } from \"./props\";\n\n/**\n * Select an option from a set of options.\n * @displayName Radio\n * @style _radio.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ORadio\",\n    configField: \"radio\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<RadioProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    id: () => useId(),\n    label: undefined,\n    name: undefined,\n    variant: () => getDefault(\"radio.variant\"),\n    size: () => getDefault(\"radio.size\"),\n    disabled: false,\n    required: false,\n    nativeValue: undefined,\n    autocomplete: () => getDefault(\"radio.autocomplete\", \"off\"),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: T];\n    /**\n     * on input change event\n     * @param value {unknown} - input value\n     * @param event {Event} - native event\n     */\n    input: [value: T, event: Event];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst inputRef = useTemplateRef(\"inputElement\");\n\n// use form input functionalities\nconst { checkHtml5Validity, onBlur, onFocus, onInvalid, setFocus } =\n    useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// set field labelId or create a unique label id if a label is given\nconst labelId =\n    !!parentField.value || !!props.label || !!useSlots().default\n        ? parentField.value?.labelId || useId()\n        : undefined;\n\n// if no `label` is given and `id` is given set as `for` property on o-field wrapper\nif (!props.label && props.id) parentField.value?.setInputId(props.id);\n\nconst vmodel = defineModel<T>({ default: undefined });\n\nconst isChecked = computed(() => vmodel.value === props.nativeValue);\n\nfunction onInput(event: Event): void {\n    emits(\"input\", vmodel.value, event);\n}\n\n// --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-radio\"],\n    [\n        \"sizeClass\",\n        \"o-radio--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-radio--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"disabledClass\",\n        \"o-radio--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\"checkedClass\", \"o-radio--checked\", null, isChecked],\n);\n\nconst inputClasses = defineClasses([\"inputClass\", \"o-radio__input\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-radio__label\"]);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n</script>\n\n<template>\n    <div data-oruga=\"radio\" :class=\"rootClasses\">\n        <input\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"inputElement\"\n            v-model=\"vmodel\"\n            type=\"radio\"\n            data-oruga-input=\"radio\"\n            :class=\"inputClasses\"\n            :name=\"name\"\n            :value=\"nativeValue\"\n            :required=\"required\"\n            :disabled=\"disabled\"\n            :autocomplete=\"autocomplete\"\n            :aria-checked=\"isChecked\"\n            :aria-labelledby=\"labelId\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\"\n            @change=\"onInput\" />\n\n        <label\n            v-if=\"label || $slots.default\"\n            :id=\"labelId\"\n            :for=\"id\"\n            :class=\"labelClasses\">\n            <slot>{{ label }}</slot>\n        </label>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, useAttrs, useId, useSlots, useTemplateRef } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { RadioProps } from \"./props\";\n\n/**\n * Select an option from a set of options.\n * @displayName Radio\n * @style _radio.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"ORadio\",\n    configField: \"radio\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<RadioProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    id: () => useId(),\n    label: undefined,\n    name: undefined,\n    variant: () => getDefault(\"radio.variant\"),\n    size: () => getDefault(\"radio.size\"),\n    disabled: false,\n    required: false,\n    nativeValue: undefined,\n    autocomplete: () => getDefault(\"radio.autocomplete\", \"off\"),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: T];\n    /**\n     * on input change event\n     * @param value {unknown} - input value\n     * @param event {Event} - native event\n     */\n    input: [value: T, event: Event];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst inputRef = useTemplateRef(\"inputElement\");\n\n// use form input functionalities\nconst { checkHtml5Validity, onBlur, onFocus, onInvalid, setFocus } =\n    useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// set field labelId or create a unique label id if a label is given\nconst labelId =\n    !!parentField.value || !!props.label || !!useSlots().default\n        ? parentField.value?.labelId || useId()\n        : undefined;\n\n// if no `label` is given and `id` is given set as `for` property on o-field wrapper\nif (!props.label && props.id) parentField.value?.setInputId(props.id);\n\nconst vmodel = defineModel<T>({ default: undefined });\n\nconst isChecked = computed(() => vmodel.value === props.nativeValue);\n\nfunction onInput(event: Event): void {\n    emits(\"input\", vmodel.value, event);\n}\n\n// --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-radio\"],\n    [\n        \"sizeClass\",\n        \"o-radio--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-radio--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"disabledClass\",\n        \"o-radio--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\"checkedClass\", \"o-radio--checked\", null, isChecked],\n);\n\nconst inputClasses = defineClasses([\"inputClass\", \"o-radio__input\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-radio__label\"]);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n</script>\n\n<template>\n    <div data-oruga=\"radio\" :class=\"rootClasses\">\n        <input\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"inputElement\"\n            v-model=\"vmodel\"\n            type=\"radio\"\n            data-oruga-input=\"radio\"\n            :class=\"inputClasses\"\n            :name=\"name\"\n            :value=\"nativeValue\"\n            :required=\"required\"\n            :disabled=\"disabled\"\n            :autocomplete=\"autocomplete\"\n            :aria-checked=\"isChecked\"\n            :aria-labelledby=\"labelId\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\"\n            @change=\"onInput\" />\n\n        <label\n            v-if=\"label || $slots.default\"\n            :id=\"labelId\"\n            :for=\"id\"\n            :class=\"labelClasses\">\n            <slot>{{ label }}</slot>\n        </label>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Radio from \"./Radio.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export radio specific types */\nexport type * from \"./props\";\n\n/** export radio plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Radio);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export radio components */\nexport { Radio as ORadio };\n","import type { App } from \"vue\";\n\nimport Select from \"./Select.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export select specific types */\nexport type * from \"./props\";\n\n/** export select plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Select);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export select components */\nexport { Select as OSelect };\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { toCssDimension } from \"@/utils/helpers\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { SkeletonProps } from \"./props\";\n\n/**\n * A placeholder for content to load.\n * @displayName Skeleton\n * @style _skeleton.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSkeleton\",\n    configField: \"skeleton\",\n});\n\nconst props = withDefaults(defineProps<SkeletonProps>(), {\n    override: undefined,\n    active: true,\n    animated: () => getDefault(\"skeleton.animated\", true),\n    width: undefined,\n    height: undefined,\n    circle: false,\n    rounded: () => getDefault(\"skeleton.rounded\", true),\n    count: 1,\n    size: undefined,\n    position: \"left\",\n});\n\nconst itemStyle = computed(() => ({\n    height: toCssDimension(props.height),\n    width: toCssDimension(props.width),\n    borderRadius: props.circle ? \"50%\" : undefined,\n}));\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-skeleton\"],\n    [\n        \"positionClass\",\n        \"o-skeleton--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n);\n\nconst itemClasses = defineClasses(\n    [\"itemClass\", \"o-skeleton__item\"],\n    [\n        \"roundedClass\",\n        \"o-skeleton__item--rounded\",\n        null,\n        computed(() => props.rounded),\n    ],\n    [\n        \"animatedClass\",\n        \"o-skeleton__item--animated\",\n        null,\n        computed(() => props.animated),\n    ],\n    [\n        \"sizeClass\",\n        \"o-skeleton__item--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n);\n</script>\n\n<template>\n    <div v-if=\"active\" data-oruga=\"skeleton\" :class=\"rootClasses\">\n        <div\n            v-for=\"i in count\"\n            :key=\"i\"\n            :class=\"itemClasses\"\n            :style=\"itemStyle\" />\n    </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { toCssDimension } from \"@/utils/helpers\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { SkeletonProps } from \"./props\";\n\n/**\n * A placeholder for content to load.\n * @displayName Skeleton\n * @style _skeleton.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSkeleton\",\n    configField: \"skeleton\",\n});\n\nconst props = withDefaults(defineProps<SkeletonProps>(), {\n    override: undefined,\n    active: true,\n    animated: () => getDefault(\"skeleton.animated\", true),\n    width: undefined,\n    height: undefined,\n    circle: false,\n    rounded: () => getDefault(\"skeleton.rounded\", true),\n    count: 1,\n    size: undefined,\n    position: \"left\",\n});\n\nconst itemStyle = computed(() => ({\n    height: toCssDimension(props.height),\n    width: toCssDimension(props.width),\n    borderRadius: props.circle ? \"50%\" : undefined,\n}));\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-skeleton\"],\n    [\n        \"positionClass\",\n        \"o-skeleton--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n);\n\nconst itemClasses = defineClasses(\n    [\"itemClass\", \"o-skeleton__item\"],\n    [\n        \"roundedClass\",\n        \"o-skeleton__item--rounded\",\n        null,\n        computed(() => props.rounded),\n    ],\n    [\n        \"animatedClass\",\n        \"o-skeleton__item--animated\",\n        null,\n        computed(() => props.animated),\n    ],\n    [\n        \"sizeClass\",\n        \"o-skeleton__item--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n);\n</script>\n\n<template>\n    <div v-if=\"active\" data-oruga=\"skeleton\" :class=\"rootClasses\">\n        <div\n            v-for=\"i in count\"\n            :key=\"i\"\n            :class=\"itemClasses\"\n            :style=\"itemStyle\" />\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Skeleton from \"./Skeleton.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export skeleton specific types */\nexport type * from \"./props\";\n\n/** export skeleton plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Skeleton);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export skeleton components */\nexport { Skeleton as OSkeleton };\n","<script setup lang=\"ts\" generic=\"C extends Component\">\nimport {\n    ref,\n    computed,\n    watch,\n    onMounted,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    useClickOutside,\n    useEventListener,\n    useMatchMedia,\n    usePreventScrolling,\n    useTrapFocus,\n    getTeleportDefault,\n} from \"@/composables\";\n\nimport type { SidebarProps } from \"./props\";\nimport type { CloseEventArgs } from \"../programmatic\";\n\n/**\n * A sidebar to use as overlay.\n * @displayName Sidebar\n * @style _sidebar.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSidebar\",\n    configField: \"sidebar\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<SidebarProps<C>>(), {\n    override: undefined,\n    active: false,\n    overlay: () => getDefault(\"sidebar.overlay\", false),\n    inline: false,\n    position: () => getDefault(\"sidebar.position\", \"left\"),\n    fullheight: () => getDefault(\"sidebar.fullheight\", false),\n    fullwidth: () => getDefault(\"sidebar.fullwidth\", false),\n    mobile: () => getDefault(\"sidebar.mobile\"),\n    animation: () => getDefault(\"sidebar.animation\"),\n    closeOnOutside: () => getDefault(\"sidebar.closeOnOutside\", true),\n    closeOnEscape: () => getDefault(\"sidebar.closeOnEscape\", true),\n    trapFocus: () => getDefault(\"sidebar.trapFocus\", true),\n    clipScroll: () => getDefault(\"sidebar.clipScroll\", false),\n    mobileBreakpoint: () => getDefault(\"sidebar.mobileBreakpoint\"),\n    teleport: () => getDefault(\"sidebar.teleport\", false),\n    component: undefined,\n    props: undefined,\n    events: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on active state changes to false\n     * @param event {Event} - native event\n     */\n    close: [...args: [] | [Event] | CloseEventArgs<C>];\n}>();\n\ndefineSlots<{\n    /**\n     * Sidebar default content, default is component prop\n     * @param close {(...args: [] | [Event]): void} - function to close the component\n     */\n    default?(props: {\n        close: (...args: [] | [Event] | CloseEventArgs<C>) => void;\n    }): void;\n}>();\n\nconst { vTrapFocus } = useTrapFocus();\n\nconst rootRef = useTemplateRef(\"rootElement\");\nconst contentRef = useTemplateRef(\"contentElement\");\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst _teleport = computed(() =>\n    typeof props.teleport === \"boolean\"\n        ? { to: getTeleportDefault(), disabled: !props.teleport }\n        : { to: props.teleport, disabled: false },\n);\n\nconst transitionName = computed(() => {\n    if (props.animation) return props.animation;\n\n    const vertical = props.position === \"top\" || props.position === \"bottom\";\n    const right = props.position === \"right\";\n    const open = right ? !isActive.value : isActive.value;\n\n    return open\n        ? vertical\n            ? \"slide-down\"\n            : \"slide-next\"\n        : vertical\n          ? \"slide-up\"\n          : \"slide-prev\";\n});\n\nconst hideOnMobile = computed(\n    () => props.mobile === \"hidden\" && isMobile.value,\n);\n\nconst toggleScroll = usePreventScrolling(props.clipScroll);\n\nwatch(\n    isActive,\n    (value) => {\n        if (props.overlay) toggleScroll(value);\n    },\n    { flush: \"post\" },\n);\n\nonMounted(() => {\n    if (isActive.value && props.overlay) toggleScroll(true);\n});\n\n// --- Events Feature ---\n\nif (isClient) {\n    // register onKeyup event listener when is active\n    useEventListener(rootRef, \"keyup\", onKeyup, { trigger: isActive });\n\n    if (!props.overlay && !props.inline)\n        // register outside click event listener when is active\n        useClickOutside(contentRef, clickedOutside, { trigger: isActive });\n}\n\n/** Keyup event listener that is bound to the root element. */\nfunction onKeyup(event: KeyboardEvent): void {\n    if (!props.closeOnEscape) return;\n    if (!isActive.value) return;\n    if (event.key === \"Escape\" || event.key === \"Esc\") close(event);\n}\n\n/** Click outside event listener. */\nfunction clickedOutside(event: Event): void {\n    if (!props.closeOnOutside) return;\n    if (props.inline || !isActive.value || !isAnimated.value) return;\n    if (\n        props.overlay ||\n        (contentRef.value && !event.composedPath().includes(contentRef.value))\n    )\n        event.preventDefault();\n    close(event);\n}\n\n/** set active to false and emit close event */\nfunction close(...args: [] | [Event] | CloseEventArgs<C>): void {\n    isActive.value = false;\n    emits(\"close\", ...args);\n}\n\n// --- Animation Feature ---\n\n// TODO: check this\nconst isAnimated = ref(props.active);\n\n/** Transition after-enter hook */\nfunction afterEnter(): void {\n    isAnimated.value = true;\n}\n\n/** Transition before-leave hook */\nfunction beforeLeave(): void {\n    isAnimated.value = false;\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-sidebar\"],\n    [\"mobileClass\", \"o-sidebar--mobile\", null, isMobile],\n    [\"activeClass\", \"o-sidebar--active\", null, isActive],\n    [\n        \"teleportClass\",\n        \"o-sidebar--teleport\",\n        null,\n        computed(() => !!props.teleport),\n    ],\n    [\"inlineClass\", \"o-sidebar--inline\", null, computed(() => props.inline)],\n);\n\nconst overlayClasses = defineClasses([\"overlayClass\", \"o-sidebar__overlay\"]);\n\nconst contentClasses = defineClasses(\n    [\"contentClass\", \"o-sidebar__content\"],\n    [\n        \"positionClass\",\n        \"o-sidebar__content--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"fullheightClass\",\n        \"o-sidebar__content--fullheight\",\n        null,\n        computed(() => props.fullheight),\n    ],\n    [\n        \"fullwidthClass\",\n        \"o-sidebar__content--fullwidth\",\n        null,\n        computed(() => props.fullwidth),\n    ],\n    [\n        \"contentMobileClass\",\n        \"o-sidebar__content--\",\n        computed(() => props.mobile),\n        computed(() => isMobile.value && !!props.mobile),\n    ],\n    [\"visibleClass\", \"o-sidebar__content--visible\", null, isActive],\n    [\n        \"hiddenClass\",\n        \"o-sidebar__content--hidden\",\n        null,\n        computed(() => !isActive.value),\n    ],\n);\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close });\n</script>\n\n<template>\n    <Teleport :to=\"_teleport.to\" :disabled=\"_teleport.disabled\">\n        <div\n            v-show=\"!hideOnMobile\"\n            ref=\"rootElement\"\n            v-bind=\"$attrs\"\n            v-trap-focus=\"trapFocus && isActive && !inline\"\n            data-oruga=\"sidebar\"\n            :class=\"rootClasses\">\n            <div\n                v-if=\"overlay && isActive\"\n                :class=\"overlayClasses\"\n                :tabindex=\"-1\"\n                @click=\"clickedOutside\" />\n\n            <transition\n                :name=\"transitionName\"\n                @after-enter=\"afterEnter\"\n                @before-leave=\"beforeLeave\">\n                <div\n                    v-show=\"isActive\"\n                    ref=\"contentElement\"\n                    :class=\"contentClasses\">\n                    <slot :close=\"close\">\n                        <!-- injected component for programmatic usage -->\n                        <component\n                            :is=\"component\"\n                            v-if=\"component\"\n                            v-bind=\"$props.props\"\n                            v-on=\"$props.events || {}\"\n                            @close=\"close\" />\n                    </slot>\n                </div>\n            </transition>\n        </div>\n    </Teleport>\n</template>\n","<script setup lang=\"ts\" generic=\"C extends Component\">\nimport {\n    ref,\n    computed,\n    watch,\n    onMounted,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    useClickOutside,\n    useEventListener,\n    useMatchMedia,\n    usePreventScrolling,\n    useTrapFocus,\n    getTeleportDefault,\n} from \"@/composables\";\n\nimport type { SidebarProps } from \"./props\";\nimport type { CloseEventArgs } from \"../programmatic\";\n\n/**\n * A sidebar to use as overlay.\n * @displayName Sidebar\n * @style _sidebar.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSidebar\",\n    configField: \"sidebar\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<SidebarProps<C>>(), {\n    override: undefined,\n    active: false,\n    overlay: () => getDefault(\"sidebar.overlay\", false),\n    inline: false,\n    position: () => getDefault(\"sidebar.position\", \"left\"),\n    fullheight: () => getDefault(\"sidebar.fullheight\", false),\n    fullwidth: () => getDefault(\"sidebar.fullwidth\", false),\n    mobile: () => getDefault(\"sidebar.mobile\"),\n    animation: () => getDefault(\"sidebar.animation\"),\n    closeOnOutside: () => getDefault(\"sidebar.closeOnOutside\", true),\n    closeOnEscape: () => getDefault(\"sidebar.closeOnEscape\", true),\n    trapFocus: () => getDefault(\"sidebar.trapFocus\", true),\n    clipScroll: () => getDefault(\"sidebar.clipScroll\", false),\n    mobileBreakpoint: () => getDefault(\"sidebar.mobileBreakpoint\"),\n    teleport: () => getDefault(\"sidebar.teleport\", false),\n    component: undefined,\n    props: undefined,\n    events: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on active state changes to false\n     * @param event {Event} - native event\n     */\n    close: [...args: [] | [Event] | CloseEventArgs<C>];\n}>();\n\ndefineSlots<{\n    /**\n     * Sidebar default content, default is component prop\n     * @param close {(...args: [] | [Event]): void} - function to close the component\n     */\n    default?(props: {\n        close: (...args: [] | [Event] | CloseEventArgs<C>) => void;\n    }): void;\n}>();\n\nconst { vTrapFocus } = useTrapFocus();\n\nconst rootRef = useTemplateRef(\"rootElement\");\nconst contentRef = useTemplateRef(\"contentElement\");\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst _teleport = computed(() =>\n    typeof props.teleport === \"boolean\"\n        ? { to: getTeleportDefault(), disabled: !props.teleport }\n        : { to: props.teleport, disabled: false },\n);\n\nconst transitionName = computed(() => {\n    if (props.animation) return props.animation;\n\n    const vertical = props.position === \"top\" || props.position === \"bottom\";\n    const right = props.position === \"right\";\n    const open = right ? !isActive.value : isActive.value;\n\n    return open\n        ? vertical\n            ? \"slide-down\"\n            : \"slide-next\"\n        : vertical\n          ? \"slide-up\"\n          : \"slide-prev\";\n});\n\nconst hideOnMobile = computed(\n    () => props.mobile === \"hidden\" && isMobile.value,\n);\n\nconst toggleScroll = usePreventScrolling(props.clipScroll);\n\nwatch(\n    isActive,\n    (value) => {\n        if (props.overlay) toggleScroll(value);\n    },\n    { flush: \"post\" },\n);\n\nonMounted(() => {\n    if (isActive.value && props.overlay) toggleScroll(true);\n});\n\n// --- Events Feature ---\n\nif (isClient) {\n    // register onKeyup event listener when is active\n    useEventListener(rootRef, \"keyup\", onKeyup, { trigger: isActive });\n\n    if (!props.overlay && !props.inline)\n        // register outside click event listener when is active\n        useClickOutside(contentRef, clickedOutside, { trigger: isActive });\n}\n\n/** Keyup event listener that is bound to the root element. */\nfunction onKeyup(event: KeyboardEvent): void {\n    if (!props.closeOnEscape) return;\n    if (!isActive.value) return;\n    if (event.key === \"Escape\" || event.key === \"Esc\") close(event);\n}\n\n/** Click outside event listener. */\nfunction clickedOutside(event: Event): void {\n    if (!props.closeOnOutside) return;\n    if (props.inline || !isActive.value || !isAnimated.value) return;\n    if (\n        props.overlay ||\n        (contentRef.value && !event.composedPath().includes(contentRef.value))\n    )\n        event.preventDefault();\n    close(event);\n}\n\n/** set active to false and emit close event */\nfunction close(...args: [] | [Event] | CloseEventArgs<C>): void {\n    isActive.value = false;\n    emits(\"close\", ...args);\n}\n\n// --- Animation Feature ---\n\n// TODO: check this\nconst isAnimated = ref(props.active);\n\n/** Transition after-enter hook */\nfunction afterEnter(): void {\n    isAnimated.value = true;\n}\n\n/** Transition before-leave hook */\nfunction beforeLeave(): void {\n    isAnimated.value = false;\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-sidebar\"],\n    [\"mobileClass\", \"o-sidebar--mobile\", null, isMobile],\n    [\"activeClass\", \"o-sidebar--active\", null, isActive],\n    [\n        \"teleportClass\",\n        \"o-sidebar--teleport\",\n        null,\n        computed(() => !!props.teleport),\n    ],\n    [\"inlineClass\", \"o-sidebar--inline\", null, computed(() => props.inline)],\n);\n\nconst overlayClasses = defineClasses([\"overlayClass\", \"o-sidebar__overlay\"]);\n\nconst contentClasses = defineClasses(\n    [\"contentClass\", \"o-sidebar__content\"],\n    [\n        \"positionClass\",\n        \"o-sidebar__content--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"fullheightClass\",\n        \"o-sidebar__content--fullheight\",\n        null,\n        computed(() => props.fullheight),\n    ],\n    [\n        \"fullwidthClass\",\n        \"o-sidebar__content--fullwidth\",\n        null,\n        computed(() => props.fullwidth),\n    ],\n    [\n        \"contentMobileClass\",\n        \"o-sidebar__content--\",\n        computed(() => props.mobile),\n        computed(() => isMobile.value && !!props.mobile),\n    ],\n    [\"visibleClass\", \"o-sidebar__content--visible\", null, isActive],\n    [\n        \"hiddenClass\",\n        \"o-sidebar__content--hidden\",\n        null,\n        computed(() => !isActive.value),\n    ],\n);\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ close });\n</script>\n\n<template>\n    <Teleport :to=\"_teleport.to\" :disabled=\"_teleport.disabled\">\n        <div\n            v-show=\"!hideOnMobile\"\n            ref=\"rootElement\"\n            v-bind=\"$attrs\"\n            v-trap-focus=\"trapFocus && isActive && !inline\"\n            data-oruga=\"sidebar\"\n            :class=\"rootClasses\">\n            <div\n                v-if=\"overlay && isActive\"\n                :class=\"overlayClasses\"\n                :tabindex=\"-1\"\n                @click=\"clickedOutside\" />\n\n            <transition\n                :name=\"transitionName\"\n                @after-enter=\"afterEnter\"\n                @before-leave=\"beforeLeave\">\n                <div\n                    v-show=\"isActive\"\n                    ref=\"contentElement\"\n                    :class=\"contentClasses\">\n                    <slot :close=\"close\">\n                        <!-- injected component for programmatic usage -->\n                        <component\n                            :is=\"component\"\n                            v-if=\"component\"\n                            v-bind=\"$props.props\"\n                            v-on=\"$props.events || {}\"\n                            @close=\"close\" />\n                    </slot>\n                </div>\n            </transition>\n        </div>\n    </Teleport>\n</template>\n","import { type Component } from \"vue\";\nimport {\n    ProgrammaticFactory,\n    type ProgrammaticComponentOptions,\n    type ProgrammaticExpose,\n    type ProgrammaticTarget,\n} from \"../programmatic\";\n\nimport Sidebar from \"./Sidebar.vue\";\n\nimport type { SidebarProps } from \"./props\";\n\n// extend the OrugaProgrammatic type with the `sidebar` programmatic interface\ndeclare module \"../../index\" {\n    interface OrugaProgrammatic {\n        sidebar: Required<InstanceType<typeof SidebarProgrammaticFactory>>;\n    }\n}\n\nexport type SidebarProgrammaticOptions<C extends Component> = Readonly<\n    SidebarProps<C>\n> &\n    ProgrammaticComponentOptions<typeof Sidebar<C>>;\n\nexport class SidebarProgrammaticFactory extends ProgrammaticFactory {\n    /**\n     * Create a new programmatic sidebar component instance.\n     * @param options - Sidebar component props object.\n     * @param target - A target container the component get rendered into - default is `document.body`.\n     * @returns ProgrammaticExpose\n     */\n    open<C extends Component>(\n        options: SidebarProgrammaticOptions<C>,\n        target?: ProgrammaticTarget,\n    ): ProgrammaticExpose<typeof Sidebar<C>> {\n        const componentProps: SidebarProps<C> = {\n            active: true, // set the active default state to true\n            ...options,\n        };\n\n        // create programmatic component\n        return this._create(\n            Sidebar,\n            {\n                props: componentProps, // component specific props\n                onClose: options.onClose, // on close event handler\n            },\n            target, // target the component get rendered into\n        );\n    }\n}\n\nexport default function useSidebarProgrammatic(): SidebarProgrammaticFactory {\n    return new SidebarProgrammaticFactory();\n}\n","import type { App } from \"vue\";\n\nimport Sidebar from \"./Sidebar.vue\";\nimport useSidebarProgrammatic, {\n    SidebarProgrammaticFactory,\n} from \"./useSidebarProgrammatic\";\n\nimport { registerComponent, registerProgrammatic } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export sidebar specific types */\nexport type * from \"./props\";\nexport type { SidebarProgrammaticOptions } from \"./useSidebarProgrammatic\";\n\n/** export sidebar plugin */\nexport default {\n    install(app: App, { oruga }): void {\n        registerComponent(app, Sidebar);\n        registerProgrammatic(oruga, \"sidebar\", SidebarProgrammaticFactory);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export sidebar components & composables */\nexport { Sidebar as OSidebar, useSidebarProgrammatic };\n","<script setup lang=\"ts\">\nimport {\n    ref,\n    computed,\n    watch,\n    useId,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport PositionWrapper from \"../utils/PositionWrapper.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { toCssDimension } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    useClickOutside,\n    useEventListener,\n} from \"@/composables\";\n\nimport type { TooltipProps } from \"./props\";\n\n/**\n * Display a brief helper text to your user.\n * @displayName Tooltip\n * @style _tooltip.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTooltip\",\n    configField: \"tooltip\",\n});\n\nconst props = withDefaults(defineProps<TooltipProps>(), {\n    override: undefined,\n    active: false,\n    label: undefined,\n    id: () => useId(),\n    variant: () => getDefault(\"tooltip.variant\"),\n    position: () => getDefault(\"tooltip.position\", \"auto\"),\n    always: false,\n    disabled: false,\n    animation: () => getDefault(\"tooltip.animation\", \"fade\"),\n    multiline: false,\n    maxWidth: () => getDefault(\"tooltip.maxWidth\"),\n    triggerTag: () => getDefault(\"tooltip.triggerTag\", \"div\"),\n    openOnHover: () => getDefault(\"tooltip.openOnHover\", true),\n    openOnFocus: () => getDefault(\"tooltip.openOnFocus\", false),\n    openOnClick: () => getDefault(\"tooltip.openOnClick\", false),\n    openOnContextmenu: () => getDefault(\"tooltip.openOnContextmenu\", false),\n    delay: undefined,\n    closeable: () => getDefault(\"tooltip.closeable\", true),\n    closeOnEscape: () => getDefault(\"tooltip.closeOnEscape\", false),\n    closeOnOutside: () => getDefault(\"tooltip.closeOnOutside\", false),\n    teleport: () => getDefault(\"dropdown.teleport\", false),\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on active state changes to false\n     * @param event {Event} - native event\n     */\n    close: [event: Event];\n    /**\n     * on active state changes to true\n     * @param event {Event} - native event\n     */\n    open: [event: Event];\n}>();\n\ndefineSlots<{\n    /**\n     * Tooltip trigger slot\n     * @param active {boolean} - tooltip active state\n     */\n    default?(props: { active: boolean }): void;\n    /** Override the Tooltip content, default is label prop */\n    content?(): void;\n}>();\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst autoPosition = ref(props.position);\n\n/** update autoPosition on prop change */\nwatch(\n    () => props.position,\n    (v) => (autoPosition.value = v),\n);\n\nconst rootRef = useTemplateRef<HTMLElement>(\"rootElement\");\nconst triggerRef = useTemplateRef<HTMLElement | Component>(\"triggerRef\");\nconst contentRef = ref<HTMLElement>();\n\nconst contentStyle = computed(() => ({\n    maxWidth: props.maxWidth ? toCssDimension(props.maxWidth) : undefined,\n    whiteSpace: props.maxWidth ? \"wrap\" : undefined,\n}));\n\n// #region --- Event Handler ---\n\nif (isClient) {\n    // register onKeyup event listener when is active\n    useEventListener(rootRef, \"keyup\", onKeyup, {\n        trigger: isActive,\n        passive: true,\n    });\n\n    // set click outside handler\n    useClickOutside([contentRef, triggerRef], onClickedOutside, {\n        trigger: isActive,\n        passive: true,\n    });\n}\n\n/** Keyup event listener that is bound to the root element. */\nfunction onKeyup(event: KeyboardEvent): void {\n    if (!props.closeOnEscape) return;\n    if (event.key === \"Escape\" || event.key === \"Esc\") close(event);\n}\n\n/** Close tooltip if clicked outside. */\nfunction onClickedOutside(event: Event): void {\n    if (!props.closeOnOutside) return;\n    close(event);\n}\n\n/** Close tooltip if content lost focus. */\nfunction onHoverLeave(event: Event): void {\n    if (!props.closeable && !props.closeOnOutside) return;\n    close(event);\n}\n\nfunction onClick(event: Event): void {\n    if (!props.openOnClick) return;\n    open(event);\n}\n\n/** Open content when trigger is right clicked. */\nfunction onContextMenu(event: Event): void {\n    if (!props.openOnContextmenu) return;\n    event.preventDefault();\n    open(event);\n}\n\n/** Open content when trigger receives focus. */\nfunction onFocus(event: Event): void {\n    if (!props.openOnFocus) return;\n    open(event);\n}\n\n/** Open content when trigger is hovered. */\nfunction onHover(event: Event): void {\n    if (!props.openOnHover || props.openOnClick || props.openOnContextmenu)\n        return;\n    open(event);\n}\n\nlet timeout: ReturnType<typeof setTimeout> | undefined;\n\nfunction open(event: Event): void {\n    if (isActive.value || props.disabled) return;\n\n    // always open on the next JS loop after all events have been handled\n    timeout = setTimeout(() => {\n        isActive.value = true;\n        timeout = undefined;\n        emits(\"open\", event);\n    }, props.delay);\n}\n\nfunction close(event: Event): void {\n    if (!isActive.value) return;\n    if (timeout) clearTimeout(timeout);\n    isActive.value = false;\n    emits(\"close\", event);\n}\n\n// #endregion --- Event Handler ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-tooltip\"],\n    [\n        \"teleportClass\",\n        \"o-tooltip--teleport\",\n        null,\n        computed(() => !!props.teleport),\n    ],\n);\n\nconst triggerClasses = defineClasses([\"triggerClass\", \"o-tooltip__trigger\"]);\n\nconst contentClasses = defineClasses(\n    [\"contentClass\", \"o-tooltip__content\"],\n    [\n        \"positionClass\",\n        \"o-tooltip__content--\",\n        autoPosition,\n        computed(() => !!autoPosition.value),\n    ],\n    [\n        \"variantClass\",\n        \"o-tooltip__content--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    // @deprecated `multiline` will be removed later\n    [\n        \"multilineClass\",\n        \"o-tooltip__content--multiline\",\n        null,\n        computed(() => props.multiline),\n    ],\n    [\n        \"alwaysClass\",\n        \"o-tooltip__content--always\",\n        null,\n        computed(() => props.always),\n    ],\n);\n\nconst arrowClasses = defineClasses(\n    [\"arrowClass\", \"o-tooltip__arrow\"],\n    [\n        \"arrowPositionClass\",\n        \"o-tooltip__arrow--\",\n        autoPosition,\n        computed(() => !!autoPosition.value),\n    ],\n    [\n        \"arrowVariantClass\",\n        \"o-tooltip__arrow--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div ref=\"rootElement\" data-oruga=\"tooltip\" :class=\"rootClasses\">\n        <component\n            :is=\"triggerTag\"\n            ref=\"triggerRef\"\n            :class=\"triggerClasses\"\n            :aria-describedby=\"id\"\n            @click=\"onClick\"\n            @contextmenu=\"onContextMenu\"\n            @mouseenter=\"onHover\"\n            @focus.capture=\"onFocus\"\n            @blur.capture=\"onHoverLeave\"\n            @mouseleave=\"onHoverLeave\">\n            <slot :active=\"isActive\" />\n        </component>\n\n        <PositionWrapper\n            v-slot=\"{ setContent }\"\n            v-model:position=\"autoPosition\"\n            :teleport=\"teleport\"\n            :class=\"rootClasses\"\n            :trigger=\"triggerRef\"\n            default-position=\"top\"\n            :disabled=\"!isActive\">\n            <transition :name=\"animation\">\n                <div\n                    v-show=\"isActive || (always && !disabled)\"\n                    :id=\"id\"\n                    :ref=\"(el) => (contentRef = setContent(el as HTMLElement))\"\n                    :class=\"contentClasses\"\n                    :style=\"contentStyle\"\n                    role=\"tooltip\">\n                    <span :class=\"arrowClasses\"></span>\n                    <slot name=\"content\">{{ label }}</slot>\n                </div>\n            </transition>\n        </PositionWrapper>\n    </div>\n</template>\n","<script setup lang=\"ts\">\nimport {\n    ref,\n    computed,\n    watch,\n    useId,\n    useTemplateRef,\n    type Component,\n} from \"vue\";\n\nimport PositionWrapper from \"../utils/PositionWrapper.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { toCssDimension } from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport {\n    defineClasses,\n    useClickOutside,\n    useEventListener,\n} from \"@/composables\";\n\nimport type { TooltipProps } from \"./props\";\n\n/**\n * Display a brief helper text to your user.\n * @displayName Tooltip\n * @style _tooltip.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTooltip\",\n    configField: \"tooltip\",\n});\n\nconst props = withDefaults(defineProps<TooltipProps>(), {\n    override: undefined,\n    active: false,\n    label: undefined,\n    id: () => useId(),\n    variant: () => getDefault(\"tooltip.variant\"),\n    position: () => getDefault(\"tooltip.position\", \"auto\"),\n    always: false,\n    disabled: false,\n    animation: () => getDefault(\"tooltip.animation\", \"fade\"),\n    multiline: false,\n    maxWidth: () => getDefault(\"tooltip.maxWidth\"),\n    triggerTag: () => getDefault(\"tooltip.triggerTag\", \"div\"),\n    openOnHover: () => getDefault(\"tooltip.openOnHover\", true),\n    openOnFocus: () => getDefault(\"tooltip.openOnFocus\", false),\n    openOnClick: () => getDefault(\"tooltip.openOnClick\", false),\n    openOnContextmenu: () => getDefault(\"tooltip.openOnContextmenu\", false),\n    delay: undefined,\n    closeable: () => getDefault(\"tooltip.closeable\", true),\n    closeOnEscape: () => getDefault(\"tooltip.closeOnEscape\", false),\n    closeOnOutside: () => getDefault(\"tooltip.closeOnOutside\", false),\n    teleport: () => getDefault(\"dropdown.teleport\", false),\n});\n\nconst emits = defineEmits<{\n    /**\n     * active prop two-way binding\n     * @param value {boolean} - updated active prop\n     */\n    \"update:active\": [value: boolean];\n    /**\n     * on active state changes to false\n     * @param event {Event} - native event\n     */\n    close: [event: Event];\n    /**\n     * on active state changes to true\n     * @param event {Event} - native event\n     */\n    open: [event: Event];\n}>();\n\ndefineSlots<{\n    /**\n     * Tooltip trigger slot\n     * @param active {boolean} - tooltip active state\n     */\n    default?(props: { active: boolean }): void;\n    /** Override the Tooltip content, default is label prop */\n    content?(): void;\n}>();\n\nconst isActive = defineModel<boolean>(\"active\", { default: false });\n\nconst autoPosition = ref(props.position);\n\n/** update autoPosition on prop change */\nwatch(\n    () => props.position,\n    (v) => (autoPosition.value = v),\n);\n\nconst rootRef = useTemplateRef<HTMLElement>(\"rootElement\");\nconst triggerRef = useTemplateRef<HTMLElement | Component>(\"triggerRef\");\nconst contentRef = ref<HTMLElement>();\n\nconst contentStyle = computed(() => ({\n    maxWidth: props.maxWidth ? toCssDimension(props.maxWidth) : undefined,\n    whiteSpace: props.maxWidth ? \"wrap\" : undefined,\n}));\n\n// #region --- Event Handler ---\n\nif (isClient) {\n    // register onKeyup event listener when is active\n    useEventListener(rootRef, \"keyup\", onKeyup, {\n        trigger: isActive,\n        passive: true,\n    });\n\n    // set click outside handler\n    useClickOutside([contentRef, triggerRef], onClickedOutside, {\n        trigger: isActive,\n        passive: true,\n    });\n}\n\n/** Keyup event listener that is bound to the root element. */\nfunction onKeyup(event: KeyboardEvent): void {\n    if (!props.closeOnEscape) return;\n    if (event.key === \"Escape\" || event.key === \"Esc\") close(event);\n}\n\n/** Close tooltip if clicked outside. */\nfunction onClickedOutside(event: Event): void {\n    if (!props.closeOnOutside) return;\n    close(event);\n}\n\n/** Close tooltip if content lost focus. */\nfunction onHoverLeave(event: Event): void {\n    if (!props.closeable && !props.closeOnOutside) return;\n    close(event);\n}\n\nfunction onClick(event: Event): void {\n    if (!props.openOnClick) return;\n    open(event);\n}\n\n/** Open content when trigger is right clicked. */\nfunction onContextMenu(event: Event): void {\n    if (!props.openOnContextmenu) return;\n    event.preventDefault();\n    open(event);\n}\n\n/** Open content when trigger receives focus. */\nfunction onFocus(event: Event): void {\n    if (!props.openOnFocus) return;\n    open(event);\n}\n\n/** Open content when trigger is hovered. */\nfunction onHover(event: Event): void {\n    if (!props.openOnHover || props.openOnClick || props.openOnContextmenu)\n        return;\n    open(event);\n}\n\nlet timeout: ReturnType<typeof setTimeout> | undefined;\n\nfunction open(event: Event): void {\n    if (isActive.value || props.disabled) return;\n\n    // always open on the next JS loop after all events have been handled\n    timeout = setTimeout(() => {\n        isActive.value = true;\n        timeout = undefined;\n        emits(\"open\", event);\n    }, props.delay);\n}\n\nfunction close(event: Event): void {\n    if (!isActive.value) return;\n    if (timeout) clearTimeout(timeout);\n    isActive.value = false;\n    emits(\"close\", event);\n}\n\n// #endregion --- Event Handler ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-tooltip\"],\n    [\n        \"teleportClass\",\n        \"o-tooltip--teleport\",\n        null,\n        computed(() => !!props.teleport),\n    ],\n);\n\nconst triggerClasses = defineClasses([\"triggerClass\", \"o-tooltip__trigger\"]);\n\nconst contentClasses = defineClasses(\n    [\"contentClass\", \"o-tooltip__content\"],\n    [\n        \"positionClass\",\n        \"o-tooltip__content--\",\n        autoPosition,\n        computed(() => !!autoPosition.value),\n    ],\n    [\n        \"variantClass\",\n        \"o-tooltip__content--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    // @deprecated `multiline` will be removed later\n    [\n        \"multilineClass\",\n        \"o-tooltip__content--multiline\",\n        null,\n        computed(() => props.multiline),\n    ],\n    [\n        \"alwaysClass\",\n        \"o-tooltip__content--always\",\n        null,\n        computed(() => props.always),\n    ],\n);\n\nconst arrowClasses = defineClasses(\n    [\"arrowClass\", \"o-tooltip__arrow\"],\n    [\n        \"arrowPositionClass\",\n        \"o-tooltip__arrow--\",\n        autoPosition,\n        computed(() => !!autoPosition.value),\n    ],\n    [\n        \"arrowVariantClass\",\n        \"o-tooltip__arrow--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div ref=\"rootElement\" data-oruga=\"tooltip\" :class=\"rootClasses\">\n        <component\n            :is=\"triggerTag\"\n            ref=\"triggerRef\"\n            :class=\"triggerClasses\"\n            :aria-describedby=\"id\"\n            @click=\"onClick\"\n            @contextmenu=\"onContextMenu\"\n            @mouseenter=\"onHover\"\n            @focus.capture=\"onFocus\"\n            @blur.capture=\"onHoverLeave\"\n            @mouseleave=\"onHoverLeave\">\n            <slot :active=\"isActive\" />\n        </component>\n\n        <PositionWrapper\n            v-slot=\"{ setContent }\"\n            v-model:position=\"autoPosition\"\n            :teleport=\"teleport\"\n            :class=\"rootClasses\"\n            :trigger=\"triggerRef\"\n            default-position=\"top\"\n            :disabled=\"!isActive\">\n            <transition :name=\"animation\">\n                <div\n                    v-show=\"isActive || (always && !disabled)\"\n                    :id=\"id\"\n                    :ref=\"(el) => (contentRef = setContent(el as HTMLElement))\"\n                    :class=\"contentClasses\"\n                    :style=\"contentStyle\"\n                    role=\"tooltip\">\n                    <span :class=\"arrowClasses\"></span>\n                    <slot name=\"content\">{{ label }}</slot>\n                </div>\n            </transition>\n        </PositionWrapper>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"IsRange extends boolean = false\">\nimport { computed, ref } from \"vue\";\n\nimport OTooltip from \"../tooltip/Tooltip.vue\";\n\nimport { isClient } from \"@/utils/ssr\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { SliderProps } from \"./props\";\nimport type { ClassBinding, WithRequired } from \"@/types\";\n\n/**\n * @displayName Slider Thumb\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSliderThumb\",\n    configField: \"slider\",\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    /** parent slider component props  */\n    sliderProps: WithRequired<SliderProps<IsRange>, \"min\" | \"max\" | \"step\">;\n    modelValue: number;\n    sliderSize: () => number;\n    thumbWrapperClasses: ClassBinding[];\n    thumbClasses: ClassBinding[];\n}>();\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {number | number[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: number | number[]];\n    /** on value change event */\n    change: [];\n    /** on drag start event */\n    dragstart: [];\n    /** on drag end event */\n    dragend: [];\n}>();\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\nconst isFocused = ref(false);\nconst dragging = ref(false);\nconst startX = ref(0);\nconst startPosition = ref(0);\nconst newPosition = ref<number>();\nconst oldValue = ref(props.modelValue);\n\nconst tooltip = computed(() => props.sliderProps.tooltip);\nconst tooltipAlways = computed(() => props.sliderProps.tooltipAlways);\nconst disabled = computed(() => props.sliderProps.disabled);\nconst max = computed(() => props.sliderProps.max);\nconst min = computed(() => props.sliderProps.min);\nconst step = computed(() => props.sliderProps.step);\nconst indicator = computed(() => props.sliderProps.indicator);\nconst ariaLabel = computed(() => props.sliderProps.ariaLabel);\n\nconst precision = computed(() => {\n    const precisions = [min.value, max.value, step.value].map((item) => {\n        const decimal = (\"\" + item).split(\".\")[1];\n        return decimal ? decimal.length : 0;\n    });\n    return Math.max(...precisions);\n});\n\nconst computedTooltipVariant = computed(() =>\n    props.sliderProps.tooltipVariant\n        ? props.sliderProps.tooltipVariant\n        : props.sliderProps.variant,\n);\n\nconst currentPosition = computed(\n    () =>\n        `${((props.modelValue - min.value) / (max.value - min.value)) * 100}%`,\n);\n\nconst wrapperStyle = computed(() => ({ left: currentPosition.value }));\n\nconst formattedValue = computed(() => {\n    if (typeof props.sliderProps.formatter !== \"undefined\")\n        return props.sliderProps.formatter(props.modelValue);\n\n    if (props.sliderProps.format === \"percent\")\n        return new Intl.NumberFormat(props.sliderProps.locale, {\n            style: \"percent\",\n        }).format((props.modelValue - min.value) / (max.value - min.value));\n\n    return new Intl.NumberFormat(props.sliderProps.locale).format(\n        props.modelValue,\n    );\n});\n\nfunction onFocus(): void {\n    isFocused.value = true;\n}\n\nfunction onBlur(): void {\n    isFocused.value = false;\n}\n\nfunction onButtonDown(event): void {\n    if (disabled.value) return;\n    event.preventDefault();\n    onDragStart(event);\n\n    if (isClient) {\n        document.addEventListener(\"mousemove\", onDragging);\n        document.addEventListener(\"touchmove\", onDragging);\n        document.addEventListener(\"mouseup\", onDragEnd);\n        document.addEventListener(\"touchend\", onDragEnd);\n        document.addEventListener(\"contextmenu\", onDragEnd);\n    }\n}\n\nfunction onLeftKeyDown(): void {\n    if (disabled.value || props.modelValue === min.value) return;\n    newPosition.value =\n        parseFloat(currentPosition.value) -\n        (step.value / (max.value - min.value)) * 100;\n    setPosition(newPosition.value);\n    emits(\"change\");\n}\n\nfunction onRightKeyDown(): void {\n    if (disabled.value || props.modelValue === max.value) return;\n    newPosition.value =\n        parseFloat(currentPosition.value) +\n        (step.value / (max.value - min.value)) * 100;\n    setPosition(newPosition.value);\n    emits(\"change\");\n}\n\nfunction onHomeKeyDown(): void {\n    if (disabled.value || props.modelValue === min.value) return;\n    newPosition.value = 0;\n    setPosition(newPosition.value);\n    emits(\"change\");\n}\n\nfunction onEndKeyDown(): void {\n    if (disabled.value || props.modelValue === max.value) return;\n    newPosition.value = 100;\n    setPosition(newPosition.value);\n    emits(\"change\");\n}\n\nfunction onDragStart(event): void {\n    dragging.value = true;\n    emits(\"dragstart\");\n    if (event.type === \"touchstart\") event.clientX = event.touches[0].clientX;\n\n    startX.value = event.clientX;\n    startPosition.value = parseFloat(currentPosition.value);\n    newPosition.value = startPosition.value;\n}\n\nfunction onDragging(event): void {\n    if (dragging.value) {\n        if (event.type === \"touchmove\")\n            event.clientX = event.touches[0].clientX;\n\n        const diff =\n            ((event.clientX - startX.value) / props.sliderSize()) * 100;\n        newPosition.value = startPosition.value + diff;\n        setPosition(newPosition.value);\n    }\n}\n\nfunction onDragEnd(): void {\n    dragging.value = false;\n    emits(\"dragend\");\n    if (props.modelValue !== oldValue.value) emits(\"change\");\n\n    setPosition(newPosition.value);\n    if (isClient) {\n        document.removeEventListener(\"mousemove\", onDragging);\n        document.removeEventListener(\"touchmove\", onDragging);\n        document.removeEventListener(\"mouseup\", onDragEnd);\n        document.removeEventListener(\"touchend\", onDragEnd);\n        document.removeEventListener(\"contextmenu\", onDragEnd);\n    }\n}\n\nfunction setPosition(percent: number | undefined): void {\n    if (percent === undefined || isNaN(percent)) return;\n    if (percent < 0) percent = 0;\n    else if (percent > 100) percent = 100;\n\n    const stepLength = 100 / ((max.value - min.value) / step.value);\n    const steps = Math.round(percent / stepLength);\n    let value =\n        ((steps * stepLength) / 100) * (max.value - min.value) + min.value;\n    value = parseFloat(value.toFixed(precision.value));\n    emits(\"update:model-value\", value);\n\n    if (!dragging.value && value !== oldValue.value) oldValue.value = value;\n}\n\ndefineExpose({ setPosition });\n</script>\n\n<template>\n    <div\n        data-oruga=\"slider-thumb\"\n        :class=\"thumbWrapperClasses\"\n        :style=\"wrapperStyle\">\n        <o-tooltip\n            :label=\"formattedValue\"\n            :variant=\"computedTooltipVariant\"\n            :disabled=\"disabled || !tooltip\"\n            :always=\"tooltipAlways || dragging || isFocused\">\n            <div\n                v-bind=\"$attrs\"\n                :class=\"thumbClasses\"\n                :tabindex=\"disabled ? undefined : 0\"\n                role=\"slider\"\n                :aria-label=\"ariaLabel\"\n                :aria-labelledby=\"parentField?.labelId\"\n                :aria-valuenow=\"modelValue\"\n                :aria-valuemin=\"min\"\n                :aria-valuemax=\"max\"\n                :aria-disabled=\"disabled\"\n                aria-orientation=\"horizontal\"\n                @mousedown=\"onButtonDown\"\n                @touchstart.passive=\"onButtonDown\"\n                @focus=\"onFocus\"\n                @blur=\"onBlur\"\n                @keydown.left.prevent=\"onLeftKeyDown\"\n                @keydown.right.prevent=\"onRightKeyDown\"\n                @keydown.down.prevent=\"onLeftKeyDown\"\n                @keydown.up.prevent=\"onRightKeyDown\"\n                @keydown.home.prevent=\"onHomeKeyDown\"\n                @keydown.end.prevent=\"onEndKeyDown\">\n                <span v-if=\"indicator\">{{ formattedValue }}</span>\n            </div>\n        </o-tooltip>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"IsRange extends boolean = false\">\nimport { computed, ref } from \"vue\";\n\nimport OTooltip from \"../tooltip/Tooltip.vue\";\n\nimport { isClient } from \"@/utils/ssr\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { SliderProps } from \"./props\";\nimport type { ClassBinding, WithRequired } from \"@/types\";\n\n/**\n * @displayName Slider Thumb\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSliderThumb\",\n    configField: \"slider\",\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    /** parent slider component props  */\n    sliderProps: WithRequired<SliderProps<IsRange>, \"min\" | \"max\" | \"step\">;\n    modelValue: number;\n    sliderSize: () => number;\n    thumbWrapperClasses: ClassBinding[];\n    thumbClasses: ClassBinding[];\n}>();\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {number | number[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: number | number[]];\n    /** on value change event */\n    change: [];\n    /** on drag start event */\n    dragstart: [];\n    /** on drag end event */\n    dragend: [];\n}>();\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\nconst isFocused = ref(false);\nconst dragging = ref(false);\nconst startX = ref(0);\nconst startPosition = ref(0);\nconst newPosition = ref<number>();\nconst oldValue = ref(props.modelValue);\n\nconst tooltip = computed(() => props.sliderProps.tooltip);\nconst tooltipAlways = computed(() => props.sliderProps.tooltipAlways);\nconst disabled = computed(() => props.sliderProps.disabled);\nconst max = computed(() => props.sliderProps.max);\nconst min = computed(() => props.sliderProps.min);\nconst step = computed(() => props.sliderProps.step);\nconst indicator = computed(() => props.sliderProps.indicator);\nconst ariaLabel = computed(() => props.sliderProps.ariaLabel);\n\nconst precision = computed(() => {\n    const precisions = [min.value, max.value, step.value].map((item) => {\n        const decimal = (\"\" + item).split(\".\")[1];\n        return decimal ? decimal.length : 0;\n    });\n    return Math.max(...precisions);\n});\n\nconst computedTooltipVariant = computed(() =>\n    props.sliderProps.tooltipVariant\n        ? props.sliderProps.tooltipVariant\n        : props.sliderProps.variant,\n);\n\nconst currentPosition = computed(\n    () =>\n        `${((props.modelValue - min.value) / (max.value - min.value)) * 100}%`,\n);\n\nconst wrapperStyle = computed(() => ({ left: currentPosition.value }));\n\nconst formattedValue = computed(() => {\n    if (typeof props.sliderProps.formatter !== \"undefined\")\n        return props.sliderProps.formatter(props.modelValue);\n\n    if (props.sliderProps.format === \"percent\")\n        return new Intl.NumberFormat(props.sliderProps.locale, {\n            style: \"percent\",\n        }).format((props.modelValue - min.value) / (max.value - min.value));\n\n    return new Intl.NumberFormat(props.sliderProps.locale).format(\n        props.modelValue,\n    );\n});\n\nfunction onFocus(): void {\n    isFocused.value = true;\n}\n\nfunction onBlur(): void {\n    isFocused.value = false;\n}\n\nfunction onButtonDown(event): void {\n    if (disabled.value) return;\n    event.preventDefault();\n    onDragStart(event);\n\n    if (isClient) {\n        document.addEventListener(\"mousemove\", onDragging);\n        document.addEventListener(\"touchmove\", onDragging);\n        document.addEventListener(\"mouseup\", onDragEnd);\n        document.addEventListener(\"touchend\", onDragEnd);\n        document.addEventListener(\"contextmenu\", onDragEnd);\n    }\n}\n\nfunction onLeftKeyDown(): void {\n    if (disabled.value || props.modelValue === min.value) return;\n    newPosition.value =\n        parseFloat(currentPosition.value) -\n        (step.value / (max.value - min.value)) * 100;\n    setPosition(newPosition.value);\n    emits(\"change\");\n}\n\nfunction onRightKeyDown(): void {\n    if (disabled.value || props.modelValue === max.value) return;\n    newPosition.value =\n        parseFloat(currentPosition.value) +\n        (step.value / (max.value - min.value)) * 100;\n    setPosition(newPosition.value);\n    emits(\"change\");\n}\n\nfunction onHomeKeyDown(): void {\n    if (disabled.value || props.modelValue === min.value) return;\n    newPosition.value = 0;\n    setPosition(newPosition.value);\n    emits(\"change\");\n}\n\nfunction onEndKeyDown(): void {\n    if (disabled.value || props.modelValue === max.value) return;\n    newPosition.value = 100;\n    setPosition(newPosition.value);\n    emits(\"change\");\n}\n\nfunction onDragStart(event): void {\n    dragging.value = true;\n    emits(\"dragstart\");\n    if (event.type === \"touchstart\") event.clientX = event.touches[0].clientX;\n\n    startX.value = event.clientX;\n    startPosition.value = parseFloat(currentPosition.value);\n    newPosition.value = startPosition.value;\n}\n\nfunction onDragging(event): void {\n    if (dragging.value) {\n        if (event.type === \"touchmove\")\n            event.clientX = event.touches[0].clientX;\n\n        const diff =\n            ((event.clientX - startX.value) / props.sliderSize()) * 100;\n        newPosition.value = startPosition.value + diff;\n        setPosition(newPosition.value);\n    }\n}\n\nfunction onDragEnd(): void {\n    dragging.value = false;\n    emits(\"dragend\");\n    if (props.modelValue !== oldValue.value) emits(\"change\");\n\n    setPosition(newPosition.value);\n    if (isClient) {\n        document.removeEventListener(\"mousemove\", onDragging);\n        document.removeEventListener(\"touchmove\", onDragging);\n        document.removeEventListener(\"mouseup\", onDragEnd);\n        document.removeEventListener(\"touchend\", onDragEnd);\n        document.removeEventListener(\"contextmenu\", onDragEnd);\n    }\n}\n\nfunction setPosition(percent: number | undefined): void {\n    if (percent === undefined || isNaN(percent)) return;\n    if (percent < 0) percent = 0;\n    else if (percent > 100) percent = 100;\n\n    const stepLength = 100 / ((max.value - min.value) / step.value);\n    const steps = Math.round(percent / stepLength);\n    let value =\n        ((steps * stepLength) / 100) * (max.value - min.value) + min.value;\n    value = parseFloat(value.toFixed(precision.value));\n    emits(\"update:model-value\", value);\n\n    if (!dragging.value && value !== oldValue.value) oldValue.value = value;\n}\n\ndefineExpose({ setPosition });\n</script>\n\n<template>\n    <div\n        data-oruga=\"slider-thumb\"\n        :class=\"thumbWrapperClasses\"\n        :style=\"wrapperStyle\">\n        <o-tooltip\n            :label=\"formattedValue\"\n            :variant=\"computedTooltipVariant\"\n            :disabled=\"disabled || !tooltip\"\n            :always=\"tooltipAlways || dragging || isFocused\">\n            <div\n                v-bind=\"$attrs\"\n                :class=\"thumbClasses\"\n                :tabindex=\"disabled ? undefined : 0\"\n                role=\"slider\"\n                :aria-label=\"ariaLabel\"\n                :aria-labelledby=\"parentField?.labelId\"\n                :aria-valuenow=\"modelValue\"\n                :aria-valuemin=\"min\"\n                :aria-valuemax=\"max\"\n                :aria-disabled=\"disabled\"\n                aria-orientation=\"horizontal\"\n                @mousedown=\"onButtonDown\"\n                @touchstart.passive=\"onButtonDown\"\n                @focus=\"onFocus\"\n                @blur=\"onBlur\"\n                @keydown.left.prevent=\"onLeftKeyDown\"\n                @keydown.right.prevent=\"onRightKeyDown\"\n                @keydown.down.prevent=\"onLeftKeyDown\"\n                @keydown.up.prevent=\"onRightKeyDown\"\n                @keydown.home.prevent=\"onHomeKeyDown\"\n                @keydown.end.prevent=\"onEndKeyDown\">\n                <span v-if=\"indicator\">{{ formattedValue }}</span>\n            </div>\n        </o-tooltip>\n    </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useTemplateRef, type PropType } from \"vue\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { SliderComponent } from \"./types\";\nimport type { ComponentClass } from \"@/types\";\n\n/**\n * @displayName Slider Tick\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSliderTick\",\n    configField: \"slider\",\n});\n\nconst props = defineProps({\n    /** Override existing theme classes completely */\n    override: { type: Boolean, default: undefined },\n    /** Value of single tick */\n    value: { type: Number, required: true },\n    /** Tick label */\n    label: { type: [String, Number], default: undefined },\n    tickClass: {\n        type: [String, Function, Array] as PropType<ComponentClass>,\n        default: undefined,\n    },\n    /** Class when slider tick is hidden */\n    tickHiddenClass: {\n        type: [String, Function, Array] as PropType<ComponentClass>,\n        default: undefined,\n    },\n    /** Class of tick label */\n    tickLabelClass: {\n        type: [String, Function, Array] as PropType<ComponentClass>,\n        default: undefined,\n    },\n});\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n/** inject functionalities and data from the parent component */\nconst { parent } = useProviderChild<SliderComponent>(rootRef, {\n    register: false,\n});\n\nconst position = computed(() => {\n    const pos =\n        ((props.value - parent.value.min) /\n            (parent.value.max - parent.value.min)) *\n        100;\n    return pos >= 0 && pos <= 100 ? pos : 0;\n});\n\nconst hidden = computed(\n    () => props.value === parent.value.min || props.value === parent.value.max,\n);\n\nconst tickStyle = computed(() => ({ left: position.value + \"%\" }));\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"tickClass\", \"o-slider__tick\"],\n    [\"tickHiddenClass\", \"o-slider__tick--hidden\", null, hidden],\n);\n\nconst tickLabelClasses = defineClasses([\n    \"tickLabelClass\",\n    \"o-slider__tick-label\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div\n        ref=\"rootElement\"\n        data-oruga=\"slider-tick\"\n        :class=\"rootClasses\"\n        :style=\"tickStyle\">\n        <span v-if=\"$slots.default || label\" :class=\"tickLabelClasses\">\n            <!-- \n                @slot Override tick content, default is label prop\n             -->\n            <slot> {{ label }} </slot>\n        </span>\n    </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useTemplateRef, type PropType } from \"vue\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { SliderComponent } from \"./types\";\nimport type { ComponentClass } from \"@/types\";\n\n/**\n * @displayName Slider Tick\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSliderTick\",\n    configField: \"slider\",\n});\n\nconst props = defineProps({\n    /** Override existing theme classes completely */\n    override: { type: Boolean, default: undefined },\n    /** Value of single tick */\n    value: { type: Number, required: true },\n    /** Tick label */\n    label: { type: [String, Number], default: undefined },\n    tickClass: {\n        type: [String, Function, Array] as PropType<ComponentClass>,\n        default: undefined,\n    },\n    /** Class when slider tick is hidden */\n    tickHiddenClass: {\n        type: [String, Function, Array] as PropType<ComponentClass>,\n        default: undefined,\n    },\n    /** Class of tick label */\n    tickLabelClass: {\n        type: [String, Function, Array] as PropType<ComponentClass>,\n        default: undefined,\n    },\n});\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n/** inject functionalities and data from the parent component */\nconst { parent } = useProviderChild<SliderComponent>(rootRef, {\n    register: false,\n});\n\nconst position = computed(() => {\n    const pos =\n        ((props.value - parent.value.min) /\n            (parent.value.max - parent.value.min)) *\n        100;\n    return pos >= 0 && pos <= 100 ? pos : 0;\n});\n\nconst hidden = computed(\n    () => props.value === parent.value.min || props.value === parent.value.max,\n);\n\nconst tickStyle = computed(() => ({ left: position.value + \"%\" }));\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"tickClass\", \"o-slider__tick\"],\n    [\"tickHiddenClass\", \"o-slider__tick--hidden\", null, hidden],\n);\n\nconst tickLabelClasses = defineClasses([\n    \"tickLabelClass\",\n    \"o-slider__tick-label\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div\n        ref=\"rootElement\"\n        data-oruga=\"slider-tick\"\n        :class=\"rootClasses\"\n        :style=\"tickStyle\">\n        <span v-if=\"$slots.default || label\" :class=\"tickLabelClasses\">\n            <!-- \n                @slot Override tick content, default is label prop\n             -->\n            <slot> {{ label }} </slot>\n        </span>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"IsRange extends boolean = false\">\nimport { computed, ref, useTemplateRef, watch } from \"vue\";\n\nimport OSliderThumb from \"./SliderThumb.vue\";\nimport OSliderTick from \"./SliderTick.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isTrueish } from \"@/utils/helpers\";\nimport { defineClasses, useProviderParent } from \"@/composables\";\n\nimport type { SliderComponent } from \"./types\";\nimport type { SliderProps } from \"./props\";\n\n/**\n * A slider to select a value or range from a given range.\n * @displayName Slider\n * @requires ./SliderTick.vue\n * @style _slider.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSlider\",\n    configField: \"slider\",\n});\n\ntype ModelValue = SliderProps<IsRange>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<SliderProps<IsRange>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // range: false,\n    min: 0,\n    max: 100,\n    step: 1,\n    variant: () => getDefault(\"slider.variant\"),\n    size: () => getDefault(\"slider.size\"),\n    ticks: false,\n    tooltip: () => getDefault(\"slider.tooltip\", true),\n    tooltipVariant: () => getDefault(\"slider.tooltipVariant\"),\n    tooltipAlways: false,\n    rounded: () => getDefault(\"slider.rounded\", false),\n    disabled: false,\n    lazy: false,\n    formatter: undefined,\n    biggerSliderFocus: false,\n    indicator: false,\n    format: () => getDefault(\"slider.format\", \"raw\"),\n    locale: () => getDefault(\"locale\"),\n    ariaLabel: () => getDefault(\"slider.ariaLabel\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {number | number[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on value change event\n     * @param value {number | number[]} - updated modelValue prop\n     */\n    change: [value: ModelValue];\n    /**\n     * on dragging event\n     * @param value {number | number[]} - updated modelValue prop\n     * */\n    dragging: [value: ModelValue];\n    /** on drag start event */\n    dragstart: [];\n    /** on drag end event */\n    dragend: [];\n}>();\n\ndefineSlots<{\n    /**  Define additional slider ticks here */\n    default?(): void;\n}>();\n\nconst sliderRef = useTemplateRef(\"sliderElement\");\nconst thumbStartRef = useTemplateRef(\"thumbStartComponent\");\nconst thumbEndRef = useTemplateRef(\"thumbEndComponent\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<SliderComponent>(() => ({\n    max: props.max,\n    min: props.min,\n}));\n\n/** provide functionalities and data to child item components */\nuseProviderParent({ data: provideData });\n\nconst valueStart = ref<number>(0);\nconst valueEnd = ref<number>(0);\nconst dragging = ref(false);\n\nconst isThumbReversed = ref();\nconst isTrackClickDisabled = ref();\n\nconst minValue = computed(() =>\n    Math.min(valueStart.value || props.min, valueEnd.value || props.max),\n);\n\nconst maxValue = computed(() =>\n    Math.max(valueStart.value || props.min, valueEnd.value || props.max),\n);\n\nconst isRange = computed(() => isTrueish(props.range));\n\nconst vmodel = computed<ModelValue>(\n    () =>\n        (isRange.value\n            ? [minValue.value, maxValue.value]\n            : valueStart.value || 0) as ModelValue,\n);\n\n/** update vmodel value on internal value change */\nwatch([valueStart, valueEnd], () => {\n    if (isRange.value)\n        isThumbReversed.value =\n            valueStart.value && valueEnd.value\n                ? valueStart.value > valueEnd.value\n                : false;\n    if (!props.lazy || !dragging.value)\n        emits(\"update:model-value\", vmodel.value); // update external vmodel\n    if (dragging.value) emits(\"dragging\", vmodel.value);\n});\n\n/** When min, max or v-model is changed set the new active step. */\nwatch(\n    [() => props.min, () => props.max, () => props.modelValue],\n    () => setValues(props.modelValue),\n    { immediate: true }, // initialise valueStart and valueEnd\n);\n\nfunction setValues(newValue: number | number[] | undefined): void {\n    if (props.min > props.max) return;\n\n    if (Array.isArray(newValue)) {\n        const smallValue =\n            typeof newValue[0] !== \"number\" || isNaN(newValue[0])\n                ? props.min\n                : Math.min(Math.max(props.min, newValue[0]), props.max);\n        const largeValue =\n            typeof newValue[1] !== \"number\" || isNaN(newValue[1])\n                ? props.max\n                : Math.max(Math.min(props.max, newValue[1]), props.min);\n        valueStart.value = isThumbReversed.value ? largeValue : smallValue;\n        valueEnd.value = isThumbReversed.value ? smallValue : largeValue;\n    } else if (newValue !== undefined) {\n        valueStart.value = isNaN(newValue)\n            ? props.min\n            : Math.min(props.max, Math.max(props.min, newValue));\n        valueEnd.value = 0;\n    } else {\n        valueStart.value = props.min;\n        valueEnd.value = props.min;\n    }\n}\n\nconst tickValues = computed(() => {\n    if (!props.ticks || props.min > props.max || props.step === 0) return [];\n    const result: number[] = [];\n    for (let i = props.min + props.step; i < props.max; i = i + props.step) {\n        result.push(i);\n    }\n    return result;\n});\n\nconst barSize = computed(() =>\n    isRange.value\n        ? `${\n              (100 * (maxValue.value - minValue.value)) /\n              (props.max - props.min)\n          }%`\n        : `${\n              (100 * (valueStart.value - props.min)) / (props.max - props.min)\n          }%`,\n);\n\nconst barStart = computed(() =>\n    isRange.value\n        ? `${(100 * (minValue.value - props.min)) / (props.max - props.min)}%`\n        : \"0%\",\n);\n\nconst barStyle = computed(() => ({\n    width: barSize.value,\n    left: barStart.value,\n}));\n\nfunction getSliderSize(): number {\n    return sliderRef.value?.getBoundingClientRect().width || 0;\n}\n\nfunction onSliderClick(event: MouseEvent): void {\n    if (props.disabled || isTrackClickDisabled.value) return;\n    if (\n        !sliderRef.value ||\n        !thumbStartRef.value ||\n        (isRange.value && !thumbEndRef.value)\n    )\n        return;\n\n    const sliderOffsetLeft = sliderRef.value.getBoundingClientRect().left;\n    const percent =\n        ((event.clientX - sliderOffsetLeft) / getSliderSize()) * 100;\n    const targetValue = props.min + (percent * (props.max - props.min)) / 100;\n    const diffFirst = Math.abs(targetValue - valueStart.value);\n    if (!isRange.value) {\n        if (diffFirst < props.step / 2) return;\n        thumbStartRef.value.setPosition(percent);\n    } else {\n        const diffSecond = Math.abs(targetValue - valueEnd.value);\n        if (diffFirst <= diffSecond) {\n            if (diffFirst < props.step / 2) return;\n            thumbStartRef.value.setPosition(percent);\n        } else {\n            if (diffSecond < props.step / 2) return;\n            if (isRange.value && thumbEndRef.value)\n                thumbEndRef.value.setPosition(percent);\n        }\n    }\n    emits(\"change\", vmodel.value);\n}\n\nfunction onDragStart(): void {\n    dragging.value = true;\n    emits(\"dragstart\");\n}\n\nfunction onDragEnd(): void {\n    isTrackClickDisabled.value = true;\n    // avoid triggering onSliderClick after dragend\n    setTimeout(() => (isTrackClickDisabled.value = false));\n    dragging.value = false;\n    emits(\"dragend\");\n    if (props.lazy) emits(\"update:model-value\", vmodel.value);\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-slider\"],\n    [\n        \"sizeClass\",\n        \"o-slider--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"disabledClass\",\n        \"o-slider--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n);\n\nconst trackClasses = defineClasses([\"trackClass\", \"o-slider__track\"]);\n\nconst fillClasses = defineClasses(\n    [\"fillClass\", \"o-slider__fill\"],\n    [\n        \"variantClass\",\n        \"o-slider__fill--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n);\n\nconst thumbWrapperClasses = defineClasses(\n    [\"thumbWrapperClass\", \"o-slider__thumb-wrapper\"],\n    [\n        \"thumbWrapperDraggingClass\",\n        \"o-slider__thumb-wrapper--dragging\",\n        null,\n        dragging,\n    ],\n);\n\nconst thumbClasses = defineClasses(\n    [\"thumbClass\", \"o-slider__thumb\"],\n    [\"thumbDraggingClass\", \"o-slider__thumb--dragging\", null, dragging],\n    [\n        \"thumbRoundedClass\",\n        \"o-slider__thumb--rounded\",\n        null,\n        computed(() => props.rounded),\n    ],\n);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ value: vmodel });\n</script>\n\n<template>\n    <div data-oruga=\"slider\" :class=\"rootClasses\" @click=\"onSliderClick\">\n        <div ref=\"sliderElement\" :class=\"trackClasses\">\n            <div :class=\"fillClasses\" :style=\"barStyle\" />\n\n            <template v-if=\"ticks\">\n                <o-slider-tick\n                    v-for=\"(val, key) in tickValues\"\n                    :key=\"key\"\n                    :value=\"val\"\n                    :tick-class=\"tickClass\"\n                    :tick-hidden-class=\"tickHiddenClass\"\n                    :tick-label-class=\"tickLabelClass\" />\n            </template>\n\n            <!-- Slot for additional slider ticks -->\n            <slot />\n\n            <o-slider-thumb\n                ref=\"thumbStartComponent\"\n                v-model=\"valueStart\"\n                :slider-props=\"props\"\n                :slider-size=\"getSliderSize\"\n                :thumb-classes=\"thumbClasses\"\n                :thumb-wrapper-classes=\"thumbWrapperClasses\"\n                @change=\"emits('change', vmodel)\"\n                @dragstart=\"onDragStart\"\n                @dragend=\"onDragEnd\" />\n\n            <o-slider-thumb\n                v-if=\"isRange\"\n                ref=\"thumbEndComponent\"\n                v-model=\"valueEnd\"\n                :slider-props=\"props\"\n                :slider-size=\"getSliderSize\"\n                :thumb-classes=\"thumbClasses\"\n                :thumb-wrapper-classes=\"thumbWrapperClasses\"\n                @change=\"emits('change', vmodel)\"\n                @dragstart=\"onDragStart\"\n                @dragend=\"onDragEnd\" />\n        </div>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"IsRange extends boolean = false\">\nimport { computed, ref, useTemplateRef, watch } from \"vue\";\n\nimport OSliderThumb from \"./SliderThumb.vue\";\nimport OSliderTick from \"./SliderTick.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isTrueish } from \"@/utils/helpers\";\nimport { defineClasses, useProviderParent } from \"@/composables\";\n\nimport type { SliderComponent } from \"./types\";\nimport type { SliderProps } from \"./props\";\n\n/**\n * A slider to select a value or range from a given range.\n * @displayName Slider\n * @requires ./SliderTick.vue\n * @style _slider.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSlider\",\n    configField: \"slider\",\n});\n\ntype ModelValue = SliderProps<IsRange>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<SliderProps<IsRange>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // range: false,\n    min: 0,\n    max: 100,\n    step: 1,\n    variant: () => getDefault(\"slider.variant\"),\n    size: () => getDefault(\"slider.size\"),\n    ticks: false,\n    tooltip: () => getDefault(\"slider.tooltip\", true),\n    tooltipVariant: () => getDefault(\"slider.tooltipVariant\"),\n    tooltipAlways: false,\n    rounded: () => getDefault(\"slider.rounded\", false),\n    disabled: false,\n    lazy: false,\n    formatter: undefined,\n    biggerSliderFocus: false,\n    indicator: false,\n    format: () => getDefault(\"slider.format\", \"raw\"),\n    locale: () => getDefault(\"locale\"),\n    ariaLabel: () => getDefault(\"slider.ariaLabel\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {number | number[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on value change event\n     * @param value {number | number[]} - updated modelValue prop\n     */\n    change: [value: ModelValue];\n    /**\n     * on dragging event\n     * @param value {number | number[]} - updated modelValue prop\n     * */\n    dragging: [value: ModelValue];\n    /** on drag start event */\n    dragstart: [];\n    /** on drag end event */\n    dragend: [];\n}>();\n\ndefineSlots<{\n    /**  Define additional slider ticks here */\n    default?(): void;\n}>();\n\nconst sliderRef = useTemplateRef(\"sliderElement\");\nconst thumbStartRef = useTemplateRef(\"thumbStartComponent\");\nconst thumbEndRef = useTemplateRef(\"thumbEndComponent\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<SliderComponent>(() => ({\n    max: props.max,\n    min: props.min,\n}));\n\n/** provide functionalities and data to child item components */\nuseProviderParent({ data: provideData });\n\nconst valueStart = ref<number>(0);\nconst valueEnd = ref<number>(0);\nconst dragging = ref(false);\n\nconst isThumbReversed = ref();\nconst isTrackClickDisabled = ref();\n\nconst minValue = computed(() =>\n    Math.min(valueStart.value || props.min, valueEnd.value || props.max),\n);\n\nconst maxValue = computed(() =>\n    Math.max(valueStart.value || props.min, valueEnd.value || props.max),\n);\n\nconst isRange = computed(() => isTrueish(props.range));\n\nconst vmodel = computed<ModelValue>(\n    () =>\n        (isRange.value\n            ? [minValue.value, maxValue.value]\n            : valueStart.value || 0) as ModelValue,\n);\n\n/** update vmodel value on internal value change */\nwatch([valueStart, valueEnd], () => {\n    if (isRange.value)\n        isThumbReversed.value =\n            valueStart.value && valueEnd.value\n                ? valueStart.value > valueEnd.value\n                : false;\n    if (!props.lazy || !dragging.value)\n        emits(\"update:model-value\", vmodel.value); // update external vmodel\n    if (dragging.value) emits(\"dragging\", vmodel.value);\n});\n\n/** When min, max or v-model is changed set the new active step. */\nwatch(\n    [() => props.min, () => props.max, () => props.modelValue],\n    () => setValues(props.modelValue),\n    { immediate: true }, // initialise valueStart and valueEnd\n);\n\nfunction setValues(newValue: number | number[] | undefined): void {\n    if (props.min > props.max) return;\n\n    if (Array.isArray(newValue)) {\n        const smallValue =\n            typeof newValue[0] !== \"number\" || isNaN(newValue[0])\n                ? props.min\n                : Math.min(Math.max(props.min, newValue[0]), props.max);\n        const largeValue =\n            typeof newValue[1] !== \"number\" || isNaN(newValue[1])\n                ? props.max\n                : Math.max(Math.min(props.max, newValue[1]), props.min);\n        valueStart.value = isThumbReversed.value ? largeValue : smallValue;\n        valueEnd.value = isThumbReversed.value ? smallValue : largeValue;\n    } else if (newValue !== undefined) {\n        valueStart.value = isNaN(newValue)\n            ? props.min\n            : Math.min(props.max, Math.max(props.min, newValue));\n        valueEnd.value = 0;\n    } else {\n        valueStart.value = props.min;\n        valueEnd.value = props.min;\n    }\n}\n\nconst tickValues = computed(() => {\n    if (!props.ticks || props.min > props.max || props.step === 0) return [];\n    const result: number[] = [];\n    for (let i = props.min + props.step; i < props.max; i = i + props.step) {\n        result.push(i);\n    }\n    return result;\n});\n\nconst barSize = computed(() =>\n    isRange.value\n        ? `${\n              (100 * (maxValue.value - minValue.value)) /\n              (props.max - props.min)\n          }%`\n        : `${\n              (100 * (valueStart.value - props.min)) / (props.max - props.min)\n          }%`,\n);\n\nconst barStart = computed(() =>\n    isRange.value\n        ? `${(100 * (minValue.value - props.min)) / (props.max - props.min)}%`\n        : \"0%\",\n);\n\nconst barStyle = computed(() => ({\n    width: barSize.value,\n    left: barStart.value,\n}));\n\nfunction getSliderSize(): number {\n    return sliderRef.value?.getBoundingClientRect().width || 0;\n}\n\nfunction onSliderClick(event: MouseEvent): void {\n    if (props.disabled || isTrackClickDisabled.value) return;\n    if (\n        !sliderRef.value ||\n        !thumbStartRef.value ||\n        (isRange.value && !thumbEndRef.value)\n    )\n        return;\n\n    const sliderOffsetLeft = sliderRef.value.getBoundingClientRect().left;\n    const percent =\n        ((event.clientX - sliderOffsetLeft) / getSliderSize()) * 100;\n    const targetValue = props.min + (percent * (props.max - props.min)) / 100;\n    const diffFirst = Math.abs(targetValue - valueStart.value);\n    if (!isRange.value) {\n        if (diffFirst < props.step / 2) return;\n        thumbStartRef.value.setPosition(percent);\n    } else {\n        const diffSecond = Math.abs(targetValue - valueEnd.value);\n        if (diffFirst <= diffSecond) {\n            if (diffFirst < props.step / 2) return;\n            thumbStartRef.value.setPosition(percent);\n        } else {\n            if (diffSecond < props.step / 2) return;\n            if (isRange.value && thumbEndRef.value)\n                thumbEndRef.value.setPosition(percent);\n        }\n    }\n    emits(\"change\", vmodel.value);\n}\n\nfunction onDragStart(): void {\n    dragging.value = true;\n    emits(\"dragstart\");\n}\n\nfunction onDragEnd(): void {\n    isTrackClickDisabled.value = true;\n    // avoid triggering onSliderClick after dragend\n    setTimeout(() => (isTrackClickDisabled.value = false));\n    dragging.value = false;\n    emits(\"dragend\");\n    if (props.lazy) emits(\"update:model-value\", vmodel.value);\n}\n\n// --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-slider\"],\n    [\n        \"sizeClass\",\n        \"o-slider--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"disabledClass\",\n        \"o-slider--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n);\n\nconst trackClasses = defineClasses([\"trackClass\", \"o-slider__track\"]);\n\nconst fillClasses = defineClasses(\n    [\"fillClass\", \"o-slider__fill\"],\n    [\n        \"variantClass\",\n        \"o-slider__fill--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n);\n\nconst thumbWrapperClasses = defineClasses(\n    [\"thumbWrapperClass\", \"o-slider__thumb-wrapper\"],\n    [\n        \"thumbWrapperDraggingClass\",\n        \"o-slider__thumb-wrapper--dragging\",\n        null,\n        dragging,\n    ],\n);\n\nconst thumbClasses = defineClasses(\n    [\"thumbClass\", \"o-slider__thumb\"],\n    [\"thumbDraggingClass\", \"o-slider__thumb--dragging\", null, dragging],\n    [\n        \"thumbRoundedClass\",\n        \"o-slider__thumb--rounded\",\n        null,\n        computed(() => props.rounded),\n    ],\n);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ value: vmodel });\n</script>\n\n<template>\n    <div data-oruga=\"slider\" :class=\"rootClasses\" @click=\"onSliderClick\">\n        <div ref=\"sliderElement\" :class=\"trackClasses\">\n            <div :class=\"fillClasses\" :style=\"barStyle\" />\n\n            <template v-if=\"ticks\">\n                <o-slider-tick\n                    v-for=\"(val, key) in tickValues\"\n                    :key=\"key\"\n                    :value=\"val\"\n                    :tick-class=\"tickClass\"\n                    :tick-hidden-class=\"tickHiddenClass\"\n                    :tick-label-class=\"tickLabelClass\" />\n            </template>\n\n            <!-- Slot for additional slider ticks -->\n            <slot />\n\n            <o-slider-thumb\n                ref=\"thumbStartComponent\"\n                v-model=\"valueStart\"\n                :slider-props=\"props\"\n                :slider-size=\"getSliderSize\"\n                :thumb-classes=\"thumbClasses\"\n                :thumb-wrapper-classes=\"thumbWrapperClasses\"\n                @change=\"emits('change', vmodel)\"\n                @dragstart=\"onDragStart\"\n                @dragend=\"onDragEnd\" />\n\n            <o-slider-thumb\n                v-if=\"isRange\"\n                ref=\"thumbEndComponent\"\n                v-model=\"valueEnd\"\n                :slider-props=\"props\"\n                :slider-size=\"getSliderSize\"\n                :thumb-classes=\"thumbClasses\"\n                :thumb-wrapper-classes=\"thumbWrapperClasses\"\n                @change=\"emits('change', vmodel)\"\n                @dragstart=\"onDragStart\"\n                @dragend=\"onDragEnd\" />\n        </div>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Slider from \"./Slider.vue\";\nimport SliderTick from \"./SliderTick.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export slider specific types */\nexport type * from \"./props\";\nexport type * from \"./types\";\n\n/** export slider plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Slider);\n        registerComponent(app, SliderTick);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export slider components */\nexport { Slider as OSlider, SliderTick as OSliderTick };\n","<script setup lang=\"ts\" generic=\"T, C extends Component\">\nimport {\n    computed,\n    ref,\n    useSlots,\n    useId,\n    useTemplateRef,\n    type Component,\n    type Ref,\n    type ComputedRef,\n    type VNode,\n} from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { ClassBinding } from \"@/types\";\nimport type { StepsComponent, StepItemComponent } from \"./types\";\nimport type { StepItemProps } from \"./props\";\n\n/**\n * An step item used by the steps component.\n * @displayName Step Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OStepItem\",\n    configField: \"steps\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<StepItemProps<T, C>>(), {\n    override: undefined,\n    // @ts-expect-error string is not assignable of generic type T\n    value: () => useId(),\n    label: undefined,\n    step: undefined,\n    variant: undefined,\n    clickable: undefined,\n    disabled: false,\n    visible: true,\n    icon: () => getDefault(\"steps.icon\"),\n    iconPack: () => getDefault(\"steps.iconPack\"),\n    content: undefined,\n    component: undefined,\n    props: undefined,\n    events: undefined,\n});\n\nconst emits = defineEmits<{\n    /** on step item activate event */\n    activate: [];\n    /** on step item deactivate event */\n    deactivate: [];\n}>();\n\ndefineSlots<{\n    /**\n     * Define the step item content here\n     * @param active {boolean} - if item is shown\n     */\n    default?(props: { active: boolean }): VNode[];\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nconst slots = useSlots();\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<StepItemComponent<T>>(() => ({\n    value: props.value,\n    label: props.label,\n    step: props.step,\n    disabled: props.disabled,\n    visible: props.visible,\n    icon: props.icon,\n    iconPack: props.iconPack,\n    $slots: slots,\n    stepClasses: stepClasses.value,\n    iconClasses: stepIconClasses.value,\n    labelClasses: stepLabelClasses.value,\n    isClickable: isClickable.value,\n    isTransitioning: isTransitioning.value,\n    activate,\n    deactivate,\n}));\n\n/** inject functionalities and data from the parent component */\nconst { parent, item } = useProviderChild<StepsComponent, StepItemComponent<T>>(\n    rootRef,\n    { data: providedData },\n);\n\nconst isActive = computed(() => item.value.index === parent.value.activeIndex);\n\nconst transitionName = ref<string>();\nconst isTransitioning = ref(false);\n\nconst nextAnimation = computed(() => {\n    const idx =\n        parent.value.vertical && parent.value.animation.length === 4 ? 2 : 0;\n    return parent.value.animation[idx];\n});\n\nconst prevAnimation = computed(() => {\n    const idx =\n        parent.value.vertical && parent.value.animation.length === 4 ? 3 : 1;\n    return parent.value.animation[idx];\n});\n\nconst itemVariant = computed(() => parent.value.variant ?? props.variant);\n\n/** Shows if the item is clickable or not. */\n// strongly type this variable to prevent circular type dependency\n// because `parent` is used inside and the variable is used by the parent\nconst isClickable: ComputedRef<boolean> = computed(\n    () =>\n        !props.disabled &&\n        props.clickable !== false &&\n        (props.clickable || item.value.index < parent.value.activeIndex),\n);\n\n/** Activate element, alter animation name based on the index. */\nfunction activate(oldIndex: number): void {\n    transitionName.value =\n        item.value.index < oldIndex ? nextAnimation.value : prevAnimation.value;\n    emits(\"activate\");\n}\n\n/** Deactivate element, alter animation name based on the index. */\nfunction deactivate(newIndex: number): void {\n    transitionName.value =\n        newIndex < item.value.index ? nextAnimation.value : prevAnimation.value;\n    emits(\"deactivate\");\n}\n\n/** Transition start hook. */\nfunction onTransitionStart(): void {\n    isTransitioning.value = true;\n}\n\n/** Transition end hook. */\nfunction onTransitionEnd(): void {\n    isTransitioning.value = false;\n}\n\n// #region --- Computed Component Classes ---\n\n// strongly type this variable to prevent circular type dependency\n// because `parent` is used in the definition of any class\n// and the variable is used by the parent\nconst stepClasses: Ref<ClassBinding[]> = defineClasses(\n    [\"stepClass\", \"o-steps__step\"],\n    [\n        \"stepVariantClass\",\n        \"o-steps__step--\",\n        itemVariant,\n        computed(() => !!itemVariant.value),\n    ],\n    [\n        \"stepPositionClass\",\n        \"o-steps__step--\",\n        computed(() => parent.value?.labelPosition),\n        computed(() => !!parent.value?.labelPosition),\n    ],\n    [\"stepClickableClass\", \"o-steps__step--clickable\", null, isClickable],\n    [\"stepActiveClass\", \"o-steps__step--active\", null, isActive],\n    [\n        \"stepDisabledClass\",\n        \"o-steps__step--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"stepPreviousClass\",\n        \"o-steps__step--previous\",\n        null,\n        computed(() => item.value.index < parent.value?.activeIndex),\n    ],\n    [\n        \"stepNextClass\",\n        \"o-steps__step--next\",\n        null,\n        computed(() => item.value.index > parent.value?.activeIndex),\n    ],\n);\n\nconst stepLabelClasses = defineClasses([\n    \"stepLabelClass\",\n    \"o-steps__step-label\",\n]);\n\nconst stepIconClasses = defineClasses([\"stepIconClass\", \"o-steps__step-icon\"]);\n\nconst panelClasses = defineClasses([\"stepPanelClass\", \"o-steps__panel\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <Transition\n        v-if=\"parent\"\n        :css=\"parent.animated\"\n        :name=\"transitionName\"\n        :appear=\"parent.animateInitially\"\n        @before-enter=\"onTransitionStart\"\n        @after-enter=\"onTransitionEnd\"\n        @before-leave=\"onTransitionStart\"\n        @after-leave=\"onTransitionEnd\">\n        <div\n            v-show=\"isActive && visible\"\n            v-bind=\"$attrs\"\n            :id=\"`tabpanel-${item.identifier}`\"\n            ref=\"rootElement\"\n            data-oruga=\"steps-item\"\n            :data-id=\"`steps-${item.identifier}`\"\n            :class=\"panelClasses\"\n            role=\"tabpanel\"\n            :aria-hidden=\"!isActive\"\n            :aria-labelledby=\"`tab-${item.identifier}`\"\n            aria-roledescription=\"item\">\n            <slot :active=\"isActive && visible\">\n                <!-- injected component -->\n                <component\n                    :is=\"$props.component\"\n                    v-if=\"$props.component\"\n                    v-bind=\"$props.props\"\n                    v-on=\"$props.events || {}\" />\n\n                <!-- default content prop -->\n                <template v-else>{{ content }}</template>\n            </slot>\n        </div>\n    </Transition>\n</template>\n","<script setup lang=\"ts\" generic=\"T, C extends Component\">\nimport {\n    computed,\n    ref,\n    useSlots,\n    useId,\n    useTemplateRef,\n    type Component,\n    type Ref,\n    type ComputedRef,\n    type VNode,\n} from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { ClassBinding } from \"@/types\";\nimport type { StepsComponent, StepItemComponent } from \"./types\";\nimport type { StepItemProps } from \"./props\";\n\n/**\n * An step item used by the steps component.\n * @displayName Step Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OStepItem\",\n    configField: \"steps\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<StepItemProps<T, C>>(), {\n    override: undefined,\n    // @ts-expect-error string is not assignable of generic type T\n    value: () => useId(),\n    label: undefined,\n    step: undefined,\n    variant: undefined,\n    clickable: undefined,\n    disabled: false,\n    visible: true,\n    icon: () => getDefault(\"steps.icon\"),\n    iconPack: () => getDefault(\"steps.iconPack\"),\n    content: undefined,\n    component: undefined,\n    props: undefined,\n    events: undefined,\n});\n\nconst emits = defineEmits<{\n    /** on step item activate event */\n    activate: [];\n    /** on step item deactivate event */\n    deactivate: [];\n}>();\n\ndefineSlots<{\n    /**\n     * Define the step item content here\n     * @param active {boolean} - if item is shown\n     */\n    default?(props: { active: boolean }): VNode[];\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nconst slots = useSlots();\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<StepItemComponent<T>>(() => ({\n    value: props.value,\n    label: props.label,\n    step: props.step,\n    disabled: props.disabled,\n    visible: props.visible,\n    icon: props.icon,\n    iconPack: props.iconPack,\n    $slots: slots,\n    stepClasses: stepClasses.value,\n    iconClasses: stepIconClasses.value,\n    labelClasses: stepLabelClasses.value,\n    isClickable: isClickable.value,\n    isTransitioning: isTransitioning.value,\n    activate,\n    deactivate,\n}));\n\n/** inject functionalities and data from the parent component */\nconst { parent, item } = useProviderChild<StepsComponent, StepItemComponent<T>>(\n    rootRef,\n    { data: providedData },\n);\n\nconst isActive = computed(() => item.value.index === parent.value.activeIndex);\n\nconst transitionName = ref<string>();\nconst isTransitioning = ref(false);\n\nconst nextAnimation = computed(() => {\n    const idx =\n        parent.value.vertical && parent.value.animation.length === 4 ? 2 : 0;\n    return parent.value.animation[idx];\n});\n\nconst prevAnimation = computed(() => {\n    const idx =\n        parent.value.vertical && parent.value.animation.length === 4 ? 3 : 1;\n    return parent.value.animation[idx];\n});\n\nconst itemVariant = computed(() => parent.value.variant ?? props.variant);\n\n/** Shows if the item is clickable or not. */\n// strongly type this variable to prevent circular type dependency\n// because `parent` is used inside and the variable is used by the parent\nconst isClickable: ComputedRef<boolean> = computed(\n    () =>\n        !props.disabled &&\n        props.clickable !== false &&\n        (props.clickable || item.value.index < parent.value.activeIndex),\n);\n\n/** Activate element, alter animation name based on the index. */\nfunction activate(oldIndex: number): void {\n    transitionName.value =\n        item.value.index < oldIndex ? nextAnimation.value : prevAnimation.value;\n    emits(\"activate\");\n}\n\n/** Deactivate element, alter animation name based on the index. */\nfunction deactivate(newIndex: number): void {\n    transitionName.value =\n        newIndex < item.value.index ? nextAnimation.value : prevAnimation.value;\n    emits(\"deactivate\");\n}\n\n/** Transition start hook. */\nfunction onTransitionStart(): void {\n    isTransitioning.value = true;\n}\n\n/** Transition end hook. */\nfunction onTransitionEnd(): void {\n    isTransitioning.value = false;\n}\n\n// #region --- Computed Component Classes ---\n\n// strongly type this variable to prevent circular type dependency\n// because `parent` is used in the definition of any class\n// and the variable is used by the parent\nconst stepClasses: Ref<ClassBinding[]> = defineClasses(\n    [\"stepClass\", \"o-steps__step\"],\n    [\n        \"stepVariantClass\",\n        \"o-steps__step--\",\n        itemVariant,\n        computed(() => !!itemVariant.value),\n    ],\n    [\n        \"stepPositionClass\",\n        \"o-steps__step--\",\n        computed(() => parent.value?.labelPosition),\n        computed(() => !!parent.value?.labelPosition),\n    ],\n    [\"stepClickableClass\", \"o-steps__step--clickable\", null, isClickable],\n    [\"stepActiveClass\", \"o-steps__step--active\", null, isActive],\n    [\n        \"stepDisabledClass\",\n        \"o-steps__step--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"stepPreviousClass\",\n        \"o-steps__step--previous\",\n        null,\n        computed(() => item.value.index < parent.value?.activeIndex),\n    ],\n    [\n        \"stepNextClass\",\n        \"o-steps__step--next\",\n        null,\n        computed(() => item.value.index > parent.value?.activeIndex),\n    ],\n);\n\nconst stepLabelClasses = defineClasses([\n    \"stepLabelClass\",\n    \"o-steps__step-label\",\n]);\n\nconst stepIconClasses = defineClasses([\"stepIconClass\", \"o-steps__step-icon\"]);\n\nconst panelClasses = defineClasses([\"stepPanelClass\", \"o-steps__panel\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <Transition\n        v-if=\"parent\"\n        :css=\"parent.animated\"\n        :name=\"transitionName\"\n        :appear=\"parent.animateInitially\"\n        @before-enter=\"onTransitionStart\"\n        @after-enter=\"onTransitionEnd\"\n        @before-leave=\"onTransitionStart\"\n        @after-leave=\"onTransitionEnd\">\n        <div\n            v-show=\"isActive && visible\"\n            v-bind=\"$attrs\"\n            :id=\"`tabpanel-${item.identifier}`\"\n            ref=\"rootElement\"\n            data-oruga=\"steps-item\"\n            :data-id=\"`steps-${item.identifier}`\"\n            :class=\"panelClasses\"\n            role=\"tabpanel\"\n            :aria-hidden=\"!isActive\"\n            :aria-labelledby=\"`tab-${item.identifier}`\"\n            aria-roledescription=\"item\">\n            <slot :active=\"isActive && visible\">\n                <!-- injected component -->\n                <component\n                    :is=\"$props.component\"\n                    v-if=\"$props.component\"\n                    v-bind=\"$props.props\"\n                    v-on=\"$props.events || {}\" />\n\n                <!-- default content prop -->\n                <template v-else>{{ content }}</template>\n            </slot>\n        </div>\n    </Transition>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport {\n    computed,\n    nextTick,\n    ref,\n    watch,\n    watchEffect,\n    useTemplateRef,\n    onMounted,\n} from \"vue\";\n\nimport OStepItem from \"../steps/StepItem.vue\";\nimport OButton from \"../button/Button.vue\";\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isDefined } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderParent,\n    useMatchMedia,\n    useIndexer,\n} from \"@/composables\";\n\nimport type { StepItem, StepItemComponent, StepsComponent } from \"./types\";\nimport type { StepsProps } from \"./props\";\n\n/**\n * Responsive horizontal process steps.\n * @displayName Steps\n * @requires ./StepItem.vue\n * @style _steps.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSteps\",\n    configField: \"steps\",\n});\n\ntype ModelValue = StepsProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<StepsProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    options: undefined,\n    variant: () => getDefault(\"steps.variant\"),\n    size: () => getDefault(\"steps.size\"),\n    vertical: false,\n    position: undefined,\n    iconPack: () => getDefault(\"steps.iconPack\"),\n    iconPrev: () => getDefault(\"steps.iconPrev\", \"chevron-left\"),\n    iconNext: () => getDefault(\"steps.iconNext\", \"chevron-right\"),\n    hasNavigation: true,\n    activateOnFocus: false,\n    animated: () => getDefault(\"steps.animated\", true),\n    animation: () =>\n        getDefault(\"steps.animation\", [\n            \"slide-next\",\n            \"slide-prev\",\n            \"slide-down\",\n            \"slide-up\",\n        ]),\n    animateInitially: () => getDefault(\"steps.animateInitially\", false),\n    labelPosition: () => getDefault(\"steps.labelPosition\", \"bottom\"),\n    rounded: true,\n    mobileBreakpoint: () => getDefault(\"steps.mobileBreakpoint\"),\n    ariaLabel: () => getDefault(\"steps.ariaLabel\"),\n    ariaNextLabel: () => getDefault(\"steps.ariaNextLabel\", \"Next\"),\n    ariaPreviousLabel: () => getDefault(\"steps.ariaPreviousLabel\", \"Previous\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on step change event\n     * @param value {unknown} - new step value\n     * @param value {unknown} - old step value\n     */\n    change: [newValue: ModelValue, oldValue: ModelValue];\n}>();\n\ndefineSlots<{\n    /** Define the step items here */\n    default?(): void;\n    /**\n     * Override the step navigation\n     * @param previous {{disabled: boolean, action: (): void }} - previous button configs\n     * @param next {{disabled: boolean, action: (): void }} - next button configs\n     */\n    navigation?(props: {\n        previous: { disabled: boolean; action: () => void };\n        next: { disabled: boolean; action: () => void };\n    }): void;\n}>();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<StepsComponent>(() => ({\n    activeIndex: activeItem.value?.index ?? 0,\n    labelPosition: props.labelPosition,\n    vertical: props.vertical,\n    variant: props.variant,\n    animated: props.animated,\n    animation: props.animation,\n    animateInitially: props.animateInitially,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems, itemsCount } = useProviderParent<StepItemComponent<T>>({\n    rootRef,\n    data: provideData,\n});\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\n// #region --- Selected Item Feature ---\n\n/** The selected item value, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n/** the active item */\nconst activeItem = ref<StepItem<T>>();\n\nonMounted(() => {\n    // set first step as default if not defined\n    if (!vmodel.value) vmodel.value = childItems.value[0]?.data.value;\n});\n\n/** When v-model is changed set the new active step. */\nwatch(\n    () => props.modelValue,\n    (value) => {\n        if (vmodel.value !== value) activateItem(value);\n    },\n);\n\n// set the active item immediate and every time the vmodel changes\nwatchEffect(() => {\n    activeItem.value = isDefined(vmodel.value)\n        ? childItems.value.find((item) => item.data.value === vmodel.value) ||\n          childItems.value[0]\n        : childItems.value[0];\n});\n\nconst isTransitioning = computed(() =>\n    childItems.value.some((item) => item.data.isTransitioning),\n);\n\n/** Activate a specific child item by value and deactivate the previous child item. */\nfunction activateItem(newValue: ModelValue): void {\n    const oldValue = activeItem.value?.data.value;\n    const oldItem = activeItem.value;\n    const newItem =\n        childItems.value.find((item) => item.data.value === newValue) ||\n        childItems.value[0];\n\n    if (oldItem && newItem) {\n        oldItem.data.deactivate(newItem.index);\n        newItem.data.activate(oldItem.index);\n    }\n\n    nextTick(() => {\n        vmodel.value = newValue;\n        emits(\"change\", newValue, oldValue);\n    });\n}\n\n// #endregion --- Active Item Feature ---\n\n// #region --- Switch Item Events ---\n\n/** Activate the item after or before the current active item. */\nfunction moveActiveItem(fowardIndex: 1 | -1): void {\n    const index = (activeItem.value?.index ?? 0) + fowardIndex;\n    if (index < 0 || index >= itemsCount.value) return;\n    const item = childItems.value[index];\n    if (vmodel.value !== item.data.value) activateItem(item.data.value);\n}\n\n/** Item click listener, emit input event and change active child. */\nfunction itemClick(item: StepItem<T>): void {\n    if (!item.data || vmodel.value === item.data.value) return;\n    if (!item.data.isClickable) return;\n    activateItem(item.data.value);\n}\n\n/** Check if previous button is available. */\nconst hasPrev = computed(() =>\n    isDefined(getFirstViableItem((activeItem.value?.index ?? 0) - 1, false)),\n);\n\n/** Check if next button is available. */\nconst hasNext = computed(() =>\n    isDefined(getFirstViableItem((activeItem.value?.index ?? 0) + 1, true)),\n);\n\n/** Focus the next item if possible. */\nfunction onNext(index: number): void {\n    const item = getFirstViableItem(index + 1, true);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Focus the previous item if possible. */\nfunction onPrev(index: number): void {\n    const item = getFirstViableItem(index - 1, false);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Focus the first viable item. */\nfunction onHomePressed(): void {\n    if (itemsCount.value < 1) return;\n    const item = getFirstViableItem(0, true);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Focus the last viable item. */\nfunction onEndPressed(): void {\n    if (itemsCount.value < 1) return;\n    const item = getFirstViableItem(itemsCount.value - 1, false);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Set focus on a step item or click it if `activateOnFocus`. */\nfunction moveFocus(item: StepItem<T>): void {\n    if (props.activateOnFocus) {\n        itemClick(item);\n    } else {\n        const el = rootRef.value?.querySelector<HTMLElement>(\n            `#tab-${item.identifier}`,\n        );\n        el?.focus();\n    }\n}\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(\n    startingIndex: number,\n    forward: boolean,\n): StepItem<T> | undefined {\n    const direction = forward ? 1 : -1;\n    let newIndex = startingIndex;\n    for (; newIndex > 0 && newIndex < itemsCount.value; newIndex += direction) {\n        const item = childItems.value[newIndex];\n        // Break if the item at this index is viable (not disabled and is visible)\n        if (item.data.visible && !item.data.disabled) break;\n    }\n\n    if (newIndex < 0 || newIndex >= itemsCount.value) return undefined;\n    return childItems.value[newIndex];\n}\n\n// #endregion --- Switch Item Events ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-steps\"],\n    [\n        \"sizeClass\",\n        \"o-steps--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"verticalClass\",\n        \"o-steps--vertical\",\n        null,\n        computed(() => props.vertical),\n    ],\n    [\n        \"positionClass\",\n        \"o-steps--position-\",\n        computed(() => props.position),\n        computed(() => !!props.position && props.vertical),\n    ],\n    [\"mobileClass\", \"o-steps--mobile\", null, isMobile],\n);\n\nconst tablistClasses = defineClasses(\n    [\"listClass\", \"o-steps__list\"],\n    [\n        \"animatedClass\",\n        \"o-steps__list--animated\",\n        null,\n        computed(() => props.animated),\n    ],\n);\n\nconst dividerClasses = defineClasses([\"dividerClass\", \"o-steps__divider\"]);\n\nconst markerClasses = defineClasses(\n    [\"markerClass\", \"o-steps__marker\"],\n    [\n        \"markerRoundedClass\",\n        \"o-steps__marker--rounded\",\n        null,\n        computed(() => props.rounded),\n    ],\n);\n\nconst contentClasses = defineClasses(\n    [\"contentClass\", \"o-steps__content\"],\n    [\n        \"transitioningClass\",\n        \"o-steps__content--transitioning\",\n        null,\n        isTransitioning,\n    ],\n);\n\nconst navigationClasses = defineClasses([\n    \"navigationClass\",\n    \"o-steps__navigation\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div ref=\"rootElement\" data-oruga=\"steps\" :class=\"rootClasses\">\n        <ol\n            :class=\"tablistClasses\"\n            role=\"tablist\"\n            :aria-label=\"ariaLabel\"\n            :aria-orientation=\"vertical ? 'vertical' : 'horizontal'\">\n            <li\n                v-for=\"(item, index) in childItems\"\n                v-show=\"item.data.visible\"\n                :id=\"`tab-${item.identifier}`\"\n                :key=\"item.identifier\"\n                :class=\"item.data.stepClasses\"\n                role=\"tab\"\n                :tabindex=\"item.data.value === activeItem?.data.value ? 0 : -1\"\n                :aria-current=\"\n                    item.data.value === activeItem?.data.value\n                        ? 'step'\n                        : undefined\n                \"\n                :aria-controls=\"`tabpanel-${item.identifier}`\"\n                :aria-selected=\"item.data.value === activeItem?.data.value\"\n                @click=\"itemClick(item)\"\n                @keydown.enter.prevent=\"itemClick(item)\"\n                @keydown.space.prevent=\"itemClick(item)\"\n                @keydown.left.prevent=\"onPrev(item.index)\"\n                @keydown.right.prevent=\"onNext(item.index)\"\n                @keydown.home.prevent=\"onHomePressed\"\n                @keydown.end.prevent=\"onEndPressed\">\n                <span v-if=\"index > 0\" :class=\"dividerClasses\" />\n\n                <div :class=\"markerClasses\">\n                    <o-icon\n                        v-if=\"item.data.icon\"\n                        :class=\"item.data.iconClasses\"\n                        :icon=\"item.data.icon\"\n                        :pack=\"item.data.iconPack\"\n                        :size=\"size\" />\n                    <span v-else-if=\"item.data.step\">\n                        {{ item.data.step }}\n                    </span>\n                </div>\n\n                <div :class=\"item.data.labelClasses\">\n                    {{ item.data.label }}\n                </div>\n            </li>\n        </ol>\n\n        <section :class=\"contentClasses\">\n            <slot>\n                <o-step-item\n                    v-for=\"option in normalizedOptions\"\n                    v-bind=\"option.item\"\n                    :key=\"option.key\" />\n            </slot>\n        </section>\n\n        <slot\n            name=\"navigation\"\n            :previous=\"{\n                disabled: !hasPrev,\n                action: () => moveActiveItem(-1),\n            }\"\n            :next=\"{ disabled: !hasNext, action: () => moveActiveItem(1) }\">\n            <nav v-if=\"hasNavigation\" :class=\"navigationClasses\">\n                <o-button\n                    role=\"button\"\n                    :icon-left=\"iconPrev\"\n                    :icon-pack=\"iconPack\"\n                    :disabled=\"!hasPrev\"\n                    :aria-label=\"ariaPreviousLabel\"\n                    @click.prevent=\"moveActiveItem(-1)\" />\n\n                <o-button\n                    role=\"button\"\n                    :icon-left=\"iconNext\"\n                    :icon-pack=\"iconPack\"\n                    :disabled=\"!hasNext\"\n                    :aria-label=\"ariaNextLabel\"\n                    @click.prevent=\"moveActiveItem(1)\" />\n            </nav>\n        </slot>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport {\n    computed,\n    nextTick,\n    ref,\n    watch,\n    watchEffect,\n    useTemplateRef,\n    onMounted,\n} from \"vue\";\n\nimport OStepItem from \"../steps/StepItem.vue\";\nimport OButton from \"../button/Button.vue\";\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isDefined } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderParent,\n    useMatchMedia,\n    useIndexer,\n} from \"@/composables\";\n\nimport type { StepItem, StepItemComponent, StepsComponent } from \"./types\";\nimport type { StepsProps } from \"./props\";\n\n/**\n * Responsive horizontal process steps.\n * @displayName Steps\n * @requires ./StepItem.vue\n * @style _steps.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSteps\",\n    configField: \"steps\",\n});\n\ntype ModelValue = StepsProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<StepsProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    options: undefined,\n    variant: () => getDefault(\"steps.variant\"),\n    size: () => getDefault(\"steps.size\"),\n    vertical: false,\n    position: undefined,\n    iconPack: () => getDefault(\"steps.iconPack\"),\n    iconPrev: () => getDefault(\"steps.iconPrev\", \"chevron-left\"),\n    iconNext: () => getDefault(\"steps.iconNext\", \"chevron-right\"),\n    hasNavigation: true,\n    activateOnFocus: false,\n    animated: () => getDefault(\"steps.animated\", true),\n    animation: () =>\n        getDefault(\"steps.animation\", [\n            \"slide-next\",\n            \"slide-prev\",\n            \"slide-down\",\n            \"slide-up\",\n        ]),\n    animateInitially: () => getDefault(\"steps.animateInitially\", false),\n    labelPosition: () => getDefault(\"steps.labelPosition\", \"bottom\"),\n    rounded: true,\n    mobileBreakpoint: () => getDefault(\"steps.mobileBreakpoint\"),\n    ariaLabel: () => getDefault(\"steps.ariaLabel\"),\n    ariaNextLabel: () => getDefault(\"steps.ariaNextLabel\", \"Next\"),\n    ariaPreviousLabel: () => getDefault(\"steps.ariaPreviousLabel\", \"Previous\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on step change event\n     * @param value {unknown} - new step value\n     * @param value {unknown} - old step value\n     */\n    change: [newValue: ModelValue, oldValue: ModelValue];\n}>();\n\ndefineSlots<{\n    /** Define the step items here */\n    default?(): void;\n    /**\n     * Override the step navigation\n     * @param previous {{disabled: boolean, action: (): void }} - previous button configs\n     * @param next {{disabled: boolean, action: (): void }} - next button configs\n     */\n    navigation?(props: {\n        previous: { disabled: boolean; action: () => void };\n        next: { disabled: boolean; action: () => void };\n    }): void;\n}>();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<StepsComponent>(() => ({\n    activeIndex: activeItem.value?.index ?? 0,\n    labelPosition: props.labelPosition,\n    vertical: props.vertical,\n    variant: props.variant,\n    animated: props.animated,\n    animation: props.animation,\n    animateInitially: props.animateInitially,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems, itemsCount } = useProviderParent<StepItemComponent<T>>({\n    rootRef,\n    data: provideData,\n});\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\n// #region --- Selected Item Feature ---\n\n/** The selected item value, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n/** the active item */\nconst activeItem = ref<StepItem<T>>();\n\nonMounted(() => {\n    // set first step as default if not defined\n    if (!vmodel.value) vmodel.value = childItems.value[0]?.data.value;\n});\n\n/** When v-model is changed set the new active step. */\nwatch(\n    () => props.modelValue,\n    (value) => {\n        if (vmodel.value !== value) activateItem(value);\n    },\n);\n\n// set the active item immediate and every time the vmodel changes\nwatchEffect(() => {\n    activeItem.value = isDefined(vmodel.value)\n        ? childItems.value.find((item) => item.data.value === vmodel.value) ||\n          childItems.value[0]\n        : childItems.value[0];\n});\n\nconst isTransitioning = computed(() =>\n    childItems.value.some((item) => item.data.isTransitioning),\n);\n\n/** Activate a specific child item by value and deactivate the previous child item. */\nfunction activateItem(newValue: ModelValue): void {\n    const oldValue = activeItem.value?.data.value;\n    const oldItem = activeItem.value;\n    const newItem =\n        childItems.value.find((item) => item.data.value === newValue) ||\n        childItems.value[0];\n\n    if (oldItem && newItem) {\n        oldItem.data.deactivate(newItem.index);\n        newItem.data.activate(oldItem.index);\n    }\n\n    nextTick(() => {\n        vmodel.value = newValue;\n        emits(\"change\", newValue, oldValue);\n    });\n}\n\n// #endregion --- Active Item Feature ---\n\n// #region --- Switch Item Events ---\n\n/** Activate the item after or before the current active item. */\nfunction moveActiveItem(fowardIndex: 1 | -1): void {\n    const index = (activeItem.value?.index ?? 0) + fowardIndex;\n    if (index < 0 || index >= itemsCount.value) return;\n    const item = childItems.value[index];\n    if (vmodel.value !== item.data.value) activateItem(item.data.value);\n}\n\n/** Item click listener, emit input event and change active child. */\nfunction itemClick(item: StepItem<T>): void {\n    if (!item.data || vmodel.value === item.data.value) return;\n    if (!item.data.isClickable) return;\n    activateItem(item.data.value);\n}\n\n/** Check if previous button is available. */\nconst hasPrev = computed(() =>\n    isDefined(getFirstViableItem((activeItem.value?.index ?? 0) - 1, false)),\n);\n\n/** Check if next button is available. */\nconst hasNext = computed(() =>\n    isDefined(getFirstViableItem((activeItem.value?.index ?? 0) + 1, true)),\n);\n\n/** Focus the next item if possible. */\nfunction onNext(index: number): void {\n    const item = getFirstViableItem(index + 1, true);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Focus the previous item if possible. */\nfunction onPrev(index: number): void {\n    const item = getFirstViableItem(index - 1, false);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Focus the first viable item. */\nfunction onHomePressed(): void {\n    if (itemsCount.value < 1) return;\n    const item = getFirstViableItem(0, true);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Focus the last viable item. */\nfunction onEndPressed(): void {\n    if (itemsCount.value < 1) return;\n    const item = getFirstViableItem(itemsCount.value - 1, false);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Set focus on a step item or click it if `activateOnFocus`. */\nfunction moveFocus(item: StepItem<T>): void {\n    if (props.activateOnFocus) {\n        itemClick(item);\n    } else {\n        const el = rootRef.value?.querySelector<HTMLElement>(\n            `#tab-${item.identifier}`,\n        );\n        el?.focus();\n    }\n}\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(\n    startingIndex: number,\n    forward: boolean,\n): StepItem<T> | undefined {\n    const direction = forward ? 1 : -1;\n    let newIndex = startingIndex;\n    for (; newIndex > 0 && newIndex < itemsCount.value; newIndex += direction) {\n        const item = childItems.value[newIndex];\n        // Break if the item at this index is viable (not disabled and is visible)\n        if (item.data.visible && !item.data.disabled) break;\n    }\n\n    if (newIndex < 0 || newIndex >= itemsCount.value) return undefined;\n    return childItems.value[newIndex];\n}\n\n// #endregion --- Switch Item Events ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-steps\"],\n    [\n        \"sizeClass\",\n        \"o-steps--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"verticalClass\",\n        \"o-steps--vertical\",\n        null,\n        computed(() => props.vertical),\n    ],\n    [\n        \"positionClass\",\n        \"o-steps--position-\",\n        computed(() => props.position),\n        computed(() => !!props.position && props.vertical),\n    ],\n    [\"mobileClass\", \"o-steps--mobile\", null, isMobile],\n);\n\nconst tablistClasses = defineClasses(\n    [\"listClass\", \"o-steps__list\"],\n    [\n        \"animatedClass\",\n        \"o-steps__list--animated\",\n        null,\n        computed(() => props.animated),\n    ],\n);\n\nconst dividerClasses = defineClasses([\"dividerClass\", \"o-steps__divider\"]);\n\nconst markerClasses = defineClasses(\n    [\"markerClass\", \"o-steps__marker\"],\n    [\n        \"markerRoundedClass\",\n        \"o-steps__marker--rounded\",\n        null,\n        computed(() => props.rounded),\n    ],\n);\n\nconst contentClasses = defineClasses(\n    [\"contentClass\", \"o-steps__content\"],\n    [\n        \"transitioningClass\",\n        \"o-steps__content--transitioning\",\n        null,\n        isTransitioning,\n    ],\n);\n\nconst navigationClasses = defineClasses([\n    \"navigationClass\",\n    \"o-steps__navigation\",\n]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div ref=\"rootElement\" data-oruga=\"steps\" :class=\"rootClasses\">\n        <ol\n            :class=\"tablistClasses\"\n            role=\"tablist\"\n            :aria-label=\"ariaLabel\"\n            :aria-orientation=\"vertical ? 'vertical' : 'horizontal'\">\n            <li\n                v-for=\"(item, index) in childItems\"\n                v-show=\"item.data.visible\"\n                :id=\"`tab-${item.identifier}`\"\n                :key=\"item.identifier\"\n                :class=\"item.data.stepClasses\"\n                role=\"tab\"\n                :tabindex=\"item.data.value === activeItem?.data.value ? 0 : -1\"\n                :aria-current=\"\n                    item.data.value === activeItem?.data.value\n                        ? 'step'\n                        : undefined\n                \"\n                :aria-controls=\"`tabpanel-${item.identifier}`\"\n                :aria-selected=\"item.data.value === activeItem?.data.value\"\n                @click=\"itemClick(item)\"\n                @keydown.enter.prevent=\"itemClick(item)\"\n                @keydown.space.prevent=\"itemClick(item)\"\n                @keydown.left.prevent=\"onPrev(item.index)\"\n                @keydown.right.prevent=\"onNext(item.index)\"\n                @keydown.home.prevent=\"onHomePressed\"\n                @keydown.end.prevent=\"onEndPressed\">\n                <span v-if=\"index > 0\" :class=\"dividerClasses\" />\n\n                <div :class=\"markerClasses\">\n                    <o-icon\n                        v-if=\"item.data.icon\"\n                        :class=\"item.data.iconClasses\"\n                        :icon=\"item.data.icon\"\n                        :pack=\"item.data.iconPack\"\n                        :size=\"size\" />\n                    <span v-else-if=\"item.data.step\">\n                        {{ item.data.step }}\n                    </span>\n                </div>\n\n                <div :class=\"item.data.labelClasses\">\n                    {{ item.data.label }}\n                </div>\n            </li>\n        </ol>\n\n        <section :class=\"contentClasses\">\n            <slot>\n                <o-step-item\n                    v-for=\"option in normalizedOptions\"\n                    v-bind=\"option.item\"\n                    :key=\"option.key\" />\n            </slot>\n        </section>\n\n        <slot\n            name=\"navigation\"\n            :previous=\"{\n                disabled: !hasPrev,\n                action: () => moveActiveItem(-1),\n            }\"\n            :next=\"{ disabled: !hasNext, action: () => moveActiveItem(1) }\">\n            <nav v-if=\"hasNavigation\" :class=\"navigationClasses\">\n                <o-button\n                    role=\"button\"\n                    :icon-left=\"iconPrev\"\n                    :icon-pack=\"iconPack\"\n                    :disabled=\"!hasPrev\"\n                    :aria-label=\"ariaPreviousLabel\"\n                    @click.prevent=\"moveActiveItem(-1)\" />\n\n                <o-button\n                    role=\"button\"\n                    :icon-left=\"iconNext\"\n                    :icon-pack=\"iconPack\"\n                    :disabled=\"!hasNext\"\n                    :aria-label=\"ariaNextLabel\"\n                    @click.prevent=\"moveActiveItem(1)\" />\n            </nav>\n        </slot>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Steps from \"./Steps.vue\";\nimport StepItem from \"./StepItem.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export steps specific types */\nexport type * from \"./props\";\nexport type * from \"./types\";\n\n/** export steps plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Steps);\n        registerComponent(app, StepItem);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export steps components */\nexport { Steps as OSteps, StepItem as OStepItem };\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, useAttrs, useId, useSlots, useTemplateRef } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { SwitchProps } from \"./props\";\n\n/**\n * Switch between two opposing states.\n * @displayName Switch\n * @style _switch.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSwitch\",\n    configField: \"switch\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<SwitchProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    id: () => useId(),\n    label: undefined,\n    variant: () => getDefault(\"switch.variant\"),\n    passiveVariant: () => getDefault(\"switch.passiveVariant\"),\n    size: () => getDefault(\"switch.size\"),\n    position: () => getDefault(\"switch.right\", \"position\"),\n    rounded: () => getDefault(\"switch.rounded\", true),\n    required: false,\n    disabled: false,\n    name: undefined,\n    nativeValue: undefined,\n    trueValue: undefined,\n    falseValue: undefined,\n    autocomplete: () => getDefault(\"switch.autocomplete\", \"off\"),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: T];\n    /**\n     * on input change event\n     * @param value {unknown} - input value\n     * @param event {Event} - native event\n     */\n    input: [value: T, event: Event];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst inputRef = useTemplateRef(\"inputElement\");\n\n// use form input functionalities\nconst { checkHtml5Validity, onBlur, onFocus, onInvalid, setFocus } =\n    useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// set field labelId or create a unique label id if a label is given\nconst labelId =\n    !!parentField.value || !!props.label || !!useSlots().default\n        ? parentField.value?.labelId || useId()\n        : undefined;\n\n// if no `label` is given and `id` is given set as `for` property on o-field wrapper\nif (!props.label && props.id) parentField.value?.setInputId(props.id);\n\nconst vmodel = defineModel<T>({ default: undefined });\n\nconst isChecked = computed(\n    () =>\n        vmodel.value === (props.trueValue ?? true) ||\n        (Array.isArray(vmodel.value) &&\n            vmodel.value.includes(props.nativeValue)),\n);\n\nfunction onInput(event: Event): void {\n    emits(\"input\", vmodel.value, event);\n}\n\n// --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-switch\"],\n    [\n        \"sizeClass\",\n        \"o-switch--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-switch--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"passiveVariantClass\",\n        \"o-switch--\",\n        computed(() => props.passiveVariant + \"-passive\"),\n        computed(() => !!props.passiveVariant),\n    ],\n    [\n        \"positionClass\",\n        \"o-switch--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"disabledClass\",\n        \"o-switch--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\"roundedClass\", \"o-switch--rounded\", null, computed(() => props.rounded)],\n    [\"checkedClass\", \"o-switch--checked\", null, isChecked],\n);\n\nconst inputClasses = defineClasses([\"inputClass\", \"o-switch__input\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-switch__label\"]);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n</script>\n\n<template>\n    <div data-oruga=\"switch\" :class=\"rootClasses\">\n        <input\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"inputElement\"\n            v-model=\"vmodel\"\n            type=\"checkbox\"\n            role=\"switch\"\n            data-oruga-input=\"switch\"\n            :class=\"inputClasses\"\n            :name=\"name\"\n            :value=\"nativeValue\"\n            :true-value=\"trueValue ?? true\"\n            :false-value=\"falseValue ?? false\"\n            :required=\"required\"\n            :disabled=\"disabled\"\n            :autocomplete=\"autocomplete\"\n            :aria-checked=\"isChecked\"\n            :aria-labelledby=\"labelId\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\"\n            @change=\"onInput\" />\n\n        <label\n            v-if=\"label || $slots.default\"\n            :id=\"labelId\"\n            :for=\"id\"\n            :class=\"labelClasses\">\n            <slot>{{ label }}</slot>\n        </label>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, useAttrs, useId, useSlots, useTemplateRef } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { SwitchProps } from \"./props\";\n\n/**\n * Switch between two opposing states.\n * @displayName Switch\n * @style _switch.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OSwitch\",\n    configField: \"switch\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<SwitchProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    id: () => useId(),\n    label: undefined,\n    variant: () => getDefault(\"switch.variant\"),\n    passiveVariant: () => getDefault(\"switch.passiveVariant\"),\n    size: () => getDefault(\"switch.size\"),\n    position: () => getDefault(\"switch.right\", \"position\"),\n    rounded: () => getDefault(\"switch.rounded\", true),\n    required: false,\n    disabled: false,\n    name: undefined,\n    nativeValue: undefined,\n    trueValue: undefined,\n    falseValue: undefined,\n    autocomplete: () => getDefault(\"switch.autocomplete\", \"off\"),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: T];\n    /**\n     * on input change event\n     * @param value {unknown} - input value\n     * @param event {Event} - native event\n     */\n    input: [value: T, event: Event];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the label, default is label prop */\n    default?(): void;\n}>();\n\nconst inputRef = useTemplateRef(\"inputElement\");\n\n// use form input functionalities\nconst { checkHtml5Validity, onBlur, onFocus, onInvalid, setFocus } =\n    useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// set field labelId or create a unique label id if a label is given\nconst labelId =\n    !!parentField.value || !!props.label || !!useSlots().default\n        ? parentField.value?.labelId || useId()\n        : undefined;\n\n// if no `label` is given and `id` is given set as `for` property on o-field wrapper\nif (!props.label && props.id) parentField.value?.setInputId(props.id);\n\nconst vmodel = defineModel<T>({ default: undefined });\n\nconst isChecked = computed(\n    () =>\n        vmodel.value === (props.trueValue ?? true) ||\n        (Array.isArray(vmodel.value) &&\n            vmodel.value.includes(props.nativeValue)),\n);\n\nfunction onInput(event: Event): void {\n    emits(\"input\", vmodel.value, event);\n}\n\n// --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-switch\"],\n    [\n        \"sizeClass\",\n        \"o-switch--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-switch--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"passiveVariantClass\",\n        \"o-switch--\",\n        computed(() => props.passiveVariant + \"-passive\"),\n        computed(() => !!props.passiveVariant),\n    ],\n    [\n        \"positionClass\",\n        \"o-switch--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"disabledClass\",\n        \"o-switch--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\"roundedClass\", \"o-switch--rounded\", null, computed(() => props.rounded)],\n    [\"checkedClass\", \"o-switch--checked\", null, isChecked],\n);\n\nconst inputClasses = defineClasses([\"inputClass\", \"o-switch__input\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-switch__label\"]);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n</script>\n\n<template>\n    <div data-oruga=\"switch\" :class=\"rootClasses\">\n        <input\n            v-bind=\"inputBind\"\n            :id=\"id\"\n            ref=\"inputElement\"\n            v-model=\"vmodel\"\n            type=\"checkbox\"\n            role=\"switch\"\n            data-oruga-input=\"switch\"\n            :class=\"inputClasses\"\n            :name=\"name\"\n            :value=\"nativeValue\"\n            :true-value=\"trueValue ?? true\"\n            :false-value=\"falseValue ?? false\"\n            :required=\"required\"\n            :disabled=\"disabled\"\n            :autocomplete=\"autocomplete\"\n            :aria-checked=\"isChecked\"\n            :aria-labelledby=\"labelId\"\n            @blur=\"onBlur\"\n            @focus=\"onFocus\"\n            @invalid=\"onInvalid\"\n            @change=\"onInput\" />\n\n        <label\n            v-if=\"label || $slots.default\"\n            :id=\"labelId\"\n            :for=\"id\"\n            :class=\"labelClasses\">\n            <slot>{{ label }}</slot>\n        </label>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Switch from \"./Switch.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export switch specific types */\nexport type * from \"./props\";\n\n/** export switch plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Switch);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export switch components */\nexport { Switch as OSwitch };\n","import {\n    createVNode,\n    defineComponent,\n    type Slots,\n    type VNode,\n    type VNodeChild,\n    type VNodeTypes,\n} from \"vue\";\nimport type { ComponentProps } from \"vue-component-type-helpers\";\nimport type { ClassBinding, DynamicComponent } from \"@/types\";\n\ntype SlotComponentProps<C extends VNodeTypes> = {\n    /** Component to be get the slot from */\n    component: C;\n    /** Props to be binded to the injected component. */\n    props?: ComponentProps<C>;\n    /**\n     * Slot name\n     * @default \"default\"\n     */\n    name?: string;\n    /**\n     * Tag name of the slot wrapper element\n     * @default \"div\"\n     */\n    tag?: DynamicComponent;\n    /** Class for the slot wrapper element */\n    class?: ClassBinding | ClassBinding[];\n};\n\n/** This components renders only a specific slot of another component */\nexport default defineComponent<SlotComponentProps<{ $slots: Slots }>>(\n    <C extends { $slots: Slots }>(props: SlotComponentProps<C>, { slots }) => {\n        const _props = { tag: \"div\", name: \"default\", ...props };\n\n        return (): VNode => {\n            let slot: VNodeChild | (() => VNodeChild) = (): VNodeChild =>\n                // render the component slot if available\n                typeof props.component.$slots[_props.name] === \"function\"\n                    ? props.component.$slots[_props.name]!(props.props)\n                    : // render the default if no component slot override is available\n                      typeof slots.default === \"function\"\n                      ? slots.default()\n                      : undefined;\n            if (typeof _props.tag === \"string\") {\n                // Vue prefers components' children to be passed as functions,\n                // but native elements' children can't be passed that way.\n                slot = slot();\n            }\n\n            return createVNode(\n                _props.tag as VNode,\n                { class: _props.class },\n                slot,\n            );\n        };\n    },\n    {\n        name: \"OSlotComponent\",\n        // manual runtime props declaration is currently still needed.\n        props: [\"component\", \"props\", \"name\", \"tag\"],\n    },\n);\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, watch, ref, type PropType } from \"vue\";\n\nimport OButton from \"@/components/button/Button.vue\";\nimport OSelect from \"@/components/select/Select.vue\";\nimport OIcon from \"@/components/icon/Icon.vue\";\nimport OField from \"@/components/field/Field.vue\";\n\nimport type { TableColumnItem } from \"./types\";\nimport type { ClassBinding } from \"@/types\";\n\ndefineOptions({\n    isOruga: true,\n    name: \"OTableMobileSort\",\n    configField: \"table\",\n});\n\nconst props = defineProps({\n    currentSortColumn: {\n        type: Object as PropType<TableColumnItem<T>>,\n        default: undefined,\n    },\n    columns: {\n        type: Array as PropType<TableColumnItem<T>[]>,\n        default: undefined,\n    },\n    placeholder: { type: String, default: undefined },\n    iconPack: { type: String, default: undefined },\n    sortIcon: { type: String, default: \"arrow-up\" },\n    sortIconSize: { type: String, default: \"small\" },\n    isAsc: { type: Boolean, default: false },\n    mobileSortClasses: {\n        type: Array as PropType<ClassBinding[]>,\n        required: true,\n    },\n});\n\nconst emits = defineEmits<{\n    sort: [column: TableColumnItem<T>, event: Event];\n}>();\n\nconst mobileSort = ref<string | undefined>(props.currentSortColumn?.identifier);\n\nconst showPlaceholder = computed(\n    () =>\n        !props.columns ||\n        props.columns.every((column) => column.identifier !== mobileSort.value),\n);\n\nconst sortableColumns = computed(() =>\n    props.columns ? props.columns.filter((c) => c.sortable) : [],\n);\n\nconst isCurrentSort = computed(\n    () => props.currentSortColumn?.identifier === mobileSort.value,\n);\n\nwatch(mobileSort, (value) => {\n    if (props.currentSortColumn?.identifier === value) return;\n    sort(new Event(\"sort\"));\n});\n\nwatch(\n    () => props.currentSortColumn,\n    (column) => {\n        mobileSort.value = column?.identifier;\n    },\n);\n\nfunction sort(event: Event): void {\n    const column = sortableColumns.value.find(\n        (column) => column.identifier === mobileSort.value,\n    );\n    if (!column) return;\n    emits(\"sort\", column, event);\n}\n</script>\n\n<template>\n    <div :class=\"mobileSortClasses\">\n        <o-field addons>\n            <o-select v-model=\"mobileSort\" expanded>\n                <template v-if=\"placeholder\">\n                    <option\n                        v-show=\"showPlaceholder\"\n                        :value=\"{}\"\n                        selected\n                        disabled\n                        hidden>\n                        {{ placeholder }}\n                    </option>\n                </template>\n                <option\n                    v-for=\"(column, index) in sortableColumns\"\n                    :key=\"column.field || index\"\n                    :value=\"column.identifier\">\n                    {{ column.label }}\n                </option>\n            </o-select>\n\n            <o-button @click=\"sort($event)\">\n                <o-icon\n                    v-show=\"isCurrentSort\"\n                    :icon=\"sortIcon\"\n                    :pack=\"iconPack\"\n                    :size=\"sortIconSize\"\n                    :rotation=\"!isAsc ? 180 : 0\" />\n            </o-button>\n        </o-field>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, watch, ref, type PropType } from \"vue\";\n\nimport OButton from \"@/components/button/Button.vue\";\nimport OSelect from \"@/components/select/Select.vue\";\nimport OIcon from \"@/components/icon/Icon.vue\";\nimport OField from \"@/components/field/Field.vue\";\n\nimport type { TableColumnItem } from \"./types\";\nimport type { ClassBinding } from \"@/types\";\n\ndefineOptions({\n    isOruga: true,\n    name: \"OTableMobileSort\",\n    configField: \"table\",\n});\n\nconst props = defineProps({\n    currentSortColumn: {\n        type: Object as PropType<TableColumnItem<T>>,\n        default: undefined,\n    },\n    columns: {\n        type: Array as PropType<TableColumnItem<T>[]>,\n        default: undefined,\n    },\n    placeholder: { type: String, default: undefined },\n    iconPack: { type: String, default: undefined },\n    sortIcon: { type: String, default: \"arrow-up\" },\n    sortIconSize: { type: String, default: \"small\" },\n    isAsc: { type: Boolean, default: false },\n    mobileSortClasses: {\n        type: Array as PropType<ClassBinding[]>,\n        required: true,\n    },\n});\n\nconst emits = defineEmits<{\n    sort: [column: TableColumnItem<T>, event: Event];\n}>();\n\nconst mobileSort = ref<string | undefined>(props.currentSortColumn?.identifier);\n\nconst showPlaceholder = computed(\n    () =>\n        !props.columns ||\n        props.columns.every((column) => column.identifier !== mobileSort.value),\n);\n\nconst sortableColumns = computed(() =>\n    props.columns ? props.columns.filter((c) => c.sortable) : [],\n);\n\nconst isCurrentSort = computed(\n    () => props.currentSortColumn?.identifier === mobileSort.value,\n);\n\nwatch(mobileSort, (value) => {\n    if (props.currentSortColumn?.identifier === value) return;\n    sort(new Event(\"sort\"));\n});\n\nwatch(\n    () => props.currentSortColumn,\n    (column) => {\n        mobileSort.value = column?.identifier;\n    },\n);\n\nfunction sort(event: Event): void {\n    const column = sortableColumns.value.find(\n        (column) => column.identifier === mobileSort.value,\n    );\n    if (!column) return;\n    emits(\"sort\", column, event);\n}\n</script>\n\n<template>\n    <div :class=\"mobileSortClasses\">\n        <o-field addons>\n            <o-select v-model=\"mobileSort\" expanded>\n                <template v-if=\"placeholder\">\n                    <option\n                        v-show=\"showPlaceholder\"\n                        :value=\"{}\"\n                        selected\n                        disabled\n                        hidden>\n                        {{ placeholder }}\n                    </option>\n                </template>\n                <option\n                    v-for=\"(column, index) in sortableColumns\"\n                    :key=\"column.field || index\"\n                    :value=\"column.identifier\">\n                    {{ column.label }}\n                </option>\n            </o-select>\n\n            <o-button @click=\"sort($event)\">\n                <o-icon\n                    v-show=\"isCurrentSort\"\n                    :icon=\"sortIcon\"\n                    :pack=\"iconPack\"\n                    :size=\"sortIconSize\"\n                    :rotation=\"!isAsc ? 180 : 0\" />\n            </o-button>\n        </o-field>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T, K extends string\">\nimport { computed, useSlots, useTemplateRef, type VNode } from \"vue\";\n\nimport { defineClasses, useProviderChild } from \"@/composables\";\nimport {\n    escapeRegExpChars,\n    getPropertyValue,\n    isDefined,\n    removeDiacriticsFromString,\n    toCssDimension,\n} from \"@/utils/helpers\";\n\nimport type { TableColumn, TableColumnComponent } from \"./types\";\nimport type { TableColumnProps } from \"./props\";\n\n/**\n * Define a column used by the table component.\n * @displayName Table Column\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTableColumn\",\n    configField: \"table\",\n});\n\nconst props = withDefaults(defineProps<TableColumnProps<T, K>>(), {\n    label: undefined,\n    field: undefined,\n    formatter: undefined,\n    subheading: undefined,\n    width: undefined,\n    numeric: false,\n    position: undefined,\n    filterable: false,\n    sortable: false,\n    hidden: false,\n    sticky: false,\n    customSort: undefined,\n    customFilter: undefined,\n    thAttrs: undefined,\n    tdAttrs: undefined,\n});\n\nconst rootRef = useTemplateRef<HTMLElement>(\"rootElement\");\n\ndefineSlots<{\n    /**\n     * Define the column content here\n     * @param row {unknown} - row data\n     * @param column {TableColumn} - column definition\n     * @param index {number} - row index\n     * @param colindex {number} - column index\n     * @param toggleDetails {(): void} - toggle details function\n     */\n    default?(props: {\n        row: T extends unknown ? any : T;\n        column: TableColumn<T>;\n        index: number;\n        colindex: number;\n        toggleDetails: () => void;\n    }): VNode[];\n    /**\n     * Override header label\n     * @param column {TableColumn} - column definition\n     * @param index {number} - column index\n     */\n    header?(props: { column: TableColumn<T>; index: number }): VNode[];\n    /**\n     * Override subheading label\n     * @param column {TableColumn} - column definition\n     * @param index {number} - column index\n     */\n    subheading?(props: { column: TableColumn<T>; index: number }): VNode[];\n    /**\n     * Override filter input\n     * @param column {TableColumn} - column definition\n     * @param index {number} - column index\n     * @param filters {object} - active filters object\n     */\n    filter?(props: {\n        column: TableColumn<T>;\n        index: number;\n        filters: Record<string, string>;\n    }): VNode[];\n}>();\n\nconst slots = useSlots();\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<TableColumnComponent<T>>(() => ({\n    ...(props as TableColumn<T>),\n    $slots: slots,\n    style: style.value,\n    matches,\n    getValue,\n    thClasses: thClasses.value,\n    tdClasses: tdClasses.value,\n    thSubClasses: thSubheadingClasses.value,\n}));\n\n/** inject functionalities and data from the parent component */\nconst { item } = useProviderChild<unknown, TableColumnComponent<T>>(rootRef, {\n    data: providedData,\n});\n\nconst style = computed(() => ({\n    width: toCssDimension(props.width),\n    \"min-width\": toCssDimension(props.width),\n}));\n\n/** Check if the formated row value for this column matches the given value. */\nfunction matches(row: T, value: string): boolean {\n    // if column has custom filter funtion return result\n    if (typeof props.customFilter === \"function\")\n        return props.customFilter(row, value);\n\n    // get the visible column value for the row\n    const rowValue = getValue(row);\n\n    // check if value is defined\n    if (!isDefined(rowValue)) return false;\n\n    // check if the value matches the filter string by regex comparison\n    const re = new RegExp(escapeRegExpChars(value), \"i\");\n    return re.test(removeDiacriticsFromString(rowValue)) || re.test(rowValue);\n}\n\n/** Returns the formated row value for this column. */\nfunction getValue(row: T): string {\n    // @ts-expect-error getPropertyValue arguments does not patch perfect to TableColumn<T> attributes\n    return getPropertyValue(row, props.field, props.formatter);\n}\n\n// #region --- Computed Component Classes ---\n\nconst thClasses = defineClasses(\n    [\n        \"thSortableClass\",\n        \"o-table__th--sortable\",\n        null,\n        computed(() => props.sortable),\n    ],\n    [\n        \"thPositionClass\",\n        \"o-table__th--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"thStickyClass\",\n        \"o-table__th--sticky\",\n        null,\n        computed(() => props.sticky),\n    ],\n);\n\nconst tdClasses = defineClasses(\n    [\n        \"tdPositionClass\",\n        \"o-table__td--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"tdStickyClass\",\n        \"o-table__td--sticky\",\n        null,\n        computed(() => props.sticky),\n    ],\n);\n\nconst thSubheadingClasses = defineClasses(\n    [\"thSubheadingClass\", \"o-table__th-subheading\"],\n    [\n        \"thPositionClass\",\n        \"o-table__th--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n);\n\n// #endregion --- Computed Component Classes ---\n\n// --- SLOTS TYPED OBJECTS ---\n\n// these properties are just for type addings\n// slot props will be set in Table.vue\nconst row = {} as any;\nconst column = {} as TableColumn<T>;\nconst index = 0;\nconst toggle = () => {};\nconst filters = {} as Record<string, string>;\n</script>\n\n<template>\n    <span\n        ref=\"rootElement\"\n        data-oruga=\"table-column\"\n        :data-id=\"`table-${item.identifier}`\">\n        {{ label }}\n\n        <!--\n            Do not render these slots here.\n            These are only for documentation purposes.\n            Slots are defined in table component.\n        -->\n        <template v-if=\"false\">\n            <slot\n                :row=\"row\"\n                :column=\"column\"\n                :index=\"index\"\n                :colindex=\"index\"\n                :toggle-details=\"toggle\" />\n\n            <slot name=\"header\" :column=\"column\" :index=\"index\" />\n\n            <slot name=\"subheading\" :column=\"column\" :index=\"index\" />\n\n            <slot\n                name=\"filter\"\n                :column=\"column\"\n                :index=\"index\"\n                :filters=\"filters\" />\n        </template>\n    </span>\n</template>\n","<script setup lang=\"ts\" generic=\"T, K extends string\">\nimport { computed, useSlots, useTemplateRef, type VNode } from \"vue\";\n\nimport { defineClasses, useProviderChild } from \"@/composables\";\nimport {\n    escapeRegExpChars,\n    getPropertyValue,\n    isDefined,\n    removeDiacriticsFromString,\n    toCssDimension,\n} from \"@/utils/helpers\";\n\nimport type { TableColumn, TableColumnComponent } from \"./types\";\nimport type { TableColumnProps } from \"./props\";\n\n/**\n * Define a column used by the table component.\n * @displayName Table Column\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTableColumn\",\n    configField: \"table\",\n});\n\nconst props = withDefaults(defineProps<TableColumnProps<T, K>>(), {\n    label: undefined,\n    field: undefined,\n    formatter: undefined,\n    subheading: undefined,\n    width: undefined,\n    numeric: false,\n    position: undefined,\n    filterable: false,\n    sortable: false,\n    hidden: false,\n    sticky: false,\n    customSort: undefined,\n    customFilter: undefined,\n    thAttrs: undefined,\n    tdAttrs: undefined,\n});\n\nconst rootRef = useTemplateRef<HTMLElement>(\"rootElement\");\n\ndefineSlots<{\n    /**\n     * Define the column content here\n     * @param row {unknown} - row data\n     * @param column {TableColumn} - column definition\n     * @param index {number} - row index\n     * @param colindex {number} - column index\n     * @param toggleDetails {(): void} - toggle details function\n     */\n    default?(props: {\n        row: T extends unknown ? any : T;\n        column: TableColumn<T>;\n        index: number;\n        colindex: number;\n        toggleDetails: () => void;\n    }): VNode[];\n    /**\n     * Override header label\n     * @param column {TableColumn} - column definition\n     * @param index {number} - column index\n     */\n    header?(props: { column: TableColumn<T>; index: number }): VNode[];\n    /**\n     * Override subheading label\n     * @param column {TableColumn} - column definition\n     * @param index {number} - column index\n     */\n    subheading?(props: { column: TableColumn<T>; index: number }): VNode[];\n    /**\n     * Override filter input\n     * @param column {TableColumn} - column definition\n     * @param index {number} - column index\n     * @param filters {object} - active filters object\n     */\n    filter?(props: {\n        column: TableColumn<T>;\n        index: number;\n        filters: Record<string, string>;\n    }): VNode[];\n}>();\n\nconst slots = useSlots();\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<TableColumnComponent<T>>(() => ({\n    ...(props as TableColumn<T>),\n    $slots: slots,\n    style: style.value,\n    matches,\n    getValue,\n    thClasses: thClasses.value,\n    tdClasses: tdClasses.value,\n    thSubClasses: thSubheadingClasses.value,\n}));\n\n/** inject functionalities and data from the parent component */\nconst { item } = useProviderChild<unknown, TableColumnComponent<T>>(rootRef, {\n    data: providedData,\n});\n\nconst style = computed(() => ({\n    width: toCssDimension(props.width),\n    \"min-width\": toCssDimension(props.width),\n}));\n\n/** Check if the formated row value for this column matches the given value. */\nfunction matches(row: T, value: string): boolean {\n    // if column has custom filter funtion return result\n    if (typeof props.customFilter === \"function\")\n        return props.customFilter(row, value);\n\n    // get the visible column value for the row\n    const rowValue = getValue(row);\n\n    // check if value is defined\n    if (!isDefined(rowValue)) return false;\n\n    // check if the value matches the filter string by regex comparison\n    const re = new RegExp(escapeRegExpChars(value), \"i\");\n    return re.test(removeDiacriticsFromString(rowValue)) || re.test(rowValue);\n}\n\n/** Returns the formated row value for this column. */\nfunction getValue(row: T): string {\n    // @ts-expect-error getPropertyValue arguments does not patch perfect to TableColumn<T> attributes\n    return getPropertyValue(row, props.field, props.formatter);\n}\n\n// #region --- Computed Component Classes ---\n\nconst thClasses = defineClasses(\n    [\n        \"thSortableClass\",\n        \"o-table__th--sortable\",\n        null,\n        computed(() => props.sortable),\n    ],\n    [\n        \"thPositionClass\",\n        \"o-table__th--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"thStickyClass\",\n        \"o-table__th--sticky\",\n        null,\n        computed(() => props.sticky),\n    ],\n);\n\nconst tdClasses = defineClasses(\n    [\n        \"tdPositionClass\",\n        \"o-table__td--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"tdStickyClass\",\n        \"o-table__td--sticky\",\n        null,\n        computed(() => props.sticky),\n    ],\n);\n\nconst thSubheadingClasses = defineClasses(\n    [\"thSubheadingClass\", \"o-table__th-subheading\"],\n    [\n        \"thPositionClass\",\n        \"o-table__th--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n);\n\n// #endregion --- Computed Component Classes ---\n\n// --- SLOTS TYPED OBJECTS ---\n\n// these properties are just for type addings\n// slot props will be set in Table.vue\nconst row = {} as any;\nconst column = {} as TableColumn<T>;\nconst index = 0;\nconst toggle = () => {};\nconst filters = {} as Record<string, string>;\n</script>\n\n<template>\n    <span\n        ref=\"rootElement\"\n        data-oruga=\"table-column\"\n        :data-id=\"`table-${item.identifier}`\">\n        {{ label }}\n\n        <!--\n            Do not render these slots here.\n            These are only for documentation purposes.\n            Slots are defined in table component.\n        -->\n        <template v-if=\"false\">\n            <slot\n                :row=\"row\"\n                :column=\"column\"\n                :index=\"index\"\n                :colindex=\"index\"\n                :toggle-details=\"toggle\" />\n\n            <slot name=\"header\" :column=\"column\" :index=\"index\" />\n\n            <slot name=\"subheading\" :column=\"column\" :index=\"index\" />\n\n            <slot\n                name=\"filter\"\n                :column=\"column\"\n                :index=\"index\"\n                :filters=\"filters\" />\n        </template>\n    </span>\n</template>\n","<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\n\nimport OPagination from \"@/components/pagination/Pagination.vue\";\n\nimport type { ComponentClass } from \"@/types\";\n\ndefineOptions({\n    isOruga: true,\n    name: \"OTablePagination\",\n    configField: \"table\",\n    inheritAttrs: false,\n});\n\ndefineProps({\n    current: { type: Number, default: undefined },\n    paginated: { type: Boolean, default: false },\n    rootClass: {\n        type: [String, Array, Object] as PropType<ComponentClass>,\n        default: undefined,\n    },\n});\n\nconst emits = defineEmits<{\n    /**\n     * current prop two-way binding\n     * @param value {number} - updated current prop\n     */\n    \"update:current\": [value: number];\n    /**\n     * on current change event\n     * @param value {number} - current value\n     */\n    change: [event: number];\n}>();\n\nconst currentPage = defineModel<number>(\"current\");\n\n/** paginator change listener */\nfunction pageChanged(page: number): void {\n    const newPage = page > 0 ? page : 1;\n    currentPage.value = newPage;\n    emits(\"change\", newPage);\n}\n</script>\n\n<template>\n    <div :class=\"rootClass\">\n        <div>\n            <slot />\n        </div>\n\n        <div>\n            <o-pagination\n                v-if=\"paginated\"\n                v-bind=\"$attrs\"\n                :current=\"currentPage\"\n                @change=\"pageChanged\" />\n        </div>\n    </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { PropType } from \"vue\";\n\nimport OPagination from \"@/components/pagination/Pagination.vue\";\n\nimport type { ComponentClass } from \"@/types\";\n\ndefineOptions({\n    isOruga: true,\n    name: \"OTablePagination\",\n    configField: \"table\",\n    inheritAttrs: false,\n});\n\ndefineProps({\n    current: { type: Number, default: undefined },\n    paginated: { type: Boolean, default: false },\n    rootClass: {\n        type: [String, Array, Object] as PropType<ComponentClass>,\n        default: undefined,\n    },\n});\n\nconst emits = defineEmits<{\n    /**\n     * current prop two-way binding\n     * @param value {number} - updated current prop\n     */\n    \"update:current\": [value: number];\n    /**\n     * on current change event\n     * @param value {number} - current value\n     */\n    change: [event: number];\n}>();\n\nconst currentPage = defineModel<number>(\"current\");\n\n/** paginator change listener */\nfunction pageChanged(page: number): void {\n    const newPage = page > 0 ? page : 1;\n    currentPage.value = newPage;\n    emits(\"change\", newPage);\n}\n</script>\n\n<template>\n    <div :class=\"rootClass\">\n        <div>\n            <slot />\n        </div>\n\n        <div>\n            <o-pagination\n                v-if=\"paginated\"\n                v-bind=\"$attrs\"\n                :current=\"currentPage\"\n                @change=\"pageChanged\" />\n        </div>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport {\n    computed,\n    ref,\n    watch,\n    nextTick,\n    useSlots,\n    toValue,\n    useTemplateRef,\n    toRaw,\n    triggerRef,\n    type MaybeRefOrGetter,\n    type VNode,\n} from \"vue\";\n\nimport OCheckbox from \"@/components/checkbox/Checkbox.vue\";\nimport OIcon from \"@/components/icon/Icon.vue\";\nimport OInput from \"@/components/input/Input.vue\";\nimport OLoading from \"@/components/loading/Loading.vue\";\nimport OSlotComponent from \"@/components/utils/SlotComponent\";\n\nimport OTableMobileSort from \"./TableMobileSort.vue\";\nimport OTableColumn from \"./TableColumn.vue\";\nimport OTablePagination from \"./TablePagination.vue\";\n\nimport { getDefault, getDefaultFunction } from \"@/utils/config\";\nimport {\n    getValueByPath,\n    toCssDimension,\n    sortBy,\n    isDefined,\n    getPropertyValue,\n} from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    getActiveClasses,\n    useProviderParent,\n    useMatchMedia,\n    useIndexer,\n} from \"@/composables\";\n\nimport type { ClassBinding, Numberish } from \"@/types\";\nimport type {\n    TableColumn,\n    TableRow,\n    TableColumnItem,\n    TableColumnComponent,\n} from \"./types\";\nimport type { TableProps } from \"./props\";\n\n/**\n * Tabulated data are sometimes needed, it's even better when it's responsive.\n * @displayName Table\n * @requires ./TableColumn.vue\n * @style _table.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTable\",\n    configField: \"table\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<TableProps<T>>(), {\n    override: undefined,\n    data: undefined,\n    columns: undefined,\n    rowKey: () => getDefault(\"table.rowKey\"),\n    rowClass: getDefaultFunction(\"table.rowClass\", () => \"\"),\n    thAttrs: undefined,\n    tdAttrs: undefined,\n    customCompare: undefined,\n    bordered: () => getDefault(\"table.bordered\", false),\n    striped: () => getDefault(\"table.striped\", false),\n    narrowed: () => getDefault(\"table.narrowed\", false),\n    hoverable: () => getDefault(\"table.hoverable\", false),\n    selected: undefined,\n    selectable: () => getDefault(\"table.selectable\", false),\n    isRowSelectable: () => true,\n    showHeader: () => getDefault(\"table.showHeader\", true),\n    draggable: false,\n    draggableColumn: false,\n    scrollable: undefined,\n    stickyHeader: false,\n    height: undefined,\n    checkable: false,\n    checkedRows: () => [],\n    checkableHeader: true,\n    stickyCheckbox: false,\n    checkboxPosition: () => getDefault(\"table.checkboxPosition\", \"left\"),\n    checkboxVariant: () => getDefault(\"table.checkboxVariant\"),\n    isRowChecked: undefined,\n    isRowCheckable: getDefaultFunction(\"table.isRowCheckable\", () => true),\n    keepChecked: () => getDefault(\"table.keepChecked\", false),\n    backendSorting: () => getDefault(\"table.backendSorting\", false),\n    defaultSort: () => getDefault(\"table.defaultSort\"),\n    defaultSortDirection: () => getDefault(\"table.defaultSortDirection\", \"asc\"),\n    sortIcon: () => getDefault(\"table.sortIcon\", \"arrow-up\"),\n    sortIconSize: () => getDefault(\"table.sortIconSize\", \"small\"),\n    iconPack: () => getDefault(\"table.iconPack\"),\n    detailed: false,\n    detailedRows: () => [],\n    isDetailedVisible: getDefaultFunction(\n        \"table.isDetailedVisible\",\n        () => true,\n    ),\n    showDetailIcon: () => getDefault(\"table.showDetailIcon\", true),\n    detailIcon: () => getDefault(\"table.detailIcon\", \"chevron-right\"),\n    customDetailRow: false,\n    detailTransition: () => getDefault(\"table.detailTransition\", \"slide\"),\n    paginated: () => getDefault(\"table.paginated\", false),\n    backendPagination: false,\n    total: 0,\n    currentPage: 1,\n    perPage: () => getDefault(\"table.perPage\", 20),\n    paginationPosition: () => getDefault(\"table.paginationPosition\", \"bottom\"),\n    paginationSize: () => getDefault(\"table.paginationSize\", \"small\"),\n    paginationRounded: () => getDefault(\"table.paginationRounded\", false),\n    paginationSimple: () => getDefault(\"table.paginationSimple\", false),\n    paginationOrder: () => getDefault(\"table.paginationOrder\"),\n    paginationRangeBefore: undefined,\n    paginationRangeAfter: undefined,\n    backendFiltering: () => getDefault(\"table.backendFiltering\", false),\n    filterIcon: () => getDefault(\"table.filterIcon\"),\n    filterPlaceholder: () => getDefault(\"table.filterPlaceholder\"),\n    filterDebounce: () => getDefault(\"table.filterDebounce\", 300),\n    emptyLabel: () => getDefault(\"table.emptyLabel\"),\n    emptyIcon: () => getDefault(\"table.emptyIcon\"),\n    emptyIconSize: () => getDefault(\"table.emptyIconSize\"),\n    loading: false,\n    loadingIcon: () => getDefault(\"table.loadingIcon\", \"loading\"),\n    loadingLabel: () => getDefault(\"table.loadingLabel\"),\n    mobileBreakpoint: () => getDefault(\"table.mobileBreakpoint\"),\n    mobileCards: () => getDefault(\"table.mobileCards\", true),\n    mobileSortPlaceholder: () => getDefault(\"table.mobileSortPlaceholder\"),\n    ariaNextLabel: () => getDefault(\"table.ariaNextLabel\"),\n    ariaPreviousLabel: () => getDefault(\"table.ariaPreviousLabel\"),\n    ariaPageLabel: () => getDefault(\"table.ariaPageLabel\"),\n    ariaCurrentLabel: () => getDefault(\"table.ariaCurrentLabel\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * currentPage prop two-way binding\n     * @param value {number} - updated currentPage prop\n     */\n    \"update:currentPage\": [value: number];\n    /**\n     * on pagination page change event\n     * @param page {number} - updated page\n     */\n    \"page-change\": [page: number];\n    /**\n     * select prop two-way binding\n     * @param value {unknown} - updated select prop\n     */\n    \"update:selected\": [value: T];\n    /**\n     * on row select event\n     * @param newRow {unknown} - new select value\n     * @param oldRow {unknown} - old select value\n     */\n    select: [newRow: T, oldRow: T];\n    /**\n     * on row checked event\n     * @param value {unknown[]} - all checked rows\n     * @param row {unknown} - row data\n     */\n    check: [value: T[], row: T];\n    /**\n     * on all rows checked event\n     * @param value {unknown[]} - all checked rows\n     */\n    \"check-all\": [value: T[]];\n    /**\n     * checkedRows prop two-way binding\n     * @param value {unknown[]} - updated checkedRows prop\n     */\n    \"update:checkedRows\": [value: T[]];\n    /**\n     * on column sort change event\n     * @param column {TableColumn} - column data\n     * @param direction {string} - 'asc' or 'desc'\n     * @param event {Event} - native event\n     */\n    sort: [column: TableColumn<T>, direction: \"asc\" | \"desc\", event: Event];\n    /**\n     * on filter change event\n     * @param filters {object} - filter object\n     */\n    \"filters-change\": [value: Record<string, string>];\n    /**\n     * on native filter event\n     * @param column {TableColumn} - column data\n     * @param value {string} - filter input value\n     * @param event {Event} - native event\n     */\n    filter: [column: TableColumn<T>, value: string, event: Event];\n    /**\n     * detailedRows prop two-way binding\n     * @param value {unknown[]} - updated detailedRows prop\n     */\n    \"update:detailedRows\": [value: T[]];\n    /**\n     * on details open event\n     * @param row {unknown} - row data\n     */\n    \"details-open\": [row: T];\n    /**\n     * on details close event\n     * @param row {unknown} - row data\n     */\n    \"details-close\": [row: T];\n    /**\n     * on row click event\n     * @param row {unknown} - row data\n     * @param index {number} - index of clicked row\n     * @param event {Event} - native click event\n     */\n    click: [row: T, index: number, event: Event];\n    /**\n     * on row double click event\n     * @param row {unknown} - row data\n     * @param index {number} - index of clicked row\n     * @param event {Event} - native click event\n     */\n    dblclick: [row: T, index: number, event: Event];\n    /**\n     * on row right click event\n     * @param row {unknown} - row data\n     * @param index {number} - index of clicked row\n     * @param event {Event} - native contextmenu event\n     */\n    contextmenu: [row: T, index: number, event: Event];\n    /**\n     * on row mouseenter event\n     * @param row {unknown} - row data\n     * @param index {number} - index of clicked row\n     * @param event {Event} - native mouseenter event\n     */\n    mouseenter: [row: T, index: number, event: Event];\n    /**\n     * on row mouseleave event\n     * @param row {unknown} - row data\n     * @param index {number} - index of clicked row\n     * @param event {Event} - native mouseleave event\n     */\n    mouseleave: [row: T, index: number, event: Event];\n    /**\n     * on cell click event\n     * @param row {unknown} - row data\n     * @param column {TableColumn} - column data\n     * @param index {number} - row index\n     * @param colindex {number} - column index\n     * @param event {Event} - native click event\n     */\n    \"cell-click\": [\n        row: T,\n        column: TableColumn<T>,\n        index: number,\n        colindex: number,\n        event: Event,\n    ];\n    /**\n     * on row dragstart event\n     * @param row {unknown} - row data\n     * @param index {number} - index of draged row\n     * @param event {DragEvent} - native dragstart event\n     */\n    dragstart: [row: T, index: number, event: DragEvent];\n    /**\n     * on row dragend event\n     * @param row {unknown} - row data\n     * @param index {number} - index of draged row\n     * @param event {DragEvent} - native dragend event\n     */\n    dragend: [row: T, index: number, event: DragEvent];\n    /**\n     * on row drop event\n     * @param row {unknown} - row data\n     * @param index {number} - index of draged row\n     * @param event {DragEvent} - native drop event\n     */\n    drop: [row: T, index: number, event: DragEvent];\n    /**\n     * on row dragleave event\n     * @param row {unknown} - row data\n     * @param index {number} - index of draged row\n     * @param event {DragEvent} - native dragleave event\n     */\n    dragleave: [row: T, index: number, event: DragEvent];\n    /**\n     * on row dragover event\n     * @param row {unknown} - row data\n     * @param index {number} - index of draged row\n     * @param event {DragEvent} - native dragover event\n     */\n    dragover: [row: T, index: number, event: DragEvent];\n    /**\n     * on column columndragstart event\n     * @param column {TableColumn} - column data\n     * @param index {number} - index of draged column\n     * @param event {DragEvent} - native columndragstart event\n     */\n    columndragstart: [column: TableColumn<T>, index: number, event: DragEvent];\n    /**\n     * on column columndragend event\n     * @param column {TableColumn} - column data\n     * @param index {number} - index of draged column\n     * @param event {DragEvent} - native columndragend event\n     */\n    columndragend: [column: TableColumn<T>, index: number, event: DragEvent];\n    /**\n     * on column columndrop event\n     * @param column {TableColumn} - column data\n     * @param index {number} - index of draged column\n     * @param event {DragEvent} - native columndrop event\n     */\n    columndrop: [column: TableColumn<T>, index: number, event: DragEvent];\n    /**\n     * on column columndragleave event\n     * @param column {TableColumn} - column data\n     * @param index {number} - index of draged column\n     * @param event {DragEvent} - native columndragleave event\n     */\n    columndragleave: [column: TableColumn<T>, index: number, event: DragEvent];\n    /**\n     * on column columndragover event\n     * @param column {TableColumn} - column data\n     * @param index {number} - index of draged column\n     * @param event {DragEvent} - native columndragover event\n     */\n    columndragover: [column: TableColumn<T>, index: number, event: DragEvent];\n}>();\n\ndefineSlots<{\n    /** Define extra `o-table-column` components here, even if you have some columns defined by prop */\n    before?(): void;\n    /** Define extra `o-table-column` components here, even if you have some columns defined by prop */\n    after?(): void;\n    /** Define `o-table-column` here */\n    default?(): void;\n    /**\n     * Override the pagination label\n     * @param current {number} - current page\n     * @param perPage {number} - rows per page\n     * @param total {number} - total rows count\n     * @param change {(page: number): void } - on page change event\n     */\n    pagination?(props: {\n        current: number;\n        perPage: Numberish;\n        total: number;\n        change: (page: number) => void;\n    }): void;\n    /** Define a table caption here */\n    caption?(): void;\n    /** Define content to palce before the header here */\n    preheader?(): void;\n    /**\n     * Override the check all checkbox\n     * @param isAllChecked {boolean} - if all rows are checked\n     * @param isAllUncheckable {boolean} - if check all is uncheckable\n     * @param checkAll {(): void}  - check all function\n     */\n    checkAll?(props: {\n        isAllChecked: boolean;\n        isAllUncheckable: boolean;\n        checkAll: () => void;\n    }): void;\n    /**\n     * Define row detail content here\n     * @param row {unknown} - row content\n     * @param index {number} - row index\n     */\n    detail?(props: { row: T; index: number }): void;\n    /** Define the content to show if table is empty */\n    empty?(): void;\n    /**\n     * Define a custom footer\n     * @param columnCount {number} - counts of visible columns\n     * @param rowCount {number} - counts of visible rows\n     */\n    footer?(props: { columnCount: number; rowCount: number }): VNode[];\n    /**\n     * Override loading component\n     * @param loading {boolean} - is loading state enabled\n     */\n    loading?(): void;\n    /** Additional slot if table is paginated */\n    topLeft?(): void;\n    /** Additional slot if table is paginated */\n    bottomLeft?(): void;\n}>();\n\nconst slots = useSlots();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst isMobileActive = computed(() => props.mobileCards && isMobile.value);\n\nconst slotsRef = useTemplateRef(\"slotsWrapper\");\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<TableColumnComponent<T>>({\n    rootRef: slotsRef,\n});\n\n// #region --- Table Columns Definition ---\n\n/** all defined columns */\nconst tableColumns = computed<TableColumnItem<T>[]>(() => {\n    if (!childItems.value.length) return [];\n    return childItems.value.map((columnItem) => {\n        const column = toValue(columnItem.data!);\n\n        // create additional th attrs data\n        let thAttrsData =\n            typeof props.thAttrs === \"function\" ? props.thAttrs(column) : {};\n        thAttrsData = Object.assign(thAttrsData, column.thAttrs);\n\n        // create additional td attrs data\n        const tdAttrsData = (props.data ?? []).map((data) => {\n            const tdAttrs =\n                typeof props.tdAttrs === \"function\"\n                    ? props.tdAttrs(data, column)\n                    : {};\n            return Object.assign(tdAttrs, column.tdAttrs);\n        });\n\n        return {\n            ...column,\n            value: column,\n            el: columnItem.el,\n            index: columnItem.index,\n            identifier: columnItem.identifier,\n            thAttrsData: thAttrsData,\n            tdAttrsData: tdAttrsData,\n        };\n    });\n});\n\n/** total columns count */\nconst columnCount = computed(() => {\n    let i = tableColumns.value.length;\n    if (showDetailRowIcon.value) i++;\n    if (props.checkable) i++;\n    return i;\n});\n\n/** aria-colindex start value for ths */\nconst ariaColIndexStart = computed(() => {\n    let i = 1;\n    if (showDetailRowIcon.value) i++;\n    if (props.checkable && props.checkboxPosition === \"left\") i++;\n    return i;\n});\n\n/** check if table has subheadings  */\nconst hasSubheadings = computed(() => {\n    return tableColumns.value.some((column) => !!column.subheading);\n});\n\n/** check if table is scrollable */\nconst isScrollable = computed(() => {\n    if (props.scrollable) return true;\n    return tableColumns.value.some((column) => column.sticky);\n});\n\n// #endregion --- Table Columns Definition ---\n\n// #region --- Table Rows Definition ---\n\nconst tableCurrentPage = defineModel<number>(\"currentPage\", { default: 1 });\n\n// create a unique id sequence\nconst indexer = useIndexer();\n\n/** All defined data elements as normalized rows with a unique key. */\nconst tableRows = computed<TableRow<T>[]>(() => {\n    if (!props.data) return [];\n    return props.data.map((value: T, idx: number) => ({\n        label: \"row \" + idx, // row display label\n        value: toValue(value), // normalizes wrapped ref values\n        index: idx, // row index\n        key:\n            // if no key is given and data is object, create unique row id for each row\n            String(getValueByPath(value, props.rowKey) || indexer.nextIndex()),\n        hidden: false,\n    }));\n});\n\n/** Filtered normalized rows by any given filter value. */\nconst filteredRows = computed<TableRow<T>[]>(() =>\n    // defines the hidden state on the original row list and returns a filtered row list\n    filterRows(tableRows.value),\n);\n\n/** Visible rows for the current page. */\nconst availableRows = computed<TableRow<T>[]>(() =>\n    // defines the hidden state on the original row list and returns only the rows on the current page\n    paginateRows(filteredRows.value),\n);\n\n// reset row hidden states on specifc prop change\nwatch(\n    () => props.paginated,\n    () => {\n        tableRows.value.forEach((row) => (row.hidden = false));\n        // Force trigger effects for the base normalized rows after making same deep mutations.\n        // This forces reactive dependencies to recompute and to redefine the hidden states.\n        triggerRef(tableRows);\n    },\n);\n\n/**\n * Check if footer slot has custom content.\n * Must be called during rendering.\n */\nfunction hasCustomFooterSlot(): boolean {\n    if (!slots.footer) return false;\n\n    const footer = slots.footer({\n        columnCount: columnCount.value,\n        rowCount: rowCount.value,\n    });\n    if (footer.length > 1) return true;\n\n    const tag = footer[0][\"type\"];\n    return tag === \"th\" || tag === \"td\";\n}\n\n/** check if two rows are equal by a custom compare function or the rowKey attribute */\nfunction isRowEqual(\n    sourceRow: MaybeRefOrGetter<T>,\n    targetRow: MaybeRefOrGetter<T>,\n): boolean {\n    const el1 = toRaw(toValue(sourceRow));\n    const el2 = toRaw(toValue(targetRow));\n    if (!isDefined(targetRow)) return false;\n    if (typeof props.customCompare === \"function\")\n        return props.customCompare(el1, el2);\n    if (props.rowKey)\n        return (\n            getPropertyValue(el1, props.rowKey) ==\n            getPropertyValue(el2, props.rowKey)\n        );\n    return el1 == el2;\n}\n\n// #endregion  --- Table Rows Definition ---\n\n// #region --- Pagination Feature ---\n\n/*\n * Total data count.\n * If backend paginated, use props total else use rows data length as pagination total.\n */\nconst tableTotal = computed(() =>\n    props.backendPagination ? props.total : filteredRows.value.length,\n);\n\n/** total rows count  */\nconst rowCount = computed(() => {\n    return tableTotal.value + ariaRowIndexStart.value;\n});\n\n/** aria-rowindex start value for tds based if any column is filterable or has subheading */\nconst ariaRowIndexStart = computed(() => {\n    let i = 1;\n    if (hasFilterColumns.value) i++;\n    if (hasSubheadings.value) i++;\n    return i;\n});\n\nfunction paginateRows(rows: TableRow<T>[]): TableRow<T>[] {\n    if (!props.paginated || props.backendPagination)\n        // always return a new array object\n        return [...rows];\n\n    // calculate pagination information\n    const perPage = Number(props.perPage);\n    const currentPage = Math.min(\n        Math.ceil(rows.length / perPage),\n        tableCurrentPage.value,\n    );\n    const pageStart = (currentPage - 1) * perPage;\n    const pageEnd = pageStart + perPage;\n\n    // check if a row is filtered out (hidden) by not on the current page\n    return rows.filter((row, idx) => {\n        // check if row is on the current page\n        const currentPage =\n            rows.length < perPage || (idx >= pageStart && idx < pageEnd);\n\n        // update hidden state\n        row.hidden = !currentPage;\n        return !row.hidden;\n    });\n}\n\n// #endregion --- Pagination Feature ---\n\n// #region --- Filter Feature ---\n\n/** filter record alias { fieldKey: filterValue } */\nconst filters = ref<Record<string, string>>({});\n\n/** check if any column has filterable active */\nconst hasFilterColumns = computed(() =>\n    tableColumns.value.some((column) => column.filterable),\n);\n\n// emit filter change event\nwatch(filters, (value) => emits(\"filters-change\", value), { deep: true });\n\n/**\n * Set the hidden state for the given rows based on active filter values.\n * Returns a filtered list of the mutated rows.\n */\nfunction filterRows(rows: TableRow<T>[]): TableRow<T>[] {\n    if (props.backendFiltering)\n        // always return a new array object\n        return [...rows];\n\n    if (!Object.values(filters.value).filter(Boolean).length) {\n        // when has no filter reset hidden states\n        rows.forEach((row) => (row.hidden = false));\n        // always return a new array object\n        return [...rows];\n    }\n\n    // check if a row is filtered out (hidden) by not matching any active filter expresssions\n    return rows.filter((row) => {\n        const matches = Object.entries(filters.value).some(\n            ([columnKey, filter]) => {\n                if (!filter) return false;\n                // get column for the filter\n                const column = tableColumns.value.find(\n                    (c) => c.field === columnKey,\n                );\n                if (!column) return false;\n\n                // check if the value matches the filter string\n                return column.matches(row.value, filter);\n            },\n        );\n\n        // update hidden state\n        row.hidden = !matches;\n        return !row.hidden;\n    });\n}\n\n// #endregion --- Filter Feature ---\n\n// #region --- Sort Feature ---\n\nconst currentSortColumn = ref<TableColumnItem<T>>();\nconst isAsc = ref(true);\n\n/** check if has any sortable column */\nconst hasSortableColumns = computed(() =>\n    tableColumns.value.some((column) => column.sortable),\n);\n\n/** check if the column is the current sort column */\nfunction isColumnSorted(column: TableColumnItem<T>): boolean {\n    return currentSortColumn.value?.identifier === column.identifier;\n}\n\n// calculate default sort on columns change and on initial load\nwatch(tableColumns, defaultSort, { immediate: true });\n\n/** sort column based on the default-sort prop if not already sorted */\nfunction defaultSort(): void {\n    // prevent sort when not columns or already sorted (for example async data)\n    if (!tableColumns.value.length || currentSortColumn.value) return;\n    if (!props.defaultSort) return;\n\n    let sortField = props.defaultSort;\n    let sortDirection = props.defaultSortDirection;\n    if (Array.isArray(props.defaultSort)) {\n        sortField = props.defaultSort[0];\n        if (props.defaultSort[1]) sortDirection = props.defaultSort[1];\n    } else {\n        sortField = props.defaultSort;\n    }\n    sortByField(sortField, sortDirection);\n}\n\nfunction sortByField(field: string, direction: \"asc\" | \"desc\"): void {\n    const sortColumn = tableColumns.value.find(\n        (column) => column.field === field,\n    );\n    if (sortColumn) {\n        isAsc.value = direction.toLowerCase() === \"asc\";\n        sort(sortColumn);\n    }\n}\n\n/**\n * Sort the column.\n * Toggle current direction on column if it's sortable\n * and not just updating the prop.\n */\nfunction sort(\n    column: TableColumnItem<T>,\n    updateDirection = false,\n    event: Event = new Event(\"sort\"),\n): void {\n    if (!column?.sortable) return;\n\n    if (updateDirection)\n        isAsc.value = isColumnSorted(column)\n            ? !isAsc.value\n            : props.defaultSortDirection.toLowerCase() === \"asc\";\n\n    // if not first time sort\n    if (currentSortColumn.value)\n        emits(\"sort\", column, isAsc.value ? \"asc\" : \"desc\", event);\n\n    currentSortColumn.value = column;\n\n    // sort rows by mutating the array\n    sortRows(tableRows.value, column);\n\n    // Force trigger effects for the base normalized rows after making deep mutations.\n    // This forces reactive dependencies to recompute.\n    triggerRef(tableRows);\n}\n\n// recompute table rows sorting on data prop change\nwatch(\n    () => props.data,\n    () => {\n        if (currentSortColumn.value)\n            sortRows(tableRows.value, currentSortColumn.value);\n    },\n);\n\n/** sort rows by mutating the given array */\nfunction sortRows(rows: TableRow<T>[], column: TableColumn<T>): TableRow<T>[] {\n    if (props.backendSorting) return rows;\n\n    // sort rows by mutating the rows array\n    return sortBy<TableRow<T>, string>(\n        rows,\n        column.field ? \"value.\" + column.field : \"\",\n        column.customSort\n            ? (a, b, asc): number => column.customSort!(a.value, b.value, asc)\n            : undefined,\n        isAsc.value,\n        true, // mutate the original array\n    );\n}\n\n// #endregion --- Sort Feature ---\n\n// #region --- Row Selection Feature ---\n\nconst tableSelectedRow = defineModel<T>(\"selected\", { default: undefined });\n\n/** table arrow keys listener, change selection */\nfunction onArrowPressed(delta: 1 | -1, event: KeyboardEvent): void {\n    if (!availableRows.value.length) return;\n\n    let index =\n        availableRows.value.findIndex((row) =>\n            isRowEqual(row.value, tableSelectedRow.value),\n        ) + delta;\n\n    // check if index overflow\n    index =\n        index > availableRows.value.length - 1\n            ? availableRows.value.length - 1\n            : index;\n    // check if index underflow\n    index = index < 0 ? 0 : index;\n\n    // get row element\n    const row = availableRows.value[index];\n\n    if (!props.isRowSelectable(row.value)) {\n        let newIndex: number | undefined;\n        if (delta > 0) {\n            for (\n                let i = index;\n                i < availableRows.value.length && newIndex === undefined;\n                i++\n            ) {\n                if (props.isRowSelectable(availableRows.value[i].value))\n                    newIndex = i;\n            }\n        } else {\n            for (let i = index; i >= 0 && newIndex === undefined; i--) {\n                if (props.isRowSelectable(availableRows.value[i].value))\n                    newIndex = i;\n            }\n        }\n        if (newIndex != undefined && newIndex >= 0)\n            selectRow(availableRows.value[newIndex], event);\n    } else {\n        selectRow(row, event);\n    }\n}\n\n/**\n * Row click listener.\n * Emit all necessary events.\n */\nfunction selectRow(row: TableRow<T>, event: Event): void {\n    emits(\"click\", row.value, row.index, event);\n\n    if (!props.selectable) return;\n\n    if (isRowEqual(tableSelectedRow, row.value)) return;\n    if (!props.isRowSelectable(row.value)) return;\n\n    tableSelectedRow.value = row.value;\n    // emit new and old row\n    emits(\"select\", row.value, tableSelectedRow.value);\n}\n\n// #endregion --- Row Selection Feature ---\n\n// #region --- Row Checkable Feature ---\n\nconst tableCheckedRows = defineModel<T[]>(\"checkedRows\", {\n    default: [],\n});\n\n/** reset checkedRows whem page props changes */\nwatch([tableCurrentPage, () => props.perPage], () => {\n    if (!props.keepChecked) tableCheckedRows.value = [];\n});\n\n/** check if all rows in the page are checked */\nconst isAllChecked = computed(() => {\n    const validVisibleData = availableRows.value.filter((row) =>\n        props.isRowCheckable(row.value),\n    );\n    if (validVisibleData.length === 0) return false;\n    return validVisibleData.every(isChecked);\n});\n\n/** check if all rows in the page are checkable */\nconst isAllUncheckable = computed(\n    () => !availableRows.value.some((row) => props.isRowCheckable(row.value)),\n);\n\n/** check if the row is checked (is added to the array) */\nfunction isChecked(row: TableRow<T>): boolean {\n    if (typeof props.isRowChecked === \"function\")\n        return props.isRowChecked(row.value);\n    else return tableCheckedRows.value.some((r) => isRowEqual(r, row.value));\n}\n\n/**\n * Update checked rows list.\n * If all rows are checked, uncheck all.\n * If not all rows are checked, check all visible rows.\n * Emits \"check-all\" event with the updated checked rows list.\n */\nfunction updateCheckedRows(checkAll?: boolean): void {\n    if (typeof checkAll === \"undefined\" ? isAllChecked.value : !checkAll)\n        // if all rows are already checked, check nothing\n        tableCheckedRows.value = [];\n    else {\n        // keep previously checked rows from other pages if keepChecked is enabled\n        const previouslyChecked = props.keepChecked\n            ? tableCheckedRows.value\n            : [];\n\n        // set all visible rows as checked\n        tableCheckedRows.value = [\n            ...previouslyChecked,\n            ...availableRows.value\n                .map((row) => row.value)\n                .filter((value) => props.isRowCheckable(value)),\n        ];\n    }\n\n    // emit event after the reactive checked rows list got updated\n    nextTick(() => emits(\"check-all\", tableCheckedRows.value));\n}\n\n/** row checkbox click listener */\nfunction checkRow(row: TableRow<T>): void {\n    if (!props.isRowCheckable(row.value)) return;\n\n    if (isChecked(row)) removeCheckedRow(row);\n    else addCheckedRow(row);\n\n    // emit event after the reactive checked rows list got updated\n    nextTick(() => emits(\"check\", tableCheckedRows.value, row.value));\n}\n\n/** add a checked row to the the array */\nfunction addCheckedRow(row: TableRow<T>): void {\n    tableCheckedRows.value = [...tableCheckedRows.value, row.value];\n}\n\n/** remove a checked row from the array */\nfunction removeCheckedRow(row: TableRow<T>): void {\n    const idx = tableCheckedRows.value.findIndex((r) =>\n        isRowEqual(r, row.value),\n    );\n    if (idx >= 0)\n        // remove the item at idx\n        tableCheckedRows.value = [\n            ...tableCheckedRows.value.slice(0, idx),\n            ...tableCheckedRows.value.slice(idx + 1),\n        ];\n}\n\n// #endregion --- Row Checkable Feature  ---\n\n// #region --- Detail Row Feature ---\n\nconst visibleDetailedRows = defineModel<T[]>(\"detailedRows\", {\n    default: [],\n});\n\n/**\n * Return if detailed row tabled.\n * Will be with chevron column & icon or not.\n */\nconst showDetailRowIcon = computed(\n    () => props.detailed && props.showDetailIcon,\n);\n\n/** toggle to show/hide details slot */\nfunction toggleDetails(row: TableRow<T>): void {\n    if (isDetailRowVisible(row)) {\n        closeDetailRow(row);\n        emits(\"details-close\", row.value);\n    } else {\n        openDetailRow(row);\n        emits(\"details-open\", row.value);\n    }\n}\n\nfunction openDetailRow(row: TableRow<T>): void {\n    visibleDetailedRows.value = [...visibleDetailedRows.value, row.value];\n}\n\nfunction closeDetailRow(row: TableRow<T>): void {\n    const idx = visibleDetailedRows.value.findIndex((r) =>\n        isRowEqual(r, row.value),\n    );\n    if (idx >= 0)\n        // remove the item at idx\n        visibleDetailedRows.value = [\n            ...visibleDetailedRows.value.slice(0, idx),\n            ...visibleDetailedRows.value.slice(idx + 1),\n        ];\n}\n\nfunction isDetailRowVisible(row: TableRow<T>): boolean {\n    return (\n        props.detailed &&\n        visibleDetailedRows.value.some((r) => isRowEqual(r, row.value))\n    );\n}\n\n// #endregion --- Detail Row Feature ---\n\n// #region --- Drag&Drop Feature ---\n\nconst isDraggingRow = ref(false);\nconst isDraggingColumn = ref(false);\n\nconst canDragRow = computed(() => props.draggable && !isDraggingColumn.value);\n\nconst canDragColumn = computed(\n    () => props.draggableColumn && !isDraggingRow.value,\n);\n\n/** emits drag start event */\nfunction handleDragStart(row: TableRow<T>, event: DragEvent): void {\n    if (!props.draggable) return;\n    emits(\"dragstart\", row.value, row.index, event);\n}\n\n/** emits drag leave event */\nfunction handleDragEnd(row: TableRow<T>, event: DragEvent): void {\n    if (!props.draggable) return;\n    emits(\"dragend\", row.value, row.index, event);\n}\n\n/** emits drop event */\nfunction handleDrop(row: TableRow<T>, event: DragEvent): void {\n    if (!props.draggable) return;\n    emits(\"drop\", row.value, row.index, event);\n}\n\n/** emits drag over event */\nfunction handleDragOver(row: TableRow<T>, event: DragEvent): void {\n    if (!props.draggable) return;\n    emits(\"dragover\", row.value, row.index, event);\n}\n\n/** emits drag leave event */\nfunction handleDragLeave(row: TableRow<T>, event: DragEvent): void {\n    if (!props.draggable) return;\n    emits(\"dragleave\", row.value, row.index, event);\n}\n\n/** emits drag start event (column) */\nfunction handleColumnDragStart(\n    column: TableColumnItem<T>,\n    event: DragEvent,\n): void {\n    if (!canDragColumn.value) return;\n    isDraggingColumn.value = true;\n    emits(\"columndragstart\", column.value, column.index, event);\n}\n\n/** emits drag leave event (column) */\nfunction handleColumnDragEnd(\n    column: TableColumnItem<T>,\n    event: DragEvent,\n): void {\n    if (!canDragColumn.value) return;\n    isDraggingColumn.value = false;\n    emits(\"columndragend\", column.value, column.index, event);\n}\n\n/** emits drop event (column) */\nfunction handleColumnDrop(column: TableColumnItem<T>, event: DragEvent): void {\n    if (!canDragColumn.value) return;\n    emits(\"columndrop\", column.value, column.index, event);\n}\n\n/** emits drag over event (column) */\nfunction handleColumnDragOver(\n    column: TableColumnItem<T>,\n    event: DragEvent,\n): void {\n    if (!canDragColumn.value) return;\n    emits(\"columndragover\", column.value, column.index, event);\n}\n\n/** emits drag leave event (column) */\nfunction handleColumnDragLeave(\n    column: TableColumnItem<T>,\n    event: DragEvent,\n): void {\n    if (!canDragColumn.value) return;\n    emits(\"columndragleave\", column.value, column.index, event);\n}\n\n// #endregion --- Drag&Drop Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-table__root\"],\n    [\"mobileClass\", \"o-table__root--mobile\", null, isMobileActive],\n);\n\nconst tableWrapperClasses = defineClasses(\n    [\"wrapperClass\", \"o-table__wrapper\"],\n    [\n        \"stickyHeaderClass\",\n        \"o-table__wrapper--sticky-header\",\n        null,\n        computed(() => props.stickyHeader),\n    ],\n    [\"scrollableClass\", \"o-table__wrapper--scrollable\", null, isScrollable],\n    [\"mobileClass\", \"o-table__wrapper--mobile\", null, isMobileActive],\n);\n\nconst tableWrapperStyle = computed(() => ({\n    height: toCssDimension(props.height),\n}));\n\nconst tableClasses = defineClasses(\n    [\"tableClass\", \"o-table\"],\n    [\n        \"borderedClass\",\n        \"o-table--bordered\",\n        null,\n        computed(() => props.bordered),\n    ],\n    [\"stripedClass\", \"o-table--striped\", null, computed(() => props.striped)],\n    [\n        \"narrowedClass\",\n        \"o-table--narrowed\",\n        null,\n        computed(() => props.narrowed),\n    ],\n    [\n        \"hoverableClass\",\n        \"o-table--hoverable\",\n        null,\n        computed(\n            () =>\n                (props.hoverable || props.selectable) &&\n                !!availableRows.value.length,\n        ),\n    ],\n    [\n        \"emptyClass\",\n        \"o-table--empty\",\n        null,\n        computed(() => !availableRows.value.length),\n    ],\n);\n\nconst thBaseClasses = defineClasses([\"thClass\", \"o-table__th\"]);\n\nconst thCheckboxClasses = defineClasses(\n    [\"thCheckboxClass\", \"o-table__th-checkbox\"],\n    [\n        \"thStickyClass\",\n        \"o-table__th--sticky\",\n        null,\n        computed(() => props.stickyCheckbox),\n    ],\n);\n\nconst thSortedClasses = defineClasses([\"thSortedClass\", \"o-table__th--sorted\"]);\n\nconst thDetailedClasses = defineClasses([\n    \"thDetailedClass\",\n    \"o-table__th-detailed\",\n]);\n\nconst thLabelClasses = defineClasses([\"thLabelClass\", \"o-table__th__label\"]);\n\nconst thSortIconClasses = defineClasses([\n    \"thSortIconClass\",\n    \"o-table__th__sort-icon\",\n]);\n\nconst trBaseClasses = defineClasses([\"trClass\", \"o-table__tr\"]);\n\nconst trSelectedClasses = defineClasses([\n    \"trSelectedClass\",\n    \"o-table__tr--selected\",\n]);\n\nconst trCheckedClasses = defineClasses([\n    \"trCheckedClass\",\n    \"o-table__tr--checked\",\n]);\n\nconst trEmptyClasses = defineClasses([\"trEmptyClass\", \"o-table__tr-empty\"]);\n\nconst trDetailedClasses = defineClasses([\n    \"trDetailedClass\",\n    \"o-table__tr-detail\",\n]);\n\nconst tdBaseClasses = defineClasses([\"tdClass\", \"o-table__td\"]);\n\nconst tdCheckboxClasses = defineClasses(\n    [\"tdCheckboxClass\", \"o-table__td-checkbox\"],\n    [\n        \"thStickyClass\",\n        \"o-table__td--sticky\",\n        null,\n        computed(() => props.stickyCheckbox),\n    ],\n);\n\nconst tdDetailedClasses = defineClasses([\n    \"tdDetailClass\",\n    \"o-table__td-detail\",\n]);\n\nconst footerClasses = defineClasses([\"footerClass\", \"o-table__footer\"]);\n\nconst mobileSortClasses = defineClasses([\n    \"mobileSortClass\",\n    \"o-table__mobile-sort\",\n]);\n\nconst paginationWrapperClasses = defineClasses([\n    \"paginationWrapperClass\",\n    \"o-table__pagination\",\n]);\n\nconst paginationWrapperRootClasses = computed(() =>\n    getActiveClasses(paginationWrapperClasses),\n);\n\nfunction columnClasses(column: TableColumnItem<T>): ClassBinding[] {\n    return isColumnSorted(column) ? thSortedClasses.value : [];\n}\n\nfunction rowClasses(row: TableRow<T>): ClassBinding[] {\n    const selectedClasses = isRowEqual(row.value, tableSelectedRow.value)\n        ? trSelectedClasses.value\n        : [];\n\n    const checkedClasses = isChecked(row) ? trCheckedClasses.value : [];\n\n    const rowClass =\n        typeof props.rowClass === \"function\"\n            ? props.rowClass(row.value, row.index) || \"\"\n            : \"\";\n\n    return [\n        ...trBaseClasses.value,\n        ...selectedClasses,\n        ...checkedClasses,\n        { [rowClass]: true },\n    ];\n}\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({\n    columns: tableColumns,\n    rows: tableRows,\n    filters,\n    sort: sortByField,\n});\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <div data-oruga=\"table\" :class=\"rootClasses\">\n        <div ref=\"slotsWrapper\" style=\"display: none\">\n            <slot name=\"before\" />\n\n            <slot>\n                <template v-if=\"columns?.length\">\n                    <o-table-column\n                        v-for=\"(column, idx) in columns\"\n                        :key=\"column.field || idx\"\n                        v-bind=\"column\" />\n                </template>\n            </slot>\n\n            <slot name=\"after\" />\n        </div>\n\n        <o-table-mobile-sort\n            v-if=\"isMobileActive && hasSortableColumns\"\n            :current-sort-column=\"currentSortColumn\"\n            :columns=\"tableColumns\"\n            :placeholder=\"mobileSortPlaceholder\"\n            :icon-pack=\"iconPack\"\n            :sort-icon=\"sortIcon\"\n            :sort-icon-size=\"sortIconSize\"\n            :is-asc=\"isAsc\"\n            :mobile-sort-classes=\"mobileSortClasses\"\n            @sort=\"(column, event) => sort(column, true, event)\" />\n\n        <template\n            v-if=\"\n                paginated &&\n                (paginationPosition === 'top' || paginationPosition === 'both')\n            \">\n            <slot\n                name=\"pagination\"\n                :current=\"tableCurrentPage\"\n                :per-page=\"perPage\"\n                :total=\"tableTotal\"\n                :change=\"(page) => (tableCurrentPage = page)\">\n                <o-table-pagination\n                    v-model:current=\"tableCurrentPage\"\n                    :paginated=\"paginated\"\n                    :per-page=\"perPage\"\n                    :total=\"tableTotal\"\n                    :rounded=\"paginationRounded\"\n                    :size=\"paginationSize\"\n                    :order=\"paginationOrder\"\n                    :simple=\"paginationSimple\"\n                    :range-before=\"paginationRangeBefore\"\n                    :range-after=\"paginationRangeAfter\"\n                    :icon-pack=\"iconPack\"\n                    :aria-next-label=\"ariaNextLabel\"\n                    :aria-previous-label=\"ariaPreviousLabel\"\n                    :aria-page-label=\"ariaPageLabel\"\n                    :aria-current-label=\"ariaCurrentLabel\"\n                    :root-class=\"paginationWrapperRootClasses\"\n                    @change=\"(page) => $emit('page-change', page)\">\n                    <slot name=\"topLeft\" />\n                </o-table-pagination>\n            </slot>\n        </template>\n\n        <div :class=\"tableWrapperClasses\" :style=\"tableWrapperStyle\">\n            <table\n                v-if=\"tableColumns.length\"\n                v-bind=\"$attrs\"\n                :class=\"tableClasses\"\n                :tabindex=\"selectable || isScrollable ? 0 : undefined\"\n                :aria-rowcount=\"rowCount\"\n                :aria-colcount=\"columnCount\"\n                @keydown.prevent.up=\"onArrowPressed(-1, $event)\"\n                @keydown.prevent.down=\"onArrowPressed(1, $event)\"\n                @keydown.prevent.home=\"selectRow(availableRows[0], $event)\"\n                @keydown.prevent.end=\"\n                    selectRow(availableRows[availableRows.length - 1], $event)\n                \">\n                <caption v-if=\"$slots.caption\">\n                    <slot name=\"caption\" />\n                </caption>\n\n                <thead v-if=\"showHeader\">\n                    <slot name=\"preheader\" />\n\n                    <tr :aria-rowindex=\"1\">\n                        <!-- detailed toggle column -->\n                        <th\n                            v-if=\"showDetailRowIcon\"\n                            :class=\"[...thBaseClasses, ...thDetailedClasses]\"\n                            :aria-colindex=\"1\"\n                            aria-hidden=\"true\" />\n\n                        <!-- checkable column left -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'left'\"\n                            :class=\"[...thBaseClasses, ...thCheckboxClasses]\"\n                            :aria-colindex=\"showDetailRowIcon ? 2 : 1\">\n                            <slot\n                                v-if=\"checkableHeader\"\n                                name=\"checkAll\"\n                                :is-all-checked=\"isAllChecked\"\n                                :is-all-uncheckable=\"isAllUncheckable\"\n                                :check-all=\"updateCheckedRows\">\n                                <o-checkbox\n                                    :model-value=\"isAllChecked\"\n                                    autocomplete=\"off\"\n                                    name=\"row_check_all\"\n                                    :variant=\"checkboxVariant\"\n                                    :disabled=\"isAllUncheckable\"\n                                    aria-label=\"Check all\"\n                                    @update:model-value=\"\n                                        updateCheckedRows(!!$event)\n                                    \" />\n                            </slot>\n                        </th>\n\n                        <!-- row header columns -->\n                        <template\n                            v-for=\"column in tableColumns\"\n                            :key=\"column.identifier\">\n                            <th\n                                v-if=\"!column.hidden\"\n                                v-bind=\"column.thAttrsData\"\n                                :class=\"[\n                                    ...thBaseClasses,\n                                    ...column.thClasses,\n                                    ...columnClasses(column),\n                                ]\"\n                                :style=\"isMobileActive ? {} : column.style\"\n                                :draggable=\"canDragColumn\"\n                                :aria-sort=\"\n                                    isColumnSorted(column)\n                                        ? isAsc\n                                            ? 'ascending'\n                                            : 'descending'\n                                        : undefined\n                                \"\n                                :aria-colindex=\"\n                                    ariaColIndexStart + column.index\n                                \"\n                                @click.stop=\"sort(column, true, $event)\"\n                                @dragstart=\"\n                                    handleColumnDragStart(column, $event)\n                                \"\n                                @dragend=\"handleColumnDragEnd(column, $event)\"\n                                @drop=\"handleColumnDrop(column, $event)\"\n                                @dragover=\"handleColumnDragOver(column, $event)\"\n                                @dragleave=\"\n                                    handleColumnDragLeave(column, $event)\n                                \">\n                                <o-slot-component\n                                    v-if=\"column.$slots?.header\"\n                                    :component=\"column\"\n                                    name=\"header\"\n                                    tag=\"span\"\n                                    :class=\"thLabelClasses\"\n                                    :props=\"{\n                                        column: column.value,\n                                        index: column.index,\n                                    }\" />\n\n                                <template v-else>\n                                    <span :class=\"thLabelClasses\">\n                                        {{ column.label }}\n                                    </span>\n                                    <span\n                                        v-if=\"column.sortable\"\n                                        v-show=\"isColumnSorted(column)\"\n                                        :class=\"thSortIconClasses\"\n                                        :aria-hidden=\"!isColumnSorted(column)\">\n                                        <o-icon\n                                            :icon=\"sortIcon\"\n                                            :pack=\"iconPack\"\n                                            :size=\"sortIconSize\"\n                                            :rotation=\"!isAsc ? 180 : 0\" />\n                                    </span>\n                                </template>\n                            </th>\n                        </template>\n\n                        <!-- checkable column right -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'right'\"\n                            :class=\"[...thBaseClasses, ...thCheckboxClasses]\"\n                            :aria-colindex=\"\n                                ariaColIndexStart + tableColumns.length\n                            \">\n                            <slot\n                                v-if=\"checkableHeader\"\n                                name=\"checkAll\"\n                                :is-all-checked=\"isAllChecked\"\n                                :is-all-uncheckable=\"isAllUncheckable\"\n                                :check-all=\"updateCheckedRows\">\n                                <o-checkbox\n                                    :model-value=\"isAllChecked\"\n                                    autocomplete=\"off\"\n                                    name=\"row_check_all\"\n                                    :variant=\"checkboxVariant\"\n                                    :disabled=\"isAllUncheckable\"\n                                    aria-label=\"Check all\"\n                                    @update:model-value=\"\n                                        updateCheckedRows(!!$event)\n                                    \" />\n                            </slot>\n                        </th>\n                    </tr>\n\n                    <tr v-if=\"hasFilterColumns\" :aria-rowindex=\"2\">\n                        <!-- detailed toggle column -->\n                        <th\n                            v-if=\"showDetailRowIcon\"\n                            :class=\"[...thBaseClasses, ...thDetailedClasses]\"\n                            aria-hidden=\"true\" />\n\n                        <!-- checkable column left -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'left'\"\n                            :class=\"thBaseClasses\" />\n\n                        <!-- row filter columns -->\n                        <template\n                            v-for=\"column in tableColumns\"\n                            :key=\"column.identifier\">\n                            <th\n                                v-if=\"!column.hidden\"\n                                v-bind=\"column.thAttrsData\"\n                                :class=\"[...thBaseClasses, ...column.thClasses]\"\n                                :style=\"isMobileActive ? {} : column.style\">\n                                <template v-if=\"column.filterable\">\n                                    <o-slot-component\n                                        v-if=\"column.$slots?.filter\"\n                                        :component=\"column\"\n                                        name=\"filter\"\n                                        tag=\"span\"\n                                        :props=\"{\n                                            column: column.value,\n                                            index: column.index,\n                                            filters,\n                                        }\" />\n                                    <o-input\n                                        v-else-if=\"column.field\"\n                                        v-model=\"filters[column.field]\"\n                                        :name=\"`column_${column.field}_filter`\"\n                                        :type=\"\n                                            column.numeric ? 'number' : 'search'\n                                        \"\n                                        role=\"searchbox\"\n                                        :placeholder=\"filterPlaceholder\"\n                                        :debounce=\"filterDebounce\"\n                                        :icon=\"filterIcon\"\n                                        :pack=\"iconPack\"\n                                        size=\"small\"\n                                        :aria-label=\"`${column.label} filter`\"\n                                        @input=\"\n                                            (v, e) =>\n                                                $emit('filter', column, v, e)\n                                        \" />\n                                </template>\n                            </th>\n                        </template>\n\n                        <!-- checkable column right -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'right'\"\n                            :class=\"thBaseClasses\" />\n                    </tr>\n\n                    <tr\n                        v-if=\"hasSubheadings\"\n                        :aria-rowindex=\"hasFilterColumns ? 3 : 2\">\n                        <!-- detailed toggle column -->\n                        <th\n                            v-if=\"showDetailRowIcon\"\n                            :class=\"[...thBaseClasses, ...thDetailedClasses]\" />\n\n                        <!-- checkable column left -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'left'\"\n                            :class=\"thBaseClasses\" />\n\n                        <!-- row data columns -->\n                        <template\n                            v-for=\"column in tableColumns\"\n                            :key=\"column.identifier\">\n                            <th\n                                v-if=\"!column.hidden\"\n                                v-bind=\"column.thAttrsData\"\n                                :class=\"[\n                                    ...thBaseClasses,\n                                    ...column.thSubClasses,\n                                ]\"\n                                :style=\"isMobileActive ? {} : column.style\">\n                                <o-slot-component\n                                    :component=\"column\"\n                                    name=\"subheading\"\n                                    tag=\"span\"\n                                    :props=\"{\n                                        column: column.value,\n                                        index: column.index,\n                                    }\">\n                                    <span :class=\"thLabelClasses\">\n                                        {{ column.subheading }}\n                                    </span>\n                                </o-slot-component>\n                            </th>\n                        </template>\n\n                        <!-- checkable column right -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'right'\"\n                            :class=\"thBaseClasses\" />\n                    </tr>\n                </thead>\n\n                <tbody>\n                    <!-- table rows -->\n                    <template\n                        v-for=\"(row, rowIndex) in tableRows\"\n                        :key=\"(row.key ?? '0') + (row.hidden ?? false)\">\n                        <tr\n                            v-if=\"!row.hidden\"\n                            :class=\"rowClasses(row)\"\n                            :draggable=\"canDragRow\"\n                            :aria-rowindex=\"ariaRowIndexStart + rowIndex + 1\"\n                            @click=\"selectRow(row, $event)\"\n                            @dblclick=\"\n                                $emit('dblclick', row.value, row.index, $event)\n                            \"\n                            @mouseenter=\"\n                                $emit(\n                                    'mouseenter',\n                                    row.value,\n                                    row.index,\n                                    $event,\n                                )\n                            \"\n                            @mouseleave=\"\n                                $emit(\n                                    'mouseleave',\n                                    row.value,\n                                    row.index,\n                                    $event,\n                                )\n                            \"\n                            @contextmenu=\"\n                                $emit(\n                                    'contextmenu',\n                                    row.value,\n                                    row.index,\n                                    $event,\n                                )\n                            \"\n                            @dragstart=\"handleDragStart(row, $event)\"\n                            @dragend=\"handleDragEnd(row, $event)\"\n                            @drop=\"handleDrop(row, $event)\"\n                            @dragover=\"handleDragOver(row, $event)\"\n                            @dragleave=\"handleDragLeave(row, $event)\">\n                            <!-- detailed toggle column -->\n                            <td\n                                v-if=\"showDetailRowIcon\"\n                                :class=\"[\n                                    ...tdBaseClasses,\n                                    ...tdDetailedClasses,\n                                ]\">\n                                <o-icon\n                                    v-if=\"isDetailedVisible(row.value)\"\n                                    :icon=\"detailIcon\"\n                                    :pack=\"iconPack\"\n                                    :rotation=\"isDetailRowVisible(row) ? 90 : 0\"\n                                    clickable\n                                    :aria-label=\"`Open ${row.label} details`\"\n                                    @click.prevent=\"toggleDetails(row)\" />\n                            </td>\n\n                            <!-- checkable column left -->\n                            <td\n                                v-if=\"checkable && checkboxPosition === 'left'\"\n                                :class=\"[\n                                    ...tdBaseClasses,\n                                    ...tdCheckboxClasses,\n                                ]\">\n                                <o-checkbox\n                                    :model-value=\"isChecked(row)\"\n                                    autocomplete=\"off\"\n                                    :name=\"`row_${row.index}_check`\"\n                                    :variant=\"checkboxVariant\"\n                                    :disabled=\"!isRowCheckable(row.value)\"\n                                    :aria-label=\"`Check ${row.label}`\"\n                                    @update:model-value=\"checkRow(row)\" />\n                            </td>\n\n                            <!-- row data columns -->\n                            <template\n                                v-for=\"column in tableColumns\"\n                                :key=\"column.identifier\">\n                                <o-slot-component\n                                    v-if=\"!column.hidden\"\n                                    v-bind=\"column.tdAttrsData[row.index]\"\n                                    :component=\"column\"\n                                    name=\"default\"\n                                    tag=\"td\"\n                                    :class=\"[\n                                        ...tdBaseClasses,\n                                        ...column.tdClasses,\n                                    ]\"\n                                    :data-label=\"column.label\"\n                                    :style=\"isMobileActive ? {} : column.style\"\n                                    :props=\"{\n                                        row: row.value,\n                                        index: row.index,\n                                        column: column.value,\n                                        colindex: column.index,\n                                        toggleDetails: () => toggleDetails(row),\n                                    }\"\n                                    @click=\"\n                                        $emit(\n                                            'cell-click',\n                                            row.value,\n                                            column.value,\n                                            row.index,\n                                            column.index,\n                                            $event,\n                                        )\n                                    \">\n                                    {{ column.getValue(row.value) }}\n                                </o-slot-component>\n                            </template>\n\n                            <!-- checkable column right -->\n                            <td\n                                v-if=\"checkable && checkboxPosition === 'right'\"\n                                :class=\"[\n                                    ...tdBaseClasses,\n                                    ...tdCheckboxClasses,\n                                ]\">\n                                <o-checkbox\n                                    :model-value=\"isChecked(row)\"\n                                    autocomplete=\"off\"\n                                    :variant=\"checkboxVariant\"\n                                    :disabled=\"!isRowCheckable(row.value)\"\n                                    :aria-label=\"`Check ${row.label}`\"\n                                    @update:model-value=\"checkRow(row)\" />\n                            </td>\n                        </tr>\n\n                        <transition-group\n                            v-if=\"!row.hidden && props.detailed\"\n                            :name=\"detailTransition\">\n                            <template v-if=\"isDetailRowVisible(row)\">\n                                <slot\n                                    v-if=\"customDetailRow\"\n                                    name=\"detail\"\n                                    :row=\"row.value\"\n                                    :index=\"row.index\" />\n                                <tr\n                                    v-else\n                                    :key=\"`${row.key}_detail`\"\n                                    :class=\"trDetailedClasses\">\n                                    <td :colspan=\"columnCount\">\n                                        <slot\n                                            name=\"detail\"\n                                            :row=\"row.value\"\n                                            :index=\"row.index\" />\n                                    </td>\n                                </tr>\n                            </template>\n                        </transition-group>\n                    </template>\n\n                    <tr v-if=\"!availableRows.length\" :class=\"trEmptyClasses\">\n                        <td :colspan=\"columnCount\">\n                            <slot name=\"empty\">\n                                <o-icon\n                                    v-if=\"emptyIcon\"\n                                    :icon=\"emptyIcon\"\n                                    :size=\"emptyIconSize\"\n                                    :pack=\"iconPack\" />\n                                {{ emptyLabel }}\n                            </slot>\n                        </td>\n                    </tr>\n                </tbody>\n\n                <tfoot v-if=\"$slots.footer\">\n                    <tr :class=\"footerClasses\">\n                        <slot\n                            v-if=\"hasCustomFooterSlot()\"\n                            name=\"footer\"\n                            :column-count=\"columnCount\"\n                            :row-count=\"rowCount\" />\n                        <th v-else :colspan=\"columnCount\">\n                            <slot\n                                name=\"footer\"\n                                :column-count=\"columnCount\"\n                                :row-count=\"rowCount\" />\n                        </th>\n                    </tr>\n                </tfoot>\n            </table>\n            <slot name=\"loading\" :loading=\"loading\">\n                <o-loading\n                    v-bind=\"loadingClasses\"\n                    :full-page=\"false\"\n                    :active=\"loading\"\n                    :icon=\"loadingIcon\"\n                    :label=\"loadingLabel\" />\n            </slot>\n        </div>\n\n        <template\n            v-if=\"\n                (checkable && $slots['bottomLeft']) ||\n                (paginated &&\n                    (paginationPosition === 'bottom' ||\n                        paginationPosition === 'both'))\n            \">\n            <slot\n                name=\"pagination\"\n                :current=\"tableCurrentPage\"\n                :per-page=\"perPage\"\n                :total=\"tableTotal\"\n                :change=\"(page) => (tableCurrentPage = page)\">\n                <o-table-pagination\n                    v-model:current=\"tableCurrentPage\"\n                    :paginated=\"paginated\"\n                    :per-page=\"perPage\"\n                    :total=\"tableTotal\"\n                    :rounded=\"paginationRounded\"\n                    :size=\"paginationSize\"\n                    :order=\"paginationOrder\"\n                    :simple=\"paginationSimple\"\n                    :range-before=\"paginationRangeBefore\"\n                    :range-after=\"paginationRangeAfter\"\n                    :icon-pack=\"iconPack\"\n                    :aria-next-label=\"ariaNextLabel\"\n                    :aria-previous-label=\"ariaPreviousLabel\"\n                    :aria-page-label=\"ariaPageLabel\"\n                    :aria-current-label=\"ariaCurrentLabel\"\n                    :root-class=\"paginationWrapperRootClasses\"\n                    @change=\"(page) => $emit('page-change', page)\">\n                    <slot name=\"bottomLeft\" />\n                </o-table-pagination>\n            </slot>\n        </template>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport {\n    computed,\n    ref,\n    watch,\n    nextTick,\n    useSlots,\n    toValue,\n    useTemplateRef,\n    toRaw,\n    triggerRef,\n    type MaybeRefOrGetter,\n    type VNode,\n} from \"vue\";\n\nimport OCheckbox from \"@/components/checkbox/Checkbox.vue\";\nimport OIcon from \"@/components/icon/Icon.vue\";\nimport OInput from \"@/components/input/Input.vue\";\nimport OLoading from \"@/components/loading/Loading.vue\";\nimport OSlotComponent from \"@/components/utils/SlotComponent\";\n\nimport OTableMobileSort from \"./TableMobileSort.vue\";\nimport OTableColumn from \"./TableColumn.vue\";\nimport OTablePagination from \"./TablePagination.vue\";\n\nimport { getDefault, getDefaultFunction } from \"@/utils/config\";\nimport {\n    getValueByPath,\n    toCssDimension,\n    sortBy,\n    isDefined,\n    getPropertyValue,\n} from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    getActiveClasses,\n    useProviderParent,\n    useMatchMedia,\n    useIndexer,\n} from \"@/composables\";\n\nimport type { ClassBinding, Numberish } from \"@/types\";\nimport type {\n    TableColumn,\n    TableRow,\n    TableColumnItem,\n    TableColumnComponent,\n} from \"./types\";\nimport type { TableProps } from \"./props\";\n\n/**\n * Tabulated data are sometimes needed, it's even better when it's responsive.\n * @displayName Table\n * @requires ./TableColumn.vue\n * @style _table.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTable\",\n    configField: \"table\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<TableProps<T>>(), {\n    override: undefined,\n    data: undefined,\n    columns: undefined,\n    rowKey: () => getDefault(\"table.rowKey\"),\n    rowClass: getDefaultFunction(\"table.rowClass\", () => \"\"),\n    thAttrs: undefined,\n    tdAttrs: undefined,\n    customCompare: undefined,\n    bordered: () => getDefault(\"table.bordered\", false),\n    striped: () => getDefault(\"table.striped\", false),\n    narrowed: () => getDefault(\"table.narrowed\", false),\n    hoverable: () => getDefault(\"table.hoverable\", false),\n    selected: undefined,\n    selectable: () => getDefault(\"table.selectable\", false),\n    isRowSelectable: () => true,\n    showHeader: () => getDefault(\"table.showHeader\", true),\n    draggable: false,\n    draggableColumn: false,\n    scrollable: undefined,\n    stickyHeader: false,\n    height: undefined,\n    checkable: false,\n    checkedRows: () => [],\n    checkableHeader: true,\n    stickyCheckbox: false,\n    checkboxPosition: () => getDefault(\"table.checkboxPosition\", \"left\"),\n    checkboxVariant: () => getDefault(\"table.checkboxVariant\"),\n    isRowChecked: undefined,\n    isRowCheckable: getDefaultFunction(\"table.isRowCheckable\", () => true),\n    keepChecked: () => getDefault(\"table.keepChecked\", false),\n    backendSorting: () => getDefault(\"table.backendSorting\", false),\n    defaultSort: () => getDefault(\"table.defaultSort\"),\n    defaultSortDirection: () => getDefault(\"table.defaultSortDirection\", \"asc\"),\n    sortIcon: () => getDefault(\"table.sortIcon\", \"arrow-up\"),\n    sortIconSize: () => getDefault(\"table.sortIconSize\", \"small\"),\n    iconPack: () => getDefault(\"table.iconPack\"),\n    detailed: false,\n    detailedRows: () => [],\n    isDetailedVisible: getDefaultFunction(\n        \"table.isDetailedVisible\",\n        () => true,\n    ),\n    showDetailIcon: () => getDefault(\"table.showDetailIcon\", true),\n    detailIcon: () => getDefault(\"table.detailIcon\", \"chevron-right\"),\n    customDetailRow: false,\n    detailTransition: () => getDefault(\"table.detailTransition\", \"slide\"),\n    paginated: () => getDefault(\"table.paginated\", false),\n    backendPagination: false,\n    total: 0,\n    currentPage: 1,\n    perPage: () => getDefault(\"table.perPage\", 20),\n    paginationPosition: () => getDefault(\"table.paginationPosition\", \"bottom\"),\n    paginationSize: () => getDefault(\"table.paginationSize\", \"small\"),\n    paginationRounded: () => getDefault(\"table.paginationRounded\", false),\n    paginationSimple: () => getDefault(\"table.paginationSimple\", false),\n    paginationOrder: () => getDefault(\"table.paginationOrder\"),\n    paginationRangeBefore: undefined,\n    paginationRangeAfter: undefined,\n    backendFiltering: () => getDefault(\"table.backendFiltering\", false),\n    filterIcon: () => getDefault(\"table.filterIcon\"),\n    filterPlaceholder: () => getDefault(\"table.filterPlaceholder\"),\n    filterDebounce: () => getDefault(\"table.filterDebounce\", 300),\n    emptyLabel: () => getDefault(\"table.emptyLabel\"),\n    emptyIcon: () => getDefault(\"table.emptyIcon\"),\n    emptyIconSize: () => getDefault(\"table.emptyIconSize\"),\n    loading: false,\n    loadingIcon: () => getDefault(\"table.loadingIcon\", \"loading\"),\n    loadingLabel: () => getDefault(\"table.loadingLabel\"),\n    mobileBreakpoint: () => getDefault(\"table.mobileBreakpoint\"),\n    mobileCards: () => getDefault(\"table.mobileCards\", true),\n    mobileSortPlaceholder: () => getDefault(\"table.mobileSortPlaceholder\"),\n    ariaNextLabel: () => getDefault(\"table.ariaNextLabel\"),\n    ariaPreviousLabel: () => getDefault(\"table.ariaPreviousLabel\"),\n    ariaPageLabel: () => getDefault(\"table.ariaPageLabel\"),\n    ariaCurrentLabel: () => getDefault(\"table.ariaCurrentLabel\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * currentPage prop two-way binding\n     * @param value {number} - updated currentPage prop\n     */\n    \"update:currentPage\": [value: number];\n    /**\n     * on pagination page change event\n     * @param page {number} - updated page\n     */\n    \"page-change\": [page: number];\n    /**\n     * select prop two-way binding\n     * @param value {unknown} - updated select prop\n     */\n    \"update:selected\": [value: T];\n    /**\n     * on row select event\n     * @param newRow {unknown} - new select value\n     * @param oldRow {unknown} - old select value\n     */\n    select: [newRow: T, oldRow: T];\n    /**\n     * on row checked event\n     * @param value {unknown[]} - all checked rows\n     * @param row {unknown} - row data\n     */\n    check: [value: T[], row: T];\n    /**\n     * on all rows checked event\n     * @param value {unknown[]} - all checked rows\n     */\n    \"check-all\": [value: T[]];\n    /**\n     * checkedRows prop two-way binding\n     * @param value {unknown[]} - updated checkedRows prop\n     */\n    \"update:checkedRows\": [value: T[]];\n    /**\n     * on column sort change event\n     * @param column {TableColumn} - column data\n     * @param direction {string} - 'asc' or 'desc'\n     * @param event {Event} - native event\n     */\n    sort: [column: TableColumn<T>, direction: \"asc\" | \"desc\", event: Event];\n    /**\n     * on filter change event\n     * @param filters {object} - filter object\n     */\n    \"filters-change\": [value: Record<string, string>];\n    /**\n     * on native filter event\n     * @param column {TableColumn} - column data\n     * @param value {string} - filter input value\n     * @param event {Event} - native event\n     */\n    filter: [column: TableColumn<T>, value: string, event: Event];\n    /**\n     * detailedRows prop two-way binding\n     * @param value {unknown[]} - updated detailedRows prop\n     */\n    \"update:detailedRows\": [value: T[]];\n    /**\n     * on details open event\n     * @param row {unknown} - row data\n     */\n    \"details-open\": [row: T];\n    /**\n     * on details close event\n     * @param row {unknown} - row data\n     */\n    \"details-close\": [row: T];\n    /**\n     * on row click event\n     * @param row {unknown} - row data\n     * @param index {number} - index of clicked row\n     * @param event {Event} - native click event\n     */\n    click: [row: T, index: number, event: Event];\n    /**\n     * on row double click event\n     * @param row {unknown} - row data\n     * @param index {number} - index of clicked row\n     * @param event {Event} - native click event\n     */\n    dblclick: [row: T, index: number, event: Event];\n    /**\n     * on row right click event\n     * @param row {unknown} - row data\n     * @param index {number} - index of clicked row\n     * @param event {Event} - native contextmenu event\n     */\n    contextmenu: [row: T, index: number, event: Event];\n    /**\n     * on row mouseenter event\n     * @param row {unknown} - row data\n     * @param index {number} - index of clicked row\n     * @param event {Event} - native mouseenter event\n     */\n    mouseenter: [row: T, index: number, event: Event];\n    /**\n     * on row mouseleave event\n     * @param row {unknown} - row data\n     * @param index {number} - index of clicked row\n     * @param event {Event} - native mouseleave event\n     */\n    mouseleave: [row: T, index: number, event: Event];\n    /**\n     * on cell click event\n     * @param row {unknown} - row data\n     * @param column {TableColumn} - column data\n     * @param index {number} - row index\n     * @param colindex {number} - column index\n     * @param event {Event} - native click event\n     */\n    \"cell-click\": [\n        row: T,\n        column: TableColumn<T>,\n        index: number,\n        colindex: number,\n        event: Event,\n    ];\n    /**\n     * on row dragstart event\n     * @param row {unknown} - row data\n     * @param index {number} - index of draged row\n     * @param event {DragEvent} - native dragstart event\n     */\n    dragstart: [row: T, index: number, event: DragEvent];\n    /**\n     * on row dragend event\n     * @param row {unknown} - row data\n     * @param index {number} - index of draged row\n     * @param event {DragEvent} - native dragend event\n     */\n    dragend: [row: T, index: number, event: DragEvent];\n    /**\n     * on row drop event\n     * @param row {unknown} - row data\n     * @param index {number} - index of draged row\n     * @param event {DragEvent} - native drop event\n     */\n    drop: [row: T, index: number, event: DragEvent];\n    /**\n     * on row dragleave event\n     * @param row {unknown} - row data\n     * @param index {number} - index of draged row\n     * @param event {DragEvent} - native dragleave event\n     */\n    dragleave: [row: T, index: number, event: DragEvent];\n    /**\n     * on row dragover event\n     * @param row {unknown} - row data\n     * @param index {number} - index of draged row\n     * @param event {DragEvent} - native dragover event\n     */\n    dragover: [row: T, index: number, event: DragEvent];\n    /**\n     * on column columndragstart event\n     * @param column {TableColumn} - column data\n     * @param index {number} - index of draged column\n     * @param event {DragEvent} - native columndragstart event\n     */\n    columndragstart: [column: TableColumn<T>, index: number, event: DragEvent];\n    /**\n     * on column columndragend event\n     * @param column {TableColumn} - column data\n     * @param index {number} - index of draged column\n     * @param event {DragEvent} - native columndragend event\n     */\n    columndragend: [column: TableColumn<T>, index: number, event: DragEvent];\n    /**\n     * on column columndrop event\n     * @param column {TableColumn} - column data\n     * @param index {number} - index of draged column\n     * @param event {DragEvent} - native columndrop event\n     */\n    columndrop: [column: TableColumn<T>, index: number, event: DragEvent];\n    /**\n     * on column columndragleave event\n     * @param column {TableColumn} - column data\n     * @param index {number} - index of draged column\n     * @param event {DragEvent} - native columndragleave event\n     */\n    columndragleave: [column: TableColumn<T>, index: number, event: DragEvent];\n    /**\n     * on column columndragover event\n     * @param column {TableColumn} - column data\n     * @param index {number} - index of draged column\n     * @param event {DragEvent} - native columndragover event\n     */\n    columndragover: [column: TableColumn<T>, index: number, event: DragEvent];\n}>();\n\ndefineSlots<{\n    /** Define extra `o-table-column` components here, even if you have some columns defined by prop */\n    before?(): void;\n    /** Define extra `o-table-column` components here, even if you have some columns defined by prop */\n    after?(): void;\n    /** Define `o-table-column` here */\n    default?(): void;\n    /**\n     * Override the pagination label\n     * @param current {number} - current page\n     * @param perPage {number} - rows per page\n     * @param total {number} - total rows count\n     * @param change {(page: number): void } - on page change event\n     */\n    pagination?(props: {\n        current: number;\n        perPage: Numberish;\n        total: number;\n        change: (page: number) => void;\n    }): void;\n    /** Define a table caption here */\n    caption?(): void;\n    /** Define content to palce before the header here */\n    preheader?(): void;\n    /**\n     * Override the check all checkbox\n     * @param isAllChecked {boolean} - if all rows are checked\n     * @param isAllUncheckable {boolean} - if check all is uncheckable\n     * @param checkAll {(): void}  - check all function\n     */\n    checkAll?(props: {\n        isAllChecked: boolean;\n        isAllUncheckable: boolean;\n        checkAll: () => void;\n    }): void;\n    /**\n     * Define row detail content here\n     * @param row {unknown} - row content\n     * @param index {number} - row index\n     */\n    detail?(props: { row: T; index: number }): void;\n    /** Define the content to show if table is empty */\n    empty?(): void;\n    /**\n     * Define a custom footer\n     * @param columnCount {number} - counts of visible columns\n     * @param rowCount {number} - counts of visible rows\n     */\n    footer?(props: { columnCount: number; rowCount: number }): VNode[];\n    /**\n     * Override loading component\n     * @param loading {boolean} - is loading state enabled\n     */\n    loading?(): void;\n    /** Additional slot if table is paginated */\n    topLeft?(): void;\n    /** Additional slot if table is paginated */\n    bottomLeft?(): void;\n}>();\n\nconst slots = useSlots();\n\nconst { isMobile } = useMatchMedia(props.mobileBreakpoint);\n\nconst isMobileActive = computed(() => props.mobileCards && isMobile.value);\n\nconst slotsRef = useTemplateRef(\"slotsWrapper\");\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<TableColumnComponent<T>>({\n    rootRef: slotsRef,\n});\n\n// #region --- Table Columns Definition ---\n\n/** all defined columns */\nconst tableColumns = computed<TableColumnItem<T>[]>(() => {\n    if (!childItems.value.length) return [];\n    return childItems.value.map((columnItem) => {\n        const column = toValue(columnItem.data!);\n\n        // create additional th attrs data\n        let thAttrsData =\n            typeof props.thAttrs === \"function\" ? props.thAttrs(column) : {};\n        thAttrsData = Object.assign(thAttrsData, column.thAttrs);\n\n        // create additional td attrs data\n        const tdAttrsData = (props.data ?? []).map((data) => {\n            const tdAttrs =\n                typeof props.tdAttrs === \"function\"\n                    ? props.tdAttrs(data, column)\n                    : {};\n            return Object.assign(tdAttrs, column.tdAttrs);\n        });\n\n        return {\n            ...column,\n            value: column,\n            el: columnItem.el,\n            index: columnItem.index,\n            identifier: columnItem.identifier,\n            thAttrsData: thAttrsData,\n            tdAttrsData: tdAttrsData,\n        };\n    });\n});\n\n/** total columns count */\nconst columnCount = computed(() => {\n    let i = tableColumns.value.length;\n    if (showDetailRowIcon.value) i++;\n    if (props.checkable) i++;\n    return i;\n});\n\n/** aria-colindex start value for ths */\nconst ariaColIndexStart = computed(() => {\n    let i = 1;\n    if (showDetailRowIcon.value) i++;\n    if (props.checkable && props.checkboxPosition === \"left\") i++;\n    return i;\n});\n\n/** check if table has subheadings  */\nconst hasSubheadings = computed(() => {\n    return tableColumns.value.some((column) => !!column.subheading);\n});\n\n/** check if table is scrollable */\nconst isScrollable = computed(() => {\n    if (props.scrollable) return true;\n    return tableColumns.value.some((column) => column.sticky);\n});\n\n// #endregion --- Table Columns Definition ---\n\n// #region --- Table Rows Definition ---\n\nconst tableCurrentPage = defineModel<number>(\"currentPage\", { default: 1 });\n\n// create a unique id sequence\nconst indexer = useIndexer();\n\n/** All defined data elements as normalized rows with a unique key. */\nconst tableRows = computed<TableRow<T>[]>(() => {\n    if (!props.data) return [];\n    return props.data.map((value: T, idx: number) => ({\n        label: \"row \" + idx, // row display label\n        value: toValue(value), // normalizes wrapped ref values\n        index: idx, // row index\n        key:\n            // if no key is given and data is object, create unique row id for each row\n            String(getValueByPath(value, props.rowKey) || indexer.nextIndex()),\n        hidden: false,\n    }));\n});\n\n/** Filtered normalized rows by any given filter value. */\nconst filteredRows = computed<TableRow<T>[]>(() =>\n    // defines the hidden state on the original row list and returns a filtered row list\n    filterRows(tableRows.value),\n);\n\n/** Visible rows for the current page. */\nconst availableRows = computed<TableRow<T>[]>(() =>\n    // defines the hidden state on the original row list and returns only the rows on the current page\n    paginateRows(filteredRows.value),\n);\n\n// reset row hidden states on specifc prop change\nwatch(\n    () => props.paginated,\n    () => {\n        tableRows.value.forEach((row) => (row.hidden = false));\n        // Force trigger effects for the base normalized rows after making same deep mutations.\n        // This forces reactive dependencies to recompute and to redefine the hidden states.\n        triggerRef(tableRows);\n    },\n);\n\n/**\n * Check if footer slot has custom content.\n * Must be called during rendering.\n */\nfunction hasCustomFooterSlot(): boolean {\n    if (!slots.footer) return false;\n\n    const footer = slots.footer({\n        columnCount: columnCount.value,\n        rowCount: rowCount.value,\n    });\n    if (footer.length > 1) return true;\n\n    const tag = footer[0][\"type\"];\n    return tag === \"th\" || tag === \"td\";\n}\n\n/** check if two rows are equal by a custom compare function or the rowKey attribute */\nfunction isRowEqual(\n    sourceRow: MaybeRefOrGetter<T>,\n    targetRow: MaybeRefOrGetter<T>,\n): boolean {\n    const el1 = toRaw(toValue(sourceRow));\n    const el2 = toRaw(toValue(targetRow));\n    if (!isDefined(targetRow)) return false;\n    if (typeof props.customCompare === \"function\")\n        return props.customCompare(el1, el2);\n    if (props.rowKey)\n        return (\n            getPropertyValue(el1, props.rowKey) ==\n            getPropertyValue(el2, props.rowKey)\n        );\n    return el1 == el2;\n}\n\n// #endregion  --- Table Rows Definition ---\n\n// #region --- Pagination Feature ---\n\n/*\n * Total data count.\n * If backend paginated, use props total else use rows data length as pagination total.\n */\nconst tableTotal = computed(() =>\n    props.backendPagination ? props.total : filteredRows.value.length,\n);\n\n/** total rows count  */\nconst rowCount = computed(() => {\n    return tableTotal.value + ariaRowIndexStart.value;\n});\n\n/** aria-rowindex start value for tds based if any column is filterable or has subheading */\nconst ariaRowIndexStart = computed(() => {\n    let i = 1;\n    if (hasFilterColumns.value) i++;\n    if (hasSubheadings.value) i++;\n    return i;\n});\n\nfunction paginateRows(rows: TableRow<T>[]): TableRow<T>[] {\n    if (!props.paginated || props.backendPagination)\n        // always return a new array object\n        return [...rows];\n\n    // calculate pagination information\n    const perPage = Number(props.perPage);\n    const currentPage = Math.min(\n        Math.ceil(rows.length / perPage),\n        tableCurrentPage.value,\n    );\n    const pageStart = (currentPage - 1) * perPage;\n    const pageEnd = pageStart + perPage;\n\n    // check if a row is filtered out (hidden) by not on the current page\n    return rows.filter((row, idx) => {\n        // check if row is on the current page\n        const currentPage =\n            rows.length < perPage || (idx >= pageStart && idx < pageEnd);\n\n        // update hidden state\n        row.hidden = !currentPage;\n        return !row.hidden;\n    });\n}\n\n// #endregion --- Pagination Feature ---\n\n// #region --- Filter Feature ---\n\n/** filter record alias { fieldKey: filterValue } */\nconst filters = ref<Record<string, string>>({});\n\n/** check if any column has filterable active */\nconst hasFilterColumns = computed(() =>\n    tableColumns.value.some((column) => column.filterable),\n);\n\n// emit filter change event\nwatch(filters, (value) => emits(\"filters-change\", value), { deep: true });\n\n/**\n * Set the hidden state for the given rows based on active filter values.\n * Returns a filtered list of the mutated rows.\n */\nfunction filterRows(rows: TableRow<T>[]): TableRow<T>[] {\n    if (props.backendFiltering)\n        // always return a new array object\n        return [...rows];\n\n    if (!Object.values(filters.value).filter(Boolean).length) {\n        // when has no filter reset hidden states\n        rows.forEach((row) => (row.hidden = false));\n        // always return a new array object\n        return [...rows];\n    }\n\n    // check if a row is filtered out (hidden) by not matching any active filter expresssions\n    return rows.filter((row) => {\n        const matches = Object.entries(filters.value).some(\n            ([columnKey, filter]) => {\n                if (!filter) return false;\n                // get column for the filter\n                const column = tableColumns.value.find(\n                    (c) => c.field === columnKey,\n                );\n                if (!column) return false;\n\n                // check if the value matches the filter string\n                return column.matches(row.value, filter);\n            },\n        );\n\n        // update hidden state\n        row.hidden = !matches;\n        return !row.hidden;\n    });\n}\n\n// #endregion --- Filter Feature ---\n\n// #region --- Sort Feature ---\n\nconst currentSortColumn = ref<TableColumnItem<T>>();\nconst isAsc = ref(true);\n\n/** check if has any sortable column */\nconst hasSortableColumns = computed(() =>\n    tableColumns.value.some((column) => column.sortable),\n);\n\n/** check if the column is the current sort column */\nfunction isColumnSorted(column: TableColumnItem<T>): boolean {\n    return currentSortColumn.value?.identifier === column.identifier;\n}\n\n// calculate default sort on columns change and on initial load\nwatch(tableColumns, defaultSort, { immediate: true });\n\n/** sort column based on the default-sort prop if not already sorted */\nfunction defaultSort(): void {\n    // prevent sort when not columns or already sorted (for example async data)\n    if (!tableColumns.value.length || currentSortColumn.value) return;\n    if (!props.defaultSort) return;\n\n    let sortField = props.defaultSort;\n    let sortDirection = props.defaultSortDirection;\n    if (Array.isArray(props.defaultSort)) {\n        sortField = props.defaultSort[0];\n        if (props.defaultSort[1]) sortDirection = props.defaultSort[1];\n    } else {\n        sortField = props.defaultSort;\n    }\n    sortByField(sortField, sortDirection);\n}\n\nfunction sortByField(field: string, direction: \"asc\" | \"desc\"): void {\n    const sortColumn = tableColumns.value.find(\n        (column) => column.field === field,\n    );\n    if (sortColumn) {\n        isAsc.value = direction.toLowerCase() === \"asc\";\n        sort(sortColumn);\n    }\n}\n\n/**\n * Sort the column.\n * Toggle current direction on column if it's sortable\n * and not just updating the prop.\n */\nfunction sort(\n    column: TableColumnItem<T>,\n    updateDirection = false,\n    event: Event = new Event(\"sort\"),\n): void {\n    if (!column?.sortable) return;\n\n    if (updateDirection)\n        isAsc.value = isColumnSorted(column)\n            ? !isAsc.value\n            : props.defaultSortDirection.toLowerCase() === \"asc\";\n\n    // if not first time sort\n    if (currentSortColumn.value)\n        emits(\"sort\", column, isAsc.value ? \"asc\" : \"desc\", event);\n\n    currentSortColumn.value = column;\n\n    // sort rows by mutating the array\n    sortRows(tableRows.value, column);\n\n    // Force trigger effects for the base normalized rows after making deep mutations.\n    // This forces reactive dependencies to recompute.\n    triggerRef(tableRows);\n}\n\n// recompute table rows sorting on data prop change\nwatch(\n    () => props.data,\n    () => {\n        if (currentSortColumn.value)\n            sortRows(tableRows.value, currentSortColumn.value);\n    },\n);\n\n/** sort rows by mutating the given array */\nfunction sortRows(rows: TableRow<T>[], column: TableColumn<T>): TableRow<T>[] {\n    if (props.backendSorting) return rows;\n\n    // sort rows by mutating the rows array\n    return sortBy<TableRow<T>, string>(\n        rows,\n        column.field ? \"value.\" + column.field : \"\",\n        column.customSort\n            ? (a, b, asc): number => column.customSort!(a.value, b.value, asc)\n            : undefined,\n        isAsc.value,\n        true, // mutate the original array\n    );\n}\n\n// #endregion --- Sort Feature ---\n\n// #region --- Row Selection Feature ---\n\nconst tableSelectedRow = defineModel<T>(\"selected\", { default: undefined });\n\n/** table arrow keys listener, change selection */\nfunction onArrowPressed(delta: 1 | -1, event: KeyboardEvent): void {\n    if (!availableRows.value.length) return;\n\n    let index =\n        availableRows.value.findIndex((row) =>\n            isRowEqual(row.value, tableSelectedRow.value),\n        ) + delta;\n\n    // check if index overflow\n    index =\n        index > availableRows.value.length - 1\n            ? availableRows.value.length - 1\n            : index;\n    // check if index underflow\n    index = index < 0 ? 0 : index;\n\n    // get row element\n    const row = availableRows.value[index];\n\n    if (!props.isRowSelectable(row.value)) {\n        let newIndex: number | undefined;\n        if (delta > 0) {\n            for (\n                let i = index;\n                i < availableRows.value.length && newIndex === undefined;\n                i++\n            ) {\n                if (props.isRowSelectable(availableRows.value[i].value))\n                    newIndex = i;\n            }\n        } else {\n            for (let i = index; i >= 0 && newIndex === undefined; i--) {\n                if (props.isRowSelectable(availableRows.value[i].value))\n                    newIndex = i;\n            }\n        }\n        if (newIndex != undefined && newIndex >= 0)\n            selectRow(availableRows.value[newIndex], event);\n    } else {\n        selectRow(row, event);\n    }\n}\n\n/**\n * Row click listener.\n * Emit all necessary events.\n */\nfunction selectRow(row: TableRow<T>, event: Event): void {\n    emits(\"click\", row.value, row.index, event);\n\n    if (!props.selectable) return;\n\n    if (isRowEqual(tableSelectedRow, row.value)) return;\n    if (!props.isRowSelectable(row.value)) return;\n\n    tableSelectedRow.value = row.value;\n    // emit new and old row\n    emits(\"select\", row.value, tableSelectedRow.value);\n}\n\n// #endregion --- Row Selection Feature ---\n\n// #region --- Row Checkable Feature ---\n\nconst tableCheckedRows = defineModel<T[]>(\"checkedRows\", {\n    default: [],\n});\n\n/** reset checkedRows whem page props changes */\nwatch([tableCurrentPage, () => props.perPage], () => {\n    if (!props.keepChecked) tableCheckedRows.value = [];\n});\n\n/** check if all rows in the page are checked */\nconst isAllChecked = computed(() => {\n    const validVisibleData = availableRows.value.filter((row) =>\n        props.isRowCheckable(row.value),\n    );\n    if (validVisibleData.length === 0) return false;\n    return validVisibleData.every(isChecked);\n});\n\n/** check if all rows in the page are checkable */\nconst isAllUncheckable = computed(\n    () => !availableRows.value.some((row) => props.isRowCheckable(row.value)),\n);\n\n/** check if the row is checked (is added to the array) */\nfunction isChecked(row: TableRow<T>): boolean {\n    if (typeof props.isRowChecked === \"function\")\n        return props.isRowChecked(row.value);\n    else return tableCheckedRows.value.some((r) => isRowEqual(r, row.value));\n}\n\n/**\n * Update checked rows list.\n * If all rows are checked, uncheck all.\n * If not all rows are checked, check all visible rows.\n * Emits \"check-all\" event with the updated checked rows list.\n */\nfunction updateCheckedRows(checkAll?: boolean): void {\n    if (typeof checkAll === \"undefined\" ? isAllChecked.value : !checkAll)\n        // if all rows are already checked, check nothing\n        tableCheckedRows.value = [];\n    else {\n        // keep previously checked rows from other pages if keepChecked is enabled\n        const previouslyChecked = props.keepChecked\n            ? tableCheckedRows.value\n            : [];\n\n        // set all visible rows as checked\n        tableCheckedRows.value = [\n            ...previouslyChecked,\n            ...availableRows.value\n                .map((row) => row.value)\n                .filter((value) => props.isRowCheckable(value)),\n        ];\n    }\n\n    // emit event after the reactive checked rows list got updated\n    nextTick(() => emits(\"check-all\", tableCheckedRows.value));\n}\n\n/** row checkbox click listener */\nfunction checkRow(row: TableRow<T>): void {\n    if (!props.isRowCheckable(row.value)) return;\n\n    if (isChecked(row)) removeCheckedRow(row);\n    else addCheckedRow(row);\n\n    // emit event after the reactive checked rows list got updated\n    nextTick(() => emits(\"check\", tableCheckedRows.value, row.value));\n}\n\n/** add a checked row to the the array */\nfunction addCheckedRow(row: TableRow<T>): void {\n    tableCheckedRows.value = [...tableCheckedRows.value, row.value];\n}\n\n/** remove a checked row from the array */\nfunction removeCheckedRow(row: TableRow<T>): void {\n    const idx = tableCheckedRows.value.findIndex((r) =>\n        isRowEqual(r, row.value),\n    );\n    if (idx >= 0)\n        // remove the item at idx\n        tableCheckedRows.value = [\n            ...tableCheckedRows.value.slice(0, idx),\n            ...tableCheckedRows.value.slice(idx + 1),\n        ];\n}\n\n// #endregion --- Row Checkable Feature  ---\n\n// #region --- Detail Row Feature ---\n\nconst visibleDetailedRows = defineModel<T[]>(\"detailedRows\", {\n    default: [],\n});\n\n/**\n * Return if detailed row tabled.\n * Will be with chevron column & icon or not.\n */\nconst showDetailRowIcon = computed(\n    () => props.detailed && props.showDetailIcon,\n);\n\n/** toggle to show/hide details slot */\nfunction toggleDetails(row: TableRow<T>): void {\n    if (isDetailRowVisible(row)) {\n        closeDetailRow(row);\n        emits(\"details-close\", row.value);\n    } else {\n        openDetailRow(row);\n        emits(\"details-open\", row.value);\n    }\n}\n\nfunction openDetailRow(row: TableRow<T>): void {\n    visibleDetailedRows.value = [...visibleDetailedRows.value, row.value];\n}\n\nfunction closeDetailRow(row: TableRow<T>): void {\n    const idx = visibleDetailedRows.value.findIndex((r) =>\n        isRowEqual(r, row.value),\n    );\n    if (idx >= 0)\n        // remove the item at idx\n        visibleDetailedRows.value = [\n            ...visibleDetailedRows.value.slice(0, idx),\n            ...visibleDetailedRows.value.slice(idx + 1),\n        ];\n}\n\nfunction isDetailRowVisible(row: TableRow<T>): boolean {\n    return (\n        props.detailed &&\n        visibleDetailedRows.value.some((r) => isRowEqual(r, row.value))\n    );\n}\n\n// #endregion --- Detail Row Feature ---\n\n// #region --- Drag&Drop Feature ---\n\nconst isDraggingRow = ref(false);\nconst isDraggingColumn = ref(false);\n\nconst canDragRow = computed(() => props.draggable && !isDraggingColumn.value);\n\nconst canDragColumn = computed(\n    () => props.draggableColumn && !isDraggingRow.value,\n);\n\n/** emits drag start event */\nfunction handleDragStart(row: TableRow<T>, event: DragEvent): void {\n    if (!props.draggable) return;\n    emits(\"dragstart\", row.value, row.index, event);\n}\n\n/** emits drag leave event */\nfunction handleDragEnd(row: TableRow<T>, event: DragEvent): void {\n    if (!props.draggable) return;\n    emits(\"dragend\", row.value, row.index, event);\n}\n\n/** emits drop event */\nfunction handleDrop(row: TableRow<T>, event: DragEvent): void {\n    if (!props.draggable) return;\n    emits(\"drop\", row.value, row.index, event);\n}\n\n/** emits drag over event */\nfunction handleDragOver(row: TableRow<T>, event: DragEvent): void {\n    if (!props.draggable) return;\n    emits(\"dragover\", row.value, row.index, event);\n}\n\n/** emits drag leave event */\nfunction handleDragLeave(row: TableRow<T>, event: DragEvent): void {\n    if (!props.draggable) return;\n    emits(\"dragleave\", row.value, row.index, event);\n}\n\n/** emits drag start event (column) */\nfunction handleColumnDragStart(\n    column: TableColumnItem<T>,\n    event: DragEvent,\n): void {\n    if (!canDragColumn.value) return;\n    isDraggingColumn.value = true;\n    emits(\"columndragstart\", column.value, column.index, event);\n}\n\n/** emits drag leave event (column) */\nfunction handleColumnDragEnd(\n    column: TableColumnItem<T>,\n    event: DragEvent,\n): void {\n    if (!canDragColumn.value) return;\n    isDraggingColumn.value = false;\n    emits(\"columndragend\", column.value, column.index, event);\n}\n\n/** emits drop event (column) */\nfunction handleColumnDrop(column: TableColumnItem<T>, event: DragEvent): void {\n    if (!canDragColumn.value) return;\n    emits(\"columndrop\", column.value, column.index, event);\n}\n\n/** emits drag over event (column) */\nfunction handleColumnDragOver(\n    column: TableColumnItem<T>,\n    event: DragEvent,\n): void {\n    if (!canDragColumn.value) return;\n    emits(\"columndragover\", column.value, column.index, event);\n}\n\n/** emits drag leave event (column) */\nfunction handleColumnDragLeave(\n    column: TableColumnItem<T>,\n    event: DragEvent,\n): void {\n    if (!canDragColumn.value) return;\n    emits(\"columndragleave\", column.value, column.index, event);\n}\n\n// #endregion --- Drag&Drop Feature ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-table__root\"],\n    [\"mobileClass\", \"o-table__root--mobile\", null, isMobileActive],\n);\n\nconst tableWrapperClasses = defineClasses(\n    [\"wrapperClass\", \"o-table__wrapper\"],\n    [\n        \"stickyHeaderClass\",\n        \"o-table__wrapper--sticky-header\",\n        null,\n        computed(() => props.stickyHeader),\n    ],\n    [\"scrollableClass\", \"o-table__wrapper--scrollable\", null, isScrollable],\n    [\"mobileClass\", \"o-table__wrapper--mobile\", null, isMobileActive],\n);\n\nconst tableWrapperStyle = computed(() => ({\n    height: toCssDimension(props.height),\n}));\n\nconst tableClasses = defineClasses(\n    [\"tableClass\", \"o-table\"],\n    [\n        \"borderedClass\",\n        \"o-table--bordered\",\n        null,\n        computed(() => props.bordered),\n    ],\n    [\"stripedClass\", \"o-table--striped\", null, computed(() => props.striped)],\n    [\n        \"narrowedClass\",\n        \"o-table--narrowed\",\n        null,\n        computed(() => props.narrowed),\n    ],\n    [\n        \"hoverableClass\",\n        \"o-table--hoverable\",\n        null,\n        computed(\n            () =>\n                (props.hoverable || props.selectable) &&\n                !!availableRows.value.length,\n        ),\n    ],\n    [\n        \"emptyClass\",\n        \"o-table--empty\",\n        null,\n        computed(() => !availableRows.value.length),\n    ],\n);\n\nconst thBaseClasses = defineClasses([\"thClass\", \"o-table__th\"]);\n\nconst thCheckboxClasses = defineClasses(\n    [\"thCheckboxClass\", \"o-table__th-checkbox\"],\n    [\n        \"thStickyClass\",\n        \"o-table__th--sticky\",\n        null,\n        computed(() => props.stickyCheckbox),\n    ],\n);\n\nconst thSortedClasses = defineClasses([\"thSortedClass\", \"o-table__th--sorted\"]);\n\nconst thDetailedClasses = defineClasses([\n    \"thDetailedClass\",\n    \"o-table__th-detailed\",\n]);\n\nconst thLabelClasses = defineClasses([\"thLabelClass\", \"o-table__th__label\"]);\n\nconst thSortIconClasses = defineClasses([\n    \"thSortIconClass\",\n    \"o-table__th__sort-icon\",\n]);\n\nconst trBaseClasses = defineClasses([\"trClass\", \"o-table__tr\"]);\n\nconst trSelectedClasses = defineClasses([\n    \"trSelectedClass\",\n    \"o-table__tr--selected\",\n]);\n\nconst trCheckedClasses = defineClasses([\n    \"trCheckedClass\",\n    \"o-table__tr--checked\",\n]);\n\nconst trEmptyClasses = defineClasses([\"trEmptyClass\", \"o-table__tr-empty\"]);\n\nconst trDetailedClasses = defineClasses([\n    \"trDetailedClass\",\n    \"o-table__tr-detail\",\n]);\n\nconst tdBaseClasses = defineClasses([\"tdClass\", \"o-table__td\"]);\n\nconst tdCheckboxClasses = defineClasses(\n    [\"tdCheckboxClass\", \"o-table__td-checkbox\"],\n    [\n        \"thStickyClass\",\n        \"o-table__td--sticky\",\n        null,\n        computed(() => props.stickyCheckbox),\n    ],\n);\n\nconst tdDetailedClasses = defineClasses([\n    \"tdDetailClass\",\n    \"o-table__td-detail\",\n]);\n\nconst footerClasses = defineClasses([\"footerClass\", \"o-table__footer\"]);\n\nconst mobileSortClasses = defineClasses([\n    \"mobileSortClass\",\n    \"o-table__mobile-sort\",\n]);\n\nconst paginationWrapperClasses = defineClasses([\n    \"paginationWrapperClass\",\n    \"o-table__pagination\",\n]);\n\nconst paginationWrapperRootClasses = computed(() =>\n    getActiveClasses(paginationWrapperClasses),\n);\n\nfunction columnClasses(column: TableColumnItem<T>): ClassBinding[] {\n    return isColumnSorted(column) ? thSortedClasses.value : [];\n}\n\nfunction rowClasses(row: TableRow<T>): ClassBinding[] {\n    const selectedClasses = isRowEqual(row.value, tableSelectedRow.value)\n        ? trSelectedClasses.value\n        : [];\n\n    const checkedClasses = isChecked(row) ? trCheckedClasses.value : [];\n\n    const rowClass =\n        typeof props.rowClass === \"function\"\n            ? props.rowClass(row.value, row.index) || \"\"\n            : \"\";\n\n    return [\n        ...trBaseClasses.value,\n        ...selectedClasses,\n        ...checkedClasses,\n        { [rowClass]: true },\n    ];\n}\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({\n    columns: tableColumns,\n    rows: tableRows,\n    filters,\n    sort: sortByField,\n});\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <div data-oruga=\"table\" :class=\"rootClasses\">\n        <div ref=\"slotsWrapper\" style=\"display: none\">\n            <slot name=\"before\" />\n\n            <slot>\n                <template v-if=\"columns?.length\">\n                    <o-table-column\n                        v-for=\"(column, idx) in columns\"\n                        :key=\"column.field || idx\"\n                        v-bind=\"column\" />\n                </template>\n            </slot>\n\n            <slot name=\"after\" />\n        </div>\n\n        <o-table-mobile-sort\n            v-if=\"isMobileActive && hasSortableColumns\"\n            :current-sort-column=\"currentSortColumn\"\n            :columns=\"tableColumns\"\n            :placeholder=\"mobileSortPlaceholder\"\n            :icon-pack=\"iconPack\"\n            :sort-icon=\"sortIcon\"\n            :sort-icon-size=\"sortIconSize\"\n            :is-asc=\"isAsc\"\n            :mobile-sort-classes=\"mobileSortClasses\"\n            @sort=\"(column, event) => sort(column, true, event)\" />\n\n        <template\n            v-if=\"\n                paginated &&\n                (paginationPosition === 'top' || paginationPosition === 'both')\n            \">\n            <slot\n                name=\"pagination\"\n                :current=\"tableCurrentPage\"\n                :per-page=\"perPage\"\n                :total=\"tableTotal\"\n                :change=\"(page) => (tableCurrentPage = page)\">\n                <o-table-pagination\n                    v-model:current=\"tableCurrentPage\"\n                    :paginated=\"paginated\"\n                    :per-page=\"perPage\"\n                    :total=\"tableTotal\"\n                    :rounded=\"paginationRounded\"\n                    :size=\"paginationSize\"\n                    :order=\"paginationOrder\"\n                    :simple=\"paginationSimple\"\n                    :range-before=\"paginationRangeBefore\"\n                    :range-after=\"paginationRangeAfter\"\n                    :icon-pack=\"iconPack\"\n                    :aria-next-label=\"ariaNextLabel\"\n                    :aria-previous-label=\"ariaPreviousLabel\"\n                    :aria-page-label=\"ariaPageLabel\"\n                    :aria-current-label=\"ariaCurrentLabel\"\n                    :root-class=\"paginationWrapperRootClasses\"\n                    @change=\"(page) => $emit('page-change', page)\">\n                    <slot name=\"topLeft\" />\n                </o-table-pagination>\n            </slot>\n        </template>\n\n        <div :class=\"tableWrapperClasses\" :style=\"tableWrapperStyle\">\n            <table\n                v-if=\"tableColumns.length\"\n                v-bind=\"$attrs\"\n                :class=\"tableClasses\"\n                :tabindex=\"selectable || isScrollable ? 0 : undefined\"\n                :aria-rowcount=\"rowCount\"\n                :aria-colcount=\"columnCount\"\n                @keydown.prevent.up=\"onArrowPressed(-1, $event)\"\n                @keydown.prevent.down=\"onArrowPressed(1, $event)\"\n                @keydown.prevent.home=\"selectRow(availableRows[0], $event)\"\n                @keydown.prevent.end=\"\n                    selectRow(availableRows[availableRows.length - 1], $event)\n                \">\n                <caption v-if=\"$slots.caption\">\n                    <slot name=\"caption\" />\n                </caption>\n\n                <thead v-if=\"showHeader\">\n                    <slot name=\"preheader\" />\n\n                    <tr :aria-rowindex=\"1\">\n                        <!-- detailed toggle column -->\n                        <th\n                            v-if=\"showDetailRowIcon\"\n                            :class=\"[...thBaseClasses, ...thDetailedClasses]\"\n                            :aria-colindex=\"1\"\n                            aria-hidden=\"true\" />\n\n                        <!-- checkable column left -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'left'\"\n                            :class=\"[...thBaseClasses, ...thCheckboxClasses]\"\n                            :aria-colindex=\"showDetailRowIcon ? 2 : 1\">\n                            <slot\n                                v-if=\"checkableHeader\"\n                                name=\"checkAll\"\n                                :is-all-checked=\"isAllChecked\"\n                                :is-all-uncheckable=\"isAllUncheckable\"\n                                :check-all=\"updateCheckedRows\">\n                                <o-checkbox\n                                    :model-value=\"isAllChecked\"\n                                    autocomplete=\"off\"\n                                    name=\"row_check_all\"\n                                    :variant=\"checkboxVariant\"\n                                    :disabled=\"isAllUncheckable\"\n                                    aria-label=\"Check all\"\n                                    @update:model-value=\"\n                                        updateCheckedRows(!!$event)\n                                    \" />\n                            </slot>\n                        </th>\n\n                        <!-- row header columns -->\n                        <template\n                            v-for=\"column in tableColumns\"\n                            :key=\"column.identifier\">\n                            <th\n                                v-if=\"!column.hidden\"\n                                v-bind=\"column.thAttrsData\"\n                                :class=\"[\n                                    ...thBaseClasses,\n                                    ...column.thClasses,\n                                    ...columnClasses(column),\n                                ]\"\n                                :style=\"isMobileActive ? {} : column.style\"\n                                :draggable=\"canDragColumn\"\n                                :aria-sort=\"\n                                    isColumnSorted(column)\n                                        ? isAsc\n                                            ? 'ascending'\n                                            : 'descending'\n                                        : undefined\n                                \"\n                                :aria-colindex=\"\n                                    ariaColIndexStart + column.index\n                                \"\n                                @click.stop=\"sort(column, true, $event)\"\n                                @dragstart=\"\n                                    handleColumnDragStart(column, $event)\n                                \"\n                                @dragend=\"handleColumnDragEnd(column, $event)\"\n                                @drop=\"handleColumnDrop(column, $event)\"\n                                @dragover=\"handleColumnDragOver(column, $event)\"\n                                @dragleave=\"\n                                    handleColumnDragLeave(column, $event)\n                                \">\n                                <o-slot-component\n                                    v-if=\"column.$slots?.header\"\n                                    :component=\"column\"\n                                    name=\"header\"\n                                    tag=\"span\"\n                                    :class=\"thLabelClasses\"\n                                    :props=\"{\n                                        column: column.value,\n                                        index: column.index,\n                                    }\" />\n\n                                <template v-else>\n                                    <span :class=\"thLabelClasses\">\n                                        {{ column.label }}\n                                    </span>\n                                    <span\n                                        v-if=\"column.sortable\"\n                                        v-show=\"isColumnSorted(column)\"\n                                        :class=\"thSortIconClasses\"\n                                        :aria-hidden=\"!isColumnSorted(column)\">\n                                        <o-icon\n                                            :icon=\"sortIcon\"\n                                            :pack=\"iconPack\"\n                                            :size=\"sortIconSize\"\n                                            :rotation=\"!isAsc ? 180 : 0\" />\n                                    </span>\n                                </template>\n                            </th>\n                        </template>\n\n                        <!-- checkable column right -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'right'\"\n                            :class=\"[...thBaseClasses, ...thCheckboxClasses]\"\n                            :aria-colindex=\"\n                                ariaColIndexStart + tableColumns.length\n                            \">\n                            <slot\n                                v-if=\"checkableHeader\"\n                                name=\"checkAll\"\n                                :is-all-checked=\"isAllChecked\"\n                                :is-all-uncheckable=\"isAllUncheckable\"\n                                :check-all=\"updateCheckedRows\">\n                                <o-checkbox\n                                    :model-value=\"isAllChecked\"\n                                    autocomplete=\"off\"\n                                    name=\"row_check_all\"\n                                    :variant=\"checkboxVariant\"\n                                    :disabled=\"isAllUncheckable\"\n                                    aria-label=\"Check all\"\n                                    @update:model-value=\"\n                                        updateCheckedRows(!!$event)\n                                    \" />\n                            </slot>\n                        </th>\n                    </tr>\n\n                    <tr v-if=\"hasFilterColumns\" :aria-rowindex=\"2\">\n                        <!-- detailed toggle column -->\n                        <th\n                            v-if=\"showDetailRowIcon\"\n                            :class=\"[...thBaseClasses, ...thDetailedClasses]\"\n                            aria-hidden=\"true\" />\n\n                        <!-- checkable column left -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'left'\"\n                            :class=\"thBaseClasses\" />\n\n                        <!-- row filter columns -->\n                        <template\n                            v-for=\"column in tableColumns\"\n                            :key=\"column.identifier\">\n                            <th\n                                v-if=\"!column.hidden\"\n                                v-bind=\"column.thAttrsData\"\n                                :class=\"[...thBaseClasses, ...column.thClasses]\"\n                                :style=\"isMobileActive ? {} : column.style\">\n                                <template v-if=\"column.filterable\">\n                                    <o-slot-component\n                                        v-if=\"column.$slots?.filter\"\n                                        :component=\"column\"\n                                        name=\"filter\"\n                                        tag=\"span\"\n                                        :props=\"{\n                                            column: column.value,\n                                            index: column.index,\n                                            filters,\n                                        }\" />\n                                    <o-input\n                                        v-else-if=\"column.field\"\n                                        v-model=\"filters[column.field]\"\n                                        :name=\"`column_${column.field}_filter`\"\n                                        :type=\"\n                                            column.numeric ? 'number' : 'search'\n                                        \"\n                                        role=\"searchbox\"\n                                        :placeholder=\"filterPlaceholder\"\n                                        :debounce=\"filterDebounce\"\n                                        :icon=\"filterIcon\"\n                                        :pack=\"iconPack\"\n                                        size=\"small\"\n                                        :aria-label=\"`${column.label} filter`\"\n                                        @input=\"\n                                            (v, e) =>\n                                                $emit('filter', column, v, e)\n                                        \" />\n                                </template>\n                            </th>\n                        </template>\n\n                        <!-- checkable column right -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'right'\"\n                            :class=\"thBaseClasses\" />\n                    </tr>\n\n                    <tr\n                        v-if=\"hasSubheadings\"\n                        :aria-rowindex=\"hasFilterColumns ? 3 : 2\">\n                        <!-- detailed toggle column -->\n                        <th\n                            v-if=\"showDetailRowIcon\"\n                            :class=\"[...thBaseClasses, ...thDetailedClasses]\" />\n\n                        <!-- checkable column left -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'left'\"\n                            :class=\"thBaseClasses\" />\n\n                        <!-- row data columns -->\n                        <template\n                            v-for=\"column in tableColumns\"\n                            :key=\"column.identifier\">\n                            <th\n                                v-if=\"!column.hidden\"\n                                v-bind=\"column.thAttrsData\"\n                                :class=\"[\n                                    ...thBaseClasses,\n                                    ...column.thSubClasses,\n                                ]\"\n                                :style=\"isMobileActive ? {} : column.style\">\n                                <o-slot-component\n                                    :component=\"column\"\n                                    name=\"subheading\"\n                                    tag=\"span\"\n                                    :props=\"{\n                                        column: column.value,\n                                        index: column.index,\n                                    }\">\n                                    <span :class=\"thLabelClasses\">\n                                        {{ column.subheading }}\n                                    </span>\n                                </o-slot-component>\n                            </th>\n                        </template>\n\n                        <!-- checkable column right -->\n                        <th\n                            v-if=\"checkable && checkboxPosition === 'right'\"\n                            :class=\"thBaseClasses\" />\n                    </tr>\n                </thead>\n\n                <tbody>\n                    <!-- table rows -->\n                    <template\n                        v-for=\"(row, rowIndex) in tableRows\"\n                        :key=\"(row.key ?? '0') + (row.hidden ?? false)\">\n                        <tr\n                            v-if=\"!row.hidden\"\n                            :class=\"rowClasses(row)\"\n                            :draggable=\"canDragRow\"\n                            :aria-rowindex=\"ariaRowIndexStart + rowIndex + 1\"\n                            @click=\"selectRow(row, $event)\"\n                            @dblclick=\"\n                                $emit('dblclick', row.value, row.index, $event)\n                            \"\n                            @mouseenter=\"\n                                $emit(\n                                    'mouseenter',\n                                    row.value,\n                                    row.index,\n                                    $event,\n                                )\n                            \"\n                            @mouseleave=\"\n                                $emit(\n                                    'mouseleave',\n                                    row.value,\n                                    row.index,\n                                    $event,\n                                )\n                            \"\n                            @contextmenu=\"\n                                $emit(\n                                    'contextmenu',\n                                    row.value,\n                                    row.index,\n                                    $event,\n                                )\n                            \"\n                            @dragstart=\"handleDragStart(row, $event)\"\n                            @dragend=\"handleDragEnd(row, $event)\"\n                            @drop=\"handleDrop(row, $event)\"\n                            @dragover=\"handleDragOver(row, $event)\"\n                            @dragleave=\"handleDragLeave(row, $event)\">\n                            <!-- detailed toggle column -->\n                            <td\n                                v-if=\"showDetailRowIcon\"\n                                :class=\"[\n                                    ...tdBaseClasses,\n                                    ...tdDetailedClasses,\n                                ]\">\n                                <o-icon\n                                    v-if=\"isDetailedVisible(row.value)\"\n                                    :icon=\"detailIcon\"\n                                    :pack=\"iconPack\"\n                                    :rotation=\"isDetailRowVisible(row) ? 90 : 0\"\n                                    clickable\n                                    :aria-label=\"`Open ${row.label} details`\"\n                                    @click.prevent=\"toggleDetails(row)\" />\n                            </td>\n\n                            <!-- checkable column left -->\n                            <td\n                                v-if=\"checkable && checkboxPosition === 'left'\"\n                                :class=\"[\n                                    ...tdBaseClasses,\n                                    ...tdCheckboxClasses,\n                                ]\">\n                                <o-checkbox\n                                    :model-value=\"isChecked(row)\"\n                                    autocomplete=\"off\"\n                                    :name=\"`row_${row.index}_check`\"\n                                    :variant=\"checkboxVariant\"\n                                    :disabled=\"!isRowCheckable(row.value)\"\n                                    :aria-label=\"`Check ${row.label}`\"\n                                    @update:model-value=\"checkRow(row)\" />\n                            </td>\n\n                            <!-- row data columns -->\n                            <template\n                                v-for=\"column in tableColumns\"\n                                :key=\"column.identifier\">\n                                <o-slot-component\n                                    v-if=\"!column.hidden\"\n                                    v-bind=\"column.tdAttrsData[row.index]\"\n                                    :component=\"column\"\n                                    name=\"default\"\n                                    tag=\"td\"\n                                    :class=\"[\n                                        ...tdBaseClasses,\n                                        ...column.tdClasses,\n                                    ]\"\n                                    :data-label=\"column.label\"\n                                    :style=\"isMobileActive ? {} : column.style\"\n                                    :props=\"{\n                                        row: row.value,\n                                        index: row.index,\n                                        column: column.value,\n                                        colindex: column.index,\n                                        toggleDetails: () => toggleDetails(row),\n                                    }\"\n                                    @click=\"\n                                        $emit(\n                                            'cell-click',\n                                            row.value,\n                                            column.value,\n                                            row.index,\n                                            column.index,\n                                            $event,\n                                        )\n                                    \">\n                                    {{ column.getValue(row.value) }}\n                                </o-slot-component>\n                            </template>\n\n                            <!-- checkable column right -->\n                            <td\n                                v-if=\"checkable && checkboxPosition === 'right'\"\n                                :class=\"[\n                                    ...tdBaseClasses,\n                                    ...tdCheckboxClasses,\n                                ]\">\n                                <o-checkbox\n                                    :model-value=\"isChecked(row)\"\n                                    autocomplete=\"off\"\n                                    :variant=\"checkboxVariant\"\n                                    :disabled=\"!isRowCheckable(row.value)\"\n                                    :aria-label=\"`Check ${row.label}`\"\n                                    @update:model-value=\"checkRow(row)\" />\n                            </td>\n                        </tr>\n\n                        <transition-group\n                            v-if=\"!row.hidden && props.detailed\"\n                            :name=\"detailTransition\">\n                            <template v-if=\"isDetailRowVisible(row)\">\n                                <slot\n                                    v-if=\"customDetailRow\"\n                                    name=\"detail\"\n                                    :row=\"row.value\"\n                                    :index=\"row.index\" />\n                                <tr\n                                    v-else\n                                    :key=\"`${row.key}_detail`\"\n                                    :class=\"trDetailedClasses\">\n                                    <td :colspan=\"columnCount\">\n                                        <slot\n                                            name=\"detail\"\n                                            :row=\"row.value\"\n                                            :index=\"row.index\" />\n                                    </td>\n                                </tr>\n                            </template>\n                        </transition-group>\n                    </template>\n\n                    <tr v-if=\"!availableRows.length\" :class=\"trEmptyClasses\">\n                        <td :colspan=\"columnCount\">\n                            <slot name=\"empty\">\n                                <o-icon\n                                    v-if=\"emptyIcon\"\n                                    :icon=\"emptyIcon\"\n                                    :size=\"emptyIconSize\"\n                                    :pack=\"iconPack\" />\n                                {{ emptyLabel }}\n                            </slot>\n                        </td>\n                    </tr>\n                </tbody>\n\n                <tfoot v-if=\"$slots.footer\">\n                    <tr :class=\"footerClasses\">\n                        <slot\n                            v-if=\"hasCustomFooterSlot()\"\n                            name=\"footer\"\n                            :column-count=\"columnCount\"\n                            :row-count=\"rowCount\" />\n                        <th v-else :colspan=\"columnCount\">\n                            <slot\n                                name=\"footer\"\n                                :column-count=\"columnCount\"\n                                :row-count=\"rowCount\" />\n                        </th>\n                    </tr>\n                </tfoot>\n            </table>\n            <slot name=\"loading\" :loading=\"loading\">\n                <o-loading\n                    v-bind=\"loadingClasses\"\n                    :full-page=\"false\"\n                    :active=\"loading\"\n                    :icon=\"loadingIcon\"\n                    :label=\"loadingLabel\" />\n            </slot>\n        </div>\n\n        <template\n            v-if=\"\n                (checkable && $slots['bottomLeft']) ||\n                (paginated &&\n                    (paginationPosition === 'bottom' ||\n                        paginationPosition === 'both'))\n            \">\n            <slot\n                name=\"pagination\"\n                :current=\"tableCurrentPage\"\n                :per-page=\"perPage\"\n                :total=\"tableTotal\"\n                :change=\"(page) => (tableCurrentPage = page)\">\n                <o-table-pagination\n                    v-model:current=\"tableCurrentPage\"\n                    :paginated=\"paginated\"\n                    :per-page=\"perPage\"\n                    :total=\"tableTotal\"\n                    :rounded=\"paginationRounded\"\n                    :size=\"paginationSize\"\n                    :order=\"paginationOrder\"\n                    :simple=\"paginationSimple\"\n                    :range-before=\"paginationRangeBefore\"\n                    :range-after=\"paginationRangeAfter\"\n                    :icon-pack=\"iconPack\"\n                    :aria-next-label=\"ariaNextLabel\"\n                    :aria-previous-label=\"ariaPreviousLabel\"\n                    :aria-page-label=\"ariaPageLabel\"\n                    :aria-current-label=\"ariaCurrentLabel\"\n                    :root-class=\"paginationWrapperRootClasses\"\n                    @change=\"(page) => $emit('page-change', page)\">\n                    <slot name=\"bottomLeft\" />\n                </o-table-pagination>\n            </slot>\n        </template>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Table from \"./Table.vue\";\nimport TableColumn from \"./TableColumn.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export table specific types */\nexport type * from \"./props\";\nexport type { TableColumn, TableRow } from \"./types\";\n\n/** export table plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Table);\n        registerComponent(app, TableColumn);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export table components */\nexport { Table as OTable, TableColumn as OTableColumn };\n","<script setup lang=\"ts\" generic=\"T, C extends Component\">\nimport {\n    computed,\n    ref,\n    useSlots,\n    useId,\n    useTemplateRef,\n    type Component,\n    type Ref,\n    type VNode,\n} from \"vue\";\n\nimport PlainButton from \"../utils/PlainButton\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { ClassBinding } from \"@/types\";\nimport type { TabsComponent, TabItemComponent } from \"./types\";\nimport type { TabItemProps } from \"./props\";\n\n/**\n * An tab item used by the tabs component.\n * @displayName Tab Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTabItem\",\n    configField: \"tabs\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<TabItemProps<T, C>>(), {\n    override: undefined,\n    // @ts-expect-error string is not assignable of generic type T\n    value: () => useId(),\n    label: undefined,\n    variant: undefined,\n    disabled: false,\n    visible: true,\n    icon: () => getDefault(\"tabs.icon\"),\n    iconPack: () => getDefault(\"tabs.iconPack\"),\n    tag: () => getDefault(\"tabs.itemTag\", PlainButton),\n    content: undefined,\n    component: undefined,\n    props: undefined,\n    events: undefined,\n});\n\nconst emits = defineEmits<{\n    /** on tab item activate event */\n    activate: [];\n    /** on tab item deactivate event */\n    deactivate: [];\n}>();\n\ndefineSlots<{\n    /**\n     * Define the tab item content here\n     * @param active {boolean} - if item is shown\n     */\n    default?(props: { active: boolean }): VNode[];\n    /**\n     * Override tab header label\n     * @param active {boolean} - if item is shown\n     */\n    header?(): VNode[];\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nconst slots = useSlots();\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<TabItemComponent<T>>(() => ({\n    value: props.value,\n    label: props.label,\n    disabled: props.disabled,\n    visible: props.visible,\n    tag: props.tag,\n    icon: props.icon,\n    iconPack: props.iconPack,\n    $slots: slots,\n    tabClasses: tabClasses.value,\n    iconClasses: tabIconClasses.value,\n    labelClasses: tabLabelClasses.value,\n    isTransitioning: isTransitioning.value,\n    activate,\n    deactivate,\n}));\n\n/** inject functionalities and data from the parent component */\nconst { parent, item } = useProviderChild<TabsComponent, TabItemComponent<T>>(\n    rootRef,\n    { data: providedData },\n);\n\nconst isActive = computed(() => item.value.index === parent.value.activeIndex);\n\nconst transitionName = ref<string>();\nconst isTransitioning = ref(false);\n\nconst nextAnimation = computed(() => {\n    const idx =\n        parent.value.vertical && parent.value.animation.length === 4 ? 2 : 0;\n    return parent.value.animation[idx];\n});\n\nconst prevAnimation = computed(() => {\n    const idx =\n        parent.value.vertical && parent.value.animation.length === 4 ? 3 : 1;\n    return parent.value.animation[idx];\n});\n\nconst itemVariant = computed(() => props.variant ?? parent.value.variant);\n\n/** Activate element, alter animation name based on the index. */\nfunction activate(oldIndex: number): void {\n    transitionName.value =\n        item.value.index < oldIndex ? nextAnimation.value : prevAnimation.value;\n    emits(\"activate\");\n}\n\n/** Deactivate element, alter animation name based on the index. */\nfunction deactivate(newIndex: number): void {\n    transitionName.value =\n        newIndex < item.value.index ? nextAnimation.value : prevAnimation.value;\n    emits(\"deactivate\");\n}\n\n/** Transition start hook. */\nfunction onTransitionStart(): void {\n    isTransitioning.value = true;\n}\n\n/** Transition end hook. */\nfunction onTransitionEnd(): void {\n    isTransitioning.value = false;\n}\n\n// #region --- Computed Component Classes ---\n\n// strongly type this variable to prevent circular type dependency\n// because `parent` is used in the definition of any class\n// and the variable is used by the parent\nconst tabClasses: Ref<ClassBinding[]> = defineClasses(\n    [\"tabClass\", \"o-tabs__tab\"],\n    [\n        \"tabVariantClass\",\n        \"o-tabs__tab--\",\n        itemVariant,\n        computed(() => !!itemVariant.value),\n    ],\n    [\"tabActiveClass\", \"o-tabs__tab--active\", null, isActive],\n    [\n        \"tabDisabledClass\",\n        \"o-tabs__tab--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"tabPreviousClass\",\n        \"o-tabs__tab--previous\",\n        null,\n        computed(() => item.value.index < parent.value?.activeIndex),\n    ],\n    [\n        \"tabNextClass\",\n        \"o-tabs__tab--next\",\n        null,\n        computed(() => item.value.index > parent.value?.activeIndex),\n    ],\n);\n\nconst tabIconClasses = defineClasses([\"tabIconClass\", \"o-tabs__tab-icon\"]);\n\nconst tabLabelClasses = defineClasses([\"tabLabelClass\", \"o-tabs__tab-label\"]);\n\nconst panelClasses = defineClasses([\"tabPanelClass\", \"o-tabs__panel\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <Transition\n        v-if=\"parent\"\n        :css=\"parent.animated\"\n        :name=\"transitionName\"\n        :appear=\"parent.animateInitially\"\n        @before-enter=\"onTransitionStart\"\n        @after-enter=\"onTransitionEnd\"\n        @before-leave=\"onTransitionStart\"\n        @after-leave=\"onTransitionEnd\">\n        <div\n            v-show=\"isActive && visible\"\n            v-bind=\"$attrs\"\n            :id=\"`tabpanel-${item.identifier}`\"\n            ref=\"rootElement\"\n            data-oruga=\"tabs-item\"\n            :data-id=\"`tabs-${item.identifier}`\"\n            :class=\"panelClasses\"\n            role=\"tabpanel\"\n            :aria-hidden=\"!isActive\"\n            :aria-labelledby=\"`tab-${item.identifier}`\"\n            aria-roledescription=\"item\">\n            <slot :active=\"isActive && visible\">\n                <!-- injected component -->\n                <component\n                    :is=\"$props.component\"\n                    v-if=\"$props.component\"\n                    v-bind=\"$props.props\"\n                    v-on=\"$props.events || {}\" />\n\n                <!-- default content prop -->\n                <template v-else>{{ content }}</template>\n            </slot>\n\n            <!--\n                Do not render these slots here.\n                These are only for documentation purposes.\n                Slots are defined in tabs component.\n            -->\n            <template v-if=\"false\">\n                <slot name=\"header\" :active=\"isActive && visible\" />\n            </template>\n        </div>\n    </Transition>\n</template>\n","<script setup lang=\"ts\" generic=\"T, C extends Component\">\nimport {\n    computed,\n    ref,\n    useSlots,\n    useId,\n    useTemplateRef,\n    type Component,\n    type Ref,\n    type VNode,\n} from \"vue\";\n\nimport PlainButton from \"../utils/PlainButton\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses, useProviderChild } from \"@/composables\";\n\nimport type { ClassBinding } from \"@/types\";\nimport type { TabsComponent, TabItemComponent } from \"./types\";\nimport type { TabItemProps } from \"./props\";\n\n/**\n * An tab item used by the tabs component.\n * @displayName Tab Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTabItem\",\n    configField: \"tabs\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<TabItemProps<T, C>>(), {\n    override: undefined,\n    // @ts-expect-error string is not assignable of generic type T\n    value: () => useId(),\n    label: undefined,\n    variant: undefined,\n    disabled: false,\n    visible: true,\n    icon: () => getDefault(\"tabs.icon\"),\n    iconPack: () => getDefault(\"tabs.iconPack\"),\n    tag: () => getDefault(\"tabs.itemTag\", PlainButton),\n    content: undefined,\n    component: undefined,\n    props: undefined,\n    events: undefined,\n});\n\nconst emits = defineEmits<{\n    /** on tab item activate event */\n    activate: [];\n    /** on tab item deactivate event */\n    deactivate: [];\n}>();\n\ndefineSlots<{\n    /**\n     * Define the tab item content here\n     * @param active {boolean} - if item is shown\n     */\n    default?(props: { active: boolean }): VNode[];\n    /**\n     * Override tab header label\n     * @param active {boolean} - if item is shown\n     */\n    header?(): VNode[];\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nconst slots = useSlots();\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<TabItemComponent<T>>(() => ({\n    value: props.value,\n    label: props.label,\n    disabled: props.disabled,\n    visible: props.visible,\n    tag: props.tag,\n    icon: props.icon,\n    iconPack: props.iconPack,\n    $slots: slots,\n    tabClasses: tabClasses.value,\n    iconClasses: tabIconClasses.value,\n    labelClasses: tabLabelClasses.value,\n    isTransitioning: isTransitioning.value,\n    activate,\n    deactivate,\n}));\n\n/** inject functionalities and data from the parent component */\nconst { parent, item } = useProviderChild<TabsComponent, TabItemComponent<T>>(\n    rootRef,\n    { data: providedData },\n);\n\nconst isActive = computed(() => item.value.index === parent.value.activeIndex);\n\nconst transitionName = ref<string>();\nconst isTransitioning = ref(false);\n\nconst nextAnimation = computed(() => {\n    const idx =\n        parent.value.vertical && parent.value.animation.length === 4 ? 2 : 0;\n    return parent.value.animation[idx];\n});\n\nconst prevAnimation = computed(() => {\n    const idx =\n        parent.value.vertical && parent.value.animation.length === 4 ? 3 : 1;\n    return parent.value.animation[idx];\n});\n\nconst itemVariant = computed(() => props.variant ?? parent.value.variant);\n\n/** Activate element, alter animation name based on the index. */\nfunction activate(oldIndex: number): void {\n    transitionName.value =\n        item.value.index < oldIndex ? nextAnimation.value : prevAnimation.value;\n    emits(\"activate\");\n}\n\n/** Deactivate element, alter animation name based on the index. */\nfunction deactivate(newIndex: number): void {\n    transitionName.value =\n        newIndex < item.value.index ? nextAnimation.value : prevAnimation.value;\n    emits(\"deactivate\");\n}\n\n/** Transition start hook. */\nfunction onTransitionStart(): void {\n    isTransitioning.value = true;\n}\n\n/** Transition end hook. */\nfunction onTransitionEnd(): void {\n    isTransitioning.value = false;\n}\n\n// #region --- Computed Component Classes ---\n\n// strongly type this variable to prevent circular type dependency\n// because `parent` is used in the definition of any class\n// and the variable is used by the parent\nconst tabClasses: Ref<ClassBinding[]> = defineClasses(\n    [\"tabClass\", \"o-tabs__tab\"],\n    [\n        \"tabVariantClass\",\n        \"o-tabs__tab--\",\n        itemVariant,\n        computed(() => !!itemVariant.value),\n    ],\n    [\"tabActiveClass\", \"o-tabs__tab--active\", null, isActive],\n    [\n        \"tabDisabledClass\",\n        \"o-tabs__tab--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"tabPreviousClass\",\n        \"o-tabs__tab--previous\",\n        null,\n        computed(() => item.value.index < parent.value?.activeIndex),\n    ],\n    [\n        \"tabNextClass\",\n        \"o-tabs__tab--next\",\n        null,\n        computed(() => item.value.index > parent.value?.activeIndex),\n    ],\n);\n\nconst tabIconClasses = defineClasses([\"tabIconClass\", \"o-tabs__tab-icon\"]);\n\nconst tabLabelClasses = defineClasses([\"tabLabelClass\", \"o-tabs__tab-label\"]);\n\nconst panelClasses = defineClasses([\"tabPanelClass\", \"o-tabs__panel\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <Transition\n        v-if=\"parent\"\n        :css=\"parent.animated\"\n        :name=\"transitionName\"\n        :appear=\"parent.animateInitially\"\n        @before-enter=\"onTransitionStart\"\n        @after-enter=\"onTransitionEnd\"\n        @before-leave=\"onTransitionStart\"\n        @after-leave=\"onTransitionEnd\">\n        <div\n            v-show=\"isActive && visible\"\n            v-bind=\"$attrs\"\n            :id=\"`tabpanel-${item.identifier}`\"\n            ref=\"rootElement\"\n            data-oruga=\"tabs-item\"\n            :data-id=\"`tabs-${item.identifier}`\"\n            :class=\"panelClasses\"\n            role=\"tabpanel\"\n            :aria-hidden=\"!isActive\"\n            :aria-labelledby=\"`tab-${item.identifier}`\"\n            aria-roledescription=\"item\">\n            <slot :active=\"isActive && visible\">\n                <!-- injected component -->\n                <component\n                    :is=\"$props.component\"\n                    v-if=\"$props.component\"\n                    v-bind=\"$props.props\"\n                    v-on=\"$props.events || {}\" />\n\n                <!-- default content prop -->\n                <template v-else>{{ content }}</template>\n            </slot>\n\n            <!--\n                Do not render these slots here.\n                These are only for documentation purposes.\n                Slots are defined in tabs component.\n            -->\n            <template v-if=\"false\">\n                <slot name=\"header\" :active=\"isActive && visible\" />\n            </template>\n        </div>\n    </Transition>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport {\n    computed,\n    ref,\n    watch,\n    watchEffect,\n    nextTick,\n    onMounted,\n    useTemplateRef,\n} from \"vue\";\n\nimport OTabItem from \"../tabs/TabItem.vue\";\nimport OIcon from \"../icon/Icon.vue\";\nimport OSlotComponent from \"../utils/SlotComponent\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { mod, isDefined } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useIndexer,\n    useProviderParent,\n} from \"@/composables\";\n\nimport type { TabsComponent, TabItem, TabItemComponent } from \"./types\";\nimport type { TabsProps } from \"./props\";\n\n/**\n * Responsive horizontal navigation tabs, switch between contents with ease.\n * @displayName Tabs\n * @requires ./TabItem.vue\n * @style _tabs.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTabs\",\n    configField: \"tabs\",\n});\n\ntype ModelValue = TabsProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<TabsProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    options: undefined,\n    variant: () => getDefault(\"tabs.variant\"),\n    size: () => getDefault(\"tabs.size\"),\n    vertical: () => getDefault(\"tabs.vertical\", false),\n    position: undefined,\n    type: () => getDefault(\"tabs.type\", \"default\"),\n    tag: () => getDefault(\"tabs.tag\", \"div\"),\n    expanded: false,\n    activateOnFocus: false,\n    animated: () => getDefault(\"tabs.animated\", true),\n    animation: () =>\n        getDefault(\"tabs.animation\", [\n            \"slide-next\",\n            \"slide-prev\",\n            \"slide-down\",\n            \"slide-up\",\n        ]),\n    animateInitially: () => getDefault(\"tabs.animateInitially\", false),\n    multiline: false,\n    ariaLabel: () => getDefault(\"tabs.ariaLabel\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on tab change event\n     * @param value {unknown} - new tab value\n     * @param value {unknown} - old tab value\n     */\n    change: [newValue: ModelValue, oldValue: ModelValue];\n}>();\n\ndefineSlots<{\n    /** Additional slot before the tabs */\n    before?(): void;\n    /** Define the tag items here */\n    default?(): void;\n    /** Additional slot after the tabs */\n    after?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<TabsComponent>(() => ({\n    activeIndex: activeItem.value?.index ?? 0,\n    type: props.type,\n    vertical: props.vertical,\n    variant: props.variant,\n    animated: props.animated,\n    animation: props.animation,\n    animateInitially: props.animateInitially,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems, itemsCount } = useProviderParent<TabItemComponent<T>>({\n    rootRef,\n    data: provideData,\n});\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\n// #region --- Active Item Feature ---\n\n/** The selected item value, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n/** the active item */\nconst activeItem = ref<TabItem<T>>();\n\nonMounted(() => {\n    // set first tab as default if not defined\n    if (!vmodel.value) vmodel.value = childItems.value[0]?.data.value;\n});\n\n/** When v-model is changed set the new active tab. */\nwatch(\n    () => props.modelValue,\n    (value) => {\n        if (vmodel.value !== value) activateItem(value);\n    },\n);\n\n// set the active item immediate and every time the vmodel changes\nwatchEffect(() => {\n    activeItem.value = isDefined(vmodel.value)\n        ? childItems.value.find((item) => item.data.value === vmodel.value) ||\n          childItems.value[0]\n        : childItems.value[0];\n});\n\nconst isTransitioning = computed(() =>\n    childItems.value.some((item) => item.data.isTransitioning),\n);\n\n/** Activate a specific child item by value and deactivate the previous child item. */\nfunction activateItem(newValue: ModelValue): void {\n    const oldValue = activeItem.value?.data.value;\n    const oldItem = activeItem.value;\n    const newItem =\n        childItems.value.find((item) => item.data.value === newValue) ||\n        childItems.value[0];\n\n    if (oldItem && newItem) {\n        oldItem.data.deactivate(newItem.index);\n        newItem.data.activate(oldItem.index);\n    }\n\n    nextTick(() => {\n        vmodel.value = newValue;\n        emits(\"change\", newValue, oldValue);\n    });\n}\n\n// #endregion --- Active Item Feature ---\n\n// #region --- Switch Item Events ---\n\n/** Item click listener, emit input event and change active child. */\nfunction itemClick(item: TabItem<T>): void {\n    if (!item.data || vmodel.value === item.data.value) return;\n    activateItem(item.data.value);\n}\n\n/** Focus the next item or wrap around. */\nfunction onNext(event: KeyboardEvent, index: number): void {\n    if (\n        (props.vertical && event.key == \"ArrowDown\") ||\n        (!props.vertical && event.key == \"ArrowRight\")\n    ) {\n        const newIndex = mod(index + 1, itemsCount.value);\n        const item = getFirstViableItem(newIndex, true);\n        if (isDefined(item)) moveFocus(item);\n    }\n}\n\n/** Focus the previous item or wrap around. */\nfunction onPrev(event: KeyboardEvent, index: number): void {\n    if (\n        (props.vertical && event.key == \"ArrowUp\") ||\n        (!props.vertical && event.key == \"ArrowLeft\")\n    ) {\n        const newIndex = mod(index - 1, itemsCount.value);\n        const item = getFirstViableItem(newIndex, false);\n        if (isDefined(item)) moveFocus(item);\n    }\n}\n\n/** Focus to the first viable item. */\nfunction onHomePressed(): void {\n    if (itemsCount.value < 1) return;\n    const item = getFirstViableItem(0, true);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Focus to the last viable item. */\nfunction onEndPressed(): void {\n    if (itemsCount.value < 1) return;\n    const item = getFirstViableItem(itemsCount.value - 1, false);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Set focus on a tab item or click it if `activateOnFocus`. */\nfunction moveFocus(item: TabItem<T>): void {\n    if (props.activateOnFocus) {\n        itemClick(item);\n    } else {\n        const el = rootRef.value?.querySelector<HTMLElement>(\n            `#tab-${item.identifier}`,\n        );\n        el?.focus();\n    }\n}\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(\n    startingIndex: number,\n    forward: boolean,\n): TabItem<T> {\n    const direction = forward ? 1 : -1;\n    let newIndex = startingIndex;\n    for (\n        ;\n        newIndex !== activeItem.value?.index;\n        newIndex = mod(newIndex + direction, itemsCount.value)\n    ) {\n        const item = childItems.value[newIndex];\n        // Break if the item at this index is viable (not disabled and is visible)\n        if (item.data.visible && !item.data.disabled) break;\n    }\n\n    return childItems.value[newIndex];\n}\n\n// #endregion --- Switch Item Events ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-tabs\"],\n    [\n        \"positionClass\",\n        \"o-tabs--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"sizeClass\",\n        \"o-tabs--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"typeClass\",\n        \"o-tabs--\",\n        computed(() => props.type),\n        computed(() => !!props.type),\n    ],\n    [\"expandedClass\", \"o-tabs--expanded\", null, computed(() => props.expanded)],\n    [\"verticalClass\", \"o-tabs--vertical\", null, computed(() => props.vertical)],\n    [\n        \"multilineClass\",\n        \"o-tabs--multiline\",\n        null,\n        computed(() => props.multiline),\n    ],\n);\n\nconst tablistClasses = defineClasses(\n    [\"listClass\", \"o-tabs__list\"],\n    [\n        \"animatedClass\",\n        \"o-tabs__list--animated\",\n        null,\n        computed(() => props.animated),\n    ],\n);\n\nconst contentClasses = defineClasses(\n    [\"contentClass\", \"o-tabs__content\"],\n    [\n        \"transitioningClass\",\n        \"o-tabs__content--transitioning\",\n        null,\n        isTransitioning,\n    ],\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div ref=\"rootElement\" data-oruga=\"tabs\" :class=\"rootClasses\">\n        <component\n            :is=\"props.tag\"\n            :class=\"tablistClasses\"\n            role=\"tablist\"\n            :aria-label=\"ariaLabel\"\n            :aria-orientation=\"vertical ? 'vertical' : 'horizontal'\">\n            <slot name=\"before\" />\n\n            <o-slot-component\n                v-for=\"item in childItems\"\n                v-show=\"item.data.visible\"\n                :id=\"`tab-${item.identifier}`\"\n                :key=\"item.identifier\"\n                :component=\"item.data\"\n                :tag=\"item.data.tag\"\n                name=\"header\"\n                :class=\"item.data.tabClasses\"\n                role=\"tab\"\n                :tabindex=\"item.data.value === activeItem?.data.value ? 0 : -1\"\n                :aria-current=\"\n                    item.data.value === activeItem?.data.value\n                        ? 'true'\n                        : undefined\n                \"\n                :aria-controls=\"`tabpanel-${item.identifier}`\"\n                :aria-selected=\"item.data.value === activeItem?.data.value\"\n                @click=\"itemClick(item)\"\n                @keydown.enter.prevent=\"itemClick(item)\"\n                @keydown.space.prevent=\"itemClick(item)\"\n                @keydown.left.prevent=\"onPrev($event, item.index)\"\n                @keydown.right.prevent=\"onNext($event, item.index)\"\n                @keydown.up.prevent=\"onPrev($event, item.index)\"\n                @keydown.down.prevent=\"onNext($event, item.index)\"\n                @keydown.home.prevent=\"onHomePressed\"\n                @keydown.end.prevent=\"onEndPressed\">\n                <o-icon\n                    v-if=\"item.data.icon\"\n                    :class=\"item.data.iconClasses\"\n                    :icon=\"item.data.icon\"\n                    :pack=\"item.data.iconPack\"\n                    :size=\"size\" />\n                <span :class=\"item.data.labelClasses\">\n                    {{ item.data.label }}\n                </span>\n            </o-slot-component>\n\n            <slot name=\"after\" />\n        </component>\n\n        <section :class=\"contentClasses\">\n            <slot>\n                <o-tab-item\n                    v-for=\"option in normalizedOptions\"\n                    v-bind=\"option.item\"\n                    :key=\"option.key\" />\n            </slot>\n        </section>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport {\n    computed,\n    ref,\n    watch,\n    watchEffect,\n    nextTick,\n    onMounted,\n    useTemplateRef,\n} from \"vue\";\n\nimport OTabItem from \"../tabs/TabItem.vue\";\nimport OIcon from \"../icon/Icon.vue\";\nimport OSlotComponent from \"../utils/SlotComponent\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { mod, isDefined } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useIndexer,\n    useProviderParent,\n} from \"@/composables\";\n\nimport type { TabsComponent, TabItem, TabItemComponent } from \"./types\";\nimport type { TabsProps } from \"./props\";\n\n/**\n * Responsive horizontal navigation tabs, switch between contents with ease.\n * @displayName Tabs\n * @requires ./TabItem.vue\n * @style _tabs.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTabs\",\n    configField: \"tabs\",\n});\n\ntype ModelValue = TabsProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<TabsProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    options: undefined,\n    variant: () => getDefault(\"tabs.variant\"),\n    size: () => getDefault(\"tabs.size\"),\n    vertical: () => getDefault(\"tabs.vertical\", false),\n    position: undefined,\n    type: () => getDefault(\"tabs.type\", \"default\"),\n    tag: () => getDefault(\"tabs.tag\", \"div\"),\n    expanded: false,\n    activateOnFocus: false,\n    animated: () => getDefault(\"tabs.animated\", true),\n    animation: () =>\n        getDefault(\"tabs.animation\", [\n            \"slide-next\",\n            \"slide-prev\",\n            \"slide-down\",\n            \"slide-up\",\n        ]),\n    animateInitially: () => getDefault(\"tabs.animateInitially\", false),\n    multiline: false,\n    ariaLabel: () => getDefault(\"tabs.ariaLabel\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on tab change event\n     * @param value {unknown} - new tab value\n     * @param value {unknown} - old tab value\n     */\n    change: [newValue: ModelValue, oldValue: ModelValue];\n}>();\n\ndefineSlots<{\n    /** Additional slot before the tabs */\n    before?(): void;\n    /** Define the tag items here */\n    default?(): void;\n    /** Additional slot after the tabs */\n    after?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<TabsComponent>(() => ({\n    activeIndex: activeItem.value?.index ?? 0,\n    type: props.type,\n    vertical: props.vertical,\n    variant: props.variant,\n    animated: props.animated,\n    animation: props.animation,\n    animateInitially: props.animateInitially,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems, itemsCount } = useProviderParent<TabItemComponent<T>>({\n    rootRef,\n    data: provideData,\n});\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\n// #region --- Active Item Feature ---\n\n/** The selected item value, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n/** the active item */\nconst activeItem = ref<TabItem<T>>();\n\nonMounted(() => {\n    // set first tab as default if not defined\n    if (!vmodel.value) vmodel.value = childItems.value[0]?.data.value;\n});\n\n/** When v-model is changed set the new active tab. */\nwatch(\n    () => props.modelValue,\n    (value) => {\n        if (vmodel.value !== value) activateItem(value);\n    },\n);\n\n// set the active item immediate and every time the vmodel changes\nwatchEffect(() => {\n    activeItem.value = isDefined(vmodel.value)\n        ? childItems.value.find((item) => item.data.value === vmodel.value) ||\n          childItems.value[0]\n        : childItems.value[0];\n});\n\nconst isTransitioning = computed(() =>\n    childItems.value.some((item) => item.data.isTransitioning),\n);\n\n/** Activate a specific child item by value and deactivate the previous child item. */\nfunction activateItem(newValue: ModelValue): void {\n    const oldValue = activeItem.value?.data.value;\n    const oldItem = activeItem.value;\n    const newItem =\n        childItems.value.find((item) => item.data.value === newValue) ||\n        childItems.value[0];\n\n    if (oldItem && newItem) {\n        oldItem.data.deactivate(newItem.index);\n        newItem.data.activate(oldItem.index);\n    }\n\n    nextTick(() => {\n        vmodel.value = newValue;\n        emits(\"change\", newValue, oldValue);\n    });\n}\n\n// #endregion --- Active Item Feature ---\n\n// #region --- Switch Item Events ---\n\n/** Item click listener, emit input event and change active child. */\nfunction itemClick(item: TabItem<T>): void {\n    if (!item.data || vmodel.value === item.data.value) return;\n    activateItem(item.data.value);\n}\n\n/** Focus the next item or wrap around. */\nfunction onNext(event: KeyboardEvent, index: number): void {\n    if (\n        (props.vertical && event.key == \"ArrowDown\") ||\n        (!props.vertical && event.key == \"ArrowRight\")\n    ) {\n        const newIndex = mod(index + 1, itemsCount.value);\n        const item = getFirstViableItem(newIndex, true);\n        if (isDefined(item)) moveFocus(item);\n    }\n}\n\n/** Focus the previous item or wrap around. */\nfunction onPrev(event: KeyboardEvent, index: number): void {\n    if (\n        (props.vertical && event.key == \"ArrowUp\") ||\n        (!props.vertical && event.key == \"ArrowLeft\")\n    ) {\n        const newIndex = mod(index - 1, itemsCount.value);\n        const item = getFirstViableItem(newIndex, false);\n        if (isDefined(item)) moveFocus(item);\n    }\n}\n\n/** Focus to the first viable item. */\nfunction onHomePressed(): void {\n    if (itemsCount.value < 1) return;\n    const item = getFirstViableItem(0, true);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Focus to the last viable item. */\nfunction onEndPressed(): void {\n    if (itemsCount.value < 1) return;\n    const item = getFirstViableItem(itemsCount.value - 1, false);\n    if (isDefined(item)) moveFocus(item);\n}\n\n/** Set focus on a tab item or click it if `activateOnFocus`. */\nfunction moveFocus(item: TabItem<T>): void {\n    if (props.activateOnFocus) {\n        itemClick(item);\n    } else {\n        const el = rootRef.value?.querySelector<HTMLElement>(\n            `#tab-${item.identifier}`,\n        );\n        el?.focus();\n    }\n}\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(\n    startingIndex: number,\n    forward: boolean,\n): TabItem<T> {\n    const direction = forward ? 1 : -1;\n    let newIndex = startingIndex;\n    for (\n        ;\n        newIndex !== activeItem.value?.index;\n        newIndex = mod(newIndex + direction, itemsCount.value)\n    ) {\n        const item = childItems.value[newIndex];\n        // Break if the item at this index is viable (not disabled and is visible)\n        if (item.data.visible && !item.data.disabled) break;\n    }\n\n    return childItems.value[newIndex];\n}\n\n// #endregion --- Switch Item Events ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-tabs\"],\n    [\n        \"positionClass\",\n        \"o-tabs--\",\n        computed(() => props.position),\n        computed(() => !!props.position),\n    ],\n    [\n        \"sizeClass\",\n        \"o-tabs--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"typeClass\",\n        \"o-tabs--\",\n        computed(() => props.type),\n        computed(() => !!props.type),\n    ],\n    [\"expandedClass\", \"o-tabs--expanded\", null, computed(() => props.expanded)],\n    [\"verticalClass\", \"o-tabs--vertical\", null, computed(() => props.vertical)],\n    [\n        \"multilineClass\",\n        \"o-tabs--multiline\",\n        null,\n        computed(() => props.multiline),\n    ],\n);\n\nconst tablistClasses = defineClasses(\n    [\"listClass\", \"o-tabs__list\"],\n    [\n        \"animatedClass\",\n        \"o-tabs__list--animated\",\n        null,\n        computed(() => props.animated),\n    ],\n);\n\nconst contentClasses = defineClasses(\n    [\"contentClass\", \"o-tabs__content\"],\n    [\n        \"transitioningClass\",\n        \"o-tabs__content--transitioning\",\n        null,\n        isTransitioning,\n    ],\n);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div ref=\"rootElement\" data-oruga=\"tabs\" :class=\"rootClasses\">\n        <component\n            :is=\"props.tag\"\n            :class=\"tablistClasses\"\n            role=\"tablist\"\n            :aria-label=\"ariaLabel\"\n            :aria-orientation=\"vertical ? 'vertical' : 'horizontal'\">\n            <slot name=\"before\" />\n\n            <o-slot-component\n                v-for=\"item in childItems\"\n                v-show=\"item.data.visible\"\n                :id=\"`tab-${item.identifier}`\"\n                :key=\"item.identifier\"\n                :component=\"item.data\"\n                :tag=\"item.data.tag\"\n                name=\"header\"\n                :class=\"item.data.tabClasses\"\n                role=\"tab\"\n                :tabindex=\"item.data.value === activeItem?.data.value ? 0 : -1\"\n                :aria-current=\"\n                    item.data.value === activeItem?.data.value\n                        ? 'true'\n                        : undefined\n                \"\n                :aria-controls=\"`tabpanel-${item.identifier}`\"\n                :aria-selected=\"item.data.value === activeItem?.data.value\"\n                @click=\"itemClick(item)\"\n                @keydown.enter.prevent=\"itemClick(item)\"\n                @keydown.space.prevent=\"itemClick(item)\"\n                @keydown.left.prevent=\"onPrev($event, item.index)\"\n                @keydown.right.prevent=\"onNext($event, item.index)\"\n                @keydown.up.prevent=\"onPrev($event, item.index)\"\n                @keydown.down.prevent=\"onNext($event, item.index)\"\n                @keydown.home.prevent=\"onHomePressed\"\n                @keydown.end.prevent=\"onEndPressed\">\n                <o-icon\n                    v-if=\"item.data.icon\"\n                    :class=\"item.data.iconClasses\"\n                    :icon=\"item.data.icon\"\n                    :pack=\"item.data.iconPack\"\n                    :size=\"size\" />\n                <span :class=\"item.data.labelClasses\">\n                    {{ item.data.label }}\n                </span>\n            </o-slot-component>\n\n            <slot name=\"after\" />\n        </component>\n\n        <section :class=\"contentClasses\">\n            <slot>\n                <o-tab-item\n                    v-for=\"option in normalizedOptions\"\n                    v-bind=\"option.item\"\n                    :key=\"option.key\" />\n            </slot>\n        </section>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Tabs from \"./Tabs.vue\";\nimport TabItem from \"./TabItem.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export tabs specific types */\nexport type * from \"./types\";\n\n/** export tabs plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Tabs);\n        registerComponent(app, TabItem);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export tabs components */\nexport { Tabs as OTabs, TabItem as OTabItem };\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport CloseButton from \"../utils/CloseButton.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { TagProps } from \"./props\";\n\n/**\n * Small tag labels to insert anywhere.\n * @displayName Tag\n * @style _tag.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTag\",\n    configField: \"tag\",\n});\n\nconst props = withDefaults(defineProps<TagProps>(), {\n    override: undefined,\n    label: undefined,\n    variant: () => getDefault(\"tag.variant\"),\n    size: () => getDefault(\"tag.size\"),\n    rounded: () => getDefault(\"tag.rounded\", false),\n    closeable: false,\n    icon: undefined,\n    iconPack: () => getDefault(\"tag.iconPack\"),\n    closeIcon: () => getDefault(\"tag.closeIcon\", \"close\"),\n    closeIconSize: () => getDefault(\"tag.closeIconSize\"),\n    ariaCloseLabel: () => getDefault(\"tag.ariaCloseLabel\", \"Close\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * on close icon click event\n     * @param event {Event} - native event\n     */\n    close: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the tag label */\n    default?(): void;\n    /** Define a custom close icon */\n    close?(): void;\n}>();\n/*\n * Emit close event when delete button is clicked\n * or delete key is pressed.\n */\nfunction onClose(event: Event): void {\n    emits(\"close\", event);\n}\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-tag\"],\n    [\n        \"variantClass\",\n        \"o-tag--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"sizeClass\",\n        \"o-tag--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\"roundedClass\", \"o-tag--rounded\", null, computed(() => !!props.rounded)],\n    [\"badgeClass\", \"o-tag--badge\", null, computed(() => !!props.badge)],\n);\n\nconst iconClasses = defineClasses([\"iconClass\", \"o-tag__icon\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-tag__label\"]);\n\nconst closeClasses = defineClasses([\"closeClass\", \"o-tag__close\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <span data-oruga=\"tag\" :class=\"rootClasses\">\n        <o-icon\n            v-if=\"icon\"\n            :class=\"iconClasses\"\n            :pack=\"iconPack\"\n            :icon=\"icon\"\n            :size=\"size\" />\n\n        <span v-if=\"$slots.default || label\" :class=\"labelClasses\">\n            <slot>{{ label }}</slot>\n        </span>\n\n        <CloseButton\n            v-if=\"closeable\"\n            :pack=\"iconPack\"\n            :icon=\"closeIcon\"\n            :size=\"closeIconSize\"\n            :label=\"ariaCloseLabel\"\n            :classes=\"closeClasses\"\n            @click=\"onClose\">\n            <slot v-if=\"$slots['close']\" name=\"close\" />\n        </CloseButton>\n    </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\nimport CloseButton from \"../utils/CloseButton.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { defineClasses } from \"@/composables\";\n\nimport type { TagProps } from \"./props\";\n\n/**\n * Small tag labels to insert anywhere.\n * @displayName Tag\n * @style _tag.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTag\",\n    configField: \"tag\",\n});\n\nconst props = withDefaults(defineProps<TagProps>(), {\n    override: undefined,\n    label: undefined,\n    variant: () => getDefault(\"tag.variant\"),\n    size: () => getDefault(\"tag.size\"),\n    rounded: () => getDefault(\"tag.rounded\", false),\n    closeable: false,\n    icon: undefined,\n    iconPack: () => getDefault(\"tag.iconPack\"),\n    closeIcon: () => getDefault(\"tag.closeIcon\", \"close\"),\n    closeIconSize: () => getDefault(\"tag.closeIconSize\"),\n    ariaCloseLabel: () => getDefault(\"tag.ariaCloseLabel\", \"Close\"),\n});\n\nconst emits = defineEmits<{\n    /**\n     * on close icon click event\n     * @param event {Event} - native event\n     */\n    close: [event: Event];\n}>();\n\ndefineSlots<{\n    /** Override the tag label */\n    default?(): void;\n    /** Define a custom close icon */\n    close?(): void;\n}>();\n/*\n * Emit close event when delete button is clicked\n * or delete key is pressed.\n */\nfunction onClose(event: Event): void {\n    emits(\"close\", event);\n}\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-tag\"],\n    [\n        \"variantClass\",\n        \"o-tag--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"sizeClass\",\n        \"o-tag--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\"roundedClass\", \"o-tag--rounded\", null, computed(() => !!props.rounded)],\n    [\"badgeClass\", \"o-tag--badge\", null, computed(() => !!props.badge)],\n);\n\nconst iconClasses = defineClasses([\"iconClass\", \"o-tag__icon\"]);\n\nconst labelClasses = defineClasses([\"labelClass\", \"o-tag__label\"]);\n\nconst closeClasses = defineClasses([\"closeClass\", \"o-tag__close\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <span data-oruga=\"tag\" :class=\"rootClasses\">\n        <o-icon\n            v-if=\"icon\"\n            :class=\"iconClasses\"\n            :pack=\"iconPack\"\n            :icon=\"icon\"\n            :size=\"size\" />\n\n        <span v-if=\"$slots.default || label\" :class=\"labelClasses\">\n            <slot>{{ label }}</slot>\n        </span>\n\n        <CloseButton\n            v-if=\"closeable\"\n            :pack=\"iconPack\"\n            :icon=\"closeIcon\"\n            :size=\"closeIconSize\"\n            :label=\"ariaCloseLabel\"\n            :classes=\"closeClasses\"\n            @click=\"onClose\">\n            <slot v-if=\"$slots['close']\" name=\"close\" />\n        </CloseButton>\n    </span>\n</template>\n","import type { App } from \"vue\";\n\nimport Tag from \"./Tag.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export tag specific types */\nexport type * from \"./props\";\n\n/** export tag plugin */\nexport default {\n    install(Vue: App): void {\n        registerComponent(Vue, Tag);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export tag components */\nexport { Tag as OTag };\n","<script setup lang=\"ts\" generic=\"T = string\">\nimport { computed, useAttrs, useTemplateRef, watchEffect, ref } from \"vue\";\n\nimport OAutocomplete from \"../autocomplete/Autocomplete.vue\";\nimport OTag from \"../tag/Tag.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isEqual } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    getActiveClasses,\n    useInputHandler,\n    useIndexer,\n    type OptionItem,\n} from \"@/composables\";\n\nimport type { TaginputProps } from \"./props\";\nimport type { Numberish } from \"@/types\";\nimport type { DropdownItemProps } from \"../dropdown/props\";\nimport type { ComponentExposed } from \"vue-component-type-helpers\";\n\n/**\n * A simple tag input field that can have autocomplete functionality.\n * @displayName Taginput\n * @style _taginput.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTaginput\",\n    configField: \"taginput\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = TaginputProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<TaginputProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    input: \"\",\n    options: undefined,\n    filter: undefined,\n    size: () => getDefault(\"taginput.size\"),\n    variant: () => getDefault(\"taginput.variant\"),\n    maxitems: undefined,\n    maxlength: undefined,\n    counter: () => getDefault(\"taginput.counter\", true),\n    openOnFocus: () => getDefault(\"taginput.openOnFocus\", true),\n    keepOpen: () => getDefault(\"taginput.keepOpen\", false),\n    placeholder: undefined,\n    expanded: false,\n    disabled: false,\n    keepFirst: () => getDefault(\"taginput.keepFirst\", false),\n    allowNew: () => getDefault(\"taginput.allowNew\", false),\n    allowDuplicates: () => getDefault(\"taginput.allowDuplicates\", false),\n    validateItem: () => true,\n    createItem: (item: T | string) => item as T,\n    closeable: () => getDefault(\"taginput.closeable\", true),\n    iconPack: () => getDefault(\"taginput.iconPack\"),\n    icon: () => getDefault(\"taginput.icon\"),\n    closeIcon: () => getDefault(\"taginput.closeIcon\", \"close\"),\n    ariaCloseLabel: () => getDefault(\"taginput.ariaCloseLabel\", \"Remove\"),\n    autocomplete: () => getDefault(\"taginput.autocomplete\", \"off\"),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: undefined,\n    teleport: () => getDefault(\"taginput.teleport\", false),\n    autocompleteClasses: () => getDefault(\"taginput.autocompleteClasses\", {}),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue[]];\n    /**\n     * input prop two-way binding\n     * @param value {string} - updated input prop\n     */\n    \"update:input\": [value: string];\n    /**\n     * on input change event\n     * @param value {string} - input value\n     * @param event {Event} - native event\n     */\n    input: [value: string, event: Event];\n    /**\n     * new item got added\n     * @param value {unknown} - added item\n     */\n    add: [value: T];\n    /**\n     * item got removed\n     * @param value {unknown} - removed item\n     */\n    remove: [value: T];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n    /** the list inside the dropdown reached the start */\n    \"scroll-start\": [];\n    /** the list inside the dropdown reached it's end */\n    \"scroll-end\": [];\n}>();\n\ndefineSlots<{\n    /**\n     * Define the taginput items here\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    default?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define an additional header\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    header?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define an additional footer\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    footer?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define the content to show if the list is empty\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    empty?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Override the selected items\n     * @param items {(string, object)[]} - selected items\n     * @param options {object[]} - selected options\n     * @param removeItem {(index, event): void} - remove item function\n     */\n    selected?(props: {\n        items: T[] | undefined;\n        options: SelectedTag[];\n        removeItem: (index: number, event: Event) => void;\n    }): void;\n    /**\n     * Define a selected option here\n     * @param option {object} - option object\n     */\n    option?(props: { option: OptionItem<DropdownItemProps<T>> }): void;\n    /**\n     * Override the counter\n     * @param items {number} - items count\n     * @param total {number} - total count\n     */\n    counter?(props: { items: number; total: Numberish }): void;\n}>();\n\n// define as Component to prevent docs memmory overload\nconst autocompleteRef = useTemplateRef<\n    ComponentExposed<typeof OAutocomplete<T>>\n>(\"autocompleteComponent\");\n\n// use form input functionalities\nconst { checkHtml5Validity, setFocus, onFocus, onBlur, onInvalid } =\n    useInputHandler(autocompleteRef, emits, props);\n\nconst isDropdownActive = ref(false);\n\n// the selected items, use v-model to make it two-way binding\nconst selectedItems = defineModel<ModelValue>({ default: undefined });\n\n// the value of the inner input, use v-model:input to make it two-way binding\nconst inputValue = defineModel<string>(\"input\", { default: \"\" });\n\nconst inputLength = computed(() => inputValue.value.trim().length);\nconst itemsLength = computed(() => selectedItems.value?.length || 0);\n\nconst childItems = computed(() => autocompleteRef.value?.items ?? []);\n\n// create a unique id sequence\nconst indexer = useIndexer();\n\ntype SelectedTag = {\n    label: string;\n    value: T;\n    key: string;\n};\n\n/** map the selected items into option items */\nconst selectedOptions = computed<SelectedTag[]>(() => {\n    if (!selectedItems.value) return [];\n    return selectedItems.value.map((value) => {\n        const option = childItems.value.find((item) =>\n            isEqual(value, item.data.value),\n        );\n        // return the found option or create a new option object\n        if (option)\n            return {\n                label: option.data.label,\n                value: option.data.value,\n                key: option.identifier,\n            };\n        else return { label: String(value), value, key: indexer.nextIndex() };\n    });\n});\n\n/** show the input field if a maxitems hasn't been set or reached */\nconst hasInput = computed(\n    () => props.maxitems == null || itemsLength.value < Number(props.maxitems),\n);\n\nwatchEffect(() => {\n    // blur if input is empty\n    if (!hasInput.value) onBlur();\n});\n\nfunction addItem(item?: T | string): void {\n    item = item || inputValue.value.trim();\n\n    if (item) {\n        const itemToAdd = props.createItem(item);\n\n        if (!selectedItems.value?.length) {\n            // Add the item input if not items are set yet\n            if (props.validateItem(item)) {\n                selectedItems.value = [itemToAdd];\n                emits(\"add\", itemToAdd);\n            }\n        } else {\n            // Add the item input if it is not blank\n            // or previously added (if not allowDuplicates).\n            const add = !props.allowDuplicates\n                ? !selectedItems.value.includes(itemToAdd)\n                : true;\n\n            if (add && props.validateItem(item)) {\n                selectedItems.value = [...selectedItems.value, itemToAdd];\n                emits(\"add\", itemToAdd);\n            }\n        }\n    }\n\n    // after autocomplete events\n    requestAnimationFrame(() => {\n        inputValue.value = \"\";\n        emits(\"input\", \"\", new InputEvent(\"input\"));\n    });\n}\n\nfunction removeItem(index: number, event?: Event): void {\n    if (!selectedItems.value?.length) return;\n    const item = selectedItems.value[index];\n    if (!item) return;\n    // create a new array without the removed item at index for reactivity\n    const items = selectedItems.value.slice();\n    items.splice(index, 1);\n    selectedItems.value = items;\n    emits(\"remove\", item);\n    if (event) event.stopPropagation();\n    if (props.openOnFocus && autocompleteRef.value) setFocus();\n}\n\n// #region --- Event Handler ---\n\nfunction onSelect(option: T | undefined): void {\n    if (!option) return;\n    addItem(option);\n}\n\nfunction onInput(value: string, event: Event): void {\n    emits(\"input\", value?.trim(), event);\n}\n\nfunction onBackspace(): void {\n    if (!inputValue.value?.length && itemsLength.value > 0)\n        // remove last item\n        removeItem(itemsLength.value - 1);\n}\n\nfunction onEnter(event: Event): void {\n    if (props.allowNew) {\n        event.stopPropagation();\n        addItem();\n    }\n}\n// #endregion --- Event Handler ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-taginput\"],\n    [\n        \"sizeClass\",\n        \"o-taginput--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-taginput--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"expandedClass\",\n        \"o-taginput--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    [\n        \"disabledClass\",\n        \"o-taginput--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n);\n\nconst containerClasses = defineClasses([\n    \"containerClass\",\n    \"o-taginput__container\",\n]);\n\nconst itemClasses = defineClasses([\"itemClass\", \"o-taginput__item\"]);\n\nconst counterClasses = defineClasses([\"counterClass\", \"o-taginput__counter\"]);\n\nconst autocompleteRootClasses = defineClasses([\n    \"autocompleteClasses.rootClass\",\n    \"o-taginput__autocomplete\",\n]);\n\nconst autocompleteInputClasses = defineClasses([\n    \"autocompleteClasses.inputClasses.inputClass\",\n    \"o-taginput__input\",\n]);\n\nconst attrs = useAttrs();\n\nconst autocompleteBind = computed(() => ({\n    ...attrs,\n    \"root-class\": getActiveClasses(autocompleteRootClasses),\n    \"input-classes\": {\n        \"input-class\": getActiveClasses(autocompleteInputClasses),\n    },\n    ...props.autocompleteClasses,\n}));\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: selectedItems });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <div data-oruga=\"taginput\" :class=\"rootClasses\">\n        <div :class=\"containerClasses\" @focus=\"onFocus\" @blur=\"onBlur\">\n            <slot\n                name=\"selected\"\n                :items=\"selectedItems\"\n                :options=\"selectedOptions\"\n                :remove-item=\"removeItem\">\n                <o-tag\n                    v-for=\"(option, index) in selectedOptions\"\n                    :key=\"option.key\"\n                    :label=\"option.label\"\n                    :variant=\"variant\"\n                    :size=\"size\"\n                    :class=\"itemClasses\"\n                    :closeable=\"closeable && !disabled\"\n                    :close-icon=\"closeIcon\"\n                    :close-icon-pack=\"iconPack\"\n                    :aria-close-label=\"ariaCloseLabel\"\n                    @close=\"removeItem(index, $event)\" />\n            </slot>\n\n            <o-autocomplete\n                v-show=\"hasInput\"\n                ref=\"autocompleteComponent\"\n                v-model:active=\"isDropdownActive\"\n                v-model:input=\"inputValue\"\n                v-bind=\"autocompleteBind\"\n                :options=\"options\"\n                :filter=\"filter\"\n                :placeholder=\"placeholder\"\n                :icon=\"icon\"\n                :icon-pack=\"iconPack\"\n                :maxlength=\"maxlength\"\n                :size=\"size\"\n                :disabled=\"disabled\"\n                :autocomplete=\"autocomplete\"\n                :open-on-focus=\"openOnFocus\"\n                :keep-first=\"keepFirst\"\n                :keep-open=\"keepOpen\"\n                :teleport=\"teleport\"\n                :has-counter=\"false\"\n                :use-html5-validation=\"false\"\n                expanded\n                @input=\"onInput\"\n                @focus=\"onFocus\"\n                @blur=\"onBlur\"\n                @invalid=\"onInvalid\"\n                @keydown.enter=\"onEnter\"\n                @keydown.tab=\"onEnter\"\n                @keydown.backspace=\"onBackspace\"\n                @select=\"onSelect\"\n                @scroll-start=\"$emit('scroll-start')\"\n                @scroll-end=\"$emit('scroll-end')\"\n                @icon-click=\"$emit('icon-click', $event)\"\n                @icon-right-click=\"$emit('icon-right-click', $event)\">\n                <template v-if=\"$slots.header\" #header=\"{ toggle }\">\n                    <slot name=\"header\" :toggle />\n                </template>\n\n                <template v-if=\"$slots.default\" #default=\"{ toggle }\">\n                    <slot :toggle />\n                </template>\n\n                <template v-if=\"$slots.option\" #option=\"{ option }\">\n                    <slot name=\"option\" :option=\"option\" />\n                </template>\n\n                <template v-if=\"$slots.empty\" #empty=\"{ toggle }\">\n                    <slot name=\"empty\" :toggle />\n                </template>\n\n                <template v-if=\"$slots.footer\" #footer=\"{ toggle }\">\n                    <slot name=\"footer\" :toggle />\n                </template>\n            </o-autocomplete>\n        </div>\n\n        <small\n            v-if=\"counter && (maxitems || maxlength)\"\n            :class=\"counterClasses\">\n            <template v-if=\"maxlength && inputLength > 0\">\n                <slot name=\"counter\" :items=\"inputLength\" :total=\"maxlength\">\n                    {{ inputLength }} / {{ maxlength }}\n                </slot>\n            </template>\n\n            <template v-else-if=\"maxitems\">\n                <slot name=\"counter\" :items=\"itemsLength\" :total=\"maxitems\">\n                    {{ itemsLength }} / {{ maxitems }}\n                </slot>\n            </template>\n        </small>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T = string\">\nimport { computed, useAttrs, useTemplateRef, watchEffect, ref } from \"vue\";\n\nimport OAutocomplete from \"../autocomplete/Autocomplete.vue\";\nimport OTag from \"../tag/Tag.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { isEqual } from \"@/utils/helpers\";\nimport {\n    defineClasses,\n    getActiveClasses,\n    useInputHandler,\n    useIndexer,\n    type OptionItem,\n} from \"@/composables\";\n\nimport type { TaginputProps } from \"./props\";\nimport type { Numberish } from \"@/types\";\nimport type { DropdownItemProps } from \"../dropdown/props\";\nimport type { ComponentExposed } from \"vue-component-type-helpers\";\n\n/**\n * A simple tag input field that can have autocomplete functionality.\n * @displayName Taginput\n * @style _taginput.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTaginput\",\n    configField: \"taginput\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = TaginputProps<T>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<TaginputProps<T>>(), {\n    override: undefined,\n    modelValue: undefined,\n    input: \"\",\n    options: undefined,\n    filter: undefined,\n    size: () => getDefault(\"taginput.size\"),\n    variant: () => getDefault(\"taginput.variant\"),\n    maxitems: undefined,\n    maxlength: undefined,\n    counter: () => getDefault(\"taginput.counter\", true),\n    openOnFocus: () => getDefault(\"taginput.openOnFocus\", true),\n    keepOpen: () => getDefault(\"taginput.keepOpen\", false),\n    placeholder: undefined,\n    expanded: false,\n    disabled: false,\n    keepFirst: () => getDefault(\"taginput.keepFirst\", false),\n    allowNew: () => getDefault(\"taginput.allowNew\", false),\n    allowDuplicates: () => getDefault(\"taginput.allowDuplicates\", false),\n    validateItem: () => true,\n    createItem: (item: T | string) => item as T,\n    closeable: () => getDefault(\"taginput.closeable\", true),\n    iconPack: () => getDefault(\"taginput.iconPack\"),\n    icon: () => getDefault(\"taginput.icon\"),\n    closeIcon: () => getDefault(\"taginput.closeIcon\", \"close\"),\n    ariaCloseLabel: () => getDefault(\"taginput.ariaCloseLabel\", \"Remove\"),\n    autocomplete: () => getDefault(\"taginput.autocomplete\", \"off\"),\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: undefined,\n    teleport: () => getDefault(\"taginput.teleport\", false),\n    autocompleteClasses: () => getDefault(\"taginput.autocompleteClasses\", {}),\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue[]];\n    /**\n     * input prop two-way binding\n     * @param value {string} - updated input prop\n     */\n    \"update:input\": [value: string];\n    /**\n     * on input change event\n     * @param value {string} - input value\n     * @param event {Event} - native event\n     */\n    input: [value: string, event: Event];\n    /**\n     * new item got added\n     * @param value {unknown} - added item\n     */\n    add: [value: T];\n    /**\n     * item got removed\n     * @param value {unknown} - removed item\n     */\n    remove: [value: T];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n    /**\n     * on icon click event\n     * @param event {Event} - native event\n     */\n    \"icon-click\": [event: Event];\n    /**\n     * on icon right click event\n     * @param event {Event} - native event\n     */\n    \"icon-right-click\": [event: Event];\n    /** the list inside the dropdown reached the start */\n    \"scroll-start\": [];\n    /** the list inside the dropdown reached it's end */\n    \"scroll-end\": [];\n}>();\n\ndefineSlots<{\n    /**\n     * Define the taginput items here\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    default?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define an additional header\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    header?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define an additional footer\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    footer?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Define the content to show if the list is empty\n     * @param toggle {(): void} - toggle dropdown active state\n     */\n    empty?(props: { toggle: (event: Event) => void }): void;\n    /**\n     * Override the selected items\n     * @param items {(string, object)[]} - selected items\n     * @param options {object[]} - selected options\n     * @param removeItem {(index, event): void} - remove item function\n     */\n    selected?(props: {\n        items: T[] | undefined;\n        options: SelectedTag[];\n        removeItem: (index: number, event: Event) => void;\n    }): void;\n    /**\n     * Define a selected option here\n     * @param option {object} - option object\n     */\n    option?(props: { option: OptionItem<DropdownItemProps<T>> }): void;\n    /**\n     * Override the counter\n     * @param items {number} - items count\n     * @param total {number} - total count\n     */\n    counter?(props: { items: number; total: Numberish }): void;\n}>();\n\n// define as Component to prevent docs memmory overload\nconst autocompleteRef = useTemplateRef<\n    ComponentExposed<typeof OAutocomplete<T>>\n>(\"autocompleteComponent\");\n\n// use form input functionalities\nconst { checkHtml5Validity, setFocus, onFocus, onBlur, onInvalid } =\n    useInputHandler(autocompleteRef, emits, props);\n\nconst isDropdownActive = ref(false);\n\n// the selected items, use v-model to make it two-way binding\nconst selectedItems = defineModel<ModelValue>({ default: undefined });\n\n// the value of the inner input, use v-model:input to make it two-way binding\nconst inputValue = defineModel<string>(\"input\", { default: \"\" });\n\nconst inputLength = computed(() => inputValue.value.trim().length);\nconst itemsLength = computed(() => selectedItems.value?.length || 0);\n\nconst childItems = computed(() => autocompleteRef.value?.items ?? []);\n\n// create a unique id sequence\nconst indexer = useIndexer();\n\ntype SelectedTag = {\n    label: string;\n    value: T;\n    key: string;\n};\n\n/** map the selected items into option items */\nconst selectedOptions = computed<SelectedTag[]>(() => {\n    if (!selectedItems.value) return [];\n    return selectedItems.value.map((value) => {\n        const option = childItems.value.find((item) =>\n            isEqual(value, item.data.value),\n        );\n        // return the found option or create a new option object\n        if (option)\n            return {\n                label: option.data.label,\n                value: option.data.value,\n                key: option.identifier,\n            };\n        else return { label: String(value), value, key: indexer.nextIndex() };\n    });\n});\n\n/** show the input field if a maxitems hasn't been set or reached */\nconst hasInput = computed(\n    () => props.maxitems == null || itemsLength.value < Number(props.maxitems),\n);\n\nwatchEffect(() => {\n    // blur if input is empty\n    if (!hasInput.value) onBlur();\n});\n\nfunction addItem(item?: T | string): void {\n    item = item || inputValue.value.trim();\n\n    if (item) {\n        const itemToAdd = props.createItem(item);\n\n        if (!selectedItems.value?.length) {\n            // Add the item input if not items are set yet\n            if (props.validateItem(item)) {\n                selectedItems.value = [itemToAdd];\n                emits(\"add\", itemToAdd);\n            }\n        } else {\n            // Add the item input if it is not blank\n            // or previously added (if not allowDuplicates).\n            const add = !props.allowDuplicates\n                ? !selectedItems.value.includes(itemToAdd)\n                : true;\n\n            if (add && props.validateItem(item)) {\n                selectedItems.value = [...selectedItems.value, itemToAdd];\n                emits(\"add\", itemToAdd);\n            }\n        }\n    }\n\n    // after autocomplete events\n    requestAnimationFrame(() => {\n        inputValue.value = \"\";\n        emits(\"input\", \"\", new InputEvent(\"input\"));\n    });\n}\n\nfunction removeItem(index: number, event?: Event): void {\n    if (!selectedItems.value?.length) return;\n    const item = selectedItems.value[index];\n    if (!item) return;\n    // create a new array without the removed item at index for reactivity\n    const items = selectedItems.value.slice();\n    items.splice(index, 1);\n    selectedItems.value = items;\n    emits(\"remove\", item);\n    if (event) event.stopPropagation();\n    if (props.openOnFocus && autocompleteRef.value) setFocus();\n}\n\n// #region --- Event Handler ---\n\nfunction onSelect(option: T | undefined): void {\n    if (!option) return;\n    addItem(option);\n}\n\nfunction onInput(value: string, event: Event): void {\n    emits(\"input\", value?.trim(), event);\n}\n\nfunction onBackspace(): void {\n    if (!inputValue.value?.length && itemsLength.value > 0)\n        // remove last item\n        removeItem(itemsLength.value - 1);\n}\n\nfunction onEnter(event: Event): void {\n    if (props.allowNew) {\n        event.stopPropagation();\n        addItem();\n    }\n}\n// #endregion --- Event Handler ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-taginput\"],\n    [\n        \"sizeClass\",\n        \"o-taginput--\",\n        computed(() => props.size),\n        computed(() => !!props.size),\n    ],\n    [\n        \"variantClass\",\n        \"o-taginput--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n    [\n        \"expandedClass\",\n        \"o-taginput--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    [\n        \"disabledClass\",\n        \"o-taginput--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n);\n\nconst containerClasses = defineClasses([\n    \"containerClass\",\n    \"o-taginput__container\",\n]);\n\nconst itemClasses = defineClasses([\"itemClass\", \"o-taginput__item\"]);\n\nconst counterClasses = defineClasses([\"counterClass\", \"o-taginput__counter\"]);\n\nconst autocompleteRootClasses = defineClasses([\n    \"autocompleteClasses.rootClass\",\n    \"o-taginput__autocomplete\",\n]);\n\nconst autocompleteInputClasses = defineClasses([\n    \"autocompleteClasses.inputClasses.inputClass\",\n    \"o-taginput__input\",\n]);\n\nconst attrs = useAttrs();\n\nconst autocompleteBind = computed(() => ({\n    ...attrs,\n    \"root-class\": getActiveClasses(autocompleteRootClasses),\n    \"input-classes\": {\n        \"input-class\": getActiveClasses(autocompleteInputClasses),\n    },\n    ...props.autocompleteClasses,\n}));\n\n// #endregion --- Computed Component Classes ---\n\n// #region --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: selectedItems });\n\n// #endregion --- Expose Public Functionalities ---\n</script>\n\n<template>\n    <div data-oruga=\"taginput\" :class=\"rootClasses\">\n        <div :class=\"containerClasses\" @focus=\"onFocus\" @blur=\"onBlur\">\n            <slot\n                name=\"selected\"\n                :items=\"selectedItems\"\n                :options=\"selectedOptions\"\n                :remove-item=\"removeItem\">\n                <o-tag\n                    v-for=\"(option, index) in selectedOptions\"\n                    :key=\"option.key\"\n                    :label=\"option.label\"\n                    :variant=\"variant\"\n                    :size=\"size\"\n                    :class=\"itemClasses\"\n                    :closeable=\"closeable && !disabled\"\n                    :close-icon=\"closeIcon\"\n                    :close-icon-pack=\"iconPack\"\n                    :aria-close-label=\"ariaCloseLabel\"\n                    @close=\"removeItem(index, $event)\" />\n            </slot>\n\n            <o-autocomplete\n                v-show=\"hasInput\"\n                ref=\"autocompleteComponent\"\n                v-model:active=\"isDropdownActive\"\n                v-model:input=\"inputValue\"\n                v-bind=\"autocompleteBind\"\n                :options=\"options\"\n                :filter=\"filter\"\n                :placeholder=\"placeholder\"\n                :icon=\"icon\"\n                :icon-pack=\"iconPack\"\n                :maxlength=\"maxlength\"\n                :size=\"size\"\n                :disabled=\"disabled\"\n                :autocomplete=\"autocomplete\"\n                :open-on-focus=\"openOnFocus\"\n                :keep-first=\"keepFirst\"\n                :keep-open=\"keepOpen\"\n                :teleport=\"teleport\"\n                :has-counter=\"false\"\n                :use-html5-validation=\"false\"\n                expanded\n                @input=\"onInput\"\n                @focus=\"onFocus\"\n                @blur=\"onBlur\"\n                @invalid=\"onInvalid\"\n                @keydown.enter=\"onEnter\"\n                @keydown.tab=\"onEnter\"\n                @keydown.backspace=\"onBackspace\"\n                @select=\"onSelect\"\n                @scroll-start=\"$emit('scroll-start')\"\n                @scroll-end=\"$emit('scroll-end')\"\n                @icon-click=\"$emit('icon-click', $event)\"\n                @icon-right-click=\"$emit('icon-right-click', $event)\">\n                <template v-if=\"$slots.header\" #header=\"{ toggle }\">\n                    <slot name=\"header\" :toggle />\n                </template>\n\n                <template v-if=\"$slots.default\" #default=\"{ toggle }\">\n                    <slot :toggle />\n                </template>\n\n                <template v-if=\"$slots.option\" #option=\"{ option }\">\n                    <slot name=\"option\" :option=\"option\" />\n                </template>\n\n                <template v-if=\"$slots.empty\" #empty=\"{ toggle }\">\n                    <slot name=\"empty\" :toggle />\n                </template>\n\n                <template v-if=\"$slots.footer\" #footer=\"{ toggle }\">\n                    <slot name=\"footer\" :toggle />\n                </template>\n            </o-autocomplete>\n        </div>\n\n        <small\n            v-if=\"counter && (maxitems || maxlength)\"\n            :class=\"counterClasses\">\n            <template v-if=\"maxlength && inputLength > 0\">\n                <slot name=\"counter\" :items=\"inputLength\" :total=\"maxlength\">\n                    {{ inputLength }} / {{ maxlength }}\n                </slot>\n            </template>\n\n            <template v-else-if=\"maxitems\">\n                <slot name=\"counter\" :items=\"itemsLength\" :total=\"maxitems\">\n                    {{ itemsLength }} / {{ maxitems }}\n                </slot>\n            </template>\n        </small>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Taginput from \"./Taginput.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export taginput specific types */\nexport type * from \"./props\";\n\n/** export taginput plugin */\nexport default {\n    install(Vue: App): void {\n        registerComponent(Vue, Taginput);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export taginput components */\nexport { Taginput as OTaginput };\n","import type { App } from \"vue\";\n\nimport Timepicker from \"./Timepicker.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export timepicker specific types */\nexport type * from \"./props\";\n\n/** export timepicker plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Timepicker);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export timepicker components */\nexport { Timepicker as OTimepicker };\n","import type { App } from \"vue\";\n\nimport Tooltip from \"./Tooltip.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export tooltip specific types */\nexport type * from \"./props\";\n\n/** export tooltip plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Tooltip);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export tooltip components */\nexport { Tooltip as OTooltip };\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, useId, useTemplateRef, watch } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderChild,\n    useProviderParent,\n} from \"@/composables\";\n\nimport type {\n    TreeComponent,\n    TreeItemComponent,\n    SubtreeComponent,\n} from \"./types\";\nimport type { TreeItemProps } from \"./props\";\nimport { isDefined, isEqual } from \"@/utils/helpers\";\n\n/**\n * A tree list item.\n * @displayName Tree Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTreeItem\",\n    configField: \"tree\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<TreeItemProps<T>>(), {\n    override: undefined,\n    // @ts-expect-error string is not asignale of generic type T\n    value: () => useId(),\n    options: undefined,\n    label: undefined,\n    selectable: undefined,\n    expanded: false,\n    disabled: false,\n    hidden: false,\n    subtreeId: () => useId(),\n    icon: undefined,\n    iconPack: () => getDefault(\"tree.iconPack\"),\n    iconSize: () => getDefault(\"tree.iconSize\"),\n    animation: () => getDefault(\"tree.animation\", \"slide\"),\n    ariaLabel: undefined,\n    ariaLabelledby: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * onclick event\n     * @param value {unknown} - value prop data\n     * @param event {event} - native event\n     */\n    click: [value: T, event: Event];\n    /** on sub tree opened */\n    open: [];\n    /** on sub tree closed */\n    close: [];\n}>();\n\ndefineSlots<{\n    /**\n     * Override the label, default is label prop\n     * @param expanded {boolean} - item is expanded\n     * @param selected {boolean} - item is selected\n     * @param disabled {boolean} - item is disabled\n     */\n    label?(props: {\n        expanded: boolean;\n        selected: boolean;\n        disabled: boolean;\n    }): void;\n    /** Define subtree items here  */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nconst subtreeKey = Symbol(\"subtree\");\n\n// provided data is a computed ref to ensure reactivity\nconst subtreeProvidedData = computed<SubtreeComponent>(() => ({\n    expanded: isExpanded.value,\n}));\n\n/** provide functionalities and data to subtree child item components */\nconst { childItems } = useProviderParent({\n    key: subtreeKey,\n    data: subtreeProvidedData,\n});\n\n/** inject functionalities and data from the subtree parent item component */\nconst { parent: parentSubtree } = useProviderChild<SubtreeComponent>(rootRef, {\n    key: subtreeKey,\n    needParent: false,\n});\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<TreeItemComponent<T>>(() => ({\n    value: props.value as T,\n    expanded: isExpanded.value,\n    isViable: isViable.value,\n    hasChildren: hasChildren.value,\n    setExpand,\n    matches,\n}));\n\n/** inject functionalities and data from the parent tree component */\nconst { parent, item } = useProviderChild<\n    TreeComponent<T>,\n    TreeItemComponent<T>\n>(rootRef, { data: providedData });\n\nconst indexer = parent.value.indexer;\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\nconst hasChildren = computed(() => !!childItems.value.length);\n\nconst hasToggleIcon = computed(\n    () => parent.value.toggleIcon && hasChildren.value,\n);\n\nconst isHidden = computed(\n    () =>\n        props.hidden ?? (parentSubtree.value && !parentSubtree.value.expanded),\n);\n\n/** Shows if the item is viable or not (not disabled or hidden). */\nconst isViable = computed(() => !isHidden.value && !props.disabled);\n\nconst isDisabled = computed(() => parent.value.disabled || props.disabled);\n\nconst isFocused = computed(\n    () => item.value.identifier === parent.value.focsuedItem?.identifier,\n);\n\n/** Shows if the item is selectable or not. */\nconst isSelectable = computed(\n    () => !isDisabled.value && (props.selectable ?? parent.value.selectable),\n);\n\nconst isSelected = computed(() => {\n    if (!isDefined(parent.value.selected)) return false;\n    if (parent.value.multiple && Array.isArray(parent.value.selected))\n        return parent.value.selected.some((selected) =>\n            isEqual(item.value.data.value, selected),\n        );\n    return isEqual(item.value.data.value, parent.value.selected);\n});\n\nconst itemIconPack = computed(() => props.iconPack ?? parent.value.iconPack);\n\nconst itemIconSize = computed(() => props.iconSize ?? parent.value.iconSize);\n\n/** Click listener, toggle the selection of the item. */\nfunction clickItem(event: Event): void {\n    if (hasToggleIcon.value) {\n        const toggleIcon = (event.target as HTMLElement).closest(\n            \"[data-toggle]\",\n        );\n        if (toggleIcon && rootRef.value?.contains(toggleIcon)) {\n            event.stopPropagation();\n            toggleExpand();\n            return;\n        }\n    }\n    // toggle collapsable if not a dedicated icon is available\n    else toggleExpand();\n\n    if (isSelectable.value) {\n        // toggle selection state\n        parent.value.selectItem(item.value, !isSelected.value);\n    }\n\n    emits(\"click\", props.value as T, event);\n}\n\n/** Set the item as focused element. */\nfunction focusItem(): void {\n    parent.value.focusItem(item.value);\n}\n\nconst isExpanded = ref(props.expanded);\n// always expand if not collapsible feature\nif (!parent.value.collapsable) isExpanded.value = true;\n\nwatch(isExpanded, (value) => (value ? emits(\"open\") : emits(\"close\")));\n\n/** open/close sub item if collapsable */\nfunction toggleExpand(): void {\n    if (!parent.value.collapsable) return;\n    if (!hasChildren.value) return;\n    isExpanded.value = !isExpanded.value;\n}\n\nfunction setExpand(state: boolean): void {\n    if (!parent.value.collapsable) return;\n    if (!hasChildren.value) return;\n    isExpanded.value = state;\n}\n\n/** Check if a value matches the label (startsWith). */\n// TODO: refactor to mave into Parent because not name does noch match implementation\nfunction matches(value: string): boolean {\n    return !!props.label?.toLowerCase().startsWith(value.toLowerCase());\n}\n\n// #region --- Computed Component Classes ---\n\nconst itemClasses = defineClasses(\n    [\"itemClass\", \"o-tree__item\"],\n    [\"itemSelectableClass\", `o-tree__item--selectable`, null, isSelectable],\n    [\"itemSelectedClass\", \"o-tree__item--selected\", null, isSelected],\n    [\"itemFocusedClass\", \"o-tree__item--focused\", null, isFocused],\n    [\"itemDisabledClass\", \"o-tree__item--disabled\", null, isDisabled],\n);\n\nconst labelClasses = defineClasses([\"itemLabelClass\", \"o-tree__item-label\"]);\n\nconst iconClasses = defineClasses([\"itemIconClass\", \"o-tree__item-icon\"]);\n\nconst toggleClasses = defineClasses([\n    \"itemToggleIconClass\",\n    \"o-tree__item-toggle-icon\",\n]);\n\nconst subtreeClasses = defineClasses([\"subtreeClass\", \"o-tree__subtree\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <li\n        v-show=\"!isHidden\"\n        :id=\"`${parent.id}-${item.identifier}`\"\n        ref=\"rootElement\"\n        data-oruga=\"tree-item\"\n        :data-id=\"`tree-${item.identifier}`\"\n        :class=\"itemClasses\"\n        role=\"treeitem\"\n        :tabindex=\"isFocused ? 0 : -1\"\n        :aria-selected=\"isSelected\"\n        :aria-expanded=\"hasChildren ? isExpanded : undefined\"\n        :aria-hidden=\"isHidden\"\n        :aria-disabled=\"disabled || parent.disabled\"\n        :aria-label=\"ariaLabel ?? label\"\n        :aria-labelledby=\"ariaLabelledby\"\n        :aria-owns=\"hasChildren ? subtreeId : undefined\">\n        <div :class=\"labelClasses\" @mouseenter=\"focusItem\" @click=\"clickItem\">\n            <o-icon\n                v-if=\"hasToggleIcon\"\n                data-toggle\n                :icon=\"parent.toggleIcon\"\n                :pack=\"itemIconPack\"\n                :size=\"itemIconSize\"\n                :class=\"toggleClasses\"\n                :rotation=\"isExpanded ? 90 : 0\" />\n\n            <o-icon\n                v-if=\"icon\"\n                :icon=\"icon\"\n                :pack=\"itemIconPack\"\n                :size=\"itemIconSize\"\n                :class=\"iconClasses\" />\n\n            <slot\n                name=\"label\"\n                :expanded=\"isExpanded\"\n                :selected=\"isSelected\"\n                :disabled=\"disabled\">\n                <span>{{ label }}</span>\n            </slot>\n        </div>\n\n        <!-- sub tree items -->\n        <transition v-if=\"$slots.default || options\" :name=\"animation\">\n            <ul\n                v-show=\"isExpanded\"\n                :id=\"subtreeId\"\n                :class=\"subtreeClasses\"\n                tabindex=\"-1\"\n                :aria-hidden=\"!isExpanded\"\n                role=\"group\">\n                <slot>\n                    <o-tree-item\n                        v-for=\"option in normalizedOptions\"\n                        :key=\"option.key\"\n                        v-bind=\"option.item\" />\n                </slot>\n            </ul>\n        </transition>\n    </li>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, useId, useTemplateRef, watch } from \"vue\";\n\nimport OIcon from \"../icon/Icon.vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    useProviderChild,\n    useProviderParent,\n} from \"@/composables\";\n\nimport type {\n    TreeComponent,\n    TreeItemComponent,\n    SubtreeComponent,\n} from \"./types\";\nimport type { TreeItemProps } from \"./props\";\nimport { isDefined, isEqual } from \"@/utils/helpers\";\n\n/**\n * A tree list item.\n * @displayName Tree Item\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTreeItem\",\n    configField: \"tree\",\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<TreeItemProps<T>>(), {\n    override: undefined,\n    // @ts-expect-error string is not asignale of generic type T\n    value: () => useId(),\n    options: undefined,\n    label: undefined,\n    selectable: undefined,\n    expanded: false,\n    disabled: false,\n    hidden: false,\n    subtreeId: () => useId(),\n    icon: undefined,\n    iconPack: () => getDefault(\"tree.iconPack\"),\n    iconSize: () => getDefault(\"tree.iconSize\"),\n    animation: () => getDefault(\"tree.animation\", \"slide\"),\n    ariaLabel: undefined,\n    ariaLabelledby: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * onclick event\n     * @param value {unknown} - value prop data\n     * @param event {event} - native event\n     */\n    click: [value: T, event: Event];\n    /** on sub tree opened */\n    open: [];\n    /** on sub tree closed */\n    close: [];\n}>();\n\ndefineSlots<{\n    /**\n     * Override the label, default is label prop\n     * @param expanded {boolean} - item is expanded\n     * @param selected {boolean} - item is selected\n     * @param disabled {boolean} - item is disabled\n     */\n    label?(props: {\n        expanded: boolean;\n        selected: boolean;\n        disabled: boolean;\n    }): void;\n    /** Define subtree items here  */\n    default?(): void;\n}>();\n\nconst rootRef = useTemplateRef(\"rootElement\");\n\nconst subtreeKey = Symbol(\"subtree\");\n\n// provided data is a computed ref to ensure reactivity\nconst subtreeProvidedData = computed<SubtreeComponent>(() => ({\n    expanded: isExpanded.value,\n}));\n\n/** provide functionalities and data to subtree child item components */\nconst { childItems } = useProviderParent({\n    key: subtreeKey,\n    data: subtreeProvidedData,\n});\n\n/** inject functionalities and data from the subtree parent item component */\nconst { parent: parentSubtree } = useProviderChild<SubtreeComponent>(rootRef, {\n    key: subtreeKey,\n    needParent: false,\n});\n\n// provided data is a computed ref to ensure reactivity\nconst providedData = computed<TreeItemComponent<T>>(() => ({\n    value: props.value as T,\n    expanded: isExpanded.value,\n    isViable: isViable.value,\n    hasChildren: hasChildren.value,\n    setExpand,\n    matches,\n}));\n\n/** inject functionalities and data from the parent tree component */\nconst { parent, item } = useProviderChild<\n    TreeComponent<T>,\n    TreeItemComponent<T>\n>(rootRef, { data: providedData });\n\nconst indexer = parent.value.indexer;\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\nconst hasChildren = computed(() => !!childItems.value.length);\n\nconst hasToggleIcon = computed(\n    () => parent.value.toggleIcon && hasChildren.value,\n);\n\nconst isHidden = computed(\n    () =>\n        props.hidden ?? (parentSubtree.value && !parentSubtree.value.expanded),\n);\n\n/** Shows if the item is viable or not (not disabled or hidden). */\nconst isViable = computed(() => !isHidden.value && !props.disabled);\n\nconst isDisabled = computed(() => parent.value.disabled || props.disabled);\n\nconst isFocused = computed(\n    () => item.value.identifier === parent.value.focsuedItem?.identifier,\n);\n\n/** Shows if the item is selectable or not. */\nconst isSelectable = computed(\n    () => !isDisabled.value && (props.selectable ?? parent.value.selectable),\n);\n\nconst isSelected = computed(() => {\n    if (!isDefined(parent.value.selected)) return false;\n    if (parent.value.multiple && Array.isArray(parent.value.selected))\n        return parent.value.selected.some((selected) =>\n            isEqual(item.value.data.value, selected),\n        );\n    return isEqual(item.value.data.value, parent.value.selected);\n});\n\nconst itemIconPack = computed(() => props.iconPack ?? parent.value.iconPack);\n\nconst itemIconSize = computed(() => props.iconSize ?? parent.value.iconSize);\n\n/** Click listener, toggle the selection of the item. */\nfunction clickItem(event: Event): void {\n    if (hasToggleIcon.value) {\n        const toggleIcon = (event.target as HTMLElement).closest(\n            \"[data-toggle]\",\n        );\n        if (toggleIcon && rootRef.value?.contains(toggleIcon)) {\n            event.stopPropagation();\n            toggleExpand();\n            return;\n        }\n    }\n    // toggle collapsable if not a dedicated icon is available\n    else toggleExpand();\n\n    if (isSelectable.value) {\n        // toggle selection state\n        parent.value.selectItem(item.value, !isSelected.value);\n    }\n\n    emits(\"click\", props.value as T, event);\n}\n\n/** Set the item as focused element. */\nfunction focusItem(): void {\n    parent.value.focusItem(item.value);\n}\n\nconst isExpanded = ref(props.expanded);\n// always expand if not collapsible feature\nif (!parent.value.collapsable) isExpanded.value = true;\n\nwatch(isExpanded, (value) => (value ? emits(\"open\") : emits(\"close\")));\n\n/** open/close sub item if collapsable */\nfunction toggleExpand(): void {\n    if (!parent.value.collapsable) return;\n    if (!hasChildren.value) return;\n    isExpanded.value = !isExpanded.value;\n}\n\nfunction setExpand(state: boolean): void {\n    if (!parent.value.collapsable) return;\n    if (!hasChildren.value) return;\n    isExpanded.value = state;\n}\n\n/** Check if a value matches the label (startsWith). */\n// TODO: refactor to mave into Parent because not name does noch match implementation\nfunction matches(value: string): boolean {\n    return !!props.label?.toLowerCase().startsWith(value.toLowerCase());\n}\n\n// #region --- Computed Component Classes ---\n\nconst itemClasses = defineClasses(\n    [\"itemClass\", \"o-tree__item\"],\n    [\"itemSelectableClass\", `o-tree__item--selectable`, null, isSelectable],\n    [\"itemSelectedClass\", \"o-tree__item--selected\", null, isSelected],\n    [\"itemFocusedClass\", \"o-tree__item--focused\", null, isFocused],\n    [\"itemDisabledClass\", \"o-tree__item--disabled\", null, isDisabled],\n);\n\nconst labelClasses = defineClasses([\"itemLabelClass\", \"o-tree__item-label\"]);\n\nconst iconClasses = defineClasses([\"itemIconClass\", \"o-tree__item-icon\"]);\n\nconst toggleClasses = defineClasses([\n    \"itemToggleIconClass\",\n    \"o-tree__item-toggle-icon\",\n]);\n\nconst subtreeClasses = defineClasses([\"subtreeClass\", \"o-tree__subtree\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <li\n        v-show=\"!isHidden\"\n        :id=\"`${parent.id}-${item.identifier}`\"\n        ref=\"rootElement\"\n        data-oruga=\"tree-item\"\n        :data-id=\"`tree-${item.identifier}`\"\n        :class=\"itemClasses\"\n        role=\"treeitem\"\n        :tabindex=\"isFocused ? 0 : -1\"\n        :aria-selected=\"isSelected\"\n        :aria-expanded=\"hasChildren ? isExpanded : undefined\"\n        :aria-hidden=\"isHidden\"\n        :aria-disabled=\"disabled || parent.disabled\"\n        :aria-label=\"ariaLabel ?? label\"\n        :aria-labelledby=\"ariaLabelledby\"\n        :aria-owns=\"hasChildren ? subtreeId : undefined\">\n        <div :class=\"labelClasses\" @mouseenter=\"focusItem\" @click=\"clickItem\">\n            <o-icon\n                v-if=\"hasToggleIcon\"\n                data-toggle\n                :icon=\"parent.toggleIcon\"\n                :pack=\"itemIconPack\"\n                :size=\"itemIconSize\"\n                :class=\"toggleClasses\"\n                :rotation=\"isExpanded ? 90 : 0\" />\n\n            <o-icon\n                v-if=\"icon\"\n                :icon=\"icon\"\n                :pack=\"itemIconPack\"\n                :size=\"itemIconSize\"\n                :class=\"iconClasses\" />\n\n            <slot\n                name=\"label\"\n                :expanded=\"isExpanded\"\n                :selected=\"isSelected\"\n                :disabled=\"disabled\">\n                <span>{{ label }}</span>\n            </slot>\n        </div>\n\n        <!-- sub tree items -->\n        <transition v-if=\"$slots.default || options\" :name=\"animation\">\n            <ul\n                v-show=\"isExpanded\"\n                :id=\"subtreeId\"\n                :class=\"subtreeClasses\"\n                tabindex=\"-1\"\n                :aria-hidden=\"!isExpanded\"\n                role=\"group\">\n                <slot>\n                    <o-tree-item\n                        v-for=\"option in normalizedOptions\"\n                        :key=\"option.key\"\n                        v-bind=\"option.item\" />\n                </slot>\n            </ul>\n        </transition>\n    </li>\n</template>\n","<script setup lang=\"ts\" generic=\"T, IsMultiple extends boolean = false\">\nimport {\n    computed,\n    onMounted,\n    ref,\n    toValue,\n    useId,\n    useTemplateRef,\n    watch,\n} from \"vue\";\n\nimport OTreeItem from \"../tree/TreeItem.vue\";\n\nimport {\n    alternateArray,\n    isDefined,\n    isEmpty,\n    isEqual,\n    isPrintableCharacter,\n    isTrueish,\n    mod,\n    toCssDimension,\n} from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport { getDefault } from \"@/utils/config\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    scrollElementInView,\n    unrefElement,\n    useIndexer,\n    useProviderParent,\n    useScrollEvents,\n} from \"@/composables\";\n\nimport { injectField } from \"@/components/field/fieldInjection\";\n\nimport type { TreeProps } from \"./props\";\nimport type { TreeComponent, TreeItem, TreeItemComponent } from \"./types\";\n\n/**\n * A simple tree view, for any type of hierarchical list.\n * @displayName Tree\n * @requires ./TreeItem.vue\n * @style _tree.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTree\",\n    configField: \"tree\",\n});\n\ntype ModelValue = TreeProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<TreeProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    options: undefined,\n    scrollHeight: () => getDefault(\"tree.scrollHeight\"),\n    disabled: false,\n    collapsable: true,\n    selectable: false,\n    checkable: false,\n    emptyLabel: () => getDefault(\"tree.emptyLabel\"), // TODO: add\n    toggleIcon: () => getDefault(\"tree.toggleIcon\", \"chevron-right\"),\n    iconPack: () => getDefault(\"tree.iconPack\"),\n    iconSize: () => getDefault(\"tree.iconSize\"),\n    animation: () => getDefault(\"tree.animation\", \"slide\"),\n    id: () => useId(),\n    ariaLabel: undefined,\n    ariaLabelledby: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on select event - fired before update:modelValue\n     * @param value {unknown} - selected value\n     */\n    select: [value: T];\n    /**\n     * on tree focus event\n     * @param event {Event} native event\n     */\n    focus: [event: Event];\n    /**\n     * on tree blur event\n     * @param event {Event} native event\n     */\n    blur: [event: Event];\n    /** scrolling inside the tree reached the start */\n    \"scroll-start\": [];\n    /** scrolling inside the tree reached the end */\n    \"scroll-end\": [];\n}>();\n\ndefineSlots<{\n    /** Define an additional header */\n    header?(): void;\n    /** Define the tree items here */\n    default?(): void;\n    /** Define the content to show if the list is empty */\n    empty?(): void;\n    /** Define an additional footer */\n    footer?(): void;\n}>();\n\nconst listRef = useTemplateRef(\"listElement\");\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// if `id` is given set as `for` property on o-field wrapper\nif (props.id) parentField.value?.setInputId(props.id);\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\n// #region --- Child Items ---\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<TreeComponent<T>>(() => ({\n    id: props.id,\n    disabled: props.disabled,\n    multiple: isTrueish(props.multiple),\n    collapsable: props.collapsable,\n    checkable: props.checkable,\n    selectable: props.selectable,\n    selected: vmodel.value,\n    focsuedItem: focusedItem.value,\n    toggleIcon: props.toggleIcon,\n    iconPack: props.iconPack,\n    iconSize: props.iconSize,\n    indexer: indexer,\n    selectItem,\n    focusItem,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<\n    TreeItemComponent<T>,\n    TreeComponent<T>\n>({ rootRef: listRef, data: provideData });\n\nconst hasViableItems = computed(() =>\n    childItems.value.some((item) => item.data.isViable),\n);\n\n/**\n * List of child items without disabled or hidden items.\n * Returns empty list when no items are viable or component is disabled.\n */\nconst viableItems = computed(() => {\n    if (!props.selectable || props.disabled) return [];\n    return childItems.value.filter((item) => item.data.isViable);\n});\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(startingIndex: number, delta: 1 | -1): TreeItem<T> {\n    let newIndex = mod(\n        focusedItem.value?.index == startingIndex\n            ? startingIndex + delta\n            : startingIndex,\n        childItems.value.length,\n    );\n    for (\n        ;\n        newIndex !== focusedItem.value?.index;\n        newIndex = mod(newIndex + delta, childItems.value.length)\n    ) {\n        // Break if the item at this index is viable (not disabled)\n        if (childItems.value[newIndex].data.isViable) break;\n    }\n\n    return childItems.value[newIndex];\n}\n\n// #endregion --- Child Items ---\n\n// #region --- Scroll Feature ---\n\n// set infinite scroll handler\nif (isClient && props.scrollHeight)\n    useScrollEvents(\n        listRef,\n        {\n            onScrollEnd: () => emits(\"scroll-end\"),\n            onScrollStart: () => emits(\"scroll-start\"),\n        },\n        { passive: true },\n    );\n\nconst listStyle = computed(() => ({\n    maxHeight: props.scrollHeight\n        ? toCssDimension(props.scrollHeight)\n        : undefined,\n    overflow: props.scrollHeight ? \"auto\" : undefined,\n}));\n\n// #endregion --- Scroll Handler ---\n\n// #region --- Select Feature ---\n\n/** The selected item value, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n/** Checks if the value of the given item is part of the modelValue. */\nfunction isItemSelected(item: TreeItem<T>): boolean {\n    if (isTrueish(props.multiple)) {\n        if (Array.isArray(vmodel.value))\n            return vmodel.value.some((value) =>\n                isEqual(item.data.value, value),\n            );\n        else return false;\n    } else return isEqual(item.data.value, vmodel.value);\n}\n\n/** Replaces the modelValue when selectable and multiple. */\nfunction updateSelectedItems(items: TreeItem<T>[]): void {\n    if (!props.selectable || !isTrueish(props.multiple)) return;\n    const values = items.map((item) => item.data.value).filter(isDefined);\n    vmodel.value = values as ModelValue;\n}\n\n/** Updates the modelValue for one item when selectable. */\nfunction selectItem(item: TreeItem<T>, selection: boolean = true): void {\n    if (!props.selectable) return;\n\n    const value = item.data.value!;\n    if (selection) emits(\"select\", value);\n\n    // set selected option\n    if (isTrueish(props.multiple)) {\n        if (vmodel.value && Array.isArray(vmodel.value)) {\n            if (selection && !vmodel.value.includes(value)) {\n                // add a value\n                vmodel.value = [...vmodel.value, value] as ModelValue;\n            } else if (!selection) {\n                // remove a value\n                vmodel.value = vmodel.value.filter(\n                    (val) => val !== value,\n                ) as ModelValue;\n            }\n        } else {\n            // init new value array\n            vmodel.value = (selection ? [value] : []) as ModelValue;\n        }\n    } else {\n        if (!selection) vmodel.value = undefined;\n        else if (vmodel.value !== value) {\n            // update a single value\n            vmodel.value = value as ModelValue;\n        }\n    }\n}\n\n/** Select a range of items from a staring index to an end index. */\nfunction selectItemRange(start: number, end: number): void {\n    if (!props.selectable || !isTrueish(props.multiple)) return;\n    if (start < 0 || end < 0) return;\n\n    const rangeStart = Math.min(start, end);\n    const rangeEnd = Math.max(start, end);\n    const items = childItems.value\n        // get the items by the rande\n        .slice(rangeStart, rangeEnd + 1)\n        // remove not viable items\n        .filter((item) => item.data.isViable);\n\n    // select all items in the range\n    updateSelectedItems(items);\n}\n\n/**\n * Returns the first selected item or undefined,\n * starting by the given index,\n * alternating between the next and previous elements.\n */\nfunction findFirstSelectedItem(index: number = 0): TreeItem<T> | undefined {\n    if (isEmpty(vmodel.value)) return undefined;\n\n    if (isTrueish(props.multiple)) {\n        if (!Array.isArray(vmodel.value)) return undefined;\n        // check index overflow\n        if (index < 0 || index >= childItems.value.length) return undefined;\n\n        // reorders array by alternating between the next and previous elements\n        const items = alternateArray(childItems.value, index)\n            // filter only viable items\n            .filter((item) => item.data.isViable);\n\n        // find first option which is in the selection list\n        return items.find(isItemSelected);\n    } else {\n        const items = childItems.value;\n        // find first option which is in the selection list\n        return items.find(isItemSelected);\n    }\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Focus Feature ---\n\nconst isFocused = ref(false);\nconst focusedItem = ref<TreeItem<T>>();\nconst startRangeIndex = ref(-1);\n\n// focus the item when the focused item changes\nwatch(\n    focusedItem,\n    (newFocus, oldFocus) => {\n        if (newFocus)\n            // focus new element\n            toValue(newFocus.el)?.focus();\n        else {\n            if (oldFocus)\n                // blur old if no new focus available to\n                unrefElement(oldFocus.el)?.blur();\n            // reset focus if no new item is focused\n            resetFocus();\n        }\n    },\n    { flush: \"post\" },\n);\n\n// initialise focus on mounted\nonMounted(resetFocus);\n\n/** Clear the focus properties and add the first viable treeitem in the tree to the tab sequence */\nfunction resetFocus(): void {\n    // clear focus\n    isFocused.value = false;\n    focusedItem.value = undefined;\n    startRangeIndex.value = -1;\n\n    if (!hasViableItems.value) return;\n    // make the first viable tabable\n    const firstSelectedItem = findFirstSelectedItem();\n    const firstViableItem = firstSelectedItem ?? getFirstViableItem(0, 1);\n    const el = toValue(firstViableItem.el);\n    if (el) el.tabIndex = 0;\n}\n\n/** Sets the beginn index for an multiselection. */\nfunction startFocusRange(): void {\n    if (isTrueish(props.multiple))\n        startRangeIndex.value = focusedItem.value?.index ?? -1;\n}\n\n/** Set an item as focused element. */\nfunction focusItem(item?: TreeItem<T>): void {\n    focusedItem.value = item;\n}\n\n/** Set focus on an item. */\nfunction setFocus(item: TreeItem<T>): void {\n    // set item as focused\n    focusedItem.value = item;\n    // scroll item into view\n    scrollElementInView(listRef, item.el);\n}\n\n/** Move the focus one viable item up the list. */\nfunction moveFocusUp(event: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the previous item\n    const delta = -1;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey)\n        selectItemRange(item.index, startRangeIndex.value);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Move the focus one viable item down the list. */\nfunction moveFocusDown(event: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the next item\n    const delta = 1;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\n/**\n * Collapse the current focused item if already expanded,\n * else move focus up to the previus viable item.\n */\nfunction onCollapse(event: KeyboardEvent): void {\n    if (!focusedItem.value) return;\n\n    if (props.collapsable && focusedItem.value.data.expanded)\n        focusedItem.value.data.setExpand(false);\n    else moveFocusUp(event);\n}\n\n/**\n * Expand the current focused item if not already expanded,\n * else move focus down to the next viable item.\n */\nfunction onExpend(event: KeyboardEvent): void {\n    if (!focusedItem.value) return;\n\n    if (\n        props.collapsable &&\n        focusedItem.value.data.hasChildren &&\n        !focusedItem.value.data.expanded\n    )\n        focusedItem.value.data.setExpand(true);\n    else moveFocusDown(event);\n}\n\n/** Go to the first viable item. */\nfunction focusFirstItem(event?: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n\n    // get the first item\n    const item = getFirstViableItem(0, 1);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event?.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Go to the last viable item. */\nfunction focusLastItem(event?: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the last item\n    const item = getFirstViableItem(childItems.value.length - 1, -1);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event?.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Select the current focused item. */\nfunction selectFocusedItem(event: KeyboardEvent): void {\n    if (!props.selectable || !focusedItem.value) return;\n\n    // ensure item is in view\n    setFocus(focusedItem.value);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey) {\n        const nearestSelectedItem = findFirstSelectedItem(\n            focusedItem.value.index,\n        );\n        // select from nearest selected option to focused option\n        if (nearestSelectedItem)\n            selectItemRange(focusedItem.value.index, nearestSelectedItem.index);\n    } else\n        // select the item\n        selectItem(focusedItem.value, !isItemSelected(focusedItem.value));\n}\n\nfunction onFocusin(event: FocusEvent): void {\n    // prevent when already focused\n    if (isFocused.value) return;\n\n    isFocused.value = true;\n\n    emits(\"focus\", event);\n\n    // prevent further when an item is already focused\n    if (focusedItem.value) return;\n\n    const firstSelectedItem = findFirstSelectedItem();\n\n    // when an item is already selected\n    if (firstSelectedItem)\n        // focus this item\n        setFocus(firstSelectedItem);\n    else\n        // else focus first item\n        focusFirstItem();\n}\n\nfunction onFocusout(event: FocusEvent): void {\n    // check if focus is still inside the component\n    const listElement = event.currentTarget as HTMLElement;\n    const newFocus = event.relatedTarget as HTMLElement;\n    if (listElement?.contains(newFocus)) return;\n\n    resetFocus();\n\n    emits(\"blur\", event);\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Type-Ahead Feature ---\n\nconst typeAheadValue = ref(\"\");\nlet searchTimeout: ReturnType<typeof setTimeout> | undefined;\n\n// on type-ahead value change\nwatch(typeAheadValue, (value) => {\n    // clear old timeout\n    if (searchTimeout) clearTimeout(searchTimeout);\n\n    // when value is not empty\n    if (!isEmpty(value)) {\n        // find first item that starts with the search value\n        const matchedItem = viableItems.value.find((item) =>\n            item.data.matches(value),\n        );\n\n        // focus the item\n        if (matchedItem) setFocus(matchedItem);\n    }\n\n    // set timeout to search value get cleared\n    searchTimeout = setTimeout(() => {\n        typeAheadValue.value = \"\";\n        searchTimeout = undefined;\n    }, 500);\n});\n\n// #endregion --- Type-Ahead Feature ---\n\n// #region --- Keyboard Listener ---\n\nfunction onListKeyDown(event: KeyboardEvent): void {\n    const metaKey = event.metaKey || event.ctrlKey;\n\n    switch (event.code) {\n        case \"ArrowDown\":\n            moveFocusDown(event);\n            event.preventDefault();\n            break;\n\n        case \"ArrowUp\":\n            moveFocusUp(event);\n            event.preventDefault();\n            break;\n\n        case \"ArrowLeft\":\n            onCollapse(event);\n            event.preventDefault();\n            break;\n\n        case \"ArrowRight\":\n            onExpend(event);\n            event.preventDefault();\n            break;\n\n        case \"Home\":\n            focusFirstItem();\n            event.preventDefault();\n            break;\n\n        case \"End\":\n            focusLastItem();\n            event.preventDefault();\n            break;\n\n        case \"Enter\":\n        case \"NumpadEnter\":\n        case \"Space\":\n            selectFocusedItem(event);\n            event.preventDefault();\n            break;\n\n        case \"Tab\":\n            // NOOP\n            break;\n\n        case \"ShiftLeft\":\n        case \"ShiftRight\":\n            startFocusRange();\n            break;\n\n        default:\n            if (isTrueish(props.multiple) && event.code === \"KeyA\" && metaKey) {\n                // select all avaibale items\n                updateSelectedItems(viableItems.value);\n                event.preventDefault();\n                break;\n            }\n\n            if (!metaKey && isPrintableCharacter(event.key)) {\n                // append event key char to previus searched chars\n                typeAheadValue.value = (typeAheadValue.value || \"\") + event.key;\n                event.preventDefault();\n            }\n\n            break;\n    }\n}\n\n// #endregion --- Keyboard Listener ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-tree\"],\n    [\"disabledClass\", \"o-tree--disabled\", null, computed(() => props.disabled)],\n    [\n        \"selectableClass\",\n        \"o-tree--selectable\",\n        null,\n        computed(() => props.selectable),\n    ],\n    [\n        \"multipleClass\",\n        \"o-tree--multiple\",\n        null,\n        computed(() => !!props.multiple),\n    ],\n);\n\nconst listClasses = defineClasses([\"listClass\", \"o-tree__list\"]);\n\nconst headerClasses = defineClasses([\"headerClass\", \"o-tree__header\"]);\n\nconst footerClasses = defineClasses([\"footerClass\", \"o-tree__footer\"]);\n\nconst emptyClasses = defineClasses([\"emptyClass\", \"o-tree__empty\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div\n        data-oruga=\"tree\"\n        :class=\"rootClasses\"\n        @focusout=\"onFocusout\"\n        @mouseleave=\"isFocused && onFocusout($event)\">\n        <div v-if=\"$slots.header\" :class=\"headerClasses\">\n            <slot name=\"header\" />\n        </div>\n\n        <!-- Todo: maybe add filter?! -->\n\n        <ul\n            :id=\"id + '_list'\"\n            ref=\"listElement\"\n            role=\"tree\"\n            :class=\"listClasses\"\n            :style=\"listStyle\"\n            :aria-multiselectable=\"multiple\"\n            :aria-activedescendant=\"\n                focusedItem ? `${id}-${focusedItem.identifier}` : undefined\n            \"\n            :aria-label=\"ariaLabel\"\n            :aria-labelledby=\"props.ariaLabelledby ?? parentField?.labelId\"\n            :aria-disabled=\"disabled\"\n            @focusin=\"onFocusin\"\n            @mouseleave=\"focusItem(undefined)\"\n            @keydown=\"onListKeyDown\">\n            <transition-group :name=\"animation\">\n                <slot>\n                    <o-tree-item\n                        v-for=\"option in normalizedOptions\"\n                        :key=\"option.key\"\n                        v-bind=\"option.item\" />\n                </slot>\n            </transition-group>\n        </ul>\n\n        <transition :name=\"animation\">\n            <div\n                v-if=\"!hasViableItems && ($slots.empty || emptyLabel)\"\n                :class=\"emptyClasses\">\n                <slot name=\"empty\">\n                    {{ emptyLabel }}\n                </slot>\n            </div>\n        </transition>\n\n        <div v-if=\"$slots.footer\" :class=\"footerClasses\">\n            <slot name=\"footer\" />\n        </div>\n    </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T, IsMultiple extends boolean = false\">\nimport {\n    computed,\n    onMounted,\n    ref,\n    toValue,\n    useId,\n    useTemplateRef,\n    watch,\n} from \"vue\";\n\nimport OTreeItem from \"../tree/TreeItem.vue\";\n\nimport {\n    alternateArray,\n    isDefined,\n    isEmpty,\n    isEqual,\n    isPrintableCharacter,\n    isTrueish,\n    mod,\n    toCssDimension,\n} from \"@/utils/helpers\";\nimport { isClient } from \"@/utils/ssr\";\nimport { getDefault } from \"@/utils/config\";\nimport {\n    defineClasses,\n    normalizeOptions,\n    scrollElementInView,\n    unrefElement,\n    useIndexer,\n    useProviderParent,\n    useScrollEvents,\n} from \"@/composables\";\n\nimport { injectField } from \"@/components/field/fieldInjection\";\n\nimport type { TreeProps } from \"./props\";\nimport type { TreeComponent, TreeItem, TreeItemComponent } from \"./types\";\n\n/**\n * A simple tree view, for any type of hierarchical list.\n * @displayName Tree\n * @requires ./TreeItem.vue\n * @style _tree.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OTree\",\n    configField: \"tree\",\n});\n\ntype ModelValue = TreeProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<TreeProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    options: undefined,\n    scrollHeight: () => getDefault(\"tree.scrollHeight\"),\n    disabled: false,\n    collapsable: true,\n    selectable: false,\n    checkable: false,\n    emptyLabel: () => getDefault(\"tree.emptyLabel\"), // TODO: add\n    toggleIcon: () => getDefault(\"tree.toggleIcon\", \"chevron-right\"),\n    iconPack: () => getDefault(\"tree.iconPack\"),\n    iconSize: () => getDefault(\"tree.iconSize\"),\n    animation: () => getDefault(\"tree.animation\", \"slide\"),\n    id: () => useId(),\n    ariaLabel: undefined,\n    ariaLabelledby: undefined,\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {unknown} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on select event - fired before update:modelValue\n     * @param value {unknown} - selected value\n     */\n    select: [value: T];\n    /**\n     * on tree focus event\n     * @param event {Event} native event\n     */\n    focus: [event: Event];\n    /**\n     * on tree blur event\n     * @param event {Event} native event\n     */\n    blur: [event: Event];\n    /** scrolling inside the tree reached the start */\n    \"scroll-start\": [];\n    /** scrolling inside the tree reached the end */\n    \"scroll-end\": [];\n}>();\n\ndefineSlots<{\n    /** Define an additional header */\n    header?(): void;\n    /** Define the tree items here */\n    default?(): void;\n    /** Define the content to show if the list is empty */\n    empty?(): void;\n    /** Define an additional footer */\n    footer?(): void;\n}>();\n\nconst listRef = useTemplateRef(\"listElement\");\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\n// if `id` is given set as `for` property on o-field wrapper\nif (props.id) parentField.value?.setInputId(props.id);\n\n/** unique key sequencer */\nconst indexer = useIndexer();\n\n/** normalized programamtic options */\nconst normalizedOptions = computed(() =>\n    normalizeOptions(props.options, indexer),\n);\n\n// #region --- Child Items ---\n\n// provided data is a computed ref to ensure reactivity\nconst provideData = computed<TreeComponent<T>>(() => ({\n    id: props.id,\n    disabled: props.disabled,\n    multiple: isTrueish(props.multiple),\n    collapsable: props.collapsable,\n    checkable: props.checkable,\n    selectable: props.selectable,\n    selected: vmodel.value,\n    focsuedItem: focusedItem.value,\n    toggleIcon: props.toggleIcon,\n    iconPack: props.iconPack,\n    iconSize: props.iconSize,\n    indexer: indexer,\n    selectItem,\n    focusItem,\n}));\n\n/** provide functionalities and data to child item components */\nconst { childItems } = useProviderParent<\n    TreeItemComponent<T>,\n    TreeComponent<T>\n>({ rootRef: listRef, data: provideData });\n\nconst hasViableItems = computed(() =>\n    childItems.value.some((item) => item.data.isViable),\n);\n\n/**\n * List of child items without disabled or hidden items.\n * Returns empty list when no items are viable or component is disabled.\n */\nconst viableItems = computed(() => {\n    if (!props.selectable || props.disabled) return [];\n    return childItems.value.filter((item) => item.data.isViable);\n});\n\n/**\n * Get the first 'viable' child, starting at startingIndex and in the direction specified\n * by the boolean parameter forward. In other words, first try to select the child at index\n * startingIndex, and if it is not visible or it is disabled, then go to the index in the\n * specified direction until either returning to startIndex or finding a viable child item.\n */\nfunction getFirstViableItem(startingIndex: number, delta: 1 | -1): TreeItem<T> {\n    let newIndex = mod(\n        focusedItem.value?.index == startingIndex\n            ? startingIndex + delta\n            : startingIndex,\n        childItems.value.length,\n    );\n    for (\n        ;\n        newIndex !== focusedItem.value?.index;\n        newIndex = mod(newIndex + delta, childItems.value.length)\n    ) {\n        // Break if the item at this index is viable (not disabled)\n        if (childItems.value[newIndex].data.isViable) break;\n    }\n\n    return childItems.value[newIndex];\n}\n\n// #endregion --- Child Items ---\n\n// #region --- Scroll Feature ---\n\n// set infinite scroll handler\nif (isClient && props.scrollHeight)\n    useScrollEvents(\n        listRef,\n        {\n            onScrollEnd: () => emits(\"scroll-end\"),\n            onScrollStart: () => emits(\"scroll-start\"),\n        },\n        { passive: true },\n    );\n\nconst listStyle = computed(() => ({\n    maxHeight: props.scrollHeight\n        ? toCssDimension(props.scrollHeight)\n        : undefined,\n    overflow: props.scrollHeight ? \"auto\" : undefined,\n}));\n\n// #endregion --- Scroll Handler ---\n\n// #region --- Select Feature ---\n\n/** The selected item value, use v-model to make it two-way binding */\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\n/** Checks if the value of the given item is part of the modelValue. */\nfunction isItemSelected(item: TreeItem<T>): boolean {\n    if (isTrueish(props.multiple)) {\n        if (Array.isArray(vmodel.value))\n            return vmodel.value.some((value) =>\n                isEqual(item.data.value, value),\n            );\n        else return false;\n    } else return isEqual(item.data.value, vmodel.value);\n}\n\n/** Replaces the modelValue when selectable and multiple. */\nfunction updateSelectedItems(items: TreeItem<T>[]): void {\n    if (!props.selectable || !isTrueish(props.multiple)) return;\n    const values = items.map((item) => item.data.value).filter(isDefined);\n    vmodel.value = values as ModelValue;\n}\n\n/** Updates the modelValue for one item when selectable. */\nfunction selectItem(item: TreeItem<T>, selection: boolean = true): void {\n    if (!props.selectable) return;\n\n    const value = item.data.value!;\n    if (selection) emits(\"select\", value);\n\n    // set selected option\n    if (isTrueish(props.multiple)) {\n        if (vmodel.value && Array.isArray(vmodel.value)) {\n            if (selection && !vmodel.value.includes(value)) {\n                // add a value\n                vmodel.value = [...vmodel.value, value] as ModelValue;\n            } else if (!selection) {\n                // remove a value\n                vmodel.value = vmodel.value.filter(\n                    (val) => val !== value,\n                ) as ModelValue;\n            }\n        } else {\n            // init new value array\n            vmodel.value = (selection ? [value] : []) as ModelValue;\n        }\n    } else {\n        if (!selection) vmodel.value = undefined;\n        else if (vmodel.value !== value) {\n            // update a single value\n            vmodel.value = value as ModelValue;\n        }\n    }\n}\n\n/** Select a range of items from a staring index to an end index. */\nfunction selectItemRange(start: number, end: number): void {\n    if (!props.selectable || !isTrueish(props.multiple)) return;\n    if (start < 0 || end < 0) return;\n\n    const rangeStart = Math.min(start, end);\n    const rangeEnd = Math.max(start, end);\n    const items = childItems.value\n        // get the items by the rande\n        .slice(rangeStart, rangeEnd + 1)\n        // remove not viable items\n        .filter((item) => item.data.isViable);\n\n    // select all items in the range\n    updateSelectedItems(items);\n}\n\n/**\n * Returns the first selected item or undefined,\n * starting by the given index,\n * alternating between the next and previous elements.\n */\nfunction findFirstSelectedItem(index: number = 0): TreeItem<T> | undefined {\n    if (isEmpty(vmodel.value)) return undefined;\n\n    if (isTrueish(props.multiple)) {\n        if (!Array.isArray(vmodel.value)) return undefined;\n        // check index overflow\n        if (index < 0 || index >= childItems.value.length) return undefined;\n\n        // reorders array by alternating between the next and previous elements\n        const items = alternateArray(childItems.value, index)\n            // filter only viable items\n            .filter((item) => item.data.isViable);\n\n        // find first option which is in the selection list\n        return items.find(isItemSelected);\n    } else {\n        const items = childItems.value;\n        // find first option which is in the selection list\n        return items.find(isItemSelected);\n    }\n}\n\n// #endregion --- Select Feature ---\n\n// #region --- Focus Feature ---\n\nconst isFocused = ref(false);\nconst focusedItem = ref<TreeItem<T>>();\nconst startRangeIndex = ref(-1);\n\n// focus the item when the focused item changes\nwatch(\n    focusedItem,\n    (newFocus, oldFocus) => {\n        if (newFocus)\n            // focus new element\n            toValue(newFocus.el)?.focus();\n        else {\n            if (oldFocus)\n                // blur old if no new focus available to\n                unrefElement(oldFocus.el)?.blur();\n            // reset focus if no new item is focused\n            resetFocus();\n        }\n    },\n    { flush: \"post\" },\n);\n\n// initialise focus on mounted\nonMounted(resetFocus);\n\n/** Clear the focus properties and add the first viable treeitem in the tree to the tab sequence */\nfunction resetFocus(): void {\n    // clear focus\n    isFocused.value = false;\n    focusedItem.value = undefined;\n    startRangeIndex.value = -1;\n\n    if (!hasViableItems.value) return;\n    // make the first viable tabable\n    const firstSelectedItem = findFirstSelectedItem();\n    const firstViableItem = firstSelectedItem ?? getFirstViableItem(0, 1);\n    const el = toValue(firstViableItem.el);\n    if (el) el.tabIndex = 0;\n}\n\n/** Sets the beginn index for an multiselection. */\nfunction startFocusRange(): void {\n    if (isTrueish(props.multiple))\n        startRangeIndex.value = focusedItem.value?.index ?? -1;\n}\n\n/** Set an item as focused element. */\nfunction focusItem(item?: TreeItem<T>): void {\n    focusedItem.value = item;\n}\n\n/** Set focus on an item. */\nfunction setFocus(item: TreeItem<T>): void {\n    // set item as focused\n    focusedItem.value = item;\n    // scroll item into view\n    scrollElementInView(listRef, item.el);\n}\n\n/** Move the focus one viable item up the list. */\nfunction moveFocusUp(event: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the previous item\n    const delta = -1;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey)\n        selectItemRange(item.index, startRangeIndex.value);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Move the focus one viable item down the list. */\nfunction moveFocusDown(event: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the next item\n    const delta = 1;\n    const item = getFirstViableItem(focusedItem.value?.index || 0, delta);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\n/**\n * Collapse the current focused item if already expanded,\n * else move focus up to the previus viable item.\n */\nfunction onCollapse(event: KeyboardEvent): void {\n    if (!focusedItem.value) return;\n\n    if (props.collapsable && focusedItem.value.data.expanded)\n        focusedItem.value.data.setExpand(false);\n    else moveFocusUp(event);\n}\n\n/**\n * Expand the current focused item if not already expanded,\n * else move focus down to the next viable item.\n */\nfunction onExpend(event: KeyboardEvent): void {\n    if (!focusedItem.value) return;\n\n    if (\n        props.collapsable &&\n        focusedItem.value.data.hasChildren &&\n        !focusedItem.value.data.expanded\n    )\n        focusedItem.value.data.setExpand(true);\n    else moveFocusDown(event);\n}\n\n/** Go to the first viable item. */\nfunction focusFirstItem(event?: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n\n    // get the first item\n    const item = getFirstViableItem(0, 1);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event?.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Go to the last viable item. */\nfunction focusLastItem(event?: KeyboardEvent): void {\n    if (!hasViableItems.value) return;\n    // get the last item\n    const item = getFirstViableItem(childItems.value.length - 1, -1);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event?.shiftKey)\n        selectItemRange(startRangeIndex.value, item.index);\n\n    // focus new item\n    setFocus(item);\n}\n\n/** Select the current focused item. */\nfunction selectFocusedItem(event: KeyboardEvent): void {\n    if (!props.selectable || !focusedItem.value) return;\n\n    // ensure item is in view\n    setFocus(focusedItem.value);\n\n    // check mulitple selection\n    if (isTrueish(props.multiple) && event.shiftKey) {\n        const nearestSelectedItem = findFirstSelectedItem(\n            focusedItem.value.index,\n        );\n        // select from nearest selected option to focused option\n        if (nearestSelectedItem)\n            selectItemRange(focusedItem.value.index, nearestSelectedItem.index);\n    } else\n        // select the item\n        selectItem(focusedItem.value, !isItemSelected(focusedItem.value));\n}\n\nfunction onFocusin(event: FocusEvent): void {\n    // prevent when already focused\n    if (isFocused.value) return;\n\n    isFocused.value = true;\n\n    emits(\"focus\", event);\n\n    // prevent further when an item is already focused\n    if (focusedItem.value) return;\n\n    const firstSelectedItem = findFirstSelectedItem();\n\n    // when an item is already selected\n    if (firstSelectedItem)\n        // focus this item\n        setFocus(firstSelectedItem);\n    else\n        // else focus first item\n        focusFirstItem();\n}\n\nfunction onFocusout(event: FocusEvent): void {\n    // check if focus is still inside the component\n    const listElement = event.currentTarget as HTMLElement;\n    const newFocus = event.relatedTarget as HTMLElement;\n    if (listElement?.contains(newFocus)) return;\n\n    resetFocus();\n\n    emits(\"blur\", event);\n}\n\n// #endregion --- Focus Feature ---\n\n// #region --- Type-Ahead Feature ---\n\nconst typeAheadValue = ref(\"\");\nlet searchTimeout: ReturnType<typeof setTimeout> | undefined;\n\n// on type-ahead value change\nwatch(typeAheadValue, (value) => {\n    // clear old timeout\n    if (searchTimeout) clearTimeout(searchTimeout);\n\n    // when value is not empty\n    if (!isEmpty(value)) {\n        // find first item that starts with the search value\n        const matchedItem = viableItems.value.find((item) =>\n            item.data.matches(value),\n        );\n\n        // focus the item\n        if (matchedItem) setFocus(matchedItem);\n    }\n\n    // set timeout to search value get cleared\n    searchTimeout = setTimeout(() => {\n        typeAheadValue.value = \"\";\n        searchTimeout = undefined;\n    }, 500);\n});\n\n// #endregion --- Type-Ahead Feature ---\n\n// #region --- Keyboard Listener ---\n\nfunction onListKeyDown(event: KeyboardEvent): void {\n    const metaKey = event.metaKey || event.ctrlKey;\n\n    switch (event.code) {\n        case \"ArrowDown\":\n            moveFocusDown(event);\n            event.preventDefault();\n            break;\n\n        case \"ArrowUp\":\n            moveFocusUp(event);\n            event.preventDefault();\n            break;\n\n        case \"ArrowLeft\":\n            onCollapse(event);\n            event.preventDefault();\n            break;\n\n        case \"ArrowRight\":\n            onExpend(event);\n            event.preventDefault();\n            break;\n\n        case \"Home\":\n            focusFirstItem();\n            event.preventDefault();\n            break;\n\n        case \"End\":\n            focusLastItem();\n            event.preventDefault();\n            break;\n\n        case \"Enter\":\n        case \"NumpadEnter\":\n        case \"Space\":\n            selectFocusedItem(event);\n            event.preventDefault();\n            break;\n\n        case \"Tab\":\n            // NOOP\n            break;\n\n        case \"ShiftLeft\":\n        case \"ShiftRight\":\n            startFocusRange();\n            break;\n\n        default:\n            if (isTrueish(props.multiple) && event.code === \"KeyA\" && metaKey) {\n                // select all avaibale items\n                updateSelectedItems(viableItems.value);\n                event.preventDefault();\n                break;\n            }\n\n            if (!metaKey && isPrintableCharacter(event.key)) {\n                // append event key char to previus searched chars\n                typeAheadValue.value = (typeAheadValue.value || \"\") + event.key;\n                event.preventDefault();\n            }\n\n            break;\n    }\n}\n\n// #endregion --- Keyboard Listener ---\n\n// #region --- Computed Component Classes ---\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-tree\"],\n    [\"disabledClass\", \"o-tree--disabled\", null, computed(() => props.disabled)],\n    [\n        \"selectableClass\",\n        \"o-tree--selectable\",\n        null,\n        computed(() => props.selectable),\n    ],\n    [\n        \"multipleClass\",\n        \"o-tree--multiple\",\n        null,\n        computed(() => !!props.multiple),\n    ],\n);\n\nconst listClasses = defineClasses([\"listClass\", \"o-tree__list\"]);\n\nconst headerClasses = defineClasses([\"headerClass\", \"o-tree__header\"]);\n\nconst footerClasses = defineClasses([\"footerClass\", \"o-tree__footer\"]);\n\nconst emptyClasses = defineClasses([\"emptyClass\", \"o-tree__empty\"]);\n\n// #endregion --- Computed Component Classes ---\n</script>\n\n<template>\n    <div\n        data-oruga=\"tree\"\n        :class=\"rootClasses\"\n        @focusout=\"onFocusout\"\n        @mouseleave=\"isFocused && onFocusout($event)\">\n        <div v-if=\"$slots.header\" :class=\"headerClasses\">\n            <slot name=\"header\" />\n        </div>\n\n        <!-- Todo: maybe add filter?! -->\n\n        <ul\n            :id=\"id + '_list'\"\n            ref=\"listElement\"\n            role=\"tree\"\n            :class=\"listClasses\"\n            :style=\"listStyle\"\n            :aria-multiselectable=\"multiple\"\n            :aria-activedescendant=\"\n                focusedItem ? `${id}-${focusedItem.identifier}` : undefined\n            \"\n            :aria-label=\"ariaLabel\"\n            :aria-labelledby=\"props.ariaLabelledby ?? parentField?.labelId\"\n            :aria-disabled=\"disabled\"\n            @focusin=\"onFocusin\"\n            @mouseleave=\"focusItem(undefined)\"\n            @keydown=\"onListKeyDown\">\n            <transition-group :name=\"animation\">\n                <slot>\n                    <o-tree-item\n                        v-for=\"option in normalizedOptions\"\n                        :key=\"option.key\"\n                        v-bind=\"option.item\" />\n                </slot>\n            </transition-group>\n        </ul>\n\n        <transition :name=\"animation\">\n            <div\n                v-if=\"!hasViableItems && ($slots.empty || emptyLabel)\"\n                :class=\"emptyClasses\">\n                <slot name=\"empty\">\n                    {{ emptyLabel }}\n                </slot>\n            </div>\n        </transition>\n\n        <div v-if=\"$slots.footer\" :class=\"footerClasses\">\n            <slot name=\"footer\" />\n        </div>\n    </div>\n</template>\n","import type { App } from \"vue\";\n\nimport Tree from \"./Tree.vue\";\nimport TreeItem from \"./TreeItem.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export tree specific types */\nexport type * from \"./props\";\n\n/** export tree plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Tree);\n        registerComponent(app, TreeItem);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export tree components */\nexport { Tree as OTree, TreeItem as OTreeItem };\n","<script\n    setup\n    lang=\"ts\"\n    generic=\"\n        T extends object | typeof File,\n        IsMultiple extends boolean = false\n    \">\nimport { computed, ref, useAttrs, useTemplateRef, watch } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { File } from \"@/utils/ssr\";\nimport { isTrueish } from \"@/utils/helpers\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { UploadProps } from \"./props\";\n\n/**\n * Upload one or more files.\n * @displayName Upload\n * @style _upload.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OUpload\",\n    configField: \"upload\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = UploadProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<UploadProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    variant: () => getDefault(\"upload.variant\"),\n    disabled: false,\n    expanded: () => getDefault(\"upload.expanded\", false),\n    accept: undefined,\n    dragDrop: false,\n    native: true,\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: \"\",\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {object | object[] | File | File[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n}>();\n\ndefineSlots<{\n    /**\n     * Default content\n     * @param onclick {(event: Event): void} - click handler, only needed if a button is used\n     */\n    default?(props: { onclick: (event: Event) => void }): void;\n}>();\n\nconst inputRef = useTemplateRef(\"inputElement\");\n\n// use form input functionality\nconst { checkHtml5Validity, onFocus, onBlur, onInvalid, isValid, setFocus } =\n    useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nconst dragDropFocus = ref(false);\n\n/**\n * When v-model is changed:\n * 1. Reset interna input file value\n * 2. If it's invalid, validate again.\n */\nwatch(vmodel, (value) => {\n    if (!value || (Array.isArray(value) && value.length === 0))\n        if (inputRef.value) inputRef.value.value = \"\";\n    if (!isValid.value && !props.dragDrop) checkHtml5Validity();\n});\n\n/**\n * Listen change event on input type 'file',\n * emit 'input' event and validate\n */\nfunction onFileChange(event: Event | DragEvent): void {\n    if (props.disabled) return;\n    if (props.dragDrop) updateDragDropFocus(false);\n    const value =\n        (event.target as HTMLInputElement).files ||\n        (event as DragEvent).dataTransfer?.files ||\n        [];\n    // no file selected\n    if (value.length === 0) {\n        if (!vmodel.value) return;\n        if (props.native) vmodel.value = undefined;\n    }\n\n    // multiple upload\n    if (isTrueish(props.multiple)) {\n        // always new values if native or undefined local\n        const values =\n            props.native || !vmodel.value || !Array.isArray(vmodel.value)\n                ? []\n                : [...vmodel.value];\n\n        for (let i = 0; i < value.length; i++) {\n            const file = value[i];\n            // add file when type is valid\n            if (checkType(file)) values.push(file);\n        }\n        vmodel.value = values as ModelValue;\n    }\n    // single uplaod\n    else {\n        // only one element in case drag drop mode and isn't multiple\n        if (props.dragDrop && value.length !== 1) return;\n        else {\n            const file = value[0];\n            // add file when type is valid\n            if (checkType(file)) vmodel.value = file as ModelValue;\n            // else clear input\n            else if (vmodel.value) {\n                vmodel.value = undefined;\n                clearInput();\n            } else {\n                // Force input back to empty state and recheck validity\n                clearInput();\n                checkHtml5Validity();\n                return;\n            }\n        }\n    }\n\n    if (!props.dragDrop) checkHtml5Validity();\n}\n\n/** Reset file input value */\nfunction clearInput(): void {\n    if (inputRef.value) inputRef.value.value = \"\";\n}\n\n/** Listen drag-drop to update internal variable */\nfunction updateDragDropFocus(focus: boolean): void {\n    if (!props.disabled) dragDropFocus.value = focus;\n}\n\n/** Check mime type of file s*/\nfunction checkType(file: File): boolean {\n    if (!props.accept) return true;\n    const types = props.accept.split(\",\");\n    if (types.length === 0) return true;\n    for (let i = 0; i < types.length; i++) {\n        const type = types[i].trim();\n        if (type) {\n            if (type.substring(0, 1) === \".\") {\n                const extension = file.name.toLowerCase().slice(-type.length);\n                if (extension === type.toLowerCase()) return true;\n            } else {\n                // check mime type\n                if (file.type.match(type)) return true;\n            }\n        }\n    }\n    return false;\n}\n\nfunction onClick(event: Event): void {\n    if (props.disabled) return;\n\n    // click input if not drag and drop is used\n    if (!props.dragDrop) {\n        event.preventDefault();\n        if (inputRef.value) inputRef.value.click();\n    }\n}\n\n// --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-upload\"],\n    [\n        \"expandedClass\",\n        \"o-upload--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    [\n        \"disabledClass\",\n        \"o-upload--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"variantClass\",\n        \"o-upload--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n);\n\nconst draggableClasses = defineClasses(\n    [\"draggableClass\", \"o-upload__draggable\"],\n    [\n        \"draggableHoveredClass\",\n        \"o-upload__draggable--hovered\",\n        null,\n        computed(() => dragDropFocus.value),\n    ],\n);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n</script>\n\n<template>\n    <label data-oruga=\"upload\" :class=\"rootClasses\">\n        <template v-if=\"!dragDrop\">\n            <slot :onclick=\"onClick\" />\n        </template>\n\n        <div\n            v-else\n            :class=\"draggableClasses\"\n            role=\"button\"\n            tabindex=\"0\"\n            @mouseenter=\"updateDragDropFocus(true)\"\n            @mouseleave=\"updateDragDropFocus(false)\"\n            @dragover.prevent=\"updateDragDropFocus(true)\"\n            @dragleave.prevent=\"updateDragDropFocus(false)\"\n            @dragenter.prevent=\"updateDragDropFocus(true)\"\n            @drop.prevent=\"onFileChange\">\n            <slot :onclick=\"onClick\" />\n        </div>\n\n        <input\n            v-bind=\"inputBind\"\n            ref=\"inputElement\"\n            type=\"file\"\n            data-oruga-input=\"file\"\n            :multiple=\"props.multiple\"\n            :accept=\"accept\"\n            :disabled=\"disabled\"\n            @change=\"onFileChange\"\n            @focus=\"onFocus\"\n            @blur=\"onBlur\"\n            @invalid=\"onInvalid\" />\n    </label>\n</template>\n","<script\n    setup\n    lang=\"ts\"\n    generic=\"\n        T extends object | typeof File,\n        IsMultiple extends boolean = false\n    \">\nimport { computed, ref, useAttrs, useTemplateRef, watch } from \"vue\";\n\nimport { getDefault } from \"@/utils/config\";\nimport { File } from \"@/utils/ssr\";\nimport { isTrueish } from \"@/utils/helpers\";\nimport { defineClasses, useInputHandler } from \"@/composables\";\n\nimport { injectField } from \"../field/fieldInjection\";\n\nimport type { UploadProps } from \"./props\";\n\n/**\n * Upload one or more files.\n * @displayName Upload\n * @style _upload.scss\n */\ndefineOptions({\n    isOruga: true,\n    name: \"OUpload\",\n    configField: \"upload\",\n    inheritAttrs: false,\n});\n\ntype ModelValue = UploadProps<T, IsMultiple>[\"modelValue\"];\n\nconst props = withDefaults(defineProps<UploadProps<T, IsMultiple>>(), {\n    override: undefined,\n    modelValue: undefined,\n    // multiple: false,\n    variant: () => getDefault(\"upload.variant\"),\n    disabled: false,\n    expanded: () => getDefault(\"upload.expanded\", false),\n    accept: undefined,\n    dragDrop: false,\n    native: true,\n    useHtml5Validation: () => getDefault(\"useHtml5Validation\", true),\n    customValidity: \"\",\n});\n\nconst emits = defineEmits<{\n    /**\n     * modelValue prop two-way binding\n     * @param value {object | object[] | File | File[]} - updated modelValue prop\n     */\n    \"update:model-value\": [value: ModelValue];\n    /**\n     * on input focus event\n     * @param event {Event} - native event\n     */\n    focus: [event: Event];\n    /**\n     * on input blur event\n     * @param event {Event} - native event\n     */\n    blur: [event: Event];\n    /**\n     * on input invalid event\n     * @param event {Event} - native event\n     */\n    invalid: [event: Event];\n}>();\n\ndefineSlots<{\n    /**\n     * Default content\n     * @param onclick {(event: Event): void} - click handler, only needed if a button is used\n     */\n    default?(props: { onclick: (event: Event) => void }): void;\n}>();\n\nconst inputRef = useTemplateRef(\"inputElement\");\n\n// use form input functionality\nconst { checkHtml5Validity, onFocus, onBlur, onInvalid, isValid, setFocus } =\n    useInputHandler(inputRef, emits, props);\n\n// inject parent field component if used inside one\nconst { parentField } = injectField();\n\nconst vmodel = defineModel<ModelValue>({ default: undefined });\n\nconst dragDropFocus = ref(false);\n\n/**\n * When v-model is changed:\n * 1. Reset interna input file value\n * 2. If it's invalid, validate again.\n */\nwatch(vmodel, (value) => {\n    if (!value || (Array.isArray(value) && value.length === 0))\n        if (inputRef.value) inputRef.value.value = \"\";\n    if (!isValid.value && !props.dragDrop) checkHtml5Validity();\n});\n\n/**\n * Listen change event on input type 'file',\n * emit 'input' event and validate\n */\nfunction onFileChange(event: Event | DragEvent): void {\n    if (props.disabled) return;\n    if (props.dragDrop) updateDragDropFocus(false);\n    const value =\n        (event.target as HTMLInputElement).files ||\n        (event as DragEvent).dataTransfer?.files ||\n        [];\n    // no file selected\n    if (value.length === 0) {\n        if (!vmodel.value) return;\n        if (props.native) vmodel.value = undefined;\n    }\n\n    // multiple upload\n    if (isTrueish(props.multiple)) {\n        // always new values if native or undefined local\n        const values =\n            props.native || !vmodel.value || !Array.isArray(vmodel.value)\n                ? []\n                : [...vmodel.value];\n\n        for (let i = 0; i < value.length; i++) {\n            const file = value[i];\n            // add file when type is valid\n            if (checkType(file)) values.push(file);\n        }\n        vmodel.value = values as ModelValue;\n    }\n    // single uplaod\n    else {\n        // only one element in case drag drop mode and isn't multiple\n        if (props.dragDrop && value.length !== 1) return;\n        else {\n            const file = value[0];\n            // add file when type is valid\n            if (checkType(file)) vmodel.value = file as ModelValue;\n            // else clear input\n            else if (vmodel.value) {\n                vmodel.value = undefined;\n                clearInput();\n            } else {\n                // Force input back to empty state and recheck validity\n                clearInput();\n                checkHtml5Validity();\n                return;\n            }\n        }\n    }\n\n    if (!props.dragDrop) checkHtml5Validity();\n}\n\n/** Reset file input value */\nfunction clearInput(): void {\n    if (inputRef.value) inputRef.value.value = \"\";\n}\n\n/** Listen drag-drop to update internal variable */\nfunction updateDragDropFocus(focus: boolean): void {\n    if (!props.disabled) dragDropFocus.value = focus;\n}\n\n/** Check mime type of file s*/\nfunction checkType(file: File): boolean {\n    if (!props.accept) return true;\n    const types = props.accept.split(\",\");\n    if (types.length === 0) return true;\n    for (let i = 0; i < types.length; i++) {\n        const type = types[i].trim();\n        if (type) {\n            if (type.substring(0, 1) === \".\") {\n                const extension = file.name.toLowerCase().slice(-type.length);\n                if (extension === type.toLowerCase()) return true;\n            } else {\n                // check mime type\n                if (file.type.match(type)) return true;\n            }\n        }\n    }\n    return false;\n}\n\nfunction onClick(event: Event): void {\n    if (props.disabled) return;\n\n    // click input if not drag and drop is used\n    if (!props.dragDrop) {\n        event.preventDefault();\n        if (inputRef.value) inputRef.value.click();\n    }\n}\n\n// --- Computed Component Classes ---\n\nconst attrs = useAttrs();\n\nconst inputBind = computed(() => ({\n    ...parentField?.value?.inputAttrs,\n    ...attrs,\n}));\n\nconst rootClasses = defineClasses(\n    [\"rootClass\", \"o-upload\"],\n    [\n        \"expandedClass\",\n        \"o-upload--expanded\",\n        null,\n        computed(() => props.expanded),\n    ],\n    [\n        \"disabledClass\",\n        \"o-upload--disabled\",\n        null,\n        computed(() => props.disabled),\n    ],\n    [\n        \"variantClass\",\n        \"o-upload--\",\n        computed(() => props.variant),\n        computed(() => !!props.variant),\n    ],\n);\n\nconst draggableClasses = defineClasses(\n    [\"draggableClass\", \"o-upload__draggable\"],\n    [\n        \"draggableHoveredClass\",\n        \"o-upload__draggable--hovered\",\n        null,\n        computed(() => dragDropFocus.value),\n    ],\n);\n\n// --- Expose Public Functionalities ---\n\n/** expose functionalities for programmatic usage */\ndefineExpose({ checkHtml5Validity, focus: setFocus, value: vmodel });\n</script>\n\n<template>\n    <label data-oruga=\"upload\" :class=\"rootClasses\">\n        <template v-if=\"!dragDrop\">\n            <slot :onclick=\"onClick\" />\n        </template>\n\n        <div\n            v-else\n            :class=\"draggableClasses\"\n            role=\"button\"\n            tabindex=\"0\"\n            @mouseenter=\"updateDragDropFocus(true)\"\n            @mouseleave=\"updateDragDropFocus(false)\"\n            @dragover.prevent=\"updateDragDropFocus(true)\"\n            @dragleave.prevent=\"updateDragDropFocus(false)\"\n            @dragenter.prevent=\"updateDragDropFocus(true)\"\n            @drop.prevent=\"onFileChange\">\n            <slot :onclick=\"onClick\" />\n        </div>\n\n        <input\n            v-bind=\"inputBind\"\n            ref=\"inputElement\"\n            type=\"file\"\n            data-oruga-input=\"file\"\n            :multiple=\"props.multiple\"\n            :accept=\"accept\"\n            :disabled=\"disabled\"\n            @change=\"onFileChange\"\n            @focus=\"onFocus\"\n            @blur=\"onBlur\"\n            @invalid=\"onInvalid\" />\n    </label>\n</template>\n","import type { App } from \"vue\";\n\nimport Upload from \"./Upload.vue\";\n\nimport { registerComponent } from \"@/utils/plugins\";\nimport type { OrugaComponentPlugin } from \"@/utils/config\";\n\n/** export upload specific types */\nexport type * from \"./props\";\n\n/** export upload plugin */\nexport default {\n    install(app: App): void {\n        registerComponent(app, Upload);\n    },\n} satisfies OrugaComponentPlugin;\n\n/** export upload components */\nexport { Upload as OUpload };\n","import Autocomplete from \"./autocomplete\";\nimport Breadcrumb from \"./breadcrumb\";\nimport Button from \"./button\";\nimport Carousel from \"./carousel\";\nimport Checkbox from \"./checkbox\";\nimport Collapse from \"./collapse\";\nimport Datepicker from \"./datepicker\";\nimport Datetimepicker from \"./datetimepicker\";\nimport Dialog from \"./dialog\";\nimport Dropdown from \"./dropdown\";\nimport Field from \"./field\";\nimport Icon from \"./icon\";\nimport Input from \"./input\";\nimport Listbox from \"./listbox\";\nimport Loading from \"./loading\";\nimport Menu from \"./menu\";\nimport Modal from \"./modal\";\nimport Notification from \"./notification\";\nimport Pagination from \"./pagination\";\nimport Programmatic from \"./programmatic\";\nimport Radio from \"./radio\";\nimport Select from \"./select\";\nimport Skeleton from \"./skeleton\";\nimport Sidebar from \"./sidebar\";\nimport Slider from \"./slider\";\nimport Steps from \"./steps\";\nimport Switch from \"./switch\";\nimport Table from \"./table\";\nimport Tabs from \"./tabs\";\nimport Tag from \"./tag\";\nimport Taginput from \"./taginput\";\nimport Timepicker from \"./timepicker\";\nimport Tooltip from \"./tooltip\";\nimport Tree from \"./tree\";\nimport Upload from \"./upload\";\n\nexport {\n    Autocomplete,\n    Breadcrumb,\n    Button,\n    Carousel,\n    Checkbox,\n    Collapse,\n    Datepicker,\n    Datetimepicker,\n    Dialog,\n    Dropdown,\n    Field,\n    Icon,\n    Input,\n    Listbox,\n    Loading,\n    Menu,\n    Modal,\n    Notification,\n    Pagination,\n    Programmatic,\n    Radio,\n    Select,\n    Skeleton,\n    Sidebar,\n    Slider,\n    Steps,\n    Switch,\n    Table,\n    Tabs,\n    Tag,\n    Taginput,\n    Timepicker,\n    Tooltip,\n    Tree,\n    Upload,\n};\n","import { createOruga, type OrugaComponentPlugin } from \"./utils/config\";\n\n// export all types\nexport * from \"./types\";\nexport * from \"./components/types\";\n\n// export all vue components\nexport * from \"./components\";\n// export all components as vue plugins\nexport * from \"./components/plugins\";\n\n// export main oruga composables\nexport { createOruga, createTestingOruga, useOruga } from \"./utils/config\";\n\n// export programmatic composable\nexport { useConfigProgrammatic, type OrugaProgrammatic } from \"./utils/config\";\n\n// export useful helper functions\nexport * from \"./utils/helpers\";\n\n// export some useful composables functions\nexport {\n    findFocusable,\n    useTrapFocus,\n    useEventListener,\n    useClickOutside,\n    useDebounce,\n    unrefElement,\n} from \"./composables\";\n\nimport * as plugins from \"./components/plugins\";\nconst OrugaComponentPlugins = Object.values(plugins) as OrugaComponentPlugin[];\nexport { OrugaComponentPlugins };\n\n// default export main oruga vue plugin\nconst oruga = createOruga();\nexport default oruga;\n"],"mappings":"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"}