directix 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../packages/core/src/env.ts","../packages/core/src/adapter/vue2.ts","../packages/core/src/adapter/vue3.ts","../packages/core/src/define.ts","../packages/shared/src/dom.ts","../packages/shared/src/event.ts","../packages/shared/src/utils.ts","../src/directives/click-outside.ts","../src/directives/copy.ts","../src/directives/debounce.ts","../src/directives/throttle.ts","../src/directives/focus.ts","../src/directives/lazy.ts","../src/directives/intersect.ts","../src/directives/visible.ts","../src/directives/loading.ts","../src/directives/scroll.ts","../src/directives/infinite-scroll.ts","../src/directives/sticky.ts","../src/directives/long-press.ts","../src/directives/hover.ts","../src/directives/ripple.ts","../src/directives/mask.ts","../src/directives/permission.ts","../src/directives/sanitize.ts","../src/directives/resize.ts","../src/directives/mutation.ts","../src/index.ts"],"sourcesContent":["/**\n * Vue version type\n * - 2: Vue 2.6.x (requires @vue/composition-api for Composition API)\n * - 2.7: Vue 2.7.x (has built-in Composition API support)\n * - 3: Vue 3.x\n */\nexport type VueVersion = 2 | 2.7 | 3\n\n/**\n * Vue version detection\n */\nlet _vueVersion: VueVersion | null = null,\n\t_isVue2: boolean | null = null,\n\t_isVue27: boolean | null = null,\n\t_isVue3: boolean | null = null\n\n/**\n * Parse version string to VueVersion\n */\nfunction parseVersion(version: string): VueVersion | null {\n\tif (version.startsWith('2.7')) return 2.7\n\tif (version.startsWith('2')) return 2\n\tif (version.startsWith('3')) return 3\n\n\treturn null\n}\n\n/**\n * Get current Vue version\n */\nexport function getVueVersion(): VueVersion {\n\tif (_vueVersion !== null) return _vueVersion\n\n\t// Method 1: Check environment variable (highest priority)\n\tif (typeof process !== 'undefined') {\n\t\tconst envVersion = process.env.DIRECTIX_VUE_VERSION\n\n\t\tif (envVersion === '2.7') {\n\t\t\t_vueVersion = 2.7\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '2') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '3') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Method 2: Try require (CommonJS/Node.js)\n\ttry {\n\t\t// eslint-disable-next-line ts/no-require-imports\n\t\tconst vue = require('vue')\n\t\tconst version = parseVersion(vue?.version)\n\n\t\tif (version !== null) {\n\t\t\t_vueVersion = version\n\n\t\t\treturn _vueVersion\n\t\t}\n\t} catch {\n\t\t// require failed, continue to other methods\n\t}\n\n\t// Method 3: Check browser environment\n\tif (typeof window !== 'undefined') {\n\t\tconst win = window as any\n\t\tconst vue = win.Vue\n\n\t\t// Check version string\n\t\tif (vue?.version) {\n\t\t\tconst version = parseVersion(vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\n\t\t// Check Vue 2 specific API\n\t\tif (typeof vue?.observable === 'function') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check Vue 3 specific API\n\t\tif (typeof vue?.createApp === 'function' && typeof vue?.observable !== 'function') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check devtools hook\n\t\tconst devtools = win.__VUE_DEVTOOLS_GLOBAL_HOOK__\n\n\t\tif (devtools?.Vue?.version) {\n\t\t\tconst version = parseVersion(devtools.Vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\t\tif (devtools?.apps?.length) {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Default to Vue 3 but warn\n\tif (_vueVersion === null) {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tconsole.warn(\n\t\t\t\t'[Directix] Unable to detect Vue version, defaulting to Vue 3. ' +\n\t\t\t\t'Set DIRECTIX_VUE_VERSION=2 or call setVueVersion(2) if using Vue 2.',\n\t\t\t)\n\t\t}\n\t\t_vueVersion = 3\n\t}\n\n\treturn _vueVersion\n}\n\n/**\n * Set Vue version explicitly (for cases where auto-detection fails)\n */\nexport function setVueVersion(version: VueVersion): void {\n\t_vueVersion = version\n\t_isVue2 = version === 2 || version === 2.7\n\t_isVue27 = version === 2.7\n\t_isVue3 = version === 3\n}\n\n/**\n * Reset Vue version (useful for testing)\n */\nexport function resetVueVersion(): void {\n\t_vueVersion = null\n\t_isVue2 = null\n\t_isVue27 = null\n\t_isVue3 = null\n}\n\n/**\n * Check if Vue 2 (includes 2.7)\n */\nexport function isVue2(): boolean {\n\tif (_isVue2 === null) {\n\t\tconst version = getVueVersion()\n\n\t\t_isVue2 = version === 2 || version === 2.7\n\t}\n\n\treturn _isVue2\n}\n\n/**\n * Check if Vue 2.7 (has built-in Composition API support)\n */\nexport function isVue27(): boolean {\n\tif (_isVue27 === null) {\n\t\t_isVue27 = getVueVersion() === 2.7\n\t}\n\n\treturn _isVue27\n}\n\n/**\n * Check if Vue 3\n */\nexport function isVue3(): boolean {\n\tif (_isVue3 === null) {\n\t\t_isVue3 = getVueVersion() === 3\n\t}\n\n\treturn _isVue3\n}\n\n/**\n * Check if browser environment\n */\nexport const isBrowser = (): boolean => {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Check if server-side rendering\n */\nexport const isSSR = (): boolean => !isBrowser()\n\n/**\n * Check if passive event listening is supported\n */\nexport const supportsPassive = (): boolean => {\n\tif (!isBrowser()) return false\n\n\tlet supports = false\n\n\ttry {\n\t\tconst options = {\n\t\t\tget passive() {\n\t\t\t\tsupports = true\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t}\n\n\t\twindow.addEventListener('test', null as any, options)\n\t\twindow.removeEventListener('test', null as any, options as any)\n\t} catch {\n\t\tsupports = false\n\t}\n\n\treturn supports\n}\n\n/**\n * Check if IntersectionObserver is supported\n */\nexport const supportsIntersectionObserver = (): boolean => {\n\treturn isBrowser() && 'IntersectionObserver' in window\n}\n\n/**\n * Check if ResizeObserver is supported\n */\nexport const supportsResizeObserver = (): boolean => {\n\treturn isBrowser() && 'ResizeObserver' in window\n}\n\n/**\n * Check if Clipboard API is supported\n */\nexport const supportsClipboard = (): boolean => {\n\treturn isBrowser() && 'clipboard' in navigator\n}\n\n/**\n * Check if MutationObserver is supported\n */\nexport const supportsMutationObserver = (): boolean => {\n\treturn isBrowser() && 'MutationObserver' in window\n}\n","import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 2 directive adapter\n * @returns Vue 2 directive object with bind/inserted/update/unbind hooks\n */\nexport function createVue2Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tbind(el: B, binding: any, vnode: VNode) {\n\t\t\t// Store state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tinserted(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 2's inserted is called after element is inserted into DOM\n\t\t\t// Call mounted here to ensure element is in DOM\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tupdate(el: B, binding: any, vnode: VNode, oldVnode: VNode) {\n\t\t\tconst state = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBinding(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBinding({ ...binding, value: binding.oldValue }),\n\t\t\t\t\toldVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tcomponentUpdated(_el: B, _binding: any, _vnode: VNode, _oldVnode: VNode) {\n\t\t\t// Vue 2 specific, called after component update completes\n\t\t\t// Usually update is sufficient\n\t\t},\n\n\t\tunbind(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 2 binding to unified format\n */\nfunction normalizeBinding<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance || null,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 3 directive adapter\n * @returns Vue 3 directive object with created/mounted/updated/unmounted hooks\n */\nexport function createVue3Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tcreated(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 3's created is called when element is created\n\t\t\t// Initialize state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tbeforeMount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before mount\n\t\t},\n\n\t\tmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate(_el: B, _binding: any, _vnode: VNode, _prevVnode: VNode) {\n\t\t\t// Before update\n\t\t},\n\n\t\tupdated(el: B, binding: any, vnode: VNode, prevVnode: VNode) {\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBindingVue3(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBindingVue3({ ...binding, value: binding.oldValue }),\n\t\t\t\t\tprevVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tbeforeUnmount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before unmount\n\t\t},\n\n\t\tunmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 3 binding to unified format\n */\nfunction normalizeBindingVue3<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","import type { Directive } from 'vue'\nimport { getVueVersion, isSSR } from './env'\nimport { createVue2Directive } from './adapter/vue2'\nimport { createVue3Directive } from './adapter/vue3'\nimport type { DirectiveBinding, DirectiveDefinition, DirectiveHooks } from './types'\n\n/**\n * Define a cross-version compatible directive\n * @param definition The directive definition\n * @returns Vue directive object\n */\nexport function defineDirective<T = any, B extends Element = Element>(\n\tdefinition: DirectiveDefinition<T, B>,\n): Directive {\n\tconst { name, version, ssr, defaults, ...hooks } = definition\n\n\t// SSR check\n\tif (isSSR() && !ssr) {\n\t\tif (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'test') {\n\t\t\tconsole.warn(\n\t\t\t\t`[Directix] Directive \"${name}\" is not compatible with SSR. ` +\n\t\t\t\t'It will be a no-op on the server side.',\n\t\t\t)\n\t\t}\n\n\t\treturn createNoOpDirective()\n\t}\n\n\t// Wrap hooks with default values\n\tconst wrappedHooks: DirectiveHooks<T, B> = {\n\t\tmounted: hooks.mounted ? (el, binding, vnode) => {\n\t\t\thooks.mounted!(el, applyDefaults(binding, defaults), vnode)\n\t\t} : undefined,\n\n\t\tupdated: hooks.updated ? (el, binding, vnode, prevBinding, prevVnode) => {\n\t\t\thooks.updated!(el, applyDefaults(binding, defaults), vnode, prevBinding, prevVnode)\n\t\t} : undefined,\n\n\t\tunmounted: hooks.unmounted,\n\t}\n\n\t// Create a lazy directive that determines version at runtime\n\treturn createLazyDirective(wrappedHooks)\n}\n\n/**\n * Create a lazy directive that determines Vue version at first use\n */\nfunction createLazyDirective<T, B extends Element>(hooks: DirectiveHooks<T, B>): Directive {\n\tlet cachedDirective: any = null\n\n\t// Unified detection entry point\n\tfunction getDirective(): any {\n\t\tif (!cachedDirective) {\n\t\t\tcachedDirective = getVueVersion() === 2 ? createVue2Directive(hooks) : createVue3Directive(hooks)\n\t\t}\n\n\t\treturn cachedDirective\n\t}\n\n\t// Hook generator to reduce code duplication\n\tfunction createHook(hookName: string) {\n\t\treturn function (el: B, binding: any, vnode: any, prevVnode?: any) {\n\t\t\tgetDirective()[hookName]?.(el, binding, vnode, prevVnode)\n\t\t}\n\t}\n\n\treturn {\n\t\t// Vue 2 hooks\n\t\tbind: createHook('bind'),\n\t\tinserted: createHook('inserted'),\n\t\tupdate: createHook('update'),\n\t\tcomponentUpdated: createHook('componentUpdated'),\n\t\tunbind: createHook('unbind'),\n\t\t// Vue 3 hooks\n\t\tcreated: createHook('created'),\n\t\tbeforeMount: createHook('beforeMount'),\n\t\tmounted: createHook('mounted'),\n\t\tbeforeUpdate: createHook('beforeUpdate'),\n\t\tupdated: createHook('updated'),\n\t\tbeforeUnmount: createHook('beforeUnmount'),\n\t\tunmounted: createHook('unmounted'),\n\t} as Directive\n}\n\n/**\n * Apply default values to binding\n */\nfunction applyDefaults<T>(\n\tbinding: DirectiveBinding<T>,\n\tdefaults?: Partial<T>,\n): DirectiveBinding<T> {\n\tif (!defaults) return binding\n\n\tconst value =\n\t\ttypeof binding.value === 'object' && binding.value !== null ? { ...defaults, ...binding.value } : binding.value\n\n\treturn { ...binding, value: value as T }\n}\n\n/**\n * Create a no-op directive (for SSR)\n */\nfunction createNoOpDirective(): Directive {\n\treturn {\n\t\tmounted: () => {},\n\t\tupdated: () => {},\n\t\tunmounted: () => {},\n\t}\n}\n\n/**\n * Define a directive group\n */\nexport function defineDirectiveGroup(\n\tname: string,\n\tdirectives: Record<string, any>,\n): { name: string; directives: Record<string, any>; install: (app: any) => void } {\n\treturn {\n\t\tname,\n\t\tdirectives,\n\t\tinstall(app: any, _options?: any) {\n\t\t\tObject.entries(directives).forEach(([directiveName, directive]) => {\n\t\t\t\tconst fullName = `${name}-${directiveName}`\n\n\t\t\t\tapp.directive(fullName, directive)\n\t\t\t})\n\t\t},\n\t}\n}\n","import { isBrowser } from '@directix/core'\n\n/**\n * Check if value is an Element\n */\nexport function isElement(value: unknown): value is Element {\n\treturn value instanceof Element\n}\n\n/**\n * Check if value is an HTMLElement\n */\nexport function isHTMLElement(value: unknown): value is HTMLElement {\n\treturn value instanceof HTMLElement\n}\n\n/**\n * Get element by selector or return element itself\n */\nexport function getElement(target: string | Element | null | undefined): Element | null {\n\tif (!target) return null\n\n\tif (typeof target === 'string') {\n\t\tif (!isBrowser()) return null\n\n\t\treturn document.querySelector(target)\n\t}\n\n\treturn isElement(target) ? target : null\n}\n\n/**\n * Get all elements matching selector\n */\nexport function getAllElements(target: string): Element[] {\n\tif (!isBrowser()) return []\n\n\treturn Array.from(document.querySelectorAll(target))\n}\n\n/**\n * Add classes to element\n */\nexport function addClass(el: Element, ...classes: string[]): void {\n\tel.classList.add(...classes)\n}\n\n/**\n * Remove classes from element\n */\nexport function removeClass(el: Element, ...classes: string[]): void {\n\tel.classList.remove(...classes)\n}\n\n/**\n * Toggle class on element\n */\nexport function toggleClass(el: Element, className: string, force?: boolean): void {\n\tel.classList.toggle(className, force)\n}\n\n/**\n * Check if element has class\n */\nexport function hasClass(el: Element, className: string): boolean {\n\treturn el.classList.contains(className)\n}\n\n/**\n * Get element style property\n */\nexport function getStyle(el: Element, property: string): string {\n\tif (!isBrowser()) return ''\n\n\treturn getComputedStyle(el).getPropertyValue(property)\n}\n\n/**\n * Set element style property\n */\nexport function setStyle(el: HTMLElement, property: string, value: string | number): void {\n\tel.style.setProperty(property, typeof value === 'number' ? `${value}px` : value)\n}\n\n/**\n * Set multiple styles on element\n */\nexport function setStyles(el: HTMLElement, styles: Record<string, string | number>): void {\n\tObject.entries(styles).forEach(([property, value]) => {\n\t\tsetStyle(el, property, value)\n\t})\n}\n\n/**\n * Get element offset position\n */\nexport function getOffset(el: Element): { top: number; left: number } {\n\tif (!isBrowser()) return { top: 0, left: 0 }\n\tconst rect = el.getBoundingClientRect()\n\n\treturn {\n\t\ttop: rect.top + window.scrollY,\n\t\tleft: rect.left + window.scrollX,\n\t}\n}\n\n/**\n * Get element size\n */\nexport function getSize(el: Element): { width: number; height: number } {\n\tconst rect = el.getBoundingClientRect()\n\n\treturn {\n\t\twidth: rect.width,\n\t\theight: rect.height,\n\t}\n}\n\n/**\n * Check if element is in viewport\n */\nexport function isInViewport(el: Element): boolean {\n\tif (!isBrowser()) return false\n\tconst rect = el.getBoundingClientRect()\n\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t)\n}\n\n/**\n * Get nearest scrollable parent element\n */\nexport function getScrollParent(el: Element): Element | Window {\n\tif (!isBrowser()) return window\n\n\tlet parent: Element | null = el.parentElement\n\n\twhile (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\n\t\tparent = parent.parentElement\n\t}\n\n\treturn window\n}\n\n/**\n * Check if element matches selector\n */\nexport function matches(el: Element, selector: string): boolean {\n\treturn el.matches(selector)\n}\n\n/**\n * Get nearest ancestor matching selector\n */\nexport function closest(el: Element, selector: string): Element | null {\n\treturn el.closest(selector)\n}\n","import { isBrowser, supportsPassive } from '@directix/core'\n\nexport interface EventOptions {\n\tcapture?: boolean\n\tpassive?: boolean\n\tonce?: boolean\n}\n\n/**\n * Add event listener\n */\nexport function on(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: (event: Event) => void,\n\toptions: boolean | EventOptions = false,\n): void {\n\tif (!isBrowser()) return\n\tconst opts = normalizeOptions(options)\n\n\ttarget.addEventListener(event, handler, opts)\n}\n\n/**\n * Remove event listener\n */\nexport function off(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: (event: Event) => void,\n\toptions: boolean | EventOptions = false,\n): void {\n\tif (!isBrowser()) return\n\tconst opts = normalizeOptions(options)\n\n\ttarget.removeEventListener(event, handler, opts)\n}\n\n/**\n * Emit custom event\n */\nexport function emit(target: EventTarget, event: string, detail?: any): boolean {\n\tif (!isBrowser()) return false\n\n\treturn target.dispatchEvent(new CustomEvent(event, { detail }))\n}\n\n/**\n * Normalize event options\n */\nfunction normalizeOptions(options: boolean | EventOptions): boolean | { capture: boolean; passive: boolean; once: boolean } {\n\tif (typeof options === 'boolean') {\n\t\treturn options\n\t}\n\n\tconst { capture = false, passive = false, once = false } = options\n\n\tif (supportsPassive()) {\n\t\treturn { capture, passive, once }\n\t}\n\n\treturn capture\n}\n\n/**\n * Create event delegation\n */\nexport function delegate(\n\tcontainer: Element,\n\tselector: string,\n\tevent: string,\n\thandler: (el: Element, e: Event) => void,\n\toptions?: EventOptions,\n): () => void {\n\tconst listener = (e: Event): void => {\n\t\tconst target = e.target as Element\n\t\tconst matched = target.closest(selector)\n\n\t\tif (matched && container.contains(matched)) {\n\t\t\thandler(matched, e)\n\t\t}\n\t}\n\n\ton(container, event, listener, options)\n\n\treturn () => off(container, event, listener, options)\n}\n\n/**\n * Stop event propagation\n */\nexport function stopPropagation(e: Event): void {\n\te.stopPropagation()\n}\n\n/**\n * Prevent default behavior\n */\nexport function preventDefault(e: Event): void {\n\te.preventDefault()\n}\n\n/**\n * Stop event propagation and prevent default behavior\n */\nexport function stopEvent(e: Event): void {\n\tstopPropagation(e)\n\tpreventDefault(e)\n}\n\n/**\n * Get event target\n */\nexport function getEventTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.target as T | null\n}\n\n/**\n * Get current event target\n */\nexport function getCurrentTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.currentTarget as T | null\n}\n\n/**\n * Get mouse/touch position from event\n */\nexport function getEventPosition(\n\te: MouseEvent | TouchEvent,\n): { x: number; y: number; clientX: number; clientY: number } {\n\tlet clientX = 0,\n\t\tclientY = 0\n\n\tif ('touches' in e && e.touches.length > 0) {\n\t\tclientX = e.touches[0].clientX\n\t\tclientY = e.touches[0].clientY\n\t} else if ('clientX' in e) {\n\t\tclientX = e.clientX\n\t\tclientY = e.clientY\n\t}\n\n\treturn {\n\t\tx: clientX,\n\t\ty: clientY,\n\t\tclientX,\n\t\tclientY,\n\t}\n}\n","/**\n * Check if value is a string\n */\nexport function isString(value: unknown): value is string {\n\treturn typeof value === 'string'\n}\n\n/**\n * Check if value is a number\n */\nexport function isNumber(value: unknown): value is number {\n\treturn typeof value === 'number' && !Number.isNaN(value)\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n\treturn typeof value === 'boolean'\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n\treturn typeof value === 'function'\n}\n\n/**\n * Check if value is an object\n */\nexport function isObject(value: unknown): value is Record<string, any> {\n\treturn typeof value === 'object' && value !== null\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): value is any[] {\n\treturn Array.isArray(value)\n}\n\n/**\n * Check if value is empty\n */\nexport function isEmpty(value: unknown): boolean {\n\tif (value === null || value === undefined) return true\n\tif (isString(value) || isArray(value)) return value.length === 0\n\tif (isObject(value)) return Object.keys(value).length === 0\n\n\treturn false\n}\n\n/**\n * Check if value is a Promise\n */\nexport function isPromise<T = any>(value: unknown): value is Promise<T> {\n\treturn isObject(value) && isFunction((value as any).then)\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n\tif (obj === null || typeof obj !== 'object') {\n\t\treturn obj\n\t}\n\n\tif (Array.isArray(obj)) {\n\t\treturn obj.map(item => deepClone(item)) as unknown as T\n\t}\n\n\tconst cloned = {} as T\n\n\tfor (const key in obj) {\n\t\tif (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t\t\tcloned[key] = deepClone(obj[key])\n\t\t}\n\t}\n\n\treturn cloned\n}\n\n/**\n * Deep merge objects\n */\nexport function deepMerge<T extends Record<string, any>>(\n\ttarget: T,\n\t...sources: Partial<T>[]\n): T {\n\tif (!sources.length) return target\n\n\tconst source = sources.shift()\n\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\tObject.assign(target, { [key]: {} })\n\t\t\t\t}\n\t\t\t\tdeepMerge(\n\t\t\t\t\ttarget[key] as Record<string, any>,\n\t\t\t\t\tsource[key] as Record<string, any>,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tObject.assign(target, { [key]: source[key] })\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deepMerge(target, ...sources)\n}\n\n/**\n * Get nested property value by path\n */\nexport function get<T = any>(\n\tobj: Record<string, any>,\n\tpath: string,\n\tdefaultValue?: T,\n): T {\n\tconst keys = path.split('.')\n\tlet result: any = obj\n\n\tfor (const key of keys) {\n\t\tif (result === null || result === undefined) {\n\t\t\treturn defaultValue as T\n\t\t}\n\t\tresult = result[key]\n\t}\n\n\treturn (result === undefined ? defaultValue : result) as T\n}\n\n/**\n * Set nested property value by path\n */\nexport function set(obj: Record<string, any>, path: string, value: any): void {\n\tconst keys = path.split('.')\n\tconst lastKey = keys.pop()!\n\tlet current = obj\n\n\tfor (const key of keys) {\n\t\tif (current[key] === undefined) {\n\t\t\tcurrent[key] = {}\n\t\t}\n\t\tcurrent = current[key]\n\t}\n\n\tcurrent[lastKey] = value\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean; trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void; flush: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null\n\n\tconst { leading = false, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst debounced = function (this: any, ...args: Parameters<T>): void {\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t}\n\n\t\tif (leading && !timerId) {\n\t\t\tinvokeFunc()\n\t\t}\n\n\t\ttimerId = setTimeout(() => {\n\t\t\tif (trailing) {\n\t\t\t\tinvokeFunc()\n\t\t\t}\n\t\t\ttimerId = null\n\t\t}, wait)\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void; flush: () => void }\n\n\tdebounced.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\tdebounced.flush = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\tinvokeFunc()\n\t\t\ttimerId = null\n\t\t}\n\t}\n\n\treturn debounced\n}\n\n/**\n * Throttle function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean; trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null,\n\t\tlastCallTime = 0\n\n\tconst { leading = true, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst throttled = function (this: any, ...args: Parameters<T>): void {\n\t\tconst now = Date.now()\n\n\t\tif (!lastCallTime && !leading) {\n\t\t\tlastCallTime = now\n\t\t}\n\n\t\tconst remaining = wait - (now - lastCallTime)\n\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (remaining <= 0 || remaining > wait) {\n\t\t\tif (timerId) {\n\t\t\t\tclearTimeout(timerId)\n\t\t\t\ttimerId = null\n\t\t\t}\n\t\t\tlastCallTime = now\n\t\t\tinvokeFunc()\n\t\t} else if (!timerId && trailing) {\n\t\t\ttimerId = setTimeout(() => {\n\t\t\t\tlastCallTime = leading ? Date.now() : 0\n\t\t\t\ttimerId = null\n\t\t\t\tinvokeFunc()\n\t\t\t}, remaining)\n\t\t}\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void }\n\n\tthrottled.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastCallTime = 0\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\treturn throttled\n}\n\n/**\n * Parse time argument\n * Supports formats: \"300\" | \"300ms\" | \"1s\"\n */\nexport function parseTime(arg?: string): number | null {\n\tif (!arg) return null\n\n\tif (arg.endsWith('ms')) {\n\t\treturn Number.parseInt(arg, 10)\n\t}\n\n\tif (arg.endsWith('s')) {\n\t\treturn Number.parseFloat(arg) * 1000\n\t}\n\n\tconst num = Number.parseInt(arg, 10)\n\n\treturn Number.isNaN(num) ? null : num\n}\n\n/**\n * Generate unique ID\n */\nexport function generateId(prefix: string = ''): string {\n\treturn `${prefix}${Date.now().toString(36)}${Math.random().toString(36).slice(2, 9)}`\n}\n","import { defineDirective } from '@directix/core'\nimport { getElement, off, on } from '@directix/shared'\n\n/**\n * Click outside handler\n */\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click outside directive options\n */\nexport interface ClickOutsideOptions {\n\t/**\n * Callback when clicking outside\n * @required\n */\n\thandler: ClickOutsideHandler\n\n\t/**\n * Excluded element selectors or element references\n */\n\texclude?: (string | HTMLElement | (() => HTMLElement | null))[]\n\n\t/**\n * Whether to use capture mode\n * @default true\n */\n\tcapture?: boolean\n\n\t/**\n * Event types to listen for\n * @default ['click']\n */\n\tevents?: ('click' | 'mousedown' | 'mouseup' | 'touchstart' | 'touchend')[]\n\n\t/**\n * Whether to disable\n * @default false\n */\n\tdisabled?: boolean\n\n\t/**\n * Stop propagation\n * @default false\n */\n\tstop?: boolean\n\n\t/**\n * Prevent default behavior\n * @default false\n */\n\tprevent?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickOutsideBinding = ClickOutsideHandler | ClickOutsideOptions\n\n/**\n * Element state storage\n */\ninterface ClickOutsideState {\n\toptions: ClickOutsideOptions\n\thandlers: Map<string, (event: Event) => void>\n}\n\n/**\n * v-click-outside directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-click-outside=\"handleClickOutside\">\n * Dropdown menu\n * </div>\n * </template>\n * ```\n */\nexport const vClickOutside = defineDirective<ClickOutsideBinding, HTMLElement>({\n\tname: 'click-outside',\n\tssr: false,\n\tdefaults: {\n\t\tcapture: true,\n\t\tevents: ['click'],\n\t\tdisabled: false,\n\t\tstop: false,\n\t\tprevent: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickOutsideState = {\n\t\t\toptions,\n\t\t\thandlers: new Map(),\n\t\t}\n\n ;(el as any).__clickOutside = state\n\n\t\t// Create event handler\n\t\tconst createHandler = (_eventType: string) => {\n\t\t\treturn (event: Event) => {\n\t\t\t\t// Check event target\n\t\t\t\tif (!isValidClick(el, event, options)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Stop propagation\n\t\t\t\tif (options.stop) {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t}\n\n\t\t\t\t// Prevent default behavior\n\t\t\t\tif (options.prevent) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\n\t\t\t\t// Call handler\n\t\t\t\toptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t}\n\t\t}\n\n\t\t// Bind events\n\t\toptions.events!.forEach(eventType => {\n\t\t\tconst handler = createHandler(eventType)\n\n\t\t\tstate.handlers.set(eventType, handler)\n\n\t\t\tconst listenerOptions = {\n\t\t\t\tcapture: options.capture,\n\t\t\t\tpassive: !options.prevent,\n\t\t\t}\n\n\t\t\ton(document, eventType, handler, listenerOptions)\n\t\t})\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\tconst oldOptions = state.options\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// If disabled state changes\n\t\tif (oldOptions.disabled !== newOptions.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\t// Remove all listeners\n\t\t\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\t\t\toff(document, eventType, handler, { capture: oldOptions.capture })\n\t\t\t\t})\n\t\t\t\tstate.handlers.clear()\n\t\t\t} else {\n\t\t\t\t// Re-add listeners\n\t\t\t\tconst createHandler = (_eventType: string) => {\n\t\t\t\t\treturn (event: Event) => {\n\t\t\t\t\t\tif (!isValidClick(el, event, newOptions)) return\n\t\t\t\t\t\tif (newOptions.stop) event.stopPropagation()\n\t\t\t\t\t\tif (newOptions.prevent) event.preventDefault()\n\t\t\t\t\t\tnewOptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewOptions.events!.forEach(eventType => {\n\t\t\t\t\tconst handler = createHandler(eventType)\n\n\t\t\t\t\tstate.handlers.set(eventType, handler)\n\t\t\t\t\ton(document, eventType, handler, {\n\t\t\t\t\t\tcapture: newOptions.capture,\n\t\t\t\t\t\tpassive: !newOptions.prevent,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\t// Remove all event listeners\n\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\toff(document, eventType, handler, { capture: state.options.capture })\n\t\t})\n\n\t\tdelete (el as any).__clickOutside\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ClickOutsideBinding | undefined): ClickOutsideOptions {\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tcapture: true,\n\t\t\tevents: ['click'],\n\t\t\tdisabled: false,\n\t\t\tstop: false,\n\t\t\tprevent: false,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-outside: handler is required')\n\t}\n\n\treturn {\n\t\tcapture: binding.capture ?? true,\n\t\tevents: binding.events ?? ['click'],\n\t\tdisabled: binding.disabled ?? false,\n\t\tstop: binding.stop ?? false,\n\t\tprevent: binding.prevent ?? false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if click is valid (outside the element)\n */\nfunction isValidClick(\n\tel: HTMLElement,\n\tevent: Event,\n\toptions: ClickOutsideOptions,\n): boolean {\n\tconst target = event.target as Node\n\n\t// Check if clicked on element itself or its children\n\tif (el.contains(target)) {\n\t\treturn false\n\t}\n\n\t// Check excluded elements\n\tif (options.exclude?.length) {\n\t\tfor (const exclude of options.exclude) {\n\t\t\tconst excludeEl = typeof exclude === 'function' ? exclude() : getElement(exclude)\n\n\t\t\tif (excludeEl && (excludeEl === target || excludeEl.contains(target))) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\nexport default vClickOutside\n","import { defineDirective, supportsClipboard } from '@directix/core'\n\n/**\n * Copy success callback\n */\nexport type CopySuccessCallback = (text: string) => void\n\n/**\n * Copy error callback\n */\nexport type CopyErrorCallback = (error: Error) => void\n\n/**\n * Copy directive options\n */\nexport interface CopyOptions {\n\t/**\n * Text to copy\n * @required\n */\n\tvalue: string\n\n\t/**\n * Callback on copy success\n */\n\tonSuccess?: CopySuccessCallback\n\n\t/**\n * Callback on copy error\n */\n\tonError?: CopyErrorCallback\n\n\t/**\n * Tooltip text for the copy button\n */\n\ttitle?: string\n\n\t/**\n * Whether to disable\n * @default false\n */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CopyBinding = string | CopyOptions\n\n/**\n * Element state storage\n */\ninterface CopyState {\n\thandler: () => void\n\toptions: CopyOptions\n}\n\n/**\n * Copy text to clipboard\n * Prefer Clipboard API, fallback to execCommand\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n\t// Method 1: Use Clipboard API\n\tif (supportsClipboard()) {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text)\n\n\t\t\treturn true\n\t\t} catch {\n\t\t\t// Permission denied or other error, fallback\n\t\t\tconsole.warn('[Directix] Clipboard API failed, falling back to execCommand')\n\t\t}\n\t}\n\n\t// Method 2: Use execCommand (deprecated but has good compatibility)\n\treturn copyWithExecCommand(text)\n}\n\n/**\n * Copy using execCommand\n */\nfunction copyWithExecCommand(text: string): boolean {\n\t// Create temporary textarea\n\tconst textarea = document.createElement('textarea')\n\n\ttextarea.value = text\n\n\t// Set styles to make it invisible\n\ttextarea.style.cssText = `\n position: fixed;\n top: -9999px;\n left: -9999px;\n opacity: 0;\n pointer-events: none;\n `\n\n\tdocument.body.appendChild(textarea)\n\n\ttry {\n\t\t// Select and copy\n\t\ttextarea.select()\n\t\ttextarea.setSelectionRange(0, textarea.value.length)\n\n\t\treturn document.execCommand('copy')\n\t} catch {\n\t\treturn false\n\t} finally {\n\t\t// Cleanup\n\t\tdocument.body.removeChild(textarea)\n\t}\n}\n\n/**\n * v-copy directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-copy=\"textToCopy\">Copy Text</button>\n * </template>\n * ```\n */\nexport const vCopy = defineDirective<CopyBinding, HTMLElement>({\n\tname: 'copy',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Set tooltip\n\t\tif (options.title) {\n\t\t\tel.setAttribute('title', options.title)\n\t\t}\n\n\t\t// State storage - handler reads latest value from here\n\t\tconst state: CopyState = {\n\t\t\thandler: null as any,\n\t\t\toptions,\n\t\t}\n\n\t\t// Add click event - read latest options from state\n\t\tstate.handler = async () => {\n\t\t\tconst text = state.options.value\n\n\t\t\tif (!text) {\n\t\t\t\tconsole.warn('[Directix] v-copy: No text to copy')\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst success = await copyToClipboard(text)\n\n\t\t\t\tif (success) {\n\t\t\t\t\tstate.options.onSuccess?.(text)\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('copy:success', { detail: { text } }))\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Copy failed')\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err as Error\n\n\t\t\t\tstate.options.onError?.(error)\n\t\t\t\tel.dispatchEvent(new CustomEvent('copy:error', { detail: { error } }))\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('click', state.handler)\n\t\t;(el as any).__copy = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.title) {\n\t\t\tel.setAttribute('title', state.options.title)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tdelete (el as any).__copy\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CopyBinding): CopyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\nexport default vCopy\n","import { defineDirective } from '@directix/core'\nimport { debounce, parseTime } from '@directix/shared'\nimport type { DirectiveBinding } from '@directix/core'\n\n/**\n * Debounced function type\n */\nexport interface DebouncedFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n\tflush: () => void\n}\n\n/**\n * Debounce directive options\n */\nexport interface DebounceOptions<T extends (...args: any[]) => any = any> {\n\t/**\n * Function to debounce\n */\n\thandler: T\n\n\t/**\n * Delay time in milliseconds\n * @default 300\n */\n\twait?: number\n\n\t/**\n * Whether to invoke immediately before delay starts\n * @default false\n */\n\tleading?: boolean\n\n\t/**\n * Whether to invoke after delay ends\n * @default true\n */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type DebounceBinding<T extends (...args: any[]) => any = any> =\n | T\n | DebounceOptions<T>\n\n/**\n * Element state storage\n */\ninterface DebounceState {\n\tdebouncedFn: DebouncedFunction<any>\n\teventType: string\n\toptions: DebounceOptions\n}\n\n/**\n * v-debounce directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-debounce=\"handleInput\" />\n * <input v-debounce:500ms=\"handleInput\" />\n * <input v-debounce=\"{ handler: handleInput, wait: 500 }\" />\n * <div v-debounce.scroll=\"handleScroll\">Scroll Debounce</div>\n * <div v-debounce:100.scroll=\"handleScroll\">100ms Scroll Debounce</div>\n * </template>\n * ```\n */\nexport const vDebounce = defineDirective<DebounceBinding, HTMLElement>({\n\tname: 'debounce',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: false,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getEventType(el)\n\n\t\t// Create debounced function\n\t\tconst debouncedFn = debounce(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, debouncedFn as any)\n\n\t\t;(el as any).__debounce = {\n\t\t\tdebouncedFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate debounced function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait ||\n\t\t\tnewOptions.leading !== state.options.leading ||\n\t\t\tnewOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.debouncedFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst debouncedFn = debounce(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\t\tel.addEventListener(state.eventType, debouncedFn as any)\n\n\t\t\t;(el as any).__debounce = {\n\t\t\t\tdebouncedFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tstate.debouncedFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\tdelete (el as any).__debounce\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: DebounceBinding,\n\tdirectiveBinding: DirectiveBinding<DebounceBinding>,\n): DebounceOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * Get default event type for element\n */\nfunction getEventType(el: HTMLElement): string {\n\tconst tagName = el.tagName.toLowerCase()\n\n\tif (tagName === 'input' || tagName === 'textarea') {\n\t\treturn 'input'\n\t}\n\n\treturn 'click'\n}\n\n/**\n * Supported event type modifiers list\n */\nconst EVENT_MODIFIERS = [\n\t'click',\n\t'input',\n\t'change',\n\t'submit',\n\t'scroll',\n\t'resize',\n\t'mouseenter',\n\t'mouseleave',\n\t'mousemove',\n\t'mousedown',\n\t'mouseup',\n\t'keydown',\n\t'keyup',\n\t'focus',\n\t'blur',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n] as const\n\n/**\n * Extract event type from modifiers\n */\nfunction getEventTypeFromModifiers(modifiers: Record<string, boolean>): string | null {\n\tfor (const modifier of EVENT_MODIFIERS) {\n\t\tif (modifiers[modifier]) {\n\t\t\treturn modifier\n\t\t}\n\t}\n\n\treturn null\n}\n\nexport default vDebounce\n","import { defineDirective } from '@directix/core'\nimport { parseTime, throttle } from '@directix/shared'\nimport type { DirectiveBinding } from '@directix/core'\n\n/**\n * Throttled function type\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n}\n\n/**\n * Throttle directive options\n */\nexport interface ThrottleOptions<T extends (...args: any[]) => any = any> {\n\t/**\n * Function to throttle\n */\n\thandler: T\n\n\t/**\n * Delay time in milliseconds\n * @default 300\n */\n\twait?: number\n\n\t/**\n * Whether to invoke immediately before delay starts\n * @default true\n */\n\tleading?: boolean\n\n\t/**\n * Whether to invoke after delay ends\n * @default true\n */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ThrottleBinding<T extends (...args: any[]) => any = any> =\n | T\n | ThrottleOptions<T>\n\n/**\n * Element state storage\n */\ninterface ThrottleState {\n\tthrottledFn: ThrottledFunction<any>\n\teventType: string\n\toptions: ThrottleOptions\n}\n\n/**\n * v-throttle directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-throttle=\"handleClick\">Throttled Button</button>\n * <button v-throttle:1s=\"handleClick\">1s Throttled</button>\n * <div v-throttle.scroll=\"handleScroll\">Scroll Throttle</div>\n * <div v-throttle:100.scroll=\"handleScroll\">100ms Scroll Throttle</div>\n * </template>\n * ```\n */\nexport const vThrottle = defineDirective<ThrottleBinding, HTMLElement>({\n\tname: 'throttle',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: true,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getEventType(el)\n\n\t\t// Create throttled function\n\t\tconst throttledFn = throttle(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, throttledFn as any)\n\n\t\t;(el as any).__throttle = {\n\t\t\tthrottledFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate throttled function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait ||\n\t\t\tnewOptions.leading !== state.options.leading ||\n\t\t\tnewOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.throttledFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst throttledFn = throttle(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\t\tel.addEventListener(state.eventType, throttledFn as any)\n\n\t\t\t;(el as any).__throttle = {\n\t\t\t\tthrottledFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tstate.throttledFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\tdelete (el as any).__throttle\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ThrottleBinding,\n\tdirectiveBinding: DirectiveBinding<ThrottleBinding>,\n): ThrottleOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * Get default event type for element\n */\nfunction getEventType(el: HTMLElement): string {\n\tconst tagName = el.tagName.toLowerCase()\n\n\tif (tagName === 'input' || tagName === 'textarea') {\n\t\treturn 'input'\n\t}\n\n\treturn 'click'\n}\n\n/**\n * Supported event type modifiers list\n */\nconst EVENT_MODIFIERS = [\n\t'click',\n\t'input',\n\t'change',\n\t'submit',\n\t'scroll',\n\t'resize',\n\t'mouseenter',\n\t'mouseleave',\n\t'mousemove',\n\t'mousedown',\n\t'mouseup',\n\t'keydown',\n\t'keyup',\n\t'focus',\n\t'blur',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n] as const\n\n/**\n * Extract event type from modifiers\n */\nfunction getEventTypeFromModifiers(modifiers: Record<string, boolean>): string | null {\n\tfor (const modifier of EVENT_MODIFIERS) {\n\t\tif (modifiers[modifier]) {\n\t\t\treturn modifier\n\t\t}\n\t}\n\n\treturn null\n}\n\nexport default vThrottle\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Focus directive options\n */\nexport interface FocusOptions {\n\t/**\n\t * Whether to auto focus\n\t * @default true\n\t */\n\tfocus?: boolean\n\n\t/**\n\t * Whether to refocus when binding value changes\n\t * @default false\n\t */\n\trefocus?: boolean\n\n\t/**\n\t * Callback when focused\n\t */\n\tonFocus?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when blurred\n\t */\n\tonBlur?: (el: HTMLElement) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type FocusBinding = boolean | FocusOptions\n\n/**\n * Element state storage\n */\ninterface FocusState {\n\toptions: FocusOptions\n\thandleFocus: () => void\n\thandleBlur: () => void\n\tlastValue: FocusBinding\n}\n\nconst FOCUSABLE_TAGS = new Set(['input', 'textarea', 'select', 'button'])\n\n/**\n * Compare two values for equality (supports primitive types and shallow object comparison)\n */\nfunction isEqual(a: unknown, b: unknown): boolean {\n\tif (a === b) return true\n\tif (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n\tconst objA = a as Record<string, unknown>\n\tconst objB = b as Record<string, unknown>\n\tconst keysA = Object.keys(objA)\n\tconst keysB = Object.keys(objB)\n\n\tif (keysA.length !== keysB.length) return false\n\n\treturn keysA.every(key => objA[key] === objB[key])\n}\n\n/**\n * v-focus directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-focus />\n * <input v-focus=\"{ focus: true, refocus: true }\" />\n * </template>\n * ```\n */\nexport const vFocus = defineDirective<FocusBinding, HTMLElement>({\n\tname: 'focus',\n\tssr: true, // SSR safe - will skip focus on server\n\tdefaults: {\n\t\tfocus: true,\n\t\trefocus: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.focus || !isFocusable(el)) {\n\t\t\tif (options.focus) {\n\t\t\t\tconsole.warn('[Directix] v-focus: Element is not focusable')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst handleFocus = (): void => options.onFocus?.(el)\n\t\tconst handleBlur = (): void => options.onBlur?.(el)\n\n\t\tel.addEventListener('focus', handleFocus)\n\t\tel.addEventListener('blur', handleBlur)\n\n\t\t;(el as any).__focus = {\n\t\t\toptions,\n\t\t\thandleFocus,\n\t\t\thandleBlur,\n\t\t\tlastValue: binding.value,\n\t\t} as FocusState\n\n\t\tel.focus()\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Update event listeners only when callbacks change\n\t\tif (newOptions.onFocus !== state.options.onFocus) {\n\t\t\tel.removeEventListener('focus', state.handleFocus)\n\t\t\tstate.handleFocus = () => newOptions.onFocus?.(el)\n\t\t\tel.addEventListener('focus', state.handleFocus)\n\t\t}\n\n\t\tif (newOptions.onBlur !== state.options.onBlur) {\n\t\t\tel.removeEventListener('blur', state.handleBlur)\n\t\t\tstate.handleBlur = () => newOptions.onBlur?.(el)\n\t\t\tel.addEventListener('blur', state.handleBlur)\n\t\t}\n\n\t\t// Check if value actually changed\n\t\tconst valueChanged = !isEqual(binding.value, state.lastValue)\n\n\t\t// Refocus when value changes and refocus is enabled\n\t\tif (newOptions.refocus && newOptions.focus && valueChanged) {\n\t\t\tel.focus()\n\t\t}\n\n\t\tstate.options = newOptions\n\t\tstate.lastValue = binding.value\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('focus', state.handleFocus)\n\t\tel.removeEventListener('blur', state.handleBlur)\n\t\tdelete (el as any).__focus\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FocusBinding | undefined): FocusOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { focus: binding, refocus: false }\n\t}\n\n\treturn {\n\t\tfocus: true,\n\t\trefocus: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if element is focusable\n */\nfunction isFocusable(el: HTMLElement): boolean {\n\tif (!isBrowser()) return false\n\n\tconst tagName = el.tagName.toLowerCase()\n\n\t// Form elements\n\tif (FOCUSABLE_TAGS.has(tagName)) {\n\t\treturn !(el as HTMLInputElement).disabled\n\t}\n\n\t// Contenteditable elements\n\tif (el.isContentEditable) return true\n\n\t// Elements with tabindex\n\tconst tabindex = el.getAttribute('tabindex')\n\n\tif (tabindex != null) return tabindex !== '-1'\n\n\t// Link elements\n\tif (tagName === 'a' || tagName === 'area') {\n\t\treturn el.hasAttribute('href')\n\t}\n\n\treturn false\n}\n\nexport default vFocus\n","import { defineDirective, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Lazy loading state\n */\nexport type LazyState = 'pending' | 'loading' | 'loaded' | 'error'\n\n/**\n * Lazy directive options\n */\nexport interface LazyOptions {\n\t/**\n\t * Image source URL\n\t */\n\tsrc?: string\n\n\t/**\n\t * Placeholder image URL\n\t */\n\tplaceholder?: string\n\n\t/**\n\t * Error image URL (shown when loading fails)\n\t */\n\terror?: string\n\n\t/**\n\t * Preload distance in pixels\n\t * @default 0\n\t */\n\tpreload?: number\n\n\t/**\n\t * Callback when image loads successfully\n\t */\n\tonLoad?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when image fails to load\n\t */\n\tonError?: (el: HTMLElement, error: Error) => void\n\n\t/**\n\t * Number of retry attempts\n\t * @default 1\n\t */\n\tattempt?: number\n\n\t/**\n\t * Filter function, return false to skip loading\n\t */\n\tfilter?: (src: string) => boolean\n\n\t/**\n\t * Custom IntersectionObserver\n\t */\n\tobserver?: IntersectionObserver\n\n\t/**\n\t * Whether to disable lazy loading\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LazyBinding = string | LazyOptions\n\n/**\n * Element state storage\n */\ninterface LazyElementState {\n\toptions: LazyOptions\n\tattempt: number\n\tobserver?: IntersectionObserver\n}\n\n// Global observer instance\nlet globalObserver: IntersectionObserver | null = null\n\n/**\n * Get or create global IntersectionObserver\n */\nfunction getGlobalObserver(preload: number): IntersectionObserver {\n\tif (globalObserver) return globalObserver\n\n\tglobalObserver = new IntersectionObserver(\n\t\tentries => {\n\t\t\tentries.forEach(entry => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tload(entry.target as HTMLElement)\n\t\t\t\t\tglobalObserver?.unobserve(entry.target)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\trootMargin: `${preload}px`,\n\t\t},\n\t)\n\n\treturn globalObserver\n}\n\n/**\n * Set image source on element\n */\nfunction setSrc(el: HTMLElement, src: string): void {\n\tif (el.tagName === 'IMG') {\n\t\t;(el as HTMLImageElement).src = src\n\t} else {\n\t\tel.style.backgroundImage = `url(\"${src}\")`\n\t}\n}\n\n/**\n * Set lazy state on element\n */\nfunction setLazyState(el: HTMLElement, state: LazyState): void {\n\tel.dataset.lazyState = state\n}\n\n/**\n * Get lazy state from element\n */\nfunction getLazyState(el: HTMLElement): LazyState {\n\treturn (el.dataset.lazyState as LazyState) || 'pending'\n}\n\n/**\n * Load image\n */\nfunction load(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state || !state.options.src) return\n\n\t// Filter check\n\tif (state.options.filter && !state.options.filter(state.options.src)) {\n\t\treturn\n\t}\n\n\tsetLazyState(el, 'loading')\n\tstate.attempt++\n\n\tel.classList.add('v-lazy--loading')\n\n\tconst img = new Image()\n\n\timg.onload = () => {\n\t\tsetSrc(el, state.options.src!)\n\t\tsetLazyState(el, 'loaded')\n\t\tel.classList.remove('v-lazy--loading')\n\t\tel.classList.add('v-lazy--loaded')\n\t\tstate.options.onLoad?.(el)\n\t}\n\n\timg.onerror = () => {\n\t\tel.classList.remove('v-lazy--loading')\n\n\t\t// Check if should retry\n\t\tif (state.attempt < (state.options.attempt || 1)) {\n\t\t\tsetTimeout(() => load(el), 1000 * state.attempt)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Show error image\n\t\tif (state.options.error) {\n\t\t\tsetSrc(el, state.options.error)\n\t\t}\n\n\t\tsetLazyState(el, 'error')\n\t\tel.classList.add('v-lazy--error')\n\t\tstate.options.onError?.(el, new Error('Failed to load image'))\n\t}\n\n\timg.src = state.options.src\n}\n\n/**\n * Observe element\n */\nfunction observe(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\t// Check IntersectionObserver support\n\tif (!supportsIntersectionObserver()) {\n\t\t// Fallback: load directly\n\t\tload(el)\n\n\t\treturn\n\t}\n\n\t// Use custom observer or global observer\n\tif (state.options.observer) {\n\t\tstate.observer = state.options.observer\n\t\tstate.observer.observe(el)\n\t} else {\n\t\tconst observer = getGlobalObserver(state.options.preload || 0)\n\n\t\tstate.observer = observer\n\t\tobserver.observe(el)\n\t}\n}\n\n/**\n * Unobserve element\n */\nfunction unobserve(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\tif (state.observer) {\n\t\tstate.observer.unobserve(el)\n\t} else if (globalObserver) {\n\t\tglobalObserver.unobserve(el)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LazyBinding | undefined): LazyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { src: binding }\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * v-lazy directive\n *\n * @example\n * ```vue\n * <template>\n * <img v-lazy=\"imageUrl\" />\n * <img v-lazy=\"{ src: imageUrl, placeholder: 'placeholder.jpg' }\" />\n * <div v-lazy=\"backgroundImageUrl\"></div>\n * </template>\n * ```\n */\nexport const vLazy = defineDirective<LazyBinding, HTMLElement>({\n\tname: 'lazy',\n\tssr: false,\n\tdefaults: {\n\t\tpreload: 0,\n\t\tattempt: 1,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tif (!options.src) {\n\t\t\tconsole.warn('[Directix] v-lazy: No source provided')\n\n\t\t\treturn\n\t\t}\n\n\t\t// Set initial state\n\t\tsetLazyState(el, 'pending')\n\n\t\t// Set placeholder\n\t\tif (options.placeholder) {\n\t\t\tsetSrc(el, options.placeholder)\n\t\t}\n\n\t\t// Add class\n\t\tel.classList.add('v-lazy')\n\n\t\t// Store state\n\t\tconst state: LazyElementState = {\n\t\t\toptions,\n\t\t\tattempt: 0,\n\t\t}\n\n\t\t;(el as any).__lazy = state\n\n\t\t// Start observing\n\t\tobserve(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LazyElementState = (el as any).__lazy\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\tunobserve(el)\n\n\t\t\treturn\n\t\t}\n\n\t\tif (newOptions.src !== state.options.src) {\n\t\t\tstate.options = newOptions\n\t\t\tstate.attempt = 0\n\n\t\t\t// If already loaded, reload\n\t\t\tif (getLazyState(el) !== 'pending') {\n\t\t\t\tsetLazyState(el, 'pending')\n\t\t\t\tel.classList.remove('v-lazy--loaded', 'v-lazy--error')\n\n\t\t\t\tif (newOptions.placeholder) {\n\t\t\t\t\tsetSrc(el, newOptions.placeholder)\n\t\t\t\t}\n\n\t\t\t\tobserve(el)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tunobserve(el)\n\t\tdelete (el as any).__lazy\n\t},\n})\n\nexport default vLazy\n","import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Intersect event handler\n */\nexport type IntersectHandler = (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\n/**\n * Intersect directive options\n */\nexport interface IntersectOptions {\n\t/** Callback when element intersects */\n\thandler?: IntersectHandler\n\t/** Callback when element enters viewport */\n\tonEnter?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element leaves viewport */\n\tonLeave?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element changes intersection */\n\tonChange?: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void\n\t/** Root element for intersection @default null (viewport) */\n\troot?: Element | null\n\t/** Margin around the root @default '0px' */\n\trootMargin?: string\n\t/** Threshold(s) at which to trigger callback @default 0 */\n\tthreshold?: number | number[]\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Whether to trigger only once @default false */\n\tonce?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type IntersectBinding = IntersectHandler | IntersectOptions\n\n/**\n * Element state storage\n */\ninterface IntersectState {\n\toptions: IntersectOptions\n\tobserver: IntersectionObserver | null\n\thasTriggeredOnce: boolean\n}\n\nconst STATE_KEY = '__intersect'\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: IntersectBinding | undefined): IntersectOptions {\n\tconst options: IntersectOptions = typeof binding === 'function' ? { handler: binding } : { ...binding }\n\n\t// Unref root if it's a ref object (for Vue Composition API)\n\tif (options.root !== null && typeof options.root === 'object' && 'value' in options.root) {\n\t\toptions.root = (options.root as { value: Element | null }).value\n\t}\n\n\treturn options\n}\n\n/**\n * Create observer callback\n */\nfunction createObserverCallback(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): (entries: IntersectionObserverEntry[]) => void {\n\treturn entries => {\n\t\tfor (const entry of entries) {\n\t\t\tif (options.once && state.hasTriggeredOnce) continue\n\n\t\t\tconst { isIntersecting } = entry\n\n\t\t\toptions.handler?.(entry, state.observer!)\n\t\t\toptions.onChange?.(isIntersecting, entry)\n\n\t\t\tif (isIntersecting) {\n\t\t\t\toptions.onEnter?.(entry, state.observer!)\n\t\t\t\tif (options.once) state.hasTriggeredOnce = true\n\t\t\t} else {\n\t\t\t\toptions.onLeave?.(entry, state.observer!)\n\t\t\t}\n\n\t\t\tel.dispatchEvent(new CustomEvent('intersect', { detail: { isIntersecting, entry } }))\n\t\t}\n\t}\n}\n\n/**\n * Create IntersectionObserver\n */\nfunction createObserver(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): IntersectionObserver {\n\treturn new IntersectionObserver(createObserverCallback(el, state, options), {\n\t\troot: options.root,\n\t\trootMargin: options.rootMargin,\n\t\tthreshold: options.threshold,\n\t})\n}\n\n/**\n * v-intersect directive\n *\n * @example\n * ```vue\n * <div v-intersect=\"handleIntersect\">Observe me</div>\n * <div v-intersect=\"{ onEnter: handleEnter, onLeave: handleLeave }\">Track visibility</div>\n * <div v-intersect=\"{ threshold: 0.5, once: true }\">Trigger once at 50%</div>\n * ```\n */\nexport const vIntersect = defineDirective<IntersectBinding, HTMLElement>({\n\tname: 'intersect',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tonce: false,\n\t\trootMargin: '0px',\n\t\tthreshold: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser() || !supportsIntersectionObserver()) {\n\t\t\tif (!supportsIntersectionObserver()) {\n\t\t\t\tconsole.warn('[Directix] v-intersect: IntersectionObserver not supported')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: IntersectState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\thasTriggeredOnce: false,\n\t\t}\n\n\t\tstate.observer = createObserver(el, state, options)\n\t\t;(el as any)[STATE_KEY] = state\n\t\tstate.observer.observe(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst observerOptionsChanged =\n\t\t\tnewOptions.root !== state.options.root ||\n\t\t\tnewOptions.rootMargin !== state.options.rootMargin ||\n\t\t\tnewOptions.threshold !== state.options.threshold\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled !== state.options.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\tstate.observer?.disconnect()\n\t\t\t} else {\n\t\t\t\tstate.observer?.observe(el)\n\t\t\t}\n\t\t}\n\n\t\t// Recreate observer if options changed\n\t\tif (observerOptionsChanged) {\n\t\t\tstate.observer?.disconnect()\n\t\t\tstate.observer = createObserver(el, state, newOptions)\n\t\t\tstate.observer.observe(el)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.observer?.disconnect()\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vIntersect\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Visible change handler\n */\nexport type VisibleHandler = (isVisible: boolean) => void\n\n/**\n * Visible directive options\n */\nexport interface VisibleOptions {\n\t/**\n\t * Callback when visibility changes\n\t */\n\thandler?: VisibleHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to set visibility: hidden instead of display: none\n\t * @default false\n\t */\n\tuseHidden?: boolean\n\n\t/**\n\t * Initial visibility\n\t * @default true\n\t */\n\tinitial?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type VisibleBinding = boolean | VisibleOptions\n\n/**\n * Element state storage\n */\ninterface VisibleState {\n\toptions: VisibleOptions\n\tisVisible: boolean\n\toriginalDisplay: string\n\toriginalVisibility: string\n\ttransitionEndHandler: (e: TransitionEvent) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: VisibleBinding | undefined): VisibleOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { initial: binding }\n\t}\n\n\treturn {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-visible directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-visible=\"showElement\">Show/Hide</div>\n * <div v-visible=\"{ handler: onVisibleChange }\">Track visibility</div>\n * <div v-visible=\"{ useHidden: true, initial: false }\">Uses visibility: hidden</div>\n * </template>\n * ```\n */\nexport const vVisible = defineDirective<VisibleBinding, HTMLElement>({\n\tname: 'visible',\n\tssr: true, // SSR safe - will set initial visibility on server\n\tdefaults: {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Store original styles\n\t\tconst originalDisplay = el.style.display\n\t\tconst originalVisibility = el.style.visibility\n\n\t\tconst state: VisibleState = {\n\t\t\toptions,\n\t\t\tisVisible: options.initial ?? true,\n\t\t\toriginalDisplay,\n\t\t\toriginalVisibility,\n\t\t\ttransitionEndHandler: (e: TransitionEvent) => {\n\t\t\t\t// Handle transition end for animations\n\t\t\t\tif (e.propertyName === 'opacity' || e.propertyName === 'visibility') {\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('visible:transition-end', {\n\t\t\t\t\t\tdetail: { isVisible: state.isVisible },\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__visible = state\n\n\t\t// Add transition listener\n\t\ton(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Apply initial visibility\n\t\tapplyVisibility(el, state, options.initial ?? true)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Determine new visibility\n\t\tlet newVisibility: boolean\n\n\t\tif (typeof binding.value === 'boolean') {\n\t\t\tnewVisibility = binding.value\n\t\t} else {\n\t\t\tnewVisibility = newOptions.initial ?? true\n\t\t}\n\n\t\t// Update if changed\n\t\tif (state.isVisible !== newVisibility) {\n\t\t\tapplyVisibility(el, state, newVisibility)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\t// Remove transition listener\n\t\toff(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Restore original styles\n\t\tel.style.display = state.originalDisplay\n\t\tel.style.visibility = state.originalVisibility\n\n\t\tdelete (el as any).__visible\n\t},\n})\n\n/**\n * Apply visibility to element\n */\nfunction applyVisibility(el: HTMLElement, state: VisibleState, isVisible: boolean): void {\n\tconst previousVisibility = state.isVisible\n\n\tstate.isVisible = isVisible\n\n\t// Add/remove class first (for CSS transitions)\n\tif (isVisible) {\n\t\tel.classList.remove('v-hidden')\n\t\tel.classList.add('v-visible')\n\t} else {\n\t\tel.classList.remove('v-visible')\n\t\tel.classList.add('v-hidden')\n\t}\n\n\tif (state.options.useHidden) {\n\t\t// Use visibility: hidden with animation support\n\t\tif (isVisible) {\n\t\t\t// Show: set visibility first, then animate\n\t\t\tel.style.visibility = state.originalVisibility || 'visible'\n\t\t} else {\n\t\t\t// Hide: wait for transition, then set hidden\n\t\t\tconst computedStyle = getComputedStyle(el)\n\t\t\tconst hasTransition = computedStyle.transitionDuration !== '0s'\n\n\t\t\tif (hasTransition) {\n\t\t\t\t// Wait for transition to complete\n\t\t\t\tconst handleTransitionEnd = (e: TransitionEvent): void => {\n\t\t\t\t\tif (e.target === el && (e.propertyName === 'opacity' || e.propertyName === 'transform')) {\n\t\t\t\t\t\tif (!state.isVisible) {\n\t\t\t\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tel.removeEventListener('transitionend', handleTransitionEnd)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('transitionend', handleTransitionEnd)\n\t\t\t} else {\n\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Use display: none (no animation support)\n\t\tel.style.display = isVisible ? state.originalDisplay : 'none'\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('visible:change', {\n\t\tdetail: { isVisible, previousVisibility },\n\t}))\n\n\t// Trigger handler\n\tif (state.options.handler && previousVisibility !== isVisible) {\n\t\tstate.options.handler(isVisible)\n\t}\n}\n\nexport default vVisible\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Loading directive options\n */\nexport interface LoadingOptions {\n\t/**\n\t * Loading state\n\t * @default true\n\t */\n\tvalue?: boolean\n\n\t/**\n\t * Loading text to display\n\t */\n\ttext?: string\n\n\t/**\n\t * CSS class for loading overlay\n\t * @default 'v-loading'\n\t */\n\tloadingClass?: string\n\n\t/**\n\t * CSS class for loading spinner\n\t * @default 'v-loading__spinner'\n\t */\n\tspinnerClass?: string\n\n\t/**\n\t * CSS class for loading text\n\t * @default 'v-loading__text'\n\t */\n\ttextClass?: string\n\n\t/**\n\t * Custom spinner HTML\n\t */\n\tspinner?: string\n\n\t/**\n\t * Background color\n\t * @default 'rgba(255, 255, 255, 0.9)'\n\t */\n\tbackground?: string\n\n\t/**\n\t * Whether to lock scroll while loading\n\t * @default false\n\t */\n\tlock?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LoadingBinding = boolean | LoadingOptions\n\n/**\n * Element state storage\n */\ninterface LoadingState {\n\toptions: LoadingOptions\n\tloadingOverlay: HTMLDivElement | null\n\toriginalPosition: string\n\toriginalOverflow: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LoadingBinding | undefined): LoadingOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { value: binding }\n\t}\n\n\treturn {\n\t\tvalue: true,\n\t\tloadingClass: 'v-loading',\n\t\tspinnerClass: 'v-loading__spinner',\n\t\ttextClass: 'v-loading__text',\n\t\tbackground: 'rgba(255, 255, 255, 0.9)',\n\t\tlock: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Default spinner HTML\n */\nconst DEFAULT_SPINNER = `\n<svg class=\"v-loading__circular\" viewBox=\"25 25 50 50\">\n <circle class=\"v-loading__path\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"2\" stroke-miterlimit=\"10\"/>\n</svg>\n`\n\n/**\n * Create loading overlay element\n */\nfunction createLoadingOverlay(options: LoadingOptions): HTMLDivElement {\n\tconst overlay = document.createElement('div')\n\n\toverlay.className = options.loadingClass || 'v-loading'\n\toverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1000;\n background: ${options.background || 'rgba(255, 255, 255, 0.9)'};\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `\n\n\t// Add spinner\n\tconst spinnerHtml = options.spinner || DEFAULT_SPINNER\n\tconst spinnerContainer = document.createElement('div')\n\n\tspinnerContainer.className = options.spinnerClass || 'v-loading__spinner'\n\tspinnerContainer.innerHTML = spinnerHtml\n\toverlay.appendChild(spinnerContainer)\n\n\t// Add text\n\tif (options.text) {\n\t\tconst textEl = document.createElement('div')\n\n\t\ttextEl.className = options.textClass || 'v-loading__text'\n\t\ttextEl.textContent = options.text\n\t\toverlay.appendChild(textEl)\n\t}\n\n\treturn overlay\n}\n\n/**\n * v-loading directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-loading=\"isLoading\">Content</div>\n * <div v-loading=\"{ value: isLoading, text: 'Loading...' }\">Content</div>\n * <div v-loading=\"{ value: isLoading, lock: true }\">Locked scroll while loading</div>\n * </template>\n * ```\n */\nexport const vLoading = defineDirective<LoadingBinding, HTMLElement>({\n\tname: 'loading',\n\tssr: true, // SSR safe - will skip DOM manipulation on server\n\tdefaults: {\n\t\tvalue: true,\n\t\tloadingClass: 'v-loading',\n\t\tspinnerClass: 'v-loading__spinner',\n\t\ttextClass: 'v-loading__text',\n\t\tbackground: 'rgba(255, 255, 255, 0.9)',\n\t\tlock: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Ensure element has relative positioning\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tconst originalPosition = el.style.position\n\t\tconst originalOverflow = el.style.overflow\n\n\t\tconst state: LoadingState = {\n\t\t\toptions,\n\t\t\tloadingOverlay: null,\n\t\t\toriginalPosition,\n\t\t\toriginalOverflow,\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__loading = state\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\t// Show loading if value is true\n\t\tif (options.value) {\n\t\t\tshowLoading(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\thideLoading(el, state)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle loading state change\n\t\tif (newOptions.value && !state.options.value) {\n\t\t\tshowLoading(el, state)\n\t\t} else if (!newOptions.value && state.options.value) {\n\t\t\thideLoading(el, state)\n\t\t}\n\n\t\t// Update text if changed\n\t\tif (state.loadingOverlay && newOptions.text !== state.options.text) {\n\t\t\tconst textEl = state.loadingOverlay.querySelector(`.${state.options.textClass}`)\n\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = newOptions.text || ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\thideLoading(el, state)\n\n\t\t// Restore original styles\n\t\tel.style.position = state.originalPosition\n\t\tel.style.overflow = state.originalOverflow\n\n\t\tdelete (el as any).__loading\n\t},\n})\n\n/**\n * Show loading overlay\n */\nfunction showLoading(el: HTMLElement, state: LoadingState): void {\n\tif (state.loadingOverlay) return\n\n\t// Create and append overlay\n\tstate.loadingOverlay = createLoadingOverlay(state.options)\n\tel.appendChild(state.loadingOverlay)\n\n\t// Lock scroll if needed\n\tif (state.options.lock) {\n\t\tel.style.overflow = 'hidden'\n\t}\n\n\t// Add class\n\tel.classList.add('v-loading--active')\n}\n\n/**\n * Hide loading overlay\n */\nfunction hideLoading(el: HTMLElement, state: LoadingState): void {\n\tif (!state.loadingOverlay) return\n\n\t// Remove overlay\n\tstate.loadingOverlay.remove()\n\tstate.loadingOverlay = null\n\n\t// Restore scroll\n\tif (state.options.lock) {\n\t\tel.style.overflow = state.originalOverflow\n\t}\n\n\t// Remove class\n\tel.classList.remove('v-loading--active')\n}\n\nexport default vLoading\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Scroll event handler\n */\nexport type ScrollHandler = (event: Event, info: ScrollInfo) => void\n\n/**\n * Scroll information\n */\nexport interface ScrollInfo {\n\t/** Current scroll left position */\n\tscrollLeft: number\n\t/** Current scroll top position */\n\tscrollTop: number\n\t/** Maximum scroll left */\n\tscrollLeftMax: number\n\t/** Maximum scroll top */\n\tscrollTopMax: number\n\t/** Horizontal scroll progress (0-1) */\n\tprogressX: number\n\t/** Vertical scroll progress (0-1) */\n\tprogressY: number\n\t/** Direction of horizontal scroll (-1: left, 1: right, 0: none) */\n\tdirectionX: -1 | 0 | 1\n\t/** Direction of vertical scroll (-1: up, 1: down, 0: none) */\n\tdirectionY: -1 | 0 | 1\n\t/** Scroll container element or window */\n\tcontainer: Element | Window\n}\n\n/**\n * Scroll directive options\n */\nexport interface ScrollOptions {\n\t/**\n\t * Scroll event handler\n\t * @required\n\t */\n\thandler: ScrollHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use passive event listener\n\t * @default true\n\t */\n\tpassive?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 0 (no throttle)\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container selector or element\n\t */\n\tcontainer?: string | Element | Window | null\n}\n\n/**\n * Directive binding value type\n */\nexport type ScrollBinding = ScrollHandler | ScrollOptions\n\n/**\n * Element state storage\n */\ninterface ScrollState {\n\toptions: ScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tlastScrollLeft: number\n\tlastScrollTop: number\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tpendingEvent: Event | null\n}\n\n/**\n * Get scroll info\n */\nfunction getScrollInfo(container: Element | Window, lastScrollLeft: number, lastScrollTop: number): ScrollInfo {\n\tlet scrollLeft = 0,\n\t\tscrollTop = 0,\n\t\tscrollLeftMax = 0,\n\t\tscrollTopMax = 0\n\n\tif (container === window) {\n\t\tscrollLeft = window.scrollX || document.documentElement.scrollLeft\n\t\tscrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tscrollLeftMax = document.documentElement.scrollWidth - window.innerWidth\n\t\tscrollTopMax = document.documentElement.scrollHeight - window.innerHeight\n\t} else {\n\t\tconst el = container as Element\n\n\t\tscrollLeft = el.scrollLeft\n\t\tscrollTop = el.scrollTop\n\t\tscrollLeftMax = el.scrollWidth - el.clientWidth\n\t\tscrollTopMax = el.scrollHeight - el.clientHeight\n\t}\n\n\tconst progressX = scrollLeftMax > 0 ? scrollLeft / scrollLeftMax : 0\n\tconst progressY = scrollTopMax > 0 ? scrollTop / scrollTopMax : 0\n\n\t// Calculate direction\n\tconst directionX: -1 | 0 | 1 = scrollLeft !== lastScrollLeft ? (scrollLeft > lastScrollLeft ? 1 : -1) : 0\n\tconst directionY: -1 | 0 | 1 = scrollTop !== lastScrollTop ? (scrollTop > lastScrollTop ? 1 : -1) : 0\n\n\treturn {\n\t\tscrollLeft,\n\t\tscrollTop,\n\t\tscrollLeftMax,\n\t\tscrollTopMax,\n\t\tprogressX,\n\t\tprogressY,\n\t\tdirectionX,\n\t\tdirectionY,\n\t\tcontainer,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ScrollBinding | undefined): ScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, passive: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-scroll=\"handleScroll\">Scroll container</div>\n * <div v-scroll=\"{ handler: handleScroll, throttle: 100 }\">Throttled scroll</div>\n * </template>\n * ```\n */\nexport const vScroll = defineDirective<ScrollBinding, HTMLElement>({\n\tname: 'scroll',\n\tssr: false,\n\tdefaults: {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (options.container === window) {\n\t\t\t\tcontainer = window\n\t\t\t} else if (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\t// Check if element itself is scrollable\n\t\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(el)\n\t\t\tconst isSelfScrollable = /(auto|scroll)/.test(overflow + overflowX + overflowY)\n\n\t\t\tcontainer = isSelfScrollable ? el : getScrollParent(el)\n\t\t}\n\n\t\tconst state: ScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tlastScrollLeft: 0,\n\t\t\tlastScrollTop: 0,\n\t\t\tthrottleTimer: null,\n\t\t\tpendingEvent: null,\n\t\t\tscrollHandler: (e: Event) => {\n\t\t\t\t// Handle throttle\n\t\t\t\tif (options.throttle && options.throttle > 0) {\n\t\t\t\t\tstate.pendingEvent = e\n\n\t\t\t\t\tif (!state.throttleTimer) {\n\t\t\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEvent) {\n\t\t\t\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEvent, info)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t\t\t\tstate.pendingEvent = null\n\t\t\t\t\t\t}, options.throttle)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\toptions.handler(e, info)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Initialize last scroll position\n\t\tconst initialInfo = getScrollInfo(container, 0, 0)\n\n\t\tstate.lastScrollLeft = initialInfo.scrollLeft\n\t\tstate.lastScrollTop = initialInfo.scrollTop\n\n\t\t// Store state\n\t\t;(el as any).__scroll = state\n\n\t\t// Bind scroll event\n\t\ton(container, 'scroll', state.scrollHandler, { passive: options.passive })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Unbind scroll event\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__scroll\n\t},\n})\n\nexport default vScroll\n","import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Infinite scroll handler\n */\nexport type InfiniteScrollHandler = () => void | Promise<void>\n\n/**\n * Infinite scroll directive options\n */\nexport interface InfiniteScrollOptions {\n\t/**\n\t * Handler to call when scrolling to bottom\n\t * @required\n\t */\n\thandler: InfiniteScrollHandler\n\n\t/**\n\t * Distance from bottom to trigger load (in pixels)\n\t * @default 0\n\t */\n\tdistance?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether currently loading\n\t * @default false\n\t */\n\tloading?: boolean\n\n\t/**\n\t * Whether to use IntersectionObserver (more efficient)\n\t * @default true\n\t */\n\tuseIntersection?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 200\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container\n\t */\n\tcontainer?: string | Element | null\n\n\t/**\n\t * Callback when load starts\n\t */\n\tonLoadStart?: () => void\n\n\t/**\n\t * Callback when load completes\n\t */\n\tonLoadEnd?: () => void\n\n\t/**\n\t * Callback on error\n\t */\n\tonError?: (error: Error) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type InfiniteScrollBinding = InfiniteScrollHandler | InfiniteScrollOptions\n\n/**\n * Element state storage\n */\ninterface InfiniteScrollState {\n\toptions: InfiniteScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tsentinel: HTMLDivElement | null\n\tobserver: IntersectionObserver | null\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tisLoading: boolean\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: InfiniteScrollBinding | undefined): InfiniteScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, distance: 0, throttle: 200, useIntersection: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-infinite-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-infinite-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-infinite-scroll=\"loadMore\" class=\"scroll-container\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n *\n * <div v-infinite-scroll=\"{ handler: loadMore, distance: 100, disabled: isLoading }\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n * </template>\n * ```\n */\nexport const vInfiniteScroll = defineDirective<InfiniteScrollBinding, HTMLElement>({\n\tname: 'infinite-scroll',\n\tssr: false,\n\tdefaults: {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer = getScrollParent(el)\n\t\t}\n\n\t\tconst state: InfiniteScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tsentinel: null,\n\t\t\tobserver: null,\n\t\t\tthrottleTimer: null,\n\t\t\tisLoading: false,\n\t\t\tscrollHandler: async (_e: Event) => {\n\t\t\t\tif (state.isLoading || state.options.disabled || state.options.loading) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Throttle\n\t\t\t\tif (state.throttleTimer) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t}, options.throttle)\n\n\t\t\t\t// Check scroll position\n\t\t\t\tconst shouldLoad = checkShouldLoad(container, el, options.distance || 0)\n\n\t\t\t\tif (shouldLoad) {\n\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__infiniteScroll = state\n\n\t\t// Use IntersectionObserver if available and enabled\n\t\tif (options.useIntersection && supportsIntersectionObserver()) {\n\t\t\tsetupIntersectionObserver(el, state)\n\t\t} else {\n\t\t\t// Use scroll event listener\n\t\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Remove sentinel\n\t\tif (state.sentinel && state.sentinel.parentNode) {\n\t\t\tstate.sentinel.parentNode.removeChild(state.sentinel)\n\t\t}\n\n\t\t// Remove scroll listener\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__infiniteScroll\n\t},\n})\n\n/**\n * Check if should load more\n */\nfunction checkShouldLoad(container: Element | Window, _el: HTMLElement, distance: number): boolean {\n\tif (container === window) {\n\t\tconst scrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tconst scrollHeight = document.documentElement.scrollHeight\n\t\tconst clientHeight = window.innerHeight\n\n\t\treturn scrollTop + clientHeight >= scrollHeight - distance\n\t}\n\n\tconst el = container as Element\n\tconst scrollTop = el.scrollTop\n\tconst scrollHeight = el.scrollHeight\n\tconst clientHeight = el.clientHeight\n\n\treturn scrollTop + clientHeight >= scrollHeight - distance\n}\n\n/**\n * Trigger load handler\n */\nasync function triggerLoad(state: InfiniteScrollState, el: HTMLElement): Promise<void> {\n\tstate.isLoading = true\n\tstate.options.onLoadStart?.()\n\n\tel.classList.add('v-infinite-scroll--loading')\n\n\ttry {\n\t\tawait state.options.handler()\n\t} catch (err) {\n\t\tstate.options.onError?.(err as Error)\n\t} finally {\n\t\tstate.isLoading = false\n\t\tstate.options.onLoadEnd?.()\n\t\tel.classList.remove('v-infinite-scroll--loading')\n\t}\n}\n\n/**\n * Setup IntersectionObserver\n */\nfunction setupIntersectionObserver(el: HTMLElement, state: InfiniteScrollState): void {\n\t// Create sentinel element\n\tconst sentinel = document.createElement('div')\n\n\tsentinel.className = 'v-infinite-scroll__sentinel'\n\tsentinel.style.cssText = `\n height: 1px;\n width: 100%;\n clear: both;\n `\n\n\tel.appendChild(sentinel)\n\tstate.sentinel = sentinel\n\n\t// Create observer\n\tstate.observer = new IntersectionObserver(\n\t\tasync entries => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tif (!state.isLoading && !state.options.disabled && !state.options.loading) {\n\t\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: state.container === window ? null : (state.container as Element),\n\t\t\trootMargin: `${state.options.distance || 0}px`,\n\t\t\tthreshold: 0,\n\t\t},\n\t)\n\n\tstate.observer.observe(sentinel)\n}\n\nexport default vInfiniteScroll\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\nconst STATE_KEY = '__sticky' as const\n\n/**\n * Sticky directive options\n */\nexport interface StickyOptions {\n\t/** Top offset when sticky @default 0 */\n\ttop?: number | string\n\t/** Bottom offset when sticky */\n\tbottom?: number | string\n\t/** Z-index when sticky @default 100 */\n\tzIndex?: number\n\t/** CSS class to add when sticky @default 'v-sticky--fixed' */\n\tstickyClass?: string\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Callback when sticky state changes */\n\tonChange?: (isSticky: boolean) => void\n\t/** Custom scroll container */\n\tcontainer?: string | Element | null\n}\n\nexport type StickyBinding = boolean | number | StickyOptions\n\ninterface StickyState {\n\toptions: StickyOptions\n\tplaceholder: HTMLDivElement | null\n\toriginalStyles: { position: string; top: string; bottom: string; zIndex: string; width: string }\n\tisSticky: boolean\n\tscrollHandler: () => void\n\tresizeHandler: () => void\n\tcontainer: Element | Window\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: StickyBinding | undefined): StickyOptions {\n\tif (binding === false) return { disabled: true, top: 0, zIndex: 100 }\n\tif (typeof binding === 'number') return { top: binding, zIndex: 100 }\n\n\treturn {\n\t\ttop: 0,\n\t\tzIndex: 100,\n\t\tstickyClass: 'v-sticky--fixed',\n\t\tdisabled: false,\n\t\t...(binding && typeof binding === 'object' ? binding : {}),\n\t}\n}\n\n/**\n * Parse offset value to CSS string\n */\nfunction parseOffset(value: number | string | undefined): string {\n\tif (value === undefined) return '0'\n\n\treturn typeof value === 'number' ? `${value}px` : value\n}\n\n/**\n * Get scroll container for element\n */\nfunction getScrollContainer(el: HTMLElement, customContainer?: string | Element | null): Element | Window {\n\tif (customContainer) {\n\t\tif (typeof customContainer === 'string') {\n\t\t\treturn document.querySelector(customContainer) || getScrollParent(el)\n\t\t}\n\n\t\treturn customContainer\n\t}\n\n\t// Check if parent element is scrollable\n\tconst parent = el.parentElement\n\n\tif (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\t}\n\n\treturn getScrollParent(el)\n}\n\n/**\n * Check and update sticky state\n */\nfunction checkSticky(el: HTMLElement, state: StickyState): void {\n\tif (state.options.disabled) {\n\t\tunsetSticky(el, state)\n\n\t\treturn\n\t}\n\n\tconst topOffset = Number.parseFloat(parseOffset(state.options.top))\n\tconst containerRect = state.container === window ? { top: 0 } : (state.container as Element).getBoundingClientRect()\n\n\t// Use placeholder position when sticky, otherwise use element position\n\tconst referenceEl = state.placeholder || el\n\tconst rect = referenceEl.getBoundingClientRect()\n\tconst elementTopRelativeToContainer = rect.top - containerRect.top\n\n\tconst shouldSticky = elementTopRelativeToContainer <= topOffset\n\n\tif (shouldSticky && !state.isSticky) {\n\t\tsetSticky(el, state, topOffset, containerRect.top)\n\t} else if (!shouldSticky && state.isSticky) {\n\t\tunsetSticky(el, state)\n\t}\n}\n\n/**\n * Set element as sticky\n */\nfunction setSticky(el: HTMLElement, state: StickyState, topOffset: number, containerTop: number): void {\n\tstate.isSticky = true\n\n\t// Create placeholder to maintain layout\n\tconst placeholder = document.createElement('div')\n\n\tplaceholder.style.cssText = `width:${el.offsetWidth}px;height:${el.offsetHeight}px`\n\tel.parentNode?.insertBefore(placeholder, el)\n\tstate.placeholder = placeholder\n\n\t// Calculate fixed top position relative to viewport\n\tconst fixedTop = state.container === window ? topOffset : containerTop + topOffset\n\n\t// Apply sticky styles\n\tel.style.position = 'fixed'\n\tel.style.top = `${fixedTop}px`\n\tel.style.zIndex = String(state.options.zIndex || 100)\n\tel.style.width = `${el.offsetWidth}px`\n\n\tif (state.options.bottom !== undefined) {\n\t\tel.style.bottom = parseOffset(state.options.bottom)\n\t}\n\n\tstate.options.stickyClass && el.classList.add(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: true } }))\n\tstate.options.onChange?.(true)\n}\n\n/**\n * Unset element as sticky\n */\nfunction unsetSticky(el: HTMLElement, state: StickyState): void {\n\tif (!state.isSticky) return\n\n\tstate.isSticky = false\n\n\t// Remove placeholder\n\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\tstate.placeholder = null\n\n\t// Restore original styles\n\tObject.assign(el.style, state.originalStyles)\n\n\tstate.options.stickyClass && el.classList.remove(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: false } }))\n\tstate.options.onChange?.(false)\n}\n\n/**\n * v-sticky directive\n *\n * @example\n * ```vue\n * <div v-sticky>Sticky header</div>\n * <div v-sticky=\"50\">Sticky with 50px top offset</div>\n * <div v-sticky=\"{ top: 60, zIndex: 1000 }\">Custom sticky</div>\n * ```\n */\nexport const vSticky = defineDirective<StickyBinding, HTMLElement>({\n\tname: 'sticky',\n\tssr: false,\n\tdefaults: { top: 0, zIndex: 100, stickyClass: 'v-sticky--fixed', disabled: false },\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst container = getScrollContainer(el, options.container)\n\n\t\tconst state: StickyState = {\n\t\t\toptions,\n\t\t\tplaceholder: null,\n\t\t\toriginalStyles: {\n\t\t\t\tposition: el.style.position,\n\t\t\t\ttop: el.style.top,\n\t\t\t\tbottom: el.style.bottom,\n\t\t\t\tzIndex: el.style.zIndex,\n\t\t\t\twidth: el.style.width,\n\t\t\t},\n\t\t\tisSticky: false,\n\t\t\tcontainer,\n\t\t\tscrollHandler: () => checkSticky(el, state),\n\t\t\tresizeHandler: () => checkSticky(el, state),\n\t\t}\n\n\t\tel.classList.add('v-sticky')\n\t\t;(el as any)[STATE_KEY] = state\n\n\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\ton(window, 'resize', state.resizeHandler, { passive: true })\n\t\tcheckSticky(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tcheckSticky(el, state)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\n\t\tObject.assign(el.style, state.originalStyles)\n\t\tel.classList.remove('v-sticky', state.options.stickyClass || 'v-sticky--fixed')\n\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\t\toff(window, 'resize', state.resizeHandler)\n\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vSticky\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getEventPosition, off, on } from '@directix/shared'\n\n/**\n * Long press handler\n */\nexport type LongPressHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Long press directive options\n */\nexport interface LongPressOptions {\n\t/**\n\t * Callback when long press is triggered\n\t * @required\n\t */\n\thandler: LongPressHandler\n\n\t/**\n\t * Duration in milliseconds to trigger long press\n\t * @default 500\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Maximum movement distance before canceling\n\t * @default 10\n\t */\n\tdistance?: number\n\n\t/**\n\t * Callback when long press starts (on mousedown/touchstart)\n\t */\n\tonStart?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback when long press is canceled\n\t */\n\tonCancel?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback on each tick during long press\n\t */\n\tonTick?: (remaining: number) => void\n\n\t/**\n\t * Interval for onTick callback in milliseconds\n\t * @default 100\n\t */\n\ttickInterval?: number\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tprevent?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LongPressBinding = LongPressHandler | LongPressOptions\n\n/**\n * Element state storage\n */\ninterface LongPressState {\n\toptions: LongPressOptions\n\ttimerId: ReturnType<typeof setTimeout> | null\n\ttickTimerId: ReturnType<typeof setInterval> | null\n\tstartTime: number\n\tstartPos: { x: number; y: number }\n\tstartHandler: (e: Event) => void\n\tendHandler: (e: Event) => void\n\tmoveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LongPressBinding | undefined): LongPressOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, duration: 500, distance: 10 }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-long-press: handler is required')\n\t}\n\n\treturn {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t\t...binding,\n\t}\n}\n\n/**\n * Calculate distance between two points\n */\nfunction getDistance(p1: { x: number; y: number }, p2: { x: number; y: number }): number {\n\treturn Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2)\n}\n\n/**\n * v-long-press directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-long-press=\"handleLongPress\">Long Press Me</button>\n * <button v-long-press=\"{ handler: handleLongPress, duration: 1000 }\">1 Second Press</button>\n * </template>\n * ```\n */\nexport const vLongPress = defineDirective<LongPressBinding, HTMLElement>({\n\tname: 'long-press',\n\tssr: false,\n\tdefaults: {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: LongPressState = {\n\t\t\toptions,\n\t\t\ttimerId: null,\n\t\t\ttickTimerId: null,\n\t\t\tstartTime: 0,\n\t\t\tstartPos: { x: 0, y: 0 },\n\t\t\tstartHandler: () => {},\n\t\t\tendHandler: () => {},\n\t\t\tmoveHandler: () => {},\n\t\t}\n\n\t\t// Start handler\n\t\tstate.startHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\t// Prevent context menu on long press\n\t\t\tif (options.prevent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\n\t\t\tif (options.stop) {\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\n\t\t\t// Clear any existing timer\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Store start position\n\t\t\tconst pos = getEventPosition(event)\n\n\t\t\tstate.startPos = { x: pos.x, y: pos.y }\n\t\t\tstate.startTime = Date.now()\n\n\t\t\t// Trigger start callback\n\t\t\toptions.onStart?.(event)\n\n\t\t\t// Start tick timer\n\t\t\tif (options.onTick) {\n\t\t\t\tlet remaining = options.duration!\n\n\t\t\t\tstate.tickTimerId = setInterval(() => {\n\t\t\t\t\tremaining -= options.tickInterval!\n\t\t\t\t\toptions.onTick?.(Math.max(0, remaining))\n\t\t\t\t}, options.tickInterval)\n\t\t\t}\n\n\t\t\t// Start long press timer\n\t\t\tstate.timerId = setTimeout(() => {\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\t\t\t\toptions.handler(event)\n\t\t\t}, options.duration)\n\t\t}\n\n\t\t// End handler\n\t\tstate.endHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Trigger cancel callback if was in progress\n\t\t\tif (state.startTime > 0) {\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t}\n\n\t\t\tstate.startTime = 0\n\t\t}\n\n\t\t// Move handler - cancel if moved too far\n\t\tstate.moveHandler = (e: Event) => {\n\t\t\tif (!state.timerId) return\n\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\t\t\tconst pos = getEventPosition(event)\n\t\t\tconst distance = getDistance(state.startPos, { x: pos.x, y: pos.y })\n\n\t\t\tif (distance > (options.distance || 10)) {\n\t\t\t\tif (state.timerId) {\n\t\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\t\tstate.timerId = null\n\t\t\t\t}\n\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t\tstate.startTime = 0\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__longPress = state\n\n\t\t// Bind events - mouse\n\t\ton(el, 'mousedown', state.startHandler)\n\t\ton(el, 'mouseup', state.endHandler)\n\t\ton(el, 'mouseleave', state.endHandler)\n\t\ton(el, 'mousemove', state.moveHandler)\n\n\t\t// Bind events - touch\n\t\ton(el, 'touchstart', state.startHandler, { passive: !options.prevent })\n\t\ton(el, 'touchend', state.endHandler)\n\t\ton(el, 'touchcancel', state.endHandler)\n\t\ton(el, 'touchmove', state.moveHandler, { passive: true })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) {\n\t\t\t// Re-initialize if not exists\n\t\t\tconst options = normalizeOptions(binding.value)\n\n\t\t\tif (!options.disabled) {\n\t\t\t\t// Re-mount by clearing and re-setting\n\t\t\t\t;(el as any).__longPress = null\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.timerId) {\n\t\t\tclearTimeout(state.timerId)\n\t\t}\n\n\t\tif (state.tickTimerId) {\n\t\t\tclearInterval(state.tickTimerId)\n\t\t}\n\n\t\t// Unbind events - mouse\n\t\toff(el, 'mousedown', state.startHandler)\n\t\toff(el, 'mouseup', state.endHandler)\n\t\toff(el, 'mouseleave', state.endHandler)\n\t\toff(el, 'mousemove', state.moveHandler)\n\n\t\t// Unbind events - touch\n\t\toff(el, 'touchstart', state.startHandler)\n\t\toff(el, 'touchend', state.endHandler)\n\t\toff(el, 'touchcancel', state.endHandler)\n\t\toff(el, 'touchmove', state.moveHandler)\n\n\t\tdelete (el as any).__longPress\n\t},\n})\n\nexport default vLongPress\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Hover state change handler\n */\nexport type HoverHandler = (isHovering: boolean, event: MouseEvent) => void\n\n/**\n * Hover directive options\n */\nexport interface HoverOptions {\n\t/**\n\t * Callback when hover state changes\n\t */\n\thandler?: HoverHandler\n\n\t/**\n\t * Callback when mouse enters\n\t */\n\tonEnter?: (event: MouseEvent) => void\n\n\t/**\n\t * Callback when mouse leaves\n\t */\n\tonLeave?: (event: MouseEvent) => void\n\n\t/**\n\t * CSS class to add when hovering\n\t * @default 'v-hover'\n\t */\n\tclass?: string\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Delay in milliseconds before triggering enter\n\t * @default 0\n\t */\n\tenterDelay?: number\n\n\t/**\n\t * Delay in milliseconds before triggering leave\n\t * @default 0\n\t */\n\tleaveDelay?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type HoverBinding = HoverHandler | HoverOptions\n\n/**\n * Element state storage\n */\ninterface HoverState {\n\toptions: HoverOptions\n\tisHovering: boolean\n\tenterTimerId: ReturnType<typeof setTimeout> | null\n\tleaveTimerId: ReturnType<typeof setTimeout> | null\n\tenterHandler: (e: Event) => void\n\tleaveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: HoverBinding | undefined): HoverOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, class: 'v-hover' }\n\t}\n\n\treturn {\n\t\tclass: 'v-hover',\n\t\tdisabled: false,\n\t\tenterDelay: 0,\n\t\tleaveDelay: 0,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-hover directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-hover=\"handleHover\">Hover me</div>\n * <div v-hover=\"{ onEnter: handleEnter, onLeave: handleLeave, class: 'is-hovering' }\">Hover me</div>\n * </template>\n * ```\n */\nexport const vHover = defineDirective<HoverBinding, HTMLElement>({\n\tname: 'hover',\n\tssr: false,\n\tdefaults: {\n\t\tclass: 'v-hover',\n\t\tdisabled: false,\n\t\tenterDelay: 0,\n\t\tleaveDelay: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: HoverState = {\n\t\t\toptions,\n\t\t\tisHovering: false,\n\t\t\tenterTimerId: null,\n\t\t\tleaveTimerId: null,\n\t\t\tenterHandler: () => {},\n\t\t\tleaveHandler: () => {},\n\t\t}\n\n\t\t// Enter handler\n\t\tstate.enterHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear leave timer if exists\n\t\t\tif (state.leaveTimerId) {\n\t\t\t\tclearTimeout(state.leaveTimerId)\n\t\t\t\tstate.leaveTimerId = null\n\t\t\t}\n\n\t\t\t// If already hovering, do nothing\n\t\t\tif (state.isHovering) return\n\n\t\t\t// Handle enter delay\n\t\t\tif (options.enterDelay && options.enterDelay > 0) {\n\t\t\t\tstate.enterTimerId = setTimeout(() => {\n\t\t\t\t\tstate.isHovering = true\n\t\t\t\t\tapplyHoverState(el, state, event)\n\t\t\t\t}, options.enterDelay)\n\t\t\t} else {\n\t\t\t\tstate.isHovering = true\n\t\t\t\tapplyHoverState(el, state, event)\n\t\t\t}\n\t\t}\n\n\t\t// Leave handler\n\t\tstate.leaveHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear enter timer if exists\n\t\t\tif (state.enterTimerId) {\n\t\t\t\tclearTimeout(state.enterTimerId)\n\t\t\t\tstate.enterTimerId = null\n\t\t\t}\n\n\t\t\t// If not hovering, do nothing\n\t\t\tif (!state.isHovering) return\n\n\t\t\t// Handle leave delay\n\t\t\tif (options.leaveDelay && options.leaveDelay > 0) {\n\t\t\t\tstate.leaveTimerId = setTimeout(() => {\n\t\t\t\t\tstate.isHovering = false\n\t\t\t\t\tapplyLeaveState(el, state, event)\n\t\t\t\t}, options.leaveDelay)\n\t\t\t} else {\n\t\t\t\tstate.isHovering = false\n\t\t\t\tapplyLeaveState(el, state, event)\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__hover = state\n\n\t\t// Bind events\n\t\ton(el, 'mouseenter', state.enterHandler)\n\t\ton(el, 'mouseleave', state.leaveHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HoverState = (el as any).__hover\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Was enabled, now disabled - remove class and listeners\n\t\t\tel.classList.remove(state.options.class || 'v-hover')\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Was disabled, now enabled - re-add listeners (already bound)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HoverState = (el as any).__hover\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.enterTimerId) {\n\t\t\tclearTimeout(state.enterTimerId)\n\t\t}\n\n\t\tif (state.leaveTimerId) {\n\t\t\tclearTimeout(state.leaveTimerId)\n\t\t}\n\n\t\t// Unbind events\n\t\toff(el, 'mouseenter', state.enterHandler)\n\t\toff(el, 'mouseleave', state.leaveHandler)\n\n\t\t// Remove class\n\t\tel.classList.remove(state.options.class || 'v-hover')\n\n\t\tdelete (el as any).__hover\n\t},\n})\n\n/**\n * Apply hover state\n */\nfunction applyHoverState(el: HTMLElement, state: HoverState, e: MouseEvent): void {\n\tconst { options } = state\n\n\t// Add class\n\tif (options.class) {\n\t\tel.classList.add(options.class)\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('hover:enter', { detail: { event: e } }))\n\n\t// Trigger callbacks\n\toptions.onEnter?.(e)\n\toptions.handler?.(true, e)\n}\n\n/**\n * Apply leave state\n */\nfunction applyLeaveState(el: HTMLElement, state: HoverState, e: MouseEvent): void {\n\tconst { options } = state\n\n\t// Remove class\n\tif (options.class) {\n\t\tel.classList.remove(options.class)\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('hover:leave', { detail: { event: e } }))\n\n\t// Trigger callbacks\n\toptions.onLeave?.(e)\n\toptions.handler?.(false, e)\n}\n\nexport default vHover\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Ripple directive options\n */\nexport interface RippleOptions {\n\t/**\n\t * Ripple color\n\t * @default 'currentColor'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Ripple duration in milliseconds\n\t * @default 600\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable ripple\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Initial scale of ripple\n\t * @default 0\n\t */\n\tinitialScale?: number\n\n\t/**\n\t * Final scale of ripple\n\t * @default 2\n\t */\n\tfinalScale?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type RippleBinding = boolean | string | RippleOptions\n\n/**\n * Element state storage\n */\ninterface RippleState {\n\toptions: RippleOptions\n\tclickHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: RippleBinding | undefined): RippleOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true, color: 'currentColor', duration: 600 }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { color: binding, duration: 600 }\n\t}\n\n\tconst base: RippleOptions = {\n\t\tcolor: 'currentColor',\n\t\tduration: 600,\n\t\tdisabled: false,\n\t\tinitialScale: 0,\n\t\tfinalScale: 2,\n\t}\n\n\treturn binding && typeof binding === 'object' ? { ...base, ...binding } : base\n}\n\n/**\n * Create ripple element\n */\nfunction createRipple(\n\tevent: MouseEvent,\n\tel: HTMLElement,\n\toptions: RippleOptions,\n): HTMLSpanElement | null {\n\t// Get element dimensions\n\tconst rect = el.getBoundingClientRect()\n\n\t// Calculate ripple position\n\tconst x = event.clientX - rect.left\n\tconst y = event.clientY - rect.top\n\n\t// Calculate ripple size (use diagonal for full coverage)\n\tconst size = Math.max(rect.width, rect.height) * 2\n\n\t// Create ripple element\n\tconst ripple = document.createElement('span')\n\n\tripple.className = 'v-ripple__wave'\n\tripple.style.cssText = `\n position: absolute;\n border-radius: 50%;\n pointer-events: none;\n background-color: ${options.color};\n width: ${size}px;\n height: ${size}px;\n left: ${x - size / 2}px;\n top: ${y - size / 2}px;\n transform: scale(${options.initialScale});\n opacity: 0.3;\n z-index: 0;\n `\n\n\treturn ripple\n}\n\n/**\n * Animate ripple\n */\nfunction animateRipple(ripple: HTMLElement, options: RippleOptions): void {\n\tconst duration = options.duration || 600\n\tconst initialScale = options.initialScale || 0\n\tconst finalScale = options.finalScale || 2\n\n\t// Use Web Animations API if available\n\tif (typeof ripple.animate === 'function') {\n\t\tripple.animate(\n\t\t\t[\n\t\t\t\t{ transform: `scale(${initialScale})`, opacity: 0.3 },\n\t\t\t\t{ transform: `scale(${finalScale})`, opacity: 0 },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration,\n\t\t\t\teasing: 'ease-out',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).onfinish = () => {\n\t\t\tripple.remove()\n\t\t}\n\t} else {\n\t\t// Fallback for older browsers\n\t\tripple.style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`\n\n\t\t// Force reflow\n\t\tString(ripple.offsetHeight)\n\n\t\tripple.style.transform = `scale(${finalScale})`\n\t\tripple.style.opacity = '0'\n\n\t\tsetTimeout(() => {\n\t\t\tripple.remove()\n\t\t}, duration)\n\t}\n}\n\n/**\n * v-ripple directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-ripple>Click me</button>\n * <button v-ripple=\"'rgba(255, 255, 255, 0.3)'\">Custom color</button>\n * <button v-ripple=\"{ color: 'red', duration: 800 }\">Custom options</button>\n * </template>\n * ```\n */\nexport const vRipple = defineDirective<RippleBinding, HTMLElement>({\n\tname: 'ripple',\n\tssr: false,\n\tdefaults: {\n\t\tcolor: 'currentColor',\n\t\tduration: 600,\n\t\tdisabled: false,\n\t\tinitialScale: 0,\n\t\tfinalScale: 2,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Ensure element has proper positioning\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\t// Ensure overflow is hidden to contain ripple\n\t\tif (computedStyle.overflow === 'visible') {\n\t\t\tel.style.overflow = 'hidden'\n\t\t}\n\n\t\t// Add base class\n\t\tel.classList.add('v-ripple')\n\n\t\tconst state: RippleState = {\n\t\t\toptions,\n\t\t\tclickHandler: (e: Event) => {\n\t\t\t\t// Ignore if disabled\n\t\t\t\tif (state.options.disabled) return\n\n\t\t\t\tconst mouseEvent = e as MouseEvent\n\n\t\t\t\t// Create and append ripple\n\t\t\t\tconst ripple = createRipple(mouseEvent, el, state.options)\n\n\t\t\t\tif (ripple) {\n\t\t\t\t\tel.appendChild(ripple)\n\t\t\t\t\tanimateRipple(ripple, state.options)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__ripple = state\n\n\t\t// Bind click event\n\t\ton(el, 'click', state.clickHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: RippleState = (el as any).__ripple\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: RippleState = (el as any).__ripple\n\n\t\tif (!state) return\n\n\t\t// Unbind event\n\t\toff(el, 'click', state.clickHandler)\n\n\t\t// Remove class\n\t\tel.classList.remove('v-ripple')\n\n\t\tdelete (el as any).__ripple\n\t},\n})\n\nexport default vRipple\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\nconst STATE_KEY = '__mask' as const\n\n/**\n * Mask directive options\n */\nexport interface MaskOptions {\n\t/** Mask pattern: # digit, A letter, N alphanumeric, X any, others as literals */\n\tmask: string\n\t/** Placeholder character @default '_' */\n\tplaceholder?: string\n\t/** Show mask placeholder on focus @default true */\n\tshowPlaceholder?: boolean\n\t/** Show mask on blur @default false */\n\tshowMaskOnBlur?: boolean\n\t/** Clear incomplete on blur @default false */\n\tclearIncomplete?: boolean\n\t/** Disable @default false */\n\tdisabled?: boolean\n\t/** Callback when value changes */\n\tonChange?: (value: string, rawValue: string) => void\n\t/** Callback when mask is complete */\n\tonComplete?: (value: string) => void\n}\n\nexport type MaskBinding = string | MaskOptions\n\ninterface MaskToken {\n\tpattern: RegExp\n\tplaceholder: string\n\tisLiteral: boolean\n}\n\ninterface MaskState {\n\toptions: MaskOptions\n\ttokens: MaskToken[]\n\tplaceholder: string\n\tinputHandler: (e: Event) => void\n\tfocusHandler: () => void\n\tblurHandler: () => void\n}\n\nconst TOKEN_PATTERNS: Record<string, RegExp> = {\n\t'#': /\\d/,\n\tA: /[A-Za-z]/,\n\tN: /[A-Za-z0-9]/,\n\tX: /./,\n}\n\nfunction parseMask(mask: string, placeholder: string): MaskToken[] {\n\treturn [...mask].map(char => {\n\t\tconst pattern = TOKEN_PATTERNS[char]\n\n\t\treturn pattern ? { pattern, placeholder, isLiteral: false } : { pattern: new RegExp(`\\\\${char}`), placeholder: char, isLiteral: true }\n\t})\n}\n\nfunction normalizeOptions(binding: MaskBinding | undefined): MaskOptions {\n\tif (typeof binding === 'string') return { mask: binding, placeholder: '_', showPlaceholder: true }\n\tif (!binding?.mask) throw new Error('[Directix] v-mask: mask is required')\n\n\treturn { placeholder: '_', showPlaceholder: true, showMaskOnBlur: false, clearIncomplete: false, disabled: false, ...binding }\n}\n\nfunction isInput(el: HTMLElement): el is HTMLInputElement | HTMLTextAreaElement {\n\treturn el.tagName === 'INPUT' || el.tagName === 'TEXTAREA'\n}\n\n/**\n * Format value with mask\n */\nfunction formatValue(value: string, tokens: MaskToken[], placeholder: string, showPlaceholder: boolean): string {\n\tlet result = '',\n\t\tvalueIndex = 0\n\n\tfor (const token of tokens) {\n\t\tif (valueIndex >= value.length) {\n\t\t\tresult += token.isLiteral ? token.placeholder : (showPlaceholder ? placeholder : '')\n\t\t\tcontinue\n\t\t}\n\n\t\tconst inputChar = value[valueIndex]\n\n\t\tif (token.isLiteral) {\n\t\t\tif (inputChar === token.placeholder) valueIndex++\n\t\t\tresult += token.placeholder\n\t\t} else if (token.pattern.test(inputChar)) {\n\t\t\tresult += inputChar\n\t\t\tvalueIndex++\n\t\t} else if (inputChar === placeholder) {\n\t\t\tresult += showPlaceholder ? placeholder : ''\n\t\t\tvalueIndex++\n\t\t} else {\n\t\t\tvalueIndex++\n\t\t\t// Re-check this token with next input char - need to decrement in loop\n\t\t}\n\t}\n\n\treturn result\n}\n\n/**\n * Get raw value (without mask literals)\n */\nfunction getRawValue(value: string, tokens: MaskToken[], placeholder: string): string {\n\tlet raw = ''\n\n\tfor (let i = 0; i < value.length && i < tokens.length; i++) {\n\t\tif (!tokens[i].isLiteral && value[i] !== placeholder) {\n\t\t\traw += value[i]\n\t\t}\n\t}\n\n\treturn raw\n}\n\n/**\n * Check if mask is complete\n */\nfunction isComplete(value: string, tokens: MaskToken[], placeholder: string): boolean {\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tif (!tokens[i].isLiteral && (i >= value.length || value[i] === placeholder)) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n/**\n * Calculate cursor position, skipping literals\n */\nfunction getCursorPos(tokens: MaskToken[], rawCursorPos: number): number {\n\tlet pos = rawCursorPos\n\n\twhile (pos < tokens.length && tokens[pos].isLiteral) {\n\t\tpos++\n\t}\n\n\treturn Math.min(pos, tokens.length)\n}\n\n/**\n * v-mask directive\n *\n * @example\n * ```vue\n * <input v-mask=\"'###-##-####'\" placeholder=\"SSN\" />\n * <input v-mask=\"'(###) ###-####'\" placeholder=\"Phone\" />\n * <input v-mask=\"{ mask: '##/##/####' }\" placeholder=\"Date\" />\n * ```\n */\nexport const vMask = defineDirective<MaskBinding, HTMLInputElement>({\n\tname: 'mask',\n\tssr: false,\n\tdefaults: { placeholder: '_', showPlaceholder: true, showMaskOnBlur: false, clearIncomplete: false, disabled: false },\n\n\tmounted(el, binding) {\n\t\tif (!isInput(el)) {\n\t\t\tconsole.warn('[Directix] v-mask: directive must be used on input or textarea elements')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst placeholder = options.placeholder || '_'\n\t\tconst tokens = parseMask(options.mask, placeholder)\n\n\t\tconst inputHandler = (e: Event): void => {\n\t\t\tconst target = e.target as HTMLInputElement\n\t\t\tconst rawValue = target.value\n\t\t\tconst cursorPos = target.selectionStart || 0\n\n\t\t\tconst formatted = formatValue(rawValue, tokens, placeholder, options.showPlaceholder ?? true)\n\n\t\t\tif (formatted !== rawValue) {\n\t\t\t\ttarget.value = formatted\n\t\t\t\ttarget.setSelectionRange(getCursorPos(tokens, cursorPos), getCursorPos(tokens, cursorPos))\n\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\toptions.onChange?.(formatted, getRawValue(formatted, tokens, placeholder))\n\t\t\tif (isComplete(formatted, tokens, placeholder)) {\n\t\t\t\toptions.onComplete?.(formatted)\n\t\t\t}\n\t\t}\n\n\t\tconst focusHandler = (): void => {\n\t\t\tif (!el.value && options.showPlaceholder) {\n\t\t\t\tel.value = formatValue('', tokens, placeholder, true)\n\t\t\t}\n\t\t}\n\n\t\tconst blurHandler = (): void => {\n\t\t\tif (!options.showMaskOnBlur && !isComplete(el.value, tokens, placeholder) && options.clearIncomplete) {\n\t\t\t\tel.value = ''\n\t\t\t}\n\t\t}\n\n\t\ton(el, 'input', inputHandler)\n\t\ton(el, 'focus', focusHandler)\n\t\ton(el, 'blur', blurHandler)\n\n\t\t;(el as any)[STATE_KEY] = { options, tokens, placeholder, inputHandler, focusHandler, blurHandler }\n\n\t\tif (el.value) {\n\t\t\tel.value = formatValue(el.value, tokens, placeholder, options.showPlaceholder ?? true)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tstate.tokens = parseMask(state.options.mask, state.placeholder)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\toff(el, 'input', state.inputHandler)\n\t\toff(el, 'focus', state.focusHandler)\n\t\toff(el, 'blur', state.blurHandler)\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vMask\n","import { defineDirective } from '@directix/core'\nimport type { DirectiveBinding } from '@directix/core'\n\n// ============ Types ============\n\n/**\n * Permission action mode\n */\nexport type PermissionAction = 'remove' | 'disable' | 'hide'\n\n/**\n * Permission check mode\n */\nexport type PermissionMode = 'some' | 'every'\n\n/**\n * Permission directive options\n */\nexport interface PermissionOptions {\n\t/** Permission value(s) to check */\n\tvalue: string | string[]\n\t/** Logic for multiple permissions: 'some' (OR) or 'every' (AND). Default: 'some' */\n\tmode?: PermissionMode\n\t/** Action when permission denied. Default: 'remove' */\n\taction?: PermissionAction\n\t/** Custom permission check function */\n\tcheck?: (permission: string | string[], mode: PermissionMode) => boolean\n\t/** Callback when permission state changes */\n\tonChange?: (hasPermission: boolean) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type PermissionBinding = string | string[] | PermissionOptions\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n\t/** Get current user's permissions */\n\tgetPermissions: () => string[]\n\t/** Get current user's roles */\n\tgetRoles?: () => string[]\n\t/** Role to permission mapping */\n\troleMap?: Record<string, string[]>\n}\n\n// ============ Constants ============\n\nconst STATE_KEY = '__permission' as const\nconst WILDCARD = '*' as const\n\n// ============ State ============\n\ninterface ElementState {\n\toptions: PermissionOptions\n\toriginalDisplay: string\n\toriginalDisabled: boolean | string\n\tparentNode: Node | null\n\tplaceholder: Comment | null\n}\n\n// Global configuration\nlet globalConfig: PermissionConfig | null = null\n\n// ============ Configuration ============\n\n/**\n * Configure permission directive\n */\nexport function configurePermission(config: PermissionConfig): void {\n\tglobalConfig = config\n}\n\n/**\n * Get current configuration\n */\nexport function getPermissionConfig(): PermissionConfig | null {\n\treturn globalConfig\n}\n\n// ============ Helpers ============\n\n/**\n * Normalize binding value to options object\n */\nfunction normalizeOptions(binding: PermissionBinding | undefined): PermissionOptions {\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-permission: permission value is required')\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\tif (Array.isArray(binding)) {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\n/**\n * Check if a permission is granted (supports wildcard)\n */\nfunction hasPermission(required: string, permissions: string[]): boolean {\n\treturn permissions.includes(WILDCARD) || permissions.includes(required)\n}\n\n/**\n * Verify permission against configuration\n */\nfunction verifyPermission(options: PermissionOptions): boolean {\n\t// Custom check function takes priority\n\tif (options.check) {\n\t\treturn options.check(options.value, options.mode || 'some')\n\t}\n\n\t// Require global configuration\n\tif (!globalConfig) {\n\t\tconsole.warn('[Directix] v-permission: No permission config provided')\n\n\t\treturn true\n\t}\n\n\tconst permissions = globalConfig.getPermissions()\n\tconst roles = globalConfig.getRoles?.() || []\n\tconst roleMap = globalConfig.roleMap || {}\n\tconst required = Array.isArray(options.value) ? options.value : [options.value]\n\tconst mode = options.mode || 'some'\n\n\t/**\n\t * Check a single value - can be a role name or permission\n\t */\n\tfunction checkSingle(value: string): boolean {\n\t\t// If value is a role name in roleMap, check if user has that role\n\t\tif (value in roleMap) {\n\t\t\treturn roles.includes(value)\n\t\t}\n\n\t\t// Check direct permission\n\t\tif (hasPermission(value, permissions)) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Check if any of user's roles grant this permission\n\t\tfor (const role of roles) {\n\t\t\tconst rolePermissions = roleMap[role] || []\n\n\t\t\tif (hasPermission(value, rolePermissions)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\treturn mode === 'every' ? required.every(checkSingle) : required.some(checkSingle)\n}\n\n/**\n * Handle element when permission is denied\n */\nfunction handleDenied(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tstate.parentNode = el.parentNode\n\t\t\tstate.placeholder = document.createComment('v-permission')\n\t\t\tel.parentNode?.insertBefore(state.placeholder, el)\n\t\t\tel.parentNode?.removeChild(el)\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tstate.originalDisabled = el.getAttribute('disabled') || false\n\t\t\tel.setAttribute('disabled', 'true')\n\t\t\tel.classList.add('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tstate.originalDisplay = el.style.display\n\t\t\tel.style.display = 'none'\n\t\t\tel.classList.add('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Restore element when permission is granted\n */\nfunction handleGranted(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tif (state.placeholder && state.parentNode) {\n\t\t\t\tstate.parentNode.insertBefore(el, state.placeholder)\n\t\t\t\tstate.parentNode.removeChild(state.placeholder)\n\t\t\t\tstate.placeholder = null\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tif (state.originalDisabled === false) {\n\t\t\t\tel.removeAttribute('disabled')\n\t\t\t} else if (state.originalDisabled) {\n\t\t\t\tel.setAttribute('disabled', state.originalDisabled as string)\n\t\t\t}\n\t\t\tel.classList.remove('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tel.style.display = state.originalDisplay || ''\n\t\t\tel.classList.remove('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Get or create element state\n */\nfunction getState(el: HTMLElement): ElementState {\n\tif (!(el as any)[STATE_KEY]) {\n\t\t;(el as any)[STATE_KEY] = {\n\t\t\toptions: { value: '' },\n\t\t\toriginalDisplay: '',\n\t\t\toriginalDisabled: false,\n\t\t\tparentNode: null,\n\t\t\tplaceholder: null,\n\t\t} as ElementState\n\t}\n\n\treturn (el as any)[STATE_KEY]\n}\n\n/**\n * Check permission and update element state\n */\nfunction checkPermission(el: HTMLElement, binding: DirectiveBinding<PermissionBinding>): void {\n\tconst state = getState(el)\n\n\tstate.options = normalizeOptions(binding.value)\n\n\tconst granted = verifyPermission(state.options)\n\n\t// Trigger change callback\n\tstate.options.onChange?.(granted)\n\n\tconst action = state.options.action || 'remove'\n\n\tif (granted) {\n\t\thandleGranted(el, action, state)\n\t} else {\n\t\thandleDenied(el, action, state)\n\t}\n}\n\n/**\n * Cleanup element state\n */\nfunction cleanup(el: HTMLElement): void {\n\tconst state: ElementState = (el as any)[STATE_KEY]\n\n\tif (state?.placeholder && state.parentNode) {\n\t\tstate.parentNode.removeChild(state.placeholder)\n\t}\n\n\tdelete (el as any)[STATE_KEY]\n}\n\n// ============ Directive ============\n\n/**\n * v-permission directive\n *\n * Controls element visibility and state based on user permissions.\n * Supports role-based and permission-based access control with wildcard support.\n *\n * @example\n * ```vue\n * <template>\n * <button v-permission=\"'admin'\">Admin Only</button>\n * <button v-permission=\"['admin', 'editor']\">Admin or Editor</button>\n * <button v-permission=\"{ value: ['read', 'write'], mode: 'every' }\">Read & Write</button>\n * <button v-permission=\"{ value: 'admin', action: 'disable' }\">Disabled for non-admin</button>\n * </template>\n *\n * <script setup>\n * import { configurePermission } from 'directix'\n *\n * configurePermission({\n * getPermissions: () => store.getters.permissions,\n * getRoles: () => store.getters.roles,\n * roleMap: { admin: ['*'], editor: ['read', 'write'] }\n * })\n * </script>\n * ```\n */\nexport const vPermission = defineDirective<PermissionBinding, HTMLElement>({\n\tname: 'permission',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tupdated(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tunmounted(el) {\n\t\tcleanup(el)\n\t},\n})\n\nexport default vPermission\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Sanitize handler\n */\nexport type SanitizeHandler = (value: string) => string\n\n/**\n * Sanitize directive options\n */\nexport interface SanitizeOptions {\n\t/**\n\t * Tags to allow (whitelist)\n\t * @default []\n\t */\n\tallowedTags?: string[]\n\n\t/**\n\t * Attributes to allow (whitelist)\n\t * @default []\n\t */\n\tallowedAttributes?: string[]\n\n\t/**\n\t * Whether to allow data URLs\n\t * @default false\n\t */\n\tallowDataUrls?: boolean\n\n\t/**\n\t * Whether to allow inline styles\n\t * @default false\n\t */\n\tallowStyles?: boolean\n\n\t/**\n\t * Whether to allow class attribute\n\t * @default false\n\t */\n\tallowClass?: boolean\n\n\t/**\n\t * Whether to allow id attribute\n\t * @default false\n\t */\n\tallowId?: boolean\n\n\t/**\n\t * Custom sanitize function\n\t */\n\thandler?: SanitizeHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to sanitize on update\n\t * @default true\n\t */\n\tsanitizeOnUpdate?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type SanitizeBinding = boolean | SanitizeOptions\n\n/**\n * Default allowed tags (safe subset)\n */\nconst DEFAULT_ALLOWED_TAGS = ['b', 'i', 'u', 'strong', 'em', 'br', 'p', 'span', 'div']\n\n/**\n * Default allowed attributes\n */\nconst DEFAULT_ALLOWED_ATTRIBUTES = ['title', 'alt', 'href', 'src']\n\n/**\n * Dangerous tags that should always be removed\n */\nconst DANGEROUS_TAGS = ['script', 'iframe', 'object', 'embed', 'form', 'input', 'style', 'link', 'meta', 'base']\n\n/**\n * Dangerous attributes that should always be removed\n */\nconst DANGEROUS_ATTRIBUTES = ['onclick', 'onerror', 'onload', 'onmouseover', 'onfocus', 'onblur', 'onchange', 'onsubmit']\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: SanitizeBinding | undefined): SanitizeOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true }\n\t}\n\n\tif (binding === true) {\n\t\treturn {\n\t\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\t}\n\t}\n\n\treturn {\n\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\tallowDataUrls: false,\n\t\tallowStyles: false,\n\t\tallowClass: false,\n\t\tallowId: false,\n\t\tdisabled: false,\n\t\tsanitizeOnUpdate: true,\n\t\t...binding,\n\t}\n}\n\n/**\n * Basic HTML sanitizer\n */\nfunction sanitizeHtml(html: string, options: SanitizeOptions): string {\n\t// Use custom handler if provided\n\tif (options.handler) {\n\t\treturn options.handler(html)\n\t}\n\n\t// Create a temporary element for parsing\n\tconst temp = document.createElement('div')\n\n\ttemp.innerHTML = html\n\n\t// Remove dangerous tags\n\tfor (const tag of DANGEROUS_TAGS) {\n\t\tconst elements = temp.getElementsByTagName(tag)\n\n\t\twhile (elements.length > 0) {\n\t\t\telements[0].parentNode?.removeChild(elements[0])\n\t\t}\n\t}\n\n\t// Process all elements\n\tconst processElement = (el: Element): void => {\n\t\t// Check if tag is allowed\n\t\tconst tagName = el.tagName.toLowerCase()\n\n\t\tif (options.allowedTags && !options.allowedTags.includes(tagName)) {\n\t\t\t// Replace with text content\n\t\t\tconst text = document.createTextNode(el.textContent || '')\n\n\t\t\tel.parentNode?.replaceChild(text, el)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Remove dangerous attributes\n\t\tfor (const attr of DANGEROUS_ATTRIBUTES) {\n\t\t\tel.removeAttribute(attr)\n\t\t}\n\n\t\t// Remove javascript: URLs\n\t\tconst href = el.getAttribute('href')\n\n\t\tif (href && href.toLowerCase().startsWith('javascript:')) {\n\t\t\tel.removeAttribute('href')\n\t\t}\n\n\t\t// Remove data: URLs if not allowed\n\t\tif (!options.allowDataUrls) {\n\t\t\tconst src = el.getAttribute('src')\n\n\t\t\tif (src && src.toLowerCase().startsWith('data:')) {\n\t\t\t\tel.removeAttribute('src')\n\t\t\t}\n\t\t}\n\n\t\t// Filter attributes\n\t\tif (options.allowedAttributes) {\n\t\t\tconst attrs = Array.from(el.attributes)\n\n\t\t\tfor (const attr of attrs) {\n\t\t\t\tconst isAllowed = options.allowedAttributes.includes(attr.name.toLowerCase())\n\t\t\t\tconst isClass = attr.name === 'class' && options.allowClass\n\t\t\t\tconst isId = attr.name === 'id' && options.allowId\n\t\t\t\tconst isStyle = attr.name === 'style' && options.allowStyles\n\n\t\t\t\tif (!isAllowed && !isClass && !isId && !isStyle) {\n\t\t\t\t\tel.removeAttribute(attr.name)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process children\n\t\tfor (const child of Array.from(el.children)) {\n\t\t\tprocessElement(child)\n\t\t}\n\t}\n\n\t// Process all child elements\n\tfor (const child of Array.from(temp.children)) {\n\t\tprocessElement(child)\n\t}\n\n\treturn temp.innerHTML\n}\n\n/**\n * v-sanitize directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-sanitize v-html=\"userContent\"></div>\n * <div v-sanitize=\"{ allowedTags: ['b', 'i', 'p'] }\" v-html=\"userContent\"></div>\n * <div v-sanitize=\"{ handler: customSanitizer }\" v-html=\"userContent\"></div>\n * </template>\n * ```\n */\nexport const vSanitize = defineDirective<SanitizeBinding, HTMLElement>({\n\tname: 'sanitize',\n\tssr: true,\n\tdefaults: {\n\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\tallowDataUrls: false,\n\t\tallowStyles: false,\n\t\tallowClass: false,\n\t\tallowId: false,\n\t\tdisabled: false,\n\t\tsanitizeOnUpdate: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Store options\n\t\t;(el as any).__sanitize = { options }\n\n\t\t// Sanitize initial content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, options)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__sanitize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.disabled || !state.options.sanitizeOnUpdate) return\n\n\t\t// Sanitize updated content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, state.options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__sanitize\n\t},\n})\n\nexport default vSanitize\n","import { defineDirective, isBrowser, supportsResizeObserver } from '@directix/core'\n\n/**\n * Resize event handler\n */\nexport type ResizeHandler = (entry: ResizeObserverEntry) => void\n\n/**\n * Resize information\n */\nexport interface ResizeInfo {\n\t/** New width */\n\twidth: number\n\t/** New height */\n\theight: number\n\t/** Content rect */\n\tcontentRect: DOMRectReadOnly\n\t/** Border box size */\n\tborderBoxSize: ReadonlyArray<ResizeObserverSize>\n\t/** Content box size */\n\tcontentBoxSize: ReadonlyArray<ResizeObserverSize>\n\t/** Device pixel content box size */\n\tdevicePixelContentBoxSize: ReadonlyArray<ResizeObserverSize>\n}\n\n/**\n * Resize directive options\n */\nexport interface ResizeOptions {\n\t/**\n\t * Resize event handler\n\t * @required\n\t */\n\thandler: ResizeHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use box model\n\t * - 'content-box': size of content area\n\t * - 'border-box': size of border box\n\t * - 'device-pixel-content-box': size in device pixels\n\t * @default 'content-box'\n\t */\n\tbox?: 'content-box' | 'border-box' | 'device-pixel-content-box'\n\n\t/**\n\t * Debounce time in milliseconds\n\t * @default 0 (no debounce)\n\t */\n\tdebounce?: number\n\n\t/**\n\t * Callback for browsers without ResizeObserver (uses object fallback)\n\t */\n\tonFallback?: (info: ResizeInfo) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type ResizeBinding = ResizeHandler | ResizeOptions\n\n/**\n * Element state storage\n */\ninterface ResizeState {\n\toptions: ResizeOptions\n\tobserver: ResizeObserver | null\n\thandler: (entry: ResizeObserverEntry) => void\n\tdebounceTimer: ReturnType<typeof setTimeout> | null\n\tpendingEntry: ResizeObserverEntry | null\n\tfallbackIframe: HTMLIFrameElement | null\n}\n\n/**\n * Get resize info from entry\n */\nfunction getResizeInfo(entry: ResizeObserverEntry): ResizeInfo {\n\treturn {\n\t\twidth: entry.contentRect.width,\n\t\theight: entry.contentRect.height,\n\t\tcontentRect: entry.contentRect,\n\t\tborderBoxSize: entry.borderBoxSize,\n\t\tcontentBoxSize: entry.contentBoxSize,\n\t\tdevicePixelContentBoxSize: entry.devicePixelContentBoxSize,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ResizeBinding | undefined): ResizeOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-resize: handler is required')\n\t}\n\n\treturn {\n\t\tdisabled: false,\n\t\tbox: 'content-box',\n\t\tdebounce: 0,\n\t\t...binding,\n\t}\n}\n\n/**\n * Create fallback resize detection using object\n */\nfunction createFallbackResize(\n\tel: HTMLElement,\n\tcallback: () => void,\n): { iframe: HTMLIFrameElement; cleanup: () => void } {\n\t// Create an invisible iframe for resize detection\n\tconst iframe = document.createElement('iframe')\n\n\tiframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: none;\n pointer-events: none;\n opacity: 0;\n `\n\n\tel.appendChild(iframe)\n\n\tconst iWindow = iframe.contentWindow\n\n\tif (iWindow) {\n\t\tiWindow.addEventListener('resize', callback)\n\t}\n\n\treturn {\n\t\tiframe,\n\t\tcleanup: () => {\n\t\t\tif (iWindow) {\n\t\t\t\tiWindow.removeEventListener('resize', callback)\n\t\t\t}\n\n\t\t\tiframe.remove()\n\t\t},\n\t}\n}\n\n/**\n * v-resize directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-resize=\"handleResize\">Resize me</div>\n * <div v-resize=\"{ handler: handleResize, debounce: 200 }\">Debounced resize</div>\n * </template>\n * ```\n */\nexport const vResize = defineDirective<ResizeBinding, HTMLElement>({\n\tname: 'resize',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tbox: 'content-box',\n\t\tdebounce: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Ensure element has relative or absolute positioning for fallback\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst state: ResizeState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\tdebounceTimer: null,\n\t\t\tpendingEntry: null,\n\t\t\tfallbackIframe: null,\n\t\t\thandler: (entry: ResizeObserverEntry) => {\n\t\t\t\t// Handle debounce\n\t\t\t\tif (options.debounce && options.debounce > 0) {\n\t\t\t\t\tstate.pendingEntry = entry\n\n\t\t\t\t\tif (!state.debounceTimer) {\n\t\t\t\t\t\tstate.debounceTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEntry) {\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEntry)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.debounceTimer = null\n\t\t\t\t\t\t\tstate.pendingEntry = null\n\t\t\t\t\t\t}, options.debounce)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toptions.handler(entry)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__resize = state\n\n\t\t// Use ResizeObserver if available\n\t\tif (supportsResizeObserver()) {\n\t\t\tstate.observer = new ResizeObserver(entries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tstate.handler(entry)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.observer.observe(el, { box: options.box })\n\t\t} else {\n\t\t\t// Fallback using iframe\n\t\t\tconsole.warn('[Directix] v-resize: ResizeObserver not supported, using fallback')\n\n\t\t\tconst { iframe, cleanup } = createFallbackResize(el, () => {\n\t\t\t\tconst rect = el.getBoundingClientRect()\n\t\t\t\tconst entry = {\n\t\t\t\t\ttarget: el,\n\t\t\t\t\tcontentRect: rect as DOMRectReadOnly,\n\t\t\t\t\tborderBoxSize: [] as any,\n\t\t\t\t\tcontentBoxSize: [] as any,\n\t\t\t\t\tdevicePixelContentBoxSize: [] as any,\n\t\t\t\t}\n\n\t\t\t\tstate.handler(entry as ResizeObserverEntry)\n\n\t\t\t\tif (options.onFallback) {\n\t\t\t\t\toptions.onFallback(getResizeInfo(entry as ResizeObserverEntry))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.fallbackIframe = iframe\n\t\t\t;(el as any).__resizeCleanup = cleanup\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\t// Clear debounce timer\n\t\tif (state.debounceTimer) {\n\t\t\tclearTimeout(state.debounceTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Cleanup fallback\n\t\tconst cleanup = (el as any).__resizeCleanup\n\n\t\tif (cleanup) {\n\t\t\tcleanup()\n\t\t}\n\n\t\tdelete (el as any).__resize\n\t\tdelete (el as any).__resizeCleanup\n\t},\n})\n\nexport default vResize\n","import { defineDirective, isBrowser, supportsMutationObserver } from '@directix/core'\n\n/**\n * Mutation change handler\n */\nexport type MutationHandler = (mutations: MutationRecord[], observer: MutationObserver) => void\n\n/**\n * Mutation directive options\n */\nexport interface MutationOptions {\n\t/**\n\t * Callback when mutations occur\n\t * @required\n\t */\n\thandler: MutationHandler\n\n\t/**\n\t * Whether to observe attribute changes\n\t * @default false\n\t */\n\tattributes?: boolean\n\n\t/**\n\t * Specific attributes to observe\n\t */\n\tattributeFilter?: string[]\n\n\t/**\n\t * Whether to observe child node additions/removals\n\t * @default true\n\t */\n\tchildList?: boolean\n\n\t/**\n\t * Whether to observe all descendants, not just direct children\n\t * @default false\n\t */\n\tsubtree?: boolean\n\n\t/**\n\t * Whether to observe character data changes\n\t * @default false\n\t */\n\tcharacterData?: boolean\n\n\t/**\n\t * Whether to record old attribute values\n\t * @default false\n\t */\n\tattributeOldValue?: boolean\n\n\t/**\n\t * Whether to record old character data\n\t * @default false\n\t */\n\tcharacterDataOldValue?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type MutationBinding = MutationHandler | MutationOptions\n\n/**\n * Element state storage\n */\ninterface MutationState {\n\toptions: MutationOptions\n\tobserver: MutationObserver | null\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: MutationBinding | undefined): MutationOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, childList: true }\n\t}\n\n\tif (!binding || !binding.handler) {\n\t\tthrow new Error('[Directix] v-mutation: handler is required')\n\t}\n\n\treturn {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-mutation directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-mutation=\"handleMutation\">Observe my changes</div>\n * <div v-mutation=\"{ handler: handleMutation, attributes: true, subtree: true }\">\n * Observe attributes and subtree\n * </div>\n * </template>\n *\n * <script setup>\n * function handleMutation(mutations: MutationRecord[], observer: MutationObserver) {\n * mutations.forEach(mutation => {\n * console.log('Type:', mutation.type)\n * console.log('Target:', mutation.target)\n * })\n * }\n * </script>\n * ```\n */\nexport const vMutation = defineDirective<MutationBinding, HTMLElement>({\n\tname: 'mutation',\n\tssr: false,\n\tdefaults: {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Check MutationObserver support\n\t\tif (!supportsMutationObserver()) {\n\t\t\tconsole.warn('[Directix] v-mutation: MutationObserver not supported')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: MutationState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t}\n\n\t\t// Create observer\n\t\tstate.observer = new MutationObserver((mutations, observer) => {\n\t\t\toptions.handler(mutations, observer)\n\t\t})\n\n\t\t// Start observing\n\t\tstate.observer.observe(el, {\n\t\t\tattributes: options.attributes,\n\t\t\tattributeFilter: options.attributeFilter,\n\t\t\tchildList: options.childList,\n\t\t\tsubtree: options.subtree,\n\t\t\tcharacterData: options.characterData,\n\t\t\tattributeOldValue: options.attributeOldValue,\n\t\t\tcharacterDataOldValue: options.characterDataOldValue,\n\t\t})\n\n\t\t// Store state\n\t\t;(el as any).__mutation = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disconnect if was enabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.disconnect()\n\t\t\t}\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Re-observe if was disabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t})\n\t\t\t}\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// If options changed, reconnect with new options\n\t\t\tif (\n\t\t\t\tnewOptions.attributes !== state.options.attributes ||\n\t\t\t\tnewOptions.childList !== state.options.childList ||\n\t\t\t\tnewOptions.subtree !== state.options.subtree ||\n\t\t\t\tnewOptions.characterData !== state.options.characterData\n\t\t\t) {\n\t\t\t\tif (state.observer) {\n\t\t\t\t\tstate.observer.disconnect()\n\t\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__mutation\n\t},\n})\n\nexport default vMutation\n","import type { App, Directive, Plugin } from 'vue'\nimport type { DirectiveInstallOptions } from '@directix/core'\nimport { setVueVersion } from '@directix/core'\nimport {\n\tvClickOutside,\n\tvCopy,\n\tvDebounce,\n\tvFocus,\n\tvHover,\n\tvInfiniteScroll,\n\tvIntersect,\n\tvLazy,\n\tvLoading,\n\tvLongPress,\n\tvMask,\n\tvMutation,\n\tvPermission,\n\tvResize,\n\tvRipple,\n\tvSanitize,\n\tvScroll,\n\tvSticky,\n\tvThrottle,\n\tvVisible,\n} from './directives'\n\n// Export all directives\nexport * from './directives'\n\n// Export core utilities\nexport * from '@directix/core'\n\n// Export shared utilities (excluding tools with the same name as directives)\nexport {\n\tisString,\n\tisNumber,\n\tisBoolean,\n\tisFunction,\n\tisObject,\n\tisArray,\n\tisEmpty,\n\tisPromise,\n\tdeepClone,\n\tdeepMerge,\n\tget,\n\tset,\n\tparseTime,\n\tgenerateId,\n} from '@directix/shared'\n// Export debounce and throttle utility functions separately (with aliases)\nexport {\n\tdebounce as debounceFn,\n\tthrottle as throttleFn,\n} from '@directix/shared'\n\n// All directives list\nconst allDirectives: Record<string, Directive> = {\n\t'click-outside': vClickOutside,\n\tcopy: vCopy,\n\tdebounce: vDebounce,\n\tthrottle: vThrottle,\n\tfocus: vFocus,\n\tlazy: vLazy,\n\tintersect: vIntersect,\n\tvisible: vVisible,\n\tloading: vLoading,\n\tscroll: vScroll,\n\t'infinite-scroll': vInfiniteScroll,\n\tsticky: vSticky,\n\t'long-press': vLongPress,\n\thover: vHover,\n\tripple: vRipple,\n\tmask: vMask,\n\tpermission: vPermission,\n\tsanitize: vSanitize,\n\tresize: vResize,\n\tmutation: vMutation,\n}\n\n/**\n * Install all directives\n */\nconst install = (app: App | any, options: DirectiveInstallOptions = {}): void => {\n\t// Detect Vue version from app instance\n\t// Vue 2: app is the Vue constructor (has version static property, has directive static method)\n\t// Vue 3: app is an app instance (has config property, version on app.constructor or as _context)\n\n\tlet vueVersion: 2 | 3 | null = null\n\n\t// Check if it's Vue 2 constructor\n\tif (typeof app === 'function' && app.version?.startsWith('2')) {\n\t\tvueVersion = 2\n\t} else if (app?.config && app?.version?.startsWith('3')) {\n\t\t// Check if it's Vue 3 app instance\n\t\tvueVersion = 3\n\t} else if (typeof app?.directive === 'function' && typeof app?.mixin === 'function' && app.version?.startsWith('2')) {\n\t\t// Check for Vue 2 static methods (directive, component, mixin, etc.)\n\t\tvueVersion = 2\n\t} else if (typeof window !== 'undefined') {\n\t\t// Fallback: check global Vue\n\t\tconst win = window as any\n\n\t\tif (win.Vue?.version?.startsWith('2')) {\n\t\t\tvueVersion = 2\n\t\t} else if (win.Vue?.version?.startsWith('3')) {\n\t\t\tvueVersion = 3\n\t\t}\n\t}\n\n\t// Set the detected version\n\tif (vueVersion) {\n\t\tsetVueVersion(vueVersion)\n\t}\n\n\tconst { directives, all = false } = options\n\n\tif (all || !directives) {\n\t\t// Register all directives\n\t\tObject.entries(allDirectives).forEach(([name, directive]) => {\n\t\t\tapp.directive(name, directive)\n\t\t})\n\t} else {\n\t\t// Register specified directives\n\t\tdirectives.forEach(name => {\n\t\t\tconst directive = allDirectives[name]\n\n\t\t\tif (directive) {\n\t\t\t\tapp.directive(name, directive)\n\t\t\t} else {\n\t\t\t\tconsole.warn(`[Directix] Unknown directive: ${name}`)\n\t\t\t}\n\t\t})\n\t}\n}\n\n/**\n * Directix plugin\n */\nexport const Directix: Plugin = {\n\tinstall,\n}\n"],"names":["addCleanup","normalizeOptions","getEventTypeFromModifiers","getEventType","EVENT_MODIFIERS","STATE_KEY","scrollTop","scrollHeight","clientHeight","_a","cleanup"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../packages/core/src/adapter/vue2.ts","../packages/core/src/adapter/vue3.ts","../packages/core/src/env.ts","../packages/core/src/define.ts","../src/utils/text-transform.ts","../src/directives/capitalcase.ts","../src/directives/click-delay.ts","../packages/shared/src/dom.ts","../packages/shared/src/event.ts","../packages/shared/src/utils.ts","../src/directives/click-outside.ts","../src/directives/copy.ts","../src/directives/countdown.ts","../src/utils/event.ts","../src/directives/debounce.ts","../src/directives/draggable.ts","../src/directives/ellipsis.ts","../src/directives/focus.ts","../src/directives/hotkey.ts","../src/directives/hover.ts","../src/directives/image-preview.ts","../src/directives/infinite-scroll.ts","../src/directives/intersect.ts","../src/directives/lazy.ts","../src/directives/loading.ts","../src/directives/long-press.ts","../src/directives/lowercase.ts","../src/directives/mask.ts","../src/utils/number.ts","../src/directives/money.ts","../src/directives/mutation.ts","../src/directives/number.ts","../src/directives/permission.ts","../src/directives/print.ts","../src/directives/pull-refresh.ts","../src/directives/resize.ts","../src/directives/ripple.ts","../src/directives/sanitize.ts","../src/directives/scroll.ts","../src/directives/sticky.ts","../src/directives/swipe.ts","../src/directives/throttle.ts","../src/directives/tooltip.ts","../src/directives/touch.ts","../src/directives/trim.ts","../src/directives/truncate.ts","../src/directives/uppercase.ts","../src/directives/virtual-list.ts","../src/directives/visible.ts","../src/directives/watermark.ts","../src/index.ts"],"sourcesContent":["import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 2 directive adapter\n * @returns Vue 2 directive object with bind/inserted/update/unbind hooks\n */\nexport function createVue2Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tbind(el: B, binding: any, vnode: VNode) {\n\t\t\t// Store state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tinserted(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 2's inserted is called after element is inserted into DOM\n\t\t\t// Call mounted here to ensure element is in DOM\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tupdate(el: B, binding: any, vnode: VNode, oldVnode: VNode) {\n\t\t\tconst state = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBinding(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBinding({ ...binding, value: binding.oldValue }),\n\t\t\t\t\toldVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tcomponentUpdated(_el: B, _binding: any, _vnode: VNode, _oldVnode: VNode) {\n\t\t\t// Vue 2 specific, called after component update completes\n\t\t\t// Usually update is sufficient\n\t\t},\n\n\t\tunbind(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 2 binding to unified format\n */\nfunction normalizeBinding<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance || null,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 3 directive adapter\n * @returns Vue 3 directive object with created/mounted/updated/unmounted hooks\n */\nexport function createVue3Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tcreated(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 3's created is called when element is created\n\t\t\t// Initialize state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tbeforeMount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before mount\n\t\t},\n\n\t\tmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate(_el: B, _binding: any, _vnode: VNode, _prevVnode: VNode) {\n\t\t\t// Before update\n\t\t},\n\n\t\tupdated(el: B, binding: any, vnode: VNode, prevVnode: VNode) {\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBindingVue3(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBindingVue3({ ...binding, value: binding.oldValue }),\n\t\t\t\t\tprevVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tbeforeUnmount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before unmount\n\t\t},\n\n\t\tunmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 3 binding to unified format\n */\nfunction normalizeBindingVue3<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","/**\n * Vue version type\n * - 2: Vue 2.6.x (requires @vue/composition-api for Composition API)\n * - 2.7: Vue 2.7.x (has built-in Composition API support)\n * - 3: Vue 3.x\n */\nexport type VueVersion = 2 | 2.7 | 3\n\n/**\n * Vue version detection\n */\nlet _vueVersion: VueVersion | null = null,\n\t_isVue2: boolean | null = null,\n\t_isVue27: boolean | null = null,\n\t_isVue3: boolean | null = null\n\n/**\n * Parse version string to VueVersion\n */\nfunction parseVersion(version: string): VueVersion | null {\n\tif (version.startsWith('2.7')) return 2.7\n\tif (version.startsWith('2')) return 2\n\tif (version.startsWith('3')) return 3\n\n\treturn null\n}\n\n/**\n * Get current Vue version\n */\nexport function getVueVersion(): VueVersion {\n\tif (_vueVersion !== null) return _vueVersion\n\n\t// Method 1: Check environment variable (highest priority)\n\tif (typeof process !== 'undefined') {\n\t\tconst envVersion = process.env.DIRECTIX_VUE_VERSION\n\n\t\tif (envVersion === '2.7') {\n\t\t\t_vueVersion = 2.7\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '2') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '3') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Method 2: Try require (CommonJS/Node.js)\n\ttry {\n\t\t// eslint-disable-next-line ts/no-require-imports\n\t\tconst vue = require('vue')\n\t\tconst version = parseVersion(vue?.version)\n\n\t\tif (version !== null) {\n\t\t\t_vueVersion = version\n\n\t\t\treturn _vueVersion\n\t\t}\n\t} catch {\n\t\t// require failed, continue to other methods\n\t}\n\n\t// Method 3: Check browser environment\n\tif (typeof window !== 'undefined') {\n\t\tconst win = window as any\n\t\tconst vue = win.Vue\n\n\t\t// Check version string\n\t\tif (vue?.version) {\n\t\t\tconst version = parseVersion(vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\n\t\t// Check Vue 2 specific API\n\t\tif (typeof vue?.observable === 'function') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check Vue 3 specific API\n\t\tif (typeof vue?.createApp === 'function' && typeof vue?.observable !== 'function') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check devtools hook\n\t\tconst devtools = win.__VUE_DEVTOOLS_GLOBAL_HOOK__\n\n\t\tif (devtools?.Vue?.version) {\n\t\t\tconst version = parseVersion(devtools.Vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\t\tif (devtools?.apps?.length) {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Default to Vue 3 but warn\n\tif (_vueVersion === null) {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tconsole.warn(\n\t\t\t\t'[Directix] Unable to detect Vue version, defaulting to Vue 3. '\n\t\t\t\t+ 'Set DIRECTIX_VUE_VERSION=2 or call setVueVersion(2) if using Vue 2.',\n\t\t\t)\n\t\t}\n\t\t_vueVersion = 3\n\t}\n\n\treturn _vueVersion\n}\n\n/**\n * Set Vue version explicitly (for cases where auto-detection fails)\n */\nexport function setVueVersion(version: VueVersion): void {\n\t_vueVersion = version\n\t_isVue2 = version === 2 || version === 2.7\n\t_isVue27 = version === 2.7\n\t_isVue3 = version === 3\n}\n\n/**\n * Reset Vue version (useful for testing)\n */\nexport function resetVueVersion(): void {\n\t_vueVersion = null\n\t_isVue2 = null\n\t_isVue27 = null\n\t_isVue3 = null\n}\n\n/**\n * Check if Vue 2 (includes 2.7)\n */\nexport function isVue2(): boolean {\n\tif (_isVue2 === null) {\n\t\tconst version = getVueVersion()\n\n\t\t_isVue2 = version === 2 || version === 2.7\n\t}\n\n\treturn _isVue2\n}\n\n/**\n * Check if Vue 2.7 (has built-in Composition API support)\n */\nexport function isVue27(): boolean {\n\tif (_isVue27 === null) {\n\t\t_isVue27 = getVueVersion() === 2.7\n\t}\n\n\treturn _isVue27\n}\n\n/**\n * Check if Vue 3\n */\nexport function isVue3(): boolean {\n\tif (_isVue3 === null) {\n\t\t_isVue3 = getVueVersion() === 3\n\t}\n\n\treturn _isVue3\n}\n\n/**\n * Check if browser environment\n */\nexport const isBrowser = (): boolean => {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Check if server-side rendering\n */\nexport const isSSR = (): boolean => !isBrowser()\n\n/**\n * Check if passive event listening is supported\n */\nexport const supportsPassive = (): boolean => {\n\tif (!isBrowser()) return false\n\n\tlet supports = false\n\n\ttry {\n\t\tconst options = {\n\t\t\tget passive() {\n\t\t\t\tsupports = true\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t}\n\n\t\twindow.addEventListener('test', null as any, options)\n\t\twindow.removeEventListener('test', null as any, options as any)\n\t} catch {\n\t\tsupports = false\n\t}\n\n\treturn supports\n}\n\n/**\n * Check if IntersectionObserver is supported\n */\nexport const supportsIntersectionObserver = (): boolean => {\n\treturn isBrowser() && 'IntersectionObserver' in window\n}\n\n/**\n * Check if ResizeObserver is supported\n */\nexport const supportsResizeObserver = (): boolean => {\n\treturn isBrowser() && 'ResizeObserver' in window\n}\n\n/**\n * Check if Clipboard API is supported\n */\nexport const supportsClipboard = (): boolean => {\n\treturn isBrowser() && 'clipboard' in navigator\n}\n\n/**\n * Check if MutationObserver is supported\n */\nexport const supportsMutationObserver = (): boolean => {\n\treturn isBrowser() && 'MutationObserver' in window\n}\n","import type { Directive } from 'vue'\nimport type { DirectiveBinding, DirectiveDefinition, DirectiveHooks } from './types'\nimport { createVue2Directive } from './adapter/vue2'\nimport { createVue3Directive } from './adapter/vue3'\nimport { getVueVersion, isSSR } from './env'\n\n/**\n * Define a cross-version compatible directive\n * @param definition The directive definition\n * @returns Vue directive object\n */\nexport function defineDirective<T = any, B extends Element = Element>(\n\tdefinition: DirectiveDefinition<T, B>,\n): Directive {\n\tconst { name, version, ssr, defaults, ...hooks } = definition\n\n\t// SSR check\n\tif (isSSR() && !ssr) {\n\t\tif (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'test') {\n\t\t\tconsole.warn(\n\t\t\t\t`[Directix] Directive \"${name}\" is not compatible with SSR. `\n\t\t\t\t+ 'It will be a no-op on the server side.',\n\t\t\t)\n\t\t}\n\n\t\treturn createNoOpDirective()\n\t}\n\n\t// Wrap hooks with default values\n\tconst wrappedHooks: DirectiveHooks<T, B> = {\n\t\tmounted: hooks.mounted ? (el, binding, vnode) => {\n\t\t\thooks.mounted!(el, applyDefaults(binding, defaults), vnode)\n\t\t} : undefined,\n\n\t\tupdated: hooks.updated ? (el, binding, vnode, prevBinding, prevVnode) => {\n\t\t\thooks.updated!(el, applyDefaults(binding, defaults), vnode, prevBinding, prevVnode)\n\t\t} : undefined,\n\n\t\tunmounted: hooks.unmounted,\n\t}\n\n\t// Create a lazy directive that determines version at runtime\n\treturn createLazyDirective(wrappedHooks)\n}\n\n/**\n * Create a lazy directive that determines Vue version at first use\n */\nfunction createLazyDirective<T, B extends Element>(hooks: DirectiveHooks<T, B>): Directive {\n\tlet cachedDirective: any = null\n\n\t// Unified detection entry point\n\tfunction getDirective(): any {\n\t\tif (!cachedDirective) {\n\t\t\tcachedDirective = getVueVersion() === 2 ? createVue2Directive(hooks) : createVue3Directive(hooks)\n\t\t}\n\n\t\treturn cachedDirective\n\t}\n\n\t// Hook generator to reduce code duplication\n\tfunction createHook(hookName: string) {\n\t\treturn function (el: B, binding: any, vnode: any, prevVnode?: any) {\n\t\t\tgetDirective()[hookName]?.(el, binding, vnode, prevVnode)\n\t\t}\n\t}\n\n\treturn {\n\t\t// Vue 2 hooks\n\t\tbind: createHook('bind'),\n\t\tinserted: createHook('inserted'),\n\t\tupdate: createHook('update'),\n\t\tcomponentUpdated: createHook('componentUpdated'),\n\t\tunbind: createHook('unbind'),\n\t\t// Vue 3 hooks\n\t\tcreated: createHook('created'),\n\t\tbeforeMount: createHook('beforeMount'),\n\t\tmounted: createHook('mounted'),\n\t\tbeforeUpdate: createHook('beforeUpdate'),\n\t\tupdated: createHook('updated'),\n\t\tbeforeUnmount: createHook('beforeUnmount'),\n\t\tunmounted: createHook('unmounted'),\n\t} as Directive\n}\n\n/**\n * Apply default values to binding\n */\nfunction applyDefaults<T>(\n\tbinding: DirectiveBinding<T>,\n\tdefaults?: Partial<T>,\n): DirectiveBinding<T> {\n\tif (!defaults) return binding\n\n\tconst value\n\t\t= typeof binding.value === 'object' && binding.value !== null ? { ...defaults, ...binding.value } : binding.value\n\n\treturn { ...binding, value: value as T }\n}\n\n/**\n * Create a no-op directive (for SSR)\n */\nfunction createNoOpDirective(): Directive {\n\treturn {\n\t\tmounted: () => {},\n\t\tupdated: () => {},\n\t\tunmounted: () => {},\n\t}\n}\n\n/**\n * Define a directive group\n */\nexport function defineDirectiveGroup(\n\tname: string,\n\tdirectives: Record<string, any>,\n): { name: string, directives: Record<string, any>, install: (app: any) => void } {\n\treturn {\n\t\tname,\n\t\tdirectives,\n\t\tinstall(app: any, _options?: any) {\n\t\t\tObject.entries(directives).forEach(([directiveName, directive]) => {\n\t\t\t\tconst fullName = `${name}-${directiveName}`\n\n\t\t\t\tapp.directive(fullName, directive)\n\t\t\t})\n\t\t},\n\t}\n}\n","/**\n * Shared utilities for text transformation directives\n * (uppercase, lowercase, capitalcase, trim)\n */\n\n/**\n * Base options for text transform directives\n */\nexport interface TextTransformOptions {\n\t/**\n\t * Whether to transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Setup an input element with text transformation\n * Returns cleanup function\n */\nexport function setupTextTransformInput(\n\tel: HTMLInputElement | HTMLTextAreaElement,\n\toptions: TextTransformOptions,\n\ttransformFn: (text: string) => string,\n): () => void {\n\tif (!options.onInput) {\n\t\treturn () => {}\n\t}\n\n\tconst handler = (): void => {\n\t\tconst start = el.selectionStart\n\t\tconst end = el.selectionEnd\n\t\tconst originalValue = el.value\n\t\tconst transformed = transformFn(originalValue)\n\n\t\tif (originalValue !== transformed) {\n\t\t\tel.value = transformed\n\t\t\t// Restore cursor position\n\t\t\tif (start !== null && end !== null) {\n\t\t\t\tel.setSelectionRange(start, end)\n\t\t\t}\n\t\t\t// Trigger input event for v-model\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t}\n\t}\n\n\tel.addEventListener('input', handler)\n\n\t// Initial transform\n\tel.value = transformFn(el.value)\n\n\treturn () => {\n\t\tel.removeEventListener('input', handler)\n\t}\n}\n\n/**\n * Transform text content of a non-input element\n */\nexport function transformTextContent(el: HTMLElement, transformFn: (text: string) => string): void {\n\tconst text = el.textContent || ''\n\n\tel.textContent = transformFn(text)\n}\n\n/**\n * Check if element is an input or textarea\n */\nexport function isInputElement(el: HTMLElement): el is HTMLInputElement | HTMLTextAreaElement {\n\treturn el.tagName === 'INPUT' || el.tagName === 'TEXTAREA'\n}\n","import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Capitalcase directive options\n */\nexport interface CapitalcaseOptions {\n\t/**\n\t * Whether to capitalize each word or just the first word\n\t * @default true\n\t */\n\tevery?: boolean\n\n\t/**\n\t * Words to keep lowercase (articles, prepositions, etc.)\n\t * @default ['a', 'an', 'the', 'and', 'but', 'or', 'for', 'nor', 'on', 'at', 'to', 'from', 'by']\n\t */\n\tkeepLower?: string[]\n\n\t/**\n\t * Whether to transform on input (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CapitalcaseBinding = boolean | CapitalcaseOptions\n\n/**\n * Default words to keep lowercase\n */\nconst DEFAULT_KEEP_LOWER = [\n\t'a', 'an', 'the',\n\t'and', 'but', 'or', 'for', 'nor',\n\t'on', 'at', 'to', 'from', 'by',\n\t'in', 'of', 'with', 'as',\n]\n\n/**\n * Capitalize text based on options\n */\nfunction capitalizeText(text: string, options: CapitalcaseOptions): string {\n\tif (!text) return text\n\n\tconst { every = true, keepLower = DEFAULT_KEEP_LOWER } = options\n\n\tif (every) {\n\t\t// Capitalize each word\n\t\tconst words = text.toLowerCase().split(/\\s+/)\n\n\t\treturn words\n\t\t\t.map((word, index) => {\n\t\t\t\t// Always capitalize first word\n\t\t\t\tif (index === 0) {\n\t\t\t\t\treturn capitalizeWord(word)\n\t\t\t\t}\n\t\t\t\t// Keep certain words lowercase\n\t\t\t\tif (keepLower.includes(word.toLowerCase())) {\n\t\t\t\t\treturn word.toLowerCase()\n\t\t\t\t}\n\n\t\t\t\treturn capitalizeWord(word)\n\t\t\t})\n\t\t\t.join(' ')\n\t} else {\n\t\t// Capitalize only the first word\n\t\treturn capitalizeWord(text)\n\t}\n}\n\n/**\n * Capitalize a single word\n */\nfunction capitalizeWord(word: string): string {\n\tif (!word) return word\n\n\treturn word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CapitalcaseBinding | undefined): CapitalcaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { every: true, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { every: false, onInput: false }\n\t}\n\n\treturn {\n\t\tevery: binding.every ?? true,\n\t\tkeepLower: binding.keepLower ?? DEFAULT_KEEP_LOWER,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-capitalcase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: capitalize each word -->\n * <input v-capitalcase v-model=\"title\" />\n *\n * <!-- Capitalize only first word -->\n * <span v-capitalcase=\"{ every: false }\">{{ text }}</span>\n *\n * <!-- With custom lowercase words -->\n * <input v-capitalcase=\"{ keepLower: ['a', 'the'] }\" v-model=\"title\" />\n * </template>\n * ```\n */\nexport const vCapitalcase = defineDirective<CapitalcaseBinding, HTMLElement>({\n\tname: 'capitalcase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => capitalizeText(text, options))\n\n\t\t\t;(el as any).__capitalcaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => capitalizeText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = capitalizeText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => capitalizeText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__capitalcaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__capitalcaseCleanup\n\t},\n})\n\nexport default vCapitalcase\n","import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\n\n/**\n * Click delay handler\n */\nexport type ClickDelayHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click delay directive options\n */\nexport interface ClickDelayOptions {\n\t/**\n\t * Click handler\n\t * @required\n\t */\n\thandler: ClickDelayHandler\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\tdelay?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * CSS class to add during delay\n\t * @default 'v-click-delay--pending'\n\t */\n\tpendingClass?: string\n\n\t/**\n\t * Whether to show visual feedback\n\t * @default true\n\t */\n\tfeedback?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickDelayBinding = ClickDelayHandler | ClickDelayOptions\n\n/**\n * Element state storage\n */\ninterface ClickDelayState {\n\toptions: ClickDelayOptions\n\thandler: (event: Event) => void\n\tisPending: boolean\n\ttimeoutId: ReturnType<typeof setTimeout> | null\n}\n\n/**\n * v-click-delay directive\n *\n * Prevents repeated clicks within a specified time period.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Basic usage -->\n * <button v-click-delay=\"handleClick\">Click Me</button>\n *\n * <!-- With delay time -->\n * <button v-click-delay:500=\"handleClick\">Click Me (500ms)</button>\n *\n * <!-- With options -->\n * <button v-click-delay=\"{ handler: handleClick, delay: 1000 }\">\n * Click Me (1s)\n * </button>\n * </template>\n * ```\n */\nexport const vClickDelay = defineDirective<ClickDelayBinding, HTMLElement>({\n\tname: 'click-delay',\n\tssr: true,\n\tdefaults: {\n\t\tdelay: 300,\n\t\tdisabled: false,\n\t\tpendingClass: 'v-click-delay--pending',\n\t\tfeedback: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickDelayState = {\n\t\t\toptions,\n\t\t\thandler: createClickHandler(el, options),\n\t\t\tisPending: false,\n\t\t\ttimeoutId: null,\n\t\t}\n\n\t\t;(el as any).__clickDelay = state\n\n\t\t// Bind click event\n\t\tel.addEventListener('click', state.handler)\n\t\tel.addEventListener('touchend', state.handler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickDelayState = (el as any).__clickDelay\n\n\t\tif (!state) {\n\t\t\t// If previously disabled, reinitialize\n\t\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t\tif (!options.disabled) {\n\t\t\t\tconst newState: ClickDelayState = {\n\t\t\t\t\toptions,\n\t\t\t\t\thandler: createClickHandler(el, options),\n\t\t\t\t\tisPending: false,\n\t\t\t\t\ttimeoutId: null,\n\t\t\t\t}\n\t\t\t\t;(el as any).__clickDelay = newState\n\t\t\t\tel.addEventListener('click', newState.handler)\n\t\t\t\tel.addEventListener('touchend', newState.handler)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If disabled state changes\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disable: remove listeners\n\t\t\tel.removeEventListener('click', state.handler)\n\t\t\tel.removeEventListener('touchend', state.handler)\n\t\t\tif (state.timeoutId) {\n\t\t\t\tclearTimeout(state.timeoutId)\n\t\t\t}\n\t\t\tremovePendingClass(el, state.options)\n\t\t\tdelete (el as any).__clickDelay\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Enable: add listeners\n\t\t\tstate.handler = createClickHandler(el, newOptions)\n\t\t\tstate.isPending = false\n\t\t\tstate.timeoutId = null\n\t\t\tel.addEventListener('click', state.handler)\n\t\t\tel.addEventListener('touchend', state.handler)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickDelayState = (el as any).__clickDelay\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tel.removeEventListener('touchend', state.handler)\n\n\t\tif (state.timeoutId) {\n\t\t\tclearTimeout(state.timeoutId)\n\t\t}\n\n\t\tremovePendingClass(el, state.options)\n\t\tdelete (el as any).__clickDelay\n\t},\n})\n\n/**\n * Create click handler with delay logic\n */\nfunction createClickHandler(\n\tel: HTMLElement,\n\toptions: ClickDelayOptions,\n): (event: Event) => void {\n\treturn (event: Event) => {\n\t\tconst state: ClickDelayState = (el as any).__clickDelay\n\n\t\tif (!state || state.isPending) {\n\t\t\tevent.preventDefault()\n\t\t\tevent.stopPropagation()\n\t\t\treturn\n\t\t}\n\n\t\t// Mark as pending\n\t\tstate.isPending = true\n\n\t\t// Add visual feedback\n\t\tif (options.feedback && options.pendingClass) {\n\t\t\tel.classList.add(options.pendingClass)\n\t\t}\n\n\t\t// Call handler\n\t\toptions.handler(event as MouseEvent | TouchEvent)\n\n\t\t// Set timeout to reset pending state\n\t\tstate.timeoutId = setTimeout(() => {\n\t\t\tstate.isPending = false\n\t\t\tstate.timeoutId = null\n\t\t\tremovePendingClass(el, options)\n\t\t}, options.delay)\n\t}\n}\n\n/**\n * Remove pending class from element\n */\nfunction removePendingClass(el: HTMLElement, options: ClickDelayOptions): void {\n\tif (options.feedback && options.pendingClass) {\n\t\tel.classList.remove(options.pendingClass)\n\t}\n}\n\n/**\n * Parse time from argument\n * Supports formats: \"300\" | \"300ms\" | \"1s\"\n */\nfunction parseTime(arg?: string): number | null {\n\tif (!arg) return null\n\n\tif (arg.endsWith('ms')) {\n\t\treturn parseInt(arg, 10)\n\t}\n\n\tif (arg.endsWith('s')) {\n\t\treturn parseFloat(arg) * 1000\n\t}\n\n\tconst num = parseInt(arg, 10)\n\treturn Number.isNaN(num) ? null : num\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ClickDelayBinding | undefined,\n\tdirectiveBinding: DirectiveBinding<ClickDelayBinding>,\n): ClickDelayOptions {\n\tconst delay = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tdelay,\n\t\t\tdisabled: false,\n\t\t\tpendingClass: 'v-click-delay--pending',\n\t\t\tfeedback: true,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-delay: handler is required')\n\t}\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tdelay: binding.delay ?? delay,\n\t\tdisabled: binding.disabled ?? false,\n\t\tpendingClass: binding.pendingClass ?? 'v-click-delay--pending',\n\t\tfeedback: binding.feedback ?? true,\n\t}\n}\n\nexport default vClickDelay\n","import { isBrowser } from '@directix/core'\n\n/**\n * Check if value is an Element\n */\nexport function isElement(value: unknown): value is Element {\n\treturn value instanceof Element\n}\n\n/**\n * Check if value is an HTMLElement\n */\nexport function isHTMLElement(value: unknown): value is HTMLElement {\n\treturn value instanceof HTMLElement\n}\n\n/**\n * Get element by selector or return element itself\n */\nexport function getElement(target: string | Element | null | undefined): Element | null {\n\tif (!target) return null\n\n\tif (typeof target === 'string') {\n\t\tif (!isBrowser()) return null\n\n\t\treturn document.querySelector(target)\n\t}\n\n\treturn isElement(target) ? target : null\n}\n\n/**\n * Get all elements matching selector\n */\nexport function getAllElements(target: string): Element[] {\n\tif (!isBrowser()) return []\n\n\treturn Array.from(document.querySelectorAll(target))\n}\n\n/**\n * Add classes to element\n */\nexport function addClass(el: Element, ...classes: string[]): void {\n\tel.classList.add(...classes)\n}\n\n/**\n * Remove classes from element\n */\nexport function removeClass(el: Element, ...classes: string[]): void {\n\tel.classList.remove(...classes)\n}\n\n/**\n * Toggle class on element\n */\nexport function toggleClass(el: Element, className: string, force?: boolean): void {\n\tel.classList.toggle(className, force)\n}\n\n/**\n * Check if element has class\n */\nexport function hasClass(el: Element, className: string): boolean {\n\treturn el.classList.contains(className)\n}\n\n/**\n * Get element style property\n */\nexport function getStyle(el: Element, property: string): string {\n\tif (!isBrowser()) return ''\n\n\treturn getComputedStyle(el).getPropertyValue(property)\n}\n\n/**\n * Set element style property\n */\nexport function setStyle(el: HTMLElement, property: string, value: string | number): void {\n\tel.style.setProperty(property, typeof value === 'number' ? `${value}px` : value)\n}\n\n/**\n * Set multiple styles on element\n */\nexport function setStyles(el: HTMLElement, styles: Record<string, string | number>): void {\n\tObject.entries(styles).forEach(([property, value]) => {\n\t\tsetStyle(el, property, value)\n\t})\n}\n\n/**\n * Get element offset position\n */\nexport function getOffset(el: Element): { top: number, left: number } {\n\tif (!isBrowser()) return { top: 0, left: 0 }\n\tconst rect = el.getBoundingClientRect()\n\n\treturn {\n\t\ttop: rect.top + window.scrollY,\n\t\tleft: rect.left + window.scrollX,\n\t}\n}\n\n/**\n * Get element size\n */\nexport function getSize(el: Element): { width: number, height: number } {\n\tconst rect = el.getBoundingClientRect()\n\n\treturn {\n\t\twidth: rect.width,\n\t\theight: rect.height,\n\t}\n}\n\n/**\n * Check if element is in viewport\n */\nexport function isInViewport(el: Element): boolean {\n\tif (!isBrowser()) return false\n\tconst rect = el.getBoundingClientRect()\n\n\treturn (\n\t\trect.top >= 0\n\t\t&& rect.left >= 0\n\t\t&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\n\t\t&& rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t)\n}\n\n/**\n * Get nearest scrollable parent element\n */\nexport function getScrollParent(el: Element): Element | Window {\n\tif (!isBrowser()) return window\n\n\tlet parent: Element | null = el.parentElement\n\n\twhile (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\n\t\tparent = parent.parentElement\n\t}\n\n\treturn window\n}\n\n/**\n * Check if element matches selector\n */\nexport function matches(el: Element, selector: string): boolean {\n\treturn el.matches(selector)\n}\n\n/**\n * Get nearest ancestor matching selector\n */\nexport function closest(el: Element, selector: string): Element | null {\n\treturn el.closest(selector)\n}\n","import { isBrowser, supportsPassive } from '@directix/core'\n\nexport interface EventOptions {\n\tcapture?: boolean\n\tpassive?: boolean\n\tonce?: boolean\n}\n\n/**\n * Add event listener\n */\nexport function on(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: (event: Event) => void,\n\toptions: boolean | EventOptions = false,\n): void {\n\tif (!isBrowser()) return\n\tconst opts = normalizeOptions(options)\n\n\ttarget.addEventListener(event, handler, opts)\n}\n\n/**\n * Remove event listener\n */\nexport function off(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: (event: Event) => void,\n\toptions: boolean | EventOptions = false,\n): void {\n\tif (!isBrowser()) return\n\tconst opts = normalizeOptions(options)\n\n\ttarget.removeEventListener(event, handler, opts)\n}\n\n/**\n * Emit custom event\n */\nexport function emit(target: EventTarget, event: string, detail?: any): boolean {\n\tif (!isBrowser()) return false\n\n\treturn target.dispatchEvent(new CustomEvent(event, { detail }))\n}\n\n/**\n * Normalize event options\n */\nfunction normalizeOptions(options: boolean | EventOptions): boolean | { capture: boolean, passive: boolean, once: boolean } {\n\tif (typeof options === 'boolean') {\n\t\treturn options\n\t}\n\n\tconst { capture = false, passive = false, once = false } = options\n\n\tif (supportsPassive()) {\n\t\treturn { capture, passive, once }\n\t}\n\n\treturn capture\n}\n\n/**\n * Create event delegation\n */\nexport function delegate(\n\tcontainer: Element,\n\tselector: string,\n\tevent: string,\n\thandler: (el: Element, e: Event) => void,\n\toptions?: EventOptions,\n): () => void {\n\tconst listener = (e: Event): void => {\n\t\tconst target = e.target as Element\n\t\tconst matched = target.closest(selector)\n\n\t\tif (matched && container.contains(matched)) {\n\t\t\thandler(matched, e)\n\t\t}\n\t}\n\n\ton(container, event, listener, options)\n\n\treturn () => off(container, event, listener, options)\n}\n\n/**\n * Stop event propagation\n */\nexport function stopPropagation(e: Event): void {\n\te.stopPropagation()\n}\n\n/**\n * Prevent default behavior\n */\nexport function preventDefault(e: Event): void {\n\te.preventDefault()\n}\n\n/**\n * Stop event propagation and prevent default behavior\n */\nexport function stopEvent(e: Event): void {\n\tstopPropagation(e)\n\tpreventDefault(e)\n}\n\n/**\n * Get event target\n */\nexport function getEventTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.target as T | null\n}\n\n/**\n * Get current event target\n */\nexport function getCurrentTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.currentTarget as T | null\n}\n\n/**\n * Get mouse/touch position from event\n */\nexport function getEventPosition(\n\te: MouseEvent | TouchEvent,\n): { x: number, y: number, clientX: number, clientY: number } {\n\tlet clientX = 0,\n\t\tclientY = 0\n\n\tif ('touches' in e && e.touches.length > 0) {\n\t\tclientX = e.touches[0].clientX\n\t\tclientY = e.touches[0].clientY\n\t} else if ('clientX' in e) {\n\t\tclientX = e.clientX\n\t\tclientY = e.clientY\n\t}\n\n\treturn {\n\t\tx: clientX,\n\t\ty: clientY,\n\t\tclientX,\n\t\tclientY,\n\t}\n}\n","/**\n * Check if value is a string\n */\nexport function isString(value: unknown): value is string {\n\treturn typeof value === 'string'\n}\n\n/**\n * Check if value is a number\n */\nexport function isNumber(value: unknown): value is number {\n\treturn typeof value === 'number' && !isNaN(value)\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n\treturn typeof value === 'boolean'\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n\treturn typeof value === 'function'\n}\n\n/**\n * Check if value is an object\n */\nexport function isObject(value: unknown): value is Record<string, any> {\n\treturn typeof value === 'object' && value !== null\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): value is any[] {\n\treturn Array.isArray(value)\n}\n\n/**\n * Check if value is empty\n */\nexport function isEmpty(value: unknown): boolean {\n\tif (value === null || value === undefined) return true\n\tif (isString(value) || isArray(value)) return value.length === 0\n\tif (isObject(value)) return Object.keys(value).length === 0\n\n\treturn false\n}\n\n/**\n * Check if value is a Promise\n */\nexport function isPromise<T = any>(value: unknown): value is Promise<T> {\n\treturn isObject(value) && isFunction((value as any).then)\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n\tif (obj === null || typeof obj !== 'object') {\n\t\treturn obj\n\t}\n\n\tif (Array.isArray(obj)) {\n\t\treturn obj.map(item => deepClone(item)) as unknown as T\n\t}\n\n\tconst cloned = {} as T\n\n\tfor (const key in obj) {\n\t\tif (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t\t\tcloned[key] = deepClone(obj[key])\n\t\t}\n\t}\n\n\treturn cloned\n}\n\n/**\n * Deep merge objects\n */\nexport function deepMerge<T extends Record<string, any>>(\n\ttarget: T,\n\t...sources: Partial<T>[]\n): T {\n\tif (!sources.length) return target\n\n\tconst source = sources.shift()\n\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\tObject.assign(target, { [key]: {} })\n\t\t\t\t}\n\t\t\t\tdeepMerge(\n\t\t\t\t\ttarget[key] as Record<string, any>,\n\t\t\t\t\tsource[key] as Record<string, any>,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tObject.assign(target, { [key]: source[key] })\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deepMerge(target, ...sources)\n}\n\n/**\n * Get nested property value by path\n */\nexport function get<T = any>(\n\tobj: Record<string, any>,\n\tpath: string,\n\tdefaultValue?: T,\n): T {\n\tconst keys = path.split('.')\n\tlet result: any = obj\n\n\tfor (const key of keys) {\n\t\tif (result === null || result === undefined) {\n\t\t\treturn defaultValue as T\n\t\t}\n\t\tresult = result[key]\n\t}\n\n\treturn (result === undefined ? defaultValue : result) as T\n}\n\n/**\n * Set nested property value by path\n */\nexport function set(obj: Record<string, any>, path: string, value: any): void {\n\tconst keys = path.split('.')\n\tconst lastKey = keys.pop()!\n\tlet current = obj\n\n\tfor (const key of keys) {\n\t\tif (current[key] === undefined) {\n\t\t\tcurrent[key] = {}\n\t\t}\n\t\tcurrent = current[key]\n\t}\n\n\tcurrent[lastKey] = value\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean, trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void, flush: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null\n\n\tconst { leading = false, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst debounced = function (this: any, ...args: Parameters<T>): void {\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t}\n\n\t\tif (leading && !timerId) {\n\t\t\tinvokeFunc()\n\t\t}\n\n\t\ttimerId = setTimeout(() => {\n\t\t\tif (trailing) {\n\t\t\t\tinvokeFunc()\n\t\t\t}\n\t\t\ttimerId = null\n\t\t}, wait)\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void, flush: () => void }\n\n\tdebounced.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\tdebounced.flush = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\tinvokeFunc()\n\t\t\ttimerId = null\n\t\t}\n\t}\n\n\treturn debounced\n}\n\n/**\n * Throttle function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean, trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null,\n\t\tlastCallTime = 0\n\n\tconst { leading = true, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst throttled = function (this: any, ...args: Parameters<T>): void {\n\t\tconst now = Date.now()\n\n\t\tif (!lastCallTime && !leading) {\n\t\t\tlastCallTime = now\n\t\t}\n\n\t\tconst remaining = wait - (now - lastCallTime)\n\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (remaining <= 0 || remaining > wait) {\n\t\t\tif (timerId) {\n\t\t\t\tclearTimeout(timerId)\n\t\t\t\ttimerId = null\n\t\t\t}\n\t\t\tlastCallTime = now\n\t\t\tinvokeFunc()\n\t\t} else if (!timerId && trailing) {\n\t\t\ttimerId = setTimeout(() => {\n\t\t\t\tlastCallTime = leading ? Date.now() : 0\n\t\t\t\ttimerId = null\n\t\t\t\tinvokeFunc()\n\t\t\t}, remaining)\n\t\t}\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void }\n\n\tthrottled.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastCallTime = 0\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\treturn throttled\n}\n\n/**\n * Parse time argument\n * Supports formats: \"300\" | \"300ms\" | \"1s\"\n */\nexport function parseTime(arg?: string): number | null {\n\tif (!arg) return null\n\n\tif (arg.endsWith('ms')) {\n\t\treturn parseInt(arg, 10)\n\t}\n\n\tif (arg.endsWith('s')) {\n\t\treturn parseFloat(arg) * 1000\n\t}\n\n\tconst num = parseInt(arg, 10)\n\n\treturn isNaN(num) ? null : num\n}\n\n/**\n * Generate unique ID\n */\nexport function generateId(prefix: string = ''): string {\n\treturn `${prefix}${Date.now().toString(36)}${Math.random().toString(36).slice(2, 9)}`\n}\n","import { defineDirective } from '@directix/core'\nimport { getElement, off, on } from '@directix/shared'\n\n/**\n * Click outside handler\n */\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click outside directive options\n */\nexport interface ClickOutsideOptions {\n\t/**\n\t * Callback when clicking outside\n\t * @required\n\t */\n\thandler: ClickOutsideHandler\n\n\t/**\n\t * Excluded element selectors or element references\n\t */\n\texclude?: (string | HTMLElement | (() => HTMLElement | null))[]\n\n\t/**\n\t * Whether to use capture mode\n\t * @default true\n\t */\n\tcapture?: boolean\n\n\t/**\n\t * Event types to listen for\n\t * @default ['click']\n\t */\n\tevents?: ('click' | 'mousedown' | 'mouseup' | 'touchstart' | 'touchend')[]\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n\n\t/**\n\t * Prevent default behavior\n\t * @default false\n\t */\n\tprevent?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickOutsideBinding = ClickOutsideHandler | ClickOutsideOptions\n\n/**\n * Element state storage\n */\ninterface ClickOutsideState {\n\toptions: ClickOutsideOptions\n\thandlers: Map<string, (event: Event) => void>\n}\n\n/**\n * v-click-outside directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-click-outside=\"handleClickOutside\">\n * Dropdown menu\n * </div>\n * </template>\n * ```\n */\nexport const vClickOutside = defineDirective<ClickOutsideBinding, HTMLElement>({\n\tname: 'click-outside',\n\tssr: false,\n\tdefaults: {\n\t\tcapture: true,\n\t\tevents: ['click'],\n\t\tdisabled: false,\n\t\tstop: false,\n\t\tprevent: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickOutsideState = {\n\t\t\toptions,\n\t\t\thandlers: new Map(),\n\t\t}\n\n ;(el as any).__clickOutside = state\n\n\t\t// Create event handler\n\t\tconst createHandler = (_eventType: string) => {\n\t\t\treturn (event: Event) => {\n\t\t\t\t// Check event target\n\t\t\t\tif (!isValidClick(el, event, options)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Stop propagation\n\t\t\t\tif (options.stop) {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t}\n\n\t\t\t\t// Prevent default behavior\n\t\t\t\tif (options.prevent) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\n\t\t\t\t// Call handler\n\t\t\t\toptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t}\n\t\t}\n\n\t\t// Bind events\n\t\toptions.events!.forEach(eventType => {\n\t\t\tconst handler = createHandler(eventType)\n\n\t\t\tstate.handlers.set(eventType, handler)\n\n\t\t\tconst listenerOptions = {\n\t\t\t\tcapture: options.capture,\n\t\t\t\tpassive: !options.prevent,\n\t\t\t}\n\n\t\t\ton(document, eventType, handler, listenerOptions)\n\t\t})\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\tconst oldOptions = state.options\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// If disabled state changes\n\t\tif (oldOptions.disabled !== newOptions.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\t// Remove all listeners\n\t\t\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\t\t\toff(document, eventType, handler, { capture: oldOptions.capture })\n\t\t\t\t})\n\t\t\t\tstate.handlers.clear()\n\t\t\t} else {\n\t\t\t\t// Re-add listeners\n\t\t\t\tconst createHandler = (_eventType: string) => {\n\t\t\t\t\treturn (event: Event) => {\n\t\t\t\t\t\tif (!isValidClick(el, event, newOptions)) return\n\t\t\t\t\t\tif (newOptions.stop) event.stopPropagation()\n\t\t\t\t\t\tif (newOptions.prevent) event.preventDefault()\n\t\t\t\t\t\tnewOptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewOptions.events!.forEach(eventType => {\n\t\t\t\t\tconst handler = createHandler(eventType)\n\n\t\t\t\t\tstate.handlers.set(eventType, handler)\n\t\t\t\t\ton(document, eventType, handler, {\n\t\t\t\t\t\tcapture: newOptions.capture,\n\t\t\t\t\t\tpassive: !newOptions.prevent,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\t// Remove all event listeners\n\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\toff(document, eventType, handler, { capture: state.options.capture })\n\t\t})\n\n\t\tdelete (el as any).__clickOutside\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ClickOutsideBinding | undefined): ClickOutsideOptions {\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tcapture: true,\n\t\t\tevents: ['click'],\n\t\t\tdisabled: false,\n\t\t\tstop: false,\n\t\t\tprevent: false,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-outside: handler is required')\n\t}\n\n\treturn {\n\t\tcapture: binding.capture ?? true,\n\t\tevents: binding.events ?? ['click'],\n\t\tdisabled: binding.disabled ?? false,\n\t\tstop: binding.stop ?? false,\n\t\tprevent: binding.prevent ?? false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if click is valid (outside the element)\n */\nfunction isValidClick(\n\tel: HTMLElement,\n\tevent: Event,\n\toptions: ClickOutsideOptions,\n): boolean {\n\tconst target = event.target as Node\n\n\t// Check if clicked on element itself or its children\n\tif (el.contains(target)) {\n\t\treturn false\n\t}\n\n\t// Check excluded elements\n\tif (options.exclude?.length) {\n\t\tfor (const exclude of options.exclude) {\n\t\t\tconst excludeEl = typeof exclude === 'function' ? exclude() : getElement(exclude)\n\n\t\t\tif (excludeEl && (excludeEl === target || excludeEl.contains(target))) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\nexport default vClickOutside\n","import { defineDirective, supportsClipboard } from '@directix/core'\n\n/**\n * Copy success callback\n */\nexport type CopySuccessCallback = (text: string) => void\n\n/**\n * Copy error callback\n */\nexport type CopyErrorCallback = (error: Error) => void\n\n/**\n * Copy directive options\n */\nexport interface CopyOptions {\n\t/**\n\t * Text to copy\n\t * @required\n\t */\n\tvalue: string\n\n\t/**\n\t * Callback on copy success\n\t */\n\tonSuccess?: CopySuccessCallback\n\n\t/**\n\t * Callback on copy error\n\t */\n\tonError?: CopyErrorCallback\n\n\t/**\n\t * Tooltip text for the copy button\n\t */\n\ttitle?: string\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CopyBinding = string | CopyOptions\n\n/**\n * Element state storage\n */\ninterface CopyState {\n\thandler: () => void\n\toptions: CopyOptions\n}\n\n/**\n * Copy text to clipboard\n * Prefer Clipboard API, fallback to execCommand\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n\t// Method 1: Use Clipboard API\n\tif (supportsClipboard()) {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text)\n\n\t\t\treturn true\n\t\t} catch {\n\t\t\t// Permission denied or other error, fallback\n\t\t\tconsole.warn('[Directix] Clipboard API failed, falling back to execCommand')\n\t\t}\n\t}\n\n\t// Method 2: Use execCommand (deprecated but has good compatibility)\n\treturn copyWithExecCommand(text)\n}\n\n/**\n * Copy using execCommand\n */\nfunction copyWithExecCommand(text: string): boolean {\n\t// Create temporary textarea\n\tconst textarea = document.createElement('textarea')\n\n\ttextarea.value = text\n\n\t// Set styles to make it invisible\n\ttextarea.style.cssText = `\n position: fixed;\n top: -9999px;\n left: -9999px;\n opacity: 0;\n pointer-events: none;\n `\n\n\tdocument.body.appendChild(textarea)\n\n\ttry {\n\t\t// Select and copy\n\t\ttextarea.select()\n\t\ttextarea.setSelectionRange(0, textarea.value.length)\n\n\t\treturn document.execCommand('copy')\n\t} catch {\n\t\treturn false\n\t} finally {\n\t\t// Cleanup\n\t\tdocument.body.removeChild(textarea)\n\t}\n}\n\n/**\n * v-copy directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-copy=\"textToCopy\">Copy Text</button>\n * </template>\n * ```\n */\nexport const vCopy = defineDirective<CopyBinding, HTMLElement>({\n\tname: 'copy',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Set tooltip\n\t\tif (options.title) {\n\t\t\tel.setAttribute('title', options.title)\n\t\t}\n\n\t\t// State storage - handler reads latest value from here\n\t\tconst state: CopyState = {\n\t\t\thandler: null as any,\n\t\t\toptions,\n\t\t}\n\n\t\t// Add click event - read latest options from state\n\t\tstate.handler = async () => {\n\t\t\tconst text = state.options.value\n\n\t\t\tif (!text) {\n\t\t\t\tconsole.warn('[Directix] v-copy: No text to copy')\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst success = await copyToClipboard(text)\n\n\t\t\t\tif (success) {\n\t\t\t\t\tstate.options.onSuccess?.(text)\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('copy:success', { detail: { text } }))\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Copy failed')\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err as Error\n\n\t\t\t\tstate.options.onError?.(error)\n\t\t\t\tel.dispatchEvent(new CustomEvent('copy:error', { detail: { error } }))\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('click', state.handler)\n\t\t;(el as any).__copy = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.title) {\n\t\t\tel.setAttribute('title', state.options.title)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tdelete (el as any).__copy\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CopyBinding): CopyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\nexport default vCopy\n","import { defineDirective } from '@directix/core'\n\n/**\n * Countdown format function\n */\nexport type CountdownFormatFunction = (time: CountdownTime) => string\n\n/**\n * Countdown complete callback\n */\nexport type CountdownCompleteCallback = () => void\n\n/**\n * Countdown tick callback\n */\nexport type CountdownTickCallback = (time: CountdownTime) => void\n\n/**\n * Countdown time object\n */\nexport interface CountdownTime {\n\tdays: number\n\thours: number\n\tminutes: number\n\tseconds: number\n\tmilliseconds: number\n\ttotal: number\n}\n\n/**\n * Countdown directive options\n */\nexport interface CountdownOptions {\n\t/**\n\t * Target time (Date object, timestamp, or ISO string)\n\t * @required\n\t */\n\ttarget: Date | number | string\n\n\t/**\n\t * Format string or custom format function\n\t * - 'dd:hh:mm:ss' - Days:Hours:Minutes:Seconds\n\t * - 'hh:mm:ss' - Hours:Minutes:Seconds\n\t * - 'mm:ss' - Minutes:Seconds\n\t * - 'ss' - Seconds only\n\t * @default 'hh:mm:ss'\n\t */\n\tformat?: string | CountdownFormatFunction\n\n\t/**\n\t * Callback when countdown completes\n\t */\n\tonComplete?: CountdownCompleteCallback\n\n\t/**\n\t * Callback on each tick\n\t */\n\tonTick?: CountdownTickCallback\n\n\t/**\n\t * Update interval in milliseconds\n\t * @default 1000\n\t */\n\tinterval?: number\n\n\t/**\n\t * Whether to show milliseconds\n\t * @default false\n\t */\n\tshowMilliseconds?: boolean\n\n\t/**\n\t * Whether to auto-start\n\t * @default true\n\t */\n\tautoStart?: boolean\n\n\t/**\n\t * Custom labels for i18n\n\t */\n\tlabels?: {\n\t\tdays?: string\n\t\thours?: string\n\t\tminutes?: string\n\t\tseconds?: string\n\t\tmilliseconds?: string\n\t}\n}\n\n/**\n * Directive binding value type\n */\nexport type CountdownBinding = CountdownOptions | Date | number | string\n\n/**\n * Element state storage\n */\ninterface CountdownState {\n\toptions: CountdownOptions\n\ttargetTime: number\n\tintervalId: ReturnType<typeof setInterval> | null\n\tpaused: boolean\n\tremaining: number\n}\n\n/**\n * Parse target time to timestamp\n */\nfunction parseTargetTime(target: Date | number | string): number {\n\tif (target instanceof Date) {\n\t\treturn target.getTime()\n\t}\n\n\tif (typeof target === 'number') {\n\t\treturn target\n\t}\n\n\treturn new Date(target).getTime()\n}\n\n/**\n * Calculate remaining time\n */\nfunction calculateTime(remaining: number): CountdownTime {\n\tconst total = Math.max(0, remaining)\n\n\treturn {\n\t\tdays: Math.floor(total / (1000 * 60 * 60 * 24)),\n\t\thours: Math.floor((total % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)),\n\t\tminutes: Math.floor((total % (1000 * 60 * 60)) / (1000 * 60)),\n\t\tseconds: Math.floor((total % (1000 * 60)) / 1000),\n\t\tmilliseconds: total % 1000,\n\t\ttotal,\n\t}\n}\n\n/**\n * Format time to string\n */\nfunction formatTime(time: CountdownTime, format: string | CountdownFormatFunction): string {\n\tif (typeof format === 'function') {\n\t\treturn format(time)\n\t}\n\n\tconst pad = (n: number, len = 2): string => String(n).padStart(len, '0')\n\n\t// Replace placeholders\n\tconst result = format\n\t\t.replace(/dd/gi, pad(time.days))\n\t\t.replace(/hh/gi, pad(time.hours))\n\t\t.replace(/mm/gi, pad(time.minutes))\n\t\t.replace(/ss/gi, pad(time.seconds))\n\t\t.replace(/S{3}/gi, pad(time.milliseconds, 3))\n\t\t.replace(/SS/gi, pad(Math.floor(time.milliseconds / 10)))\n\t\t.replace(/S/gi, String(Math.floor(time.milliseconds / 100)))\n\n\treturn result\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CountdownBinding): CountdownOptions {\n\tif (typeof binding === 'object' && binding !== null && 'target' in binding) {\n\t\treturn {\n\t\t\ttarget: binding.target,\n\t\t\tformat: binding.format ?? 'hh:mm:ss',\n\t\t\tonComplete: binding.onComplete,\n\t\t\tonTick: binding.onTick,\n\t\t\tinterval: binding.interval ?? 1000,\n\t\t\tshowMilliseconds: binding.showMilliseconds ?? false,\n\t\t\tautoStart: binding.autoStart ?? true,\n\t\t\tlabels: binding.labels,\n\t\t}\n\t}\n\n\t// binding is Date | number | string\n\treturn {\n\t\ttarget: binding as Date | number | string,\n\t\tformat: 'hh:mm:ss',\n\t\tinterval: 1000,\n\t\tshowMilliseconds: false,\n\t\tautoStart: true,\n\t}\n}\n\n/**\n * v-countdown directive\n *\n * Displays a countdown timer.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Basic usage -->\n * <span v-countdown=\"targetDate\"></span>\n *\n * <!-- With timestamp -->\n * <span v-countdown=\"Date.now() + 60000\"></span>\n *\n * <!-- With options -->\n * <span v-countdown=\"{\n * target: targetDate,\n * format: 'dd:hh:mm:ss',\n * onComplete: handleComplete\n * }\"></span>\n *\n * <!-- With custom format function -->\n * <span v-countdown=\"{\n * target: targetDate,\n * format: (time) => `${time.days} days ${time.hours}:${time.minutes}:${time.seconds}`\n * }\"></span>\n * </template>\n * ```\n */\nexport const vCountdown = defineDirective<CountdownBinding, HTMLElement>({\n\tname: 'countdown',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst targetTime = parseTargetTime(options.target)\n\n\t\tconst state: CountdownState = {\n\t\t\toptions,\n\t\t\ttargetTime,\n\t\t\tintervalId: null,\n\t\t\tpaused: false,\n\t\t\tremaining: 0,\n\t\t}\n\n\t\t;(el as any).__countdown = state\n\n\t\tif (options.autoStart !== false) {\n\t\t\tstartCountdown(el, state)\n\t\t} else {\n\t\t\t// Show initial time\n\t\t\tupdateDisplay(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CountdownState = (el as any).__countdown\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst newTargetTime = parseTargetTime(newOptions.target)\n\n\t\t// Check if target changed\n\t\tif (newTargetTime !== state.targetTime) {\n\t\t\tstate.targetTime = newTargetTime\n\t\t\tstate.options = newOptions\n\n\t\t\t// Clear existing interval if any\n\t\t\tif (state.intervalId) {\n\t\t\t\tclearInterval(state.intervalId)\n\t\t\t\tstate.intervalId = null\n\t\t\t}\n\n\t\t\t// Restart countdown if not paused\n\t\t\tif (!state.paused) {\n\t\t\t\tstartCountdown(el, state)\n\t\t\t}\n\t\t} else {\n\t\t\tstate.options = newOptions\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CountdownState | undefined = (el as any).__countdown\n\n\t\tif (state?.intervalId) {\n\t\t\tclearInterval(state.intervalId)\n\t\t}\n\n\t\tdelete (el as any).__countdown\n\t},\n})\n\n/**\n * Start countdown\n */\nfunction startCountdown(el: HTMLElement, state: CountdownState): void {\n\tconst tick = (): void => {\n\t\tconst now = Date.now()\n\t\tstate.remaining = state.targetTime - now\n\n\t\tif (state.remaining <= 0) {\n\t\t\tstate.remaining = 0\n\t\t\tupdateDisplay(el, state)\n\t\t\tstopCountdown(state)\n\n\t\t\t// Call onComplete\n\t\t\tif (state.options.onComplete) {\n\t\t\t\tstate.options.onComplete()\n\t\t\t}\n\n\t\t\t// Dispatch event\n\t\t\tel.dispatchEvent(new CustomEvent('countdown:complete'))\n\t\t\treturn\n\t\t}\n\n\t\tupdateDisplay(el, state)\n\n\t\t// Call onTick\n\t\tif (state.options.onTick) {\n\t\t\tconst time = calculateTime(state.remaining)\n\t\t\tstate.options.onTick(time)\n\t\t}\n\t}\n\n\t// Initial tick\n\ttick()\n\n\t// Start interval\n\tstate.intervalId = setInterval(tick, state.options.interval || 1000)\n}\n\n/**\n * Stop countdown\n */\nfunction stopCountdown(state: CountdownState): void {\n\tif (state.intervalId) {\n\t\tclearInterval(state.intervalId)\n\t\tstate.intervalId = null\n\t}\n}\n\n/**\n * Update display\n */\nfunction updateDisplay(el: HTMLElement, state: CountdownState): void {\n\tconst time = calculateTime(state.remaining)\n\tconst display = formatTime(time, state.options.format || 'hh:mm:ss')\n\tel.textContent = display\n}\n\n// Export helper functions for external use\nexport { calculateTime, formatTime, parseTargetTime }\n\nexport default vCountdown\n","/**\n * Shared utilities for event-based directives\n * (debounce, throttle)\n */\n\n/**\n * Supported event type modifiers list\n */\nexport const EVENT_MODIFIERS = [\n\t'click',\n\t'input',\n\t'change',\n\t'submit',\n\t'scroll',\n\t'resize',\n\t'mouseenter',\n\t'mouseleave',\n\t'mousemove',\n\t'mousedown',\n\t'mouseup',\n\t'keydown',\n\t'keyup',\n\t'focus',\n\t'blur',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n] as const\n\nexport type EventModifier = (typeof EVENT_MODIFIERS)[number]\n\n/**\n * Extract event type from modifiers\n */\nexport function getEventTypeFromModifiers(modifiers: Record<string, boolean>): string | null {\n\tfor (const modifier of EVENT_MODIFIERS) {\n\t\tif (modifiers[modifier]) {\n\t\t\treturn modifier\n\t\t}\n\t}\n\n\treturn null\n}\n\n/**\n * Get default event type for element\n */\nexport function getDefaultEventType(el: HTMLElement): string {\n\tconst tagName = el.tagName.toLowerCase()\n\n\tif (tagName === 'input' || tagName === 'textarea') {\n\t\treturn 'input'\n\t}\n\n\treturn 'click'\n}\n","import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { debounce, parseTime } from '@directix/shared'\nimport { getDefaultEventType, getEventTypeFromModifiers } from '../utils/event'\n\n/**\n * Debounced function type\n */\nexport interface DebouncedFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n\tflush: () => void\n}\n\n/**\n * Debounce directive options\n */\nexport interface DebounceOptions<T extends (...args: any[]) => any = any> {\n\t/**\n\t * Function to debounce\n\t */\n\thandler: T\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\twait?: number\n\n\t/**\n\t * Whether to invoke immediately before delay starts\n\t * @default false\n\t */\n\tleading?: boolean\n\n\t/**\n\t * Whether to invoke after delay ends\n\t * @default true\n\t */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type DebounceBinding<T extends (...args: any[]) => any = any>\n\t= | T\n\t\t| DebounceOptions<T>\n\n/**\n * Element state storage\n */\ninterface DebounceState {\n\tdebouncedFn: DebouncedFunction<any>\n\teventType: string\n\toptions: DebounceOptions\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: DebounceBinding,\n\tdirectiveBinding: DirectiveBinding<DebounceBinding>,\n): DebounceOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * v-debounce directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-debounce=\"handleInput\" />\n * <input v-debounce:500ms=\"handleInput\" />\n * <input v-debounce=\"{ handler: handleInput, wait: 500 }\" />\n * <div v-debounce.scroll=\"handleScroll\">Scroll Debounce</div>\n * <div v-debounce:100.scroll=\"handleScroll\">100ms Scroll Debounce</div>\n * </template>\n * ```\n */\nexport const vDebounce = defineDirective<DebounceBinding, HTMLElement>({\n\tname: 'debounce',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: false,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getDefaultEventType(el)\n\n\t\t// Create debounced function\n\t\tconst debouncedFn = debounce(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, debouncedFn as any)\n\n\t\t;(el as any).__debounce = {\n\t\t\tdebouncedFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate debounced function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait\n\t\t\t|| newOptions.leading !== state.options.leading\n\t\t\t|| newOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.debouncedFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst debouncedFn = debounce(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\t\tel.addEventListener(state.eventType, debouncedFn as any)\n\n\t\t\t;(el as any).__debounce = {\n\t\t\t\tdebouncedFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tstate.debouncedFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\tdelete (el as any).__debounce\n\t},\n})\n\nexport default vDebounce\n","import { defineDirective } from '@directix/core'\n\n/**\n * Draggable axis\n */\nexport type DraggableAxis = 'x' | 'y' | 'both'\n\n/**\n * Draggable directive options\n */\nexport interface DraggableOptions {\n\t/**\n\t * Drag axis\n\t * @default 'both'\n\t */\n\taxis?: DraggableAxis\n\n\t/**\n\t * Constrain to parent element\n\t * @default false\n\t */\n\tconstrain?: boolean\n\n\t/**\n\t * Boundary element selector or element\n\t */\n\tboundary?: string | HTMLElement | (() => HTMLElement | null)\n\n\t/**\n\t * Handle element selector\n\t */\n\thandle?: string\n\n\t/**\n\t * Whether dragging is disabled\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Grid snapping [x, y]\n\t */\n\tgrid?: [number, number]\n\n\t/**\n\t * Start drag callback\n\t */\n\tonStart?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Drag callback\n\t */\n\tonDrag?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * End drag callback\n\t */\n\tonEnd?: (position: { x: number, y: number }, event: MouseEvent | TouchEvent) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type DraggableBinding = boolean | DraggableOptions\n\n/**\n * Draggable state\n */\ninterface DraggableState {\n\toptions: DraggableOptions\n\tisDragging: boolean\n\tstartX: number\n\tstartY: number\n\toffsetX: number\n\toffsetY: number\n\tinitialLeft: number\n\tinitialTop: number\n\tboundaryWidth: number\n\tboundaryHeight: number\n\telWidth: number\n\telHeight: number\n\thandleEl: HTMLElement | null\n\tmoveHandler: ((e: MouseEvent | TouchEvent) => void) | null\n\tendHandler: ((e: MouseEvent | TouchEvent) => void) | null\n}\n\n/**\n * Get element boundary\n */\nfunction getBoundary(_el: HTMLElement, boundary?: string | HTMLElement | (() => HTMLElement | null)): DOMRect | null {\n\tif (!boundary) return null\n\n\tif (typeof boundary === 'function') {\n\t\tconst boundaryEl = boundary()\n\t\treturn boundaryEl?.getBoundingClientRect() ?? null\n\t}\n\n\tif (typeof boundary === 'string') {\n\t\tconst boundaryEl = document.querySelector(boundary)\n\t\treturn boundaryEl?.getBoundingClientRect() ?? null\n\t}\n\n\treturn boundary.getBoundingClientRect()\n}\n\n/**\n * Get client coordinates from mouse or touch event\n */\nfunction getClientCoords(e: MouseEvent | TouchEvent): { clientX: number, clientY: number } {\n\tif (e.type.startsWith('touch')) {\n\t\tconst touch = (e as TouchEvent).touches[0]\n\t\treturn { clientX: touch.clientX, clientY: touch.clientY }\n\t}\n\tconst mouseEvent = e as MouseEvent\n\treturn { clientX: mouseEvent.clientX, clientY: mouseEvent.clientY }\n}\n\n/**\n * Parse transform translate values\n */\nfunction parseTranslate(transform: string): { x: number, y: number } {\n\tconst match = transform.match(/translate\\(([-\\d.]+)px,\\s*([-\\d.]+)px\\)/)\n\tif (match) {\n\t\treturn { x: parseFloat(match[1]), y: parseFloat(match[2]) }\n\t}\n\treturn { x: 0, y: 0 }\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: DraggableBinding): DraggableOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { axis: 'both', constrain: false, disabled: false }\n\t}\n\n\tif (binding === false) {\n\t\treturn { axis: 'both', constrain: false, disabled: true }\n\t}\n\n\treturn {\n\t\taxis: binding.axis ?? 'both',\n\t\tconstrain: binding.constrain ?? false,\n\t\tboundary: binding.boundary,\n\t\thandle: binding.handle,\n\t\tdisabled: binding.disabled ?? false,\n\t\tgrid: binding.grid,\n\t\tonStart: binding.onStart,\n\t\tonDrag: binding.onDrag,\n\t\tonEnd: binding.onEnd,\n\t}\n}\n\n/**\n * v-draggable directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <div v-draggable>Drag me</div>\n *\n * <!-- Constrain to parent -->\n * <div v-draggable=\"{ constrain: true }\">Drag me</div>\n *\n * <!-- With handle -->\n * <div v-draggable=\"{ handle: '.drag-handle' }\">\n * <div class=\"drag-handle\">Drag here</div>\n * <div>Content</div>\n * </div>\n *\n * <!-- With callbacks -->\n * <div v-draggable=\"{ onDrag: handleDrag }\">Drag me</div>\n * </template>\n * ```\n */\nexport const vDraggable = defineDirective<DraggableBinding, HTMLElement>({\n\tname: 'draggable',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tif (options.disabled) return\n\n\t\t// Make element positionable\n\t\tif (getComputedStyle(el).position === 'static') {\n\t\t\tel.style.position = 'absolute'\n\t\t}\n\n\t\tconst state: DraggableState = {\n\t\t\toptions,\n\t\t\tisDragging: false,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\toffsetX: 0,\n\t\t\toffsetY: 0,\n\t\t\tinitialLeft: 0,\n\t\t\tinitialTop: 0,\n\t\t\tboundaryWidth: 0,\n\t\t\tboundaryHeight: 0,\n\t\t\telWidth: 0,\n\t\t\telHeight: 0,\n\t\t\thandleEl: options.handle ? el.querySelector(options.handle) : null,\n\t\t\tmoveHandler: null,\n\t\t\tendHandler: null,\n\t\t}\n\n\t\t;(el as any).__draggable = state\n\n\t\t// Add event listeners to handle or element\n\t\tconst targetEl = state.handleEl || el\n\t\ttargetEl.addEventListener('mousedown', startDrag)\n\t\ttargetEl.addEventListener('touchstart', startDrag, { passive: false })\n\n\t\tfunction startDrag(e: MouseEvent | TouchEvent): void {\n\t\t\tif (state.options.disabled) return\n\n\t\t\t// Prevent default for touch events\n\t\t\tif (e.type === 'touchstart') {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tconst { clientX, clientY } = getClientCoords(e)\n\t\t\tstate.isDragging = true\n\t\t\tstate.startX = clientX\n\t\t\tstate.startY = clientY\n\n\t\t\t// Get current transform offset\n\t\t\tconst { x, y } = parseTranslate(el.style.transform)\n\t\t\tstate.offsetX = x\n\t\t\tstate.offsetY = y\n\n\t\t\t// Store boundary info for constraint\n\t\t\tif (state.options.constrain || state.options.boundary) {\n\t\t\t\tconst boundary = state.options.boundary ? getBoundary(el, state.options.boundary) : el.parentElement?.getBoundingClientRect()\n\n\t\t\t\tif (boundary) {\n\t\t\t\t\tconst elRect = el.getBoundingClientRect()\n\t\t\t\t\tstate.initialLeft = elRect.left - boundary.left\n\t\t\t\t\tstate.initialTop = elRect.top - boundary.top\n\t\t\t\t\tstate.boundaryWidth = boundary.width\n\t\t\t\t\tstate.boundaryHeight = boundary.height\n\t\t\t\t\tstate.elWidth = elRect.width\n\t\t\t\t\tstate.elHeight = elRect.height\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add drag class\n\t\t\tel.classList.add('v-draggable--dragging')\n\n\t\t\t// Create move and end handlers\n\t\t\tstate.moveHandler = (moveEvent: MouseEvent | TouchEvent) => {\n\t\t\t\tif (!state.isDragging) return\n\n\t\t\t\tconst { clientX: moveX, clientY: moveY } = getClientCoords(moveEvent)\n\t\t\t\tlet deltaX = moveX - state.startX,\n\t\t\t\t\tdeltaY = moveY - state.startY\n\n\t\t\t\t// Apply axis constraint\n\t\t\t\tif (state.options.axis === 'x') {\n\t\t\t\t\tdeltaY = 0\n\t\t\t\t} else if (state.options.axis === 'y') {\n\t\t\t\t\tdeltaX = 0\n\t\t\t\t}\n\n\t\t\t\t// Apply grid snapping\n\t\t\t\tif (state.options.grid) {\n\t\t\t\t\tdeltaX = Math.round(deltaX / state.options.grid[0]) * state.options.grid[0]\n\t\t\t\t\tdeltaY = Math.round(deltaY / state.options.grid[1]) * state.options.grid[1]\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line one-var\n\t\t\t\tlet newX = state.offsetX + deltaX,\n\t\t\t\t\tnewY = state.offsetY + deltaY\n\n\t\t\t\t// Apply boundary constraints\n\t\t\t\tif (state.options.constrain || state.options.boundary) {\n\t\t\t\t\tconst newLeft = state.initialLeft + deltaX\n\t\t\t\t\tconst newTop = state.initialTop + deltaY\n\t\t\t\t\tconst maxLeft = state.boundaryWidth - state.elWidth\n\t\t\t\t\tconst maxTop = state.boundaryHeight - state.elHeight\n\n\t\t\t\t\tconst constrainedLeft = Math.max(0, Math.min(newLeft, maxLeft))\n\t\t\t\t\tconst constrainedTop = Math.max(0, Math.min(newTop, maxTop))\n\n\t\t\t\t\tnewX = state.offsetX + (constrainedLeft - state.initialLeft)\n\t\t\t\t\tnewY = state.offsetY + (constrainedTop - state.initialTop)\n\t\t\t\t}\n\n\t\t\t\t// Apply transform\n\t\t\t\tel.style.transform = `translate(${newX}px, ${newY}px)`\n\n\t\t\t\t// Call callback\n\t\t\t\tstate.options.onDrag?.({ x: newX, y: newY }, moveEvent)\n\t\t\t}\n\n\t\t\tstate.endHandler = () => {\n\t\t\t\tif (!state.isDragging) return\n\n\t\t\t\tstate.isDragging = false\n\t\t\t\tel.classList.remove('v-draggable--dragging')\n\n\t\t\t\t// Remove event listeners\n\t\t\t\tif (state.moveHandler) {\n\t\t\t\t\tdocument.removeEventListener('mousemove', state.moveHandler)\n\t\t\t\t\tdocument.removeEventListener('touchmove', state.moveHandler)\n\t\t\t\t}\n\t\t\t\tif (state.endHandler) {\n\t\t\t\t\tdocument.removeEventListener('mouseup', state.endHandler)\n\t\t\t\t\tdocument.removeEventListener('touchend', state.endHandler)\n\t\t\t\t}\n\n\t\t\t\t// Get final position\n\t\t\t\tconst { x: finalX, y: finalY } = parseTranslate(el.style.transform)\n\t\t\t\tstate.options.onEnd?.({ x: finalX, y: finalY }, new MouseEvent('mouseup'))\n\t\t\t}\n\n\t\t\t// Add move and end listeners\n\t\t\tdocument.addEventListener('mousemove', state.moveHandler)\n\t\t\tdocument.addEventListener('touchmove', state.moveHandler, { passive: false })\n\t\t\tdocument.addEventListener('mouseup', state.endHandler)\n\t\t\tdocument.addEventListener('touchend', state.endHandler)\n\n\t\t\t// Call start callback\n\t\t\tstate.options.onStart?.({ x: state.offsetX, y: state.offsetY }, e)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DraggableState | undefined = (el as any).__draggable\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\t// Update handle element\n\t\tif (state.options.handle) {\n\t\t\tstate.handleEl = el.querySelector(state.options.handle)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DraggableState | undefined = (el as any).__draggable\n\t\tif (!state) return\n\n\t\t// Remove event listeners\n\t\tif (state.moveHandler) {\n\t\t\tdocument.removeEventListener('mousemove', state.moveHandler)\n\t\t\tdocument.removeEventListener('touchmove', state.moveHandler)\n\t\t}\n\t\tif (state.endHandler) {\n\t\t\tdocument.removeEventListener('mouseup', state.endHandler)\n\t\t\tdocument.removeEventListener('touchend', state.endHandler)\n\t\t}\n\n\t\tdelete (el as any).__draggable\n\t},\n})\n\nexport default vDraggable\n","import { defineDirective } from '@directix/core'\n\n/**\n * Ellipsis directive options\n */\nexport interface EllipsisOptions {\n\t/**\n\t * Number of lines to show before truncating\n\t * @default 1\n\t */\n\tlines?: number\n\n\t/**\n\t * Custom ellipsis string\n\t * @default '...'\n\t */\n\tellipsis?: string\n\n\t/**\n\t * Whether to expand on click\n\t * @default false\n\t */\n\texpandable?: boolean\n\n\t/**\n\t * Title attribute behavior\n\t * - 'auto': Show full text as title only when truncated\n\t * - 'always': Always show full text as title\n\t * - 'none': Don't show title\n\t * @default 'auto'\n\t */\n\ttitleBehavior?: 'auto' | 'always' | 'none'\n}\n\n/**\n * Directive binding value type\n */\nexport type EllipsisBinding = number | EllipsisOptions\n\n/**\n * Element state storage\n */\ninterface EllipsisState {\n\toptions: EllipsisOptions\n\toriginalText: string\n\tclickHandler: (() => void) | null\n\texpanded: boolean\n}\n\n/**\n * v-ellipsis directive\n *\n * Truncates text with ellipsis, supports single and multi-line truncation.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Single line ellipsis -->\n * <p v-ellipsis>Long text here...</p>\n *\n * <!-- Multi-line ellipsis (3 lines) -->\n * <p v-ellipsis=\"3\">Long text here...</p>\n *\n * <!-- With options -->\n * <p v-ellipsis=\"{ lines: 2, expandable: true }\">\n * Click to expand long text...\n * </p>\n * </template>\n * ```\n */\nexport const vEllipsis = defineDirective<EllipsisBinding, HTMLElement>({\n\tname: 'ellipsis',\n\tssr: true,\n\tdefaults: {\n\t\tlines: 1,\n\t\tellipsis: '...',\n\t\texpandable: false,\n\t\ttitleBehavior: 'auto',\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tapplyEllipsis(el, options)\n\n\t\tconst state: EllipsisState = {\n\t\t\toptions,\n\t\t\toriginalText: el.textContent || '',\n\t\t\tclickHandler: null,\n\t\t\texpanded: false,\n\t\t}\n\n\t\t// Handle expandable\n\t\tif (options.expandable) {\n\t\t\tconst handler = (): void => {\n\t\t\t\tif (state.expanded) {\n\t\t\t\t\t// Collapse\n\t\t\t\t\tapplyEllipsis(el, options)\n\t\t\t\t\tstate.expanded = false\n\t\t\t\t} else {\n\t\t\t\t\t// Expand\n\t\t\t\t\tel.textContent = state.originalText\n\t\t\t\t\tel.style.webkitLineClamp = ''\n\t\t\t\t\tel.style.display = ''\n\t\t\t\t\tel.style.overflow = ''\n\t\t\t\t\tel.style.cursor = ''\n\t\t\t\t\tstate.expanded = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tel.addEventListener('click', handler)\n\t\t\tel.style.cursor = 'pointer'\n\t\t\tstate.clickHandler = handler\n\t\t}\n\n\t\t// Handle title\n\t\tif (options.titleBehavior === 'always') {\n\t\t\tel.title = state.originalText\n\t\t} else if (options.titleBehavior === 'auto') {\n\t\t\t// Check if text is actually truncated\n\t\t\tif (isTextTruncated(el)) {\n\t\t\t\tel.title = state.originalText\n\t\t\t}\n\t\t}\n\n\t\t;(el as any).__ellipsis = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: EllipsisState = (el as any).__ellipsis\n\n\t\tif (!state) {\n\t\t\tconst options = normalizeOptions(binding.value)\n\t\t\tapplyEllipsis(el, options)\n\t\t\treturn\n\t\t}\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst textChanged = el.textContent !== state.originalText\n\n\t\tif (textChanged) {\n\t\t\tstate.originalText = el.textContent || ''\n\t\t\tstate.expanded = false\n\t\t}\n\n\t\t// Update click handler if expandable changed\n\t\tif (state.options.expandable !== newOptions.expandable) {\n\t\t\tif (state.clickHandler) {\n\t\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t\t\tstate.clickHandler = null\n\t\t\t}\n\n\t\t\tif (newOptions.expandable) {\n\t\t\t\tconst handler = (): void => {\n\t\t\t\t\tif (state.expanded) {\n\t\t\t\t\t\tapplyEllipsis(el, newOptions)\n\t\t\t\t\t\tstate.expanded = false\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.textContent = state.originalText\n\t\t\t\t\t\tel.style.webkitLineClamp = ''\n\t\t\t\t\t\tel.style.display = ''\n\t\t\t\t\t\tel.style.overflow = ''\n\t\t\t\t\t\tstate.expanded = true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('click', handler)\n\t\t\t\tel.style.cursor = 'pointer'\n\t\t\t\tstate.clickHandler = handler\n\t\t\t} else {\n\t\t\t\tel.style.cursor = ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\n\t\t// Reapply ellipsis if not expanded\n\t\tif (!state.expanded) {\n\t\t\tapplyEllipsis(el, newOptions)\n\t\t}\n\n\t\t// Update title\n\t\tif (newOptions.titleBehavior === 'always') {\n\t\t\tel.title = state.originalText\n\t\t} else if (newOptions.titleBehavior === 'auto') {\n\t\t\tel.title = isTextTruncated(el) ? state.originalText : ''\n\t\t} else {\n\t\t\tel.removeAttribute('title')\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: EllipsisState | undefined = (el as any).__ellipsis\n\n\t\tif (!state) return\n\n\t\tif (state.clickHandler) {\n\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t}\n\n\t\t// Clean up styles\n\t\tel.style.removeProperty('-webkit-line-clamp')\n\t\tel.style.removeProperty('-webkit-box-orient')\n\t\tel.style.removeProperty('display')\n\t\tel.style.removeProperty('overflow')\n\t\tel.style.removeProperty('text-overflow')\n\t\tel.style.removeProperty('white-space')\n\t\tel.style.removeProperty('cursor')\n\n\t\tdelete (el as any).__ellipsis\n\t},\n})\n\n/**\n * Apply ellipsis styles to element\n */\nfunction applyEllipsis(el: HTMLElement, options: EllipsisOptions): void {\n\tconst lines = options.lines || 1\n\n\tif (lines === 1) {\n\t\t// Single line ellipsis\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.textOverflow = 'ellipsis'\n\t\tel.style.whiteSpace = 'nowrap'\n\t} else {\n\t\t// Multi-line ellipsis\n\t\tel.style.display = '-webkit-box'\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.webkitBoxOrient = 'vertical'\n\t\tel.style.webkitLineClamp = String(lines)\n\t}\n}\n\n/**\n * Check if text is truncated\n */\nfunction isTextTruncated(el: HTMLElement): boolean {\n\treturn el.scrollWidth > el.clientWidth || el.scrollHeight > el.clientHeight\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: EllipsisBinding | undefined): EllipsisOptions {\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tlines: binding,\n\t\t\tellipsis: '...',\n\t\t\texpandable: false,\n\t\t\ttitleBehavior: 'auto',\n\t\t}\n\t}\n\n\treturn {\n\t\tlines: binding?.lines ?? 1,\n\t\tellipsis: binding?.ellipsis ?? '...',\n\t\texpandable: binding?.expandable ?? false,\n\t\ttitleBehavior: binding?.titleBehavior ?? 'auto',\n\t}\n}\n\nexport default vEllipsis\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Focus directive options\n */\nexport interface FocusOptions {\n\t/**\n\t * Whether to auto focus\n\t * @default true\n\t */\n\tfocus?: boolean\n\n\t/**\n\t * Whether to refocus when binding value changes\n\t * @default false\n\t */\n\trefocus?: boolean\n\n\t/**\n\t * Callback when focused\n\t */\n\tonFocus?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when blurred\n\t */\n\tonBlur?: (el: HTMLElement) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type FocusBinding = boolean | FocusOptions\n\n/**\n * Element state storage\n */\ninterface FocusState {\n\toptions: FocusOptions\n\thandleFocus: () => void\n\thandleBlur: () => void\n\tlastValue: FocusBinding\n}\n\nconst FOCUSABLE_TAGS = new Set(['input', 'textarea', 'select', 'button'])\n\n/**\n * Compare two values for equality (supports primitive types and shallow object comparison)\n */\nfunction isEqual(a: unknown, b: unknown): boolean {\n\tif (a === b) return true\n\tif (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n\tconst objA = a as Record<string, unknown>\n\tconst objB = b as Record<string, unknown>\n\tconst keysA = Object.keys(objA)\n\tconst keysB = Object.keys(objB)\n\n\tif (keysA.length !== keysB.length) return false\n\n\treturn keysA.every(key => objA[key] === objB[key])\n}\n\n/**\n * v-focus directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-focus />\n * <input v-focus=\"{ focus: true, refocus: true }\" />\n * </template>\n * ```\n */\nexport const vFocus = defineDirective<FocusBinding, HTMLElement>({\n\tname: 'focus',\n\tssr: true, // SSR safe - will skip focus on server\n\tdefaults: {\n\t\tfocus: true,\n\t\trefocus: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.focus || !isFocusable(el)) {\n\t\t\tif (options.focus) {\n\t\t\t\tconsole.warn('[Directix] v-focus: Element is not focusable')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst handleFocus = (): void => options.onFocus?.(el)\n\t\tconst handleBlur = (): void => options.onBlur?.(el)\n\n\t\tel.addEventListener('focus', handleFocus)\n\t\tel.addEventListener('blur', handleBlur)\n\n\t\t;(el as any).__focus = {\n\t\t\toptions,\n\t\t\thandleFocus,\n\t\t\thandleBlur,\n\t\t\tlastValue: binding.value,\n\t\t} as FocusState\n\n\t\tel.focus()\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Update event listeners only when callbacks change\n\t\tif (newOptions.onFocus !== state.options.onFocus) {\n\t\t\tel.removeEventListener('focus', state.handleFocus)\n\t\t\tstate.handleFocus = () => newOptions.onFocus?.(el)\n\t\t\tel.addEventListener('focus', state.handleFocus)\n\t\t}\n\n\t\tif (newOptions.onBlur !== state.options.onBlur) {\n\t\t\tel.removeEventListener('blur', state.handleBlur)\n\t\t\tstate.handleBlur = () => newOptions.onBlur?.(el)\n\t\t\tel.addEventListener('blur', state.handleBlur)\n\t\t}\n\n\t\t// Check if value actually changed\n\t\tconst valueChanged = !isEqual(binding.value, state.lastValue)\n\n\t\t// Refocus when value changes and refocus is enabled\n\t\tif (newOptions.refocus && newOptions.focus && valueChanged) {\n\t\t\tel.focus()\n\t\t}\n\n\t\tstate.options = newOptions\n\t\tstate.lastValue = binding.value\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('focus', state.handleFocus)\n\t\tel.removeEventListener('blur', state.handleBlur)\n\t\tdelete (el as any).__focus\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FocusBinding | undefined): FocusOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { focus: binding, refocus: false }\n\t}\n\n\treturn {\n\t\tfocus: true,\n\t\trefocus: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if element is focusable\n */\nfunction isFocusable(el: HTMLElement): boolean {\n\tif (!isBrowser()) return false\n\n\tconst tagName = el.tagName.toLowerCase()\n\n\t// Form elements\n\tif (FOCUSABLE_TAGS.has(tagName)) {\n\t\treturn !(el as HTMLInputElement).disabled\n\t}\n\n\t// Contenteditable elements\n\tif (el.isContentEditable) return true\n\n\t// Elements with tabindex\n\tconst tabindex = el.getAttribute('tabindex')\n\n\tif (tabindex != null) return tabindex !== '-1'\n\n\t// Link elements\n\tif (tagName === 'a' || tagName === 'area') {\n\t\treturn el.hasAttribute('href')\n\t}\n\n\treturn false\n}\n\nexport default vFocus\n","import { defineDirective } from '@directix/core'\n\nexport type HotkeyHandler = (event: KeyboardEvent) => void\n\nexport type ModifierKey = 'ctrl' | 'alt' | 'shift' | 'meta'\n\nexport interface HotkeyDefinition {\n\tkey: string\n\tmodifiers?: ModifierKey[]\n\thandler: HotkeyHandler\n\tprevent?: boolean\n\tstop?: boolean\n\tdisabled?: boolean\n\tglobal?: boolean\n}\n\nexport type HotkeyBinding\n\t= | HotkeyHandler\n\t\t| HotkeyDefinition\n\t\t| HotkeyDefinition[]\n\t\t| Record<string, HotkeyHandler | HotkeyDefinition>\n\ninterface HotkeyEntry {\n\tkey: string\n\tmodifiers: Set<ModifierKey>\n\thandler: HotkeyHandler\n\tprevent: boolean\n\tstop: boolean\n\tdisabled: boolean\n}\n\ninterface HotkeyState {\n\tentries: HotkeyEntry[]\n\thandler: (event: KeyboardEvent) => void\n}\n\nconst KEY_ALIASES: Record<string, string> = {\n\tesc: 'escape',\n\tspace: ' ',\n\tup: 'arrowup',\n\tdown: 'arrowdown',\n\tleft: 'arrowleft',\n\tright: 'arrowright',\n\tenter: 'enter',\n\ttab: 'tab',\n\tdelete: 'delete',\n\tbackspace: 'backspace',\n\tinsert: 'insert',\n\thome: 'home',\n\tend: 'end',\n\tpagedown: 'pagedown',\n\tpageup: 'pageup',\n\tf1: 'f1',\n\tf2: 'f2',\n\tf3: 'f3',\n\tf4: 'f4',\n\tf5: 'f5',\n\tf6: 'f6',\n\tf7: 'f7',\n\tf8: 'f8',\n\tf9: 'f9',\n\tf10: 'f10',\n\tf11: 'f11',\n\tf12: 'f12',\n}\n\nconst MODIFIER_KEYS = new Set(['ctrl', 'alt', 'shift', 'meta'])\n\nfunction normalizeKey(key: string): string {\n\tconst lowerKey = key.toLowerCase()\n\treturn KEY_ALIASES[lowerKey] || lowerKey\n}\n\nfunction parseHotkeyString(hotkey: string): { key: string, modifiers: ModifierKey[] } {\n\tconst parts = hotkey.toLowerCase().split(/[+.]/)\n\tconst modifiers: ModifierKey[] = []\n\tlet key = ''\n\n\tfor (const part of parts) {\n\t\tif (MODIFIER_KEYS.has(part)) {\n\t\t\tmodifiers.push(part as ModifierKey)\n\t\t} else {\n\t\t\tkey = normalizeKey(part)\n\t\t}\n\t}\n\n\treturn { key, modifiers }\n}\n\nfunction matchesHotkey(event: KeyboardEvent, entry: HotkeyEntry): boolean {\n\tif (normalizeKey(event.key) !== entry.key) return false\n\n\tconst eventModifiers = new Set<ModifierKey>()\n\tif (event.ctrlKey) eventModifiers.add('ctrl')\n\tif (event.altKey) eventModifiers.add('alt')\n\tif (event.shiftKey) eventModifiers.add('shift')\n\tif (event.metaKey) eventModifiers.add('meta')\n\n\tif (eventModifiers.size !== entry.modifiers.size) return false\n\n\tfor (const mod of entry.modifiers) {\n\t\tif (!eventModifiers.has(mod)) return false\n\t}\n\n\treturn true\n}\n\nfunction createEntry(\n\tkey: string,\n\tmodifiers: ModifierKey[],\n\thandler: HotkeyHandler,\n\toptions: { prevent?: boolean, stop?: boolean, disabled?: boolean } = {},\n): HotkeyEntry {\n\treturn {\n\t\tkey: normalizeKey(key),\n\t\tmodifiers: new Set(modifiers),\n\t\thandler,\n\t\tprevent: options.prevent ?? true,\n\t\tstop: options.stop ?? true,\n\t\tdisabled: options.disabled ?? false,\n\t}\n}\n\nfunction normalizeBinding(\n\tbinding: HotkeyBinding,\n\targ: string | undefined,\n\tmodifiers: Record<string, boolean>,\n): HotkeyEntry[] {\n\t// Argument syntax: v-hotkey:ctrl.s=\"handler\" or v-hotkey:escape=\"handler\"\n\tif (arg) {\n\t\tconst argLower = arg.toLowerCase()\n\t\tconst argIsModifier = MODIFIER_KEYS.has(argLower)\n\n\t\tlet key: string\n\t\tconst parsedModifiers: ModifierKey[] = []\n\n\t\tif (argIsModifier) {\n\t\t\t// v-hotkey:ctrl.s -> arg is modifier, key in directive modifiers\n\t\t\tparsedModifiers.push(argLower as ModifierKey)\n\t\t\tfor (const mod of Object.keys(modifiers)) {\n\t\t\t\tconst modLower = mod.toLowerCase()\n\t\t\t\tif (MODIFIER_KEYS.has(modLower)) {\n\t\t\t\t\tparsedModifiers.push(modLower as ModifierKey)\n\t\t\t\t} else {\n\t\t\t\t\tkey = normalizeKey(mod)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// v-hotkey:escape -> arg is the key\n\t\t\tconst parsed = parseHotkeyString(arg)\n\t\t\tkey = parsed.key\n\t\t\tparsedModifiers.push(...parsed.modifiers)\n\t\t\tfor (const mod of Object.keys(modifiers)) {\n\t\t\t\tconst modLower = mod.toLowerCase()\n\t\t\t\tif (MODIFIER_KEYS.has(modLower)) {\n\t\t\t\t\tparsedModifiers.push(modLower as ModifierKey)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst handler = typeof binding === 'function' ? binding : (binding as HotkeyDefinition).handler\n\t\treturn [createEntry(key!, parsedModifiers, handler)]\n\t}\n\n\t// Function without arg - invalid\n\tif (typeof binding === 'function') {\n\t\tconsole.warn('[Directix] v-hotkey: hotkey definition required (use v-hotkey:ctrl.s=\"handler\")')\n\t\treturn []\n\t}\n\n\t// Array syntax: [{ key: 's', modifiers: ['ctrl'], handler }]\n\tif (Array.isArray(binding)) {\n\t\treturn binding.map(item =>\n\t\t\tcreateEntry(item.key, item.modifiers || [], item.handler, {\n\t\t\t\tprevent: item.prevent,\n\t\t\t\tstop: item.stop,\n\t\t\t\tdisabled: item.disabled,\n\t\t\t}),\n\t\t)\n\t}\n\n\t// Object syntax\n\tif (typeof binding === 'object' && binding !== null) {\n\t\t// Single HotkeyDefinition: { key: 's', handler }\n\t\tif ('handler' in binding && typeof binding.handler === 'function') {\n\t\t\tconst def = binding as HotkeyDefinition\n\t\t\treturn [createEntry(def.key, def.modifiers || [], def.handler, def)]\n\t\t}\n\n\t\t// Record syntax: { 'ctrl+s': handler }\n\t\tconst entries: HotkeyEntry[] = []\n\t\tfor (const [hotkeyStr, value] of Object.entries(binding)) {\n\t\t\tconst { key, modifiers: parsedModifiers } = parseHotkeyString(hotkeyStr)\n\t\t\tconst handler = typeof value === 'function' ? value : value.handler\n\t\t\tconst options = typeof value === 'object' ? value : {}\n\t\t\tentries.push(createEntry(key, parsedModifiers, handler, options))\n\t\t}\n\t\treturn entries\n\t}\n\n\treturn []\n}\n\nfunction createKeydownHandler(state: HotkeyState) {\n\treturn (event: KeyboardEvent) => {\n\t\tfor (const entry of state.entries) {\n\t\t\tif (entry.disabled) continue\n\t\t\tif (!matchesHotkey(event, entry)) continue\n\n\t\t\tif (entry.prevent) event.preventDefault()\n\t\t\tif (entry.stop) event.stopPropagation()\n\t\t\tentry.handler(event)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunction setupState(el: HTMLElement, entries: HotkeyEntry[]): HotkeyState | null {\n\tif (entries.length === 0) return null\n\n\tconst state: HotkeyState = { entries, handler: null as any }\n\tstate.handler = createKeydownHandler(state)\n\n\tel.tabIndex = el.tabIndex || -1\n\tel.addEventListener('keydown', state.handler)\n\t;(el as any).__hotkey = state\n\n\treturn state\n}\n\nexport const vHotkey = defineDirective<HotkeyBinding, HTMLElement>({\n\tname: 'hotkey',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst entries = normalizeBinding(binding.value, binding.arg, binding.modifiers)\n\t\tsetupState(el, entries)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HotkeyState | undefined = (el as any).__hotkey\n\t\tconst newEntries = normalizeBinding(binding.value, binding.arg, binding.modifiers)\n\n\t\tif (state) {\n\t\t\tstate.entries = newEntries\n\t\t} else {\n\t\t\tsetupState(el, newEntries)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HotkeyState | undefined = (el as any).__hotkey\n\t\tif (!state) return\n\n\t\tel.removeEventListener('keydown', state.handler)\n\t\tdelete (el as any).__hotkey\n\t},\n})\n\nexport default vHotkey\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Hover state change handler\n */\nexport type HoverHandler = (isHovering: boolean, event: MouseEvent) => void\n\n/**\n * Hover directive options\n */\nexport interface HoverOptions {\n\t/**\n\t * Callback when hover state changes\n\t */\n\thandler?: HoverHandler\n\n\t/**\n\t * Callback when mouse enters\n\t */\n\tonEnter?: (event: MouseEvent) => void\n\n\t/**\n\t * Callback when mouse leaves\n\t */\n\tonLeave?: (event: MouseEvent) => void\n\n\t/**\n\t * CSS class to add when hovering\n\t * @default 'v-hover'\n\t */\n\tclass?: string\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Delay in milliseconds before triggering enter\n\t * @default 0\n\t */\n\tenterDelay?: number\n\n\t/**\n\t * Delay in milliseconds before triggering leave\n\t * @default 0\n\t */\n\tleaveDelay?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type HoverBinding = HoverHandler | HoverOptions\n\n/**\n * Element state storage\n */\ninterface HoverState {\n\toptions: HoverOptions\n\tisHovering: boolean\n\tenterTimerId: ReturnType<typeof setTimeout> | null\n\tleaveTimerId: ReturnType<typeof setTimeout> | null\n\tenterHandler: (e: Event) => void\n\tleaveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: HoverBinding | undefined): HoverOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, class: 'v-hover' }\n\t}\n\n\treturn {\n\t\tclass: 'v-hover',\n\t\tdisabled: false,\n\t\tenterDelay: 0,\n\t\tleaveDelay: 0,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-hover directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-hover=\"handleHover\">Hover me</div>\n * <div v-hover=\"{ onEnter: handleEnter, onLeave: handleLeave, class: 'is-hovering' }\">Hover me</div>\n * </template>\n * ```\n */\nexport const vHover = defineDirective<HoverBinding, HTMLElement>({\n\tname: 'hover',\n\tssr: false,\n\tdefaults: {\n\t\tclass: 'v-hover',\n\t\tdisabled: false,\n\t\tenterDelay: 0,\n\t\tleaveDelay: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: HoverState = {\n\t\t\toptions,\n\t\t\tisHovering: false,\n\t\t\tenterTimerId: null,\n\t\t\tleaveTimerId: null,\n\t\t\tenterHandler: () => {},\n\t\t\tleaveHandler: () => {},\n\t\t}\n\n\t\t// Enter handler\n\t\tstate.enterHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear leave timer if exists\n\t\t\tif (state.leaveTimerId) {\n\t\t\t\tclearTimeout(state.leaveTimerId)\n\t\t\t\tstate.leaveTimerId = null\n\t\t\t}\n\n\t\t\t// If already hovering, do nothing\n\t\t\tif (state.isHovering) return\n\n\t\t\t// Handle enter delay\n\t\t\tif (options.enterDelay && options.enterDelay > 0) {\n\t\t\t\tstate.enterTimerId = setTimeout(() => {\n\t\t\t\t\tstate.isHovering = true\n\t\t\t\t\tapplyHoverState(el, state, event)\n\t\t\t\t}, options.enterDelay)\n\t\t\t} else {\n\t\t\t\tstate.isHovering = true\n\t\t\t\tapplyHoverState(el, state, event)\n\t\t\t}\n\t\t}\n\n\t\t// Leave handler\n\t\tstate.leaveHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear enter timer if exists\n\t\t\tif (state.enterTimerId) {\n\t\t\t\tclearTimeout(state.enterTimerId)\n\t\t\t\tstate.enterTimerId = null\n\t\t\t}\n\n\t\t\t// If not hovering, do nothing\n\t\t\tif (!state.isHovering) return\n\n\t\t\t// Handle leave delay\n\t\t\tif (options.leaveDelay && options.leaveDelay > 0) {\n\t\t\t\tstate.leaveTimerId = setTimeout(() => {\n\t\t\t\t\tstate.isHovering = false\n\t\t\t\t\tapplyLeaveState(el, state, event)\n\t\t\t\t}, options.leaveDelay)\n\t\t\t} else {\n\t\t\t\tstate.isHovering = false\n\t\t\t\tapplyLeaveState(el, state, event)\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__hover = state\n\n\t\t// Bind events\n\t\ton(el, 'mouseenter', state.enterHandler)\n\t\ton(el, 'mouseleave', state.leaveHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HoverState = (el as any).__hover\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Was enabled, now disabled - remove class and listeners\n\t\t\tel.classList.remove(state.options.class || 'v-hover')\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Was disabled, now enabled - re-add listeners (already bound)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HoverState = (el as any).__hover\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.enterTimerId) {\n\t\t\tclearTimeout(state.enterTimerId)\n\t\t}\n\n\t\tif (state.leaveTimerId) {\n\t\t\tclearTimeout(state.leaveTimerId)\n\t\t}\n\n\t\t// Unbind events\n\t\toff(el, 'mouseenter', state.enterHandler)\n\t\toff(el, 'mouseleave', state.leaveHandler)\n\n\t\t// Remove class\n\t\tel.classList.remove(state.options.class || 'v-hover')\n\n\t\tdelete (el as any).__hover\n\t},\n})\n\n/**\n * Apply hover state\n */\nfunction applyHoverState(el: HTMLElement, state: HoverState, e: MouseEvent): void {\n\tconst { options } = state\n\n\t// Add class\n\tif (options.class) {\n\t\tel.classList.add(options.class)\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('hover:enter', { detail: { event: e } }))\n\n\t// Trigger callbacks\n\toptions.onEnter?.(e)\n\toptions.handler?.(true, e)\n}\n\n/**\n * Apply leave state\n */\nfunction applyLeaveState(el: HTMLElement, state: HoverState, e: MouseEvent): void {\n\tconst { options } = state\n\n\t// Remove class\n\tif (options.class) {\n\t\tel.classList.remove(options.class)\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('hover:leave', { detail: { event: e } }))\n\n\t// Trigger callbacks\n\toptions.onLeave?.(e)\n\toptions.handler?.(false, e)\n}\n\nexport default vHover\n","import { defineDirective } from '@directix/core'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Image preview options\n */\nexport interface ImagePreviewOptions {\n\t/** Image source URL */\n\tsrc?: string\n\t/** Preview image source URL (higher resolution) */\n\tpreviewSrc?: string\n\t/** Alt text for accessibility */\n\talt?: string\n\t/** Whether preview is disabled @default false */\n\tdisabled?: boolean\n\t/** Close on click outside @default true */\n\tcloseOnClickOutside?: boolean\n\t/** Close on escape key @default true */\n\tcloseOnEsc?: boolean\n\t/** Show close button @default true */\n\tshowCloseButton?: boolean\n\t/** Z-index of the preview overlay @default 9999 */\n\tzIndex?: number\n\t/** Custom class for the preview overlay */\n\tclass?: string\n\t/** Enable pinch zoom on mobile @default true */\n\tenablePinchZoom?: boolean\n\t/** Enable double tap to zoom @default true */\n\tenableDoubleTap?: boolean\n\t/** Enable swipe up to close @default true */\n\tenableSwipeClose?: boolean\n\t/** Show zoom indicator @default true */\n\tshowZoomIndicator?: boolean\n\t/** Minimum zoom scale @default 0.5 */\n\tminScale?: number\n\t/** Maximum zoom scale @default 5 */\n\tmaxScale?: number\n\t/** Callback when preview opens */\n\tonOpen?: () => void\n\t/** Callback when preview closes */\n\tonClose?: () => void\n}\n\nexport type ImagePreviewBinding = string | ImagePreviewOptions\n\ninterface TransformState {\n\tscale: number\n\ttranslateX: number\n\ttranslateY: number\n}\n\ninterface GestureState {\n\tisDragging: boolean\n\tstartX: number\n\tstartY: number\n\tstartDistance: number\n\tstartScale: number\n\tlastTapTime: number\n\tswipeStartY: number\n}\n\ninterface PreviewState {\n\toptions: ImagePreviewOptions\n\toverlay: HTMLElement | null\n\timageContainer: HTMLElement | null\n\timage: HTMLImageElement | null\n\tisOpen: boolean\n\ttransform: TransformState\n\tgesture: GestureState\n\thandlers: {\n\t\tclick: () => void\n\t\tesc: ((e: KeyboardEvent) => void) | null\n\t\ttouchStart: ((e: TouchEvent) => void) | null\n\t\ttouchMove: ((e: TouchEvent) => void) | null\n\t\ttouchEnd: ((e: TouchEvent) => void) | null\n\t\tmouseDown: ((e: MouseEvent) => void) | null\n\t\tmouseMove: ((e: MouseEvent) => void) | null\n\t\tmouseUp: ((e: MouseEvent) => void) | null\n\t\twheel: ((e: WheelEvent) => void) | null\n\t}\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULTS = {\n\tminScale: 0.5,\n\tmaxScale: 5,\n\tdoubleTapZoom: 2.5,\n\tswipeThreshold: 100,\n\ttapTimeout: 300,\n\tanimationDuration: 300,\n\thintDuration: 3000,\n\tzoomIndicatorDuration: 1500,\n} as const\n\nlet globalZIndex = 9999\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction getDistance(x1: number, y1: number, x2: number, y2: number): number {\n\treturn Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value))\n}\n\n// ============================================================================\n// UI Components\n// ============================================================================\n\nfunction createOverlay(options: ImagePreviewOptions): {\n\toverlay: HTMLElement\n\timageContainer: HTMLElement\n\timage: HTMLImageElement\n} {\n\tconst zIndex = options.zIndex ?? ++globalZIndex\n\n\t// Main overlay\n\tconst overlay = document.createElement('div')\n\toverlay.className = 'v-image-preview-overlay'\n\tif (options.class) overlay.classList.add(options.class)\n\n\tObject.assign(overlay.style, {\n\t\tposition: 'fixed',\n\t\tinset: '0',\n\t\tbackground: 'rgba(0, 0, 0, 0.95)',\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\tzIndex: String(zIndex),\n\t\tcursor: 'zoom-out',\n\t\topacity: '0',\n\t\ttransition: 'opacity 0.3s',\n\t\ttouchAction: 'none',\n\t\toverflow: 'hidden',\n\t})\n\n\t// Image container\n\tconst imageContainer = document.createElement('div')\n\tObject.assign(imageContainer.style, {\n\t\tposition: 'relative',\n\t\ttransformOrigin: 'center center',\n\t\ttransition: 'transform 0.1s ease-out',\n\t\twillChange: 'transform',\n\t})\n\n\t// Image element\n\tconst image = document.createElement('img')\n\timage.src = options.previewSrc || options.src || ''\n\timage.alt = options.alt || ''\n\tObject.assign(image.style, {\n\t\tmaxWidth: '95vw',\n\t\tmaxHeight: '90vh',\n\t\tobjectFit: 'contain',\n\t\tcursor: 'grab',\n\t\tuserSelect: 'none',\n\t\tWebkitUserDrag: 'none',\n\t})\n\timage.addEventListener('dragstart', e => e.preventDefault())\n\n\timageContainer.appendChild(image)\n\n\t// Close button\n\tif (options.showCloseButton !== false) {\n\t\tconst closeBtn = document.createElement('button')\n\t\tcloseBtn.className = 'v-image-preview-close'\n\t\tcloseBtn.innerHTML = '×'\n\t\tcloseBtn.setAttribute('aria-label', 'Close preview')\n\n\t\tObject.assign(closeBtn.style, {\n\t\t\tposition: 'fixed',\n\t\t\ttop: '16px',\n\t\t\tright: '16px',\n\t\t\twidth: '44px',\n\t\t\theight: '44px',\n\t\t\tborder: 'none',\n\t\t\tbackground: 'rgba(255, 255, 255, 0.15)',\n\t\t\tcolor: 'white',\n\t\t\tfontSize: '28px',\n\t\t\tcursor: 'pointer',\n\t\t\tborderRadius: '50%',\n\t\t\ttransition: 'background 0.2s, transform 0.2s',\n\t\t\tzIndex: String(zIndex + 1),\n\t\t\tdisplay: 'flex',\n\t\t\talignItems: 'center',\n\t\t\tjustifyContent: 'center',\n\t\t\tbackdropFilter: 'blur(10px)',\n\t\t\tWebkitBackdropFilter: 'blur(10px)',\n\t\t})\n\n\t\tconst setBtnStyle = (bg: string, scale: string): void => {\n\t\t\tcloseBtn.style.background = bg\n\t\t\tcloseBtn.style.transform = scale\n\t\t}\n\n\t\tcloseBtn.addEventListener('mouseenter', () => setBtnStyle('rgba(255, 255, 255, 0.25)', 'scale(1.1)'))\n\t\tcloseBtn.addEventListener('mouseleave', () => setBtnStyle('rgba(255, 255, 255, 0.15)', 'scale(1)'))\n\t\tcloseBtn.addEventListener('touchstart', () => setBtnStyle('rgba(255, 255, 255, 0.35)', 'scale(1.15)'), { passive: true })\n\t\tcloseBtn.addEventListener('touchend', () => setBtnStyle('rgba(255, 255, 255, 0.15)', 'scale(1)'), { passive: true })\n\n\t\toverlay.appendChild(closeBtn)\n\t}\n\n\t// Zoom indicator\n\tif (options.showZoomIndicator !== false) {\n\t\tconst zoomIndicator = document.createElement('div')\n\t\tzoomIndicator.className = 'v-image-preview-zoom'\n\t\tzoomIndicator.textContent = '100%'\n\n\t\tObject.assign(zoomIndicator.style, {\n\t\t\tposition: 'fixed',\n\t\t\tbottom: '24px',\n\t\t\tleft: '50%',\n\t\t\ttransform: 'translateX(-50%)',\n\t\t\tbackground: 'rgba(0, 0, 0, 0.6)',\n\t\t\tcolor: 'white',\n\t\t\tpadding: '8px 16px',\n\t\t\tborderRadius: '20px',\n\t\t\tfontSize: '14px',\n\t\t\tfontWeight: '500',\n\t\t\topacity: '0',\n\t\t\ttransition: 'opacity 0.3s',\n\t\t\tzIndex: String(zIndex + 1),\n\t\t\tbackdropFilter: 'blur(10px)',\n\t\t\tWebkitBackdropFilter: 'blur(10px)',\n\t\t})\n\n\t\toverlay.appendChild(zoomIndicator)\n\t}\n\n\t// Hint\n\tconst hint = document.createElement('div')\n\thint.className = 'v-image-preview-hint'\n\thint.textContent = 'Pinch to zoom • Double tap • Swipe up to close'\n\n\tObject.assign(hint.style, {\n\t\tposition: 'fixed',\n\t\tbottom: '60px',\n\t\tleft: '50%',\n\t\ttransform: 'translateX(-50%)',\n\t\tcolor: 'rgba(255, 255, 255, 0.6)',\n\t\tfontSize: '12px',\n\t\topacity: '1',\n\t\ttransition: 'opacity 0.5s',\n\t\tzIndex: String(zIndex + 1),\n\t\tpointerEvents: 'none',\n\t})\n\n\toverlay.appendChild(hint)\n\tsetTimeout(() => (hint.style.opacity = '0'), DEFAULTS.hintDuration)\n\n\toverlay.appendChild(imageContainer)\n\n\treturn { overlay, imageContainer, image }\n}\n\n// ============================================================================\n// Transform Helpers\n// ============================================================================\n\ninterface TransformManager {\n\tupdateTransform: (animate?: boolean) => void\n\tresetTransform: () => void\n\tconstrainScale: (newScale: number) => number\n\tconstrainTranslate: (x: number, y: number) => { x: number, y: number }\n}\n\nfunction createTransformManager(state: PreviewState): TransformManager {\n\tconst updateTransform = (animate = false): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tconst { scale, translateX, translateY } = state.transform\n\t\tstate.imageContainer.style.transition = animate ? 'transform 0.2s ease-out' : 'none'\n\t\tstate.imageContainer.style.transform = `translate(${translateX}px, ${translateY}px) scale(${scale})`\n\n\t\t// Update zoom indicator\n\t\tconst zoomIndicator = state.overlay?.querySelector('.v-image-preview-zoom') as HTMLElement | null\n\t\tif (zoomIndicator) {\n\t\t\tzoomIndicator.textContent = `${Math.round(scale * 100)}%`\n\t\t\tzoomIndicator.style.opacity = '1'\n\n\t\t\tclearTimeout((zoomIndicator as any)._hideTimer)\n\t\t\t;(zoomIndicator as any)._hideTimer = setTimeout(() => {\n\t\t\t\tzoomIndicator.style.opacity = '0'\n\t\t\t}, DEFAULTS.zoomIndicatorDuration)\n\t\t}\n\t}\n\n\tconst resetTransform = (): void => {\n\t\tstate.transform = { scale: 1, translateX: 0, translateY: 0 }\n\t\tupdateTransform(true)\n\t}\n\n\tconst constrainScale = (newScale: number): number => {\n\t\tconst { minScale = DEFAULTS.minScale, maxScale = DEFAULTS.maxScale } = state.options\n\t\treturn clamp(newScale, minScale, maxScale)\n\t}\n\n\tconst constrainTranslate = (x: number, y: number): { x: number, y: number } => {\n\t\tconst { scale } = state.transform\n\t\tif (!state.image || scale <= 1) return { x: 0, y: 0 }\n\n\t\tconst rect = state.image.getBoundingClientRect()\n\t\tconst maxX = (rect.width * (scale - 1)) / 2\n\t\tconst maxY = (rect.height * (scale - 1)) / 2\n\n\t\treturn {\n\t\t\tx: clamp(x, -maxX, maxX),\n\t\t\ty: clamp(y, -maxY, maxY),\n\t\t}\n\t}\n\n\treturn { updateTransform, resetTransform, constrainScale, constrainTranslate }\n}\n\n// ============================================================================\n// Gesture Handlers\n// ============================================================================\n\ninterface GestureHandlers {\n\thandleTouchStart: (e: TouchEvent) => void\n\thandleTouchMove: (e: TouchEvent) => void\n\thandleTouchEnd: (e: TouchEvent) => void\n\thandleMouseDown: (e: MouseEvent) => void\n\thandleMouseMove: (e: MouseEvent) => void\n\thandleMouseUp: () => void\n\thandleWheel: (e: WheelEvent) => void\n}\n\nfunction createGestureHandlers(\n\tstate: PreviewState,\n\ttransformManager: TransformManager,\n\tclosePreview: () => void,\n): GestureHandlers {\n\tconst { updateTransform, resetTransform, constrainScale, constrainTranslate } = transformManager\n\n\tconst handleTouchStart = (e: TouchEvent): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tconst now = Date.now()\n\t\tconst { gesture, transform, options } = state\n\n\t\tif (e.touches.length === 1) {\n\t\t\t// Double tap detection\n\t\t\tif (options.enableDoubleTap !== false && now - gesture.lastTapTime < DEFAULTS.tapTimeout) {\n\t\t\t\te.preventDefault()\n\t\t\t\ttransform.scale = transform.scale > 1 ? 1 : constrainScale(DEFAULTS.doubleTapZoom)\n\t\t\t\tgesture.lastTapTime = 0\n\t\t\t\tupdateTransform(true)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tgesture.lastTapTime = now\n\t\t\tgesture.isDragging = true\n\t\t\tgesture.startX = e.touches[0].clientX - transform.translateX\n\t\t\tgesture.startY = e.touches[0].clientY - transform.translateY\n\t\t\tgesture.swipeStartY = e.touches[0].clientY\n\t\t} else if (e.touches.length === 2 && options.enablePinchZoom !== false) {\n\t\t\tgesture.isDragging = false\n\t\t\tgesture.startDistance = getDistance(\n\t\t\t\te.touches[0].clientX,\n\t\t\t\te.touches[0].clientY,\n\t\t\t\te.touches[1].clientX,\n\t\t\t\te.touches[1].clientY,\n\t\t\t)\n\t\t\tgesture.startScale = transform.scale\n\t\t}\n\t}\n\n\tconst handleTouchMove = (e: TouchEvent): void => {\n\t\tif (!state.imageContainer) return\n\t\te.preventDefault()\n\n\t\tconst { gesture, transform, options } = state\n\n\t\tif (e.touches.length === 1 && gesture.isDragging) {\n\t\t\tconst newX = e.touches[0].clientX - gesture.startX\n\t\t\tconst newY = e.touches[0].clientY - gesture.startY\n\t\t\tconst constrained = constrainTranslate(newX, newY)\n\n\t\t\ttransform.translateX = constrained.x\n\t\t\ttransform.translateY = constrained.y\n\t\t\tupdateTransform(false)\n\t\t} else if (e.touches.length === 2 && options.enablePinchZoom !== false) {\n\t\t\tconst currentDistance = getDistance(\n\t\t\t\te.touches[0].clientX,\n\t\t\t\te.touches[0].clientY,\n\t\t\t\te.touches[1].clientX,\n\t\t\t\te.touches[1].clientY,\n\t\t\t)\n\n\t\t\ttransform.scale = constrainScale(gesture.startScale * (currentDistance / gesture.startDistance))\n\t\t\tupdateTransform(false)\n\t\t}\n\t}\n\n\tconst handleTouchEnd = (e: TouchEvent): void => {\n\t\tconst { gesture, transform, options } = state\n\t\tgesture.isDragging = false\n\n\t\t// Swipe up to close\n\t\tif (options.enableSwipeClose !== false && e.changedTouches.length === 1 && transform.scale <= 1) {\n\t\t\tconst deltaY = e.changedTouches[0].clientY - gesture.swipeStartY\n\t\t\tif (deltaY < -DEFAULTS.swipeThreshold) {\n\t\t\t\tclosePreview()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// Snap back if scale < 1\n\t\tif (transform.scale < 1) {\n\t\t\tresetTransform()\n\t\t}\n\t}\n\n\tconst handleMouseDown = (e: MouseEvent): void => {\n\t\tif (!state.imageContainer) return\n\n\t\tstate.gesture.isDragging = true\n\t\tstate.gesture.startX = e.clientX - state.transform.translateX\n\t\tstate.gesture.startY = e.clientY - state.transform.translateY\n\t\tstate.imageContainer.style.cursor = 'grabbing'\n\t}\n\n\tconst handleMouseMove = (e: MouseEvent): void => {\n\t\tif (!state.gesture.isDragging || !state.imageContainer) return\n\n\t\tconst newX = e.clientX - state.gesture.startX\n\t\tconst newY = e.clientY - state.gesture.startY\n\t\tconst constrained = constrainTranslate(newX, newY)\n\n\t\tstate.transform.translateX = constrained.x\n\t\tstate.transform.translateY = constrained.y\n\t\tupdateTransform(false)\n\t}\n\n\tconst handleMouseUp = (): void => {\n\t\tstate.gesture.isDragging = false\n\t\tif (state.imageContainer) {\n\t\t\tstate.imageContainer.style.cursor = 'grab'\n\t\t}\n\t}\n\n\tconst handleWheel = (e: WheelEvent): void => {\n\t\tif (!state.imageContainer || state.options.enablePinchZoom === false) return\n\t\te.preventDefault()\n\n\t\tconst delta = e.deltaY > 0 ? 0.9 : 1.1\n\t\tstate.transform.scale = constrainScale(state.transform.scale * delta)\n\t\tupdateTransform(false)\n\n\t\t// Reset if too small\n\t\tif (state.transform.scale < 0.8) {\n\t\t\tsetTimeout(resetTransform, 100)\n\t\t}\n\t}\n\n\treturn { handleTouchStart, handleTouchMove, handleTouchEnd, handleMouseDown, handleMouseMove, handleMouseUp, handleWheel }\n}\n\n// ============================================================================\n// Normalize Options\n// ============================================================================\n\nfunction normalizeOptions(binding: ImagePreviewBinding, el: HTMLElement): ImagePreviewOptions {\n\tconst elSrc = el.tagName === 'IMG' ? (el as HTMLImageElement).src : undefined\n\tconst elPreviewSrc = el.getAttribute('data-preview') || undefined\n\tconst elAlt = el.tagName === 'IMG' ? (el as HTMLImageElement).alt : el.getAttribute('alt') || undefined\n\n\tif (typeof binding === 'string') {\n\t\treturn {\n\t\t\tsrc: binding,\n\t\t\tpreviewSrc: elPreviewSrc,\n\t\t\talt: elAlt,\n\t\t\tenablePinchZoom: true,\n\t\t\tenableDoubleTap: true,\n\t\t\tenableSwipeClose: true,\n\t\t\tshowZoomIndicator: true,\n\t\t\tshowCloseButton: true,\n\t\t\tcloseOnClickOutside: true,\n\t\t\tcloseOnEsc: true,\n\t\t\tminScale: DEFAULTS.minScale,\n\t\t\tmaxScale: DEFAULTS.maxScale,\n\t\t}\n\t}\n\n\treturn {\n\t\tsrc: binding?.src || elSrc,\n\t\tpreviewSrc: binding?.previewSrc || elPreviewSrc,\n\t\talt: binding?.alt || elAlt,\n\t\tdisabled: binding?.disabled ?? false,\n\t\tcloseOnClickOutside: binding?.closeOnClickOutside ?? true,\n\t\tcloseOnEsc: binding?.closeOnEsc ?? true,\n\t\tshowCloseButton: binding?.showCloseButton ?? true,\n\t\tzIndex: binding?.zIndex,\n\t\tclass: binding?.class,\n\t\tenablePinchZoom: binding?.enablePinchZoom ?? true,\n\t\tenableDoubleTap: binding?.enableDoubleTap ?? true,\n\t\tenableSwipeClose: binding?.enableSwipeClose ?? true,\n\t\tshowZoomIndicator: binding?.showZoomIndicator ?? true,\n\t\tminScale: binding?.minScale ?? DEFAULTS.minScale,\n\t\tmaxScale: binding?.maxScale ?? DEFAULTS.maxScale,\n\t\tonOpen: binding?.onOpen,\n\t\tonClose: binding?.onClose,\n\t}\n}\n\n// ============================================================================\n// Directive\n// ============================================================================\n\n/**\n * v-image-preview directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage -->\n * <img v-image-preview src=\"thumbnail.jpg\" data-preview=\"full.jpg\" />\n *\n * <!-- With options -->\n * <img v-image-preview=\"{ src: 'thumbnail.jpg', previewSrc: 'full.jpg' }\" />\n *\n * <!-- On non-img element -->\n * <div v-image-preview=\"{ src: 'image.jpg' }\">Click to preview</div>\n * </template>\n * ```\n */\nexport const vImagePreview = defineDirective<ImagePreviewBinding, HTMLElement>({\n\tname: 'image-preview',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, el)\n\n\t\tconst state: PreviewState = {\n\t\t\toptions,\n\t\t\toverlay: null,\n\t\t\timageContainer: null,\n\t\t\timage: null,\n\t\t\tisOpen: false,\n\t\t\ttransform: { scale: 1, translateX: 0, translateY: 0 },\n\t\t\tgesture: {\n\t\t\t\tisDragging: false,\n\t\t\t\tstartX: 0,\n\t\t\t\tstartY: 0,\n\t\t\t\tstartDistance: 0,\n\t\t\t\tstartScale: 1,\n\t\t\t\tlastTapTime: 0,\n\t\t\t\tswipeStartY: 0,\n\t\t\t},\n\t\t\thandlers: {\n\t\t\t\tclick: () => {},\n\t\t\t\tesc: null,\n\t\t\t\ttouchStart: null,\n\t\t\t\ttouchMove: null,\n\t\t\t\ttouchEnd: null,\n\t\t\t\tmouseDown: null,\n\t\t\t\tmouseMove: null,\n\t\t\t\tmouseUp: null,\n\t\t\t\twheel: null,\n\t\t\t},\n\t\t}\n\n\t\t;(el as any).__imagePreview = state\n\n\t\tif (options.disabled) return\n\t\tel.style.cursor = 'zoom-in'\n\n\t\t// Transform manager\n\t\tconst transformManager = createTransformManager(state)\n\n\t\t// Close preview\n\t\tconst closePreview = (): void => {\n\t\t\tif (!state.isOpen || !state.overlay) return\n\n\t\t\tstate.overlay.style.opacity = '0'\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!state.overlay) return\n\n\t\t\t\tstate.overlay.remove()\n\t\t\t\tstate.overlay = null\n\t\t\t\tstate.imageContainer = null\n\t\t\t\tstate.image = null\n\t\t\t\tstate.isOpen = false\n\t\t\t\tstate.transform = { scale: 1, translateX: 0, translateY: 0 }\n\t\t\t\tdocument.body.style.overflow = ''\n\n\t\t\t\t// Cleanup handlers\n\t\t\t\tconst { handlers } = state\n\t\t\t\tif (handlers.esc) document.removeEventListener('keydown', handlers.esc)\n\t\t\t\tif (handlers.touchStart) document.removeEventListener('touchstart', handlers.touchStart)\n\t\t\t\tif (handlers.touchMove) document.removeEventListener('touchmove', handlers.touchMove)\n\t\t\t\tif (handlers.touchEnd) document.removeEventListener('touchend', handlers.touchEnd)\n\t\t\t\tif (handlers.mouseDown) document.removeEventListener('mousedown', handlers.mouseDown)\n\t\t\t\tif (handlers.mouseMove) document.removeEventListener('mousemove', handlers.mouseMove)\n\t\t\t\tif (handlers.mouseUp) document.removeEventListener('mouseup', handlers.mouseUp)\n\t\t\t\tif (handlers.wheel) document.removeEventListener('wheel', handlers.wheel)\n\n\t\t\t\tstate.options.onClose?.()\n\t\t\t}, DEFAULTS.animationDuration)\n\t\t}\n\n\t\t// Gesture handlers\n\t\tconst gestureHandlers = createGestureHandlers(state, transformManager, closePreview)\n\n\t\t// Open preview\n\t\tconst openPreview = (): void => {\n\t\t\tif (state.isOpen || state.options.disabled) return\n\n\t\t\tconst { overlay, imageContainer, image } = createOverlay(state.options)\n\t\t\tstate.overlay = overlay\n\t\t\tstate.imageContainer = imageContainer\n\t\t\tstate.image = image\n\t\t\tstate.isOpen = true\n\n\t\t\tdocument.body.appendChild(overlay)\n\t\t\tdocument.body.style.overflow = 'hidden'\n\n\t\t\trequestAnimationFrame(() => (overlay.style.opacity = '1'))\n\n\t\t\t// Store handlers\n\t\t\tstate.handlers.touchStart = gestureHandlers.handleTouchStart\n\t\t\tstate.handlers.touchMove = gestureHandlers.handleTouchMove\n\t\t\tstate.handlers.touchEnd = gestureHandlers.handleTouchEnd\n\t\t\tstate.handlers.mouseDown = gestureHandlers.handleMouseDown\n\t\t\tstate.handlers.mouseMove = gestureHandlers.handleMouseMove\n\t\t\tstate.handlers.mouseUp = gestureHandlers.handleMouseUp\n\t\t\tstate.handlers.wheel = gestureHandlers.handleWheel\n\n\t\t\t// Touch events\n\t\t\toverlay.addEventListener('touchstart', gestureHandlers.handleTouchStart, { passive: false })\n\t\t\toverlay.addEventListener('touchmove', gestureHandlers.handleTouchMove, { passive: false })\n\t\t\toverlay.addEventListener('touchend', gestureHandlers.handleTouchEnd, { passive: true })\n\n\t\t\t// Mouse events\n\t\t\timage.addEventListener('mousedown', gestureHandlers.handleMouseDown)\n\t\t\tdocument.addEventListener('mousemove', gestureHandlers.handleMouseMove)\n\t\t\tdocument.addEventListener('mouseup', gestureHandlers.handleMouseUp)\n\n\t\t\t// Wheel zoom\n\t\t\toverlay.addEventListener('wheel', gestureHandlers.handleWheel, { passive: false })\n\n\t\t\t// Close button\n\t\t\toverlay.querySelector('.v-image-preview-close')?.addEventListener('click', e => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tclosePreview()\n\t\t\t})\n\n\t\t\t// Click outside\n\t\t\tif (state.options.closeOnClickOutside !== false) {\n\t\t\t\toverlay.addEventListener('click', () => {\n\t\t\t\t\tif (state.transform.scale <= 1) {\n\t\t\t\t\t\tclosePreview()\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttransformManager.resetTransform()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Escape key\n\t\t\tif (state.options.closeOnEsc !== false) {\n\t\t\t\tstate.handlers.esc = e => {\n\t\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\t\tstate.transform.scale > 1 ? transformManager.resetTransform() : closePreview()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdocument.addEventListener('keydown', state.handlers.esc)\n\t\t\t}\n\n\t\t\tstate.options.onOpen?.()\n\t\t}\n\n\t\tstate.handlers.click = openPreview\n\t\tel.addEventListener('click', openPreview)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__imagePreview as PreviewState | undefined\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value, el)\n\t\tel.style.cursor = state.options.disabled ? '' : 'zoom-in'\n\t},\n\n\tunmounted(el) {\n\t\tconst state = (el as any).__imagePreview as PreviewState | undefined\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handlers.click)\n\n\t\tif (state.isOpen && state.overlay) {\n\t\t\tstate.overlay.remove()\n\t\t\tdocument.body.style.overflow = ''\n\t\t}\n\n\t\tif (state.handlers.esc) document.removeEventListener('keydown', state.handlers.esc)\n\t\tif (state.handlers.touchStart) document.removeEventListener('touchstart', state.handlers.touchStart)\n\t\tif (state.handlers.touchMove) document.removeEventListener('touchmove', state.handlers.touchMove)\n\t\tif (state.handlers.touchEnd) document.removeEventListener('touchend', state.handlers.touchEnd)\n\t\tif (state.handlers.mouseDown) document.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\tif (state.handlers.mouseMove) document.removeEventListener('mousemove', state.handlers.mouseMove)\n\t\tif (state.handlers.mouseUp) document.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\tif (state.handlers.wheel) document.removeEventListener('wheel', state.handlers.wheel)\n\n\t\tdelete (el as any).__imagePreview\n\t},\n})\n\nexport default vImagePreview\n","import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Infinite scroll handler\n */\nexport type InfiniteScrollHandler = () => void | Promise<void>\n\n/**\n * Infinite scroll directive options\n */\nexport interface InfiniteScrollOptions {\n\t/**\n\t * Handler to call when scrolling to bottom\n\t * @required\n\t */\n\thandler: InfiniteScrollHandler\n\n\t/**\n\t * Distance from bottom to trigger load (in pixels)\n\t * @default 0\n\t */\n\tdistance?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether currently loading\n\t * @default false\n\t */\n\tloading?: boolean\n\n\t/**\n\t * Whether to use IntersectionObserver (more efficient)\n\t * @default true\n\t */\n\tuseIntersection?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 200\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container\n\t */\n\tcontainer?: string | Element | null\n\n\t/**\n\t * Callback when load starts\n\t */\n\tonLoadStart?: () => void\n\n\t/**\n\t * Callback when load completes\n\t */\n\tonLoadEnd?: () => void\n\n\t/**\n\t * Callback on error\n\t */\n\tonError?: (error: Error) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type InfiniteScrollBinding = InfiniteScrollHandler | InfiniteScrollOptions\n\n/**\n * Element state storage\n */\ninterface InfiniteScrollState {\n\toptions: InfiniteScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tsentinel: HTMLDivElement | null\n\tobserver: IntersectionObserver | null\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tisLoading: boolean\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: InfiniteScrollBinding | undefined): InfiniteScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, distance: 0, throttle: 200, useIntersection: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-infinite-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-infinite-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-infinite-scroll=\"loadMore\" class=\"scroll-container\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n *\n * <div v-infinite-scroll=\"{ handler: loadMore, distance: 100, disabled: isLoading }\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n * </template>\n * ```\n */\nexport const vInfiniteScroll = defineDirective<InfiniteScrollBinding, HTMLElement>({\n\tname: 'infinite-scroll',\n\tssr: false,\n\tdefaults: {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer = getScrollParent(el)\n\t\t}\n\n\t\tconst state: InfiniteScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tsentinel: null,\n\t\t\tobserver: null,\n\t\t\tthrottleTimer: null,\n\t\t\tisLoading: false,\n\t\t\tscrollHandler: async (_e: Event) => {\n\t\t\t\tif (state.isLoading || state.options.disabled || state.options.loading) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Throttle\n\t\t\t\tif (state.throttleTimer) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t}, options.throttle)\n\n\t\t\t\t// Check scroll position\n\t\t\t\tconst shouldLoad = checkShouldLoad(container, el, options.distance || 0)\n\n\t\t\t\tif (shouldLoad) {\n\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__infiniteScroll = state\n\n\t\t// Use IntersectionObserver if available and enabled\n\t\tif (options.useIntersection && supportsIntersectionObserver()) {\n\t\t\tsetupIntersectionObserver(el, state)\n\t\t} else {\n\t\t\t// Use scroll event listener\n\t\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Remove sentinel\n\t\tif (state.sentinel && state.sentinel.parentNode) {\n\t\t\tstate.sentinel.parentNode.removeChild(state.sentinel)\n\t\t}\n\n\t\t// Remove scroll listener\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__infiniteScroll\n\t},\n})\n\n/**\n * Check if should load more\n */\nfunction checkShouldLoad(container: Element | Window, _el: HTMLElement, distance: number): boolean {\n\tif (container === window) {\n\t\tconst scrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tconst scrollHeight = document.documentElement.scrollHeight\n\t\tconst clientHeight = window.innerHeight\n\n\t\treturn scrollTop + clientHeight >= scrollHeight - distance\n\t}\n\n\tconst el = container as Element\n\tconst scrollTop = el.scrollTop\n\tconst scrollHeight = el.scrollHeight\n\tconst clientHeight = el.clientHeight\n\n\treturn scrollTop + clientHeight >= scrollHeight - distance\n}\n\n/**\n * Trigger load handler\n */\nasync function triggerLoad(state: InfiniteScrollState, el: HTMLElement): Promise<void> {\n\tstate.isLoading = true\n\tstate.options.onLoadStart?.()\n\n\tel.classList.add('v-infinite-scroll--loading')\n\n\ttry {\n\t\tawait state.options.handler()\n\t} catch (err) {\n\t\tstate.options.onError?.(err as Error)\n\t} finally {\n\t\tstate.isLoading = false\n\t\tstate.options.onLoadEnd?.()\n\t\tel.classList.remove('v-infinite-scroll--loading')\n\t}\n}\n\n/**\n * Setup IntersectionObserver\n */\nfunction setupIntersectionObserver(el: HTMLElement, state: InfiniteScrollState): void {\n\t// Create sentinel element\n\tconst sentinel = document.createElement('div')\n\n\tsentinel.className = 'v-infinite-scroll__sentinel'\n\tsentinel.style.cssText = `\n height: 1px;\n width: 100%;\n clear: both;\n `\n\n\tel.appendChild(sentinel)\n\tstate.sentinel = sentinel\n\n\t// Create observer\n\tstate.observer = new IntersectionObserver(\n\t\tasync entries => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tif (!state.isLoading && !state.options.disabled && !state.options.loading) {\n\t\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: state.container === window ? null : (state.container as Element),\n\t\t\trootMargin: `${state.options.distance || 0}px`,\n\t\t\tthreshold: 0,\n\t\t},\n\t)\n\n\tstate.observer.observe(sentinel)\n}\n\nexport default vInfiniteScroll\n","import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Intersect event handler\n */\nexport type IntersectHandler = (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\n/**\n * Intersect directive options\n */\nexport interface IntersectOptions {\n\t/** Callback when element intersects */\n\thandler?: IntersectHandler\n\t/** Callback when element enters viewport */\n\tonEnter?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element leaves viewport */\n\tonLeave?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element changes intersection */\n\tonChange?: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void\n\t/** Root element for intersection @default null (viewport) */\n\troot?: Element | null\n\t/** Margin around the root @default '0px' */\n\trootMargin?: string\n\t/** Threshold(s) at which to trigger callback @default 0 */\n\tthreshold?: number | number[]\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Whether to trigger only once @default false */\n\tonce?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type IntersectBinding = IntersectHandler | IntersectOptions\n\n/**\n * Element state storage\n */\ninterface IntersectState {\n\toptions: IntersectOptions\n\tobserver: IntersectionObserver | null\n\thasTriggeredOnce: boolean\n}\n\nconst STATE_KEY = '__intersect'\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: IntersectBinding | undefined): IntersectOptions {\n\tconst options: IntersectOptions = typeof binding === 'function' ? { handler: binding } : { ...binding }\n\n\t// Unref root if it's a ref object (for Vue Composition API)\n\tif (options.root !== null && typeof options.root === 'object' && 'value' in options.root) {\n\t\toptions.root = (options.root as { value: Element | null }).value\n\t}\n\n\treturn options\n}\n\n/**\n * Create observer callback\n */\nfunction createObserverCallback(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): (entries: IntersectionObserverEntry[]) => void {\n\treturn entries => {\n\t\tfor (const entry of entries) {\n\t\t\tif (options.once && state.hasTriggeredOnce) continue\n\n\t\t\tconst { isIntersecting } = entry\n\n\t\t\toptions.handler?.(entry, state.observer!)\n\t\t\toptions.onChange?.(isIntersecting, entry)\n\n\t\t\tif (isIntersecting) {\n\t\t\t\toptions.onEnter?.(entry, state.observer!)\n\t\t\t\tif (options.once) state.hasTriggeredOnce = true\n\t\t\t} else {\n\t\t\t\toptions.onLeave?.(entry, state.observer!)\n\t\t\t}\n\n\t\t\tel.dispatchEvent(new CustomEvent('intersect', { detail: { isIntersecting, entry } }))\n\t\t}\n\t}\n}\n\n/**\n * Create IntersectionObserver\n */\nfunction createObserver(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): IntersectionObserver {\n\treturn new IntersectionObserver(createObserverCallback(el, state, options), {\n\t\troot: options.root,\n\t\trootMargin: options.rootMargin,\n\t\tthreshold: options.threshold,\n\t})\n}\n\n/**\n * v-intersect directive\n *\n * @example\n * ```vue\n * <div v-intersect=\"handleIntersect\">Observe me</div>\n * <div v-intersect=\"{ onEnter: handleEnter, onLeave: handleLeave }\">Track visibility</div>\n * <div v-intersect=\"{ threshold: 0.5, once: true }\">Trigger once at 50%</div>\n * ```\n */\nexport const vIntersect = defineDirective<IntersectBinding, HTMLElement>({\n\tname: 'intersect',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tonce: false,\n\t\trootMargin: '0px',\n\t\tthreshold: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser() || !supportsIntersectionObserver()) {\n\t\t\tif (!supportsIntersectionObserver()) {\n\t\t\t\tconsole.warn('[Directix] v-intersect: IntersectionObserver not supported')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: IntersectState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\thasTriggeredOnce: false,\n\t\t}\n\n\t\tstate.observer = createObserver(el, state, options)\n\t\t;(el as any)[STATE_KEY] = state\n\t\tstate.observer.observe(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst observerOptionsChanged\n\t\t\t= newOptions.root !== state.options.root\n\t\t\t\t|| newOptions.rootMargin !== state.options.rootMargin\n\t\t\t\t|| newOptions.threshold !== state.options.threshold\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled !== state.options.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\tstate.observer?.disconnect()\n\t\t\t} else {\n\t\t\t\tstate.observer?.observe(el)\n\t\t\t}\n\t\t}\n\n\t\t// Recreate observer if options changed\n\t\tif (observerOptionsChanged) {\n\t\t\tstate.observer?.disconnect()\n\t\t\tstate.observer = createObserver(el, state, newOptions)\n\t\t\tstate.observer.observe(el)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.observer?.disconnect()\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vIntersect\n","import { defineDirective, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Lazy loading state\n */\nexport type LazyState = 'pending' | 'loading' | 'loaded' | 'error'\n\n/**\n * Lazy directive options\n */\nexport interface LazyOptions {\n\t/**\n\t * Image source URL\n\t */\n\tsrc?: string\n\n\t/**\n\t * Placeholder image URL\n\t */\n\tplaceholder?: string\n\n\t/**\n\t * Error image URL (shown when loading fails)\n\t */\n\terror?: string\n\n\t/**\n\t * Preload distance in pixels\n\t * @default 0\n\t */\n\tpreload?: number\n\n\t/**\n\t * Callback when image loads successfully\n\t */\n\tonLoad?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when image fails to load\n\t */\n\tonError?: (el: HTMLElement, error: Error) => void\n\n\t/**\n\t * Number of retry attempts\n\t * @default 1\n\t */\n\tattempt?: number\n\n\t/**\n\t * Filter function, return false to skip loading\n\t */\n\tfilter?: (src: string) => boolean\n\n\t/**\n\t * Custom IntersectionObserver\n\t */\n\tobserver?: IntersectionObserver\n\n\t/**\n\t * Whether to disable lazy loading\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LazyBinding = string | LazyOptions\n\n/**\n * Element state storage\n */\ninterface LazyElementState {\n\toptions: LazyOptions\n\tattempt: number\n\tobserver?: IntersectionObserver\n}\n\n// Global observer instance\nlet globalObserver: IntersectionObserver | null = null\n\n/**\n * Get or create global IntersectionObserver\n */\nfunction getGlobalObserver(preload: number): IntersectionObserver {\n\tif (globalObserver) return globalObserver\n\n\tglobalObserver = new IntersectionObserver(\n\t\tentries => {\n\t\t\tentries.forEach(entry => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tload(entry.target as HTMLElement)\n\t\t\t\t\tglobalObserver?.unobserve(entry.target)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\trootMargin: `${preload}px`,\n\t\t},\n\t)\n\n\treturn globalObserver\n}\n\n/**\n * Set image source on element\n */\nfunction setSrc(el: HTMLElement, src: string): void {\n\tif (el.tagName === 'IMG') {\n\t\t;(el as HTMLImageElement).src = src\n\t} else {\n\t\tel.style.backgroundImage = `url(\"${src}\")`\n\t}\n}\n\n/**\n * Set lazy state on element\n */\nfunction setLazyState(el: HTMLElement, state: LazyState): void {\n\tel.dataset.lazyState = state\n}\n\n/**\n * Get lazy state from element\n */\nfunction getLazyState(el: HTMLElement): LazyState {\n\treturn (el.dataset.lazyState as LazyState) || 'pending'\n}\n\n/**\n * Load image\n */\nfunction load(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state || !state.options.src) return\n\n\t// Filter check\n\tif (state.options.filter && !state.options.filter(state.options.src)) {\n\t\treturn\n\t}\n\n\tsetLazyState(el, 'loading')\n\tstate.attempt++\n\n\tel.classList.add('v-lazy--loading')\n\n\tconst img = new Image()\n\n\timg.onload = () => {\n\t\tsetSrc(el, state.options.src!)\n\t\tsetLazyState(el, 'loaded')\n\t\tel.classList.remove('v-lazy--loading')\n\t\tel.classList.add('v-lazy--loaded')\n\t\tstate.options.onLoad?.(el)\n\t}\n\n\timg.onerror = () => {\n\t\tel.classList.remove('v-lazy--loading')\n\n\t\t// Check if should retry\n\t\tif (state.attempt < (state.options.attempt || 1)) {\n\t\t\tsetTimeout(() => load(el), 1000 * state.attempt)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Show error image\n\t\tif (state.options.error) {\n\t\t\tsetSrc(el, state.options.error)\n\t\t}\n\n\t\tsetLazyState(el, 'error')\n\t\tel.classList.add('v-lazy--error')\n\t\tstate.options.onError?.(el, new Error('Failed to load image'))\n\t}\n\n\timg.src = state.options.src\n}\n\n/**\n * Observe element\n */\nfunction observe(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\t// Check IntersectionObserver support\n\tif (!supportsIntersectionObserver()) {\n\t\t// Fallback: load directly\n\t\tload(el)\n\n\t\treturn\n\t}\n\n\t// Use custom observer or global observer\n\tif (state.options.observer) {\n\t\tstate.observer = state.options.observer\n\t\tstate.observer.observe(el)\n\t} else {\n\t\tconst observer = getGlobalObserver(state.options.preload || 0)\n\n\t\tstate.observer = observer\n\t\tobserver.observe(el)\n\t}\n}\n\n/**\n * Unobserve element\n */\nfunction unobserve(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\tif (state.observer) {\n\t\tstate.observer.unobserve(el)\n\t} else if (globalObserver) {\n\t\tglobalObserver.unobserve(el)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LazyBinding | undefined): LazyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { src: binding }\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * v-lazy directive\n *\n * @example\n * ```vue\n * <template>\n * <img v-lazy=\"imageUrl\" />\n * <img v-lazy=\"{ src: imageUrl, placeholder: 'placeholder.jpg' }\" />\n * <div v-lazy=\"backgroundImageUrl\"></div>\n * </template>\n * ```\n */\nexport const vLazy = defineDirective<LazyBinding, HTMLElement>({\n\tname: 'lazy',\n\tssr: false,\n\tdefaults: {\n\t\tpreload: 0,\n\t\tattempt: 1,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tif (!options.src) {\n\t\t\tconsole.warn('[Directix] v-lazy: No source provided')\n\n\t\t\treturn\n\t\t}\n\n\t\t// Set initial state\n\t\tsetLazyState(el, 'pending')\n\n\t\t// Set placeholder\n\t\tif (options.placeholder) {\n\t\t\tsetSrc(el, options.placeholder)\n\t\t}\n\n\t\t// Add class\n\t\tel.classList.add('v-lazy')\n\n\t\t// Store state\n\t\tconst state: LazyElementState = {\n\t\t\toptions,\n\t\t\tattempt: 0,\n\t\t}\n\n\t\t;(el as any).__lazy = state\n\n\t\t// Start observing\n\t\tobserve(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LazyElementState = (el as any).__lazy\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\tunobserve(el)\n\n\t\t\treturn\n\t\t}\n\n\t\tif (newOptions.src !== state.options.src) {\n\t\t\tstate.options = newOptions\n\t\t\tstate.attempt = 0\n\n\t\t\t// If already loaded, reload\n\t\t\tif (getLazyState(el) !== 'pending') {\n\t\t\t\tsetLazyState(el, 'pending')\n\t\t\t\tel.classList.remove('v-lazy--loaded', 'v-lazy--error')\n\n\t\t\t\tif (newOptions.placeholder) {\n\t\t\t\t\tsetSrc(el, newOptions.placeholder)\n\t\t\t\t}\n\n\t\t\t\tobserve(el)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tunobserve(el)\n\t\tdelete (el as any).__lazy\n\t},\n})\n\nexport default vLazy\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Loading directive options\n */\nexport interface LoadingOptions {\n\t/**\n\t * Loading state\n\t * @default true\n\t */\n\tvalue?: boolean\n\n\t/**\n\t * Loading text to display\n\t */\n\ttext?: string\n\n\t/**\n\t * CSS class for loading overlay\n\t * @default 'v-loading'\n\t */\n\tloadingClass?: string\n\n\t/**\n\t * CSS class for loading spinner\n\t * @default 'v-loading__spinner'\n\t */\n\tspinnerClass?: string\n\n\t/**\n\t * CSS class for loading text\n\t * @default 'v-loading__text'\n\t */\n\ttextClass?: string\n\n\t/**\n\t * Custom spinner HTML\n\t */\n\tspinner?: string\n\n\t/**\n\t * Background color\n\t * @default 'rgba(255, 255, 255, 0.9)'\n\t */\n\tbackground?: string\n\n\t/**\n\t * Whether to lock scroll while loading\n\t * @default false\n\t */\n\tlock?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LoadingBinding = boolean | LoadingOptions\n\n/**\n * Element state storage\n */\ninterface LoadingState {\n\toptions: LoadingOptions\n\tloadingOverlay: HTMLDivElement | null\n\toriginalPosition: string\n\toriginalOverflow: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LoadingBinding | undefined): LoadingOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { value: binding }\n\t}\n\n\treturn {\n\t\tvalue: true,\n\t\tloadingClass: 'v-loading',\n\t\tspinnerClass: 'v-loading__spinner',\n\t\ttextClass: 'v-loading__text',\n\t\tbackground: 'rgba(255, 255, 255, 0.9)',\n\t\tlock: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Default spinner HTML\n */\nconst DEFAULT_SPINNER = `\n<svg class=\"v-loading__circular\" viewBox=\"25 25 50 50\">\n <circle class=\"v-loading__path\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"2\" stroke-miterlimit=\"10\"/>\n</svg>\n`\n\n/**\n * Create loading overlay element\n */\nfunction createLoadingOverlay(options: LoadingOptions): HTMLDivElement {\n\tconst overlay = document.createElement('div')\n\n\toverlay.className = options.loadingClass || 'v-loading'\n\toverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1000;\n background: ${options.background || 'rgba(255, 255, 255, 0.9)'};\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `\n\n\t// Add spinner\n\tconst spinnerHtml = options.spinner || DEFAULT_SPINNER\n\tconst spinnerContainer = document.createElement('div')\n\n\tspinnerContainer.className = options.spinnerClass || 'v-loading__spinner'\n\tspinnerContainer.innerHTML = spinnerHtml\n\toverlay.appendChild(spinnerContainer)\n\n\t// Add text\n\tif (options.text) {\n\t\tconst textEl = document.createElement('div')\n\n\t\ttextEl.className = options.textClass || 'v-loading__text'\n\t\ttextEl.textContent = options.text\n\t\toverlay.appendChild(textEl)\n\t}\n\n\treturn overlay\n}\n\n/**\n * v-loading directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-loading=\"isLoading\">Content</div>\n * <div v-loading=\"{ value: isLoading, text: 'Loading...' }\">Content</div>\n * <div v-loading=\"{ value: isLoading, lock: true }\">Locked scroll while loading</div>\n * </template>\n * ```\n */\nexport const vLoading = defineDirective<LoadingBinding, HTMLElement>({\n\tname: 'loading',\n\tssr: true, // SSR safe - will skip DOM manipulation on server\n\tdefaults: {\n\t\tvalue: true,\n\t\tloadingClass: 'v-loading',\n\t\tspinnerClass: 'v-loading__spinner',\n\t\ttextClass: 'v-loading__text',\n\t\tbackground: 'rgba(255, 255, 255, 0.9)',\n\t\tlock: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Ensure element has relative positioning\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tconst originalPosition = el.style.position\n\t\tconst originalOverflow = el.style.overflow\n\n\t\tconst state: LoadingState = {\n\t\t\toptions,\n\t\t\tloadingOverlay: null,\n\t\t\toriginalPosition,\n\t\t\toriginalOverflow,\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__loading = state\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\t// Show loading if value is true\n\t\tif (options.value) {\n\t\t\tshowLoading(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\thideLoading(el, state)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle loading state change\n\t\tif (newOptions.value && !state.options.value) {\n\t\t\tshowLoading(el, state)\n\t\t} else if (!newOptions.value && state.options.value) {\n\t\t\thideLoading(el, state)\n\t\t}\n\n\t\t// Update text if changed\n\t\tif (state.loadingOverlay && newOptions.text !== state.options.text) {\n\t\t\tconst textEl = state.loadingOverlay.querySelector(`.${state.options.textClass}`)\n\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = newOptions.text || ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\thideLoading(el, state)\n\n\t\t// Restore original styles\n\t\tel.style.position = state.originalPosition\n\t\tel.style.overflow = state.originalOverflow\n\n\t\tdelete (el as any).__loading\n\t},\n})\n\n/**\n * Show loading overlay\n */\nfunction showLoading(el: HTMLElement, state: LoadingState): void {\n\tif (state.loadingOverlay) return\n\n\t// Create and append overlay\n\tstate.loadingOverlay = createLoadingOverlay(state.options)\n\tel.appendChild(state.loadingOverlay)\n\n\t// Lock scroll if needed\n\tif (state.options.lock) {\n\t\tel.style.overflow = 'hidden'\n\t}\n\n\t// Add class\n\tel.classList.add('v-loading--active')\n}\n\n/**\n * Hide loading overlay\n */\nfunction hideLoading(el: HTMLElement, state: LoadingState): void {\n\tif (!state.loadingOverlay) return\n\n\t// Remove overlay\n\tstate.loadingOverlay.remove()\n\tstate.loadingOverlay = null\n\n\t// Restore scroll\n\tif (state.options.lock) {\n\t\tel.style.overflow = state.originalOverflow\n\t}\n\n\t// Remove class\n\tel.classList.remove('v-loading--active')\n}\n\nexport default vLoading\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getEventPosition, off, on } from '@directix/shared'\n\n/**\n * Long press handler\n */\nexport type LongPressHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Long press directive options\n */\nexport interface LongPressOptions {\n\t/**\n\t * Callback when long press is triggered\n\t * @required\n\t */\n\thandler: LongPressHandler\n\n\t/**\n\t * Duration in milliseconds to trigger long press\n\t * @default 500\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Maximum movement distance before canceling\n\t * @default 10\n\t */\n\tdistance?: number\n\n\t/**\n\t * Callback when long press starts (on mousedown/touchstart)\n\t */\n\tonStart?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback when long press is canceled\n\t */\n\tonCancel?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback on each tick during long press\n\t */\n\tonTick?: (remaining: number) => void\n\n\t/**\n\t * Interval for onTick callback in milliseconds\n\t * @default 100\n\t */\n\ttickInterval?: number\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tprevent?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LongPressBinding = LongPressHandler | LongPressOptions\n\n/**\n * Element state storage\n */\ninterface LongPressState {\n\toptions: LongPressOptions\n\ttimerId: ReturnType<typeof setTimeout> | null\n\ttickTimerId: ReturnType<typeof setInterval> | null\n\tstartTime: number\n\tstartPos: { x: number, y: number }\n\tstartHandler: (e: Event) => void\n\tendHandler: (e: Event) => void\n\tmoveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LongPressBinding | undefined): LongPressOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, duration: 500, distance: 10 }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-long-press: handler is required')\n\t}\n\n\treturn {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t\t...binding,\n\t}\n}\n\n/**\n * Calculate distance between two points\n */\nfunction getDistance(p1: { x: number, y: number }, p2: { x: number, y: number }): number {\n\treturn Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2)\n}\n\n/**\n * v-long-press directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-long-press=\"handleLongPress\">Long Press Me</button>\n * <button v-long-press=\"{ handler: handleLongPress, duration: 1000 }\">1 Second Press</button>\n * </template>\n * ```\n */\nexport const vLongPress = defineDirective<LongPressBinding, HTMLElement>({\n\tname: 'long-press',\n\tssr: false,\n\tdefaults: {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: LongPressState = {\n\t\t\toptions,\n\t\t\ttimerId: null,\n\t\t\ttickTimerId: null,\n\t\t\tstartTime: 0,\n\t\t\tstartPos: { x: 0, y: 0 },\n\t\t\tstartHandler: () => {},\n\t\t\tendHandler: () => {},\n\t\t\tmoveHandler: () => {},\n\t\t}\n\n\t\t// Start handler\n\t\tstate.startHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\t// Prevent context menu on long press\n\t\t\tif (options.prevent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\n\t\t\tif (options.stop) {\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\n\t\t\t// Clear any existing timer\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Store start position\n\t\t\tconst pos = getEventPosition(event)\n\n\t\t\tstate.startPos = { x: pos.x, y: pos.y }\n\t\t\tstate.startTime = Date.now()\n\n\t\t\t// Trigger start callback\n\t\t\toptions.onStart?.(event)\n\n\t\t\t// Start tick timer\n\t\t\tif (options.onTick) {\n\t\t\t\tlet remaining = options.duration!\n\n\t\t\t\tstate.tickTimerId = setInterval(() => {\n\t\t\t\t\tremaining -= options.tickInterval!\n\t\t\t\t\toptions.onTick?.(Math.max(0, remaining))\n\t\t\t\t}, options.tickInterval)\n\t\t\t}\n\n\t\t\t// Start long press timer\n\t\t\tstate.timerId = setTimeout(() => {\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\t\t\t\toptions.handler(event)\n\t\t\t}, options.duration)\n\t\t}\n\n\t\t// End handler\n\t\tstate.endHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Trigger cancel callback if was in progress\n\t\t\tif (state.startTime > 0) {\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t}\n\n\t\t\tstate.startTime = 0\n\t\t}\n\n\t\t// Move handler - cancel if moved too far\n\t\tstate.moveHandler = (e: Event) => {\n\t\t\tif (!state.timerId) return\n\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\t\t\tconst pos = getEventPosition(event)\n\t\t\tconst distance = getDistance(state.startPos, { x: pos.x, y: pos.y })\n\n\t\t\tif (distance > (options.distance || 10)) {\n\t\t\t\tif (state.timerId) {\n\t\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\t\tstate.timerId = null\n\t\t\t\t}\n\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t\tstate.startTime = 0\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__longPress = state\n\n\t\t// Bind events - mouse\n\t\ton(el, 'mousedown', state.startHandler)\n\t\ton(el, 'mouseup', state.endHandler)\n\t\ton(el, 'mouseleave', state.endHandler)\n\t\ton(el, 'mousemove', state.moveHandler)\n\n\t\t// Bind events - touch\n\t\ton(el, 'touchstart', state.startHandler, { passive: !options.prevent })\n\t\ton(el, 'touchend', state.endHandler)\n\t\ton(el, 'touchcancel', state.endHandler)\n\t\ton(el, 'touchmove', state.moveHandler, { passive: true })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) {\n\t\t\t// Re-initialize if not exists\n\t\t\tconst options = normalizeOptions(binding.value)\n\n\t\t\tif (!options.disabled) {\n\t\t\t\t// Re-mount by clearing and re-setting\n\t\t\t\t;(el as any).__longPress = null\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.timerId) {\n\t\t\tclearTimeout(state.timerId)\n\t\t}\n\n\t\tif (state.tickTimerId) {\n\t\t\tclearInterval(state.tickTimerId)\n\t\t}\n\n\t\t// Unbind events - mouse\n\t\toff(el, 'mousedown', state.startHandler)\n\t\toff(el, 'mouseup', state.endHandler)\n\t\toff(el, 'mouseleave', state.endHandler)\n\t\toff(el, 'mousemove', state.moveHandler)\n\n\t\t// Unbind events - touch\n\t\toff(el, 'touchstart', state.startHandler)\n\t\toff(el, 'touchend', state.endHandler)\n\t\toff(el, 'touchcancel', state.endHandler)\n\t\toff(el, 'touchmove', state.moveHandler)\n\n\t\tdelete (el as any).__longPress\n\t},\n})\n\nexport default vLongPress\n","import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Lowercase directive options\n */\nexport interface LowercaseOptions {\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean\n\n\t/**\n\t * Transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LowercaseBinding = boolean | LowercaseOptions\n\n/**\n * Transform text to lowercase\n */\nfunction transformText(text: string, options: LowercaseOptions): string {\n\tif (!text) return text\n\n\tif (options.first) {\n\t\treturn text.charAt(0).toLowerCase() + text.slice(1)\n\t}\n\n\treturn text.toLowerCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LowercaseBinding | undefined): LowercaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { first: false, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { first: false, onInput: false }\n\t}\n\n\treturn {\n\t\tfirst: binding.first ?? false,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-lowercase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Transform all characters to lowercase -->\n * <input v-lowercase v-model=\"text\" />\n *\n * <!-- Transform only first character -->\n * <span v-lowercase=\"{ first: true }\">{{ text }}</span>\n * </template>\n * ```\n */\nexport const vLowercase = defineDirective<LowercaseBinding, HTMLElement>({\n\tname: 'lowercase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => transformText(text, options))\n\n\t\t\t;(el as any).__lowercaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = transformText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__lowercaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__lowercaseCleanup\n\t},\n})\n\nexport default vLowercase\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\nconst STATE_KEY = '__mask' as const\n\n/**\n * Mask directive options\n */\nexport interface MaskOptions {\n\t/** Mask pattern: # digit, A letter, N alphanumeric, X any, others as literals */\n\tmask: string\n\t/** Placeholder character @default '_' */\n\tplaceholder?: string\n\t/** Show mask placeholder on focus @default true */\n\tshowPlaceholder?: boolean\n\t/** Show mask on blur @default false */\n\tshowMaskOnBlur?: boolean\n\t/** Clear incomplete on blur @default false */\n\tclearIncomplete?: boolean\n\t/** Disable @default false */\n\tdisabled?: boolean\n\t/** Callback when value changes */\n\tonChange?: (value: string, rawValue: string) => void\n\t/** Callback when mask is complete */\n\tonComplete?: (value: string) => void\n}\n\nexport type MaskBinding = string | MaskOptions\n\ninterface MaskToken {\n\tpattern: RegExp\n\tplaceholder: string\n\tisLiteral: boolean\n}\n\ninterface MaskState {\n\toptions: MaskOptions\n\ttokens: MaskToken[]\n\tplaceholder: string\n\tinputHandler: (e: Event) => void\n\tfocusHandler: () => void\n\tblurHandler: () => void\n}\n\nconst TOKEN_PATTERNS: Record<string, RegExp> = {\n\t'#': /\\d/,\n\tA: /[A-Za-z]/,\n\tN: /[A-Za-z0-9]/,\n\tX: /./,\n}\n\nfunction parseMask(mask: string, placeholder: string): MaskToken[] {\n\treturn [...mask].map(char => {\n\t\tconst pattern = TOKEN_PATTERNS[char]\n\n\t\treturn pattern ? { pattern, placeholder, isLiteral: false } : { pattern: new RegExp(`\\\\${char}`), placeholder: char, isLiteral: true }\n\t})\n}\n\nfunction normalizeOptions(binding: MaskBinding | undefined): MaskOptions {\n\tif (typeof binding === 'string') return { mask: binding, placeholder: '_', showPlaceholder: true }\n\tif (!binding?.mask) throw new Error('[Directix] v-mask: mask is required')\n\n\treturn { placeholder: '_', showPlaceholder: true, showMaskOnBlur: false, clearIncomplete: false, disabled: false, ...binding }\n}\n\nfunction isInput(el: HTMLElement): el is HTMLInputElement | HTMLTextAreaElement {\n\treturn el.tagName === 'INPUT' || el.tagName === 'TEXTAREA'\n}\n\n/**\n * Format value with mask\n */\nfunction formatValue(value: string, tokens: MaskToken[], placeholder: string, showPlaceholder: boolean): string {\n\tlet result = '',\n\t\tvalueIndex = 0\n\n\tfor (const token of tokens) {\n\t\tif (valueIndex >= value.length) {\n\t\t\tresult += token.isLiteral ? token.placeholder : (showPlaceholder ? placeholder : '')\n\t\t\tcontinue\n\t\t}\n\n\t\tconst inputChar = value[valueIndex]\n\n\t\tif (token.isLiteral) {\n\t\t\tif (inputChar === token.placeholder) valueIndex++\n\t\t\tresult += token.placeholder\n\t\t} else if (token.pattern.test(inputChar)) {\n\t\t\tresult += inputChar\n\t\t\tvalueIndex++\n\t\t} else if (inputChar === placeholder) {\n\t\t\tresult += showPlaceholder ? placeholder : ''\n\t\t\tvalueIndex++\n\t\t} else {\n\t\t\tvalueIndex++\n\t\t\t// Re-check this token with next input char - need to decrement in loop\n\t\t}\n\t}\n\n\treturn result\n}\n\n/**\n * Get raw value (without mask literals)\n */\nfunction getRawValue(value: string, tokens: MaskToken[], placeholder: string): string {\n\tlet raw = ''\n\n\tfor (let i = 0; i < value.length && i < tokens.length; i++) {\n\t\tif (!tokens[i].isLiteral && value[i] !== placeholder) {\n\t\t\traw += value[i]\n\t\t}\n\t}\n\n\treturn raw\n}\n\n/**\n * Check if mask is complete\n */\nfunction isComplete(value: string, tokens: MaskToken[], placeholder: string): boolean {\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tif (!tokens[i].isLiteral && (i >= value.length || value[i] === placeholder)) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n/**\n * Calculate cursor position, skipping literals\n */\nfunction getCursorPos(tokens: MaskToken[], rawCursorPos: number): number {\n\tlet pos = rawCursorPos\n\n\twhile (pos < tokens.length && tokens[pos].isLiteral) {\n\t\tpos++\n\t}\n\n\treturn Math.min(pos, tokens.length)\n}\n\n/**\n * v-mask directive\n *\n * @example\n * ```vue\n * <input v-mask=\"'###-##-####'\" placeholder=\"SSN\" />\n * <input v-mask=\"'(###) ###-####'\" placeholder=\"Phone\" />\n * <input v-mask=\"{ mask: '##/##/####' }\" placeholder=\"Date\" />\n * ```\n */\nexport const vMask = defineDirective<MaskBinding, HTMLInputElement>({\n\tname: 'mask',\n\tssr: false,\n\tdefaults: { placeholder: '_', showPlaceholder: true, showMaskOnBlur: false, clearIncomplete: false, disabled: false },\n\n\tmounted(el, binding) {\n\t\tif (!isInput(el)) {\n\t\t\tconsole.warn('[Directix] v-mask: directive must be used on input or textarea elements')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst placeholder = options.placeholder || '_'\n\t\tconst tokens = parseMask(options.mask, placeholder)\n\n\t\tconst inputHandler = (e: Event): void => {\n\t\t\tconst target = e.target as HTMLInputElement\n\t\t\tconst rawValue = target.value\n\t\t\tconst cursorPos = target.selectionStart || 0\n\n\t\t\tconst formatted = formatValue(rawValue, tokens, placeholder, options.showPlaceholder ?? true)\n\n\t\t\tif (formatted !== rawValue) {\n\t\t\t\ttarget.value = formatted\n\t\t\t\ttarget.setSelectionRange(getCursorPos(tokens, cursorPos), getCursorPos(tokens, cursorPos))\n\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\toptions.onChange?.(formatted, getRawValue(formatted, tokens, placeholder))\n\t\t\tif (isComplete(formatted, tokens, placeholder)) {\n\t\t\t\toptions.onComplete?.(formatted)\n\t\t\t}\n\t\t}\n\n\t\tconst focusHandler = (): void => {\n\t\t\tif (!el.value && options.showPlaceholder) {\n\t\t\t\tel.value = formatValue('', tokens, placeholder, true)\n\t\t\t}\n\t\t}\n\n\t\tconst blurHandler = (): void => {\n\t\t\tif (!options.showMaskOnBlur && !isComplete(el.value, tokens, placeholder) && options.clearIncomplete) {\n\t\t\t\tel.value = ''\n\t\t\t}\n\t\t}\n\n\t\ton(el, 'input', inputHandler)\n\t\ton(el, 'focus', focusHandler)\n\t\ton(el, 'blur', blurHandler)\n\n\t\t;(el as any)[STATE_KEY] = { options, tokens, placeholder, inputHandler, focusHandler, blurHandler }\n\n\t\tif (el.value) {\n\t\t\tel.value = formatValue(el.value, tokens, placeholder, options.showPlaceholder ?? true)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tstate.tokens = parseMask(state.options.mask, state.placeholder)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\toff(el, 'input', state.inputHandler)\n\t\toff(el, 'focus', state.focusHandler)\n\t\toff(el, 'blur', state.blurHandler)\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vMask\n","/**\n * Shared utilities for number and money formatting directives\n */\n\n/**\n * Base options shared by number and money formatting\n */\nexport interface NumberFormatOptions {\n\t/** Number of decimal places */\n\tprecision?: number\n\t/** Thousands separator */\n\tseparator?: string\n\t/** Decimal separator */\n\tdecimal?: string\n\t/** Whether to allow negative numbers @default true */\n\tallowNegative?: boolean\n\t/** Minimum value */\n\tmin?: number\n\t/** Maximum value */\n\tmax?: number\n}\n\n/**\n * Format number to string with thousands separator\n */\nexport function formatNumber(value: number, options: NumberFormatOptions): string {\n\tconst { precision = 0, separator = ',', decimal = '.', prefix = '', suffix = '' } = options as any\n\n\tconst fixed = value.toFixed(precision)\n\tconst [intPart, decPart] = fixed.split('.')\n\n\t// Add thousands separator to integer part\n\tconst formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n\n\tlet result = formattedInt\n\n\tif (precision > 0 && decPart) {\n\t\tresult += decimal + decPart\n\t}\n\n\treturn prefix + result + suffix\n}\n\n/**\n * Parse string to number, removing non-numeric characters\n */\nexport function parseToNumber(value: string, decimal: string): number | null {\n\tconst cleaned = value.replace(/[^\\d.-]/g, '').replace(decimal, '.')\n\tconst num = Number.parseFloat(cleaned)\n\n\treturn isNaN(num) ? null : num\n}\n\n/**\n * Clamp value within min/max bounds\n */\nexport function clampValue(value: number, options: NumberFormatOptions): number {\n\tlet result = value\n\n\t// allowNegative defaults to true if not specified\n\tconst allowNegative = options.allowNegative ?? true\n\n\tif (!allowNegative && result < 0) {\n\t\tresult = Math.abs(result)\n\t}\n\tif (options.min !== undefined) result = Math.max(options.min, result)\n\tif (options.max !== undefined) result = Math.min(options.max, result)\n\n\treturn result\n}\n\n/**\n * Calculate cursor position after formatting\n * Preserves cursor position relative to digit count\n */\nexport function calculateCursorPosition(\n\trawValue: string,\n\tformatted: string,\n\tcursorPos: number,\n\tstartOffset: number = 0,\n): number {\n\t// Count digits before cursor in old value\n\tlet digitsBeforeCursor = 0,\n\t\t// Find position after same number of digits in new value\n\t\tdigitCount = 0\n\n\tfor (let i = 0; i < cursorPos && i < rawValue.length; i++) {\n\t\tif (/\\d/.test(rawValue[i])) {\n\t\t\tdigitsBeforeCursor++\n\t\t}\n\t}\n\n\tfor (let i = startOffset; i < formatted.length; i++) {\n\t\tif (/\\d/.test(formatted[i])) {\n\t\t\tdigitCount++\n\t\t}\n\t\tif (digitCount >= digitsBeforeCursor) {\n\t\t\treturn i + 1\n\t\t}\n\t}\n\n\t// Default to end of formatted string\n\treturn formatted.length\n}\n\n/**\n * Setup input element with live formatting\n */\nexport function setupNumberInput(\n\tel: HTMLInputElement | HTMLTextAreaElement,\n\toptions: NumberFormatOptions & { prefix?: string, suffix?: string },\n\tformatFn: (value: number, options: any) => string,\n): () => void {\n\tconst { decimal = '.', prefix = '' } = options\n\tlet isFormatting = false\n\n\tconst onInput = (): void => {\n\t\tif (isFormatting) return\n\n\t\tconst rawValue = el.value\n\t\tconst cursorPos = el.selectionStart || 0\n\n\t\t// Handle empty or just minus\n\t\tif (!rawValue || rawValue === '-') {\n\t\t\treturn\n\t\t}\n\n\t\t// Parse the number\n\t\tconst num = parseToNumber(rawValue, decimal)\n\n\t\tif (num === null) {\n\t\t\tisFormatting = true\n\t\t\tel.value = ''\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\n\t\t\treturn\n\t\t}\n\n\t\t// Format the number\n\t\tconst clamped = clampValue(num, options)\n\t\tconst formatted = formatFn(clamped, options)\n\n\t\tif (formatted !== rawValue) {\n\t\t\tisFormatting = true\n\n\t\t\t// Calculate new cursor position (start after prefix)\n\t\t\tconst startOffset = prefix.length\n\t\t\tconst newCursorPos = calculateCursorPosition(rawValue, formatted, cursorPos, startOffset)\n\n\t\t\tel.value = formatted\n\t\t\tel.setSelectionRange(newCursorPos, newCursorPos)\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\tconst onBlur = (): void => {\n\t\tif (!el.value || el.value === '-') return\n\n\t\tconst num = parseToNumber(el.value, decimal)\n\n\t\tif (num !== null) {\n\t\t\tconst clamped = clampValue(num, options)\n\t\t\tconst formatted = formatFn(clamped, options)\n\n\t\t\tisFormatting = true\n\t\t\tel.value = formatted\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\tel.addEventListener('input', onInput)\n\tel.addEventListener('blur', onBlur)\n\n\t// Initial format\n\tif (el.value) {\n\t\tconst num = parseToNumber(el.value, decimal)\n\n\t\tif (num !== null) {\n\t\t\tconst formatted = formatFn(clampValue(num, options), options)\n\n\t\t\tisFormatting = true\n\t\t\tel.value = formatted\n\t\t\t// Trigger input to sync with v-model\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\tisFormatting = false\n\t\t}\n\t}\n\n\treturn () => {\n\t\tel.removeEventListener('input', onInput)\n\t\tel.removeEventListener('blur', onBlur)\n\t}\n}\n","import { defineDirective } from '@directix/core'\nimport { clampValue, type NumberFormatOptions, parseToNumber, setupNumberInput } from '../utils/number'\n\n/**\n * Money directive options\n */\nexport interface MoneyOptions extends NumberFormatOptions {\n\t/** Currency symbol @default '$' */\n\tsymbol?: string\n\t/** Symbol position @default 'before' */\n\tsymbolPosition?: 'before' | 'after'\n}\n\nexport type MoneyBinding = string | MoneyOptions\n\ninterface MoneyState {\n\toptions: MoneyOptions\n\tcleanup: () => void\n}\n\n/**\n * Format number to money string\n */\nfunction formatMoney(value: number, options: MoneyOptions): string {\n\tconst { precision = 2, separator = ',', decimal = '.', symbol = '$', symbolPosition = 'before' } = options\n\n\tconst fixed = value.toFixed(precision)\n\tconst [intPart, decPart] = fixed.split('.')\n\n\t// Add thousands separator\n\tconst formattedInt = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, separator)\n\n\tlet result = formattedInt\n\n\tif (precision > 0 && decPart) {\n\t\tresult += decimal + decPart\n\t}\n\n\treturn symbolPosition === 'before' ? symbol + result : result + symbol\n}\n\nexport const vMoney = defineDirective<MoneyBinding, HTMLElement>({\n\tname: 'money',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options: MoneyOptions = typeof binding.value === 'string' ? { symbol: binding.value } : (binding.value ?? {})\n\n\t\t// Set defaults for money\n\t\toptions.precision = options.precision ?? 2\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\tconst { symbol = '$', symbolPosition = 'before' } = options\n\t\t\t// For money, prefix is the symbol when positioned before\n\t\t\tconst prefix = symbolPosition === 'before' ? symbol : ''\n\t\t\tconst cleanup = setupNumberInput(el as HTMLInputElement, { ...options, prefix }, formatMoney)\n\n\t\t\t;(el as any).__money = { options, cleanup }\n\n\t\t\t// Format initial value after DOM is ready\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst inputEl = el as HTMLInputElement\n\n\t\t\t\tif (inputEl.value) {\n\t\t\t\t\tconst num = parseToNumber(inputEl.value, options.decimal || '.')\n\n\t\t\t\t\tif (num !== null) {\n\t\t\t\t\t\tconst formatted = formatMoney(clampValue(num, options), options)\n\n\t\t\t\t\t\tif (formatted !== inputEl.value) {\n\t\t\t\t\t\t\tinputEl.value = formatted\n\t\t\t\t\t\t\tinputEl.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\t// For non-input elements, format the text content\n\t\t\tlet value: number | null = null\n\n\t\t\tif (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t} else {\n\t\t\t\t// Try to parse from element's text content\n\t\t\t\tconst textContent = el.textContent?.trim()\n\n\t\t\t\tif (textContent) {\n\t\t\t\t\tvalue = parseToNumber(textContent, options.decimal || '.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatMoney(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options: MoneyOptions = typeof binding.value === 'string' ? { symbol: binding.value } : (binding.value ?? {})\n\n\t\t// Set defaults for money\n\t\toptions.precision = options.precision ?? 2\n\n\t\tconst state: MoneyState | undefined = (el as any).__money\n\n\t\tif (state) {\n\t\t\tstate.options = options\n\t\t} else if (!(el.tagName === 'INPUT' || el.tagName === 'TEXTAREA')) {\n\t\t\t// Only format non-input elements on update\n\t\t\tlet value: number | null = null\n\n\t\t\tif (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatMoney(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MoneyState | undefined = (el as any).__money\n\n\t\tstate?.cleanup()\n\t\tdelete (el as any).__money\n\t},\n})\n\nexport default vMoney\n","import { defineDirective, isBrowser, supportsMutationObserver } from '@directix/core'\n\n/**\n * Mutation change handler\n */\nexport type MutationHandler = (mutations: MutationRecord[], observer: MutationObserver) => void\n\n/**\n * Mutation directive options\n */\nexport interface MutationOptions {\n\t/**\n\t * Callback when mutations occur\n\t * @required\n\t */\n\thandler: MutationHandler\n\n\t/**\n\t * Whether to observe attribute changes\n\t * @default false\n\t */\n\tattributes?: boolean\n\n\t/**\n\t * Specific attributes to observe\n\t */\n\tattributeFilter?: string[]\n\n\t/**\n\t * Whether to observe child node additions/removals\n\t * @default true\n\t */\n\tchildList?: boolean\n\n\t/**\n\t * Whether to observe all descendants, not just direct children\n\t * @default false\n\t */\n\tsubtree?: boolean\n\n\t/**\n\t * Whether to observe character data changes\n\t * @default false\n\t */\n\tcharacterData?: boolean\n\n\t/**\n\t * Whether to record old attribute values\n\t * @default false\n\t */\n\tattributeOldValue?: boolean\n\n\t/**\n\t * Whether to record old character data\n\t * @default false\n\t */\n\tcharacterDataOldValue?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type MutationBinding = MutationHandler | MutationOptions\n\n/**\n * Element state storage\n */\ninterface MutationState {\n\toptions: MutationOptions\n\tobserver: MutationObserver | null\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: MutationBinding | undefined): MutationOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, childList: true }\n\t}\n\n\tif (!binding || !binding.handler) {\n\t\tthrow new Error('[Directix] v-mutation: handler is required')\n\t}\n\n\treturn {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-mutation directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-mutation=\"handleMutation\">Observe my changes</div>\n * <div v-mutation=\"{ handler: handleMutation, attributes: true, subtree: true }\">\n * Observe attributes and subtree\n * </div>\n * </template>\n *\n * <script setup>\n * function handleMutation(mutations: MutationRecord[], observer: MutationObserver) {\n * mutations.forEach(mutation => {\n * console.log('Type:', mutation.type)\n * console.log('Target:', mutation.target)\n * })\n * }\n * </script>\n * ```\n */\nexport const vMutation = defineDirective<MutationBinding, HTMLElement>({\n\tname: 'mutation',\n\tssr: false,\n\tdefaults: {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Check MutationObserver support\n\t\tif (!supportsMutationObserver()) {\n\t\t\tconsole.warn('[Directix] v-mutation: MutationObserver not supported')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: MutationState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t}\n\n\t\t// Create observer\n\t\tstate.observer = new MutationObserver((mutations, observer) => {\n\t\t\toptions.handler(mutations, observer)\n\t\t})\n\n\t\t// Start observing\n\t\tstate.observer.observe(el, {\n\t\t\tattributes: options.attributes,\n\t\t\tattributeFilter: options.attributeFilter,\n\t\t\tchildList: options.childList,\n\t\t\tsubtree: options.subtree,\n\t\t\tcharacterData: options.characterData,\n\t\t\tattributeOldValue: options.attributeOldValue,\n\t\t\tcharacterDataOldValue: options.characterDataOldValue,\n\t\t})\n\n\t\t// Store state\n\t\t;(el as any).__mutation = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disconnect if was enabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.disconnect()\n\t\t\t}\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Re-observe if was disabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t})\n\t\t\t}\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// If options changed, reconnect with new options\n\t\t\tif (\n\t\t\t\tnewOptions.attributes !== state.options.attributes\n\t\t\t\t|| newOptions.childList !== state.options.childList\n\t\t\t\t|| newOptions.subtree !== state.options.subtree\n\t\t\t\t|| newOptions.characterData !== state.options.characterData\n\t\t\t) {\n\t\t\t\tif (state.observer) {\n\t\t\t\t\tstate.observer.disconnect()\n\t\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__mutation\n\t},\n})\n\nexport default vMutation\n","import { defineDirective } from '@directix/core'\nimport { clampValue, formatNumber, type NumberFormatOptions, parseToNumber, setupNumberInput } from '../utils/number'\n\n/**\n * Number directive options\n */\nexport interface NumberOptions extends NumberFormatOptions {\n\t/** Prefix string (e.g., '$') */\n\tprefix?: string\n\t/** Suffix string (e.g., '%') */\n\tsuffix?: string\n}\n\nexport type NumberBinding = number | NumberOptions\n\ninterface NumberState {\n\toptions: NumberOptions\n\tcleanup: () => void\n}\n\nexport const vNumber = defineDirective<NumberBinding, HTMLElement>({\n\tname: 'number',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options: NumberOptions = typeof binding.value === 'number' ? { precision: binding.value } : (binding.value ?? {})\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\tconst cleanup = setupNumberInput(el as HTMLInputElement, options, formatNumber)\n\n\t\t\t;(el as any).__number = { options, cleanup }\n\n\t\t\t// Format initial value after DOM is ready\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst inputEl = el as HTMLInputElement\n\n\t\t\t\tif (inputEl.value) {\n\t\t\t\t\tconst num = parseToNumber(inputEl.value, options.decimal || '.')\n\n\t\t\t\t\tif (num !== null) {\n\t\t\t\t\t\tconst formatted = formatNumber(clampValue(num, options), options)\n\n\t\t\t\t\t\tif (formatted !== inputEl.value) {\n\t\t\t\t\t\t\tinputEl.value = formatted\n\t\t\t\t\t\t\tinputEl.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\t// For non-input elements, format the text content\n\t\t\tlet value: number | null = null\n\n\t\t\tif (typeof binding.value === 'number') {\n\t\t\t\tvalue = binding.value\n\t\t\t} else if (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t} else {\n\t\t\t\t// Try to parse from element's text content\n\t\t\t\tconst textContent = el.textContent?.trim()\n\n\t\t\t\tif (textContent) {\n\t\t\t\t\tvalue = parseToNumber(textContent, options.decimal || '.')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatNumber(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options: NumberOptions = typeof binding.value === 'number' ? { precision: binding.value } : (binding.value ?? {})\n\n\t\tconst state: NumberState | undefined = (el as any).__number\n\n\t\tif (state) {\n\t\t\tstate.options = options\n\t\t} else if (!(el.tagName === 'INPUT' || el.tagName === 'TEXTAREA')) {\n\t\t\t// Only format non-input elements on update\n\t\t\tlet value: number | null = null\n\n\t\t\tif (typeof binding.value === 'number') {\n\t\t\t\tvalue = binding.value\n\t\t\t} else if (binding.value && typeof binding.value === 'object' && 'value' in binding.value) {\n\t\t\t\tvalue = (binding.value as any).value\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\tel.textContent = formatNumber(clampValue(value, options), options)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: NumberState | undefined = (el as any).__number\n\n\t\tstate?.cleanup()\n\t\tdelete (el as any).__number\n\t},\n})\n\nexport default vNumber\n","import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\n\n// ============ Types ============\n\n/**\n * Permission action mode\n */\nexport type PermissionAction = 'remove' | 'disable' | 'hide'\n\n/**\n * Permission check mode\n */\nexport type PermissionMode = 'some' | 'every'\n\n/**\n * Permission directive options\n */\nexport interface PermissionOptions {\n\t/** Permission value(s) to check */\n\tvalue: string | string[]\n\t/** Logic for multiple permissions: 'some' (OR) or 'every' (AND). Default: 'some' */\n\tmode?: PermissionMode\n\t/** Action when permission denied. Default: 'remove' */\n\taction?: PermissionAction\n\t/** Custom permission check function */\n\tcheck?: (permission: string | string[], mode: PermissionMode) => boolean\n\t/** Callback when permission state changes */\n\tonChange?: (hasPermission: boolean) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type PermissionBinding = string | string[] | PermissionOptions\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n\t/** Get current user's permissions */\n\tgetPermissions: () => string[]\n\t/** Get current user's roles */\n\tgetRoles?: () => string[]\n\t/** Role to permission mapping */\n\troleMap?: Record<string, string[]>\n}\n\n// ============ Constants ============\n\nconst STATE_KEY = '__permission' as const\nconst WILDCARD = '*' as const\n\n// ============ State ============\n\ninterface ElementState {\n\toptions: PermissionOptions\n\toriginalDisplay: string\n\toriginalDisabled: boolean | string\n\tparentNode: Node | null\n\tplaceholder: Comment | null\n}\n\n// Global configuration\nlet globalConfig: PermissionConfig | null = null\n\n// ============ Configuration ============\n\n/**\n * Configure permission directive\n */\nexport function configurePermission(config: PermissionConfig): void {\n\tglobalConfig = config\n}\n\n/**\n * Get current configuration\n */\nexport function getPermissionConfig(): PermissionConfig | null {\n\treturn globalConfig\n}\n\n// ============ Helpers ============\n\n/**\n * Normalize binding value to options object\n */\nfunction normalizeOptions(binding: PermissionBinding | undefined): PermissionOptions {\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-permission: permission value is required')\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\tif (Array.isArray(binding)) {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\n/**\n * Check if a permission is granted (supports wildcard)\n */\nfunction hasPermission(required: string, permissions: string[]): boolean {\n\treturn permissions.includes(WILDCARD) || permissions.includes(required)\n}\n\n/**\n * Verify permission against configuration\n */\nfunction verifyPermission(options: PermissionOptions): boolean {\n\t// Custom check function takes priority\n\tif (options.check) {\n\t\treturn options.check(options.value, options.mode || 'some')\n\t}\n\n\t// Require global configuration\n\tif (!globalConfig) {\n\t\tconsole.warn('[Directix] v-permission: No permission config provided')\n\n\t\treturn true\n\t}\n\n\tconst permissions = globalConfig.getPermissions()\n\tconst roles = globalConfig.getRoles?.() || []\n\tconst roleMap = globalConfig.roleMap || {}\n\tconst required = Array.isArray(options.value) ? options.value : [options.value]\n\tconst mode = options.mode || 'some'\n\n\t/**\n\t * Check a single value - can be a role name or permission\n\t */\n\tfunction checkSingle(value: string): boolean {\n\t\t// If value is a role name in roleMap, check if user has that role\n\t\tif (value in roleMap) {\n\t\t\treturn roles.includes(value)\n\t\t}\n\n\t\t// Check direct permission\n\t\tif (hasPermission(value, permissions)) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Check if any of user's roles grant this permission\n\t\tfor (const role of roles) {\n\t\t\tconst rolePermissions = roleMap[role] || []\n\n\t\t\tif (hasPermission(value, rolePermissions)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\treturn mode === 'every' ? required.every(checkSingle) : required.some(checkSingle)\n}\n\n/**\n * Handle element when permission is denied\n */\nfunction handleDenied(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tstate.parentNode = el.parentNode\n\t\t\tstate.placeholder = document.createComment('v-permission')\n\t\t\tel.parentNode?.insertBefore(state.placeholder, el)\n\t\t\tel.parentNode?.removeChild(el)\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tstate.originalDisabled = el.getAttribute('disabled') || false\n\t\t\tel.setAttribute('disabled', 'true')\n\t\t\tel.classList.add('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tstate.originalDisplay = el.style.display\n\t\t\tel.style.display = 'none'\n\t\t\tel.classList.add('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Restore element when permission is granted\n */\nfunction handleGranted(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tif (state.placeholder && state.parentNode) {\n\t\t\t\tstate.parentNode.insertBefore(el, state.placeholder)\n\t\t\t\tstate.parentNode.removeChild(state.placeholder)\n\t\t\t\tstate.placeholder = null\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tif (state.originalDisabled === false) {\n\t\t\t\tel.removeAttribute('disabled')\n\t\t\t} else if (state.originalDisabled) {\n\t\t\t\tel.setAttribute('disabled', state.originalDisabled as string)\n\t\t\t}\n\t\t\tel.classList.remove('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tel.style.display = state.originalDisplay || ''\n\t\t\tel.classList.remove('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Get or create element state\n */\nfunction getState(el: HTMLElement): ElementState {\n\tif (!(el as any)[STATE_KEY]) {\n\t\t;(el as any)[STATE_KEY] = {\n\t\t\toptions: { value: '' },\n\t\t\toriginalDisplay: '',\n\t\t\toriginalDisabled: false,\n\t\t\tparentNode: null,\n\t\t\tplaceholder: null,\n\t\t} as ElementState\n\t}\n\n\treturn (el as any)[STATE_KEY]\n}\n\n/**\n * Check permission and update element state\n */\nfunction checkPermission(el: HTMLElement, binding: DirectiveBinding<PermissionBinding>): void {\n\tconst state = getState(el)\n\n\tstate.options = normalizeOptions(binding.value)\n\n\tconst granted = verifyPermission(state.options)\n\n\t// Trigger change callback\n\tstate.options.onChange?.(granted)\n\n\tconst action = state.options.action || 'remove'\n\n\tif (granted) {\n\t\thandleGranted(el, action, state)\n\t} else {\n\t\thandleDenied(el, action, state)\n\t}\n}\n\n/**\n * Cleanup element state\n */\nfunction cleanup(el: HTMLElement): void {\n\tconst state: ElementState = (el as any)[STATE_KEY]\n\n\tif (state?.placeholder && state.parentNode) {\n\t\tstate.parentNode.removeChild(state.placeholder)\n\t}\n\n\tdelete (el as any)[STATE_KEY]\n}\n\n// ============ Directive ============\n\n/**\n * v-permission directive\n *\n * Controls element visibility and state based on user permissions.\n * Supports role-based and permission-based access control with wildcard support.\n *\n * @example\n * ```vue\n * <template>\n * <button v-permission=\"'admin'\">Admin Only</button>\n * <button v-permission=\"['admin', 'editor']\">Admin or Editor</button>\n * <button v-permission=\"{ value: ['read', 'write'], mode: 'every' }\">Read & Write</button>\n * <button v-permission=\"{ value: 'admin', action: 'disable' }\">Disabled for non-admin</button>\n * </template>\n *\n * <script setup>\n * import { configurePermission } from 'directix'\n *\n * configurePermission({\n * getPermissions: () => store.getters.permissions,\n * getRoles: () => store.getters.roles,\n * roleMap: { admin: ['*'], editor: ['read', 'write'] }\n * })\n * </script>\n * ```\n */\nexport const vPermission = defineDirective<PermissionBinding, HTMLElement>({\n\tname: 'permission',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tupdated(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tunmounted(el) {\n\t\tcleanup(el)\n\t},\n})\n\nexport default vPermission\n","import { defineDirective } from '@directix/core'\n\n/**\n * Print complete callback\n */\nexport type PrintCompleteCallback = () => void\n\n/**\n * Print before callback\n */\nexport type PrintBeforeCallback = () => boolean | void\n\n/**\n * Print directive options\n */\nexport interface PrintOptions {\n\t/**\n\t * Title for the printed document\n\t */\n\ttitle?: string\n\n\t/**\n\t * Additional CSS styles to inject\n\t */\n\tstyles?: string | string[]\n\n\t/**\n\t * Additional CSS URLs to include\n\t */\n\tcssUrls?: string[]\n\n\t/**\n\t * Callback before printing\n\t * Return false to cancel printing\n\t */\n\tonBeforePrint?: PrintBeforeCallback\n\n\t/**\n\t * Callback after printing\n\t */\n\tonAfterPrint?: PrintCompleteCallback\n\n\t/**\n\t * Whether to print immediately on mount\n\t * @default false\n\t */\n\timmediate?: boolean\n\n\t/**\n\t * Print target selector\n\t * If not specified, prints the element itself\n\t */\n\ttarget?: string\n\n\t/**\n\t * Whether to print in a new window\n\t * @default false\n\t */\n\tnewWindow?: boolean\n\n\t/**\n\t * Custom class for print container\n\t */\n\tprintClass?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type PrintBinding = PrintOptions | boolean\n\n/**\n * Element state storage\n */\ninterface PrintState {\n\toptions: PrintOptions\n\tclickHandler: (() => void) | null\n}\n\n/**\n * v-print directive\n *\n * Prints the element content when clicked or immediately.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Print on click -->\n * <button v-print>Print Page</button>\n *\n * <!-- Print specific element -->\n * <button v-print=\"{ target: '#content' }\">Print Content</button>\n *\n * <!-- Print with custom title -->\n * <button v-print=\"{ title: 'My Document', styles: 'body { font-size: 12px }' }\">\n * Print\n * </button>\n *\n * <!-- Print immediately on mount -->\n * <div v-print=\"{ immediate: true }\">Auto print</div>\n * </template>\n * ```\n */\nexport const vPrint = defineDirective<PrintBinding, HTMLElement>({\n\tname: 'print',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: PrintState = {\n\t\t\toptions,\n\t\t\tclickHandler: null,\n\t\t}\n\n\t\t;(el as any).__print = state\n\n\t\t// Print immediately if specified\n\t\tif (options.immediate) {\n\t\t\tsetTimeout(() => printElement(el, options), 100)\n\t\t\treturn\n\t\t}\n\n\t\t// Add click handler\n\t\tconst clickHandler = (): void => {\n\t\t\tprintElement(el, state.options)\n\t\t}\n\n\t\tel.addEventListener('click', clickHandler)\n\t\tstate.clickHandler = clickHandler\n\n\t\t// Add cursor style\n\t\tel.style.cursor = 'pointer'\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: PrintState = (el as any).__print\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: PrintState | undefined = (el as any).__print\n\n\t\tif (!state) return\n\n\t\tif (state.clickHandler) {\n\t\t\tel.removeEventListener('click', state.clickHandler)\n\t\t}\n\n\t\tel.style.cursor = ''\n\n\t\tdelete (el as any).__print\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: PrintBinding | undefined): PrintOptions {\n\tif (binding === true) {\n\t\treturn { immediate: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn {}\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * Print element\n */\nasync function printElement(triggerEl: HTMLElement, options: PrintOptions): Promise<void> {\n\t// Call before callback\n\tif (options.onBeforePrint) {\n\t\tconst result = options.onBeforePrint()\n\t\tif (result === false) return\n\t}\n\n\t// Get target element\n\tconst targetEl = options.target ? document.querySelector(options.target) : triggerEl\n\n\tif (!targetEl) {\n\t\tconsole.warn('[Directix] v-print: Target element not found')\n\t\treturn\n\t}\n\n\t// Create print window/iframe\n\tif (options.newWindow) {\n\t\tawait printInNewWindow(targetEl as HTMLElement, options)\n\t} else {\n\t\tawait printInIframe(targetEl as HTMLElement, options)\n\t}\n\n\t// Call after callback\n\tif (options.onAfterPrint) {\n\t\toptions.onAfterPrint()\n\t}\n}\n\n/**\n * Print using iframe\n */\nasync function printInIframe(el: HTMLElement, options: PrintOptions): Promise<void> {\n\t// Create iframe\n\tconst iframe = document.createElement('iframe')\n\tiframe.style.cssText = 'position: absolute; top: -10000px; left: -10000px; width: 0; height: 0; border: none;'\n\tdocument.body.appendChild(iframe)\n\n\tconst iframeDoc = iframe.contentDocument || iframe.contentWindow?.document\n\n\tif (!iframeDoc) {\n\t\tconsole.warn('[Directix] v-print: Could not access iframe document')\n\t\tdocument.body.removeChild(iframe)\n\t\treturn\n\t}\n\n\t// Build document content\n\tconst content = buildPrintContent(el, options)\n\n\tiframeDoc.open()\n\tiframeDoc.write(content)\n\tiframeDoc.close()\n\n\t// Wait for images to load\n\tawait waitForImages(iframeDoc)\n\n\t// Print\n\ttry {\n\t\tiframe.contentWindow?.focus()\n\t\tiframe.contentWindow?.print()\n\t} catch (err) {\n\t\tconsole.error('[Directix] v-print: Print failed', err)\n\t}\n\n\t// Cleanup after print\n\tsetTimeout(() => {\n\t\tdocument.body.removeChild(iframe)\n\t}, 1000)\n}\n\n/**\n * Print in new window\n */\nasync function printInNewWindow(el: HTMLElement, options: PrintOptions): Promise<void> {\n\tconst printWindow = window.open('', '_blank')\n\n\tif (!printWindow) {\n\t\tconsole.warn('[Directix] v-print: Could not open print window')\n\t\treturn\n\t}\n\n\tconst content = buildPrintContent(el, options)\n\n\tprintWindow.document.open()\n\tprintWindow.document.write(content)\n\tprintWindow.document.close()\n\n\t// Wait for images to load\n\tawait waitForImages(printWindow.document)\n\n\t// Print\n\tprintWindow.focus()\n\tprintWindow.print()\n\n\t// Close after print\n\tsetTimeout(() => {\n\t\tprintWindow.close()\n\t}, 1000)\n}\n\n/**\n * Build print content HTML\n */\nfunction buildPrintContent(el: HTMLElement, options: PrintOptions): string {\n\t// Get all stylesheets\n\tlet styles = ''\n\n\t// Include existing stylesheets\n\tdocument.querySelectorAll('style, link[rel=\"stylesheet\"]').forEach(styleEl => {\n\t\tif (styleEl.tagName === 'STYLE') {\n\t\t\tstyles += `<style>${styleEl.textContent}</style>`\n\t\t} else if (styleEl.tagName === 'LINK') {\n\t\t\tconst href = (styleEl as HTMLLinkElement).href\n\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${href}\">`\n\t\t}\n\t})\n\n\t// Add custom CSS URLs\n\tif (options.cssUrls) {\n\t\toptions.cssUrls.forEach(url => {\n\t\t\tstyles += `<link rel=\"stylesheet\" href=\"${url}\">`\n\t\t})\n\t}\n\n\t// Add custom styles\n\tif (options.styles) {\n\t\tconst customStyles = Array.isArray(options.styles) ? options.styles.join('\\n') : options.styles\n\t\tstyles += `<style>${customStyles}</style>`\n\t}\n\n\t// Add print-specific styles\n\tstyles += `\n\t\t<style>\n\t\t\t@media print {\n\t\t\t\tbody { margin: 0; padding: 20px; }\n\t\t\t\t${options.printClass ? `.${options.printClass} { page-break-inside: avoid; }` : ''}\n\t\t\t}\n\t\t</style>\n\t`\n\n\t// Build HTML\n\tconst title = options.title || document.title || 'Print'\n\tconst content = el.outerHTML\n\n\treturn `<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>${title}</title>\n\t${styles}\n</head>\n<body>\n\t${content}\n</body>\n</html>`\n}\n\n/**\n * Wait for images to load\n */\nfunction waitForImages(doc: Document): Promise<void[]> {\n\tconst images = doc.querySelectorAll('img')\n\tconst promises: Promise<void>[] = []\n\n\timages.forEach(img => {\n\t\tif (!img.complete) {\n\t\t\tpromises.push(\n\t\t\t\tnew Promise(resolve => {\n\t\t\t\t\timg.onload = () => resolve()\n\t\t\t\t\timg.onerror = () => resolve()\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\t})\n\n\treturn Promise.all(promises)\n}\n\nexport default vPrint\n","import { defineDirective } from '@directix/core'\n\nexport type PullRefreshHandler = () => Promise<void> | void\n\nexport type PullRefreshState = 'idle' | 'pulling' | 'ready' | 'loading' | 'success' | 'error'\n\nexport interface PullRefreshOptions {\n\thandler: PullRefreshHandler\n\tdistance?: number\n\tmaxDistance?: number\n\tdisabled?: boolean\n\tindicator?: {\n\t\tidle?: string\n\t\tpulling?: string\n\t\tready?: string\n\t\tloading?: string\n\t\tsuccess?: string\n\t\terror?: string\n\t}\n\tsuccessDuration?: number\n\terrorDuration?: number\n\tonStateChange?: (state: PullRefreshState) => void\n}\n\nexport type PullRefreshBinding = PullRefreshHandler | PullRefreshOptions\n\ninterface PullRefreshInternalState {\n\toptions: PullRefreshOptions\n\tstate: PullRefreshState\n\tstartY: number\n\tcurrentY: number\n\tpulling: boolean\n\tindicatorEl: HTMLDivElement\n\tcontentEl: HTMLElement\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: () => void\n\t}\n}\n\nconst DEFAULT_DISTANCE = 60\nconst DEFAULT_MAX_DISTANCE = 100\nconst DEFAULT_SUCCESS_DURATION = 500\nconst DEFAULT_ERROR_DURATION = 1000\n\nconst DEFAULT_INDICATORS: Record<PullRefreshState, string> = {\n\tidle: '↓',\n\tpulling: '↓ Pull',\n\tready: '↓ Release',\n\tloading: '⟳ Loading...',\n\tsuccess: '✓ Done',\n\terror: '✗ Failed',\n}\n\nfunction normalizeOptions(binding: PullRefreshBinding): PullRefreshOptions {\n\tif (typeof binding === 'function') return { handler: binding }\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tdistance: binding.distance ?? DEFAULT_DISTANCE,\n\t\tmaxDistance: binding.maxDistance ?? DEFAULT_MAX_DISTANCE,\n\t\tdisabled: binding.disabled ?? false,\n\t\tindicator: binding.indicator,\n\t\tsuccessDuration: binding.successDuration ?? DEFAULT_SUCCESS_DURATION,\n\t\terrorDuration: binding.errorDuration ?? DEFAULT_ERROR_DURATION,\n\t\tonStateChange: binding.onStateChange,\n\t}\n}\n\nfunction createIndicator(): HTMLDivElement {\n\tconst el = document.createElement('div')\n\tel.className = 'v-pull-refresh__indicator'\n\tel.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\theight: 60px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tbackground: #f5f5f5;\n\t\tfont-size: 14px;\n\t\tcolor: #666;\n\t\tz-index: 10;\n\t\tpointer-events: none;\n\t\topacity: 0;\n\t\ttransition: opacity 0.2s ease;\n\t`\n\treturn el\n}\n\nfunction updateIndicator(el: HTMLDivElement, state: PullRefreshState, options: PullRefreshOptions): void {\n\tconst customIndicator = options.indicator?.[state]\n\tel.textContent = customIndicator || DEFAULT_INDICATORS[state]\n}\n\nfunction setState(internal: PullRefreshInternalState, newState: PullRefreshState): void {\n\tif (internal.state === newState) return\n\n\tinternal.state = newState\n\tupdateIndicator(internal.indicatorEl, newState, internal.options)\n\tinternal.options.onStateChange?.(newState)\n}\n\nfunction applyTransform(internal: PullRefreshInternalState, distance: number, showIndicator: boolean): void {\n\tinternal.contentEl.style.transform = `translateY(${distance}px)`\n\tinternal.indicatorEl.style.opacity = showIndicator ? '1' : '0'\n\tinternal.indicatorEl.style.transform = `translateY(${distance}px)`\n}\n\nfunction resetPosition(internal: PullRefreshInternalState): void {\n\tinternal.contentEl.style.transform = ''\n\tinternal.indicatorEl.style.opacity = '0'\n\tsetState(internal, 'idle')\n}\n\nasync function triggerRefresh(internal: PullRefreshInternalState): Promise<void> {\n\tsetState(internal, 'loading')\n\n\tconst distance = internal.options.distance!\n\tapplyTransform(internal, distance, true)\n\n\ttry {\n\t\tawait internal.options.handler()\n\t\tsetState(internal, 'success')\n\t\tawait sleep(internal.options.successDuration!)\n\t} catch {\n\t\tsetState(internal, 'error')\n\t\tawait sleep(internal.options.errorDuration!)\n\t} finally {\n\t\tresetPosition(internal)\n\t}\n}\n\nfunction sleep(ms: number): Promise<void> {\n\treturn new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction createHandlers(internal: PullRefreshInternalState): PullRefreshInternalState['handlers'] {\n\tconst { contentEl, options } = internal\n\n\treturn {\n\t\ttouchStart: (e: TouchEvent) => {\n\t\t\tif (options.disabled || internal.state === 'loading') return\n\t\t\tif (contentEl.scrollTop > 0) return\n\n\t\t\tinternal.pulling = true\n\t\t\tinternal.startY = e.touches[0].clientY\n\t\t\tinternal.currentY = internal.startY\n\t\t\tsetState(internal, 'idle')\n\t\t},\n\n\t\ttouchMove: (e: TouchEvent) => {\n\t\t\tif (!internal.pulling || options.disabled || internal.state === 'loading') return\n\n\t\t\tinternal.currentY = e.touches[0].clientY\n\t\t\tconst diff = internal.currentY - internal.startY\n\n\t\t\t// Handle upward swipe - reset\n\t\t\tif (diff <= 0) {\n\t\t\t\tif (contentEl.style.transform) {\n\t\t\t\t\tcontentEl.style.transition = ''\n\t\t\t\t\tresetPosition(internal)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Prevent page scroll\n\t\t\te.preventDefault()\n\n\t\t\tconst distance = Math.min(diff * 0.5, options.maxDistance!)\n\t\t\tconst progress = distance / options.distance!\n\n\t\t\tcontentEl.style.transition = 'none'\n\t\t\tapplyTransform(internal, distance, true)\n\t\t\tsetState(internal, progress >= 1 ? 'ready' : 'pulling')\n\t\t},\n\n\t\ttouchEnd: () => {\n\t\t\tif (!internal.pulling || options.disabled) return\n\n\t\t\tinternal.pulling = false\n\t\t\tconst diff = internal.currentY - internal.startY\n\t\t\tconst distance = Math.min(diff * 0.5, options.maxDistance!)\n\n\t\t\tcontentEl.style.transition = ''\n\n\t\t\tif (internal.state === 'ready' && distance >= options.distance!) {\n\t\t\t\ttriggerRefresh(internal)\n\t\t\t} else {\n\t\t\t\tresetPosition(internal)\n\t\t\t}\n\t\t},\n\t}\n}\n\nfunction bindEvents(el: HTMLElement, handlers: PullRefreshInternalState['handlers']): void {\n\tel.addEventListener('touchstart', handlers.touchStart, { passive: false })\n\tel.addEventListener('touchmove', handlers.touchMove, { passive: false })\n\tel.addEventListener('touchend', handlers.touchEnd, { passive: true })\n}\n\nfunction unbindEvents(el: HTMLElement, handlers: PullRefreshInternalState['handlers']): void {\n\tel.removeEventListener('touchstart', handlers.touchStart)\n\tel.removeEventListener('touchmove', handlers.touchMove)\n\tel.removeEventListener('touchend', handlers.touchEnd)\n}\n\nexport const vPullRefresh = defineDirective<PullRefreshBinding, HTMLElement>({\n\tname: 'pull-refresh',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Setup container\n\t\tel.style.position = 'relative'\n\t\tel.style.overflow = 'hidden'\n\t\tel.classList.add('v-pull-refresh')\n\n\t\t// Create content wrapper\n\t\tconst contentEl = document.createElement('div')\n\t\tcontentEl.className = 'v-pull-refresh__content'\n\t\tcontentEl.style.cssText = 'position: relative; height: 100%; overflow-y: auto;'\n\n\t\t// Move children to wrapper\n\t\twhile (el.firstChild) {\n\t\t\tcontentEl.appendChild(el.firstChild)\n\t\t}\n\t\tel.appendChild(contentEl)\n\n\t\t// Create indicator\n\t\tconst indicatorEl = createIndicator()\n\t\tel.insertBefore(indicatorEl, contentEl)\n\n\t\t// Initialize state\n\t\tconst internal: PullRefreshInternalState = {\n\t\t\toptions,\n\t\t\tstate: 'idle',\n\t\t\tstartY: 0,\n\t\t\tcurrentY: 0,\n\t\t\tpulling: false,\n\t\t\tindicatorEl,\n\t\t\tcontentEl,\n\t\t\thandlers: null as any,\n\t\t}\n\n\t\tinternal.handlers = createHandlers(internal)\n\t\t;(el as any).__pullRefresh = internal\n\n\t\tif (!options.disabled) {\n\t\t\tbindEvents(el, internal.handlers)\n\t\t}\n\n\t\tupdateIndicator(indicatorEl, 'idle', options)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst internal: PullRefreshInternalState = (el as any).__pullRefresh\n\t\tif (!internal) return\n\n\t\tconst wasDisabled = internal.options.disabled\n\t\tinternal.options = normalizeOptions(binding.value)\n\n\t\tupdateIndicator(internal.indicatorEl, internal.state, internal.options)\n\n\t\tif (internal.options.disabled && !wasDisabled) {\n\t\t\tunbindEvents(el, internal.handlers)\n\t\t} else if (!internal.options.disabled && wasDisabled) {\n\t\t\tbindEvents(el, internal.handlers)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst internal: PullRefreshInternalState = (el as any).__pullRefresh\n\t\tif (!internal) return\n\n\t\tunbindEvents(el, internal.handlers)\n\t\tdelete (el as any).__pullRefresh\n\t},\n})\n\nexport default vPullRefresh\n","import { defineDirective, isBrowser, supportsResizeObserver } from '@directix/core'\n\n/**\n * Resize event handler\n */\nexport type ResizeHandler = (entry: ResizeObserverEntry) => void\n\n/**\n * Resize information\n */\nexport interface ResizeInfo {\n\t/** New width */\n\twidth: number\n\t/** New height */\n\theight: number\n\t/** Content rect */\n\tcontentRect: DOMRectReadOnly\n\t/** Border box size */\n\tborderBoxSize: ReadonlyArray<ResizeObserverSize>\n\t/** Content box size */\n\tcontentBoxSize: ReadonlyArray<ResizeObserverSize>\n\t/** Device pixel content box size */\n\tdevicePixelContentBoxSize: ReadonlyArray<ResizeObserverSize>\n}\n\n/**\n * Resize directive options\n */\nexport interface ResizeOptions {\n\t/**\n\t * Resize event handler\n\t * @required\n\t */\n\thandler: ResizeHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use box model\n\t * - 'content-box': size of content area\n\t * - 'border-box': size of border box\n\t * - 'device-pixel-content-box': size in device pixels\n\t * @default 'content-box'\n\t */\n\tbox?: 'content-box' | 'border-box' | 'device-pixel-content-box'\n\n\t/**\n\t * Debounce time in milliseconds\n\t * @default 0 (no debounce)\n\t */\n\tdebounce?: number\n\n\t/**\n\t * Callback for browsers without ResizeObserver (uses object fallback)\n\t */\n\tonFallback?: (info: ResizeInfo) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type ResizeBinding = ResizeHandler | ResizeOptions\n\n/**\n * Element state storage\n */\ninterface ResizeState {\n\toptions: ResizeOptions\n\tobserver: ResizeObserver | null\n\thandler: (entry: ResizeObserverEntry) => void\n\tdebounceTimer: ReturnType<typeof setTimeout> | null\n\tpendingEntry: ResizeObserverEntry | null\n\tfallbackIframe: HTMLIFrameElement | null\n}\n\n/**\n * Get resize info from entry\n */\nfunction getResizeInfo(entry: ResizeObserverEntry): ResizeInfo {\n\treturn {\n\t\twidth: entry.contentRect.width,\n\t\theight: entry.contentRect.height,\n\t\tcontentRect: entry.contentRect,\n\t\tborderBoxSize: entry.borderBoxSize,\n\t\tcontentBoxSize: entry.contentBoxSize,\n\t\tdevicePixelContentBoxSize: entry.devicePixelContentBoxSize,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ResizeBinding | undefined): ResizeOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-resize: handler is required')\n\t}\n\n\treturn {\n\t\tdisabled: false,\n\t\tbox: 'content-box',\n\t\tdebounce: 0,\n\t\t...binding,\n\t}\n}\n\n/**\n * Create fallback resize detection using object\n */\nfunction createFallbackResize(\n\tel: HTMLElement,\n\tcallback: () => void,\n): { iframe: HTMLIFrameElement, cleanup: () => void } {\n\t// Create an invisible iframe for resize detection\n\tconst iframe = document.createElement('iframe')\n\n\tiframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: none;\n pointer-events: none;\n opacity: 0;\n `\n\n\tel.appendChild(iframe)\n\n\tconst iWindow = iframe.contentWindow\n\n\tif (iWindow) {\n\t\tiWindow.addEventListener('resize', callback)\n\t}\n\n\treturn {\n\t\tiframe,\n\t\tcleanup: () => {\n\t\t\tif (iWindow) {\n\t\t\t\tiWindow.removeEventListener('resize', callback)\n\t\t\t}\n\n\t\t\tiframe.remove()\n\t\t},\n\t}\n}\n\n/**\n * v-resize directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-resize=\"handleResize\">Resize me</div>\n * <div v-resize=\"{ handler: handleResize, debounce: 200 }\">Debounced resize</div>\n * </template>\n * ```\n */\nexport const vResize = defineDirective<ResizeBinding, HTMLElement>({\n\tname: 'resize',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tbox: 'content-box',\n\t\tdebounce: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Ensure element has relative or absolute positioning for fallback\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst state: ResizeState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\tdebounceTimer: null,\n\t\t\tpendingEntry: null,\n\t\t\tfallbackIframe: null,\n\t\t\thandler: (entry: ResizeObserverEntry) => {\n\t\t\t\t// Handle debounce\n\t\t\t\tif (options.debounce && options.debounce > 0) {\n\t\t\t\t\tstate.pendingEntry = entry\n\n\t\t\t\t\tif (!state.debounceTimer) {\n\t\t\t\t\t\tstate.debounceTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEntry) {\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEntry)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.debounceTimer = null\n\t\t\t\t\t\t\tstate.pendingEntry = null\n\t\t\t\t\t\t}, options.debounce)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toptions.handler(entry)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__resize = state\n\n\t\t// Use ResizeObserver if available\n\t\tif (supportsResizeObserver()) {\n\t\t\tstate.observer = new ResizeObserver(entries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tstate.handler(entry)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.observer.observe(el, { box: options.box })\n\t\t} else {\n\t\t\t// Fallback using iframe\n\t\t\tconsole.warn('[Directix] v-resize: ResizeObserver not supported, using fallback')\n\n\t\t\tconst { iframe, cleanup } = createFallbackResize(el, () => {\n\t\t\t\tconst rect = el.getBoundingClientRect()\n\t\t\t\tconst entry = {\n\t\t\t\t\ttarget: el,\n\t\t\t\t\tcontentRect: rect as DOMRectReadOnly,\n\t\t\t\t\tborderBoxSize: [] as any,\n\t\t\t\t\tcontentBoxSize: [] as any,\n\t\t\t\t\tdevicePixelContentBoxSize: [] as any,\n\t\t\t\t}\n\n\t\t\t\tstate.handler(entry as ResizeObserverEntry)\n\n\t\t\t\tif (options.onFallback) {\n\t\t\t\t\toptions.onFallback(getResizeInfo(entry as ResizeObserverEntry))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.fallbackIframe = iframe\n\t\t\t;(el as any).__resizeCleanup = cleanup\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\t// Clear debounce timer\n\t\tif (state.debounceTimer) {\n\t\t\tclearTimeout(state.debounceTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Cleanup fallback\n\t\tconst cleanup = (el as any).__resizeCleanup\n\n\t\tif (cleanup) {\n\t\t\tcleanup()\n\t\t}\n\n\t\tdelete (el as any).__resize\n\t\tdelete (el as any).__resizeCleanup\n\t},\n})\n\nexport default vResize\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Ripple directive options\n */\nexport interface RippleOptions {\n\t/**\n\t * Ripple color\n\t * @default 'currentColor'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Ripple duration in milliseconds\n\t * @default 600\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable ripple\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Initial scale of ripple\n\t * @default 0\n\t */\n\tinitialScale?: number\n\n\t/**\n\t * Final scale of ripple\n\t * @default 2\n\t */\n\tfinalScale?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type RippleBinding = boolean | string | RippleOptions\n\n/**\n * Element state storage\n */\ninterface RippleState {\n\toptions: RippleOptions\n\tclickHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: RippleBinding | undefined): RippleOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true, color: 'currentColor', duration: 600 }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { color: binding, duration: 600 }\n\t}\n\n\tconst base: RippleOptions = {\n\t\tcolor: 'currentColor',\n\t\tduration: 600,\n\t\tdisabled: false,\n\t\tinitialScale: 0,\n\t\tfinalScale: 2,\n\t}\n\n\treturn binding && typeof binding === 'object' ? { ...base, ...binding } : base\n}\n\n/**\n * Create ripple element\n */\nfunction createRipple(\n\tevent: MouseEvent,\n\tel: HTMLElement,\n\toptions: RippleOptions,\n): HTMLSpanElement | null {\n\t// Get element dimensions\n\tconst rect = el.getBoundingClientRect()\n\n\t// Calculate ripple position\n\tconst x = event.clientX - rect.left\n\tconst y = event.clientY - rect.top\n\n\t// Calculate ripple size (use diagonal for full coverage)\n\tconst size = Math.max(rect.width, rect.height) * 2\n\n\t// Create ripple element\n\tconst ripple = document.createElement('span')\n\n\tripple.className = 'v-ripple__wave'\n\tripple.style.cssText = `\n position: absolute;\n border-radius: 50%;\n pointer-events: none;\n background-color: ${options.color};\n width: ${size}px;\n height: ${size}px;\n left: ${x - size / 2}px;\n top: ${y - size / 2}px;\n transform: scale(${options.initialScale});\n opacity: 0.3;\n z-index: 0;\n `\n\n\treturn ripple\n}\n\n/**\n * Animate ripple\n */\nfunction animateRipple(ripple: HTMLElement, options: RippleOptions): void {\n\tconst duration = options.duration || 600\n\tconst initialScale = options.initialScale || 0\n\tconst finalScale = options.finalScale || 2\n\n\t// Use Web Animations API if available\n\tif (typeof ripple.animate === 'function') {\n\t\tripple.animate(\n\t\t\t[\n\t\t\t\t{ transform: `scale(${initialScale})`, opacity: 0.3 },\n\t\t\t\t{ transform: `scale(${finalScale})`, opacity: 0 },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration,\n\t\t\t\teasing: 'ease-out',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).onfinish = () => {\n\t\t\tripple.remove()\n\t\t}\n\t} else {\n\t\t// Fallback for older browsers\n\t\tripple.style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`\n\n\t\t// Force reflow\n\t\tString(ripple.offsetHeight)\n\n\t\tripple.style.transform = `scale(${finalScale})`\n\t\tripple.style.opacity = '0'\n\n\t\tsetTimeout(() => {\n\t\t\tripple.remove()\n\t\t}, duration)\n\t}\n}\n\n/**\n * v-ripple directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-ripple>Click me</button>\n * <button v-ripple=\"'rgba(255, 255, 255, 0.3)'\">Custom color</button>\n * <button v-ripple=\"{ color: 'red', duration: 800 }\">Custom options</button>\n * </template>\n * ```\n */\nexport const vRipple = defineDirective<RippleBinding, HTMLElement>({\n\tname: 'ripple',\n\tssr: false,\n\tdefaults: {\n\t\tcolor: 'currentColor',\n\t\tduration: 600,\n\t\tdisabled: false,\n\t\tinitialScale: 0,\n\t\tfinalScale: 2,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Ensure element has proper positioning\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\t// Ensure overflow is hidden to contain ripple\n\t\tif (computedStyle.overflow === 'visible') {\n\t\t\tel.style.overflow = 'hidden'\n\t\t}\n\n\t\t// Add base class\n\t\tel.classList.add('v-ripple')\n\n\t\tconst state: RippleState = {\n\t\t\toptions,\n\t\t\tclickHandler: (e: Event) => {\n\t\t\t\t// Ignore if disabled\n\t\t\t\tif (state.options.disabled) return\n\n\t\t\t\tconst mouseEvent = e as MouseEvent\n\n\t\t\t\t// Create and append ripple\n\t\t\t\tconst ripple = createRipple(mouseEvent, el, state.options)\n\n\t\t\t\tif (ripple) {\n\t\t\t\t\tel.appendChild(ripple)\n\t\t\t\t\tanimateRipple(ripple, state.options)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__ripple = state\n\n\t\t// Bind click event\n\t\ton(el, 'click', state.clickHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: RippleState = (el as any).__ripple\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: RippleState = (el as any).__ripple\n\n\t\tif (!state) return\n\n\t\t// Unbind event\n\t\toff(el, 'click', state.clickHandler)\n\n\t\t// Remove class\n\t\tel.classList.remove('v-ripple')\n\n\t\tdelete (el as any).__ripple\n\t},\n})\n\nexport default vRipple\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Sanitize handler\n */\nexport type SanitizeHandler = (value: string) => string\n\n/**\n * Sanitize directive options\n */\nexport interface SanitizeOptions {\n\t/**\n\t * Tags to allow (whitelist)\n\t * @default []\n\t */\n\tallowedTags?: string[]\n\n\t/**\n\t * Attributes to allow (whitelist)\n\t * @default []\n\t */\n\tallowedAttributes?: string[]\n\n\t/**\n\t * Whether to allow data URLs\n\t * @default false\n\t */\n\tallowDataUrls?: boolean\n\n\t/**\n\t * Whether to allow inline styles\n\t * @default false\n\t */\n\tallowStyles?: boolean\n\n\t/**\n\t * Whether to allow class attribute\n\t * @default false\n\t */\n\tallowClass?: boolean\n\n\t/**\n\t * Whether to allow id attribute\n\t * @default false\n\t */\n\tallowId?: boolean\n\n\t/**\n\t * Custom sanitize function\n\t */\n\thandler?: SanitizeHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to sanitize on update\n\t * @default true\n\t */\n\tsanitizeOnUpdate?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type SanitizeBinding = boolean | SanitizeOptions\n\n/**\n * Default allowed tags (safe subset)\n */\nconst DEFAULT_ALLOWED_TAGS = ['b', 'i', 'u', 'strong', 'em', 'br', 'p', 'span', 'div']\n\n/**\n * Default allowed attributes\n */\nconst DEFAULT_ALLOWED_ATTRIBUTES = ['title', 'alt', 'href', 'src']\n\n/**\n * Dangerous tags that should always be removed\n */\nconst DANGEROUS_TAGS = ['script', 'iframe', 'object', 'embed', 'form', 'input', 'style', 'link', 'meta', 'base']\n\n/**\n * Dangerous attributes that should always be removed\n */\nconst DANGEROUS_ATTRIBUTES = ['onclick', 'onerror', 'onload', 'onmouseover', 'onfocus', 'onblur', 'onchange', 'onsubmit']\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: SanitizeBinding | undefined): SanitizeOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true }\n\t}\n\n\tif (binding === true) {\n\t\treturn {\n\t\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\t}\n\t}\n\n\treturn {\n\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\tallowDataUrls: false,\n\t\tallowStyles: false,\n\t\tallowClass: false,\n\t\tallowId: false,\n\t\tdisabled: false,\n\t\tsanitizeOnUpdate: true,\n\t\t...binding,\n\t}\n}\n\n/**\n * Basic HTML sanitizer\n */\nfunction sanitizeHtml(html: string, options: SanitizeOptions): string {\n\t// Use custom handler if provided\n\tif (options.handler) {\n\t\treturn options.handler(html)\n\t}\n\n\t// Create a temporary element for parsing\n\tconst temp = document.createElement('div')\n\n\ttemp.innerHTML = html\n\n\t// Remove dangerous tags\n\tfor (const tag of DANGEROUS_TAGS) {\n\t\tconst elements = temp.getElementsByTagName(tag)\n\n\t\twhile (elements.length > 0) {\n\t\t\telements[0].parentNode?.removeChild(elements[0])\n\t\t}\n\t}\n\n\t// Process all elements\n\tconst processElement = (el: Element): void => {\n\t\t// Check if tag is allowed\n\t\tconst tagName = el.tagName.toLowerCase()\n\n\t\tif (options.allowedTags && !options.allowedTags.includes(tagName)) {\n\t\t\t// Replace with text content\n\t\t\tconst text = document.createTextNode(el.textContent || '')\n\n\t\t\tel.parentNode?.replaceChild(text, el)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Remove dangerous attributes\n\t\tfor (const attr of DANGEROUS_ATTRIBUTES) {\n\t\t\tel.removeAttribute(attr)\n\t\t}\n\n\t\t// Remove javascript: URLs\n\t\tconst href = el.getAttribute('href')\n\n\t\tif (href && href.toLowerCase().startsWith('javascript:')) {\n\t\t\tel.removeAttribute('href')\n\t\t}\n\n\t\t// Remove data: URLs if not allowed\n\t\tif (!options.allowDataUrls) {\n\t\t\tconst src = el.getAttribute('src')\n\n\t\t\tif (src && src.toLowerCase().startsWith('data:')) {\n\t\t\t\tel.removeAttribute('src')\n\t\t\t}\n\t\t}\n\n\t\t// Filter attributes\n\t\tif (options.allowedAttributes) {\n\t\t\tconst attrs = Array.from(el.attributes)\n\n\t\t\tfor (const attr of attrs) {\n\t\t\t\tconst isAllowed = options.allowedAttributes.includes(attr.name.toLowerCase())\n\t\t\t\tconst isClass = attr.name === 'class' && options.allowClass\n\t\t\t\tconst isId = attr.name === 'id' && options.allowId\n\t\t\t\tconst isStyle = attr.name === 'style' && options.allowStyles\n\n\t\t\t\tif (!isAllowed && !isClass && !isId && !isStyle) {\n\t\t\t\t\tel.removeAttribute(attr.name)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process children\n\t\tfor (const child of Array.from(el.children)) {\n\t\t\tprocessElement(child)\n\t\t}\n\t}\n\n\t// Process all child elements\n\tfor (const child of Array.from(temp.children)) {\n\t\tprocessElement(child)\n\t}\n\n\treturn temp.innerHTML\n}\n\n/**\n * v-sanitize directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-sanitize v-html=\"userContent\"></div>\n * <div v-sanitize=\"{ allowedTags: ['b', 'i', 'p'] }\" v-html=\"userContent\"></div>\n * <div v-sanitize=\"{ handler: customSanitizer }\" v-html=\"userContent\"></div>\n * </template>\n * ```\n */\nexport const vSanitize = defineDirective<SanitizeBinding, HTMLElement>({\n\tname: 'sanitize',\n\tssr: true,\n\tdefaults: {\n\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\tallowDataUrls: false,\n\t\tallowStyles: false,\n\t\tallowClass: false,\n\t\tallowId: false,\n\t\tdisabled: false,\n\t\tsanitizeOnUpdate: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Store options\n\t\t;(el as any).__sanitize = { options }\n\n\t\t// Sanitize initial content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, options)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__sanitize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.disabled || !state.options.sanitizeOnUpdate) return\n\n\t\t// Sanitize updated content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, state.options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__sanitize\n\t},\n})\n\nexport default vSanitize\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Scroll event handler\n */\nexport type ScrollHandler = (event: Event, info: ScrollInfo) => void\n\n/**\n * Scroll information\n */\nexport interface ScrollInfo {\n\t/** Current scroll left position */\n\tscrollLeft: number\n\t/** Current scroll top position */\n\tscrollTop: number\n\t/** Maximum scroll left */\n\tscrollLeftMax: number\n\t/** Maximum scroll top */\n\tscrollTopMax: number\n\t/** Horizontal scroll progress (0-1) */\n\tprogressX: number\n\t/** Vertical scroll progress (0-1) */\n\tprogressY: number\n\t/** Direction of horizontal scroll (-1: left, 1: right, 0: none) */\n\tdirectionX: -1 | 0 | 1\n\t/** Direction of vertical scroll (-1: up, 1: down, 0: none) */\n\tdirectionY: -1 | 0 | 1\n\t/** Scroll container element or window */\n\tcontainer: Element | Window\n}\n\n/**\n * Scroll directive options\n */\nexport interface ScrollOptions {\n\t/**\n\t * Scroll event handler\n\t * @required\n\t */\n\thandler: ScrollHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use passive event listener\n\t * @default true\n\t */\n\tpassive?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 0 (no throttle)\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container selector or element\n\t */\n\tcontainer?: string | Element | Window | null\n}\n\n/**\n * Directive binding value type\n */\nexport type ScrollBinding = ScrollHandler | ScrollOptions\n\n/**\n * Element state storage\n */\ninterface ScrollState {\n\toptions: ScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tlastScrollLeft: number\n\tlastScrollTop: number\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tpendingEvent: Event | null\n}\n\n/**\n * Get scroll info\n */\nfunction getScrollInfo(container: Element | Window, lastScrollLeft: number, lastScrollTop: number): ScrollInfo {\n\tlet scrollLeft = 0,\n\t\tscrollTop = 0,\n\t\tscrollLeftMax = 0,\n\t\tscrollTopMax = 0\n\n\tif (container === window) {\n\t\tscrollLeft = window.scrollX || document.documentElement.scrollLeft\n\t\tscrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tscrollLeftMax = document.documentElement.scrollWidth - window.innerWidth\n\t\tscrollTopMax = document.documentElement.scrollHeight - window.innerHeight\n\t} else {\n\t\tconst el = container as Element\n\n\t\tscrollLeft = el.scrollLeft\n\t\tscrollTop = el.scrollTop\n\t\tscrollLeftMax = el.scrollWidth - el.clientWidth\n\t\tscrollTopMax = el.scrollHeight - el.clientHeight\n\t}\n\n\tconst progressX = scrollLeftMax > 0 ? scrollLeft / scrollLeftMax : 0\n\tconst progressY = scrollTopMax > 0 ? scrollTop / scrollTopMax : 0\n\n\t// Calculate direction\n\tconst directionX: -1 | 0 | 1 = scrollLeft !== lastScrollLeft ? (scrollLeft > lastScrollLeft ? 1 : -1) : 0\n\tconst directionY: -1 | 0 | 1 = scrollTop !== lastScrollTop ? (scrollTop > lastScrollTop ? 1 : -1) : 0\n\n\treturn {\n\t\tscrollLeft,\n\t\tscrollTop,\n\t\tscrollLeftMax,\n\t\tscrollTopMax,\n\t\tprogressX,\n\t\tprogressY,\n\t\tdirectionX,\n\t\tdirectionY,\n\t\tcontainer,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ScrollBinding | undefined): ScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, passive: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-scroll=\"handleScroll\">Scroll container</div>\n * <div v-scroll=\"{ handler: handleScroll, throttle: 100 }\">Throttled scroll</div>\n * </template>\n * ```\n */\nexport const vScroll = defineDirective<ScrollBinding, HTMLElement>({\n\tname: 'scroll',\n\tssr: false,\n\tdefaults: {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (options.container === window) {\n\t\t\t\tcontainer = window\n\t\t\t} else if (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\t// Check if element itself is scrollable\n\t\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(el)\n\t\t\tconst isSelfScrollable = /(auto|scroll)/.test(overflow + overflowX + overflowY)\n\n\t\t\tcontainer = isSelfScrollable ? el : getScrollParent(el)\n\t\t}\n\n\t\tconst state: ScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tlastScrollLeft: 0,\n\t\t\tlastScrollTop: 0,\n\t\t\tthrottleTimer: null,\n\t\t\tpendingEvent: null,\n\t\t\tscrollHandler: (e: Event) => {\n\t\t\t\t// Handle throttle\n\t\t\t\tif (options.throttle && options.throttle > 0) {\n\t\t\t\t\tstate.pendingEvent = e\n\n\t\t\t\t\tif (!state.throttleTimer) {\n\t\t\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEvent) {\n\t\t\t\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEvent, info)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t\t\t\tstate.pendingEvent = null\n\t\t\t\t\t\t}, options.throttle)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\toptions.handler(e, info)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Initialize last scroll position\n\t\tconst initialInfo = getScrollInfo(container, 0, 0)\n\n\t\tstate.lastScrollLeft = initialInfo.scrollLeft\n\t\tstate.lastScrollTop = initialInfo.scrollTop\n\n\t\t// Store state\n\t\t;(el as any).__scroll = state\n\n\t\t// Bind scroll event\n\t\ton(container, 'scroll', state.scrollHandler, { passive: options.passive })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Unbind scroll event\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__scroll\n\t},\n})\n\nexport default vScroll\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\nconst STATE_KEY = '__sticky' as const\n\n/**\n * Sticky directive options\n */\nexport interface StickyOptions {\n\t/** Top offset when sticky @default 0 */\n\ttop?: number | string\n\t/** Bottom offset when sticky */\n\tbottom?: number | string\n\t/** Z-index when sticky @default 100 */\n\tzIndex?: number\n\t/** CSS class to add when sticky @default 'v-sticky--fixed' */\n\tstickyClass?: string\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Callback when sticky state changes */\n\tonChange?: (isSticky: boolean) => void\n\t/** Custom scroll container */\n\tcontainer?: string | Element | null\n}\n\nexport type StickyBinding = boolean | number | StickyOptions\n\ninterface StickyState {\n\toptions: StickyOptions\n\tplaceholder: HTMLDivElement | null\n\toriginalStyles: { position: string, top: string, bottom: string, zIndex: string, width: string }\n\tisSticky: boolean\n\tscrollHandler: () => void\n\tresizeHandler: () => void\n\tcontainer: Element | Window\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: StickyBinding | undefined): StickyOptions {\n\tif (binding === false) return { disabled: true, top: 0, zIndex: 100 }\n\tif (typeof binding === 'number') return { top: binding, zIndex: 100 }\n\n\treturn {\n\t\ttop: 0,\n\t\tzIndex: 100,\n\t\tstickyClass: 'v-sticky--fixed',\n\t\tdisabled: false,\n\t\t...(binding && typeof binding === 'object' ? binding : {}),\n\t}\n}\n\n/**\n * Parse offset value to CSS string\n */\nfunction parseOffset(value: number | string | undefined): string {\n\tif (value === undefined) return '0'\n\n\treturn typeof value === 'number' ? `${value}px` : value\n}\n\n/**\n * Get scroll container for element\n */\nfunction getScrollContainer(el: HTMLElement, customContainer?: string | Element | null): Element | Window {\n\tif (customContainer) {\n\t\tif (typeof customContainer === 'string') {\n\t\t\treturn document.querySelector(customContainer) || getScrollParent(el)\n\t\t}\n\n\t\treturn customContainer\n\t}\n\n\t// Check if parent element is scrollable\n\tconst parent = el.parentElement\n\n\tif (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\t}\n\n\treturn getScrollParent(el)\n}\n\n/**\n * Check and update sticky state\n */\nfunction checkSticky(el: HTMLElement, state: StickyState): void {\n\tif (state.options.disabled) {\n\t\tunsetSticky(el, state)\n\n\t\treturn\n\t}\n\n\tconst topOffset = parseFloat(parseOffset(state.options.top))\n\tconst containerRect = state.container === window ? { top: 0 } : (state.container as Element).getBoundingClientRect()\n\n\t// Use placeholder position when sticky, otherwise use element position\n\tconst referenceEl = state.placeholder || el\n\tconst rect = referenceEl.getBoundingClientRect()\n\tconst elementTopRelativeToContainer = rect.top - containerRect.top\n\n\tconst shouldSticky = elementTopRelativeToContainer <= topOffset\n\n\tif (shouldSticky && !state.isSticky) {\n\t\tsetSticky(el, state, topOffset, containerRect.top)\n\t} else if (!shouldSticky && state.isSticky) {\n\t\tunsetSticky(el, state)\n\t}\n}\n\n/**\n * Set element as sticky\n */\nfunction setSticky(el: HTMLElement, state: StickyState, topOffset: number, containerTop: number): void {\n\tstate.isSticky = true\n\n\t// Create placeholder to maintain layout\n\tconst placeholder = document.createElement('div')\n\n\tplaceholder.style.cssText = `width:${el.offsetWidth}px;height:${el.offsetHeight}px`\n\tel.parentNode?.insertBefore(placeholder, el)\n\tstate.placeholder = placeholder\n\n\t// Calculate fixed top position relative to viewport\n\tconst fixedTop = state.container === window ? topOffset : containerTop + topOffset\n\n\t// Apply sticky styles\n\tel.style.position = 'fixed'\n\tel.style.top = `${fixedTop}px`\n\tel.style.zIndex = String(state.options.zIndex || 100)\n\tel.style.width = `${el.offsetWidth}px`\n\n\tif (state.options.bottom !== undefined) {\n\t\tel.style.bottom = parseOffset(state.options.bottom)\n\t}\n\n\tstate.options.stickyClass && el.classList.add(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: true } }))\n\tstate.options.onChange?.(true)\n}\n\n/**\n * Unset element as sticky\n */\nfunction unsetSticky(el: HTMLElement, state: StickyState): void {\n\tif (!state.isSticky) return\n\n\tstate.isSticky = false\n\n\t// Remove placeholder\n\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\tstate.placeholder = null\n\n\t// Restore original styles\n\tObject.assign(el.style, state.originalStyles)\n\n\tstate.options.stickyClass && el.classList.remove(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: false } }))\n\tstate.options.onChange?.(false)\n}\n\n/**\n * v-sticky directive\n *\n * @example\n * ```vue\n * <div v-sticky>Sticky header</div>\n * <div v-sticky=\"50\">Sticky with 50px top offset</div>\n * <div v-sticky=\"{ top: 60, zIndex: 1000 }\">Custom sticky</div>\n * ```\n */\nexport const vSticky = defineDirective<StickyBinding, HTMLElement>({\n\tname: 'sticky',\n\tssr: false,\n\tdefaults: { top: 0, zIndex: 100, stickyClass: 'v-sticky--fixed', disabled: false },\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst container = getScrollContainer(el, options.container)\n\n\t\tconst state: StickyState = {\n\t\t\toptions,\n\t\t\tplaceholder: null,\n\t\t\toriginalStyles: {\n\t\t\t\tposition: el.style.position,\n\t\t\t\ttop: el.style.top,\n\t\t\t\tbottom: el.style.bottom,\n\t\t\t\tzIndex: el.style.zIndex,\n\t\t\t\twidth: el.style.width,\n\t\t\t},\n\t\t\tisSticky: false,\n\t\t\tcontainer,\n\t\t\tscrollHandler: () => checkSticky(el, state),\n\t\t\tresizeHandler: () => checkSticky(el, state),\n\t\t}\n\n\t\tel.classList.add('v-sticky')\n\t\t;(el as any)[STATE_KEY] = state\n\n\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\ton(window, 'resize', state.resizeHandler, { passive: true })\n\t\tcheckSticky(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tcheckSticky(el, state)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\n\t\tObject.assign(el.style, state.originalStyles)\n\t\tel.classList.remove('v-sticky', state.options.stickyClass || 'v-sticky--fixed')\n\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\t\toff(window, 'resize', state.resizeHandler)\n\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vSticky\n","import { defineDirective } from '@directix/core'\n\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\nexport type SwipeHandler = (direction: SwipeDirection, event: Event) => void\n\nexport interface SwipeOptions {\n\thandler?: SwipeHandler\n\tthreshold?: number\n\tmaxTime?: number\n\tdirections?: SwipeDirection[]\n\tpreventScrollOnSwipe?: boolean\n\tdisabled?: boolean\n\tmouse?: boolean\n\tonLeft?: () => void\n\tonRight?: () => void\n\tonUp?: () => void\n\tonDown?: () => void\n}\n\nexport type SwipeBinding = SwipeHandler | SwipeOptions\n\ninterface SwipeState {\n\toptions: SwipeOptions\n\tstartX: number\n\tstartY: number\n\tstartTime: number\n\tisActive: boolean\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: (e: TouchEvent) => void\n\t\tmouseDown: (e: MouseEvent) => void\n\t\tmouseUp: (e: MouseEvent) => void\n\t}\n}\n\nconst DEFAULT_THRESHOLD = 30\nconst DEFAULT_MAX_TIME = 500\nconst DEFAULT_DIRECTIONS: SwipeDirection[] = ['left', 'right', 'up', 'down']\n\nfunction getSwipeDirection(\n\tdeltaX: number,\n\tdeltaY: number,\n\tallowedDirections: SwipeDirection[],\n): SwipeDirection | null {\n\tconst absX = Math.abs(deltaX)\n\tconst absY = Math.abs(deltaY)\n\n\tif (absX > absY) {\n\t\tconst direction = deltaX > 0 ? 'right' : 'left'\n\t\treturn allowedDirections.includes(direction) ? direction : null\n\t} else {\n\t\tconst direction = deltaY > 0 ? 'down' : 'up'\n\t\treturn allowedDirections.includes(direction) ? direction : null\n\t}\n}\n\nfunction normalizeOptions(binding: SwipeBinding): SwipeOptions {\n\tif (typeof binding === 'function') return { handler: binding }\n\n\treturn {\n\t\thandler: binding.handler,\n\t\tthreshold: binding.threshold ?? DEFAULT_THRESHOLD,\n\t\tmaxTime: binding.maxTime ?? DEFAULT_MAX_TIME,\n\t\tdirections: binding.directions ?? [...DEFAULT_DIRECTIONS],\n\t\tpreventScrollOnSwipe: binding.preventScrollOnSwipe ?? true,\n\t\tdisabled: binding.disabled ?? false,\n\t\tmouse: binding.mouse ?? true,\n\t\tonLeft: binding.onLeft,\n\t\tonRight: binding.onRight,\n\t\tonUp: binding.onUp,\n\t\tonDown: binding.onDown,\n\t}\n}\n\nfunction triggerSwipe(\n\tstate: SwipeState,\n\tdeltaX: number,\n\tdeltaY: number,\n\tdeltaTime: number,\n\tevent: Event,\n\tel: HTMLElement,\n): void {\n\tconst { options } = state\n\n\t// Check time\n\tif (deltaTime > (options.maxTime ?? DEFAULT_MAX_TIME)) return\n\n\t// Check distance\n\tconst distance = Math.max(Math.abs(deltaX), Math.abs(deltaY))\n\tif (distance < (options.threshold ?? DEFAULT_THRESHOLD)) return\n\n\t// Get direction\n\tconst direction = getSwipeDirection(deltaX, deltaY, options.directions ?? DEFAULT_DIRECTIONS)\n\tif (!direction) return\n\n\t// Prevent scroll\n\tif (options.preventScrollOnSwipe && event.cancelable) {\n\t\tevent.preventDefault()\n\t}\n\n\t// Call handlers\n\toptions.handler?.(direction, event)\n\n\t// Direction-specific callbacks\n\tconst callbacks: Record<SwipeDirection, (() => void) | undefined> = {\n\t\tleft: options.onLeft,\n\t\tright: options.onRight,\n\t\tup: options.onUp,\n\t\tdown: options.onDown,\n\t}\n\tcallbacks[direction]?.()\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('swipe', { detail: { direction, deltaX, deltaY, deltaTime } }))\n}\n\nfunction createSwipeHandler(\n\tel: HTMLElement,\n\tstate: SwipeState,\n): (clientX: number, clientY: number, event: Event) => void {\n\treturn (clientX, clientY, event) => {\n\t\tconst deltaX = clientX - state.startX\n\t\tconst deltaY = clientY - state.startY\n\t\tconst deltaTime = Date.now() - state.startTime\n\t\ttriggerSwipe(state, deltaX, deltaY, deltaTime, event, el)\n\t}\n}\n\nfunction setupState(el: HTMLElement, options: SwipeOptions): SwipeState | null {\n\tif (options.disabled) return null\n\n\tel.style.touchAction = 'none'\n\tel.style.userSelect = 'none'\n\n\tconst state: SwipeState = {\n\t\toptions,\n\t\tstartX: 0,\n\t\tstartY: 0,\n\t\tstartTime: 0,\n\t\tisActive: false,\n\t\thandlers: null as any,\n\t}\n\n\tconst handleSwipe = createSwipeHandler(el, state)\n\n\tstate.handlers = {\n\t\ttouchStart: (e: TouchEvent) => {\n\t\t\tif (state.options.disabled) return\n\t\t\tstate.startX = e.touches[0].clientX\n\t\t\tstate.startY = e.touches[0].clientY\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isActive = true\n\t\t},\n\n\t\ttouchMove: (e: TouchEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tif (state.options.preventScrollOnSwipe) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\t\t},\n\n\t\ttouchEnd: (e: TouchEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tstate.isActive = false\n\t\t\tconst touch = e.changedTouches[0]\n\t\t\thandleSwipe(touch.clientX, touch.clientY, e)\n\t\t},\n\n\t\tmouseDown: (e: MouseEvent) => {\n\t\t\tif (state.options.disabled) return\n\t\t\tstate.startX = e.clientX\n\t\t\tstate.startY = e.clientY\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isActive = true\n\t\t},\n\n\t\tmouseUp: (e: MouseEvent) => {\n\t\t\tif (!state.isActive || state.options.disabled) return\n\t\t\tstate.isActive = false\n\t\t\thandleSwipe(e.clientX, e.clientY, e)\n\t\t},\n\t}\n\n\treturn state\n}\n\nfunction bindEvents(el: HTMLElement, state: SwipeState): void {\n\tconst { handlers } = state\n\tconst enableMouse = state.options.mouse ?? true\n\n\tel.addEventListener('touchstart', handlers.touchStart, { passive: true })\n\tel.addEventListener('touchmove', handlers.touchMove, { passive: false })\n\tel.addEventListener('touchend', handlers.touchEnd)\n\tel.addEventListener('touchcancel', handlers.touchEnd)\n\n\tif (enableMouse) {\n\t\tel.addEventListener('mousedown', handlers.mouseDown)\n\t\tel.addEventListener('mouseup', handlers.mouseUp)\n\t\tel.addEventListener('mouseleave', handlers.mouseUp)\n\t}\n}\n\nfunction unbindEvents(el: HTMLElement, state: SwipeState): void {\n\tconst { handlers } = state\n\tconst enableMouse = state.options.mouse ?? true\n\n\tel.removeEventListener('touchstart', handlers.touchStart)\n\tel.removeEventListener('touchmove', handlers.touchMove)\n\tel.removeEventListener('touchend', handlers.touchEnd)\n\tel.removeEventListener('touchcancel', handlers.touchEnd)\n\n\tif (enableMouse) {\n\t\tel.removeEventListener('mousedown', handlers.mouseDown)\n\t\tel.removeEventListener('mouseup', handlers.mouseUp)\n\t\tel.removeEventListener('mouseleave', handlers.mouseUp)\n\t}\n}\n\nexport const vSwipe = defineDirective<SwipeBinding, HTMLElement>({\n\tname: 'swipe',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state = setupState(el, options)\n\t\tif (!state) return\n\n\t\t;(el as any).__swipe = state\n\t\tbindEvents(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: SwipeState | undefined = (el as any).__swipe\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (!state) {\n\t\t\tconst newState = setupState(el, newOptions)\n\t\t\tif (newState) {\n\t\t\t\t;(el as any).__swipe = newState\n\t\t\t\tbindEvents(el, newState)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst wasDisabled = state.options.disabled\n\t\tconst wasMouseEnabled = state.options.mouse ?? true\n\t\tconst nowMouseEnabled = newOptions.mouse ?? true\n\n\t\tstate.options = newOptions\n\n\t\tif (newOptions.disabled && !wasDisabled) {\n\t\t\tunbindEvents(el, state)\n\t\t} else if (!newOptions.disabled && wasDisabled) {\n\t\t\tbindEvents(el, state)\n\t\t} else if (wasMouseEnabled !== nowMouseEnabled) {\n\t\t\tif (wasMouseEnabled) {\n\t\t\t\tel.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\t\t\tel.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\t\t\tel.removeEventListener('mouseleave', state.handlers.mouseUp)\n\t\t\t}\n\t\t\tif (nowMouseEnabled) {\n\t\t\t\tel.addEventListener('mousedown', state.handlers.mouseDown)\n\t\t\t\tel.addEventListener('mouseup', state.handlers.mouseUp)\n\t\t\t\tel.addEventListener('mouseleave', state.handlers.mouseUp)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: SwipeState | undefined = (el as any).__swipe\n\t\tif (!state) return\n\n\t\tunbindEvents(el, state)\n\t\tdelete (el as any).__swipe\n\t},\n})\n\nexport default vSwipe\n","import type { DirectiveBinding } from '@directix/core'\nimport { defineDirective } from '@directix/core'\nimport { parseTime, throttle } from '@directix/shared'\nimport { getDefaultEventType, getEventTypeFromModifiers } from '../utils/event'\n\n/**\n * Throttled function type\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n}\n\n/**\n * Throttle directive options\n */\nexport interface ThrottleOptions<T extends (...args: any[]) => any = any> {\n\t/**\n\t * Function to throttle\n\t */\n\thandler: T\n\n\t/**\n\t * Delay time in milliseconds\n\t * @default 300\n\t */\n\twait?: number\n\n\t/**\n\t * Whether to invoke immediately before delay starts\n\t * @default true\n\t */\n\tleading?: boolean\n\n\t/**\n\t * Whether to invoke after delay ends\n\t * @default true\n\t */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ThrottleBinding<T extends (...args: any[]) => any = any>\n\t= | T\n\t\t| ThrottleOptions<T>\n\n/**\n * Element state storage\n */\ninterface ThrottleState {\n\tthrottledFn: ThrottledFunction<any>\n\teventType: string\n\toptions: ThrottleOptions\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ThrottleBinding,\n\tdirectiveBinding: DirectiveBinding<ThrottleBinding>,\n): ThrottleOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * v-throttle directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-throttle=\"handleClick\">Throttled Button</button>\n * <button v-throttle:1s=\"handleClick\">1s Throttled</button>\n * <div v-throttle.scroll=\"handleScroll\">Scroll Throttle</div>\n * <div v-throttle:100.scroll=\"handleScroll\">100ms Scroll Throttle</div>\n * </template>\n * ```\n */\nexport const vThrottle = defineDirective<ThrottleBinding, HTMLElement>({\n\tname: 'throttle',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: true,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getDefaultEventType(el)\n\n\t\t// Create throttled function\n\t\tconst throttledFn = throttle(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, throttledFn as any)\n\n\t\t;(el as any).__throttle = {\n\t\t\tthrottledFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate throttled function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait\n\t\t\t|| newOptions.leading !== state.options.leading\n\t\t\t|| newOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.throttledFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst throttledFn = throttle(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\t\tel.addEventListener(state.eventType, throttledFn as any)\n\n\t\t\t;(el as any).__throttle = {\n\t\t\t\tthrottledFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tstate.throttledFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\tdelete (el as any).__throttle\n\t},\n})\n\nexport default vThrottle\n","import { defineDirective } from '@directix/core'\n\n/**\n * Tooltip placement\n */\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right'\n\n/**\n * Tooltip trigger\n */\nexport type TooltipTrigger = 'hover' | 'click' | 'focus' | 'manual'\n\n/**\n * Tooltip directive options\n */\nexport interface TooltipOptions {\n\t/** Tooltip content */\n\tcontent: string\n\t/** Tooltip placement @default 'top' */\n\tplacement?: TooltipPlacement\n\t/** Trigger type @default 'hover' */\n\ttrigger?: TooltipTrigger\n\t/** Show delay in milliseconds @default 0 */\n\tdelay?: number\n\t/** Hide delay in milliseconds @default 0 */\n\thideDelay?: number\n\t/** Offset from the element in pixels @default 8 */\n\toffset?: number\n\t/** Custom class for the tooltip */\n\tclass?: string\n\t/** Whether to show arrow @default true */\n\tarrow?: boolean\n\t/** Whether the tooltip is disabled @default false */\n\tdisabled?: boolean\n\t/** Maximum width of the tooltip */\n\tmaxWidth?: number | string\n\t/** Z-index of the tooltip @default 9999 */\n\tzIndex?: number\n\t/** Callback when tooltip is shown */\n\tonShow?: () => void\n\t/** Callback when tooltip is hidden */\n\tonHide?: () => void\n}\n\nexport type TooltipBinding = string | TooltipOptions\n\ninterface TooltipState {\n\toptions: TooltipOptions\n\ttooltip: HTMLElement | null\n\tshowTimeout: ReturnType<typeof setTimeout> | null\n\thideTimeout: ReturnType<typeof setTimeout> | null\n\tisVisible: boolean\n\thandlers: {\n\t\tshow?: () => void\n\t\thide?: () => void\n\t\ttoggle?: () => void\n\t\tdocHide?: (e: Event) => void\n\t}\n}\n\n// Default tooltip styles\nconst TOOLTIP_STYLES = {\n\tpadding: '8px 12px',\n\tbackground: '#333',\n\tcolor: '#fff',\n\tborderRadius: '6px',\n\tfontSize: '14px',\n\tlineHeight: '1.5',\n\tminWidth: '96px',\n\tmaxWidth: '320px',\n\tboxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n}\n\n// Global tooltip container\nlet tooltipContainer: HTMLElement | null = null\n\nfunction getTooltipContainer(): HTMLElement {\n\tif (!tooltipContainer && typeof document !== 'undefined') {\n\t\ttooltipContainer = document.createElement('div')\n\t\ttooltipContainer.id = 'directix-tooltip-container'\n\t\ttooltipContainer.style.cssText = 'position: fixed; top: 0; left: 0; pointer-events: none; z-index: 9999;'\n\t\tdocument.body.appendChild(tooltipContainer)\n\t}\n\n\treturn tooltipContainer!\n}\n\nfunction createTooltip(options: TooltipOptions): HTMLElement {\n\tconst tooltip = document.createElement('div')\n\n\ttooltip.className = `v-tooltip v-tooltip--${options.placement || 'top'}`\n\tif (options.class) tooltip.classList.add(options.class)\n\n\tconst maxWidth = options.maxWidth ? typeof options.maxWidth === 'number' ? `${options.maxWidth}px` : options.maxWidth : TOOLTIP_STYLES.maxWidth\n\n\ttooltip.style.cssText = [\n\t\t'position: absolute',\n\t\t`padding: ${TOOLTIP_STYLES.padding}`,\n\t\t`background: ${TOOLTIP_STYLES.background}`,\n\t\t`color: ${TOOLTIP_STYLES.color}`,\n\t\t`border-radius: ${TOOLTIP_STYLES.borderRadius}`,\n\t\t`font-size: ${TOOLTIP_STYLES.fontSize}`,\n\t\t`line-height: ${TOOLTIP_STYLES.lineHeight}`,\n\t\t`min-width: ${TOOLTIP_STYLES.minWidth}`,\n\t\t`max-width: ${maxWidth}`,\n\t\t'word-wrap: break-word',\n\t\t`box-shadow: ${TOOLTIP_STYLES.boxShadow}`,\n\t\t'pointer-events: none',\n\t\t'opacity: 0',\n\t\t'transition: opacity 0.2s ease',\n\t\t`z-index: ${options.zIndex || 9999}`,\n\t].join(';')\n\n\t// Add arrow\n\tif (options.arrow !== false) {\n\t\tconst arrow = document.createElement('div')\n\n\t\tarrow.className = 'v-tooltip__arrow'\n\t\tarrow.style.cssText = 'position: absolute; width: 8px; height: 8px; background: #333; transform: rotate(45deg);'\n\t\ttooltip.appendChild(arrow)\n\t}\n\n\t// Add content\n\tconst content = document.createElement('div')\n\n\tcontent.className = 'v-tooltip__content'\n\tcontent.textContent = options.content\n\ttooltip.appendChild(content)\n\n\treturn tooltip\n}\n\nfunction positionTooltip(\n\ttooltip: HTMLElement,\n\tel: HTMLElement,\n\tplacement: TooltipPlacement,\n\toffset: number,\n): void {\n\tconst elRect = el.getBoundingClientRect()\n\tconst tooltipRect = tooltip.getBoundingClientRect()\n\n\tlet top = 0,\n\t\tleft = 0\n\n\tswitch (placement) {\n\t\tcase 'top':\n\t\t\ttop = elRect.top - tooltipRect.height - offset\n\t\t\tleft = elRect.left + (elRect.width - tooltipRect.width) / 2\n\t\t\tbreak\n\t\tcase 'bottom':\n\t\t\ttop = elRect.bottom + offset\n\t\t\tleft = elRect.left + (elRect.width - tooltipRect.width) / 2\n\t\t\tbreak\n\t\tcase 'left':\n\t\t\ttop = elRect.top + (elRect.height - tooltipRect.height) / 2\n\t\t\tleft = elRect.left - tooltipRect.width - offset\n\t\t\tbreak\n\t\tcase 'right':\n\t\t\ttop = elRect.top + (elRect.height - tooltipRect.height) / 2\n\t\t\tleft = elRect.right + offset\n\t\t\tbreak\n\t}\n\n\t// Keep within viewport\n\tconst viewportWidth = window.innerWidth\n\tconst viewportHeight = window.innerHeight\n\n\tif (left < 0) left = 8\n\tif (left + tooltipRect.width > viewportWidth) left = viewportWidth - tooltipRect.width - 8\n\tif (top < 0) top = 8\n\tif (top + tooltipRect.height > viewportHeight) top = viewportHeight - tooltipRect.height - 8\n\n\ttooltip.style.top = `${top}px`\n\ttooltip.style.left = `${left}px`\n\n\t// Position arrow\n\tconst arrow = tooltip.querySelector('.v-tooltip__arrow') as HTMLElement\n\n\tif (arrow) {\n\t\tconst halfArrow = 4\n\n\t\tswitch (placement) {\n\t\t\tcase 'top':\n\t\t\t\tObject.assign(arrow.style, { bottom: `-${halfArrow}px`, left: '50%', transform: 'translateX(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'bottom':\n\t\t\t\tObject.assign(arrow.style, { top: `-${halfArrow}px`, left: '50%', transform: 'translateX(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'left':\n\t\t\t\tObject.assign(arrow.style, { right: `-${halfArrow}px`, top: '50%', transform: 'translateY(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t\tcase 'right':\n\t\t\t\tObject.assign(arrow.style, { left: `-${halfArrow}px`, top: '50%', transform: 'translateY(-50%) rotate(45deg)' })\n\t\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunction showTooltip(el: HTMLElement, state: TooltipState): void {\n\tif (state.isVisible || state.options.disabled) return\n\n\tif (state.hideTimeout) {\n\t\tclearTimeout(state.hideTimeout)\n\t\tstate.hideTimeout = null\n\t}\n\n\tconst doShow = (): void => {\n\t\tconst tooltip = createTooltip(state.options)\n\n\t\tstate.tooltip = tooltip\n\t\tgetTooltipContainer().appendChild(tooltip)\n\n\t\trequestAnimationFrame(() => {\n\t\t\tpositionTooltip(tooltip, el, state.options.placement || 'top', state.options.offset || 8)\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\ttooltip.style.opacity = '1'\n\t\t\t})\n\t\t})\n\n\t\tstate.isVisible = true\n\t\tstate.options.onShow?.()\n\t}\n\n\tif (state.options.delay && state.options.delay > 0) {\n\t\tstate.showTimeout = setTimeout(doShow, state.options.delay)\n\t} else {\n\t\tdoShow()\n\t}\n}\n\nfunction hideTooltip(state: TooltipState): void {\n\tif (!state.isVisible) return\n\n\tif (state.showTimeout) {\n\t\tclearTimeout(state.showTimeout)\n\t\tstate.showTimeout = null\n\t}\n\n\tconst doHide = (): void => {\n\t\tif (state.tooltip) {\n\t\t\tstate.tooltip.style.opacity = '0'\n\t\t\tsetTimeout(() => {\n\t\t\t\tstate.tooltip?.remove()\n\t\t\t\tstate.tooltip = null\n\t\t\t}, 200)\n\t\t}\n\n\t\tstate.isVisible = false\n\t\tstate.options.onHide?.()\n\t}\n\n\tif (state.options.hideDelay && state.options.hideDelay > 0) {\n\t\tstate.hideTimeout = setTimeout(doHide, state.options.hideDelay)\n\t} else {\n\t\tdoHide()\n\t}\n}\n\nfunction setupTriggerHandlers(el: HTMLElement, state: TooltipState): void {\n\tconst { trigger = 'hover' } = state.options\n\n\tconst show = (): void => showTooltip(el, state)\n\tconst hide = (): void => hideTooltip(state)\n\tconst toggle = (): void => (state.isVisible ? hide() : show())\n\n\tstate.handlers = { show, hide, toggle }\n\n\tswitch (trigger) {\n\t\tcase 'hover':\n\t\t\tel.addEventListener('mouseenter', show)\n\t\t\tel.addEventListener('mouseleave', hide)\n\t\t\tbreak\n\t\tcase 'click':\n\t\t\tel.addEventListener('click', toggle)\n\t\t\tdocument.addEventListener('click', state.handlers.docHide = (e: Event) => {\n\t\t\t\tif (state.isVisible && !el.contains(e.target as Node)) hide()\n\t\t\t})\n\t\t\tbreak\n\t\tcase 'focus':\n\t\t\tel.addEventListener('focus', show)\n\t\t\tel.addEventListener('blur', hide)\n\t\t\tbreak\n\t\t// 'manual' - no automatic handlers\n\t}\n}\n\nfunction removeTriggerHandlers(el: HTMLElement, state: TooltipState): void {\n\tconst { show, hide, toggle, docHide } = state.handlers\n\n\tif (show) {\n\t\tel.removeEventListener('mouseenter', show)\n\t\tel.removeEventListener('focus', show)\n\t}\n\tif (hide) {\n\t\tel.removeEventListener('mouseleave', hide)\n\t\tel.removeEventListener('blur', hide)\n\t}\n\tif (toggle) {\n\t\tel.removeEventListener('click', toggle)\n\t}\n\tif (docHide) {\n\t\tdocument.removeEventListener('click', docHide)\n\t}\n}\n\nfunction normalizeOptions(binding: TooltipBinding | undefined): TooltipOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { content: binding, placement: 'top', trigger: 'hover' }\n\t}\n\n\tif (!binding) {\n\t\treturn { content: '', placement: 'top', trigger: 'hover' }\n\t}\n\n\treturn {\n\t\tcontent: binding.content,\n\t\tplacement: binding.placement ?? 'top',\n\t\ttrigger: binding.trigger ?? 'hover',\n\t\tdelay: binding.delay ?? 0,\n\t\thideDelay: binding.hideDelay ?? 0,\n\t\toffset: binding.offset ?? 8,\n\t\tclass: binding.class,\n\t\tarrow: binding.arrow ?? true,\n\t\tdisabled: binding.disabled ?? false,\n\t\tmaxWidth: binding.maxWidth,\n\t\tzIndex: binding.zIndex ?? 9999,\n\t\tonShow: binding.onShow,\n\t\tonHide: binding.onHide,\n\t}\n}\n\nfunction createState(options: TooltipOptions): TooltipState {\n\treturn {\n\t\toptions,\n\t\ttooltip: null,\n\t\tshowTimeout: null,\n\t\thideTimeout: null,\n\t\tisVisible: false,\n\t\thandlers: {},\n\t}\n}\n\nexport const vTooltip = defineDirective<TooltipBinding, HTMLElement>({\n\tname: 'tooltip',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !options.content) return\n\n\t\tconst state = createState(options)\n\n\t\t;(el as any).__tooltip = state\n\t\tsetupTriggerHandlers(el, state)\n\t\tel.setAttribute('aria-describedby', 'v-tooltip')\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TooltipState | undefined = (el as any).__tooltip\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// No state exists - create if needed\n\t\tif (!state) {\n\t\t\tif (!newOptions.disabled && newOptions.content) {\n\t\t\t\tconst newState = createState(newOptions)\n\n\t\t\t\t;(el as any).__tooltip = newState\n\t\t\t\tsetupTriggerHandlers(el, newState)\n\n\t\t\t\tif (newOptions.trigger === 'manual') {\n\t\t\t\t\tshowTooltip(el, newState)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle manual trigger\n\t\tif (newOptions.trigger === 'manual') {\n\t\t\tconst oldDisabled = state.options.disabled\n\n\t\t\tstate.options = newOptions\n\n\t\t\tif (newOptions.disabled && !oldDisabled) {\n\t\t\t\thideTooltip(state)\n\t\t\t} else if (!newOptions.disabled && oldDisabled) {\n\t\t\t\tshowTooltip(el, state)\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Update visible tooltip content\n\t\tif (state.tooltip && state.isVisible) {\n\t\t\tconst content = state.tooltip.querySelector('.v-tooltip__content')\n\n\t\t\tif (content) content.textContent = newOptions.content\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TooltipState | undefined = (el as any).__tooltip\n\n\t\tif (!state) return\n\n\t\tif (state.showTimeout) clearTimeout(state.showTimeout)\n\t\tif (state.hideTimeout) clearTimeout(state.hideTimeout)\n\t\tstate.tooltip?.remove()\n\t\tremoveTriggerHandlers(el, state)\n\t\tdelete (el as any).__tooltip\n\t},\n})\n\nexport default vTooltip\n","import { defineDirective } from '@directix/core'\n\n/**\n * Swipe direction\n */\nexport type SwipeDirection = 'left' | 'right' | 'up' | 'down'\n\n/**\n * Touch gesture options\n */\nexport interface TouchOptions {\n\t/** Minimum swipe distance in pixels @default 30 */\n\tswipeThreshold?: number\n\t/** Maximum time for a swipe in milliseconds @default 500 */\n\tswipeTimeout?: number\n\t/** Minimum pinch scale change @default 0.1 */\n\tpinchThreshold?: number\n\t/** Enable swipe detection @default true */\n\tenableSwipe?: boolean\n\t/** Enable pinch detection @default true */\n\tenablePinch?: boolean\n\t/** Enable rotate detection @default true */\n\tenableRotate?: boolean\n\t/** Enable tap detection @default true */\n\tenableTap?: boolean\n\t/** Maximum time for a tap in milliseconds @default 250 */\n\ttapTimeout?: number\n\t/** Maximum movement for a tap in pixels @default 10 */\n\ttapThreshold?: number\n\t/** Enable long press detection @default true */\n\tenableLongPress?: boolean\n\t/** Long press timeout in milliseconds @default 500 */\n\tlongPressTimeout?: number\n\t/** Enable mouse event simulation for desktop @default true */\n\tenableMouse?: boolean\n\n\tonSwipe?: (direction: SwipeDirection, event: TouchEvent | MouseEvent) => void\n\tonSwipeLeft?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeRight?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeUp?: (event: TouchEvent | MouseEvent) => void\n\tonSwipeDown?: (event: TouchEvent | MouseEvent) => void\n\tonPinch?: (scale: number, event: TouchEvent) => void\n\tonRotate?: (angle: number, event: TouchEvent) => void\n\tonTap?: (event: TouchEvent | MouseEvent) => void\n\tonLongPress?: (event: TouchEvent | MouseEvent) => void\n\tonTouchStart?: (event: TouchEvent | MouseEvent) => void\n\tonTouchMove?: (event: TouchEvent | MouseEvent) => void\n\tonTouchEnd?: (event: TouchEvent | MouseEvent) => void\n}\n\ninterface TouchState {\n\toptions: TouchOptions\n\tstartX: number\n\tstartY: number\n\tstartTime: number\n\tstartDistance: number\n\tstartAngle: number\n\tlastScale: number\n\tlastAngle: number\n\tlongPressTimer: ReturnType<typeof setTimeout> | null\n\tisLongPress: boolean\n\tisMouseDown: boolean\n\tlastTouchEndTime: number\n\thandlers: {\n\t\ttouchStart: (e: TouchEvent) => void\n\t\ttouchMove: (e: TouchEvent) => void\n\t\ttouchEnd: (e: TouchEvent) => void\n\t\tmouseDown?: (e: MouseEvent) => void\n\t\tmouseMove?: (e: MouseEvent) => void\n\t\tmouseUp?: (e: MouseEvent) => void\n\t}\n}\n\nconst getDistance = (x1: number, y1: number, x2: number, y2: number): number =>\n\tMath.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)\n\nconst getAngle = (x1: number, y1: number, x2: number, y2: number): number =>\n\t(Math.atan2(y2 - y1, x2 - x1) * 180) / Math.PI\n\nconst MOUSE_IGNORE_DURATION = 400\n\nexport const vTouch = defineDirective<TouchOptions, HTMLElement>({\n\tname: 'touch',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tconst state: TouchState = {\n\t\t\toptions,\n\t\t\tstartX: 0,\n\t\t\tstartY: 0,\n\t\t\tstartTime: 0,\n\t\t\tstartDistance: 0,\n\t\t\tstartAngle: 0,\n\t\t\tlastScale: 1,\n\t\t\tlastAngle: 0,\n\t\t\tlongPressTimer: null,\n\t\t\tisLongPress: false,\n\t\t\tisMouseDown: false,\n\t\t\tlastTouchEndTime: 0,\n\t\t\thandlers: { touchStart: () => {}, touchMove: () => {}, touchEnd: () => {} },\n\t\t}\n\n\t\t;(el as any).__touch = state\n\n\t\tconst clearLongPressTimer = (): void => {\n\t\t\tif (state.longPressTimer) {\n\t\t\t\tclearTimeout(state.longPressTimer)\n\t\t\t\tstate.longPressTimer = null\n\t\t\t}\n\t\t}\n\n\t\tconst startLongPressTimer = (event: TouchEvent | MouseEvent): void => {\n\t\t\tclearLongPressTimer()\n\t\t\tif (state.options.enableLongPress && state.options.onLongPress) {\n\t\t\t\tstate.longPressTimer = setTimeout(() => {\n\t\t\t\t\tstate.isLongPress = true\n\t\t\t\t\tstate.options.onLongPress!(event)\n\t\t\t\t}, state.options.longPressTimeout || 500)\n\t\t\t}\n\t\t}\n\n\t\tconst exceedsThreshold = (x: number, y: number): boolean => {\n\t\t\tconst threshold = state.options.tapThreshold || 10\n\t\t\treturn Math.abs(x - state.startX) > threshold || Math.abs(y - state.startY) > threshold\n\t\t}\n\n\t\tconst handleGestureEnd = (endX: number, endY: number, event: TouchEvent | MouseEvent): void => {\n\t\t\tif (state.isLongPress) return\n\n\t\t\tconst duration = Date.now() - state.startTime\n\t\t\tconst deltaX = endX - state.startX\n\t\t\tconst deltaY = endY - state.startY\n\t\t\tconst distance = Math.sqrt(deltaX ** 2 + deltaY ** 2)\n\n\t\t\t// Swipe detection\n\t\t\tif (\n\t\t\t\tstate.options.enableSwipe\n\t\t\t\t&& distance >= (state.options.swipeThreshold || 30)\n\t\t\t\t&& duration <= (state.options.swipeTimeout || 500)\n\t\t\t) {\n\t\t\t\tconst direction: SwipeDirection = Math.abs(deltaX) > Math.abs(deltaY) ? (deltaX > 0 ? 'right' : 'left') : (deltaY > 0 ? 'down' : 'up')\n\n\t\t\t\tstate.options.onSwipe?.(direction, event)\n\t\t\t\tif (direction === 'left') state.options.onSwipeLeft?.(event)\n\t\t\t\telse if (direction === 'right') state.options.onSwipeRight?.(event)\n\t\t\t\telse if (direction === 'up') state.options.onSwipeUp?.(event)\n\t\t\t\telse state.options.onSwipeDown?.(event)\n\t\t\t} else if (\n\t\t\t\tstate.options.enableTap\n\t\t\t\t&& distance < (state.options.tapThreshold || 10)\n\t\t\t\t&& duration < (state.options.tapTimeout || 250)\n\t\t\t) {\n\t\t\t\tstate.options.onTap?.(event)\n\t\t\t}\n\t\t}\n\n\t\t// Touch handlers\n\t\tconst handleTouchStart = (e: TouchEvent): void => {\n\t\t\t// Prevent page zoom on multi-touch\n\t\t\tif (e.touches.length > 1) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.isLongPress = false\n\n\t\t\tif (e.touches.length === 1) {\n\t\t\t\tstate.startX = e.touches[0].clientX\n\t\t\t\tstate.startY = e.touches[0].clientY\n\t\t\t\tstartLongPressTimer(e)\n\t\t\t} else if (e.touches.length === 2) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t\tconst [t1, t2] = e.touches\n\t\t\t\tstate.startDistance = getDistance(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tstate.startAngle = getAngle(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tstate.lastScale = 1\n\t\t\t\tstate.lastAngle = 0\n\t\t\t}\n\n\t\t\tstate.options.onTouchStart?.(e)\n\t\t}\n\n\t\tconst handleTouchMove = (e: TouchEvent): void => {\n\t\t\t// Prevent page scroll and zoom during gesture\n\t\t\tif (e.touches.length >= 1) {\n\t\t\t\te.preventDefault()\n\t\t\t}\n\n\t\t\tif (state.longPressTimer && e.touches.length === 1 && exceedsThreshold(e.touches[0].clientX, e.touches[0].clientY)) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t}\n\n\t\t\tif (e.touches.length === 2) {\n\t\t\t\tconst [t1, t2] = e.touches\n\t\t\t\tconst currentDistance = getDistance(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\t\t\t\tconst currentAngle = getAngle(t1.clientX, t1.clientY, t2.clientX, t2.clientY)\n\n\t\t\t\tif (state.options.enablePinch && state.options.onPinch) {\n\t\t\t\t\tconst scale = currentDistance / state.startDistance\n\t\t\t\t\tif (Math.abs(scale - state.lastScale) >= (state.options.pinchThreshold || 0.1)) {\n\t\t\t\t\t\tstate.options.onPinch(scale, e)\n\t\t\t\t\t\tstate.lastScale = scale\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (state.options.enableRotate && state.options.onRotate) {\n\t\t\t\t\tconst angleDiff = currentAngle - state.startAngle\n\t\t\t\t\tif (Math.abs(angleDiff - state.lastAngle) > 5) {\n\t\t\t\t\t\tstate.options.onRotate(angleDiff, e)\n\t\t\t\t\t\tstate.lastAngle = angleDiff\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstate.options.onTouchMove?.(e)\n\t\t}\n\n\t\tconst handleTouchEnd = (e: TouchEvent): void => {\n\t\t\tclearLongPressTimer()\n\n\t\t\tif (e.touches.length === 0) {\n\t\t\t\tstate.lastTouchEndTime = Date.now()\n\t\t\t\tconst touch = e.changedTouches[0]\n\t\t\t\thandleGestureEnd(touch.clientX, touch.clientY, e)\n\t\t\t}\n\n\t\t\tstate.options.onTouchEnd?.(e)\n\t\t}\n\n\t\t// Mouse handlers for desktop\n\t\tconst handleMouseDown = (e: MouseEvent): void => {\n\t\t\tif (!state.options.enableMouse) return\n\t\t\t// Ignore simulated mouse events after touch\n\t\t\tif (Date.now() - state.lastTouchEndTime < MOUSE_IGNORE_DURATION) return\n\n\t\t\te.preventDefault()\n\t\t\tstate.isMouseDown = true\n\t\t\tstate.startTime = Date.now()\n\t\t\tstate.startX = e.clientX\n\t\t\tstate.startY = e.clientY\n\t\t\tstate.isLongPress = false\n\t\t\tstartLongPressTimer(e)\n\n\t\t\tstate.options.onTouchStart?.(e)\n\t\t}\n\n\t\tconst handleMouseMove = (e: MouseEvent): void => {\n\t\t\tif (!state.isMouseDown || !state.options.enableMouse) return\n\t\t\tif (state.longPressTimer && exceedsThreshold(e.clientX, e.clientY)) {\n\t\t\t\tclearLongPressTimer()\n\t\t\t}\n\t\t\tstate.options.onTouchMove?.(e)\n\t\t}\n\n\t\tconst handleMouseUp = (e: MouseEvent): void => {\n\t\t\tif (!state.isMouseDown || !state.options.enableMouse) return\n\n\t\t\tstate.isMouseDown = false\n\t\t\tclearLongPressTimer()\n\n\t\t\tif (!state.isLongPress) {\n\t\t\t\thandleGestureEnd(e.clientX, e.clientY, e)\n\t\t\t}\n\n\t\t\tstate.options.onTouchEnd?.(e)\n\t\t}\n\n\t\tstate.handlers = { touchStart: handleTouchStart, touchMove: handleTouchMove, touchEnd: handleTouchEnd, mouseDown: handleMouseDown, mouseMove: handleMouseMove, mouseUp: handleMouseUp }\n\n\t\tel.addEventListener('touchstart', handleTouchStart, { passive: false })\n\t\tel.addEventListener('touchmove', handleTouchMove, { passive: false })\n\t\tel.addEventListener('touchend', handleTouchEnd)\n\t\tel.addEventListener('touchcancel', handleTouchEnd)\n\n\t\tif (options.enableMouse) {\n\t\t\tel.addEventListener('mousedown', handleMouseDown)\n\t\t\tdocument.addEventListener('mousemove', handleMouseMove)\n\t\t\tdocument.addEventListener('mouseup', handleMouseUp)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__touch as TouchState | undefined\n\t\tif (state) state.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state = (el as any).__touch as TouchState | undefined\n\n\t\tif (state?.longPressTimer) clearTimeout(state.longPressTimer)\n\n\t\tif (state?.handlers) {\n\t\t\tel.removeEventListener('touchstart', state.handlers.touchStart)\n\t\t\tel.removeEventListener('touchmove', state.handlers.touchMove)\n\t\t\tel.removeEventListener('touchend', state.handlers.touchEnd)\n\t\t\tel.removeEventListener('touchcancel', state.handlers.touchEnd)\n\t\t\tif (state.handlers.mouseDown) el.removeEventListener('mousedown', state.handlers.mouseDown)\n\t\t\tif (state.handlers.mouseMove) document.removeEventListener('mousemove', state.handlers.mouseMove)\n\t\t\tif (state.handlers.mouseUp) document.removeEventListener('mouseup', state.handlers.mouseUp)\n\t\t}\n\n\t\tdelete (el as any).__touch\n\t},\n})\n\nfunction normalizeOptions(binding: TouchOptions | undefined): TouchOptions {\n\treturn {\n\t\tswipeThreshold: binding?.swipeThreshold ?? 30,\n\t\tswipeTimeout: binding?.swipeTimeout ?? 500,\n\t\tpinchThreshold: binding?.pinchThreshold ?? 0.1,\n\t\tenableSwipe: binding?.enableSwipe ?? true,\n\t\tenablePinch: binding?.enablePinch ?? true,\n\t\tenableRotate: binding?.enableRotate ?? true,\n\t\tenableTap: binding?.enableTap ?? true,\n\t\ttapTimeout: binding?.tapTimeout ?? 250,\n\t\ttapThreshold: binding?.tapThreshold ?? 10,\n\t\tenableLongPress: binding?.enableLongPress ?? true,\n\t\tlongPressTimeout: binding?.longPressTimeout ?? 500,\n\t\tenableMouse: binding?.enableMouse ?? true,\n\t\tonSwipe: binding?.onSwipe,\n\t\tonSwipeLeft: binding?.onSwipeLeft,\n\t\tonSwipeRight: binding?.onSwipeRight,\n\t\tonSwipeUp: binding?.onSwipeUp,\n\t\tonSwipeDown: binding?.onSwipeDown,\n\t\tonPinch: binding?.onPinch,\n\t\tonRotate: binding?.onRotate,\n\t\tonTap: binding?.onTap,\n\t\tonLongPress: binding?.onLongPress,\n\t\tonTouchStart: binding?.onTouchStart,\n\t\tonTouchMove: binding?.onTouchMove,\n\t\tonTouchEnd: binding?.onTouchEnd,\n\t}\n}\n\nexport default vTouch\n","import { defineDirective } from '@directix/core'\n\n/**\n * Trim position\n */\nexport type TrimPosition = 'start' | 'end' | 'both'\n\n/**\n * Trim directive options\n */\nexport interface TrimOptions {\n\t/**\n\t * Trim position\n\t * @default 'both'\n\t */\n\tposition?: TrimPosition\n\n\t/**\n\t * Whether to trim on input (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n\n\t/**\n\t * Whether to trim on blur\n\t * @default true\n\t */\n\tonBlur?: boolean\n\n\t/**\n\t * Custom characters to trim (in addition to whitespace)\n\t */\n\tchars?: string\n}\n\n/**\n * Directive binding value type\n */\nexport type TrimBinding = boolean | TrimPosition | TrimOptions\n\n/**\n * Element state storage\n */\ninterface TrimState {\n\toptions: TrimOptions\n\tinputHandler?: () => void\n\tblurHandler?: () => void\n}\n\n/**\n * Trim text based on options\n */\nfunction trimText(text: string, options: TrimOptions): string {\n\tconst { position = 'both', chars } = options\n\n\t// Build regex pattern for custom chars\n\tconst charPattern = chars ? `[\\\\s${escapeRegex(chars)}]` : '\\\\s'\n\n\tswitch (position) {\n\t\tcase 'start':\n\t\t\treturn text.replace(new RegExp(`^${charPattern}+`, 'g'), '')\n\n\t\tcase 'end':\n\t\t\treturn text.replace(new RegExp(`${charPattern}+$`, 'g'), '')\n\n\t\tcase 'both':\n\t\tdefault:\n\t\t\treturn text.replace(new RegExp(`^${charPattern}+|${charPattern}+$`, 'g'), '')\n\t}\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\n/**\n * v-trim directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: trim both sides -->\n * <input v-trim v-model=\"text\" />\n *\n * <!-- Trim only start -->\n * <input v-trim=\"'start'\" v-model=\"text\" />\n *\n * <!-- Trim only end -->\n * <input v-trim=\"'end'\" v-model=\"text\" />\n *\n * <!-- With options -->\n * <input v-trim=\"{ position: 'both', onBlur: true }\" v-model=\"text\" />\n *\n * <!-- For display only -->\n * <span v-trim> Text with spaces </span>\n * </template>\n * ```\n */\nexport const vTrim = defineDirective<TrimBinding, HTMLElement>({\n\tname: 'trim',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\tsetupInputElement(el as HTMLInputElement | HTMLTextAreaElement, options)\n\t\t} else {\n\t\t\t// For non-input elements, trim text content\n\t\t\tconst text = el.textContent || ''\n\n\t\t\tel.textContent = trimText(text, options)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst state: TrimState | undefined = (el as any).__trim\n\n\t\tif (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') {\n\t\t\t// For input elements, trimming happens on blur/input events\n\t\t\tif (state) {\n\t\t\t\tstate.options = options\n\t\t\t}\n\t\t} else {\n\t\t\t// For non-input elements, trim text content\n\t\t\tconst text = el.textContent || ''\n\n\t\t\tel.textContent = trimText(text, options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: TrimState | undefined = (el as any).__trim\n\n\t\tif (state?.inputHandler) {\n\t\t\tel.removeEventListener('input', state.inputHandler)\n\t\t}\n\t\tif (state?.blurHandler) {\n\t\t\tel.removeEventListener('blur', state.blurHandler)\n\t\t}\n\n\t\tdelete (el as any).__trim\n\t},\n})\n\n/**\n * Setup input element\n */\nfunction setupInputElement(el: HTMLInputElement | HTMLTextAreaElement, options: TrimOptions): void {\n\tconst state: TrimState = { options }\n\n\t;(el as any).__trim = state\n\n\tconst performTrim = (): void => {\n\t\tconst originalValue = el.value\n\t\tconst trimmed = trimText(originalValue, options)\n\n\t\tif (originalValue !== trimmed) {\n\t\t\tel.value = trimmed\n\t\t\tel.dispatchEvent(new Event('input', { bubbles: true }))\n\t\t}\n\t}\n\n\t// Create handlers based on options\n\tif (options.onInput) {\n\t\tconst inputHandler = (): void => {\n\t\t\t// For real-time trimming, we need to be careful about cursor position\n\t\t\t// We'll only trim on blur for better UX, or trim end on input\n\t\t\tconst originalValue = el.value\n\t\t\tconst cursorPos = el.selectionStart\n\n\t\t\t// Trim end while typing\n\t\t\tconst trimmed = originalValue.replace(/\\s+$/g, '')\n\n\t\t\tif (originalValue !== trimmed) {\n\t\t\t\tel.value = trimmed\n\t\t\t\t// Adjust cursor position\n\t\t\t\tif (cursorPos !== null) {\n\t\t\t\t\tconst newCursorPos = Math.min(cursorPos, trimmed.length)\n\n\t\t\t\t\tel.setSelectionRange(newCursorPos, newCursorPos)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('input', inputHandler)\n\t\tstate.inputHandler = inputHandler\n\t}\n\n\tif (options.onBlur) {\n\t\tconst blurHandler = (): void => performTrim()\n\n\t\tel.addEventListener('blur', blurHandler)\n\t\tstate.blurHandler = blurHandler\n\t}\n\n\t// Initial trim\n\tif (el.value) {\n\t\tperformTrim()\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TrimBinding | undefined): TrimOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { position: 'both', onInput: true, onBlur: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { position: 'both', onInput: false, onBlur: false }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { position: binding, onInput: true, onBlur: true }\n\t}\n\n\treturn {\n\t\tposition: binding.position ?? 'both',\n\t\tonInput: binding.onInput ?? true,\n\t\tonBlur: binding.onBlur ?? true,\n\t\tchars: binding.chars,\n\t}\n}\n\nexport default vTrim\n","import { defineDirective } from '@directix/core'\n\n/**\n * Truncate position\n */\nexport type TruncatePosition = 'start' | 'middle' | 'end'\n\n/**\n * Truncate directive options\n */\nexport interface TruncateOptions {\n\t/**\n\t * Maximum length of text\n\t * @default 100\n\t */\n\tlength?: number\n\n\t/**\n\t * Truncation position\n\t * @default 'end'\n\t */\n\tposition?: TruncatePosition\n\n\t/**\n\t * Ellipsis string\n\t * @default '...'\n\t */\n\tellipsis?: string\n\n\t/**\n\t * Whether to use CSS truncation (use text-overflow: ellipsis)\n\t * When true, length and position options are ignored\n\t * @default false\n\t */\n\tuseCss?: boolean\n\n\t/**\n\t * Show full text on hover (as title attribute)\n\t * @default true\n\t */\n\tshowTitle?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type TruncateBinding = number | TruncateOptions\n\n/**\n * Element state storage\n */\ninterface TruncateState {\n\toriginalText: string\n\toptions: TruncateOptions\n}\n\n/**\n * Truncate text based on options\n */\nfunction truncateText(text: string, options: TruncateOptions): string {\n\tconst { length = 100, position = 'end', ellipsis = '...' } = options\n\n\tif (text.length <= length) {\n\t\treturn text\n\t}\n\n\tswitch (position) {\n\t\tcase 'start':\n\t\t\treturn ellipsis + text.slice(-(length - ellipsis.length))\n\n\t\tcase 'middle': {\n\t\t\tconst startLen = Math.ceil((length - ellipsis.length) / 2)\n\t\t\tconst endLen = Math.floor((length - ellipsis.length) / 2)\n\n\t\t\treturn text.slice(0, startLen) + ellipsis + text.slice(-endLen)\n\t\t}\n\n\t\tcase 'end':\n\t\tdefault:\n\t\t\treturn text.slice(0, length - ellipsis.length) + ellipsis\n\t}\n}\n\n/**\n * v-truncate directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple usage: truncate to 50 characters -->\n * <p v-truncate=\"50\">Long text here...</p>\n *\n * <!-- With options -->\n * <p v-truncate=\"{ length: 100, position: 'middle' }\">Long text here...</p>\n *\n * <!-- CSS truncation -->\n * <p v-truncate=\"{ useCss: true }\">Long text here...</p>\n * </template>\n * ```\n */\nexport const vTruncate = defineDirective<TruncateBinding, HTMLElement>({\n\tname: 'truncate',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\t\tconst text = el.textContent || ''\n\n\t\t// Store original text\n\t\tconst state: TruncateState = {\n\t\t\toriginalText: text,\n\t\t\toptions,\n\t\t}\n\n\t\t;(el as any).__truncate = state\n\n\t\tapplyTruncation(el, text, options)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: TruncateState | undefined = (el as any).__truncate\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (state) {\n\t\t\t// Always use original text for re-truncation\n\t\t\tconst originalText = state.originalText\n\n\t\t\t// Check if options changed\n\t\t\tif (JSON.stringify(newOptions) !== JSON.stringify(state.options)) {\n\t\t\t\tstate.options = newOptions\n\t\t\t\tapplyTruncation(el, originalText, newOptions)\n\t\t\t}\n\t\t} else {\n\t\t\tconst text = el.textContent || ''\n\n\t\t\t;(el as any).__truncate = {\n\t\t\t\toriginalText: text,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t\tapplyTruncation(el, text, newOptions)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__truncate\n\t},\n})\n\n/**\n * Apply truncation to element\n */\nfunction applyTruncation(el: HTMLElement, text: string, options: TruncateOptions): void {\n\tconst { useCss, showTitle = true } = options\n\n\tif (useCss) {\n\t\t// Use CSS truncation\n\t\tel.style.overflow = 'hidden'\n\t\tel.style.textOverflow = 'ellipsis'\n\t\tel.style.whiteSpace = 'nowrap'\n\n\t\tif (showTitle && text) {\n\t\t\tel.setAttribute('title', text)\n\t\t}\n\t} else {\n\t\t// Use JavaScript truncation\n\t\tconst truncated = truncateText(text, options)\n\n\t\tel.textContent = truncated\n\n\t\tif (showTitle && text && text !== truncated) {\n\t\t\tel.setAttribute('title', text)\n\t\t}\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: TruncateBinding | undefined): TruncateOptions {\n\tif (typeof binding === 'number') {\n\t\treturn {\n\t\t\tlength: binding,\n\t\t\tposition: 'end',\n\t\t\tellipsis: '...',\n\t\t\tuseCss: false,\n\t\t\tshowTitle: true,\n\t\t}\n\t}\n\n\treturn {\n\t\tlength: binding?.length ?? 100,\n\t\tposition: binding?.position ?? 'end',\n\t\tellipsis: binding?.ellipsis ?? '...',\n\t\tuseCss: binding?.useCss ?? false,\n\t\tshowTitle: binding?.showTitle ?? true,\n\t}\n}\n\nexport default vTruncate\n","import { defineDirective } from '@directix/core'\nimport { isInputElement, setupTextTransformInput, transformTextContent } from '../utils/text-transform'\n\n/**\n * Uppercase directive options\n */\nexport interface UppercaseOptions {\n\t/**\n\t * Transform only the first character\n\t * @default false\n\t */\n\tfirst?: boolean\n\n\t/**\n\t * Transform on input event (for input elements)\n\t * @default true\n\t */\n\tonInput?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type UppercaseBinding = boolean | UppercaseOptions\n\n/**\n * Transform text to uppercase\n */\nfunction transformText(text: string, options: UppercaseOptions): string {\n\tif (!text) return text\n\n\tif (options.first) {\n\t\treturn text.charAt(0).toUpperCase() + text.slice(1)\n\t}\n\n\treturn text.toUpperCase()\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: UppercaseBinding | undefined): UppercaseOptions {\n\tif (binding === undefined || binding === true) {\n\t\treturn { first: false, onInput: true }\n\t}\n\n\tif (binding === false) {\n\t\treturn { first: false, onInput: false }\n\t}\n\n\treturn {\n\t\tfirst: binding.first ?? false,\n\t\tonInput: binding.onInput ?? true,\n\t}\n}\n\n/**\n * v-uppercase directive\n *\n * @example\n * ```vue\n * <template>\n * <!-- Transform all characters to uppercase -->\n * <input v-uppercase v-model=\"text\" />\n *\n * <!-- Transform only first character -->\n * <span v-uppercase=\"{ first: true }\">{{ text }}</span>\n * </template>\n * ```\n */\nexport const vUppercase = defineDirective<UppercaseBinding, HTMLElement>({\n\tname: 'uppercase',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tconst cleanup = setupTextTransformInput(el, options, text => transformText(text, options))\n\n\t\t\t;(el as any).__uppercaseCleanup = cleanup\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (isInputElement(el)) {\n\t\t\tif (options.onInput) {\n\t\t\t\tel.value = transformText(el.value, options)\n\t\t\t}\n\t\t} else {\n\t\t\ttransformTextContent(el, text => transformText(text, options))\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst cleanup: (() => void) | undefined = (el as any).__uppercaseCleanup\n\n\t\tcleanup?.()\n\t\tdelete (el as any).__uppercaseCleanup\n\t},\n})\n\nexport default vUppercase\n","import { defineDirective } from '@directix/core'\n\n/**\n * Virtual list item size function\n */\nexport type ItemSizeFunction = (index: number) => number\n\n/**\n * Virtual list render function\n */\nexport type VirtualListRenderFunction = (item: any, index: number) => string\n\n/**\n * Virtual list directive options\n */\nexport interface VirtualListOptions<T = any> {\n\t/**\n\t * Array of items to render\n\t * @required\n\t */\n\titems: T[]\n\n\t/**\n\t * Height of each item (in pixels)\n\t * Can be a fixed number or a function\n\t * @default 50\n\t */\n\titemSize?: number | ItemSizeFunction\n\n\t/**\n\t * Height of the container (in pixels)\n\t * @default 400\n\t */\n\theight?: number | string\n\n\t/**\n\t * Number of extra items to render above/below visible area\n\t * @default 3\n\t */\n\toverscan?: number\n\n\t/**\n\t * Custom render function\n\t */\n\trender?: VirtualListRenderFunction\n\n\t/**\n\t * Key field name for items\n\t * @default 'id'\n\t */\n\tkeyField?: string\n\n\t/**\n\t * Callback when scroll position changes\n\t */\n\tonScroll?: (scrollTop: number) => void\n\n\t/**\n\t * Callback when visible range changes\n\t */\n\tonVisibleChange?: (startIndex: number, endIndex: number) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type VirtualListBinding<T = any> = VirtualListOptions<T> | T[]\n\n/**\n * Element state storage\n */\ninterface VirtualListState {\n\toptions: VirtualListOptions\n\tcontainerEl: HTMLElement | null\n\tcontentEl: HTMLElement | null\n\tscrollHandler: ((event: Event) => void) | null\n\tresizeObserver: ResizeObserver | null\n\tstartIndex: number\n\tendIndex: number\n\tvisibleItems: any[]\n}\n\n/**\n * Get item height\n */\nfunction getItemSize(options: VirtualListOptions, index: number): number {\n\tif (typeof options.itemSize === 'function') {\n\t\treturn options.itemSize(index)\n\t}\n\treturn options.itemSize || 50\n}\n\n/**\n * Calculate total height\n */\nfunction calculateTotalHeight(options: VirtualListOptions): number {\n\tif (typeof options.itemSize === 'function') {\n\t\tlet total = 0\n\t\tfor (let i = 0; i < options.items.length; i++) {\n\t\t\ttotal += options.itemSize(i)\n\t\t}\n\t\treturn total\n\t}\n\treturn (options.itemSize || 50) * options.items.length\n}\n\n/**\n * Calculate visible range\n */\nfunction calculateVisibleRange(\n\tscrollTop: number,\n\tcontainerHeight: number,\n\toptions: VirtualListOptions,\n): { startIndex: number, endIndex: number, offsetY: number } {\n\tconst items = options.items\n\tconst itemSize = options.itemSize || 50\n\tconst overscan = options.overscan || 3\n\n\tlet startIndex = 0,\n\t\tendIndex = 0,\n\t\toffsetY = 0\n\n\tif (typeof itemSize === 'function') {\n\t\t// Variable size items\n\t\tlet currentOffset = 0\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst size = itemSize(i)\n\t\t\tif (currentOffset + size > scrollTop) {\n\t\t\t\tstartIndex = i\n\t\t\t\toffsetY = currentOffset\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcurrentOffset += size\n\t\t}\n\n\t\t// Find end index\n\t\tendIndex = startIndex\n\t\tcurrentOffset = offsetY\n\t\twhile (endIndex < items.length && currentOffset < scrollTop + containerHeight) {\n\t\t\tcurrentOffset += itemSize(endIndex)\n\t\t\tendIndex++\n\t\t}\n\n\t\t// Add overscan\n\t\tstartIndex = Math.max(0, startIndex - overscan)\n\t\tendIndex = Math.min(items.length, endIndex + overscan)\n\n\t\t// Recalculate offset for overscan\n\t\tcurrentOffset = 0\n\t\tfor (let i = 0; i < startIndex; i++) {\n\t\t\tcurrentOffset += itemSize(i)\n\t\t}\n\t\toffsetY = currentOffset\n\n\t\treturn { startIndex, endIndex, offsetY }\n\t}\n\n\t// Fixed size items\n\tstartIndex = Math.max(0, Math.floor(scrollTop / itemSize) - overscan)\n\tendIndex = Math.min(items.length, Math.ceil((scrollTop + containerHeight) / itemSize) + overscan)\n\toffsetY = startIndex * itemSize\n\n\treturn { startIndex, endIndex, offsetY }\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions<T>(binding: VirtualListBinding<T>): VirtualListOptions<T> {\n\tif (Array.isArray(binding)) {\n\t\treturn {\n\t\t\titems: binding,\n\t\t\titemSize: 50,\n\t\t\theight: 400,\n\t\t\toverscan: 3,\n\t\t\tkeyField: 'id',\n\t\t}\n\t}\n\n\treturn {\n\t\titems: binding.items,\n\t\titemSize: binding.itemSize ?? 50,\n\t\theight: binding.height ?? 400,\n\t\toverscan: binding.overscan ?? 3,\n\t\trender: binding.render,\n\t\tkeyField: binding.keyField ?? 'id',\n\t\tonScroll: binding.onScroll,\n\t\tonVisibleChange: binding.onVisibleChange,\n\t}\n}\n\n/**\n * Create item element\n */\nfunction createItemElement(\n\titem: any,\n\tindex: number,\n\toptions: VirtualListOptions,\n): HTMLElement {\n\tconst el = document.createElement('div')\n\tel.className = 'v-virtual-list__item'\n\tel.dataset.index = String(index)\n\n\t// Get item key\n\tconst keyField = options.keyField || 'id'\n\tif (typeof item === 'object' && item !== null && keyField in item) {\n\t\tel.dataset.key = String(item[keyField])\n\t}\n\n\t// Set height\n\tconst height = getItemSize(options, index)\n\tel.style.height = `${height}px`\n\tel.style.boxSizing = 'border-box'\n\n\t// Render content\n\tif (options.render) {\n\t\tel.innerHTML = options.render(item, index)\n\t} else {\n\t\tel.textContent = typeof item === 'object' ? JSON.stringify(item) : String(item)\n\t}\n\n\treturn el\n}\n\n/**\n * v-virtual-list directive\n *\n * Renders a large list efficiently using virtualization.\n *\n * @example\n * ```vue\n * <template>\n * <div v-virtual-list=\"{ items: largeList, itemSize: 50 }\"></div>\n *\n * <div v-virtual-list=\"{\n * items: largeList,\n * itemSize: (index) => index % 10 === 0 ? 100 : 50,\n * height: 600,\n * overscan: 5,\n * render: (item, index) => `<div class=\"item\">${item.name}</div>`\n * }\"></div>\n * </template>\n * ```\n */\nexport const vVirtualList = defineDirective<VirtualListBinding, HTMLElement>({\n\tname: 'virtual-list',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Setup container\n\t\tel.classList.add('v-virtual-list')\n\t\tel.style.height = typeof options.height === 'number' ? `${options.height}px` : options.height as string\n\t\tel.style.overflow = 'auto'\n\t\tel.style.position = 'relative'\n\n\t\t// Create content wrapper\n\t\tconst contentEl = document.createElement('div')\n\t\tcontentEl.className = 'v-virtual-list__content'\n\t\tcontentEl.style.position = 'relative'\n\t\tcontentEl.style.height = `${calculateTotalHeight(options)}px`\n\t\tel.appendChild(contentEl)\n\n\t\t// Create visible items wrapper\n\t\tconst visibleEl = document.createElement('div')\n\t\tvisibleEl.className = 'v-virtual-list__visible'\n\t\tvisibleEl.style.position = 'absolute'\n\t\tvisibleEl.style.top = '0'\n\t\tvisibleEl.style.left = '0'\n\t\tvisibleEl.style.right = '0'\n\t\tcontentEl.appendChild(visibleEl)\n\n\t\tconst state: VirtualListState = {\n\t\t\toptions,\n\t\t\tcontainerEl: el,\n\t\t\tcontentEl,\n\t\t\tscrollHandler: null,\n\t\t\tresizeObserver: null,\n\t\t\tstartIndex: 0,\n\t\t\tendIndex: 0,\n\t\t\tvisibleItems: [],\n\t\t}\n\n\t\t;(el as any).__virtualList = state\n\n\t\t// Create scroll handler\n\t\tconst scrollHandler = (_event: Event): void => {\n\t\t\tconst scrollTop = el.scrollTop\n\t\t\tconst containerHeight = el.clientHeight\n\n\t\t\t// Calculate visible range\n\t\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(\n\t\t\t\tscrollTop,\n\t\t\t\tcontainerHeight,\n\t\t\t\tstate.options,\n\t\t\t)\n\n\t\t\t// Check if range changed\n\t\t\tif (startIndex !== state.startIndex || endIndex !== state.endIndex) {\n\t\t\t\tstate.startIndex = startIndex\n\t\t\t\tstate.endIndex = endIndex\n\n\t\t\t\t// Render visible items\n\t\t\t\trenderVisibleItems(visibleEl, state, offsetY)\n\n\t\t\t\t// Callback\n\t\t\t\tif (state.options.onVisibleChange) {\n\t\t\t\t\tstate.options.onVisibleChange(startIndex, endIndex)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Scroll callback\n\t\t\tif (state.options.onScroll) {\n\t\t\t\tstate.options.onScroll(scrollTop)\n\t\t\t}\n\t\t}\n\n\t\tstate.scrollHandler = scrollHandler\n\t\tel.addEventListener('scroll', scrollHandler, { passive: true })\n\n\t\t// Initial render\n\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(0, el.clientHeight, options)\n\t\tstate.startIndex = startIndex\n\t\tstate.endIndex = endIndex\n\t\trenderVisibleItems(visibleEl, state, offsetY)\n\n\t\t// Setup resize observer\n\t\tif (typeof ResizeObserver !== 'undefined') {\n\t\t\tconst resizeObserver = new ResizeObserver(() => {\n\t\t\t\t// Recalculate on resize\n\t\t\t\tscrollHandler(new Event('scroll'))\n\t\t\t})\n\t\t\tresizeObserver.observe(el)\n\t\t\tstate.resizeObserver = resizeObserver\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VirtualListState = (el as any).__virtualList\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tstate.options = newOptions\n\n\t\t// Update content height\n\t\tif (state.contentEl) {\n\t\t\tstate.contentEl.style.height = `${calculateTotalHeight(newOptions)}px`\n\t\t}\n\n\t\t// Force re-render\n\t\tconst scrollTop = el.scrollTop\n\t\tconst containerHeight = el.clientHeight\n\t\tconst { startIndex, endIndex, offsetY } = calculateVisibleRange(\n\t\t\tscrollTop,\n\t\t\tcontainerHeight,\n\t\t\tnewOptions,\n\t\t)\n\t\tstate.startIndex = startIndex\n\t\tstate.endIndex = endIndex\n\n\t\tconst visibleEl = state.contentEl?.querySelector('.v-virtual-list__visible') as HTMLElement\n\t\tif (visibleEl) {\n\t\t\trenderVisibleItems(visibleEl, state, offsetY)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VirtualListState | undefined = (el as any).__virtualList\n\n\t\tif (!state) return\n\n\t\tif (state.scrollHandler) {\n\t\t\tel.removeEventListener('scroll', state.scrollHandler)\n\t\t}\n\n\t\tif (state.resizeObserver) {\n\t\t\tstate.resizeObserver.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__virtualList\n\t},\n})\n\n/**\n * Render visible items\n */\nfunction renderVisibleItems(\n\tvisibleEl: HTMLElement,\n\tstate: VirtualListState,\n\toffsetY: number,\n): void {\n\tconst { options, startIndex, endIndex } = state\n\n\t// Set transform\n\tvisibleEl.style.transform = `translateY(${offsetY}px)`\n\n\t// Clear existing items\n\tvisibleEl.innerHTML = ''\n\n\t// Render items\n\tfor (let i = startIndex; i < endIndex; i++) {\n\t\tconst item = options.items[i]\n\t\tif (item !== undefined) {\n\t\t\tconst itemEl = createItemElement(item, i, options)\n\t\t\tvisibleEl.appendChild(itemEl)\n\t\t}\n\t}\n}\n\nexport default vVirtualList\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Visible change handler\n */\nexport type VisibleHandler = (isVisible: boolean) => void\n\n/**\n * Visible directive options\n */\nexport interface VisibleOptions {\n\t/**\n\t * Callback when visibility changes\n\t */\n\thandler?: VisibleHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to set visibility: hidden instead of display: none\n\t * @default false\n\t */\n\tuseHidden?: boolean\n\n\t/**\n\t * Initial visibility\n\t * @default true\n\t */\n\tinitial?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type VisibleBinding = boolean | VisibleOptions\n\n/**\n * Element state storage\n */\ninterface VisibleState {\n\toptions: VisibleOptions\n\tisVisible: boolean\n\toriginalDisplay: string\n\toriginalVisibility: string\n\ttransitionEndHandler: (e: TransitionEvent) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: VisibleBinding | undefined): VisibleOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { initial: binding }\n\t}\n\n\treturn {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-visible directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-visible=\"showElement\">Show/Hide</div>\n * <div v-visible=\"{ handler: onVisibleChange }\">Track visibility</div>\n * <div v-visible=\"{ useHidden: true, initial: false }\">Uses visibility: hidden</div>\n * </template>\n * ```\n */\nexport const vVisible = defineDirective<VisibleBinding, HTMLElement>({\n\tname: 'visible',\n\tssr: true, // SSR safe - will set initial visibility on server\n\tdefaults: {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Store original styles\n\t\tconst originalDisplay = el.style.display\n\t\tconst originalVisibility = el.style.visibility\n\n\t\tconst state: VisibleState = {\n\t\t\toptions,\n\t\t\tisVisible: options.initial ?? true,\n\t\t\toriginalDisplay,\n\t\t\toriginalVisibility,\n\t\t\ttransitionEndHandler: (e: TransitionEvent) => {\n\t\t\t\t// Handle transition end for animations\n\t\t\t\tif (e.propertyName === 'opacity' || e.propertyName === 'visibility') {\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('visible:transition-end', {\n\t\t\t\t\t\tdetail: { isVisible: state.isVisible },\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__visible = state\n\n\t\t// Add transition listener\n\t\ton(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Apply initial visibility\n\t\tapplyVisibility(el, state, options.initial ?? true)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Determine new visibility\n\t\tlet newVisibility: boolean\n\n\t\tif (typeof binding.value === 'boolean') {\n\t\t\tnewVisibility = binding.value\n\t\t} else {\n\t\t\tnewVisibility = newOptions.initial ?? true\n\t\t}\n\n\t\t// Update if changed\n\t\tif (state.isVisible !== newVisibility) {\n\t\t\tapplyVisibility(el, state, newVisibility)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\t// Remove transition listener\n\t\toff(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Restore original styles\n\t\tel.style.display = state.originalDisplay\n\t\tel.style.visibility = state.originalVisibility\n\n\t\tdelete (el as any).__visible\n\t},\n})\n\n/**\n * Apply visibility to element\n */\nfunction applyVisibility(el: HTMLElement, state: VisibleState, isVisible: boolean): void {\n\tconst previousVisibility = state.isVisible\n\n\tstate.isVisible = isVisible\n\n\t// Add/remove class first (for CSS transitions)\n\tif (isVisible) {\n\t\tel.classList.remove('v-hidden')\n\t\tel.classList.add('v-visible')\n\t} else {\n\t\tel.classList.remove('v-visible')\n\t\tel.classList.add('v-hidden')\n\t}\n\n\tif (state.options.useHidden) {\n\t\t// Use visibility: hidden with animation support\n\t\tif (isVisible) {\n\t\t\t// Show: set visibility first, then animate\n\t\t\tel.style.visibility = state.originalVisibility || 'visible'\n\t\t} else {\n\t\t\t// Hide: wait for transition, then set hidden\n\t\t\tconst computedStyle = getComputedStyle(el)\n\t\t\tconst hasTransition = computedStyle.transitionDuration !== '0s'\n\n\t\t\tif (hasTransition) {\n\t\t\t\t// Wait for transition to complete\n\t\t\t\tconst handleTransitionEnd = (e: TransitionEvent): void => {\n\t\t\t\t\tif (e.target === el && (e.propertyName === 'opacity' || e.propertyName === 'transform')) {\n\t\t\t\t\t\tif (!state.isVisible) {\n\t\t\t\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tel.removeEventListener('transitionend', handleTransitionEnd)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('transitionend', handleTransitionEnd)\n\t\t\t} else {\n\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Use display: none (no animation support)\n\t\tel.style.display = isVisible ? state.originalDisplay : 'none'\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('visible:change', {\n\t\tdetail: { isVisible, previousVisibility },\n\t}))\n\n\t// Trigger handler\n\tif (state.options.handler && previousVisibility !== isVisible) {\n\t\tstate.options.handler(isVisible)\n\t}\n}\n\nexport default vVisible\n","import { defineDirective } from '@directix/core'\n\n/**\n * Watermark options\n */\nexport interface WatermarkOptions {\n\t/**\n\t * Watermark text content\n\t * @required\n\t */\n\tcontent: string | string[]\n\n\t/**\n\t * Width of watermark canvas\n\t * @default 300\n\t */\n\twidth?: number\n\n\t/**\n\t * Height of watermark canvas\n\t * @default 200\n\t */\n\theight?: number\n\n\t/**\n\t * Rotation angle in degrees\n\t * @default -22\n\t */\n\trotate?: number\n\n\t/**\n\t * Font size in pixels\n\t * @default 16\n\t */\n\tfontSize?: number\n\n\t/**\n\t * Font family\n\t * @default 'sans-serif'\n\t */\n\tfontFamily?: string\n\n\t/**\n\t * Font weight\n\t * @default 'normal'\n\t */\n\tfontWeight?: string | number\n\n\t/**\n\t * Font color\n\t * @default 'rgba(128, 128, 128, 0.15)'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Gap between watermarks in pixels\n\t * @default [100, 100]\n\t */\n\tgap?: [number, number] | number\n\n\t/**\n\t * Z-index of watermark layer\n\t * @default 9999\n\t */\n\tzIndex?: number\n\n\t/**\n\t * Whether to disable watermark (for dynamic control)\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to prevent removal attempts\n\t * @default true\n\t */\n\tprotect?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type WatermarkBinding = string | WatermarkOptions\n\n/**\n * Element state storage\n */\ninterface WatermarkState {\n\toptions: WatermarkOptions\n\twatermarkEl: HTMLDivElement | null\n\tobserver: MutationObserver | null\n\tcanvas: HTMLCanvasElement | null\n}\n\n/**\n * Create watermark canvas\n */\nfunction createWatermarkCanvas(options: WatermarkOptions): HTMLCanvasElement {\n\tconst canvas = document.createElement('canvas')\n\tconst ctx = canvas.getContext('2d')\n\n\tif (!ctx) {\n\t\tthrow new Error('[Directix] v-watermark: Could not get canvas context')\n\t}\n\n\tconst width = options.width || 300\n\tconst height = options.height || 200\n\tconst fontSize = options.fontSize || 16\n\tconst fontFamily = options.fontFamily || 'sans-serif'\n\tconst fontWeight = options.fontWeight || 'normal'\n\tconst color = options.color || 'rgba(128, 128, 128, 0.15)'\n\tconst rotate = options.rotate ?? -22\n\n\tcanvas.width = width\n\tcanvas.height = height\n\n\tctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`\n\tctx.fillStyle = color\n\tctx.textAlign = 'center'\n\tctx.textBaseline = 'middle'\n\n\t// Rotate canvas\n\tctx.translate(width / 2, height / 2)\n\tctx.rotate((rotate * Math.PI) / 180)\n\n\t// Draw text\n\tconst content = Array.isArray(options.content) ? options.content : [options.content]\n\tconst lineHeight = fontSize * 1.5\n\tconst startY = -((content.length - 1) * lineHeight) / 2\n\n\tcontent.forEach((text, index) => {\n\t\tctx.fillText(text, 0, startY + index * lineHeight)\n\t})\n\n\treturn canvas\n}\n\n/**\n * Create watermark element\n */\nfunction createWatermarkElement(canvas: HTMLCanvasElement, options: WatermarkOptions): HTMLDivElement {\n\tconst gap = Array.isArray(options.gap) ? options.gap : [options.gap || 100, options.gap || 100]\n\tconst zIndex = options.zIndex ?? 9999\n\n\tconst el = document.createElement('div')\n\tel.className = 'v-watermark'\n\tel.style.cssText = `\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tpointer-events: none;\n\t\tz-index: ${zIndex};\n\t\tbackground-image: url(\"${canvas.toDataURL()}\");\n\t\tbackground-repeat: repeat;\n\t\tbackground-position: ${gap[0] / 2}px ${gap[1] / 2}px;\n\t\tbackground-size: ${canvas.width + gap[0]}px ${canvas.height + gap[1]}px;\n\t`\n\n\treturn el\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: WatermarkBinding): WatermarkOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { content: binding }\n\t}\n\n\treturn {\n\t\tcontent: binding.content,\n\t\twidth: binding.width ?? 300,\n\t\theight: binding.height ?? 200,\n\t\trotate: binding.rotate ?? -22,\n\t\tfontSize: binding.fontSize ?? 16,\n\t\tfontFamily: binding.fontFamily ?? 'sans-serif',\n\t\tfontWeight: binding.fontWeight ?? 'normal',\n\t\tcolor: binding.color ?? 'rgba(128, 128, 128, 0.15)',\n\t\tgap: binding.gap ?? [100, 100],\n\t\tzIndex: binding.zIndex ?? 9999,\n\t\tdisabled: binding.disabled ?? false,\n\t\tprotect: binding.protect ?? true,\n\t}\n}\n\n/**\n * v-watermark directive\n *\n * Adds a watermark layer to an element.\n *\n * @example\n * ```vue\n * <template>\n * <!-- Simple watermark -->\n * <div v-watermark=\"'Confidential'\">Protected content</div>\n *\n * <!-- Multi-line watermark -->\n * <div v-watermark=\"{ content: ['Company Name', 'User: John'] }\">\n * Protected content\n * </div>\n *\n * <!-- Customized watermark -->\n * <div v-watermark=\"{\n * content: 'DRAFT',\n * fontSize: 24,\n * color: 'rgba(255, 0, 0, 0.2)',\n * rotate: -30,\n * gap: 50\n * }\">\n * Draft document\n * </div>\n * </template>\n * ```\n */\nexport const vWatermark = defineDirective<WatermarkBinding, HTMLElement>({\n\tname: 'watermark',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Make sure element has position\n\t\tconst computedStyle = getComputedStyle(el)\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst state: WatermarkState = {\n\t\t\toptions,\n\t\t\twatermarkEl: null,\n\t\t\tobserver: null,\n\t\t\tcanvas: null,\n\t\t}\n\n\t\t;(el as any).__watermark = state\n\n\t\tif (!options.disabled) {\n\t\t\tapplyWatermark(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: WatermarkState = (el as any).__watermark\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Check if disabled state changed\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disable: remove watermark\n\t\t\tremoveWatermark(state)\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Enable: add watermark\n\t\t\tstate.options = newOptions\n\t\t\tapplyWatermark(el, state)\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// Update watermark\n\t\t\tstate.options = newOptions\n\t\t\tremoveWatermark(state)\n\t\t\tapplyWatermark(el, state)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: WatermarkState | undefined = (el as any).__watermark\n\n\t\tif (!state) return\n\n\t\tremoveWatermark(state)\n\n\t\tdelete (el as any).__watermark\n\t},\n})\n\n/**\n * Apply watermark to element\n */\nfunction applyWatermark(el: HTMLElement, state: WatermarkState): void {\n\tconst options = state.options\n\n\t// Create canvas\n\tstate.canvas = createWatermarkCanvas(options)\n\n\t// Create watermark element\n\tstate.watermarkEl = createWatermarkElement(state.canvas, options)\n\n\t// Append to element\n\tel.appendChild(state.watermarkEl)\n\n\t// Set up protection observer if enabled\n\tif (options.protect) {\n\t\tsetupProtection(el, state)\n\t}\n}\n\n/**\n * Remove watermark\n */\nfunction removeWatermark(state: WatermarkState): void {\n\t// Disconnect observer\n\tif (state.observer) {\n\t\tstate.observer.disconnect()\n\t\tstate.observer = null\n\t}\n\n\t// Remove watermark element\n\tif (state.watermarkEl && state.watermarkEl.parentNode) {\n\t\tstate.watermarkEl.parentNode.removeChild(state.watermarkEl)\n\t}\n\n\tstate.watermarkEl = null\n\tstate.canvas = null\n}\n\n/**\n * Set up protection against removal\n */\nfunction setupProtection(el: HTMLElement, state: WatermarkState): void {\n\tif (typeof MutationObserver === 'undefined') return\n\n\tstate.observer = new MutationObserver(mutations => {\n\t\t// Check if watermark was removed\n\t\tif (!state.watermarkEl || !el.contains(state.watermarkEl)) {\n\t\t\t// Re-add watermark\n\t\t\tif (!state.options.disabled) {\n\t\t\t\tstate.canvas = createWatermarkCanvas(state.options)\n\t\t\t\tstate.watermarkEl = createWatermarkElement(state.canvas, state.options)\n\t\t\t\tel.appendChild(state.watermarkEl)\n\t\t\t}\n\t\t}\n\n\t\t// Check if watermark styles were modified\n\t\tfor (const mutation of mutations) {\n\t\t\tif (mutation.type === 'attributes' && mutation.target === state.watermarkEl) {\n\t\t\t\t// Restore styles\n\t\t\t\tconst gap = Array.isArray(state.options.gap) ? state.options.gap : [state.options.gap || 100, state.options.gap || 100]\n\n\t\t\t\tstate.watermarkEl.style.display = 'block'\n\t\t\t\tstate.watermarkEl.style.visibility = 'visible'\n\t\t\t\tstate.watermarkEl.style.opacity = '1'\n\t\t\t\tif (state.canvas) {\n\t\t\t\t\tstate.watermarkEl.style.backgroundImage = `url(\"${state.canvas.toDataURL()}\")`\n\t\t\t\t}\n\t\t\t\tstate.watermarkEl.style.backgroundSize = `${state.canvas!.width + gap[0]}px ${state.canvas!.height + gap[1]}px`\n\t\t\t}\n\t\t}\n\t})\n\n\tstate.observer.observe(el, {\n\t\tchildList: true,\n\t\tsubtree: true,\n\t\tattributes: true,\n\t\tattributeFilter: ['style', 'class', 'hidden'],\n\t})\n}\n\nexport default vWatermark\n","import type { DirectiveInstallOptions } from '@directix/core'\nimport type { App, Directive, Plugin } from 'vue'\nimport { setVueVersion } from '@directix/core'\nimport {\n\tvCapitalcase,\n\tvClickDelay,\n\tvClickOutside,\n\tvCopy,\n\tvCountdown,\n\tvDebounce,\n\tvDraggable,\n\tvEllipsis,\n\tvFocus,\n\tvHotkey,\n\tvHover,\n\tvImagePreview,\n\tvInfiniteScroll,\n\tvIntersect,\n\tvLazy,\n\tvLoading,\n\tvLongPress,\n\tvLowercase,\n\tvMask,\n\tvMoney,\n\tvMutation,\n\tvNumber,\n\tvPermission,\n\tvPrint,\n\tvPullRefresh,\n\tvResize,\n\tvRipple,\n\tvSanitize,\n\tvScroll,\n\tvSticky,\n\tvSwipe,\n\tvThrottle,\n\tvTooltip,\n\tvTouch,\n\tvTrim,\n\tvTruncate,\n\tvUppercase,\n\tvVirtualList,\n\tvVisible,\n\tvWatermark,\n} from './directives'\n\n// Export all directives\nexport * from './directives'\n\n// Export core utilities\nexport * from '@directix/core'\n\n// Export shared utilities (excluding tools with the same name as directives)\nexport {\n\tdeepClone,\n\tdeepMerge,\n\tgenerateId,\n\tget,\n\tisArray,\n\tisBoolean,\n\tisEmpty,\n\tisFunction,\n\tisNumber,\n\tisObject,\n\tisPromise,\n\tisString,\n\tparseTime,\n\tset,\n} from '@directix/shared'\n// Export debounce and throttle utility functions separately (with aliases)\nexport {\n\tdebounce as debounceFn,\n\tthrottle as throttleFn,\n} from '@directix/shared'\n\n// All directives list\nconst allDirectives: Record<string, Directive> = {\n\t'click-outside': vClickOutside,\n\t'click-delay': vClickDelay,\n\tcopy: vCopy,\n\tdebounce: vDebounce,\n\tthrottle: vThrottle,\n\tfocus: vFocus,\n\thotkey: vHotkey,\n\tlazy: vLazy,\n\tintersect: vIntersect,\n\tvisible: vVisible,\n\tloading: vLoading,\n\tscroll: vScroll,\n\t'infinite-scroll': vInfiniteScroll,\n\tsticky: vSticky,\n\t'long-press': vLongPress,\n\thover: vHover,\n\tripple: vRipple,\n\tmask: vMask,\n\tpermission: vPermission,\n\tsanitize: vSanitize,\n\tresize: vResize,\n\tmutation: vMutation,\n\ttruncate: vTruncate,\n\tellipsis: vEllipsis,\n\tuppercase: vUppercase,\n\tlowercase: vLowercase,\n\tcapitalcase: vCapitalcase,\n\tnumber: vNumber,\n\tmoney: vMoney,\n\ttrim: vTrim,\n\ttooltip: vTooltip,\n\tdraggable: vDraggable,\n\ttouch: vTouch,\n\tswipe: vSwipe,\n\t'image-preview': vImagePreview,\n\tcountdown: vCountdown,\n\twatermark: vWatermark,\n\tprint: vPrint,\n\t'virtual-list': vVirtualList,\n\t'pull-refresh': vPullRefresh,\n}\n\n/**\n * Install all directives\n */\nconst install = (app: App | any, options: DirectiveInstallOptions = {}): void => {\n\t// Detect Vue version from app instance\n\t// Vue 2: app is the Vue constructor (has version static property, has directive static method)\n\t// Vue 3: app is an app instance (has config property, version on app.constructor or as _context)\n\n\tlet vueVersion: 2 | 3 | null = null\n\n\t// Check if it's Vue 2 constructor\n\tif (typeof app === 'function' && app.version?.startsWith('2')) {\n\t\tvueVersion = 2\n\t} else if (app?.config && app?.version?.startsWith('3')) {\n\t\t// Check if it's Vue 3 app instance\n\t\tvueVersion = 3\n\t} else if (typeof app?.directive === 'function' && typeof app?.mixin === 'function' && app.version?.startsWith('2')) {\n\t\t// Check for Vue 2 static methods (directive, component, mixin, etc.)\n\t\tvueVersion = 2\n\t} else if (typeof window !== 'undefined') {\n\t\t// Fallback: check global Vue\n\t\tconst win = window as any\n\n\t\tif (win.Vue?.version?.startsWith('2')) {\n\t\t\tvueVersion = 2\n\t\t} else if (win.Vue?.version?.startsWith('3')) {\n\t\t\tvueVersion = 3\n\t\t}\n\t}\n\n\t// Set the detected version\n\tif (vueVersion) {\n\t\tsetVueVersion(vueVersion)\n\t}\n\n\tconst { directives, all = false } = options\n\n\tif (all || !directives) {\n\t\t// Register all directives\n\t\tObject.entries(allDirectives).forEach(([name, directive]) => {\n\t\t\tapp.directive(name, directive)\n\t\t})\n\t} else {\n\t\t// Register specified directives\n\t\tdirectives.forEach(name => {\n\t\t\tconst directive = allDirectives[name]\n\n\t\t\tif (directive) {\n\t\t\t\tapp.directive(name, directive)\n\t\t\t} else {\n\t\t\t\tconsole.warn(`[Directix] Unknown directive: ${name}`)\n\t\t\t}\n\t\t})\n\t}\n}\n\n/**\n * Directix plugin\n */\nexport const Directix: Plugin = {\n\tinstall,\n}\n"],"names":["normalizeBinding","addCleanup","normalizeOptions","cleanup","parseTime","_b","_a","setupState","getDistance","scrollTop","scrollHeight","clientHeight","STATE_KEY","transformText","bindEvents","unbindEvents","startIndex","endIndex","offsetY"],"mappings":"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"}