directix 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","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.mjs","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","../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/utils/event.ts","../src/directives/debounce.ts","../src/directives/draggable.ts","../src/directives/focus.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/resize.ts","../src/directives/ripple.ts","../src/directives/sanitize.ts","../src/directives/scroll.ts","../src/directives/sticky.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/visible.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 { 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","/**\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, 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, 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, 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 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, 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 type { DirectiveInstallOptions } from '@directix/core'\nimport type { App, Directive, Plugin } from 'vue'\nimport { setVueVersion } from '@directix/core'\nimport {\n\tvCapitalcase,\n\tvClickOutside,\n\tvCopy,\n\tvDebounce,\n\tvDraggable,\n\tvFocus,\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\tvResize,\n\tvRipple,\n\tvSanitize,\n\tvScroll,\n\tvSticky,\n\tvThrottle,\n\tvTooltip,\n\tvTouch,\n\tvTrim,\n\tvTruncate,\n\tvUppercase,\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\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\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\ttruncate: vTruncate,\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\t'image-preview': vImagePreview,\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","cleanup","_b","_a","getDistance","scrollTop","scrollHeight","clientHeight","STATE_KEY","transformText"],"mappings":"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"}