directix 1.0.0-beta.2 → 1.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../packages/core/src/env.ts","../packages/core/src/adapter/vue2.ts","../packages/core/src/adapter/vue3.ts","../packages/core/src/define.ts","../packages/shared/src/dom.ts","../packages/shared/src/event.ts","../packages/shared/src/utils.ts","../src/directives/click-outside.ts","../src/directives/copy.ts","../src/directives/debounce.ts","../src/directives/throttle.ts","../src/directives/focus.ts","../src/directives/lazy.ts","../src/directives/intersect.ts","../src/directives/visible.ts","../src/directives/loading.ts","../src/directives/scroll.ts","../src/directives/infinite-scroll.ts","../src/directives/sticky.ts","../src/directives/long-press.ts","../src/directives/hover.ts","../src/directives/ripple.ts","../src/directives/mask.ts","../src/directives/permission.ts","../src/directives/sanitize.ts","../src/directives/resize.ts","../src/directives/mutation.ts","../src/index.ts"],"sourcesContent":["/**\n * Vue version type\n * - 2: Vue 2.6.x (requires @vue/composition-api for Composition API)\n * - 2.7: Vue 2.7.x (has built-in Composition API support)\n * - 3: Vue 3.x\n */\nexport type VueVersion = 2 | 2.7 | 3\n\n/**\n * Vue version detection\n */\nlet _vueVersion: VueVersion | null = null,\n\t_isVue2: boolean | null = null,\n\t_isVue27: boolean | null = null,\n\t_isVue3: boolean | null = null\n\n/**\n * Parse version string to VueVersion\n */\nfunction parseVersion(version: string): VueVersion | null {\n\tif (version.startsWith('2.7')) return 2.7\n\tif (version.startsWith('2')) return 2\n\tif (version.startsWith('3')) return 3\n\n\treturn null\n}\n\n/**\n * Get current Vue version\n */\nexport function getVueVersion(): VueVersion {\n\tif (_vueVersion !== null) return _vueVersion\n\n\t// Method 1: Check environment variable (highest priority)\n\tif (typeof process !== 'undefined') {\n\t\tconst envVersion = process.env.DIRECTIX_VUE_VERSION\n\n\t\tif (envVersion === '2.7') {\n\t\t\t_vueVersion = 2.7\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '2') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\t\tif (envVersion === '3') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Method 2: Try require (CommonJS/Node.js)\n\ttry {\n\t\t// eslint-disable-next-line ts/no-require-imports\n\t\tconst vue = require('vue')\n\t\tconst version = parseVersion(vue?.version)\n\n\t\tif (version !== null) {\n\t\t\t_vueVersion = version\n\n\t\t\treturn _vueVersion\n\t\t}\n\t} catch {\n\t\t// require failed, continue to other methods\n\t}\n\n\t// Method 3: Check browser environment\n\tif (typeof window !== 'undefined') {\n\t\tconst win = window as any\n\t\tconst vue = win.Vue\n\n\t\t// Check version string\n\t\tif (vue?.version) {\n\t\t\tconst version = parseVersion(vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\n\t\t// Check Vue 2 specific API\n\t\tif (typeof vue?.observable === 'function') {\n\t\t\t_vueVersion = 2\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check Vue 3 specific API\n\t\tif (typeof vue?.createApp === 'function' && typeof vue?.observable !== 'function') {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\n\t\t// Check devtools hook\n\t\tconst devtools = win.__VUE_DEVTOOLS_GLOBAL_HOOK__\n\n\t\tif (devtools?.Vue?.version) {\n\t\t\tconst version = parseVersion(devtools.Vue.version)\n\n\t\t\tif (version !== null) {\n\t\t\t\t_vueVersion = version\n\n\t\t\t\treturn _vueVersion\n\t\t\t}\n\t\t}\n\t\tif (devtools?.apps?.length) {\n\t\t\t_vueVersion = 3\n\n\t\t\treturn _vueVersion\n\t\t}\n\t}\n\n\t// Default to Vue 3 but warn\n\tif (_vueVersion === null) {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tconsole.warn(\n\t\t\t\t'[Directix] Unable to detect Vue version, defaulting to Vue 3. ' +\n\t\t\t\t'Set DIRECTIX_VUE_VERSION=2 or call setVueVersion(2) if using Vue 2.',\n\t\t\t)\n\t\t}\n\t\t_vueVersion = 3\n\t}\n\n\treturn _vueVersion\n}\n\n/**\n * Set Vue version explicitly (for cases where auto-detection fails)\n */\nexport function setVueVersion(version: VueVersion): void {\n\t_vueVersion = version\n\t_isVue2 = version === 2 || version === 2.7\n\t_isVue27 = version === 2.7\n\t_isVue3 = version === 3\n}\n\n/**\n * Reset Vue version (useful for testing)\n */\nexport function resetVueVersion(): void {\n\t_vueVersion = null\n\t_isVue2 = null\n\t_isVue27 = null\n\t_isVue3 = null\n}\n\n/**\n * Check if Vue 2 (includes 2.7)\n */\nexport function isVue2(): boolean {\n\tif (_isVue2 === null) {\n\t\tconst version = getVueVersion()\n\n\t\t_isVue2 = version === 2 || version === 2.7\n\t}\n\n\treturn _isVue2\n}\n\n/**\n * Check if Vue 2.7 (has built-in Composition API support)\n */\nexport function isVue27(): boolean {\n\tif (_isVue27 === null) {\n\t\t_isVue27 = getVueVersion() === 2.7\n\t}\n\n\treturn _isVue27\n}\n\n/**\n * Check if Vue 3\n */\nexport function isVue3(): boolean {\n\tif (_isVue3 === null) {\n\t\t_isVue3 = getVueVersion() === 3\n\t}\n\n\treturn _isVue3\n}\n\n/**\n * Check if browser environment\n */\nexport const isBrowser = (): boolean => {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined'\n}\n\n/**\n * Check if server-side rendering\n */\nexport const isSSR = (): boolean => !isBrowser()\n\n/**\n * Check if passive event listening is supported\n */\nexport const supportsPassive = (): boolean => {\n\tif (!isBrowser()) return false\n\n\tlet supports = false\n\n\ttry {\n\t\tconst options = {\n\t\t\tget passive() {\n\t\t\t\tsupports = true\n\n\t\t\t\treturn false\n\t\t\t},\n\t\t}\n\n\t\twindow.addEventListener('test', null as any, options)\n\t\twindow.removeEventListener('test', null as any, options as any)\n\t} catch {\n\t\tsupports = false\n\t}\n\n\treturn supports\n}\n\n/**\n * Check if IntersectionObserver is supported\n */\nexport const supportsIntersectionObserver = (): boolean => {\n\treturn isBrowser() && 'IntersectionObserver' in window\n}\n\n/**\n * Check if ResizeObserver is supported\n */\nexport const supportsResizeObserver = (): boolean => {\n\treturn isBrowser() && 'ResizeObserver' in window\n}\n\n/**\n * Check if Clipboard API is supported\n */\nexport const supportsClipboard = (): boolean => {\n\treturn isBrowser() && 'clipboard' in navigator\n}\n\n/**\n * Check if MutationObserver is supported\n */\nexport const supportsMutationObserver = (): boolean => {\n\treturn isBrowser() && 'MutationObserver' in window\n}\n","import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 2 directive adapter\n * @returns Vue 2 directive object with bind/inserted/update/unbind hooks\n */\nexport function createVue2Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tbind(el: B, binding: any, vnode: VNode) {\n\t\t\t// Store state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tinserted(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 2's inserted is called after element is inserted into DOM\n\t\t\t// Call mounted here to ensure element is in DOM\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tupdate(el: B, binding: any, vnode: VNode, oldVnode: VNode) {\n\t\t\tconst state = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBinding(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBinding({ ...binding, value: binding.oldValue }),\n\t\t\t\t\toldVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tcomponentUpdated(_el: B, _binding: any, _vnode: VNode, _oldVnode: VNode) {\n\t\t\t// Vue 2 specific, called after component update completes\n\t\t\t// Usually update is sufficient\n\t\t},\n\n\t\tunbind(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBinding(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 2 binding to unified format\n */\nfunction normalizeBinding<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance || null,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","import type { VNode } from 'vue'\nimport type { DirectiveBinding, DirectiveHooks } from '../types'\n\n/**\n * Element state storage\n */\ninterface ElementState {\n\tvalue: any\n\tvnode: VNode\n\tcleanup: (() => void)[]\n}\n\n/**\n * Vue 3 directive adapter\n * @returns Vue 3 directive object with created/mounted/updated/unmounted hooks\n */\nexport function createVue3Directive<T, B extends Element>(\n\thooks: DirectiveHooks<T, B>,\n): Record<string, any> {\n\tconst directive = {\n\t\tcreated(el: B, binding: any, vnode: VNode) {\n\t\t\t// Vue 3's created is called when element is created\n\t\t\t// Initialize state\n\t\t\tconst state: ElementState = {\n\t\t\t\tvalue: binding.value,\n\t\t\t\tvnode,\n\t\t\t\tcleanup: [],\n\t\t\t}\n\n ;(el as any).__directix_state__ = state\n\t\t},\n\n\t\tbeforeMount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before mount\n\t\t},\n\n\t\tmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.mounted) {\n\t\t\t\thooks.mounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate(_el: B, _binding: any, _vnode: VNode, _prevVnode: VNode) {\n\t\t\t// Before update\n\t\t},\n\n\t\tupdated(el: B, binding: any, vnode: VNode, prevVnode: VNode) {\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (hooks.updated) {\n\t\t\t\thooks.updated(\n\t\t\t\t\tel,\n\t\t\t\t\tnormalizeBindingVue3(binding),\n\t\t\t\t\tvnode,\n\t\t\t\t\tnormalizeBindingVue3({ ...binding, value: binding.oldValue }),\n\t\t\t\t\tprevVnode,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\t// Update state\n\t\t\tif (state) {\n\t\t\t\tstate.value = binding.value\n\t\t\t\tstate.vnode = vnode\n\t\t\t}\n\t\t},\n\n\t\tbeforeUnmount(_el: B, _binding: any, _vnode: VNode) {\n\t\t\t// Before unmount\n\t\t},\n\n\t\tunmounted(el: B, binding: any, vnode: VNode) {\n\t\t\tif (hooks.unmounted) {\n\t\t\t\thooks.unmounted(el, normalizeBindingVue3(binding), vnode)\n\t\t\t}\n\n\t\t\t// Execute cleanup functions\n\t\t\tconst state: ElementState = (el as any).__directix_state__\n\n\t\t\tif (state?.cleanup) {\n\t\t\t\tstate.cleanup.forEach(fn => fn())\n\t\t\t}\n\t\t\tdelete (el as any).__directix_state__\n\t\t},\n\t}\n\n\treturn directive\n}\n\n/**\n * Normalize Vue 3 binding to unified format\n */\nfunction normalizeBindingVue3<T>(binding: any): DirectiveBinding<T> {\n\treturn {\n\t\tvalue: binding.value,\n\t\toldValue: binding.oldValue ?? null,\n\t\targ: binding.arg,\n\t\tmodifiers: binding.modifiers || {},\n\t\tinstance: binding.instance,\n\t}\n}\n\n/**\n * Add cleanup function to element\n */\nexport function addCleanup(el: Element, fn: () => void): void {\n\tconst state = (el as any).__directix_state__\n\n\tif (state) {\n\t\tstate.cleanup.push(fn)\n\t}\n}\n","import type { Directive } from 'vue'\nimport { getVueVersion, isSSR } from './env'\nimport { createVue2Directive } from './adapter/vue2'\nimport { createVue3Directive } from './adapter/vue3'\nimport type { DirectiveBinding, DirectiveDefinition, DirectiveHooks } from './types'\n\n/**\n * Define a cross-version compatible directive\n * @param definition The directive definition\n * @returns Vue directive object\n */\nexport function defineDirective<T = any, B extends Element = Element>(\n\tdefinition: DirectiveDefinition<T, B>,\n): Directive {\n\tconst { name, version, ssr, defaults, ...hooks } = definition\n\n\t// SSR check\n\tif (isSSR() && !ssr) {\n\t\tif (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'test') {\n\t\t\tconsole.warn(\n\t\t\t\t`[Directix] Directive \"${name}\" is not compatible with SSR. ` +\n\t\t\t\t'It will be a no-op on the server side.',\n\t\t\t)\n\t\t}\n\n\t\treturn createNoOpDirective()\n\t}\n\n\t// Wrap hooks with default values\n\tconst wrappedHooks: DirectiveHooks<T, B> = {\n\t\tmounted: hooks.mounted ? (el, binding, vnode) => {\n\t\t\thooks.mounted!(el, applyDefaults(binding, defaults), vnode)\n\t\t} : undefined,\n\n\t\tupdated: hooks.updated ? (el, binding, vnode, prevBinding, prevVnode) => {\n\t\t\thooks.updated!(el, applyDefaults(binding, defaults), vnode, prevBinding, prevVnode)\n\t\t} : undefined,\n\n\t\tunmounted: hooks.unmounted,\n\t}\n\n\t// Create a lazy directive that determines version at runtime\n\treturn createLazyDirective(wrappedHooks)\n}\n\n/**\n * Create a lazy directive that determines Vue version at first use\n */\nfunction createLazyDirective<T, B extends Element>(hooks: DirectiveHooks<T, B>): Directive {\n\tlet cachedDirective: any = null\n\n\t// Unified detection entry point\n\tfunction getDirective(): any {\n\t\tif (!cachedDirective) {\n\t\t\tcachedDirective = getVueVersion() === 2 ? createVue2Directive(hooks) : createVue3Directive(hooks)\n\t\t}\n\n\t\treturn cachedDirective\n\t}\n\n\t// Hook generator to reduce code duplication\n\tfunction createHook(hookName: string) {\n\t\treturn function (el: B, binding: any, vnode: any, prevVnode?: any) {\n\t\t\tgetDirective()[hookName]?.(el, binding, vnode, prevVnode)\n\t\t}\n\t}\n\n\treturn {\n\t\t// Vue 2 hooks\n\t\tbind: createHook('bind'),\n\t\tinserted: createHook('inserted'),\n\t\tupdate: createHook('update'),\n\t\tcomponentUpdated: createHook('componentUpdated'),\n\t\tunbind: createHook('unbind'),\n\t\t// Vue 3 hooks\n\t\tcreated: createHook('created'),\n\t\tbeforeMount: createHook('beforeMount'),\n\t\tmounted: createHook('mounted'),\n\t\tbeforeUpdate: createHook('beforeUpdate'),\n\t\tupdated: createHook('updated'),\n\t\tbeforeUnmount: createHook('beforeUnmount'),\n\t\tunmounted: createHook('unmounted'),\n\t} as Directive\n}\n\n/**\n * Apply default values to binding\n */\nfunction applyDefaults<T>(\n\tbinding: DirectiveBinding<T>,\n\tdefaults?: Partial<T>,\n): DirectiveBinding<T> {\n\tif (!defaults) return binding\n\n\tconst value =\n\t\ttypeof binding.value === 'object' && binding.value !== null ? { ...defaults, ...binding.value } : binding.value\n\n\treturn { ...binding, value: value as T }\n}\n\n/**\n * Create a no-op directive (for SSR)\n */\nfunction createNoOpDirective(): Directive {\n\treturn {\n\t\tmounted: () => {},\n\t\tupdated: () => {},\n\t\tunmounted: () => {},\n\t}\n}\n\n/**\n * Define a directive group\n */\nexport function defineDirectiveGroup(\n\tname: string,\n\tdirectives: Record<string, any>,\n): { name: string; directives: Record<string, any>; install: (app: any) => void } {\n\treturn {\n\t\tname,\n\t\tdirectives,\n\t\tinstall(app: any, _options?: any) {\n\t\t\tObject.entries(directives).forEach(([directiveName, directive]) => {\n\t\t\t\tconst fullName = `${name}-${directiveName}`\n\n\t\t\t\tapp.directive(fullName, directive)\n\t\t\t})\n\t\t},\n\t}\n}\n","import { isBrowser } from '@directix/core'\n\n/**\n * Check if value is an Element\n */\nexport function isElement(value: unknown): value is Element {\n\treturn value instanceof Element\n}\n\n/**\n * Check if value is an HTMLElement\n */\nexport function isHTMLElement(value: unknown): value is HTMLElement {\n\treturn value instanceof HTMLElement\n}\n\n/**\n * Get element by selector or return element itself\n */\nexport function getElement(target: string | Element | null | undefined): Element | null {\n\tif (!target) return null\n\n\tif (typeof target === 'string') {\n\t\tif (!isBrowser()) return null\n\n\t\treturn document.querySelector(target)\n\t}\n\n\treturn isElement(target) ? target : null\n}\n\n/**\n * Get all elements matching selector\n */\nexport function getAllElements(target: string): Element[] {\n\tif (!isBrowser()) return []\n\n\treturn Array.from(document.querySelectorAll(target))\n}\n\n/**\n * Add classes to element\n */\nexport function addClass(el: Element, ...classes: string[]): void {\n\tel.classList.add(...classes)\n}\n\n/**\n * Remove classes from element\n */\nexport function removeClass(el: Element, ...classes: string[]): void {\n\tel.classList.remove(...classes)\n}\n\n/**\n * Toggle class on element\n */\nexport function toggleClass(el: Element, className: string, force?: boolean): void {\n\tel.classList.toggle(className, force)\n}\n\n/**\n * Check if element has class\n */\nexport function hasClass(el: Element, className: string): boolean {\n\treturn el.classList.contains(className)\n}\n\n/**\n * Get element style property\n */\nexport function getStyle(el: Element, property: string): string {\n\tif (!isBrowser()) return ''\n\n\treturn getComputedStyle(el).getPropertyValue(property)\n}\n\n/**\n * Set element style property\n */\nexport function setStyle(el: HTMLElement, property: string, value: string | number): void {\n\tel.style.setProperty(property, typeof value === 'number' ? `${value}px` : value)\n}\n\n/**\n * Set multiple styles on element\n */\nexport function setStyles(el: HTMLElement, styles: Record<string, string | number>): void {\n\tObject.entries(styles).forEach(([property, value]) => {\n\t\tsetStyle(el, property, value)\n\t})\n}\n\n/**\n * Get element offset position\n */\nexport function getOffset(el: Element): { top: number; left: number } {\n\tif (!isBrowser()) return { top: 0, left: 0 }\n\tconst rect = el.getBoundingClientRect()\n\n\treturn {\n\t\ttop: rect.top + window.scrollY,\n\t\tleft: rect.left + window.scrollX,\n\t}\n}\n\n/**\n * Get element size\n */\nexport function getSize(el: Element): { width: number; height: number } {\n\tconst rect = el.getBoundingClientRect()\n\n\treturn {\n\t\twidth: rect.width,\n\t\theight: rect.height,\n\t}\n}\n\n/**\n * Check if element is in viewport\n */\nexport function isInViewport(el: Element): boolean {\n\tif (!isBrowser()) return false\n\tconst rect = el.getBoundingClientRect()\n\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t)\n}\n\n/**\n * Get nearest scrollable parent element\n */\nexport function getScrollParent(el: Element): Element | Window {\n\tif (!isBrowser()) return window\n\n\tlet parent: Element | null = el.parentElement\n\n\twhile (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\n\t\tparent = parent.parentElement\n\t}\n\n\treturn window\n}\n\n/**\n * Check if element matches selector\n */\nexport function matches(el: Element, selector: string): boolean {\n\treturn el.matches(selector)\n}\n\n/**\n * Get nearest ancestor matching selector\n */\nexport function closest(el: Element, selector: string): Element | null {\n\treturn el.closest(selector)\n}\n","import { isBrowser, supportsPassive } from '@directix/core'\n\nexport interface EventOptions {\n\tcapture?: boolean\n\tpassive?: boolean\n\tonce?: boolean\n}\n\n/**\n * Add event listener\n */\nexport function on(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: (event: Event) => void,\n\toptions: boolean | EventOptions = false,\n): void {\n\tif (!isBrowser()) return\n\tconst opts = normalizeOptions(options)\n\n\ttarget.addEventListener(event, handler, opts)\n}\n\n/**\n * Remove event listener\n */\nexport function off(\n\ttarget: EventTarget,\n\tevent: string,\n\thandler: (event: Event) => void,\n\toptions: boolean | EventOptions = false,\n): void {\n\tif (!isBrowser()) return\n\tconst opts = normalizeOptions(options)\n\n\ttarget.removeEventListener(event, handler, opts)\n}\n\n/**\n * Emit custom event\n */\nexport function emit(target: EventTarget, event: string, detail?: any): boolean {\n\tif (!isBrowser()) return false\n\n\treturn target.dispatchEvent(new CustomEvent(event, { detail }))\n}\n\n/**\n * Normalize event options\n */\nfunction normalizeOptions(options: boolean | EventOptions): boolean | { capture: boolean; passive: boolean; once: boolean } {\n\tif (typeof options === 'boolean') {\n\t\treturn options\n\t}\n\n\tconst { capture = false, passive = false, once = false } = options\n\n\tif (supportsPassive()) {\n\t\treturn { capture, passive, once }\n\t}\n\n\treturn capture\n}\n\n/**\n * Create event delegation\n */\nexport function delegate(\n\tcontainer: Element,\n\tselector: string,\n\tevent: string,\n\thandler: (el: Element, e: Event) => void,\n\toptions?: EventOptions,\n): () => void {\n\tconst listener = (e: Event): void => {\n\t\tconst target = e.target as Element\n\t\tconst matched = target.closest(selector)\n\n\t\tif (matched && container.contains(matched)) {\n\t\t\thandler(matched, e)\n\t\t}\n\t}\n\n\ton(container, event, listener, options)\n\n\treturn () => off(container, event, listener, options)\n}\n\n/**\n * Stop event propagation\n */\nexport function stopPropagation(e: Event): void {\n\te.stopPropagation()\n}\n\n/**\n * Prevent default behavior\n */\nexport function preventDefault(e: Event): void {\n\te.preventDefault()\n}\n\n/**\n * Stop event propagation and prevent default behavior\n */\nexport function stopEvent(e: Event): void {\n\tstopPropagation(e)\n\tpreventDefault(e)\n}\n\n/**\n * Get event target\n */\nexport function getEventTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.target as T | null\n}\n\n/**\n * Get current event target\n */\nexport function getCurrentTarget<T extends EventTarget = EventTarget>(e: Event): T | null {\n\treturn e.currentTarget as T | null\n}\n\n/**\n * Get mouse/touch position from event\n */\nexport function getEventPosition(\n\te: MouseEvent | TouchEvent,\n): { x: number; y: number; clientX: number; clientY: number } {\n\tlet clientX = 0,\n\t\tclientY = 0\n\n\tif ('touches' in e && e.touches.length > 0) {\n\t\tclientX = e.touches[0].clientX\n\t\tclientY = e.touches[0].clientY\n\t} else if ('clientX' in e) {\n\t\tclientX = e.clientX\n\t\tclientY = e.clientY\n\t}\n\n\treturn {\n\t\tx: clientX,\n\t\ty: clientY,\n\t\tclientX,\n\t\tclientY,\n\t}\n}\n","/**\n * Check if value is a string\n */\nexport function isString(value: unknown): value is string {\n\treturn typeof value === 'string'\n}\n\n/**\n * Check if value is a number\n */\nexport function isNumber(value: unknown): value is number {\n\treturn typeof value === 'number' && !Number.isNaN(value)\n}\n\n/**\n * Check if value is a boolean\n */\nexport function isBoolean(value: unknown): value is boolean {\n\treturn typeof value === 'boolean'\n}\n\n/**\n * Check if value is a function\n */\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n\treturn typeof value === 'function'\n}\n\n/**\n * Check if value is an object\n */\nexport function isObject(value: unknown): value is Record<string, any> {\n\treturn typeof value === 'object' && value !== null\n}\n\n/**\n * Check if value is an array\n */\nexport function isArray(value: unknown): value is any[] {\n\treturn Array.isArray(value)\n}\n\n/**\n * Check if value is empty\n */\nexport function isEmpty(value: unknown): boolean {\n\tif (value === null || value === undefined) return true\n\tif (isString(value) || isArray(value)) return value.length === 0\n\tif (isObject(value)) return Object.keys(value).length === 0\n\n\treturn false\n}\n\n/**\n * Check if value is a Promise\n */\nexport function isPromise<T = any>(value: unknown): value is Promise<T> {\n\treturn isObject(value) && isFunction((value as any).then)\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n\tif (obj === null || typeof obj !== 'object') {\n\t\treturn obj\n\t}\n\n\tif (Array.isArray(obj)) {\n\t\treturn obj.map(item => deepClone(item)) as unknown as T\n\t}\n\n\tconst cloned = {} as T\n\n\tfor (const key in obj) {\n\t\tif (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t\t\tcloned[key] = deepClone(obj[key])\n\t\t}\n\t}\n\n\treturn cloned\n}\n\n/**\n * Deep merge objects\n */\nexport function deepMerge<T extends Record<string, any>>(\n\ttarget: T,\n\t...sources: Partial<T>[]\n): T {\n\tif (!sources.length) return target\n\n\tconst source = sources.shift()\n\n\tif (isObject(target) && isObject(source)) {\n\t\tfor (const key in source) {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!target[key]) {\n\t\t\t\t\tObject.assign(target, { [key]: {} })\n\t\t\t\t}\n\t\t\t\tdeepMerge(\n\t\t\t\t\ttarget[key] as Record<string, any>,\n\t\t\t\t\tsource[key] as Record<string, any>,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tObject.assign(target, { [key]: source[key] })\n\t\t\t}\n\t\t}\n\t}\n\n\treturn deepMerge(target, ...sources)\n}\n\n/**\n * Get nested property value by path\n */\nexport function get<T = any>(\n\tobj: Record<string, any>,\n\tpath: string,\n\tdefaultValue?: T,\n): T {\n\tconst keys = path.split('.')\n\tlet result: any = obj\n\n\tfor (const key of keys) {\n\t\tif (result === null || result === undefined) {\n\t\t\treturn defaultValue as T\n\t\t}\n\t\tresult = result[key]\n\t}\n\n\treturn (result === undefined ? defaultValue : result) as T\n}\n\n/**\n * Set nested property value by path\n */\nexport function set(obj: Record<string, any>, path: string, value: any): void {\n\tconst keys = path.split('.')\n\tconst lastKey = keys.pop()!\n\tlet current = obj\n\n\tfor (const key of keys) {\n\t\tif (current[key] === undefined) {\n\t\t\tcurrent[key] = {}\n\t\t}\n\t\tcurrent = current[key]\n\t}\n\n\tcurrent[lastKey] = value\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean; trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void; flush: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null\n\n\tconst { leading = false, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst debounced = function (this: any, ...args: Parameters<T>): void {\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t}\n\n\t\tif (leading && !timerId) {\n\t\t\tinvokeFunc()\n\t\t}\n\n\t\ttimerId = setTimeout(() => {\n\t\t\tif (trailing) {\n\t\t\t\tinvokeFunc()\n\t\t\t}\n\t\t\ttimerId = null\n\t\t}, wait)\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void; flush: () => void }\n\n\tdebounced.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\tdebounced.flush = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\tinvokeFunc()\n\t\t\ttimerId = null\n\t\t}\n\t}\n\n\treturn debounced\n}\n\n/**\n * Throttle function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n\tfunc: T,\n\twait: number = 300,\n\toptions: { leading?: boolean; trailing?: boolean } = {},\n): ((...args: Parameters<T>) => void) & { cancel: () => void } {\n\tlet timerId: ReturnType<typeof setTimeout> | null = null,\n\t\tlastArgs: Parameters<T> | null = null,\n\t\tlastThis: any = null,\n\t\tlastCallTime = 0\n\n\tconst { leading = true, trailing = true } = options\n\n\tconst invokeFunc = (): void => {\n\t\tif (lastArgs) {\n\t\t\tfunc.apply(lastThis, lastArgs)\n\t\t\tlastArgs = null\n\t\t\tlastThis = null\n\t\t}\n\t}\n\n\tconst throttled = function (this: any, ...args: Parameters<T>): void {\n\t\tconst now = Date.now()\n\n\t\tif (!lastCallTime && !leading) {\n\t\t\tlastCallTime = now\n\t\t}\n\n\t\tconst remaining = wait - (now - lastCallTime)\n\n\t\tlastArgs = args\n\t\t// eslint-disable-next-line ts/no-this-alias\n\t\tlastThis = this\n\n\t\tif (remaining <= 0 || remaining > wait) {\n\t\t\tif (timerId) {\n\t\t\t\tclearTimeout(timerId)\n\t\t\t\ttimerId = null\n\t\t\t}\n\t\t\tlastCallTime = now\n\t\t\tinvokeFunc()\n\t\t} else if (!timerId && trailing) {\n\t\t\ttimerId = setTimeout(() => {\n\t\t\t\tlastCallTime = leading ? Date.now() : 0\n\t\t\t\ttimerId = null\n\t\t\t\tinvokeFunc()\n\t\t\t}, remaining)\n\t\t}\n\t} as ((...args: Parameters<T>) => void) & { cancel: () => void }\n\n\tthrottled.cancel = () => {\n\t\tif (timerId) {\n\t\t\tclearTimeout(timerId)\n\t\t\ttimerId = null\n\t\t}\n\t\tlastCallTime = 0\n\t\tlastArgs = null\n\t\tlastThis = null\n\t}\n\n\treturn throttled\n}\n\n/**\n * Parse time argument\n * Supports formats: \"300\" | \"300ms\" | \"1s\"\n */\nexport function parseTime(arg?: string): number | null {\n\tif (!arg) return null\n\n\tif (arg.endsWith('ms')) {\n\t\treturn Number.parseInt(arg, 10)\n\t}\n\n\tif (arg.endsWith('s')) {\n\t\treturn Number.parseFloat(arg) * 1000\n\t}\n\n\tconst num = Number.parseInt(arg, 10)\n\n\treturn Number.isNaN(num) ? null : num\n}\n\n/**\n * Generate unique ID\n */\nexport function generateId(prefix: string = ''): string {\n\treturn `${prefix}${Date.now().toString(36)}${Math.random().toString(36).slice(2, 9)}`\n}\n","import { defineDirective } from '@directix/core'\nimport { getElement, off, on } from '@directix/shared'\n\n/**\n * Click outside handler\n */\nexport type ClickOutsideHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Click outside directive options\n */\nexport interface ClickOutsideOptions {\n\t/**\n * Callback when clicking outside\n * @required\n */\n\thandler: ClickOutsideHandler\n\n\t/**\n * Excluded element selectors or element references\n */\n\texclude?: (string | HTMLElement | (() => HTMLElement | null))[]\n\n\t/**\n * Whether to use capture mode\n * @default true\n */\n\tcapture?: boolean\n\n\t/**\n * Event types to listen for\n * @default ['click']\n */\n\tevents?: ('click' | 'mousedown' | 'mouseup' | 'touchstart' | 'touchend')[]\n\n\t/**\n * Whether to disable\n * @default false\n */\n\tdisabled?: boolean\n\n\t/**\n * Stop propagation\n * @default false\n */\n\tstop?: boolean\n\n\t/**\n * Prevent default behavior\n * @default false\n */\n\tprevent?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ClickOutsideBinding = ClickOutsideHandler | ClickOutsideOptions\n\n/**\n * Element state storage\n */\ninterface ClickOutsideState {\n\toptions: ClickOutsideOptions\n\thandlers: Map<string, (event: Event) => void>\n}\n\n/**\n * v-click-outside directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-click-outside=\"handleClickOutside\">\n * Dropdown menu\n * </div>\n * </template>\n * ```\n */\nexport const vClickOutside = defineDirective<ClickOutsideBinding, HTMLElement>({\n\tname: 'click-outside',\n\tssr: false,\n\tdefaults: {\n\t\tcapture: true,\n\t\tevents: ['click'],\n\t\tdisabled: false,\n\t\tstop: false,\n\t\tprevent: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tconst state: ClickOutsideState = {\n\t\t\toptions,\n\t\t\thandlers: new Map(),\n\t\t}\n\n ;(el as any).__clickOutside = state\n\n\t\t// Create event handler\n\t\tconst createHandler = (_eventType: string) => {\n\t\t\treturn (event: Event) => {\n\t\t\t\t// Check event target\n\t\t\t\tif (!isValidClick(el, event, options)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Stop propagation\n\t\t\t\tif (options.stop) {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t}\n\n\t\t\t\t// Prevent default behavior\n\t\t\t\tif (options.prevent) {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t}\n\n\t\t\t\t// Call handler\n\t\t\t\toptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t}\n\t\t}\n\n\t\t// Bind events\n\t\toptions.events!.forEach(eventType => {\n\t\t\tconst handler = createHandler(eventType)\n\n\t\t\tstate.handlers.set(eventType, handler)\n\n\t\t\tconst listenerOptions = {\n\t\t\t\tcapture: options.capture,\n\t\t\t\tpassive: !options.prevent,\n\t\t\t}\n\n\t\t\ton(document, eventType, handler, listenerOptions)\n\t\t})\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\tconst oldOptions = state.options\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// If disabled state changes\n\t\tif (oldOptions.disabled !== newOptions.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\t// Remove all listeners\n\t\t\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\t\t\toff(document, eventType, handler, { capture: oldOptions.capture })\n\t\t\t\t})\n\t\t\t\tstate.handlers.clear()\n\t\t\t} else {\n\t\t\t\t// Re-add listeners\n\t\t\t\tconst createHandler = (_eventType: string) => {\n\t\t\t\t\treturn (event: Event) => {\n\t\t\t\t\t\tif (!isValidClick(el, event, newOptions)) return\n\t\t\t\t\t\tif (newOptions.stop) event.stopPropagation()\n\t\t\t\t\t\tif (newOptions.prevent) event.preventDefault()\n\t\t\t\t\t\tnewOptions.handler(event as MouseEvent | TouchEvent)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnewOptions.events!.forEach(eventType => {\n\t\t\t\t\tconst handler = createHandler(eventType)\n\n\t\t\t\t\tstate.handlers.set(eventType, handler)\n\t\t\t\t\ton(document, eventType, handler, {\n\t\t\t\t\t\tcapture: newOptions.capture,\n\t\t\t\t\t\tpassive: !newOptions.prevent,\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ClickOutsideState = (el as any).__clickOutside\n\n\t\tif (!state) return\n\n\t\t// Remove all event listeners\n\t\tstate.handlers.forEach((handler, eventType) => {\n\t\t\toff(document, eventType, handler, { capture: state.options.capture })\n\t\t})\n\n\t\tdelete (el as any).__clickOutside\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ClickOutsideBinding | undefined): ClickOutsideOptions {\n\tif (typeof binding === 'function') {\n\t\treturn {\n\t\t\thandler: binding,\n\t\t\tcapture: true,\n\t\t\tevents: ['click'],\n\t\t\tdisabled: false,\n\t\t\tstop: false,\n\t\t\tprevent: false,\n\t\t}\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-click-outside: handler is required')\n\t}\n\n\treturn {\n\t\tcapture: binding.capture ?? true,\n\t\tevents: binding.events ?? ['click'],\n\t\tdisabled: binding.disabled ?? false,\n\t\tstop: binding.stop ?? false,\n\t\tprevent: binding.prevent ?? false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if click is valid (outside the element)\n */\nfunction isValidClick(\n\tel: HTMLElement,\n\tevent: Event,\n\toptions: ClickOutsideOptions,\n): boolean {\n\tconst target = event.target as Node\n\n\t// Check if clicked on element itself or its children\n\tif (el.contains(target)) {\n\t\treturn false\n\t}\n\n\t// Check excluded elements\n\tif (options.exclude?.length) {\n\t\tfor (const exclude of options.exclude) {\n\t\t\tconst excludeEl = typeof exclude === 'function' ? exclude() : getElement(exclude)\n\n\t\t\tif (excludeEl && (excludeEl === target || excludeEl.contains(target))) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true\n}\n\nexport default vClickOutside\n","import { defineDirective, supportsClipboard } from '@directix/core'\n\n/**\n * Copy success callback\n */\nexport type CopySuccessCallback = (text: string) => void\n\n/**\n * Copy error callback\n */\nexport type CopyErrorCallback = (error: Error) => void\n\n/**\n * Copy directive options\n */\nexport interface CopyOptions {\n\t/**\n * Text to copy\n * @required\n */\n\tvalue: string\n\n\t/**\n * Callback on copy success\n */\n\tonSuccess?: CopySuccessCallback\n\n\t/**\n * Callback on copy error\n */\n\tonError?: CopyErrorCallback\n\n\t/**\n * Tooltip text for the copy button\n */\n\ttitle?: string\n\n\t/**\n * Whether to disable\n * @default false\n */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type CopyBinding = string | CopyOptions\n\n/**\n * Element state storage\n */\ninterface CopyState {\n\thandler: () => void\n\toptions: CopyOptions\n}\n\n/**\n * Copy text to clipboard\n * Prefer Clipboard API, fallback to execCommand\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n\t// Method 1: Use Clipboard API\n\tif (supportsClipboard()) {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text)\n\n\t\t\treturn true\n\t\t} catch {\n\t\t\t// Permission denied or other error, fallback\n\t\t\tconsole.warn('[Directix] Clipboard API failed, falling back to execCommand')\n\t\t}\n\t}\n\n\t// Method 2: Use execCommand (deprecated but has good compatibility)\n\treturn copyWithExecCommand(text)\n}\n\n/**\n * Copy using execCommand\n */\nfunction copyWithExecCommand(text: string): boolean {\n\t// Create temporary textarea\n\tconst textarea = document.createElement('textarea')\n\n\ttextarea.value = text\n\n\t// Set styles to make it invisible\n\ttextarea.style.cssText = `\n position: fixed;\n top: -9999px;\n left: -9999px;\n opacity: 0;\n pointer-events: none;\n `\n\n\tdocument.body.appendChild(textarea)\n\n\ttry {\n\t\t// Select and copy\n\t\ttextarea.select()\n\t\ttextarea.setSelectionRange(0, textarea.value.length)\n\n\t\treturn document.execCommand('copy')\n\t} catch {\n\t\treturn false\n\t} finally {\n\t\t// Cleanup\n\t\tdocument.body.removeChild(textarea)\n\t}\n}\n\n/**\n * v-copy directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-copy=\"textToCopy\">Copy Text</button>\n * </template>\n * ```\n */\nexport const vCopy = defineDirective<CopyBinding, HTMLElement>({\n\tname: 'copy',\n\tssr: false,\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Set tooltip\n\t\tif (options.title) {\n\t\t\tel.setAttribute('title', options.title)\n\t\t}\n\n\t\t// State storage - handler reads latest value from here\n\t\tconst state: CopyState = {\n\t\t\thandler: null as any,\n\t\t\toptions,\n\t\t}\n\n\t\t// Add click event - read latest options from state\n\t\tstate.handler = async () => {\n\t\t\tconst text = state.options.value\n\n\t\t\tif (!text) {\n\t\t\t\tconsole.warn('[Directix] v-copy: No text to copy')\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst success = await copyToClipboard(text)\n\n\t\t\t\tif (success) {\n\t\t\t\t\tstate.options.onSuccess?.(text)\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('copy:success', { detail: { text } }))\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error('Copy failed')\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst error = err as Error\n\n\t\t\t\tstate.options.onError?.(error)\n\t\t\t\tel.dispatchEvent(new CustomEvent('copy:error', { detail: { error } }))\n\t\t\t}\n\t\t}\n\n\t\tel.addEventListener('click', state.handler)\n\t\t;(el as any).__copy = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.title) {\n\t\t\tel.setAttribute('title', state.options.title)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: CopyState = (el as any).__copy\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('click', state.handler)\n\t\tdelete (el as any).__copy\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: CopyBinding): CopyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\nexport default vCopy\n","import { defineDirective } from '@directix/core'\nimport { debounce, parseTime } from '@directix/shared'\nimport type { DirectiveBinding } from '@directix/core'\n\n/**\n * Debounced function type\n */\nexport interface DebouncedFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n\tflush: () => void\n}\n\n/**\n * Debounce directive options\n */\nexport interface DebounceOptions<T extends (...args: any[]) => any = any> {\n\t/**\n * Function to debounce\n */\n\thandler: T\n\n\t/**\n * Delay time in milliseconds\n * @default 300\n */\n\twait?: number\n\n\t/**\n * Whether to invoke immediately before delay starts\n * @default false\n */\n\tleading?: boolean\n\n\t/**\n * Whether to invoke after delay ends\n * @default true\n */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type DebounceBinding<T extends (...args: any[]) => any = any> =\n | T\n | DebounceOptions<T>\n\n/**\n * Element state storage\n */\ninterface DebounceState {\n\tdebouncedFn: DebouncedFunction<any>\n\teventType: string\n\toptions: DebounceOptions\n}\n\n/**\n * v-debounce directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-debounce=\"handleInput\" />\n * <input v-debounce:500ms=\"handleInput\" />\n * <input v-debounce=\"{ handler: handleInput, wait: 500 }\" />\n * <div v-debounce.scroll=\"handleScroll\">Scroll Debounce</div>\n * <div v-debounce:100.scroll=\"handleScroll\">100ms Scroll Debounce</div>\n * </template>\n * ```\n */\nexport const vDebounce = defineDirective<DebounceBinding, HTMLElement>({\n\tname: 'debounce',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: false,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getEventType(el)\n\n\t\t// Create debounced function\n\t\tconst debouncedFn = debounce(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, debouncedFn as any)\n\n\t\t;(el as any).__debounce = {\n\t\t\tdebouncedFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate debounced function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait ||\n\t\t\tnewOptions.leading !== state.options.leading ||\n\t\t\tnewOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.debouncedFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst debouncedFn = debounce(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\t\tel.addEventListener(state.eventType, debouncedFn as any)\n\n\t\t\t;(el as any).__debounce = {\n\t\t\t\tdebouncedFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: DebounceState = (el as any).__debounce\n\n\t\tif (!state) return\n\n\t\tstate.debouncedFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.debouncedFn as any)\n\t\tdelete (el as any).__debounce\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: DebounceBinding,\n\tdirectiveBinding: DirectiveBinding<DebounceBinding>,\n): DebounceOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * Get default event type for element\n */\nfunction getEventType(el: HTMLElement): string {\n\tconst tagName = el.tagName.toLowerCase()\n\n\tif (tagName === 'input' || tagName === 'textarea') {\n\t\treturn 'input'\n\t}\n\n\treturn 'click'\n}\n\n/**\n * Supported event type modifiers list\n */\nconst EVENT_MODIFIERS = [\n\t'click',\n\t'input',\n\t'change',\n\t'submit',\n\t'scroll',\n\t'resize',\n\t'mouseenter',\n\t'mouseleave',\n\t'mousemove',\n\t'mousedown',\n\t'mouseup',\n\t'keydown',\n\t'keyup',\n\t'focus',\n\t'blur',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n] as const\n\n/**\n * Extract event type from modifiers\n */\nfunction getEventTypeFromModifiers(modifiers: Record<string, boolean>): string | null {\n\tfor (const modifier of EVENT_MODIFIERS) {\n\t\tif (modifiers[modifier]) {\n\t\t\treturn modifier\n\t\t}\n\t}\n\n\treturn null\n}\n\nexport default vDebounce\n","import { defineDirective } from '@directix/core'\nimport { parseTime, throttle } from '@directix/shared'\nimport type { DirectiveBinding } from '@directix/core'\n\n/**\n * Throttled function type\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n\t(...args: Parameters<T>): void\n\tcancel: () => void\n}\n\n/**\n * Throttle directive options\n */\nexport interface ThrottleOptions<T extends (...args: any[]) => any = any> {\n\t/**\n * Function to throttle\n */\n\thandler: T\n\n\t/**\n * Delay time in milliseconds\n * @default 300\n */\n\twait?: number\n\n\t/**\n * Whether to invoke immediately before delay starts\n * @default true\n */\n\tleading?: boolean\n\n\t/**\n * Whether to invoke after delay ends\n * @default true\n */\n\ttrailing?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type ThrottleBinding<T extends (...args: any[]) => any = any> =\n | T\n | ThrottleOptions<T>\n\n/**\n * Element state storage\n */\ninterface ThrottleState {\n\tthrottledFn: ThrottledFunction<any>\n\teventType: string\n\toptions: ThrottleOptions\n}\n\n/**\n * v-throttle directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-throttle=\"handleClick\">Throttled Button</button>\n * <button v-throttle:1s=\"handleClick\">1s Throttled</button>\n * <div v-throttle.scroll=\"handleScroll\">Scroll Throttle</div>\n * <div v-throttle:100.scroll=\"handleScroll\">100ms Scroll Throttle</div>\n * </template>\n * ```\n */\nexport const vThrottle = defineDirective<ThrottleBinding, HTMLElement>({\n\tname: 'throttle',\n\tssr: true, // SSR safe - event binding is skipped on server\n\tdefaults: {\n\t\twait: 300,\n\t\tleading: true,\n\t\ttrailing: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value, binding)\n\t\t// Prefer event type from modifiers, otherwise infer from element type\n\t\tconst eventType = getEventTypeFromModifiers(binding.modifiers) || getEventType(el)\n\n\t\t// Create throttled function\n\t\tconst throttledFn = throttle(options.handler, options.wait, {\n\t\t\tleading: options.leading,\n\t\t\ttrailing: options.trailing,\n\t\t})\n\n\t\t// Bind event\n\t\tel.addEventListener(eventType, throttledFn as any)\n\n\t\t;(el as any).__throttle = {\n\t\t\tthrottledFn,\n\t\t\teventType,\n\t\t\toptions,\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value, binding)\n\n\t\t// If configuration changes, recreate throttled function\n\t\tif (\n\t\t\tnewOptions.wait !== state.options.wait ||\n\t\t\tnewOptions.leading !== state.options.leading ||\n\t\t\tnewOptions.trailing !== state.options.trailing\n\t\t) {\n\t\t\t// Cancel old one\n\t\t\tstate.throttledFn.cancel()\n\n\t\t\t// Create new one\n\t\t\tconst throttledFn = throttle(newOptions.handler, newOptions.wait, {\n\t\t\t\tleading: newOptions.leading,\n\t\t\t\ttrailing: newOptions.trailing,\n\t\t\t})\n\n\t\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\t\tel.addEventListener(state.eventType, throttledFn as any)\n\n\t\t\t;(el as any).__throttle = {\n\t\t\t\tthrottledFn,\n\t\t\t\teventType: state.eventType,\n\t\t\t\toptions: newOptions,\n\t\t\t}\n\t\t} else if (newOptions.handler !== state.options.handler) {\n\t\t\t// Only update handler\n\t\t\tstate.options.handler = newOptions.handler\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ThrottleState = (el as any).__throttle\n\n\t\tif (!state) return\n\n\t\tstate.throttledFn.cancel()\n\t\tel.removeEventListener(state.eventType, state.throttledFn as any)\n\t\tdelete (el as any).__throttle\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(\n\tbinding: ThrottleBinding,\n\tdirectiveBinding: DirectiveBinding<ThrottleBinding>,\n): ThrottleOptions {\n\tconst wait = parseTime(directiveBinding.arg) || 300\n\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, wait }\n\t}\n\n\treturn { ...binding, wait: binding.wait || wait }\n}\n\n/**\n * Get default event type for element\n */\nfunction getEventType(el: HTMLElement): string {\n\tconst tagName = el.tagName.toLowerCase()\n\n\tif (tagName === 'input' || tagName === 'textarea') {\n\t\treturn 'input'\n\t}\n\n\treturn 'click'\n}\n\n/**\n * Supported event type modifiers list\n */\nconst EVENT_MODIFIERS = [\n\t'click',\n\t'input',\n\t'change',\n\t'submit',\n\t'scroll',\n\t'resize',\n\t'mouseenter',\n\t'mouseleave',\n\t'mousemove',\n\t'mousedown',\n\t'mouseup',\n\t'keydown',\n\t'keyup',\n\t'focus',\n\t'blur',\n\t'touchstart',\n\t'touchmove',\n\t'touchend',\n] as const\n\n/**\n * Extract event type from modifiers\n */\nfunction getEventTypeFromModifiers(modifiers: Record<string, boolean>): string | null {\n\tfor (const modifier of EVENT_MODIFIERS) {\n\t\tif (modifiers[modifier]) {\n\t\t\treturn modifier\n\t\t}\n\t}\n\n\treturn null\n}\n\nexport default vThrottle\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Focus directive options\n */\nexport interface FocusOptions {\n\t/**\n\t * Whether to auto focus\n\t * @default true\n\t */\n\tfocus?: boolean\n\n\t/**\n\t * Whether to refocus when binding value changes\n\t * @default false\n\t */\n\trefocus?: boolean\n\n\t/**\n\t * Callback when focused\n\t */\n\tonFocus?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when blurred\n\t */\n\tonBlur?: (el: HTMLElement) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type FocusBinding = boolean | FocusOptions\n\n/**\n * Element state storage\n */\ninterface FocusState {\n\toptions: FocusOptions\n\thandleFocus: () => void\n\thandleBlur: () => void\n\tlastValue: FocusBinding\n}\n\nconst FOCUSABLE_TAGS = new Set(['input', 'textarea', 'select', 'button'])\n\n/**\n * Compare two values for equality (supports primitive types and shallow object comparison)\n */\nfunction isEqual(a: unknown, b: unknown): boolean {\n\tif (a === b) return true\n\tif (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false\n\tconst objA = a as Record<string, unknown>\n\tconst objB = b as Record<string, unknown>\n\tconst keysA = Object.keys(objA)\n\tconst keysB = Object.keys(objB)\n\n\tif (keysA.length !== keysB.length) return false\n\n\treturn keysA.every(key => objA[key] === objB[key])\n}\n\n/**\n * v-focus directive\n *\n * @example\n * ```vue\n * <template>\n * <input v-focus />\n * <input v-focus=\"{ focus: true, refocus: true }\" />\n * </template>\n * ```\n */\nexport const vFocus = defineDirective<FocusBinding, HTMLElement>({\n\tname: 'focus',\n\tssr: true, // SSR safe - will skip focus on server\n\tdefaults: {\n\t\tfocus: true,\n\t\trefocus: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (!options.focus || !isFocusable(el)) {\n\t\t\tif (options.focus) {\n\t\t\t\tconsole.warn('[Directix] v-focus: Element is not focusable')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst handleFocus = (): void => options.onFocus?.(el)\n\t\tconst handleBlur = (): void => options.onBlur?.(el)\n\n\t\tel.addEventListener('focus', handleFocus)\n\t\tel.addEventListener('blur', handleBlur)\n\n\t\t;(el as any).__focus = {\n\t\t\toptions,\n\t\t\thandleFocus,\n\t\t\thandleBlur,\n\t\t\tlastValue: binding.value,\n\t\t} as FocusState\n\n\t\tel.focus()\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Update event listeners only when callbacks change\n\t\tif (newOptions.onFocus !== state.options.onFocus) {\n\t\t\tel.removeEventListener('focus', state.handleFocus)\n\t\t\tstate.handleFocus = () => newOptions.onFocus?.(el)\n\t\t\tel.addEventListener('focus', state.handleFocus)\n\t\t}\n\n\t\tif (newOptions.onBlur !== state.options.onBlur) {\n\t\t\tel.removeEventListener('blur', state.handleBlur)\n\t\t\tstate.handleBlur = () => newOptions.onBlur?.(el)\n\t\t\tel.addEventListener('blur', state.handleBlur)\n\t\t}\n\n\t\t// Check if value actually changed\n\t\tconst valueChanged = !isEqual(binding.value, state.lastValue)\n\n\t\t// Refocus when value changes and refocus is enabled\n\t\tif (newOptions.refocus && newOptions.focus && valueChanged) {\n\t\t\tel.focus()\n\t\t}\n\n\t\tstate.options = newOptions\n\t\tstate.lastValue = binding.value\n\t},\n\n\tunmounted(el) {\n\t\tconst state: FocusState | undefined = (el as any).__focus\n\n\t\tif (!state) return\n\n\t\tel.removeEventListener('focus', state.handleFocus)\n\t\tel.removeEventListener('blur', state.handleBlur)\n\t\tdelete (el as any).__focus\n\t},\n})\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: FocusBinding | undefined): FocusOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { focus: binding, refocus: false }\n\t}\n\n\treturn {\n\t\tfocus: true,\n\t\trefocus: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Check if element is focusable\n */\nfunction isFocusable(el: HTMLElement): boolean {\n\tif (!isBrowser()) return false\n\n\tconst tagName = el.tagName.toLowerCase()\n\n\t// Form elements\n\tif (FOCUSABLE_TAGS.has(tagName)) {\n\t\treturn !(el as HTMLInputElement).disabled\n\t}\n\n\t// Contenteditable elements\n\tif (el.isContentEditable) return true\n\n\t// Elements with tabindex\n\tconst tabindex = el.getAttribute('tabindex')\n\n\tif (tabindex != null) return tabindex !== '-1'\n\n\t// Link elements\n\tif (tagName === 'a' || tagName === 'area') {\n\t\treturn el.hasAttribute('href')\n\t}\n\n\treturn false\n}\n\nexport default vFocus\n","import { defineDirective, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Lazy loading state\n */\nexport type LazyState = 'pending' | 'loading' | 'loaded' | 'error'\n\n/**\n * Lazy directive options\n */\nexport interface LazyOptions {\n\t/**\n\t * Image source URL\n\t */\n\tsrc?: string\n\n\t/**\n\t * Placeholder image URL\n\t */\n\tplaceholder?: string\n\n\t/**\n\t * Error image URL (shown when loading fails)\n\t */\n\terror?: string\n\n\t/**\n\t * Preload distance in pixels\n\t * @default 0\n\t */\n\tpreload?: number\n\n\t/**\n\t * Callback when image loads successfully\n\t */\n\tonLoad?: (el: HTMLElement) => void\n\n\t/**\n\t * Callback when image fails to load\n\t */\n\tonError?: (el: HTMLElement, error: Error) => void\n\n\t/**\n\t * Number of retry attempts\n\t * @default 1\n\t */\n\tattempt?: number\n\n\t/**\n\t * Filter function, return false to skip loading\n\t */\n\tfilter?: (src: string) => boolean\n\n\t/**\n\t * Custom IntersectionObserver\n\t */\n\tobserver?: IntersectionObserver\n\n\t/**\n\t * Whether to disable lazy loading\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LazyBinding = string | LazyOptions\n\n/**\n * Element state storage\n */\ninterface LazyElementState {\n\toptions: LazyOptions\n\tattempt: number\n\tobserver?: IntersectionObserver\n}\n\n// Global observer instance\nlet globalObserver: IntersectionObserver | null = null\n\n/**\n * Get or create global IntersectionObserver\n */\nfunction getGlobalObserver(preload: number): IntersectionObserver {\n\tif (globalObserver) return globalObserver\n\n\tglobalObserver = new IntersectionObserver(\n\t\tentries => {\n\t\t\tentries.forEach(entry => {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tload(entry.target as HTMLElement)\n\t\t\t\t\tglobalObserver?.unobserve(entry.target)\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\trootMargin: `${preload}px`,\n\t\t},\n\t)\n\n\treturn globalObserver\n}\n\n/**\n * Set image source on element\n */\nfunction setSrc(el: HTMLElement, src: string): void {\n\tif (el.tagName === 'IMG') {\n\t\t;(el as HTMLImageElement).src = src\n\t} else {\n\t\tel.style.backgroundImage = `url(\"${src}\")`\n\t}\n}\n\n/**\n * Set lazy state on element\n */\nfunction setLazyState(el: HTMLElement, state: LazyState): void {\n\tel.dataset.lazyState = state\n}\n\n/**\n * Get lazy state from element\n */\nfunction getLazyState(el: HTMLElement): LazyState {\n\treturn (el.dataset.lazyState as LazyState) || 'pending'\n}\n\n/**\n * Load image\n */\nfunction load(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state || !state.options.src) return\n\n\t// Filter check\n\tif (state.options.filter && !state.options.filter(state.options.src)) {\n\t\treturn\n\t}\n\n\tsetLazyState(el, 'loading')\n\tstate.attempt++\n\n\tel.classList.add('v-lazy--loading')\n\n\tconst img = new Image()\n\n\timg.onload = () => {\n\t\tsetSrc(el, state.options.src!)\n\t\tsetLazyState(el, 'loaded')\n\t\tel.classList.remove('v-lazy--loading')\n\t\tel.classList.add('v-lazy--loaded')\n\t\tstate.options.onLoad?.(el)\n\t}\n\n\timg.onerror = () => {\n\t\tel.classList.remove('v-lazy--loading')\n\n\t\t// Check if should retry\n\t\tif (state.attempt < (state.options.attempt || 1)) {\n\t\t\tsetTimeout(() => load(el), 1000 * state.attempt)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Show error image\n\t\tif (state.options.error) {\n\t\t\tsetSrc(el, state.options.error)\n\t\t}\n\n\t\tsetLazyState(el, 'error')\n\t\tel.classList.add('v-lazy--error')\n\t\tstate.options.onError?.(el, new Error('Failed to load image'))\n\t}\n\n\timg.src = state.options.src\n}\n\n/**\n * Observe element\n */\nfunction observe(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\t// Check IntersectionObserver support\n\tif (!supportsIntersectionObserver()) {\n\t\t// Fallback: load directly\n\t\tload(el)\n\n\t\treturn\n\t}\n\n\t// Use custom observer or global observer\n\tif (state.options.observer) {\n\t\tstate.observer = state.options.observer\n\t\tstate.observer.observe(el)\n\t} else {\n\t\tconst observer = getGlobalObserver(state.options.preload || 0)\n\n\t\tstate.observer = observer\n\t\tobserver.observe(el)\n\t}\n}\n\n/**\n * Unobserve element\n */\nfunction unobserve(el: HTMLElement): void {\n\tconst state: LazyElementState = (el as any).__lazy\n\n\tif (!state) return\n\n\tif (state.observer) {\n\t\tstate.observer.unobserve(el)\n\t} else if (globalObserver) {\n\t\tglobalObserver.unobserve(el)\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LazyBinding | undefined): LazyOptions {\n\tif (typeof binding === 'string') {\n\t\treturn { src: binding }\n\t}\n\n\treturn binding || {}\n}\n\n/**\n * v-lazy directive\n *\n * @example\n * ```vue\n * <template>\n * <img v-lazy=\"imageUrl\" />\n * <img v-lazy=\"{ src: imageUrl, placeholder: 'placeholder.jpg' }\" />\n * <div v-lazy=\"backgroundImageUrl\"></div>\n * </template>\n * ```\n */\nexport const vLazy = defineDirective<LazyBinding, HTMLElement>({\n\tname: 'lazy',\n\tssr: false,\n\tdefaults: {\n\t\tpreload: 0,\n\t\tattempt: 1,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\tif (!options.src) {\n\t\t\tconsole.warn('[Directix] v-lazy: No source provided')\n\n\t\t\treturn\n\t\t}\n\n\t\t// Set initial state\n\t\tsetLazyState(el, 'pending')\n\n\t\t// Set placeholder\n\t\tif (options.placeholder) {\n\t\t\tsetSrc(el, options.placeholder)\n\t\t}\n\n\t\t// Add class\n\t\tel.classList.add('v-lazy')\n\n\t\t// Store state\n\t\tconst state: LazyElementState = {\n\t\t\toptions,\n\t\t\tattempt: 0,\n\t\t}\n\n\t\t;(el as any).__lazy = state\n\n\t\t// Start observing\n\t\tobserve(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LazyElementState = (el as any).__lazy\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\tunobserve(el)\n\n\t\t\treturn\n\t\t}\n\n\t\tif (newOptions.src !== state.options.src) {\n\t\t\tstate.options = newOptions\n\t\t\tstate.attempt = 0\n\n\t\t\t// If already loaded, reload\n\t\t\tif (getLazyState(el) !== 'pending') {\n\t\t\t\tsetLazyState(el, 'pending')\n\t\t\t\tel.classList.remove('v-lazy--loaded', 'v-lazy--error')\n\n\t\t\t\tif (newOptions.placeholder) {\n\t\t\t\t\tsetSrc(el, newOptions.placeholder)\n\t\t\t\t}\n\n\t\t\t\tobserve(el)\n\t\t\t}\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tunobserve(el)\n\t\tdelete (el as any).__lazy\n\t},\n})\n\nexport default vLazy\n","import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\n\n/**\n * Intersect event handler\n */\nexport type IntersectHandler = (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\n/**\n * Intersect directive options\n */\nexport interface IntersectOptions {\n\t/** Callback when element intersects */\n\thandler?: IntersectHandler\n\t/** Callback when element enters viewport */\n\tonEnter?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element leaves viewport */\n\tonLeave?: (entry: IntersectionObserverEntry, observer: IntersectionObserver) => void\n\t/** Callback when element changes intersection */\n\tonChange?: (isIntersecting: boolean, entry: IntersectionObserverEntry) => void\n\t/** Root element for intersection @default null (viewport) */\n\troot?: Element | null\n\t/** Margin around the root @default '0px' */\n\trootMargin?: string\n\t/** Threshold(s) at which to trigger callback @default 0 */\n\tthreshold?: number | number[]\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Whether to trigger only once @default false */\n\tonce?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type IntersectBinding = IntersectHandler | IntersectOptions\n\n/**\n * Element state storage\n */\ninterface IntersectState {\n\toptions: IntersectOptions\n\tobserver: IntersectionObserver | null\n\thasTriggeredOnce: boolean\n}\n\nconst STATE_KEY = '__intersect'\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: IntersectBinding | undefined): IntersectOptions {\n\tconst options: IntersectOptions = typeof binding === 'function' ? { handler: binding } : { ...binding }\n\n\t// Unref root if it's a ref object (for Vue Composition API)\n\tif (options.root !== null && typeof options.root === 'object' && 'value' in options.root) {\n\t\toptions.root = (options.root as { value: Element | null }).value\n\t}\n\n\treturn options\n}\n\n/**\n * Create observer callback\n */\nfunction createObserverCallback(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): (entries: IntersectionObserverEntry[]) => void {\n\treturn entries => {\n\t\tfor (const entry of entries) {\n\t\t\tif (options.once && state.hasTriggeredOnce) continue\n\n\t\t\tconst { isIntersecting } = entry\n\n\t\t\toptions.handler?.(entry, state.observer!)\n\t\t\toptions.onChange?.(isIntersecting, entry)\n\n\t\t\tif (isIntersecting) {\n\t\t\t\toptions.onEnter?.(entry, state.observer!)\n\t\t\t\tif (options.once) state.hasTriggeredOnce = true\n\t\t\t} else {\n\t\t\t\toptions.onLeave?.(entry, state.observer!)\n\t\t\t}\n\n\t\t\tel.dispatchEvent(new CustomEvent('intersect', { detail: { isIntersecting, entry } }))\n\t\t}\n\t}\n}\n\n/**\n * Create IntersectionObserver\n */\nfunction createObserver(\n\tel: HTMLElement,\n\tstate: IntersectState,\n\toptions: IntersectOptions,\n): IntersectionObserver {\n\treturn new IntersectionObserver(createObserverCallback(el, state, options), {\n\t\troot: options.root,\n\t\trootMargin: options.rootMargin,\n\t\tthreshold: options.threshold,\n\t})\n}\n\n/**\n * v-intersect directive\n *\n * @example\n * ```vue\n * <div v-intersect=\"handleIntersect\">Observe me</div>\n * <div v-intersect=\"{ onEnter: handleEnter, onLeave: handleLeave }\">Track visibility</div>\n * <div v-intersect=\"{ threshold: 0.5, once: true }\">Trigger once at 50%</div>\n * ```\n */\nexport const vIntersect = defineDirective<IntersectBinding, HTMLElement>({\n\tname: 'intersect',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tonce: false,\n\t\trootMargin: '0px',\n\t\tthreshold: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser() || !supportsIntersectionObserver()) {\n\t\t\tif (!supportsIntersectionObserver()) {\n\t\t\t\tconsole.warn('[Directix] v-intersect: IntersectionObserver not supported')\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: IntersectState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\thasTriggeredOnce: false,\n\t\t}\n\n\t\tstate.observer = createObserver(el, state, options)\n\t\t;(el as any)[STATE_KEY] = state\n\t\tstate.observer.observe(el)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\t\tconst observerOptionsChanged =\n\t\t\tnewOptions.root !== state.options.root ||\n\t\t\tnewOptions.rootMargin !== state.options.rootMargin ||\n\t\t\tnewOptions.threshold !== state.options.threshold\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled !== state.options.disabled) {\n\t\t\tif (newOptions.disabled) {\n\t\t\t\tstate.observer?.disconnect()\n\t\t\t} else {\n\t\t\t\tstate.observer?.observe(el)\n\t\t\t}\n\t\t}\n\n\t\t// Recreate observer if options changed\n\t\tif (observerOptionsChanged) {\n\t\t\tstate.observer?.disconnect()\n\t\t\tstate.observer = createObserver(el, state, newOptions)\n\t\t\tstate.observer.observe(el)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: IntersectState | undefined = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.observer?.disconnect()\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vIntersect\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Visible change handler\n */\nexport type VisibleHandler = (isVisible: boolean) => void\n\n/**\n * Visible directive options\n */\nexport interface VisibleOptions {\n\t/**\n\t * Callback when visibility changes\n\t */\n\thandler?: VisibleHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to set visibility: hidden instead of display: none\n\t * @default false\n\t */\n\tuseHidden?: boolean\n\n\t/**\n\t * Initial visibility\n\t * @default true\n\t */\n\tinitial?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type VisibleBinding = boolean | VisibleOptions\n\n/**\n * Element state storage\n */\ninterface VisibleState {\n\toptions: VisibleOptions\n\tisVisible: boolean\n\toriginalDisplay: string\n\toriginalVisibility: string\n\ttransitionEndHandler: (e: TransitionEvent) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: VisibleBinding | undefined): VisibleOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { initial: binding }\n\t}\n\n\treturn {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-visible directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-visible=\"showElement\">Show/Hide</div>\n * <div v-visible=\"{ handler: onVisibleChange }\">Track visibility</div>\n * <div v-visible=\"{ useHidden: true, initial: false }\">Uses visibility: hidden</div>\n * </template>\n * ```\n */\nexport const vVisible = defineDirective<VisibleBinding, HTMLElement>({\n\tname: 'visible',\n\tssr: true, // SSR safe - will set initial visibility on server\n\tdefaults: {\n\t\tinitial: true,\n\t\tdisabled: false,\n\t\tuseHidden: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\t// Store original styles\n\t\tconst originalDisplay = el.style.display\n\t\tconst originalVisibility = el.style.visibility\n\n\t\tconst state: VisibleState = {\n\t\t\toptions,\n\t\t\tisVisible: options.initial ?? true,\n\t\t\toriginalDisplay,\n\t\t\toriginalVisibility,\n\t\t\ttransitionEndHandler: (e: TransitionEvent) => {\n\t\t\t\t// Handle transition end for animations\n\t\t\t\tif (e.propertyName === 'opacity' || e.propertyName === 'visibility') {\n\t\t\t\t\tel.dispatchEvent(new CustomEvent('visible:transition-end', {\n\t\t\t\t\t\tdetail: { isVisible: state.isVisible },\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__visible = state\n\n\t\t// Add transition listener\n\t\ton(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Apply initial visibility\n\t\tapplyVisibility(el, state, options.initial ?? true)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Determine new visibility\n\t\tlet newVisibility: boolean\n\n\t\tif (typeof binding.value === 'boolean') {\n\t\t\tnewVisibility = binding.value\n\t\t} else {\n\t\t\tnewVisibility = newOptions.initial ?? true\n\t\t}\n\n\t\t// Update if changed\n\t\tif (state.isVisible !== newVisibility) {\n\t\t\tapplyVisibility(el, state, newVisibility)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: VisibleState = (el as any).__visible\n\n\t\tif (!state) return\n\n\t\t// Remove transition listener\n\t\toff(el, 'transitionend', state.transitionEndHandler as (e: Event) => void)\n\n\t\t// Restore original styles\n\t\tel.style.display = state.originalDisplay\n\t\tel.style.visibility = state.originalVisibility\n\n\t\tdelete (el as any).__visible\n\t},\n})\n\n/**\n * Apply visibility to element\n */\nfunction applyVisibility(el: HTMLElement, state: VisibleState, isVisible: boolean): void {\n\tconst previousVisibility = state.isVisible\n\n\tstate.isVisible = isVisible\n\n\t// Add/remove class first (for CSS transitions)\n\tif (isVisible) {\n\t\tel.classList.remove('v-hidden')\n\t\tel.classList.add('v-visible')\n\t} else {\n\t\tel.classList.remove('v-visible')\n\t\tel.classList.add('v-hidden')\n\t}\n\n\tif (state.options.useHidden) {\n\t\t// Use visibility: hidden with animation support\n\t\tif (isVisible) {\n\t\t\t// Show: set visibility first, then animate\n\t\t\tel.style.visibility = state.originalVisibility || 'visible'\n\t\t} else {\n\t\t\t// Hide: wait for transition, then set hidden\n\t\t\tconst computedStyle = getComputedStyle(el)\n\t\t\tconst hasTransition = computedStyle.transitionDuration !== '0s'\n\n\t\t\tif (hasTransition) {\n\t\t\t\t// Wait for transition to complete\n\t\t\t\tconst handleTransitionEnd = (e: TransitionEvent): void => {\n\t\t\t\t\tif (e.target === el && (e.propertyName === 'opacity' || e.propertyName === 'transform')) {\n\t\t\t\t\t\tif (!state.isVisible) {\n\t\t\t\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tel.removeEventListener('transitionend', handleTransitionEnd)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tel.addEventListener('transitionend', handleTransitionEnd)\n\t\t\t} else {\n\t\t\t\tel.style.visibility = 'hidden'\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Use display: none (no animation support)\n\t\tel.style.display = isVisible ? state.originalDisplay : 'none'\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('visible:change', {\n\t\tdetail: { isVisible, previousVisibility },\n\t}))\n\n\t// Trigger handler\n\tif (state.options.handler && previousVisibility !== isVisible) {\n\t\tstate.options.handler(isVisible)\n\t}\n}\n\nexport default vVisible\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Loading directive options\n */\nexport interface LoadingOptions {\n\t/**\n\t * Loading state\n\t * @default true\n\t */\n\tvalue?: boolean\n\n\t/**\n\t * Loading text to display\n\t */\n\ttext?: string\n\n\t/**\n\t * CSS class for loading overlay\n\t * @default 'v-loading'\n\t */\n\tloadingClass?: string\n\n\t/**\n\t * CSS class for loading spinner\n\t * @default 'v-loading__spinner'\n\t */\n\tspinnerClass?: string\n\n\t/**\n\t * CSS class for loading text\n\t * @default 'v-loading__text'\n\t */\n\ttextClass?: string\n\n\t/**\n\t * Custom spinner HTML\n\t */\n\tspinner?: string\n\n\t/**\n\t * Background color\n\t * @default 'rgba(255, 255, 255, 0.9)'\n\t */\n\tbackground?: string\n\n\t/**\n\t * Whether to lock scroll while loading\n\t * @default false\n\t */\n\tlock?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LoadingBinding = boolean | LoadingOptions\n\n/**\n * Element state storage\n */\ninterface LoadingState {\n\toptions: LoadingOptions\n\tloadingOverlay: HTMLDivElement | null\n\toriginalPosition: string\n\toriginalOverflow: string\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LoadingBinding | undefined): LoadingOptions {\n\tif (typeof binding === 'boolean') {\n\t\treturn { value: binding }\n\t}\n\n\treturn {\n\t\tvalue: true,\n\t\tloadingClass: 'v-loading',\n\t\tspinnerClass: 'v-loading__spinner',\n\t\ttextClass: 'v-loading__text',\n\t\tbackground: 'rgba(255, 255, 255, 0.9)',\n\t\tlock: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * Default spinner HTML\n */\nconst DEFAULT_SPINNER = `\n<svg class=\"v-loading__circular\" viewBox=\"25 25 50 50\">\n <circle class=\"v-loading__path\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-width=\"2\" stroke-miterlimit=\"10\"/>\n</svg>\n`\n\n/**\n * Create loading overlay element\n */\nfunction createLoadingOverlay(options: LoadingOptions): HTMLDivElement {\n\tconst overlay = document.createElement('div')\n\n\toverlay.className = options.loadingClass || 'v-loading'\n\toverlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1000;\n background: ${options.background || 'rgba(255, 255, 255, 0.9)'};\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n `\n\n\t// Add spinner\n\tconst spinnerHtml = options.spinner || DEFAULT_SPINNER\n\tconst spinnerContainer = document.createElement('div')\n\n\tspinnerContainer.className = options.spinnerClass || 'v-loading__spinner'\n\tspinnerContainer.innerHTML = spinnerHtml\n\toverlay.appendChild(spinnerContainer)\n\n\t// Add text\n\tif (options.text) {\n\t\tconst textEl = document.createElement('div')\n\n\t\ttextEl.className = options.textClass || 'v-loading__text'\n\t\ttextEl.textContent = options.text\n\t\toverlay.appendChild(textEl)\n\t}\n\n\treturn overlay\n}\n\n/**\n * v-loading directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-loading=\"isLoading\">Content</div>\n * <div v-loading=\"{ value: isLoading, text: 'Loading...' }\">Content</div>\n * <div v-loading=\"{ value: isLoading, lock: true }\">Locked scroll while loading</div>\n * </template>\n * ```\n */\nexport const vLoading = defineDirective<LoadingBinding, HTMLElement>({\n\tname: 'loading',\n\tssr: true, // SSR safe - will skip DOM manipulation on server\n\tdefaults: {\n\t\tvalue: true,\n\t\tloadingClass: 'v-loading',\n\t\tspinnerClass: 'v-loading__spinner',\n\t\ttextClass: 'v-loading__text',\n\t\tbackground: 'rgba(255, 255, 255, 0.9)',\n\t\tlock: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Ensure element has relative positioning\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tconst originalPosition = el.style.position\n\t\tconst originalOverflow = el.style.overflow\n\n\t\tconst state: LoadingState = {\n\t\t\toptions,\n\t\t\tloadingOverlay: null,\n\t\t\toriginalPosition,\n\t\t\toriginalOverflow,\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__loading = state\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\t// Show loading if value is true\n\t\tif (options.value) {\n\t\t\tshowLoading(el, state)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\tif (newOptions.disabled) {\n\t\t\thideLoading(el, state)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Handle loading state change\n\t\tif (newOptions.value && !state.options.value) {\n\t\t\tshowLoading(el, state)\n\t\t} else if (!newOptions.value && state.options.value) {\n\t\t\thideLoading(el, state)\n\t\t}\n\n\t\t// Update text if changed\n\t\tif (state.loadingOverlay && newOptions.text !== state.options.text) {\n\t\t\tconst textEl = state.loadingOverlay.querySelector(`.${state.options.textClass}`)\n\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = newOptions.text || ''\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LoadingState = (el as any).__loading\n\n\t\tif (!state) return\n\n\t\thideLoading(el, state)\n\n\t\t// Restore original styles\n\t\tel.style.position = state.originalPosition\n\t\tel.style.overflow = state.originalOverflow\n\n\t\tdelete (el as any).__loading\n\t},\n})\n\n/**\n * Show loading overlay\n */\nfunction showLoading(el: HTMLElement, state: LoadingState): void {\n\tif (state.loadingOverlay) return\n\n\t// Create and append overlay\n\tstate.loadingOverlay = createLoadingOverlay(state.options)\n\tel.appendChild(state.loadingOverlay)\n\n\t// Lock scroll if needed\n\tif (state.options.lock) {\n\t\tel.style.overflow = 'hidden'\n\t}\n\n\t// Add class\n\tel.classList.add('v-loading--active')\n}\n\n/**\n * Hide loading overlay\n */\nfunction hideLoading(el: HTMLElement, state: LoadingState): void {\n\tif (!state.loadingOverlay) return\n\n\t// Remove overlay\n\tstate.loadingOverlay.remove()\n\tstate.loadingOverlay = null\n\n\t// Restore scroll\n\tif (state.options.lock) {\n\t\tel.style.overflow = state.originalOverflow\n\t}\n\n\t// Remove class\n\tel.classList.remove('v-loading--active')\n}\n\nexport default vLoading\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Scroll event handler\n */\nexport type ScrollHandler = (event: Event, info: ScrollInfo) => void\n\n/**\n * Scroll information\n */\nexport interface ScrollInfo {\n\t/** Current scroll left position */\n\tscrollLeft: number\n\t/** Current scroll top position */\n\tscrollTop: number\n\t/** Maximum scroll left */\n\tscrollLeftMax: number\n\t/** Maximum scroll top */\n\tscrollTopMax: number\n\t/** Horizontal scroll progress (0-1) */\n\tprogressX: number\n\t/** Vertical scroll progress (0-1) */\n\tprogressY: number\n\t/** Direction of horizontal scroll (-1: left, 1: right, 0: none) */\n\tdirectionX: -1 | 0 | 1\n\t/** Direction of vertical scroll (-1: up, 1: down, 0: none) */\n\tdirectionY: -1 | 0 | 1\n\t/** Scroll container element or window */\n\tcontainer: Element | Window\n}\n\n/**\n * Scroll directive options\n */\nexport interface ScrollOptions {\n\t/**\n\t * Scroll event handler\n\t * @required\n\t */\n\thandler: ScrollHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use passive event listener\n\t * @default true\n\t */\n\tpassive?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 0 (no throttle)\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container selector or element\n\t */\n\tcontainer?: string | Element | Window | null\n}\n\n/**\n * Directive binding value type\n */\nexport type ScrollBinding = ScrollHandler | ScrollOptions\n\n/**\n * Element state storage\n */\ninterface ScrollState {\n\toptions: ScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tlastScrollLeft: number\n\tlastScrollTop: number\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tpendingEvent: Event | null\n}\n\n/**\n * Get scroll info\n */\nfunction getScrollInfo(container: Element | Window, lastScrollLeft: number, lastScrollTop: number): ScrollInfo {\n\tlet scrollLeft = 0,\n\t\tscrollTop = 0,\n\t\tscrollLeftMax = 0,\n\t\tscrollTopMax = 0\n\n\tif (container === window) {\n\t\tscrollLeft = window.scrollX || document.documentElement.scrollLeft\n\t\tscrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tscrollLeftMax = document.documentElement.scrollWidth - window.innerWidth\n\t\tscrollTopMax = document.documentElement.scrollHeight - window.innerHeight\n\t} else {\n\t\tconst el = container as Element\n\n\t\tscrollLeft = el.scrollLeft\n\t\tscrollTop = el.scrollTop\n\t\tscrollLeftMax = el.scrollWidth - el.clientWidth\n\t\tscrollTopMax = el.scrollHeight - el.clientHeight\n\t}\n\n\tconst progressX = scrollLeftMax > 0 ? scrollLeft / scrollLeftMax : 0\n\tconst progressY = scrollTopMax > 0 ? scrollTop / scrollTopMax : 0\n\n\t// Calculate direction\n\tconst directionX: -1 | 0 | 1 = scrollLeft !== lastScrollLeft ? (scrollLeft > lastScrollLeft ? 1 : -1) : 0\n\tconst directionY: -1 | 0 | 1 = scrollTop !== lastScrollTop ? (scrollTop > lastScrollTop ? 1 : -1) : 0\n\n\treturn {\n\t\tscrollLeft,\n\t\tscrollTop,\n\t\tscrollLeftMax,\n\t\tscrollTopMax,\n\t\tprogressX,\n\t\tprogressY,\n\t\tdirectionX,\n\t\tdirectionY,\n\t\tcontainer,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ScrollBinding | undefined): ScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, passive: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-scroll=\"handleScroll\">Scroll container</div>\n * <div v-scroll=\"{ handler: handleScroll, throttle: 100 }\">Throttled scroll</div>\n * </template>\n * ```\n */\nexport const vScroll = defineDirective<ScrollBinding, HTMLElement>({\n\tname: 'scroll',\n\tssr: false,\n\tdefaults: {\n\t\tpassive: true,\n\t\tthrottle: 0,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (options.container === window) {\n\t\t\t\tcontainer = window\n\t\t\t} else if (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\t// Check if element itself is scrollable\n\t\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(el)\n\t\t\tconst isSelfScrollable = /(auto|scroll)/.test(overflow + overflowX + overflowY)\n\n\t\t\tcontainer = isSelfScrollable ? el : getScrollParent(el)\n\t\t}\n\n\t\tconst state: ScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tlastScrollLeft: 0,\n\t\t\tlastScrollTop: 0,\n\t\t\tthrottleTimer: null,\n\t\t\tpendingEvent: null,\n\t\t\tscrollHandler: (e: Event) => {\n\t\t\t\t// Handle throttle\n\t\t\t\tif (options.throttle && options.throttle > 0) {\n\t\t\t\t\tstate.pendingEvent = e\n\n\t\t\t\t\tif (!state.throttleTimer) {\n\t\t\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEvent) {\n\t\t\t\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEvent, info)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t\t\t\tstate.pendingEvent = null\n\t\t\t\t\t\t}, options.throttle)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst info = getScrollInfo(container, state.lastScrollLeft, state.lastScrollTop)\n\n\t\t\t\t\tstate.lastScrollLeft = info.scrollLeft\n\t\t\t\t\tstate.lastScrollTop = info.scrollTop\n\t\t\t\t\toptions.handler(e, info)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Initialize last scroll position\n\t\tconst initialInfo = getScrollInfo(container, 0, 0)\n\n\t\tstate.lastScrollLeft = initialInfo.scrollLeft\n\t\tstate.lastScrollTop = initialInfo.scrollTop\n\n\t\t// Store state\n\t\t;(el as any).__scroll = state\n\n\t\t// Bind scroll event\n\t\ton(container, 'scroll', state.scrollHandler, { passive: options.passive })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ScrollState = (el as any).__scroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Unbind scroll event\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__scroll\n\t},\n})\n\nexport default vScroll\n","import { defineDirective, isBrowser, supportsIntersectionObserver } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\n/**\n * Infinite scroll handler\n */\nexport type InfiniteScrollHandler = () => void | Promise<void>\n\n/**\n * Infinite scroll directive options\n */\nexport interface InfiniteScrollOptions {\n\t/**\n\t * Handler to call when scrolling to bottom\n\t * @required\n\t */\n\thandler: InfiniteScrollHandler\n\n\t/**\n\t * Distance from bottom to trigger load (in pixels)\n\t * @default 0\n\t */\n\tdistance?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether currently loading\n\t * @default false\n\t */\n\tloading?: boolean\n\n\t/**\n\t * Whether to use IntersectionObserver (more efficient)\n\t * @default true\n\t */\n\tuseIntersection?: boolean\n\n\t/**\n\t * Throttle time in milliseconds\n\t * @default 200\n\t */\n\tthrottle?: number\n\n\t/**\n\t * Custom scroll container\n\t */\n\tcontainer?: string | Element | null\n\n\t/**\n\t * Callback when load starts\n\t */\n\tonLoadStart?: () => void\n\n\t/**\n\t * Callback when load completes\n\t */\n\tonLoadEnd?: () => void\n\n\t/**\n\t * Callback on error\n\t */\n\tonError?: (error: Error) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type InfiniteScrollBinding = InfiniteScrollHandler | InfiniteScrollOptions\n\n/**\n * Element state storage\n */\ninterface InfiniteScrollState {\n\toptions: InfiniteScrollOptions\n\tscrollHandler: (e: Event) => void\n\tcontainer: Element | Window\n\tsentinel: HTMLDivElement | null\n\tobserver: IntersectionObserver | null\n\tthrottleTimer: ReturnType<typeof setTimeout> | null\n\tisLoading: boolean\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: InfiniteScrollBinding | undefined): InfiniteScrollOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, distance: 0, throttle: 200, useIntersection: true }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-infinite-scroll: handler is required')\n\t}\n\n\treturn {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-infinite-scroll directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-infinite-scroll=\"loadMore\" class=\"scroll-container\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n *\n * <div v-infinite-scroll=\"{ handler: loadMore, distance: 100, disabled: isLoading }\">\n * <div v-for=\"item in items\" :key=\"item.id\">{{ item.name }}</div>\n * </div>\n * </template>\n * ```\n */\nexport const vInfiniteScroll = defineDirective<InfiniteScrollBinding, HTMLElement>({\n\tname: 'infinite-scroll',\n\tssr: false,\n\tdefaults: {\n\t\tdistance: 0,\n\t\tdisabled: false,\n\t\tloading: false,\n\t\tuseIntersection: true,\n\t\tthrottle: 200,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Determine scroll container\n\t\tlet container: Element | Window\n\n\t\tif (options.container) {\n\t\t\tif (typeof options.container === 'string') {\n\t\t\t\tconst found = document.querySelector(options.container)\n\n\t\t\t\tcontainer = found || getScrollParent(el)\n\t\t\t} else {\n\t\t\t\tcontainer = options.container\n\t\t\t}\n\t\t} else {\n\t\t\tcontainer = getScrollParent(el)\n\t\t}\n\n\t\tconst state: InfiniteScrollState = {\n\t\t\toptions,\n\t\t\tcontainer,\n\t\t\tsentinel: null,\n\t\t\tobserver: null,\n\t\t\tthrottleTimer: null,\n\t\t\tisLoading: false,\n\t\t\tscrollHandler: async (_e: Event) => {\n\t\t\t\tif (state.isLoading || state.options.disabled || state.options.loading) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Throttle\n\t\t\t\tif (state.throttleTimer) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tstate.throttleTimer = setTimeout(() => {\n\t\t\t\t\tstate.throttleTimer = null\n\t\t\t\t}, options.throttle)\n\n\t\t\t\t// Check scroll position\n\t\t\t\tconst shouldLoad = checkShouldLoad(container, el, options.distance || 0)\n\n\t\t\t\tif (shouldLoad) {\n\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__infiniteScroll = state\n\n\t\t// Use IntersectionObserver if available and enabled\n\t\tif (options.useIntersection && supportsIntersectionObserver()) {\n\t\t\tsetupIntersectionObserver(el, state)\n\t\t} else {\n\t\t\t// Use scroll event listener\n\t\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: InfiniteScrollState = (el as any).__infiniteScroll\n\n\t\tif (!state) return\n\n\t\t// Clear throttle timer\n\t\tif (state.throttleTimer) {\n\t\t\tclearTimeout(state.throttleTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Remove sentinel\n\t\tif (state.sentinel && state.sentinel.parentNode) {\n\t\t\tstate.sentinel.parentNode.removeChild(state.sentinel)\n\t\t}\n\n\t\t// Remove scroll listener\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\n\t\tdelete (el as any).__infiniteScroll\n\t},\n})\n\n/**\n * Check if should load more\n */\nfunction checkShouldLoad(container: Element | Window, _el: HTMLElement, distance: number): boolean {\n\tif (container === window) {\n\t\tconst scrollTop = window.scrollY || document.documentElement.scrollTop\n\t\tconst scrollHeight = document.documentElement.scrollHeight\n\t\tconst clientHeight = window.innerHeight\n\n\t\treturn scrollTop + clientHeight >= scrollHeight - distance\n\t}\n\n\tconst el = container as Element\n\tconst scrollTop = el.scrollTop\n\tconst scrollHeight = el.scrollHeight\n\tconst clientHeight = el.clientHeight\n\n\treturn scrollTop + clientHeight >= scrollHeight - distance\n}\n\n/**\n * Trigger load handler\n */\nasync function triggerLoad(state: InfiniteScrollState, el: HTMLElement): Promise<void> {\n\tstate.isLoading = true\n\tstate.options.onLoadStart?.()\n\n\tel.classList.add('v-infinite-scroll--loading')\n\n\ttry {\n\t\tawait state.options.handler()\n\t} catch (err) {\n\t\tstate.options.onError?.(err as Error)\n\t} finally {\n\t\tstate.isLoading = false\n\t\tstate.options.onLoadEnd?.()\n\t\tel.classList.remove('v-infinite-scroll--loading')\n\t}\n}\n\n/**\n * Setup IntersectionObserver\n */\nfunction setupIntersectionObserver(el: HTMLElement, state: InfiniteScrollState): void {\n\t// Create sentinel element\n\tconst sentinel = document.createElement('div')\n\n\tsentinel.className = 'v-infinite-scroll__sentinel'\n\tsentinel.style.cssText = `\n height: 1px;\n width: 100%;\n clear: both;\n `\n\n\tel.appendChild(sentinel)\n\tstate.sentinel = sentinel\n\n\t// Create observer\n\tstate.observer = new IntersectionObserver(\n\t\tasync entries => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\tif (!state.isLoading && !state.options.disabled && !state.options.loading) {\n\t\t\t\t\t\tawait triggerLoad(state, el)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\troot: state.container === window ? null : (state.container as Element),\n\t\t\trootMargin: `${state.options.distance || 0}px`,\n\t\t\tthreshold: 0,\n\t\t},\n\t)\n\n\tstate.observer.observe(sentinel)\n}\n\nexport default vInfiniteScroll\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getScrollParent, off, on } from '@directix/shared'\n\nconst STATE_KEY = '__sticky' as const\n\n/**\n * Sticky directive options\n */\nexport interface StickyOptions {\n\t/** Top offset when sticky @default 0 */\n\ttop?: number | string\n\t/** Bottom offset when sticky */\n\tbottom?: number | string\n\t/** Z-index when sticky @default 100 */\n\tzIndex?: number\n\t/** CSS class to add when sticky @default 'v-sticky--fixed' */\n\tstickyClass?: string\n\t/** Whether to disable @default false */\n\tdisabled?: boolean\n\t/** Callback when sticky state changes */\n\tonChange?: (isSticky: boolean) => void\n\t/** Custom scroll container */\n\tcontainer?: string | Element | null\n}\n\nexport type StickyBinding = boolean | number | StickyOptions\n\ninterface StickyState {\n\toptions: StickyOptions\n\tplaceholder: HTMLDivElement | null\n\toriginalStyles: { position: string; top: string; bottom: string; zIndex: string; width: string }\n\tisSticky: boolean\n\tscrollHandler: () => void\n\tresizeHandler: () => void\n\tcontainer: Element | Window\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: StickyBinding | undefined): StickyOptions {\n\tif (binding === false) return { disabled: true, top: 0, zIndex: 100 }\n\tif (typeof binding === 'number') return { top: binding, zIndex: 100 }\n\n\treturn {\n\t\ttop: 0,\n\t\tzIndex: 100,\n\t\tstickyClass: 'v-sticky--fixed',\n\t\tdisabled: false,\n\t\t...(binding && typeof binding === 'object' ? binding : {}),\n\t}\n}\n\n/**\n * Parse offset value to CSS string\n */\nfunction parseOffset(value: number | string | undefined): string {\n\tif (value === undefined) return '0'\n\n\treturn typeof value === 'number' ? `${value}px` : value\n}\n\n/**\n * Get scroll container for element\n */\nfunction getScrollContainer(el: HTMLElement, customContainer?: string | Element | null): Element | Window {\n\tif (customContainer) {\n\t\tif (typeof customContainer === 'string') {\n\t\t\treturn document.querySelector(customContainer) || getScrollParent(el)\n\t\t}\n\n\t\treturn customContainer\n\t}\n\n\t// Check if parent element is scrollable\n\tconst parent = el.parentElement\n\n\tif (parent) {\n\t\tconst { overflow, overflowX, overflowY } = getComputedStyle(parent)\n\n\t\tif (/(auto|scroll)/.test(overflow + overflowX + overflowY)) {\n\t\t\treturn parent\n\t\t}\n\t}\n\n\treturn getScrollParent(el)\n}\n\n/**\n * Check and update sticky state\n */\nfunction checkSticky(el: HTMLElement, state: StickyState): void {\n\tif (state.options.disabled) {\n\t\tunsetSticky(el, state)\n\n\t\treturn\n\t}\n\n\tconst topOffset = Number.parseFloat(parseOffset(state.options.top))\n\tconst containerRect = state.container === window ? { top: 0 } : (state.container as Element).getBoundingClientRect()\n\n\t// Use placeholder position when sticky, otherwise use element position\n\tconst referenceEl = state.placeholder || el\n\tconst rect = referenceEl.getBoundingClientRect()\n\tconst elementTopRelativeToContainer = rect.top - containerRect.top\n\n\tconst shouldSticky = elementTopRelativeToContainer <= topOffset\n\n\tif (shouldSticky && !state.isSticky) {\n\t\tsetSticky(el, state, topOffset, containerRect.top)\n\t} else if (!shouldSticky && state.isSticky) {\n\t\tunsetSticky(el, state)\n\t}\n}\n\n/**\n * Set element as sticky\n */\nfunction setSticky(el: HTMLElement, state: StickyState, topOffset: number, containerTop: number): void {\n\tstate.isSticky = true\n\n\t// Create placeholder to maintain layout\n\tconst placeholder = document.createElement('div')\n\n\tplaceholder.style.cssText = `width:${el.offsetWidth}px;height:${el.offsetHeight}px`\n\tel.parentNode?.insertBefore(placeholder, el)\n\tstate.placeholder = placeholder\n\n\t// Calculate fixed top position relative to viewport\n\tconst fixedTop = state.container === window ? topOffset : containerTop + topOffset\n\n\t// Apply sticky styles\n\tel.style.position = 'fixed'\n\tel.style.top = `${fixedTop}px`\n\tel.style.zIndex = String(state.options.zIndex || 100)\n\tel.style.width = `${el.offsetWidth}px`\n\n\tif (state.options.bottom !== undefined) {\n\t\tel.style.bottom = parseOffset(state.options.bottom)\n\t}\n\n\tstate.options.stickyClass && el.classList.add(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: true } }))\n\tstate.options.onChange?.(true)\n}\n\n/**\n * Unset element as sticky\n */\nfunction unsetSticky(el: HTMLElement, state: StickyState): void {\n\tif (!state.isSticky) return\n\n\tstate.isSticky = false\n\n\t// Remove placeholder\n\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\tstate.placeholder = null\n\n\t// Restore original styles\n\tObject.assign(el.style, state.originalStyles)\n\n\tstate.options.stickyClass && el.classList.remove(state.options.stickyClass)\n\tel.dispatchEvent(new CustomEvent('sticky:change', { detail: { isSticky: false } }))\n\tstate.options.onChange?.(false)\n}\n\n/**\n * v-sticky directive\n *\n * @example\n * ```vue\n * <div v-sticky>Sticky header</div>\n * <div v-sticky=\"50\">Sticky with 50px top offset</div>\n * <div v-sticky=\"{ top: 60, zIndex: 1000 }\">Custom sticky</div>\n * ```\n */\nexport const vSticky = defineDirective<StickyBinding, HTMLElement>({\n\tname: 'sticky',\n\tssr: false,\n\tdefaults: { top: 0, zIndex: 100, stickyClass: 'v-sticky--fixed', disabled: false },\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst container = getScrollContainer(el, options.container)\n\n\t\tconst state: StickyState = {\n\t\t\toptions,\n\t\t\tplaceholder: null,\n\t\t\toriginalStyles: {\n\t\t\t\tposition: el.style.position,\n\t\t\t\ttop: el.style.top,\n\t\t\t\tbottom: el.style.bottom,\n\t\t\t\tzIndex: el.style.zIndex,\n\t\t\t\twidth: el.style.width,\n\t\t\t},\n\t\t\tisSticky: false,\n\t\t\tcontainer,\n\t\t\tscrollHandler: () => checkSticky(el, state),\n\t\t\tresizeHandler: () => checkSticky(el, state),\n\t\t}\n\n\t\tel.classList.add('v-sticky')\n\t\t;(el as any)[STATE_KEY] = state\n\n\t\ton(container, 'scroll', state.scrollHandler, { passive: true })\n\t\ton(window, 'resize', state.resizeHandler, { passive: true })\n\t\tcheckSticky(el, state)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tcheckSticky(el, state)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: StickyState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\n\t\tstate.placeholder?.parentNode?.removeChild(state.placeholder)\n\n\t\tObject.assign(el.style, state.originalStyles)\n\t\tel.classList.remove('v-sticky', state.options.stickyClass || 'v-sticky--fixed')\n\n\t\toff(state.container, 'scroll', state.scrollHandler)\n\t\toff(window, 'resize', state.resizeHandler)\n\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vSticky\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { getEventPosition, off, on } from '@directix/shared'\n\n/**\n * Long press handler\n */\nexport type LongPressHandler = (event: MouseEvent | TouchEvent) => void\n\n/**\n * Long press directive options\n */\nexport interface LongPressOptions {\n\t/**\n\t * Callback when long press is triggered\n\t * @required\n\t */\n\thandler: LongPressHandler\n\n\t/**\n\t * Duration in milliseconds to trigger long press\n\t * @default 500\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Maximum movement distance before canceling\n\t * @default 10\n\t */\n\tdistance?: number\n\n\t/**\n\t * Callback when long press starts (on mousedown/touchstart)\n\t */\n\tonStart?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback when long press is canceled\n\t */\n\tonCancel?: (event: MouseEvent | TouchEvent) => void\n\n\t/**\n\t * Callback on each tick during long press\n\t */\n\tonTick?: (remaining: number) => void\n\n\t/**\n\t * Interval for onTick callback in milliseconds\n\t * @default 100\n\t */\n\ttickInterval?: number\n\n\t/**\n\t * Whether to prevent default behavior\n\t * @default true\n\t */\n\tprevent?: boolean\n\n\t/**\n\t * Whether to stop propagation\n\t * @default false\n\t */\n\tstop?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type LongPressBinding = LongPressHandler | LongPressOptions\n\n/**\n * Element state storage\n */\ninterface LongPressState {\n\toptions: LongPressOptions\n\ttimerId: ReturnType<typeof setTimeout> | null\n\ttickTimerId: ReturnType<typeof setInterval> | null\n\tstartTime: number\n\tstartPos: { x: number; y: number }\n\tstartHandler: (e: Event) => void\n\tendHandler: (e: Event) => void\n\tmoveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: LongPressBinding | undefined): LongPressOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, duration: 500, distance: 10 }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-long-press: handler is required')\n\t}\n\n\treturn {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t\t...binding,\n\t}\n}\n\n/**\n * Calculate distance between two points\n */\nfunction getDistance(p1: { x: number; y: number }, p2: { x: number; y: number }): number {\n\treturn Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2)\n}\n\n/**\n * v-long-press directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-long-press=\"handleLongPress\">Long Press Me</button>\n * <button v-long-press=\"{ handler: handleLongPress, duration: 1000 }\">1 Second Press</button>\n * </template>\n * ```\n */\nexport const vLongPress = defineDirective<LongPressBinding, HTMLElement>({\n\tname: 'long-press',\n\tssr: false,\n\tdefaults: {\n\t\tduration: 500,\n\t\tdistance: 10,\n\t\tdisabled: false,\n\t\tprevent: true,\n\t\tstop: false,\n\t\ttickInterval: 100,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: LongPressState = {\n\t\t\toptions,\n\t\t\ttimerId: null,\n\t\t\ttickTimerId: null,\n\t\t\tstartTime: 0,\n\t\t\tstartPos: { x: 0, y: 0 },\n\t\t\tstartHandler: () => {},\n\t\t\tendHandler: () => {},\n\t\t\tmoveHandler: () => {},\n\t\t}\n\n\t\t// Start handler\n\t\tstate.startHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\t// Prevent context menu on long press\n\t\t\tif (options.prevent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\n\t\t\tif (options.stop) {\n\t\t\t\tevent.stopPropagation()\n\t\t\t}\n\n\t\t\t// Clear any existing timer\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Store start position\n\t\t\tconst pos = getEventPosition(event)\n\n\t\t\tstate.startPos = { x: pos.x, y: pos.y }\n\t\t\tstate.startTime = Date.now()\n\n\t\t\t// Trigger start callback\n\t\t\toptions.onStart?.(event)\n\n\t\t\t// Start tick timer\n\t\t\tif (options.onTick) {\n\t\t\t\tlet remaining = options.duration!\n\n\t\t\t\tstate.tickTimerId = setInterval(() => {\n\t\t\t\t\tremaining -= options.tickInterval!\n\t\t\t\t\toptions.onTick?.(Math.max(0, remaining))\n\t\t\t\t}, options.tickInterval)\n\t\t\t}\n\n\t\t\t// Start long press timer\n\t\t\tstate.timerId = setTimeout(() => {\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\t\t\t\toptions.handler(event)\n\t\t\t}, options.duration)\n\t\t}\n\n\t\t// End handler\n\t\tstate.endHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\n\t\t\tif (state.timerId) {\n\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\tstate.timerId = null\n\t\t\t}\n\n\t\t\tif (state.tickTimerId) {\n\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\tstate.tickTimerId = null\n\t\t\t}\n\n\t\t\t// Trigger cancel callback if was in progress\n\t\t\tif (state.startTime > 0) {\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t}\n\n\t\t\tstate.startTime = 0\n\t\t}\n\n\t\t// Move handler - cancel if moved too far\n\t\tstate.moveHandler = (e: Event) => {\n\t\t\tif (!state.timerId) return\n\n\t\t\tconst event = e as MouseEvent | TouchEvent\n\t\t\tconst pos = getEventPosition(event)\n\t\t\tconst distance = getDistance(state.startPos, { x: pos.x, y: pos.y })\n\n\t\t\tif (distance > (options.distance || 10)) {\n\t\t\t\tif (state.timerId) {\n\t\t\t\t\tclearTimeout(state.timerId)\n\t\t\t\t\tstate.timerId = null\n\t\t\t\t}\n\n\t\t\t\tif (state.tickTimerId) {\n\t\t\t\t\tclearInterval(state.tickTimerId)\n\t\t\t\t\tstate.tickTimerId = null\n\t\t\t\t}\n\n\t\t\t\toptions.onCancel?.(event)\n\t\t\t\tstate.startTime = 0\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__longPress = state\n\n\t\t// Bind events - mouse\n\t\ton(el, 'mousedown', state.startHandler)\n\t\ton(el, 'mouseup', state.endHandler)\n\t\ton(el, 'mouseleave', state.endHandler)\n\t\ton(el, 'mousemove', state.moveHandler)\n\n\t\t// Bind events - touch\n\t\ton(el, 'touchstart', state.startHandler, { passive: !options.prevent })\n\t\ton(el, 'touchend', state.endHandler)\n\t\ton(el, 'touchcancel', state.endHandler)\n\t\ton(el, 'touchmove', state.moveHandler, { passive: true })\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) {\n\t\t\t// Re-initialize if not exists\n\t\t\tconst options = normalizeOptions(binding.value)\n\n\t\t\tif (!options.disabled) {\n\t\t\t\t// Re-mount by clearing and re-setting\n\t\t\t\t;(el as any).__longPress = null\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: LongPressState = (el as any).__longPress\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.timerId) {\n\t\t\tclearTimeout(state.timerId)\n\t\t}\n\n\t\tif (state.tickTimerId) {\n\t\t\tclearInterval(state.tickTimerId)\n\t\t}\n\n\t\t// Unbind events - mouse\n\t\toff(el, 'mousedown', state.startHandler)\n\t\toff(el, 'mouseup', state.endHandler)\n\t\toff(el, 'mouseleave', state.endHandler)\n\t\toff(el, 'mousemove', state.moveHandler)\n\n\t\t// Unbind events - touch\n\t\toff(el, 'touchstart', state.startHandler)\n\t\toff(el, 'touchend', state.endHandler)\n\t\toff(el, 'touchcancel', state.endHandler)\n\t\toff(el, 'touchmove', state.moveHandler)\n\n\t\tdelete (el as any).__longPress\n\t},\n})\n\nexport default vLongPress\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Hover state change handler\n */\nexport type HoverHandler = (isHovering: boolean, event: MouseEvent) => void\n\n/**\n * Hover directive options\n */\nexport interface HoverOptions {\n\t/**\n\t * Callback when hover state changes\n\t */\n\thandler?: HoverHandler\n\n\t/**\n\t * Callback when mouse enters\n\t */\n\tonEnter?: (event: MouseEvent) => void\n\n\t/**\n\t * Callback when mouse leaves\n\t */\n\tonLeave?: (event: MouseEvent) => void\n\n\t/**\n\t * CSS class to add when hovering\n\t * @default 'v-hover'\n\t */\n\tclass?: string\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Delay in milliseconds before triggering enter\n\t * @default 0\n\t */\n\tenterDelay?: number\n\n\t/**\n\t * Delay in milliseconds before triggering leave\n\t * @default 0\n\t */\n\tleaveDelay?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type HoverBinding = HoverHandler | HoverOptions\n\n/**\n * Element state storage\n */\ninterface HoverState {\n\toptions: HoverOptions\n\tisHovering: boolean\n\tenterTimerId: ReturnType<typeof setTimeout> | null\n\tleaveTimerId: ReturnType<typeof setTimeout> | null\n\tenterHandler: (e: Event) => void\n\tleaveHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: HoverBinding | undefined): HoverOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, class: 'v-hover' }\n\t}\n\n\treturn {\n\t\tclass: 'v-hover',\n\t\tdisabled: false,\n\t\tenterDelay: 0,\n\t\tleaveDelay: 0,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-hover directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-hover=\"handleHover\">Hover me</div>\n * <div v-hover=\"{ onEnter: handleEnter, onLeave: handleLeave, class: 'is-hovering' }\">Hover me</div>\n * </template>\n * ```\n */\nexport const vHover = defineDirective<HoverBinding, HTMLElement>({\n\tname: 'hover',\n\tssr: false,\n\tdefaults: {\n\t\tclass: 'v-hover',\n\t\tdisabled: false,\n\t\tenterDelay: 0,\n\t\tleaveDelay: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst state: HoverState = {\n\t\t\toptions,\n\t\t\tisHovering: false,\n\t\t\tenterTimerId: null,\n\t\t\tleaveTimerId: null,\n\t\t\tenterHandler: () => {},\n\t\t\tleaveHandler: () => {},\n\t\t}\n\n\t\t// Enter handler\n\t\tstate.enterHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear leave timer if exists\n\t\t\tif (state.leaveTimerId) {\n\t\t\t\tclearTimeout(state.leaveTimerId)\n\t\t\t\tstate.leaveTimerId = null\n\t\t\t}\n\n\t\t\t// If already hovering, do nothing\n\t\t\tif (state.isHovering) return\n\n\t\t\t// Handle enter delay\n\t\t\tif (options.enterDelay && options.enterDelay > 0) {\n\t\t\t\tstate.enterTimerId = setTimeout(() => {\n\t\t\t\t\tstate.isHovering = true\n\t\t\t\t\tapplyHoverState(el, state, event)\n\t\t\t\t}, options.enterDelay)\n\t\t\t} else {\n\t\t\t\tstate.isHovering = true\n\t\t\t\tapplyHoverState(el, state, event)\n\t\t\t}\n\t\t}\n\n\t\t// Leave handler\n\t\tstate.leaveHandler = (e: Event) => {\n\t\t\tconst event = e as MouseEvent\n\n\t\t\t// Clear enter timer if exists\n\t\t\tif (state.enterTimerId) {\n\t\t\t\tclearTimeout(state.enterTimerId)\n\t\t\t\tstate.enterTimerId = null\n\t\t\t}\n\n\t\t\t// If not hovering, do nothing\n\t\t\tif (!state.isHovering) return\n\n\t\t\t// Handle leave delay\n\t\t\tif (options.leaveDelay && options.leaveDelay > 0) {\n\t\t\t\tstate.leaveTimerId = setTimeout(() => {\n\t\t\t\t\tstate.isHovering = false\n\t\t\t\t\tapplyLeaveState(el, state, event)\n\t\t\t\t}, options.leaveDelay)\n\t\t\t} else {\n\t\t\t\tstate.isHovering = false\n\t\t\t\tapplyLeaveState(el, state, event)\n\t\t\t}\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__hover = state\n\n\t\t// Bind events\n\t\ton(el, 'mouseenter', state.enterHandler)\n\t\ton(el, 'mouseleave', state.leaveHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: HoverState = (el as any).__hover\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Was enabled, now disabled - remove class and listeners\n\t\t\tel.classList.remove(state.options.class || 'v-hover')\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Was disabled, now enabled - re-add listeners (already bound)\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: HoverState = (el as any).__hover\n\n\t\tif (!state) return\n\n\t\t// Clear timers\n\t\tif (state.enterTimerId) {\n\t\t\tclearTimeout(state.enterTimerId)\n\t\t}\n\n\t\tif (state.leaveTimerId) {\n\t\t\tclearTimeout(state.leaveTimerId)\n\t\t}\n\n\t\t// Unbind events\n\t\toff(el, 'mouseenter', state.enterHandler)\n\t\toff(el, 'mouseleave', state.leaveHandler)\n\n\t\t// Remove class\n\t\tel.classList.remove(state.options.class || 'v-hover')\n\n\t\tdelete (el as any).__hover\n\t},\n})\n\n/**\n * Apply hover state\n */\nfunction applyHoverState(el: HTMLElement, state: HoverState, e: MouseEvent): void {\n\tconst { options } = state\n\n\t// Add class\n\tif (options.class) {\n\t\tel.classList.add(options.class)\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('hover:enter', { detail: { event: e } }))\n\n\t// Trigger callbacks\n\toptions.onEnter?.(e)\n\toptions.handler?.(true, e)\n}\n\n/**\n * Apply leave state\n */\nfunction applyLeaveState(el: HTMLElement, state: HoverState, e: MouseEvent): void {\n\tconst { options } = state\n\n\t// Remove class\n\tif (options.class) {\n\t\tel.classList.remove(options.class)\n\t}\n\n\t// Dispatch custom event\n\tel.dispatchEvent(new CustomEvent('hover:leave', { detail: { event: e } }))\n\n\t// Trigger callbacks\n\toptions.onLeave?.(e)\n\toptions.handler?.(false, e)\n}\n\nexport default vHover\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\n/**\n * Ripple directive options\n */\nexport interface RippleOptions {\n\t/**\n\t * Ripple color\n\t * @default 'currentColor'\n\t */\n\tcolor?: string\n\n\t/**\n\t * Ripple duration in milliseconds\n\t * @default 600\n\t */\n\tduration?: number\n\n\t/**\n\t * Whether to disable ripple\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Initial scale of ripple\n\t * @default 0\n\t */\n\tinitialScale?: number\n\n\t/**\n\t * Final scale of ripple\n\t * @default 2\n\t */\n\tfinalScale?: number\n}\n\n/**\n * Directive binding value type\n */\nexport type RippleBinding = boolean | string | RippleOptions\n\n/**\n * Element state storage\n */\ninterface RippleState {\n\toptions: RippleOptions\n\tclickHandler: (e: Event) => void\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: RippleBinding | undefined): RippleOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true, color: 'currentColor', duration: 600 }\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { color: binding, duration: 600 }\n\t}\n\n\tconst base: RippleOptions = {\n\t\tcolor: 'currentColor',\n\t\tduration: 600,\n\t\tdisabled: false,\n\t\tinitialScale: 0,\n\t\tfinalScale: 2,\n\t}\n\n\treturn binding && typeof binding === 'object' ? { ...base, ...binding } : base\n}\n\n/**\n * Create ripple element\n */\nfunction createRipple(\n\tevent: MouseEvent,\n\tel: HTMLElement,\n\toptions: RippleOptions,\n): HTMLSpanElement | null {\n\t// Get element dimensions\n\tconst rect = el.getBoundingClientRect()\n\n\t// Calculate ripple position\n\tconst x = event.clientX - rect.left\n\tconst y = event.clientY - rect.top\n\n\t// Calculate ripple size (use diagonal for full coverage)\n\tconst size = Math.max(rect.width, rect.height) * 2\n\n\t// Create ripple element\n\tconst ripple = document.createElement('span')\n\n\tripple.className = 'v-ripple__wave'\n\tripple.style.cssText = `\n position: absolute;\n border-radius: 50%;\n pointer-events: none;\n background-color: ${options.color};\n width: ${size}px;\n height: ${size}px;\n left: ${x - size / 2}px;\n top: ${y - size / 2}px;\n transform: scale(${options.initialScale});\n opacity: 0.3;\n z-index: 0;\n `\n\n\treturn ripple\n}\n\n/**\n * Animate ripple\n */\nfunction animateRipple(ripple: HTMLElement, options: RippleOptions): void {\n\tconst duration = options.duration || 600\n\tconst initialScale = options.initialScale || 0\n\tconst finalScale = options.finalScale || 2\n\n\t// Use Web Animations API if available\n\tif (typeof ripple.animate === 'function') {\n\t\tripple.animate(\n\t\t\t[\n\t\t\t\t{ transform: `scale(${initialScale})`, opacity: 0.3 },\n\t\t\t\t{ transform: `scale(${finalScale})`, opacity: 0 },\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration,\n\t\t\t\teasing: 'ease-out',\n\t\t\t\tfill: 'forwards',\n\t\t\t},\n\t\t).onfinish = () => {\n\t\t\tripple.remove()\n\t\t}\n\t} else {\n\t\t// Fallback for older browsers\n\t\tripple.style.transition = `transform ${duration}ms ease-out, opacity ${duration}ms ease-out`\n\n\t\t// Force reflow\n\t\tString(ripple.offsetHeight)\n\n\t\tripple.style.transform = `scale(${finalScale})`\n\t\tripple.style.opacity = '0'\n\n\t\tsetTimeout(() => {\n\t\t\tripple.remove()\n\t\t}, duration)\n\t}\n}\n\n/**\n * v-ripple directive\n *\n * @example\n * ```vue\n * <template>\n * <button v-ripple>Click me</button>\n * <button v-ripple=\"'rgba(255, 255, 255, 0.3)'\">Custom color</button>\n * <button v-ripple=\"{ color: 'red', duration: 800 }\">Custom options</button>\n * </template>\n * ```\n */\nexport const vRipple = defineDirective<RippleBinding, HTMLElement>({\n\tname: 'ripple',\n\tssr: false,\n\tdefaults: {\n\t\tcolor: 'currentColor',\n\t\tduration: 600,\n\t\tdisabled: false,\n\t\tinitialScale: 0,\n\t\tfinalScale: 2,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Ensure element has proper positioning\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\t// Ensure overflow is hidden to contain ripple\n\t\tif (computedStyle.overflow === 'visible') {\n\t\t\tel.style.overflow = 'hidden'\n\t\t}\n\n\t\t// Add base class\n\t\tel.classList.add('v-ripple')\n\n\t\tconst state: RippleState = {\n\t\t\toptions,\n\t\t\tclickHandler: (e: Event) => {\n\t\t\t\t// Ignore if disabled\n\t\t\t\tif (state.options.disabled) return\n\n\t\t\t\tconst mouseEvent = e as MouseEvent\n\n\t\t\t\t// Create and append ripple\n\t\t\t\tconst ripple = createRipple(mouseEvent, el, state.options)\n\n\t\t\t\tif (ripple) {\n\t\t\t\t\tel.appendChild(ripple)\n\t\t\t\t\tanimateRipple(ripple, state.options)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__ripple = state\n\n\t\t// Bind click event\n\t\ton(el, 'click', state.clickHandler)\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: RippleState = (el as any).__ripple\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: RippleState = (el as any).__ripple\n\n\t\tif (!state) return\n\n\t\t// Unbind event\n\t\toff(el, 'click', state.clickHandler)\n\n\t\t// Remove class\n\t\tel.classList.remove('v-ripple')\n\n\t\tdelete (el as any).__ripple\n\t},\n})\n\nexport default vRipple\n","import { defineDirective, isBrowser } from '@directix/core'\nimport { off, on } from '@directix/shared'\n\nconst STATE_KEY = '__mask' as const\n\n/**\n * Mask directive options\n */\nexport interface MaskOptions {\n\t/** Mask pattern: # digit, A letter, N alphanumeric, X any, others as literals */\n\tmask: string\n\t/** Placeholder character @default '_' */\n\tplaceholder?: string\n\t/** Show mask placeholder on focus @default true */\n\tshowPlaceholder?: boolean\n\t/** Show mask on blur @default false */\n\tshowMaskOnBlur?: boolean\n\t/** Clear incomplete on blur @default false */\n\tclearIncomplete?: boolean\n\t/** Disable @default false */\n\tdisabled?: boolean\n\t/** Callback when value changes */\n\tonChange?: (value: string, rawValue: string) => void\n\t/** Callback when mask is complete */\n\tonComplete?: (value: string) => void\n}\n\nexport type MaskBinding = string | MaskOptions\n\ninterface MaskToken {\n\tpattern: RegExp\n\tplaceholder: string\n\tisLiteral: boolean\n}\n\ninterface MaskState {\n\toptions: MaskOptions\n\ttokens: MaskToken[]\n\tplaceholder: string\n\tinputHandler: (e: Event) => void\n\tfocusHandler: () => void\n\tblurHandler: () => void\n}\n\nconst TOKEN_PATTERNS: Record<string, RegExp> = {\n\t'#': /\\d/,\n\tA: /[A-Za-z]/,\n\tN: /[A-Za-z0-9]/,\n\tX: /./,\n}\n\nfunction parseMask(mask: string, placeholder: string): MaskToken[] {\n\treturn [...mask].map(char => {\n\t\tconst pattern = TOKEN_PATTERNS[char]\n\n\t\treturn pattern ? { pattern, placeholder, isLiteral: false } : { pattern: new RegExp(`\\\\${char}`), placeholder: char, isLiteral: true }\n\t})\n}\n\nfunction normalizeOptions(binding: MaskBinding | undefined): MaskOptions {\n\tif (typeof binding === 'string') return { mask: binding, placeholder: '_', showPlaceholder: true }\n\tif (!binding?.mask) throw new Error('[Directix] v-mask: mask is required')\n\n\treturn { placeholder: '_', showPlaceholder: true, showMaskOnBlur: false, clearIncomplete: false, disabled: false, ...binding }\n}\n\nfunction isInput(el: HTMLElement): el is HTMLInputElement | HTMLTextAreaElement {\n\treturn el.tagName === 'INPUT' || el.tagName === 'TEXTAREA'\n}\n\n/**\n * Format value with mask\n */\nfunction formatValue(value: string, tokens: MaskToken[], placeholder: string, showPlaceholder: boolean): string {\n\tlet result = '',\n\t\tvalueIndex = 0\n\n\tfor (const token of tokens) {\n\t\tif (valueIndex >= value.length) {\n\t\t\tresult += token.isLiteral ? token.placeholder : (showPlaceholder ? placeholder : '')\n\t\t\tcontinue\n\t\t}\n\n\t\tconst inputChar = value[valueIndex]\n\n\t\tif (token.isLiteral) {\n\t\t\tif (inputChar === token.placeholder) valueIndex++\n\t\t\tresult += token.placeholder\n\t\t} else if (token.pattern.test(inputChar)) {\n\t\t\tresult += inputChar\n\t\t\tvalueIndex++\n\t\t} else if (inputChar === placeholder) {\n\t\t\tresult += showPlaceholder ? placeholder : ''\n\t\t\tvalueIndex++\n\t\t} else {\n\t\t\tvalueIndex++\n\t\t\t// Re-check this token with next input char - need to decrement in loop\n\t\t}\n\t}\n\n\treturn result\n}\n\n/**\n * Get raw value (without mask literals)\n */\nfunction getRawValue(value: string, tokens: MaskToken[], placeholder: string): string {\n\tlet raw = ''\n\n\tfor (let i = 0; i < value.length && i < tokens.length; i++) {\n\t\tif (!tokens[i].isLiteral && value[i] !== placeholder) {\n\t\t\traw += value[i]\n\t\t}\n\t}\n\n\treturn raw\n}\n\n/**\n * Check if mask is complete\n */\nfunction isComplete(value: string, tokens: MaskToken[], placeholder: string): boolean {\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tif (!tokens[i].isLiteral && (i >= value.length || value[i] === placeholder)) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n/**\n * Calculate cursor position, skipping literals\n */\nfunction getCursorPos(tokens: MaskToken[], rawCursorPos: number): number {\n\tlet pos = rawCursorPos\n\n\twhile (pos < tokens.length && tokens[pos].isLiteral) {\n\t\tpos++\n\t}\n\n\treturn Math.min(pos, tokens.length)\n}\n\n/**\n * v-mask directive\n *\n * @example\n * ```vue\n * <input v-mask=\"'###-##-####'\" placeholder=\"SSN\" />\n * <input v-mask=\"'(###) ###-####'\" placeholder=\"Phone\" />\n * <input v-mask=\"{ mask: '##/##/####' }\" placeholder=\"Date\" />\n * ```\n */\nexport const vMask = defineDirective<MaskBinding, HTMLInputElement>({\n\tname: 'mask',\n\tssr: false,\n\tdefaults: { placeholder: '_', showPlaceholder: true, showMaskOnBlur: false, clearIncomplete: false, disabled: false },\n\n\tmounted(el, binding) {\n\t\tif (!isInput(el)) {\n\t\t\tconsole.warn('[Directix] v-mask: directive must be used on input or textarea elements')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\tconst placeholder = options.placeholder || '_'\n\t\tconst tokens = parseMask(options.mask, placeholder)\n\n\t\tconst inputHandler = (e: Event): void => {\n\t\t\tconst target = e.target as HTMLInputElement\n\t\t\tconst rawValue = target.value\n\t\t\tconst cursorPos = target.selectionStart || 0\n\n\t\t\tconst formatted = formatValue(rawValue, tokens, placeholder, options.showPlaceholder ?? true)\n\n\t\t\tif (formatted !== rawValue) {\n\t\t\t\ttarget.value = formatted\n\t\t\t\ttarget.setSelectionRange(getCursorPos(tokens, cursorPos), getCursorPos(tokens, cursorPos))\n\t\t\t\ttarget.dispatchEvent(new Event('input', { bubbles: true }))\n\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\toptions.onChange?.(formatted, getRawValue(formatted, tokens, placeholder))\n\t\t\tif (isComplete(formatted, tokens, placeholder)) {\n\t\t\t\toptions.onComplete?.(formatted)\n\t\t\t}\n\t\t}\n\n\t\tconst focusHandler = (): void => {\n\t\t\tif (!el.value && options.showPlaceholder) {\n\t\t\t\tel.value = formatValue('', tokens, placeholder, true)\n\t\t\t}\n\t\t}\n\n\t\tconst blurHandler = (): void => {\n\t\t\tif (!options.showMaskOnBlur && !isComplete(el.value, tokens, placeholder) && options.clearIncomplete) {\n\t\t\t\tel.value = ''\n\t\t\t}\n\t\t}\n\n\t\ton(el, 'input', inputHandler)\n\t\ton(el, 'focus', focusHandler)\n\t\ton(el, 'blur', blurHandler)\n\n\t\t;(el as any)[STATE_KEY] = { options, tokens, placeholder, inputHandler, focusHandler, blurHandler }\n\n\t\tif (el.value) {\n\t\t\tel.value = formatValue(el.value, tokens, placeholder, options.showPlaceholder ?? true)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\tstate.options = normalizeOptions(binding.value)\n\t\tstate.tokens = parseMask(state.options.mask, state.placeholder)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MaskState = (el as any)[STATE_KEY]\n\n\t\tif (!state) return\n\t\toff(el, 'input', state.inputHandler)\n\t\toff(el, 'focus', state.focusHandler)\n\t\toff(el, 'blur', state.blurHandler)\n\t\tdelete (el as any)[STATE_KEY]\n\t},\n})\n\nexport default vMask\n","import { defineDirective } from '@directix/core'\nimport type { DirectiveBinding } from '@directix/core'\n\n// ============ Types ============\n\n/**\n * Permission action mode\n */\nexport type PermissionAction = 'remove' | 'disable' | 'hide'\n\n/**\n * Permission check mode\n */\nexport type PermissionMode = 'some' | 'every'\n\n/**\n * Permission directive options\n */\nexport interface PermissionOptions {\n\t/** Permission value(s) to check */\n\tvalue: string | string[]\n\t/** Logic for multiple permissions: 'some' (OR) or 'every' (AND). Default: 'some' */\n\tmode?: PermissionMode\n\t/** Action when permission denied. Default: 'remove' */\n\taction?: PermissionAction\n\t/** Custom permission check function */\n\tcheck?: (permission: string | string[], mode: PermissionMode) => boolean\n\t/** Callback when permission state changes */\n\tonChange?: (hasPermission: boolean) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type PermissionBinding = string | string[] | PermissionOptions\n\n/**\n * Permission configuration\n */\nexport interface PermissionConfig {\n\t/** Get current user's permissions */\n\tgetPermissions: () => string[]\n\t/** Get current user's roles */\n\tgetRoles?: () => string[]\n\t/** Role to permission mapping */\n\troleMap?: Record<string, string[]>\n}\n\n// ============ Constants ============\n\nconst STATE_KEY = '__permission' as const\nconst WILDCARD = '*' as const\n\n// ============ State ============\n\ninterface ElementState {\n\toptions: PermissionOptions\n\toriginalDisplay: string\n\toriginalDisabled: boolean | string\n\tparentNode: Node | null\n\tplaceholder: Comment | null\n}\n\n// Global configuration\nlet globalConfig: PermissionConfig | null = null\n\n// ============ Configuration ============\n\n/**\n * Configure permission directive\n */\nexport function configurePermission(config: PermissionConfig): void {\n\tglobalConfig = config\n}\n\n/**\n * Get current configuration\n */\nexport function getPermissionConfig(): PermissionConfig | null {\n\treturn globalConfig\n}\n\n// ============ Helpers ============\n\n/**\n * Normalize binding value to options object\n */\nfunction normalizeOptions(binding: PermissionBinding | undefined): PermissionOptions {\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-permission: permission value is required')\n\t}\n\n\tif (typeof binding === 'string') {\n\t\treturn { value: binding }\n\t}\n\n\tif (Array.isArray(binding)) {\n\t\treturn { value: binding }\n\t}\n\n\treturn binding\n}\n\n/**\n * Check if a permission is granted (supports wildcard)\n */\nfunction hasPermission(required: string, permissions: string[]): boolean {\n\treturn permissions.includes(WILDCARD) || permissions.includes(required)\n}\n\n/**\n * Verify permission against configuration\n */\nfunction verifyPermission(options: PermissionOptions): boolean {\n\t// Custom check function takes priority\n\tif (options.check) {\n\t\treturn options.check(options.value, options.mode || 'some')\n\t}\n\n\t// Require global configuration\n\tif (!globalConfig) {\n\t\tconsole.warn('[Directix] v-permission: No permission config provided')\n\n\t\treturn true\n\t}\n\n\tconst permissions = globalConfig.getPermissions()\n\tconst roles = globalConfig.getRoles?.() || []\n\tconst roleMap = globalConfig.roleMap || {}\n\tconst required = Array.isArray(options.value) ? options.value : [options.value]\n\tconst mode = options.mode || 'some'\n\n\t/**\n\t * Check a single value - can be a role name or permission\n\t */\n\tfunction checkSingle(value: string): boolean {\n\t\t// If value is a role name in roleMap, check if user has that role\n\t\tif (value in roleMap) {\n\t\t\treturn roles.includes(value)\n\t\t}\n\n\t\t// Check direct permission\n\t\tif (hasPermission(value, permissions)) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Check if any of user's roles grant this permission\n\t\tfor (const role of roles) {\n\t\t\tconst rolePermissions = roleMap[role] || []\n\n\t\t\tif (hasPermission(value, rolePermissions)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\treturn mode === 'every' ? required.every(checkSingle) : required.some(checkSingle)\n}\n\n/**\n * Handle element when permission is denied\n */\nfunction handleDenied(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tstate.parentNode = el.parentNode\n\t\t\tstate.placeholder = document.createComment('v-permission')\n\t\t\tel.parentNode?.insertBefore(state.placeholder, el)\n\t\t\tel.parentNode?.removeChild(el)\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tstate.originalDisabled = el.getAttribute('disabled') || false\n\t\t\tel.setAttribute('disabled', 'true')\n\t\t\tel.classList.add('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tstate.originalDisplay = el.style.display\n\t\t\tel.style.display = 'none'\n\t\t\tel.classList.add('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Restore element when permission is granted\n */\nfunction handleGranted(el: HTMLElement, action: PermissionAction, state: ElementState): void {\n\tswitch (action) {\n\t\tcase 'remove':\n\t\t\tif (state.placeholder && state.parentNode) {\n\t\t\t\tstate.parentNode.insertBefore(el, state.placeholder)\n\t\t\t\tstate.parentNode.removeChild(state.placeholder)\n\t\t\t\tstate.placeholder = null\n\t\t\t}\n\t\t\tbreak\n\t\tcase 'disable':\n\t\t\tif (state.originalDisabled === false) {\n\t\t\t\tel.removeAttribute('disabled')\n\t\t\t} else if (state.originalDisabled) {\n\t\t\t\tel.setAttribute('disabled', state.originalDisabled as string)\n\t\t\t}\n\t\t\tel.classList.remove('v-permission--disabled')\n\t\t\tbreak\n\t\tcase 'hide':\n\t\t\tel.style.display = state.originalDisplay || ''\n\t\t\tel.classList.remove('v-permission--hidden')\n\t\t\tbreak\n\t}\n}\n\n/**\n * Get or create element state\n */\nfunction getState(el: HTMLElement): ElementState {\n\tif (!(el as any)[STATE_KEY]) {\n\t\t;(el as any)[STATE_KEY] = {\n\t\t\toptions: { value: '' },\n\t\t\toriginalDisplay: '',\n\t\t\toriginalDisabled: false,\n\t\t\tparentNode: null,\n\t\t\tplaceholder: null,\n\t\t} as ElementState\n\t}\n\n\treturn (el as any)[STATE_KEY]\n}\n\n/**\n * Check permission and update element state\n */\nfunction checkPermission(el: HTMLElement, binding: DirectiveBinding<PermissionBinding>): void {\n\tconst state = getState(el)\n\n\tstate.options = normalizeOptions(binding.value)\n\n\tconst granted = verifyPermission(state.options)\n\n\t// Trigger change callback\n\tstate.options.onChange?.(granted)\n\n\tconst action = state.options.action || 'remove'\n\n\tif (granted) {\n\t\thandleGranted(el, action, state)\n\t} else {\n\t\thandleDenied(el, action, state)\n\t}\n}\n\n/**\n * Cleanup element state\n */\nfunction cleanup(el: HTMLElement): void {\n\tconst state: ElementState = (el as any)[STATE_KEY]\n\n\tif (state?.placeholder && state.parentNode) {\n\t\tstate.parentNode.removeChild(state.placeholder)\n\t}\n\n\tdelete (el as any)[STATE_KEY]\n}\n\n// ============ Directive ============\n\n/**\n * v-permission directive\n *\n * Controls element visibility and state based on user permissions.\n * Supports role-based and permission-based access control with wildcard support.\n *\n * @example\n * ```vue\n * <template>\n * <button v-permission=\"'admin'\">Admin Only</button>\n * <button v-permission=\"['admin', 'editor']\">Admin or Editor</button>\n * <button v-permission=\"{ value: ['read', 'write'], mode: 'every' }\">Read & Write</button>\n * <button v-permission=\"{ value: 'admin', action: 'disable' }\">Disabled for non-admin</button>\n * </template>\n *\n * <script setup>\n * import { configurePermission } from 'directix'\n *\n * configurePermission({\n * getPermissions: () => store.getters.permissions,\n * getRoles: () => store.getters.roles,\n * roleMap: { admin: ['*'], editor: ['read', 'write'] }\n * })\n * </script>\n * ```\n */\nexport const vPermission = defineDirective<PermissionBinding, HTMLElement>({\n\tname: 'permission',\n\tssr: true,\n\n\tmounted(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tupdated(el, binding) {\n\t\tcheckPermission(el, binding)\n\t},\n\n\tunmounted(el) {\n\t\tcleanup(el)\n\t},\n})\n\nexport default vPermission\n","import { defineDirective, isBrowser } from '@directix/core'\n\n/**\n * Sanitize handler\n */\nexport type SanitizeHandler = (value: string) => string\n\n/**\n * Sanitize directive options\n */\nexport interface SanitizeOptions {\n\t/**\n\t * Tags to allow (whitelist)\n\t * @default []\n\t */\n\tallowedTags?: string[]\n\n\t/**\n\t * Attributes to allow (whitelist)\n\t * @default []\n\t */\n\tallowedAttributes?: string[]\n\n\t/**\n\t * Whether to allow data URLs\n\t * @default false\n\t */\n\tallowDataUrls?: boolean\n\n\t/**\n\t * Whether to allow inline styles\n\t * @default false\n\t */\n\tallowStyles?: boolean\n\n\t/**\n\t * Whether to allow class attribute\n\t * @default false\n\t */\n\tallowClass?: boolean\n\n\t/**\n\t * Whether to allow id attribute\n\t * @default false\n\t */\n\tallowId?: boolean\n\n\t/**\n\t * Custom sanitize function\n\t */\n\thandler?: SanitizeHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to sanitize on update\n\t * @default true\n\t */\n\tsanitizeOnUpdate?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type SanitizeBinding = boolean | SanitizeOptions\n\n/**\n * Default allowed tags (safe subset)\n */\nconst DEFAULT_ALLOWED_TAGS = ['b', 'i', 'u', 'strong', 'em', 'br', 'p', 'span', 'div']\n\n/**\n * Default allowed attributes\n */\nconst DEFAULT_ALLOWED_ATTRIBUTES = ['title', 'alt', 'href', 'src']\n\n/**\n * Dangerous tags that should always be removed\n */\nconst DANGEROUS_TAGS = ['script', 'iframe', 'object', 'embed', 'form', 'input', 'style', 'link', 'meta', 'base']\n\n/**\n * Dangerous attributes that should always be removed\n */\nconst DANGEROUS_ATTRIBUTES = ['onclick', 'onerror', 'onload', 'onmouseover', 'onfocus', 'onblur', 'onchange', 'onsubmit']\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: SanitizeBinding | undefined): SanitizeOptions {\n\tif (binding === false) {\n\t\treturn { disabled: true }\n\t}\n\n\tif (binding === true) {\n\t\treturn {\n\t\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\t}\n\t}\n\n\treturn {\n\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\tallowDataUrls: false,\n\t\tallowStyles: false,\n\t\tallowClass: false,\n\t\tallowId: false,\n\t\tdisabled: false,\n\t\tsanitizeOnUpdate: true,\n\t\t...binding,\n\t}\n}\n\n/**\n * Basic HTML sanitizer\n */\nfunction sanitizeHtml(html: string, options: SanitizeOptions): string {\n\t// Use custom handler if provided\n\tif (options.handler) {\n\t\treturn options.handler(html)\n\t}\n\n\t// Create a temporary element for parsing\n\tconst temp = document.createElement('div')\n\n\ttemp.innerHTML = html\n\n\t// Remove dangerous tags\n\tfor (const tag of DANGEROUS_TAGS) {\n\t\tconst elements = temp.getElementsByTagName(tag)\n\n\t\twhile (elements.length > 0) {\n\t\t\telements[0].parentNode?.removeChild(elements[0])\n\t\t}\n\t}\n\n\t// Process all elements\n\tconst processElement = (el: Element): void => {\n\t\t// Check if tag is allowed\n\t\tconst tagName = el.tagName.toLowerCase()\n\n\t\tif (options.allowedTags && !options.allowedTags.includes(tagName)) {\n\t\t\t// Replace with text content\n\t\t\tconst text = document.createTextNode(el.textContent || '')\n\n\t\t\tel.parentNode?.replaceChild(text, el)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Remove dangerous attributes\n\t\tfor (const attr of DANGEROUS_ATTRIBUTES) {\n\t\t\tel.removeAttribute(attr)\n\t\t}\n\n\t\t// Remove javascript: URLs\n\t\tconst href = el.getAttribute('href')\n\n\t\tif (href && href.toLowerCase().startsWith('javascript:')) {\n\t\t\tel.removeAttribute('href')\n\t\t}\n\n\t\t// Remove data: URLs if not allowed\n\t\tif (!options.allowDataUrls) {\n\t\t\tconst src = el.getAttribute('src')\n\n\t\t\tif (src && src.toLowerCase().startsWith('data:')) {\n\t\t\t\tel.removeAttribute('src')\n\t\t\t}\n\t\t}\n\n\t\t// Filter attributes\n\t\tif (options.allowedAttributes) {\n\t\t\tconst attrs = Array.from(el.attributes)\n\n\t\t\tfor (const attr of attrs) {\n\t\t\t\tconst isAllowed = options.allowedAttributes.includes(attr.name.toLowerCase())\n\t\t\t\tconst isClass = attr.name === 'class' && options.allowClass\n\t\t\t\tconst isId = attr.name === 'id' && options.allowId\n\t\t\t\tconst isStyle = attr.name === 'style' && options.allowStyles\n\n\t\t\t\tif (!isAllowed && !isClass && !isId && !isStyle) {\n\t\t\t\t\tel.removeAttribute(attr.name)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Process children\n\t\tfor (const child of Array.from(el.children)) {\n\t\t\tprocessElement(child)\n\t\t}\n\t}\n\n\t// Process all child elements\n\tfor (const child of Array.from(temp.children)) {\n\t\tprocessElement(child)\n\t}\n\n\treturn temp.innerHTML\n}\n\n/**\n * v-sanitize directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-sanitize v-html=\"userContent\"></div>\n * <div v-sanitize=\"{ allowedTags: ['b', 'i', 'p'] }\" v-html=\"userContent\"></div>\n * <div v-sanitize=\"{ handler: customSanitizer }\" v-html=\"userContent\"></div>\n * </template>\n * ```\n */\nexport const vSanitize = defineDirective<SanitizeBinding, HTMLElement>({\n\tname: 'sanitize',\n\tssr: true,\n\tdefaults: {\n\t\tallowedTags: DEFAULT_ALLOWED_TAGS,\n\t\tallowedAttributes: DEFAULT_ALLOWED_ATTRIBUTES,\n\t\tallowDataUrls: false,\n\t\tallowStyles: false,\n\t\tallowClass: false,\n\t\tallowId: false,\n\t\tdisabled: false,\n\t\tsanitizeOnUpdate: true,\n\t},\n\n\tmounted(el, binding) {\n\t\tif (!isBrowser()) return\n\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled) return\n\n\t\t// Store options\n\t\t;(el as any).__sanitize = { options }\n\n\t\t// Sanitize initial content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, options)\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state = (el as any).__sanitize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\n\t\tif (state.options.disabled || !state.options.sanitizeOnUpdate) return\n\n\t\t// Sanitize updated content\n\t\tconst content = el.innerHTML\n\n\t\tif (content) {\n\t\t\tel.innerHTML = sanitizeHtml(content, state.options)\n\t\t}\n\t},\n\n\tunmounted(el) {\n\t\tdelete (el as any).__sanitize\n\t},\n})\n\nexport default vSanitize\n","import { defineDirective, isBrowser, supportsResizeObserver } from '@directix/core'\n\n/**\n * Resize event handler\n */\nexport type ResizeHandler = (entry: ResizeObserverEntry) => void\n\n/**\n * Resize information\n */\nexport interface ResizeInfo {\n\t/** New width */\n\twidth: number\n\t/** New height */\n\theight: number\n\t/** Content rect */\n\tcontentRect: DOMRectReadOnly\n\t/** Border box size */\n\tborderBoxSize: ReadonlyArray<ResizeObserverSize>\n\t/** Content box size */\n\tcontentBoxSize: ReadonlyArray<ResizeObserverSize>\n\t/** Device pixel content box size */\n\tdevicePixelContentBoxSize: ReadonlyArray<ResizeObserverSize>\n}\n\n/**\n * Resize directive options\n */\nexport interface ResizeOptions {\n\t/**\n\t * Resize event handler\n\t * @required\n\t */\n\thandler: ResizeHandler\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Whether to use box model\n\t * - 'content-box': size of content area\n\t * - 'border-box': size of border box\n\t * - 'device-pixel-content-box': size in device pixels\n\t * @default 'content-box'\n\t */\n\tbox?: 'content-box' | 'border-box' | 'device-pixel-content-box'\n\n\t/**\n\t * Debounce time in milliseconds\n\t * @default 0 (no debounce)\n\t */\n\tdebounce?: number\n\n\t/**\n\t * Callback for browsers without ResizeObserver (uses object fallback)\n\t */\n\tonFallback?: (info: ResizeInfo) => void\n}\n\n/**\n * Directive binding value type\n */\nexport type ResizeBinding = ResizeHandler | ResizeOptions\n\n/**\n * Element state storage\n */\ninterface ResizeState {\n\toptions: ResizeOptions\n\tobserver: ResizeObserver | null\n\thandler: (entry: ResizeObserverEntry) => void\n\tdebounceTimer: ReturnType<typeof setTimeout> | null\n\tpendingEntry: ResizeObserverEntry | null\n\tfallbackIframe: HTMLIFrameElement | null\n}\n\n/**\n * Get resize info from entry\n */\nfunction getResizeInfo(entry: ResizeObserverEntry): ResizeInfo {\n\treturn {\n\t\twidth: entry.contentRect.width,\n\t\theight: entry.contentRect.height,\n\t\tcontentRect: entry.contentRect,\n\t\tborderBoxSize: entry.borderBoxSize,\n\t\tcontentBoxSize: entry.contentBoxSize,\n\t\tdevicePixelContentBoxSize: entry.devicePixelContentBoxSize,\n\t}\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: ResizeBinding | undefined): ResizeOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding }\n\t}\n\n\tif (!binding) {\n\t\tthrow new Error('[Directix] v-resize: handler is required')\n\t}\n\n\treturn {\n\t\tdisabled: false,\n\t\tbox: 'content-box',\n\t\tdebounce: 0,\n\t\t...binding,\n\t}\n}\n\n/**\n * Create fallback resize detection using object\n */\nfunction createFallbackResize(\n\tel: HTMLElement,\n\tcallback: () => void,\n): { iframe: HTMLIFrameElement; cleanup: () => void } {\n\t// Create an invisible iframe for resize detection\n\tconst iframe = document.createElement('iframe')\n\n\tiframe.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: none;\n pointer-events: none;\n opacity: 0;\n `\n\n\tel.appendChild(iframe)\n\n\tconst iWindow = iframe.contentWindow\n\n\tif (iWindow) {\n\t\tiWindow.addEventListener('resize', callback)\n\t}\n\n\treturn {\n\t\tiframe,\n\t\tcleanup: () => {\n\t\t\tif (iWindow) {\n\t\t\t\tiWindow.removeEventListener('resize', callback)\n\t\t\t}\n\n\t\t\tiframe.remove()\n\t\t},\n\t}\n}\n\n/**\n * v-resize directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-resize=\"handleResize\">Resize me</div>\n * <div v-resize=\"{ handler: handleResize, debounce: 200 }\">Debounced resize</div>\n * </template>\n * ```\n */\nexport const vResize = defineDirective<ResizeBinding, HTMLElement>({\n\tname: 'resize',\n\tssr: false,\n\tdefaults: {\n\t\tdisabled: false,\n\t\tbox: 'content-box',\n\t\tdebounce: 0,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Ensure element has relative or absolute positioning for fallback\n\t\tconst computedStyle = getComputedStyle(el)\n\n\t\tif (computedStyle.position === 'static') {\n\t\t\tel.style.position = 'relative'\n\t\t}\n\n\t\tconst state: ResizeState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t\tdebounceTimer: null,\n\t\t\tpendingEntry: null,\n\t\t\tfallbackIframe: null,\n\t\t\thandler: (entry: ResizeObserverEntry) => {\n\t\t\t\t// Handle debounce\n\t\t\t\tif (options.debounce && options.debounce > 0) {\n\t\t\t\t\tstate.pendingEntry = entry\n\n\t\t\t\t\tif (!state.debounceTimer) {\n\t\t\t\t\t\tstate.debounceTimer = setTimeout(() => {\n\t\t\t\t\t\t\tif (state.pendingEntry) {\n\t\t\t\t\t\t\t\toptions.handler(state.pendingEntry)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstate.debounceTimer = null\n\t\t\t\t\t\t\tstate.pendingEntry = null\n\t\t\t\t\t\t}, options.debounce)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toptions.handler(entry)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\n\t\t// Store state\n\t\t;(el as any).__resize = state\n\n\t\t// Use ResizeObserver if available\n\t\tif (supportsResizeObserver()) {\n\t\t\tstate.observer = new ResizeObserver(entries => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tstate.handler(entry)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.observer.observe(el, { box: options.box })\n\t\t} else {\n\t\t\t// Fallback using iframe\n\t\t\tconsole.warn('[Directix] v-resize: ResizeObserver not supported, using fallback')\n\n\t\t\tconst { iframe, cleanup } = createFallbackResize(el, () => {\n\t\t\t\tconst rect = el.getBoundingClientRect()\n\t\t\t\tconst entry = {\n\t\t\t\t\ttarget: el,\n\t\t\t\t\tcontentRect: rect as DOMRectReadOnly,\n\t\t\t\t\tborderBoxSize: [] as any,\n\t\t\t\t\tcontentBoxSize: [] as any,\n\t\t\t\t\tdevicePixelContentBoxSize: [] as any,\n\t\t\t\t}\n\n\t\t\t\tstate.handler(entry as ResizeObserverEntry)\n\n\t\t\t\tif (options.onFallback) {\n\t\t\t\t\toptions.onFallback(getResizeInfo(entry as ResizeObserverEntry))\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstate.fallbackIframe = iframe\n\t\t\t;(el as any).__resizeCleanup = cleanup\n\t\t}\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\tstate.options = normalizeOptions(binding.value)\n\t},\n\n\tunmounted(el) {\n\t\tconst state: ResizeState = (el as any).__resize\n\n\t\tif (!state) return\n\n\t\t// Clear debounce timer\n\t\tif (state.debounceTimer) {\n\t\t\tclearTimeout(state.debounceTimer)\n\t\t}\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\t// Cleanup fallback\n\t\tconst cleanup = (el as any).__resizeCleanup\n\n\t\tif (cleanup) {\n\t\t\tcleanup()\n\t\t}\n\n\t\tdelete (el as any).__resize\n\t\tdelete (el as any).__resizeCleanup\n\t},\n})\n\nexport default vResize\n","import { defineDirective, isBrowser, supportsMutationObserver } from '@directix/core'\n\n/**\n * Mutation change handler\n */\nexport type MutationHandler = (mutations: MutationRecord[], observer: MutationObserver) => void\n\n/**\n * Mutation directive options\n */\nexport interface MutationOptions {\n\t/**\n\t * Callback when mutations occur\n\t * @required\n\t */\n\thandler: MutationHandler\n\n\t/**\n\t * Whether to observe attribute changes\n\t * @default false\n\t */\n\tattributes?: boolean\n\n\t/**\n\t * Specific attributes to observe\n\t */\n\tattributeFilter?: string[]\n\n\t/**\n\t * Whether to observe child node additions/removals\n\t * @default true\n\t */\n\tchildList?: boolean\n\n\t/**\n\t * Whether to observe all descendants, not just direct children\n\t * @default false\n\t */\n\tsubtree?: boolean\n\n\t/**\n\t * Whether to observe character data changes\n\t * @default false\n\t */\n\tcharacterData?: boolean\n\n\t/**\n\t * Whether to record old attribute values\n\t * @default false\n\t */\n\tattributeOldValue?: boolean\n\n\t/**\n\t * Whether to record old character data\n\t * @default false\n\t */\n\tcharacterDataOldValue?: boolean\n\n\t/**\n\t * Whether to disable\n\t * @default false\n\t */\n\tdisabled?: boolean\n}\n\n/**\n * Directive binding value type\n */\nexport type MutationBinding = MutationHandler | MutationOptions\n\n/**\n * Element state storage\n */\ninterface MutationState {\n\toptions: MutationOptions\n\tobserver: MutationObserver | null\n}\n\n/**\n * Normalize options\n */\nfunction normalizeOptions(binding: MutationBinding | undefined): MutationOptions {\n\tif (typeof binding === 'function') {\n\t\treturn { handler: binding, childList: true }\n\t}\n\n\tif (!binding || !binding.handler) {\n\t\tthrow new Error('[Directix] v-mutation: handler is required')\n\t}\n\n\treturn {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t\t...binding,\n\t}\n}\n\n/**\n * v-mutation directive\n *\n * @example\n * ```vue\n * <template>\n * <div v-mutation=\"handleMutation\">Observe my changes</div>\n * <div v-mutation=\"{ handler: handleMutation, attributes: true, subtree: true }\">\n * Observe attributes and subtree\n * </div>\n * </template>\n *\n * <script setup>\n * function handleMutation(mutations: MutationRecord[], observer: MutationObserver) {\n * mutations.forEach(mutation => {\n * console.log('Type:', mutation.type)\n * console.log('Target:', mutation.target)\n * })\n * }\n * </script>\n * ```\n */\nexport const vMutation = defineDirective<MutationBinding, HTMLElement>({\n\tname: 'mutation',\n\tssr: false,\n\tdefaults: {\n\t\tattributes: false,\n\t\tchildList: true,\n\t\tsubtree: false,\n\t\tcharacterData: false,\n\t\tattributeOldValue: false,\n\t\tcharacterDataOldValue: false,\n\t\tdisabled: false,\n\t},\n\n\tmounted(el, binding) {\n\t\tconst options = normalizeOptions(binding.value)\n\n\t\tif (options.disabled || !isBrowser()) return\n\n\t\t// Check MutationObserver support\n\t\tif (!supportsMutationObserver()) {\n\t\t\tconsole.warn('[Directix] v-mutation: MutationObserver not supported')\n\n\t\t\treturn\n\t\t}\n\n\t\tconst state: MutationState = {\n\t\t\toptions,\n\t\t\tobserver: null,\n\t\t}\n\n\t\t// Create observer\n\t\tstate.observer = new MutationObserver((mutations, observer) => {\n\t\t\toptions.handler(mutations, observer)\n\t\t})\n\n\t\t// Start observing\n\t\tstate.observer.observe(el, {\n\t\t\tattributes: options.attributes,\n\t\t\tattributeFilter: options.attributeFilter,\n\t\t\tchildList: options.childList,\n\t\t\tsubtree: options.subtree,\n\t\t\tcharacterData: options.characterData,\n\t\t\tattributeOldValue: options.attributeOldValue,\n\t\t\tcharacterDataOldValue: options.characterDataOldValue,\n\t\t})\n\n\t\t// Store state\n\t\t;(el as any).__mutation = state\n\t},\n\n\tupdated(el, binding) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\tconst newOptions = normalizeOptions(binding.value)\n\n\t\t// Handle disabled state change\n\t\tif (newOptions.disabled && !state.options.disabled) {\n\t\t\t// Disconnect if was enabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.disconnect()\n\t\t\t}\n\t\t} else if (!newOptions.disabled && state.options.disabled) {\n\t\t\t// Re-observe if was disabled\n\t\t\tif (state.observer) {\n\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t})\n\t\t\t}\n\t\t} else if (!newOptions.disabled) {\n\t\t\t// If options changed, reconnect with new options\n\t\t\tif (\n\t\t\t\tnewOptions.attributes !== state.options.attributes ||\n\t\t\t\tnewOptions.childList !== state.options.childList ||\n\t\t\t\tnewOptions.subtree !== state.options.subtree ||\n\t\t\t\tnewOptions.characterData !== state.options.characterData\n\t\t\t) {\n\t\t\t\tif (state.observer) {\n\t\t\t\t\tstate.observer.disconnect()\n\t\t\t\t\tstate.observer.observe(el, {\n\t\t\t\t\t\tattributes: newOptions.attributes,\n\t\t\t\t\t\tattributeFilter: newOptions.attributeFilter,\n\t\t\t\t\t\tchildList: newOptions.childList,\n\t\t\t\t\t\tsubtree: newOptions.subtree,\n\t\t\t\t\t\tcharacterData: newOptions.characterData,\n\t\t\t\t\t\tattributeOldValue: newOptions.attributeOldValue,\n\t\t\t\t\t\tcharacterDataOldValue: newOptions.characterDataOldValue,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tstate.options = newOptions\n\t},\n\n\tunmounted(el) {\n\t\tconst state: MutationState = (el as any).__mutation\n\n\t\tif (!state) return\n\n\t\t// Disconnect observer\n\t\tif (state.observer) {\n\t\t\tstate.observer.disconnect()\n\t\t}\n\n\t\tdelete (el as any).__mutation\n\t},\n})\n\nexport default vMutation\n","import type { App, Directive, Plugin } from 'vue'\nimport type { DirectiveInstallOptions } from '@directix/core'\nimport { setVueVersion } from '@directix/core'\nimport {\n\tvClickOutside,\n\tvCopy,\n\tvDebounce,\n\tvFocus,\n\tvHover,\n\tvInfiniteScroll,\n\tvIntersect,\n\tvLazy,\n\tvLoading,\n\tvLongPress,\n\tvMask,\n\tvMutation,\n\tvPermission,\n\tvResize,\n\tvRipple,\n\tvSanitize,\n\tvScroll,\n\tvSticky,\n\tvThrottle,\n\tvVisible,\n} from './directives'\n\n// Export all directives\nexport * from './directives'\n\n// Export core utilities\nexport * from '@directix/core'\n\n// Export shared utilities (excluding tools with the same name as directives)\nexport {\n\tisString,\n\tisNumber,\n\tisBoolean,\n\tisFunction,\n\tisObject,\n\tisArray,\n\tisEmpty,\n\tisPromise,\n\tdeepClone,\n\tdeepMerge,\n\tget,\n\tset,\n\tparseTime,\n\tgenerateId,\n} from '@directix/shared'\n// Export debounce and throttle utility functions separately (with aliases)\nexport {\n\tdebounce as debounceFn,\n\tthrottle as throttleFn,\n} from '@directix/shared'\n\n// All directives list\nconst allDirectives: Record<string, Directive> = {\n\t'click-outside': vClickOutside,\n\tcopy: vCopy,\n\tdebounce: vDebounce,\n\tthrottle: vThrottle,\n\tfocus: vFocus,\n\tlazy: vLazy,\n\tintersect: vIntersect,\n\tvisible: vVisible,\n\tloading: vLoading,\n\tscroll: vScroll,\n\t'infinite-scroll': vInfiniteScroll,\n\tsticky: vSticky,\n\t'long-press': vLongPress,\n\thover: vHover,\n\tripple: vRipple,\n\tmask: vMask,\n\tpermission: vPermission,\n\tsanitize: vSanitize,\n\tresize: vResize,\n\tmutation: vMutation,\n}\n\n/**\n * Install all directives\n */\nconst install = (app: App | any, options: DirectiveInstallOptions = {}): void => {\n\t// Detect Vue version from app instance\n\t// Vue 2: app is the Vue constructor (has version static property, has directive static method)\n\t// Vue 3: app is an app instance (has config property, version on app.constructor or as _context)\n\n\tlet vueVersion: 2 | 3 | null = null\n\n\t// Check if it's Vue 2 constructor\n\tif (typeof app === 'function' && app.version?.startsWith('2')) {\n\t\tvueVersion = 2\n\t} else if (app?.config && app?.version?.startsWith('3')) {\n\t\t// Check if it's Vue 3 app instance\n\t\tvueVersion = 3\n\t} else if (typeof app?.directive === 'function' && typeof app?.mixin === 'function' && app.version?.startsWith('2')) {\n\t\t// Check for Vue 2 static methods (directive, component, mixin, etc.)\n\t\tvueVersion = 2\n\t} else if (typeof window !== 'undefined') {\n\t\t// Fallback: check global Vue\n\t\tconst win = window as any\n\n\t\tif (win.Vue?.version?.startsWith('2')) {\n\t\t\tvueVersion = 2\n\t\t} else if (win.Vue?.version?.startsWith('3')) {\n\t\t\tvueVersion = 3\n\t\t}\n\t}\n\n\t// Set the detected version\n\tif (vueVersion) {\n\t\tsetVueVersion(vueVersion)\n\t}\n\n\tconst { directives, all = false } = options\n\n\tif (all || !directives) {\n\t\t// Register all directives\n\t\tObject.entries(allDirectives).forEach(([name, directive]) => {\n\t\t\tapp.directive(name, directive)\n\t\t})\n\t} else {\n\t\t// Register specified directives\n\t\tdirectives.forEach(name => {\n\t\t\tconst directive = allDirectives[name]\n\n\t\t\tif (directive) {\n\t\t\t\tapp.directive(name, directive)\n\t\t\t} else {\n\t\t\t\tconsole.warn(`[Directix] Unknown directive: ${name}`)\n\t\t\t}\n\t\t})\n\t}\n}\n\n/**\n * Directix plugin\n */\nexport const Directix: Plugin = {\n\tinstall,\n}\n"],"names":["addCleanup","normalizeOptions","getEventTypeFromModifiers","getEventType","EVENT_MODIFIERS","STATE_KEY","scrollTop","scrollHeight","clientHeight","_a","cleanup"],"mappings":"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"}